@sapui5/sap.fe.core 1.101.0 → 1.103.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 (339) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +66 -30
  4. package/src/sap/fe/core/AppComponent.ts +68 -51
  5. package/src/sap/fe/core/AppStateHandler.js +13 -13
  6. package/src/sap/fe/core/AppStateHandler.ts +18 -18
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +279 -188
  10. package/src/sap/fe/core/CommonUtils.ts +306 -215
  11. package/src/sap/fe/core/ExtensionAPI.js +25 -30
  12. package/src/sap/fe/core/ExtensionAPI.ts +37 -41
  13. package/src/sap/fe/core/PageController.js +12 -7
  14. package/src/sap/fe/core/PageController.ts +10 -5
  15. package/src/sap/fe/core/TemplateComponent.js +6 -6
  16. package/src/sap/fe/core/TemplateComponent.ts +11 -11
  17. package/src/sap/fe/core/TemplateModel.js +2 -2
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +306 -78
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +280 -70
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  26. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  27. package/src/sap/fe/core/controllerextensions/EditFlow.js +351 -229
  28. package/src/sap/fe/core/controllerextensions/EditFlow.ts +321 -246
  29. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +59 -34
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -45
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +72 -72
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +82 -80
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +152 -131
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +171 -152
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +11 -10
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +31 -37
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
  42. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +30 -15
  43. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  44. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  45. package/src/sap/fe/core/controllerextensions/Paginator.js +19 -11
  46. package/src/sap/fe/core/controllerextensions/Paginator.ts +22 -14
  47. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  48. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  49. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  50. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  51. package/src/sap/fe/core/controllerextensions/Share.js +39 -21
  52. package/src/sap/fe/core/controllerextensions/Share.ts +45 -26
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -62
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +75 -62
  56. package/src/sap/fe/core/controllerextensions/ViewState.ts +78 -63
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +99 -0
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  60. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +58 -112
  61. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.js +2 -2
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +7 -7
  63. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +262 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +20 -21
  65. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  67. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1631 -0
  68. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +270 -211
  69. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +772 -0
  70. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +240 -100
  71. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1199 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +364 -229
  73. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +188 -0
  74. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +185 -0
  75. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +626 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +112 -69
  77. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +937 -0
  78. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +72 -73
  79. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  80. package/src/sap/fe/core/controls/Any.js +9 -5
  81. package/src/sap/fe/core/controls/Any.ts +10 -4
  82. package/src/sap/fe/core/controls/CommandExecution.js +21 -24
  83. package/src/sap/fe/core/controls/CommandExecution.ts +19 -24
  84. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  85. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  86. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +48 -43
  87. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +51 -46
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  89. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +3 -2
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
  91. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +19 -9
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +14 -8
  93. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  94. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  95. package/src/sap/fe/core/controls/FileWrapper.js +50 -3
  96. package/src/sap/fe/core/controls/FileWrapper.ts +45 -12
  97. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  98. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  99. package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
  100. package/src/sap/fe/core/controls/FormElementWrapper.ts +14 -3
  101. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  102. package/src/sap/fe/core/controls/MassEditSelect.ts +41 -0
  103. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  104. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  105. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  106. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  107. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  108. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +48 -48
  109. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +71 -76
  110. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +36 -65
  111. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  112. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +551 -36
  113. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +605 -36
  114. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  115. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  116. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  117. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -14
  118. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  119. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  120. package/src/sap/fe/core/converters/MetaModelConverter.js +56 -67
  121. package/src/sap/fe/core/converters/MetaModelConverter.ts +183 -193
  122. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  123. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  124. package/src/sap/fe/core/converters/annotations/DataField.js +73 -37
  125. package/src/sap/fe/core/converters/annotations/DataField.ts +121 -77
  126. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  127. package/src/sap/fe/core/converters/controls/Common/Action.js +51 -49
  128. package/src/sap/fe/core/converters/controls/Common/Action.ts +58 -54
  129. package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -15
  130. package/src/sap/fe/core/converters/controls/Common/Chart.ts +29 -27
  131. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  132. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  133. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  134. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  135. package/src/sap/fe/core/converters/controls/Common/Form.js +30 -34
  136. package/src/sap/fe/core/converters/controls/Common/Form.ts +48 -58
  137. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  138. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  139. package/src/sap/fe/core/converters/controls/Common/Table.js +318 -244
  140. package/src/sap/fe/core/converters/controls/Common/Table.ts +368 -297
  141. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +135 -125
  142. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +162 -148
  143. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +51 -45
  144. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +79 -67
  145. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  146. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  147. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  148. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  149. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  150. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  151. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +92 -89
  152. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +124 -120
  153. package/src/sap/fe/core/converters/helpers/Aggregation.js +11 -5
  154. package/src/sap/fe/core/converters/helpers/Aggregation.ts +25 -23
  155. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -30
  156. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +31 -29
  157. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  158. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  159. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  160. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  161. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  162. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  163. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  164. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  165. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  166. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  167. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  168. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  169. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  170. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  171. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +56 -55
  172. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +65 -77
  173. package/src/sap/fe/core/designtime/AppComponent.designtime.js +6 -6
  174. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +10 -8
  175. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  176. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  177. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  178. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  179. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  180. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  181. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  182. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  183. package/src/sap/fe/core/formatters/TableFormatter.js +83 -22
  184. package/src/sap/fe/core/formatters/TableFormatter.ts +80 -25
  185. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  186. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  187. package/src/sap/fe/core/fpm/Component.js +2 -2
  188. package/src/sap/fe/core/fpm/Component.ts +1 -1
  189. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  190. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  191. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  192. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +388 -285
  193. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  194. package/src/sap/fe/core/helpers/ClassSupport.ts +15 -10
  195. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  196. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  197. package/src/sap/fe/core/helpers/EditState.js +1 -6
  198. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  199. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  200. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  201. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  202. package/src/sap/fe/core/helpers/FPMHelper.ts +10 -9
  203. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  204. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  205. package/src/sap/fe/core/helpers/MassEditHelper.js +532 -264
  206. package/src/sap/fe/core/helpers/MassEditHelper.ts +560 -289
  207. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  208. package/src/sap/fe/core/helpers/ModelHelper.ts +50 -58
  209. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  210. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  211. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  212. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  213. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  214. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  215. package/src/sap/fe/core/helpers/StableIdHelper.js +16 -12
  216. package/src/sap/fe/core/helpers/StableIdHelper.ts +20 -16
  217. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  218. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  219. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  220. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  221. package/src/sap/fe/core/library.js +51 -3
  222. package/src/sap/fe/core/library.ts +47 -0
  223. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  224. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  225. package/src/sap/fe/core/messagebundle.properties +151 -197
  226. package/src/sap/fe/core/messagebundle_ar.properties +36 -63
  227. package/src/sap/fe/core/messagebundle_bg.properties +36 -63
  228. package/src/sap/fe/core/messagebundle_ca.properties +36 -63
  229. package/src/sap/fe/core/messagebundle_cs.properties +36 -63
  230. package/src/sap/fe/core/messagebundle_cy.properties +36 -63
  231. package/src/sap/fe/core/messagebundle_da.properties +37 -64
  232. package/src/sap/fe/core/messagebundle_de.properties +36 -63
  233. package/src/sap/fe/core/messagebundle_el.properties +38 -65
  234. package/src/sap/fe/core/messagebundle_en.properties +37 -64
  235. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -64
  236. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +44 -73
  237. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -64
  238. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +52 -81
  239. package/src/sap/fe/core/messagebundle_es.properties +36 -63
  240. package/src/sap/fe/core/messagebundle_es_MX.properties +36 -63
  241. package/src/sap/fe/core/messagebundle_et.properties +36 -63
  242. package/src/sap/fe/core/messagebundle_fi.properties +36 -63
  243. package/src/sap/fe/core/messagebundle_fr.properties +39 -66
  244. package/src/sap/fe/core/messagebundle_fr_CA.properties +36 -63
  245. package/src/sap/fe/core/messagebundle_hi.properties +36 -63
  246. package/src/sap/fe/core/messagebundle_hr.properties +36 -63
  247. package/src/sap/fe/core/messagebundle_hu.properties +35 -62
  248. package/src/sap/fe/core/messagebundle_id.properties +37 -64
  249. package/src/sap/fe/core/messagebundle_it.properties +54 -81
  250. package/src/sap/fe/core/messagebundle_iw.properties +36 -63
  251. package/src/sap/fe/core/messagebundle_ja.properties +36 -63
  252. package/src/sap/fe/core/messagebundle_kk.properties +36 -63
  253. package/src/sap/fe/core/messagebundle_ko.properties +36 -63
  254. package/src/sap/fe/core/messagebundle_lt.properties +36 -63
  255. package/src/sap/fe/core/messagebundle_lv.properties +36 -63
  256. package/src/sap/fe/core/messagebundle_ms.properties +37 -64
  257. package/src/sap/fe/core/messagebundle_nl.properties +37 -64
  258. package/src/sap/fe/core/messagebundle_no.properties +36 -63
  259. package/src/sap/fe/core/messagebundle_pl.properties +37 -64
  260. package/src/sap/fe/core/messagebundle_pt.properties +37 -64
  261. package/src/sap/fe/core/messagebundle_pt_PT.properties +36 -63
  262. package/src/sap/fe/core/messagebundle_ro.properties +36 -63
  263. package/src/sap/fe/core/messagebundle_ru.properties +36 -63
  264. package/src/sap/fe/core/messagebundle_sh.properties +36 -63
  265. package/src/sap/fe/core/messagebundle_sk.properties +36 -63
  266. package/src/sap/fe/core/messagebundle_sl.properties +38 -65
  267. package/src/sap/fe/core/messagebundle_sv.properties +36 -63
  268. package/src/sap/fe/core/messagebundle_th.properties +36 -63
  269. package/src/sap/fe/core/messagebundle_tr.properties +36 -63
  270. package/src/sap/fe/core/messagebundle_uk.properties +37 -64
  271. package/src/sap/fe/core/messagebundle_vi.properties +37 -64
  272. package/src/sap/fe/core/messagebundle_zh_CN.properties +36 -63
  273. package/src/sap/fe/core/messagebundle_zh_TW.properties +37 -64
  274. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  275. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  276. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  277. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  278. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
  279. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +12 -10
  280. package/src/sap/fe/core/services/NavigationServiceFactory.js +54 -45
  281. package/src/sap/fe/core/services/NavigationServiceFactory.ts +61 -49
  282. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  283. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  284. package/src/sap/fe/core/services/RoutingServiceFactory.js +63 -60
  285. package/src/sap/fe/core/services/RoutingServiceFactory.ts +76 -73
  286. package/src/sap/fe/core/services/ShellServicesFactory.js +102 -71
  287. package/src/sap/fe/core/services/ShellServicesFactory.ts +109 -78
  288. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  289. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  290. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +24 -18
  291. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +53 -50
  292. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  293. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  294. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  295. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  296. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  297. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  298. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  299. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  300. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  301. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  302. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  303. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  304. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  305. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +3 -4
  306. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -15
  307. package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -18
  308. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  309. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  310. package/src/sap/fe/core/templating/FilterHelper.js +12 -11
  311. package/src/sap/fe/core/templating/FilterHelper.ts +17 -16
  312. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  313. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  314. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  315. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  316. package/src/sap/fe/core/templating/PropertyHelper.js +79 -56
  317. package/src/sap/fe/core/templating/PropertyHelper.ts +41 -27
  318. package/src/sap/fe/core/templating/UIFormatters.js +163 -97
  319. package/src/sap/fe/core/templating/UIFormatters.ts +210 -129
  320. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  321. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  322. package/src/sap/fe/core/type/Email.js +2 -2
  323. package/src/sap/fe/core/type/Email.ts +2 -2
  324. package/src/sap/fe/core/AnnotationHelper.js +0 -331
  325. package/src/sap/fe/core/AnnotationHelper.ts +0 -321
  326. package/src/sap/fe/core/RouterProxy.js +0 -938
  327. package/src/sap/fe/core/TransactionHelper.js +0 -1577
  328. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
  329. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -264
  330. package/src/sap/fe/core/actions/draft.js +0 -665
  331. package/src/sap/fe/core/actions/messageHandling.js +0 -579
  332. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  333. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  334. package/src/sap/fe/core/actions/operations.js +0 -1096
  335. package/src/sap/fe/core/actions/sticky.js +0 -130
  336. package/src/sap/fe/core/actions/sticky.ts +0 -119
  337. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  338. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
  339. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1729
@@ -0,0 +1,1631 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/CheckBox", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, FPMHelper, ModelHelper, FELibrary, Button, CheckBox, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
6
+ "use strict";
7
+
8
+ var CreationMode = FELibrary.CreationMode;
9
+ var ProgrammingModel = FELibrary.ProgrammingModel;
10
+ var ValueState = coreLibrary.ValueState;
11
+ /* Make sure that the mParameters is not the oEvent */
12
+
13
+ function getParameters(mParameters) {
14
+ if (mParameters && mParameters.getMetadata && mParameters.getMetadata().getName() === "sap.ui.base.Event") {
15
+ mParameters = {};
16
+ }
17
+
18
+ return mParameters || {};
19
+ }
20
+
21
+ var TransactionHelper = /*#__PURE__*/function () {
22
+ function TransactionHelper(oAppComponent, oLockObject) {
23
+ this._bIsModified = false;
24
+ this._bCreateMode = false;
25
+ this._bContinueDiscard = false;
26
+ this._oAppComponent = oAppComponent;
27
+ this.oLockObject = oLockObject;
28
+ }
29
+
30
+ var _proto = TransactionHelper.prototype;
31
+
32
+ _proto.getProgrammingModel = function getProgrammingModel(oContext) {
33
+ if (!this.sProgrammingModel && oContext) {
34
+ var sPath;
35
+
36
+ if (oContext.isA("sap.ui.model.odata.v4.Context")) {
37
+ sPath = oContext.getPath();
38
+ } else {
39
+ sPath = oContext.isRelative() ? oContext.getResolvedPath() : oContext.getPath();
40
+ }
41
+
42
+ if (ModelHelper.isDraftSupported(oContext.getModel().getMetaModel(), sPath)) {
43
+ this.sProgrammingModel = ProgrammingModel.Draft;
44
+ } else if (ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel())) {
45
+ this.sProgrammingModel = ProgrammingModel.Sticky;
46
+ } else {
47
+ // as the transaction helper is a singleton we don't store the non draft as the user could
48
+ // start with a non draft child page and navigates back to a draft enabled one
49
+ return ProgrammingModel.NonDraft;
50
+ }
51
+ }
52
+
53
+ return this.sProgrammingModel;
54
+ }
55
+ /**
56
+ * Validates a document.
57
+ *
58
+ * @memberof sap.fe.core.TransactionHelper
59
+ * @static
60
+ * @param oContext Context of the document to be validated
61
+ * @param [mParameters] Can contain the following attributes:
62
+ * @param [mParameters.data] A map of data that should be validated
63
+ * @param [mParameters.customValidationFunction] A string representing the path to the validation function
64
+ * @param oView Contains the object of the current view
65
+ * @returns Promise resolves with result of the custom validation function
66
+ * @ui5-restricted
67
+ * @final
68
+ */
69
+ ;
70
+
71
+ _proto.validateDocument = function validateDocument(oContext, mParameters, oView) {
72
+ var sCustomValidationFunction = mParameters && mParameters.customValidationFunction;
73
+
74
+ if (sCustomValidationFunction) {
75
+ var sModule = sCustomValidationFunction.substring(0, sCustomValidationFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
76
+ sFunctionName = sCustomValidationFunction.substring(sCustomValidationFunction.lastIndexOf(".") + 1, sCustomValidationFunction.length),
77
+ mData = mParameters.data;
78
+ delete mData["@$ui5.context.isTransient"];
79
+ return FPMHelper.validationWrapper(sModule, sFunctionName, mData, oView, oContext);
80
+ }
81
+
82
+ return Promise.resolve([]);
83
+ }
84
+ /**
85
+ * Creates a new document.
86
+ *
87
+ * @memberof sap.fe.core.TransactionHelper
88
+ * @static
89
+ * @param oMainListBinding OData V4 ListBinding object
90
+ * @param [mInParameters] Optional, can contain the following attributes:
91
+ * @param [mInParameters.data] A map of data that should be sent within the POST
92
+ * @param [mInParameters.busyMode] Global (default), Local, None TODO: to be refactored
93
+ * @param [mInParameters.keepTransientContextOnFailed] If set, the context stays in the list if the POST failed and POST will be repeated with the next change
94
+ * @param [mInParameters.inactive] If set, the context is set as inactive for empty rows
95
+ * @param oResourceBundle
96
+ * @param messageHandler
97
+ * @param bFromCopyPaste
98
+ * @param oView The current view
99
+ * @returns Promise resolves with new binding context
100
+ * @ui5-restricted
101
+ * @final
102
+ */
103
+ ;
104
+
105
+ _proto.createDocument = function createDocument(oMainListBinding, mInParameters, oResourceBundle, messageHandler) {
106
+ var bFromCopyPaste = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
107
+ var oView = arguments.length > 5 ? arguments[5] : undefined;
108
+
109
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
110
+ var that = this,
111
+ oModel = oMainListBinding.getModel(),
112
+ oMetaModel = oModel.getMetaModel(),
113
+ sMetaPath = oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()),
114
+ sCreateHash = this._getAppComponent().getRouterProxy().getHash(),
115
+ oComponentData = this._getAppComponent().getComponentData(),
116
+ oStartupParameters = oComponentData && oComponentData.startupParameters || {},
117
+ sNewAction = !oMainListBinding.isRelative() ? this._getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) : undefined;
118
+
119
+ var oCreationPromise;
120
+ var mBindingParameters = {
121
+ "$$patchWithoutSideEffects": true
122
+ };
123
+ var sMessagesPath = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
124
+ var sBusyPath = "/busy";
125
+ var sFunctionName = oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction")) || oMetaModel.getObject("".concat(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)), "@com.sap.vocabularies.Common.v1.DefaultValuesFunction"));
126
+ var bFunctionOnNavProp;
127
+ var oNewDocumentContext;
128
+
129
+ if (sFunctionName) {
130
+ if (oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction")) && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
131
+ bFunctionOnNavProp = true;
132
+ } else {
133
+ bFunctionOnNavProp = false;
134
+ }
135
+ }
136
+
137
+ if (sMessagesPath) {
138
+ mBindingParameters["$select"] = sMessagesPath;
139
+ }
140
+
141
+ var mParameters = getParameters(mInParameters);
142
+
143
+ if (!oMainListBinding) {
144
+ return Promise.reject("Binding required for new document creation");
145
+ }
146
+
147
+ var sProgrammingModel = this.getProgrammingModel(oMainListBinding);
148
+
149
+ if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
150
+ return Promise.reject("Create document only allowed for draft or sticky session supported services");
151
+ }
152
+
153
+ if (mParameters.busyMode === "Local") {
154
+ // in case of local busy mode we use the list binding name
155
+ // there's no APY yet so we have to use the .sId TODO provide a public method?
156
+ sBusyPath = "/busyLocal/".concat(oMainListBinding.sId);
157
+ }
158
+
159
+ mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
160
+ BusyLocker.lock(this.oLockObject, sBusyPath);
161
+ var oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
162
+
163
+ if (sNewAction) {
164
+ oCreationPromise = this.callAction(sNewAction, {
165
+ contexts: oMainListBinding.getHeaderContext(),
166
+ showActionParameterDialog: true,
167
+ label: this._getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore),
168
+ bindingParameters: mBindingParameters,
169
+ parentControl: mParameters.parentControl,
170
+ bIsCreateAction: true
171
+ }, null, messageHandler);
172
+ } else {
173
+ var bIsNewPageCreation = mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.Inline;
174
+ var aNonComputedVisibleKeyFields = bIsNewPageCreation ? CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, oView) : [];
175
+ sFunctionName = bFromCopyPaste ? null : sFunctionName;
176
+ var sFunctionPath, oFunctionContext;
177
+
178
+ if (sFunctionName) {
179
+ //bound to the source entity:
180
+ if (bFunctionOnNavProp) {
181
+ sFunctionPath = oMainListBinding.getContext() && "".concat(oMetaModel.getMetaPath(oMainListBinding.getContext().getPath()), "/").concat(sFunctionName);
182
+ oFunctionContext = oMainListBinding.getContext();
183
+ } else {
184
+ sFunctionPath = oMainListBinding.getHeaderContext() && "".concat(oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()), "/").concat(sFunctionName);
185
+ oFunctionContext = oMainListBinding.getHeaderContext();
186
+ }
187
+ }
188
+
189
+ var oFunction = sFunctionPath && oMetaModel.createBindingContext(sFunctionPath);
190
+
191
+ if (oFunction && oFunction.getObject() && oFunction.getObject()[0].$IsBound) {
192
+ oCreationPromise = operations.callBoundFunction(sFunctionName, oFunctionContext, oModel);
193
+ } else {
194
+ oCreationPromise = operations.callFunctionImport(sFunctionName, oModel);
195
+ }
196
+
197
+ oCreationPromise = oCreationPromise.then(function (oContext) {
198
+ if (oContext) {
199
+ return oContext.getObject();
200
+ } else {
201
+ return undefined;
202
+ }
203
+ }).catch(function (oError) {
204
+ Log.error("Error while executing the function ".concat(sFunctionName), oError);
205
+ throw oError;
206
+ }).then(function (oData) {
207
+ mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
208
+
209
+ if (mParameters.data) {
210
+ delete mParameters.data["@odata.context"];
211
+ }
212
+
213
+ if (aNonComputedVisibleKeyFields.length > 0) {
214
+ var oTransientListBinding = oModel.bindList(oMainListBinding.getPath(), oMainListBinding.getContext(), [], [], {
215
+ $$updateGroupId: "submitLater"
216
+ });
217
+
218
+ oTransientListBinding.refreshInternal = function () {
219
+ /* */
220
+ };
221
+
222
+ oNewDocumentContext = oTransientListBinding.create(mParameters.data, true);
223
+ return that._launchDialogWithKeyFields(oMainListBinding, oTransientListBinding, oNewDocumentContext, aNonComputedVisibleKeyFields, oModel, mParameters, messageHandler);
224
+ } else {
225
+ var onBeforeCreatePromise;
226
+
227
+ if (mParameters.beforeCreateCallBack) {
228
+ onBeforeCreatePromise = mParameters.beforeCreateCallBack({
229
+ contextPath: oMainListBinding && oMainListBinding.getPath()
230
+ });
231
+ } else {
232
+ onBeforeCreatePromise = Promise.resolve();
233
+ }
234
+
235
+ return onBeforeCreatePromise.then(function () {
236
+ oNewDocumentContext = oMainListBinding.create(mParameters.data, true, mParameters.createAtEnd, mParameters.inactive);
237
+
238
+ if (!mParameters.inactive) {
239
+ return that.onAfterCreateCompletion(oMainListBinding, oNewDocumentContext, mParameters);
240
+ }
241
+ });
242
+ }
243
+ }).catch(function (oError) {
244
+ Log.error("Error while creating the new document", oError);
245
+ throw oError;
246
+ });
247
+ }
248
+
249
+ return oCreationPromise.then(function (oResult) {
250
+ if (!oMainListBinding.isRelative()) {
251
+ // the create mode shall currently only be set on creating a root document
252
+ that._bCreateMode = true;
253
+ }
254
+
255
+ oNewDocumentContext = oNewDocumentContext || oResult && oResult.response; // TODO: where does this one coming from???
256
+
257
+ if (oResult && oResult.bConsiderDocumentModified) {
258
+ that.handleDocumentModifications();
259
+ }
260
+
261
+ return messageHandler.showMessageDialog().then(function () {
262
+ return oNewDocumentContext;
263
+ });
264
+ }).catch(function (oError) {
265
+ return messageHandler.showMessageDialog().then(function () {
266
+ // for instance, on cancel of create dialog, the promise is rejected
267
+ // a return here would restore the promise chain and result in errors while routing
268
+ // solution - reject here as well
269
+ if (oError && oError.bDeleteTransientContext && oNewDocumentContext.isTransient()) {
270
+ // This is a workaround suggested by model as Context.delete results in an error
271
+ // TODO: remove the $direct once model resolves this issue
272
+ // this line shows the expected console error Uncaught (in promise) Error: Request canceled: POST Travel; group: submitLater
273
+ oNewDocumentContext.delete("$direct");
274
+ }
275
+
276
+ return Promise.reject(oError);
277
+ });
278
+ }).finally(function () {
279
+ BusyLocker.unlock(that.oLockObject, sBusyPath);
280
+ });
281
+ }
282
+ /**
283
+ * Find the active contexts of the documents, only for the draft roots.
284
+ *
285
+ * @memberof sap.fe.core.TransactionHelper
286
+ * @static
287
+ * @param aContexts Contexts Either one context or an array with contexts to be deleted
288
+ * @param bFindActiveContexts
289
+ * @returns Array of the active contexts
290
+ */
291
+ ;
292
+
293
+ _proto.findActiveDraftRootContexts = function findActiveDraftRootContexts(aContexts, bFindActiveContexts) {
294
+ if (!bFindActiveContexts) {
295
+ return Promise.resolve();
296
+ }
297
+
298
+ var activeContexts = aContexts.reduce(function (aResult, oContext) {
299
+ var oMetaModel = oContext.getModel().getMetaModel();
300
+ var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
301
+
302
+ if (oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DraftRoot"))) {
303
+ var bIsActiveEntity = oContext.getObject().IsActiveEntity,
304
+ bHasActiveEntity = oContext.getObject().HasActiveEntity;
305
+
306
+ if (!bIsActiveEntity && bHasActiveEntity) {
307
+ var oActiveContext = oContext.getModel().bindContext("".concat(oContext.getPath(), "/SiblingEntity")).getBoundContext();
308
+ aResult.push(oActiveContext);
309
+ }
310
+ }
311
+
312
+ return aResult;
313
+ }, []);
314
+ return Promise.all(activeContexts.map(function (oContext) {
315
+ return oContext.requestCanonicalPath().then(function () {
316
+ return oContext;
317
+ });
318
+ }));
319
+ };
320
+
321
+ _proto.afterDeleteProcess = function afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle) {
322
+ var oInternalModelContext = mParameters.internalModelContext;
323
+
324
+ if (oInternalModelContext && oInternalModelContext.getProperty("deleteEnabled") != undefined) {
325
+ if (checkBox.isCheckBoxVisible === true && checkBox.isCheckBoxSelected === false) {
326
+ //if unsaved objects are not deleted then we need to set the enabled to true and update the model data for next deletion
327
+ oInternalModelContext.setProperty("deleteEnabled", true);
328
+ var obj = Object.assign(oInternalModelContext.getObject(), {});
329
+ obj.selectedContexts = obj.selectedContexts.filter(function (element) {
330
+ return obj.deletableContexts.indexOf(element) === -1;
331
+ });
332
+ obj.deletableContexts = [];
333
+ obj.selectedContexts = [];
334
+ obj.numberOfSelectedContexts = obj.selectedContexts.length;
335
+ oInternalModelContext.setProperty("", obj);
336
+ } else {
337
+ oInternalModelContext.setProperty("deleteEnabled", false);
338
+ oInternalModelContext.setProperty("selectedContexts", []);
339
+ oInternalModelContext.setProperty("numberOfSelectedContexts", 0);
340
+ }
341
+ }
342
+
343
+ if (aContexts.length === 1) {
344
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
345
+ } else {
346
+ MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
347
+ }
348
+ }
349
+ /**
350
+ * Delete one or multiple document(s).
351
+ *
352
+ * @memberof sap.fe.core.TransactionHelper
353
+ * @static
354
+ * @param vInContexts Contexts Either one context or an array with contexts to be deleted
355
+ * @param mParameters Optional, can contain the following attributes:
356
+ * @param mParameters.title Title of the object to be deleted
357
+ * @param mParameters.description Description of the object to be deleted
358
+ * @param mParameters.numberOfSelectedContexts Number of objects selected
359
+ * @param mParameters.noDialog To disable the confirmation dialog
360
+ * @param oResourceBundle
361
+ * @param messageHandler
362
+ * @returns A Promise resolved once the document are deleted
363
+ */
364
+ ;
365
+
366
+ _proto.deleteDocument = function deleteDocument(vInContexts, mParameters, oResourceBundle, messageHandler) {
367
+ var fnReject,
368
+ fnResolve,
369
+ aDeletableContexts = [],
370
+ isCheckBoxVisible = false,
371
+ isLockedTextVisible = false,
372
+ cannotBeDeletedTextVisible = false,
373
+ isCheckBoxSelected,
374
+ bDialogConfirmed = false; // eslint-disable-next-line @typescript-eslint/no-this-alias
375
+
376
+ var that = this,
377
+ oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
378
+ var aParams;
379
+ var oDeleteMessage = {
380
+ title: oResourceBundleCore.getText("C_COMMON_DELETE")
381
+ };
382
+ messageHandling.removeBoundTransitionMessages();
383
+ BusyLocker.lock(this.oLockObject);
384
+ var vContexts;
385
+
386
+ if (Array.isArray(vInContexts)) {
387
+ vContexts = vInContexts;
388
+ } else {
389
+ vContexts = [vInContexts];
390
+ }
391
+
392
+ Promise.resolve(this.getProgrammingModel(vContexts[0])).then(function (sProgrammingModel) {
393
+ if (mParameters) {
394
+ if (!mParameters.numberOfSelectedContexts) {
395
+ if (sProgrammingModel === ProgrammingModel.Draft) {
396
+ for (var i = 0; i < vContexts.length; i++) {
397
+ var oContextData = vContexts[i].getObject();
398
+
399
+ if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
400
+ var sLockedUser = "";
401
+ var draftAdminData = oContextData && oContextData.DraftAdministrativeData;
402
+
403
+ if (draftAdminData) {
404
+ sLockedUser = draftAdminData["InProcessByUser"];
405
+ }
406
+
407
+ aParams = [sLockedUser];
408
+ MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle, aParams), {
409
+ title: oResourceBundleCore.getText("C_COMMON_DELETE"),
410
+ onClose: fnReject
411
+ });
412
+ return;
413
+ }
414
+ }
415
+ }
416
+
417
+ mParameters = getParameters(mParameters);
418
+
419
+ if (mParameters.title) {
420
+ if (mParameters.description) {
421
+ aParams = [mParameters.title, mParameters.description + " "];
422
+ } else {
423
+ aParams = [mParameters.title, ""];
424
+ }
425
+
426
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
427
+ } else {
428
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
429
+ }
430
+
431
+ aDeletableContexts = vContexts;
432
+ } else {
433
+ oDeleteMessage = {
434
+ title: oResourceBundleCore.getText("C_COMMON_DELETE")
435
+ };
436
+
437
+ if (mParameters.numberOfSelectedContexts === 1 && mParameters.numberOfSelectedContexts === vContexts.length) {
438
+ aDeletableContexts = vContexts;
439
+ var oLineContextData = vContexts[0].getObject();
440
+
441
+ if (mParameters.title && mParameters.title.path) {
442
+ var _sTitle = oLineContextData[mParameters.title.path];
443
+ var sKey = CommonUtils.getKeys(that._oAppComponent.getMetaModel(), vContexts[0].getPath(), mParameters.entitySetName);
444
+ var sKeyValue = sKey ? oLineContextData[sKey] : undefined;
445
+ var sDescription = mParameters.description && mParameters.description.path ? oLineContextData[mParameters.description.path] : undefined;
446
+
447
+ if (_sTitle) {
448
+ if (sDescription) {
449
+ aParams = [_sTitle, sDescription + " "];
450
+ } else {
451
+ aParams = [_sTitle, ""];
452
+ }
453
+
454
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
455
+ } else if (sKeyValue) {
456
+ aParams = [sKeyValue, ""];
457
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
458
+ } else {
459
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle);
460
+ }
461
+ } else {
462
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
463
+ }
464
+ } else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
465
+ //only one unsaved object
466
+ aDeletableContexts = mParameters.unSavedContexts;
467
+ var _draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
468
+ var sLastChangedByUser = "";
469
+
470
+ if (_draftAdminData) {
471
+ sLastChangedByUser = _draftAdminData["LastChangedByUserDescription"] || _draftAdminData["LastChangedByUser"] || "";
472
+ }
473
+
474
+ aParams = [sLastChangedByUser];
475
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
476
+ } else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
477
+ //only multiple unsaved objects
478
+ aDeletableContexts = mParameters.unSavedContexts;
479
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
480
+ } else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
481
+ //only unsaved, locked ,deletable objects but not non-deletable objects
482
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
483
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
484
+ } else {
485
+ //if non-deletable objects exists along with any of unsaved ,deletable objects
486
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
487
+ cannotBeDeletedTextVisible = true;
488
+ oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, [aDeletableContexts.length], mParameters.entitySetName);
489
+ oDeleteMessage.nonDeletableText = that._getNonDeletableText(mParameters, vContexts, oResourceBundle);
490
+ }
491
+
492
+ if (mParameters.lockedContexts.length == 1) {
493
+ //setting the locked text if locked objects exist
494
+ isLockedTextVisible = true;
495
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
496
+ }
497
+
498
+ if (mParameters.lockedContexts.length > 1) {
499
+ //setting the locked text if locked objects exist
500
+ isLockedTextVisible = true;
501
+ oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_PAGE_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
502
+ }
503
+
504
+ if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
505
+ if ((cannotBeDeletedTextVisible || isLockedTextVisible) && aDeletableContexts.length === mParameters.unSavedContexts.length) {
506
+ //if only unsaved and either or both of locked and non-deletable objects exist then we hide the check box
507
+ isCheckBoxVisible = false;
508
+ aDeletableContexts = mParameters.unSavedContexts;
509
+
510
+ if (mParameters.unSavedContexts.length === 1) {
511
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
512
+ } else {
513
+ oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
514
+ }
515
+ } else {
516
+ if (mParameters.unSavedContexts.length === 1) {
517
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
518
+ } else {
519
+ oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
520
+ }
521
+
522
+ isCheckBoxVisible = true;
523
+ }
524
+ }
525
+
526
+ if (cannotBeDeletedTextVisible && isLockedTextVisible) {
527
+ //if non-deletable objects exist along with deletable objects
528
+ var sNonDeletableContextText = that._getNonDeletableText(mParameters, vContexts, oResourceBundle); //if both locked and non-deletable objects exist along with deletable objects
529
+
530
+
531
+ if (mParameters.unSavedContexts.length > 1) {
532
+ oDeleteMessage.nonDeletableText = sNonDeletableContextText + " " + CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
533
+ }
534
+
535
+ if (mParameters.unSavedContexts.length == 1) {
536
+ oDeleteMessage.nonDeletableText = sNonDeletableContextText + " " + CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED_AND_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts]);
537
+ }
538
+ }
539
+ }
540
+ }
541
+
542
+ var oNonDeletableMessageTextControl, oDeleteMessageTextControl;
543
+ var oContent = new VBox({
544
+ items: [oNonDeletableMessageTextControl = new Text({
545
+ text: oDeleteMessage.nonDeletableText,
546
+ visible: isLockedTextVisible || cannotBeDeletedTextVisible
547
+ }), oDeleteMessageTextControl = new Text({
548
+ text: oDeleteMessage.text
549
+ }), new CheckBox({
550
+ text: oDeleteMessage.checkBoxText,
551
+ selected: true,
552
+ select: function (oEvent) {
553
+ var selected = oEvent.getSource().getSelected();
554
+
555
+ if (selected) {
556
+ aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
557
+ isCheckBoxSelected = true;
558
+ } else {
559
+ aDeletableContexts = vContexts;
560
+ isCheckBoxSelected = false;
561
+ }
562
+ },
563
+ visible: isCheckBoxVisible
564
+ })]
565
+ });
566
+ var sTitle = oResourceBundleCore.getText("C_COMMON_DELETE");
567
+
568
+ var fnConfirm = function () {
569
+ bDialogConfirmed = true;
570
+ BusyLocker.lock(that.oLockObject);
571
+ var aContexts = aDeletableContexts;
572
+ var onBeforeDeletePromise;
573
+
574
+ if (mParameters.beforeDeleteCallBack) {
575
+ onBeforeDeletePromise = mParameters.beforeDeleteCallBack({
576
+ contexts: aContexts
577
+ });
578
+ } else {
579
+ onBeforeDeletePromise = Promise.resolve();
580
+ }
581
+
582
+ return onBeforeDeletePromise.then(that.findActiveDraftRootContexts.bind(that, aContexts, mParameters.bFindActiveContexts)).then(function (activeContexts) {
583
+ //make sure to fetch the active contexts before deleting the drafts
584
+ return Promise.all(aContexts.map(function (oContext) {
585
+ //delete the draft
586
+ return draft.deleteDraft(oContext);
587
+ })).catch(function (oError) {
588
+ return messageHandler.showMessages().then(function () {
589
+ // re-throw error to enforce rejecting the general promise
590
+ throw oError;
591
+ });
592
+ }).then(function () {
593
+ var checkBox = {
594
+ "isCheckBoxVisible": isCheckBoxVisible,
595
+ "isCheckBoxSelected": isCheckBoxSelected
596
+ };
597
+
598
+ if (activeContexts && activeContexts.length) {
599
+ return Promise.all(activeContexts.map(function (oContext) {
600
+ return oContext.delete();
601
+ })).then(function () {
602
+ that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
603
+ return messageHandler.showMessageDialog().then(fnResolve);
604
+ });
605
+ } else {
606
+ that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
607
+ return messageHandler.showMessageDialog().then(fnResolve);
608
+ }
609
+ });
610
+ }).catch(function () {
611
+ fnReject();
612
+ }).finally(function () {
613
+ BusyLocker.unlock(that.oLockObject);
614
+ });
615
+ };
616
+
617
+ var oDialog = new Dialog({
618
+ title: sTitle,
619
+ state: "Warning",
620
+ content: [oContent],
621
+ ariaLabelledBy: oNonDeletableMessageTextControl.getVisible() ? [oNonDeletableMessageTextControl, oDeleteMessageTextControl] : oDeleteMessageTextControl,
622
+ beginButton: new Button({
623
+ text: oResourceBundleCore.getText("C_COMMON_DELETE"),
624
+ type: "Emphasized",
625
+ press: function () {
626
+ oDialog.close();
627
+ return fnConfirm();
628
+ }
629
+ }),
630
+ endButton: new Button({
631
+ text: CommonUtils.getTranslatedText("C_COMMON_DIALOG_CANCEL", oResourceBundle),
632
+ press: function () {
633
+ oDialog.close();
634
+ }
635
+ }),
636
+ afterClose: function () {
637
+ oDialog.destroy(); // if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
638
+
639
+ if (!bDialogConfirmed) {
640
+ fnReject();
641
+ }
642
+ }
643
+ });
644
+
645
+ if (mParameters.noDialog) {
646
+ return fnConfirm();
647
+ } else {
648
+ oDialog.addStyleClass("sapUiContentPadding");
649
+ oDialog.open();
650
+ }
651
+ }).finally(function () {
652
+ BusyLocker.unlock(that.oLockObject);
653
+ }).catch(function () {
654
+ Log.warning("Couldn't get Programming model");
655
+ fnReject();
656
+ });
657
+ return new Promise(function (resolve, reject) {
658
+ fnReject = reject;
659
+ fnResolve = resolve;
660
+ });
661
+ }
662
+ /**
663
+ * Edits a document.
664
+ *
665
+ * @memberof sap.fe.core.TransactionHelper
666
+ * @static
667
+ * @param oContext Context of the active document
668
+ * @param oView Current view
669
+ * @param messageHandler
670
+ * @returns Promise resolves with the new draft context in case of draft programming model
671
+ * @ui5-restricted
672
+ * @final
673
+ */
674
+ ;
675
+
676
+ _proto.editDocument = function editDocument(oContext, oView, messageHandler) {
677
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
678
+ var that = this;
679
+ var sProgrammingModel = this.getProgrammingModel(oContext);
680
+ var oEditPromise;
681
+
682
+ if (!oContext) {
683
+ return Promise.reject(new Error("Binding context to active document is required"));
684
+ }
685
+
686
+ this._bIsModified = false;
687
+ BusyLocker.lock(that.oLockObject); // before triggering the edit action we'll have to remove all bound transition messages
688
+
689
+ messageHandler.removeTransitionMessages();
690
+
691
+ if (sProgrammingModel === ProgrammingModel.Draft) {
692
+ oEditPromise = draft.createDraftFromActiveDocument(oContext, this._getAppComponent(), {
693
+ bPreserveChanges: true,
694
+ oView: oView
695
+ });
696
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
697
+ oEditPromise = sticky.editDocumentInStickySession(oContext, this._getAppComponent());
698
+ } else {
699
+ BusyLocker.unlock(that.oLockObject);
700
+ return Promise.reject(new Error("Edit is only allowed for draft or sticky session supported services"));
701
+ }
702
+
703
+ return oEditPromise.then(function (oNewContext) {
704
+ that._bCreateMode = false;
705
+ return messageHandler.showMessageDialog().then(function () {
706
+ return oNewContext;
707
+ });
708
+ }).catch(function (err) {
709
+ return messageHandler.showMessages({
710
+ concurrentEditFlag: true
711
+ }).then(function () {
712
+ return Promise.reject(err);
713
+ });
714
+ }).finally(function () {
715
+ BusyLocker.unlock(that.oLockObject);
716
+ });
717
+ }
718
+ /**
719
+ * Cancel 'edit' mode of a document.
720
+ *
721
+ * @memberof sap.fe.core.TransactionHelper
722
+ * @static
723
+ * @param oContext Context of the document to be canceled or deleted
724
+ * @param [mInParameters] Optional, can contain the following attributes:
725
+ * @param mInParameters.cancelButton Cancel Button of the discard popover (mandatory for now)
726
+ * @param mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
727
+ * @param oResourceBundle
728
+ * @param messageHandler
729
+ * @returns Promise resolves with ???
730
+ * @ui5-restricted
731
+ * @final
732
+ */
733
+ ;
734
+
735
+ _proto.cancelDocument = function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler) {
736
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
737
+ var that = this;
738
+ var sProgrammingModel; //context must always be passed - mandatory parameter
739
+
740
+ if (!oContext) {
741
+ return Promise.reject("No context exists. Pass a meaningful context");
742
+ }
743
+
744
+ BusyLocker.lock(that.oLockObject);
745
+ var mParameters = getParameters(mInParameters);
746
+ var oParamsContext = oContext,
747
+ oCancelButton = mParameters.cancelButton,
748
+ oModel = oParamsContext.getModel();
749
+ var onBeforeCancelPromise, sCanonicalPath;
750
+ return Promise.resolve(this.getProgrammingModel(oContext)).then(function (sPModel) {
751
+ sProgrammingModel = sPModel;
752
+
753
+ if (sPModel === ProgrammingModel.Draft) {
754
+ var draftDataContext = oModel.bindContext("".concat(oParamsContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
755
+
756
+ if (!that._bIsModified) {
757
+ return draftDataContext.requestObject().then(function (draftAdminData) {
758
+ if (draftAdminData) {
759
+ that._bIsModified = !(draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime);
760
+ }
761
+ });
762
+ }
763
+ }
764
+ }).then(function () {
765
+ if (!mParameters.skipDiscardPopover) {
766
+ return that._showDiscardPopover(oCancelButton, that._bIsModified, oResourceBundle);
767
+ } else {
768
+ return Promise.resolve();
769
+ }
770
+ }).then(function () {
771
+ if (mParameters.beforeCancelCallBack) {
772
+ onBeforeCancelPromise = mParameters.beforeCancelCallBack({
773
+ context: oContext
774
+ });
775
+ } else {
776
+ onBeforeCancelPromise = Promise.resolve();
777
+ }
778
+
779
+ return onBeforeCancelPromise;
780
+ }).then(function () {
781
+ // eslint-disable-next-line default-case
782
+ switch (sProgrammingModel) {
783
+ case ProgrammingModel.Draft:
784
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
785
+ // @ts-ignore
786
+ return oParamsContext.requestObject("HasActiveEntity").then(function (bHasActiveEntity) {
787
+ var oDeletePromise;
788
+
789
+ if (!bHasActiveEntity) {
790
+ if (oParamsContext && oParamsContext.hasPendingChanges()) {
791
+ oParamsContext.getBinding().resetChanges();
792
+ }
793
+
794
+ oDeletePromise = draft.deleteDraft(oParamsContext);
795
+ return oDeletePromise;
796
+ } else {
797
+ var oActiveContext = oModel.bindContext("".concat(oParamsContext.getPath(), "/SiblingEntity")).getBoundContext();
798
+ return oActiveContext.requestCanonicalPath().then(function (sPath) {
799
+ sCanonicalPath = sPath;
800
+
801
+ if (oParamsContext && oParamsContext.hasPendingChanges()) {
802
+ oParamsContext.getBinding().resetChanges();
803
+ }
804
+
805
+ oDeletePromise = draft.deleteDraft(oParamsContext);
806
+ return oDeletePromise;
807
+ }, function () {
808
+ draft.deleteDraft(oParamsContext);
809
+ }).then(function () {
810
+ //oParamsContext.delete() in the previous promise doesnt return anything upon success.
811
+ if (!sCanonicalPath) {
812
+ return;
813
+ }
814
+
815
+ if (oActiveContext.getPath() !== sCanonicalPath) {
816
+ // the active context is using the sibling entity - this path is not accessible anymore as we deleted the draft
817
+ // document - therefore we need to create a new context with the canonical path
818
+ oActiveContext = oModel.bindContext(sCanonicalPath).getBoundContext();
819
+ }
820
+
821
+ return oActiveContext;
822
+ });
823
+ }
824
+ });
825
+
826
+ case ProgrammingModel.Sticky:
827
+ return sticky.discardDocument(oContext).then(function (discardedContext) {
828
+ if (discardedContext) {
829
+ if (discardedContext.hasPendingChanges()) {
830
+ discardedContext.getBinding().resetChanges();
831
+ }
832
+
833
+ if (!that._bCreateMode) {
834
+ discardedContext.refresh();
835
+ return discardedContext;
836
+ }
837
+ }
838
+
839
+ return false;
840
+ });
841
+
842
+ default:
843
+ return Promise.reject("Cancel document only allowed for draft or sticky session supported services");
844
+ }
845
+ }).then(function (context) {
846
+ that._bIsModified = false; // remove existing bound transition messages
847
+
848
+ messageHandler.removeTransitionMessages(); // show unbound messages
849
+
850
+ return messageHandler.showMessages().then(function () {
851
+ return context;
852
+ });
853
+ }).catch(function (err) {
854
+ return messageHandler.showMessages().then(function () {
855
+ return Promise.reject(err);
856
+ });
857
+ }).finally(function () {
858
+ BusyLocker.unlock(that.oLockObject);
859
+ });
860
+ }
861
+ /**
862
+ * Saves the document.
863
+ *
864
+ * @memberof sap.fe.core.TransactionHelper
865
+ * @static
866
+ * @param oContext Context of the document to be saved
867
+ * @param oResourceBundle
868
+ * @param bExecuteSideEffectsOnError
869
+ * @param aBindings
870
+ * @param messageHandler
871
+ * @returns Promise resolves with ???
872
+ * @ui5-restricted
873
+ * @final
874
+ */
875
+ ;
876
+
877
+ _proto.saveDocument = function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler) {
878
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
879
+ var that = this;
880
+ var sProgrammingModel = this.getProgrammingModel(oContext);
881
+ var oSavePromise;
882
+
883
+ if (!oContext) {
884
+ return Promise.reject(new Error("Binding context to draft document is required"));
885
+ } // in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
886
+ // is sent to the backend
887
+
888
+
889
+ messageHandler.removeTransitionMessages();
890
+ BusyLocker.lock(that.oLockObject);
891
+
892
+ if (sProgrammingModel === ProgrammingModel.Draft) {
893
+ oSavePromise = draft.activateDocument(oContext, this._getAppComponent(), {});
894
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
895
+ oSavePromise = sticky.activateDocument(oContext);
896
+ } else {
897
+ BusyLocker.unlock(that.oLockObject);
898
+ return Promise.reject(new Error("Save is only allowed for draft or sticky session supported services"));
899
+ }
900
+
901
+ return oSavePromise.then(function (oActiveDocument) {
902
+ var bNewObject = that.sProgrammingModel === ProgrammingModel.Sticky ? that._bCreateMode : !oContext.getObject().HasActiveEntity;
903
+ MessageToast.show(bNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
904
+ that._bIsModified = false;
905
+ return oActiveDocument;
906
+ }).catch(function (err) {
907
+ if (aBindings && aBindings.length > 0) {
908
+ /* The sideEffects are executed only for table items in transient state */
909
+ aBindings.forEach(function (oListBinding) {
910
+ if (!CommonUtils.hasTransientContext(oListBinding) && bExecuteSideEffectsOnError) {
911
+ var oAppComponent = that._getAppComponent();
912
+
913
+ oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oContext);
914
+ }
915
+ });
916
+ }
917
+
918
+ return messageHandler.showMessages().then(function () {
919
+ return Promise.reject(err);
920
+ });
921
+ }).finally(function () {
922
+ BusyLocker.unlock(that.oLockObject);
923
+ });
924
+ }
925
+ /**
926
+ * Calls a bound or unbound action.
927
+ *
928
+ * @function
929
+ * @static
930
+ * @name sap.fe.core.TransactionHelper.callAction
931
+ * @memberof sap.fe.core.TransactionHelper
932
+ * @param sActionName The name of the action to be called
933
+ * @param [mParameters] Contains the following attributes:
934
+ * @param [mParameters.contexts] Mandatory for a bound action: Either one context or an array with contexts for which the action is to be called
935
+ * @param [mParameters.model] Mandatory for an unbound action: An instance of an OData V4 model
936
+ * @param [mParameters.invocationGrouping] Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
937
+ * @param [mParameters.label] A human-readable label for the action
938
+ * @param [mParameters.bGetBoundContext] If specified, the action promise returns the bound context
939
+ * @param oView Contains the object of the current view
940
+ * @param messageHandler
941
+ * @returns Promise resolves with an array of response objects (TODO: to be changed)
942
+ * @ui5-restricted
943
+ * @final
944
+ */
945
+ ;
946
+
947
+ _proto.callAction = function callAction(sActionName, mParameters, oView, messageHandler) {
948
+ mParameters = getParameters(mParameters); // eslint-disable-next-line @typescript-eslint/no-this-alias
949
+
950
+ var that = this;
951
+ var oContext, oModel, oPromise;
952
+ var mBindingParameters = mParameters.bindingParameters;
953
+
954
+ if (!sActionName) {
955
+ return Promise.reject("Provide name of action to be executed");
956
+ } // action imports are not directly obtained from the metaModel by it is present inside the entityContainer
957
+ // and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
958
+ // split() on its name was required
959
+
960
+
961
+ var sName = sActionName.split("/")[1];
962
+ sActionName = sName || sActionName;
963
+ oContext = sName ? undefined : mParameters.contexts; //checking whether the context is an array with more than 0 length or not an array(create action)
964
+
965
+ if (oContext && (Array.isArray(oContext) && oContext.length || !Array.isArray(oContext))) {
966
+ oContext = Array.isArray(oContext) ? oContext[0] : oContext;
967
+ oModel = oContext.getModel();
968
+ }
969
+
970
+ if (mParameters.model) {
971
+ oModel = mParameters.model;
972
+ }
973
+
974
+ if (!oModel) {
975
+ return Promise.reject("Pass a context for a bound action or pass the model for an unbound action");
976
+ } // get the binding parameters $select and $expand for the side effect on this action
977
+ // also gather additional property paths to be requested such as text associations
978
+
979
+
980
+ var oAppComponent = that._getAppComponent();
981
+
982
+ var mSideEffectsParameters = oAppComponent.getSideEffectsService().getODataActionSideEffects(sActionName, oContext) || {};
983
+
984
+ if (oContext && oModel) {
985
+ oPromise = new Promise(function (resolve, reject) {
986
+ var oApplicableContextDialog;
987
+ var oController = {
988
+ onClose: function () {
989
+ // User cancels action
990
+ oApplicableContextDialog.close();
991
+ resolve();
992
+ },
993
+ onContinue: function () {
994
+ // Users continues the action with the bound contexts
995
+ oApplicableContextDialog.close();
996
+ resolve(mParameters.applicableContext);
997
+ }
998
+ };
999
+
1000
+ var fnOpenAndFillDialog = function () {
1001
+ var oDialogContent;
1002
+ var nNotApplicable = mParameters.notApplicableContext.length,
1003
+ aNotApplicableItems = [];
1004
+
1005
+ for (var i = 0; i < mParameters.notApplicableContext.length; i++) {
1006
+ oDialogContent = mParameters.notApplicableContext[i].getObject();
1007
+ aNotApplicableItems.push(oDialogContent);
1008
+ }
1009
+
1010
+ var oNotApplicableItemsModel = new JSONModel(aNotApplicableItems);
1011
+ var oTotals = new JSONModel({
1012
+ total: nNotApplicable,
1013
+ label: mParameters.label
1014
+ });
1015
+ oApplicableContextDialog.setModel(oNotApplicableItemsModel, "notApplicable");
1016
+ oApplicableContextDialog.setModel(oTotals, "totals");
1017
+ oApplicableContextDialog.open();
1018
+ };
1019
+
1020
+ if (mParameters.notApplicableContext && mParameters.notApplicableContext.length >= 1) {
1021
+ // Show the contexts that are not applicable and will not therefore be processed
1022
+ var sFragmentName = "sap.fe.core.controls.ActionPartial";
1023
+ var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
1024
+ var oMetaModel = oModel.getMetaModel();
1025
+ var sCanonicalPath = mParameters.contexts[0].getCanonicalPath();
1026
+ var sEntitySet = "".concat(sCanonicalPath.substr(0, sCanonicalPath.indexOf("(")), "/");
1027
+ var oDialogLabelModel = new JSONModel({
1028
+ title: mParameters.label
1029
+ });
1030
+ Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
1031
+ name: sFragmentName
1032
+ }, {
1033
+ bindingContexts: {
1034
+ entityType: oMetaModel.createBindingContext(sEntitySet),
1035
+ label: oDialogLabelModel.createBindingContext("/")
1036
+ },
1037
+ models: {
1038
+ entityType: oMetaModel,
1039
+ metaModel: oMetaModel,
1040
+ label: oDialogLabelModel
1041
+ }
1042
+ })).then(function (oFragment) {
1043
+ return Fragment.load({
1044
+ definition: oFragment,
1045
+ controller: oController
1046
+ });
1047
+ }).then(function (oPopover) {
1048
+ oApplicableContextDialog = oPopover;
1049
+ mParameters.parentControl.addDependent(oPopover);
1050
+ fnOpenAndFillDialog();
1051
+ }).catch(reject);
1052
+ } else {
1053
+ resolve(mParameters.contexts);
1054
+ }
1055
+ }).then(function (contextToProcess) {
1056
+ if (contextToProcess) {
1057
+ return operations.callBoundAction(sActionName, contextToProcess, oModel, oAppComponent, {
1058
+ invocationGrouping: mParameters.invocationGrouping,
1059
+ label: mParameters.label,
1060
+ showActionParameterDialog: true,
1061
+ mBindingParameters: mBindingParameters,
1062
+ entitySetName: mParameters.entitySetName,
1063
+ additionalSideEffect: mSideEffectsParameters,
1064
+ onSubmitted: function () {
1065
+ messageHandler.removeTransitionMessages();
1066
+ BusyLocker.lock(that.oLockObject);
1067
+ },
1068
+ onResponse: function () {
1069
+ BusyLocker.unlock(that.oLockObject);
1070
+ },
1071
+ parentControl: mParameters.parentControl,
1072
+ controlId: mParameters.controlId,
1073
+ internalModelContext: mParameters.internalModelContext,
1074
+ operationAvailableMap: mParameters.operationAvailableMap,
1075
+ bIsCreateAction: mParameters.bIsCreateAction,
1076
+ bGetBoundContext: mParameters.bGetBoundContext,
1077
+ bObjectPage: mParameters.bObjectPage,
1078
+ messageHandler: messageHandler,
1079
+ defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
1080
+ });
1081
+ } else {
1082
+ return null;
1083
+ }
1084
+ });
1085
+ } else {
1086
+ // TODO: confirm if action import needs side effects.
1087
+ oPromise = operations.callActionImport(sActionName, oModel, oAppComponent, {
1088
+ label: mParameters.label,
1089
+ showActionParameterDialog: true,
1090
+ bindingParameters: mBindingParameters,
1091
+ entitySetName: mParameters.entitySetName,
1092
+ onSubmitted: function () {
1093
+ BusyLocker.lock(that.oLockObject);
1094
+ },
1095
+ onResponse: function () {
1096
+ BusyLocker.unlock(that.oLockObject);
1097
+ },
1098
+ parentControl: mParameters.parentControl,
1099
+ internalModelContext: mParameters.internalModelContext,
1100
+ operationAvailableMap: mParameters.operationAvailableMap,
1101
+ messageHandler: messageHandler,
1102
+ bObjectPage: mParameters.bObjectPage
1103
+ });
1104
+ }
1105
+
1106
+ return oPromise.then(function (oResult) {
1107
+ // Succeeded
1108
+ return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1109
+ return oResult;
1110
+ });
1111
+ }).catch(function (err) {
1112
+ return that._handleActionResponse(messageHandler, mParameters, sActionName).then(function () {
1113
+ return Promise.reject(err);
1114
+ });
1115
+ });
1116
+ }
1117
+ /**
1118
+ * Handles messages for action call.
1119
+ *
1120
+ * @function
1121
+ * @name sap.fe.core.TransactionHelper#_handleActionResponse
1122
+ * @memberof sap.fe.core.TransactionHelper
1123
+ * @param messageHandler
1124
+ * @param mParameters Parameters to be considered for the action.
1125
+ * @param sActionName The name of the action to be called
1126
+ * @returns Promise after message dialog is opened if required.
1127
+ * @ui5-restricted
1128
+ * @final
1129
+ */
1130
+ ;
1131
+
1132
+ _proto._handleActionResponse = function _handleActionResponse(messageHandler, mParameters, sActionName) {
1133
+ var aTransientMessages = messageHandling.getMessages(true, true);
1134
+
1135
+ if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
1136
+ mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
1137
+ }
1138
+
1139
+ return messageHandler.showMessages();
1140
+ }
1141
+ /**
1142
+ * Handles validation errors for the 'discard' action.
1143
+ *
1144
+ * @function
1145
+ * @name sap.fe.core.TransactionHelper#handleValidationError
1146
+ * @memberof sap.fe.core.TransactionHelper
1147
+ * @static
1148
+ * @ui5-restricted
1149
+ * @final
1150
+ */
1151
+ ;
1152
+
1153
+ _proto.handleValidationError = function handleValidationError() {
1154
+ var oMessageManager = Core.getMessageManager(),
1155
+ errorToRemove = oMessageManager.getMessageModel().getData().filter(function (error) {
1156
+ // only needs to handle validation messages, technical and persistent errors needs not to be checked here.
1157
+ if (error.validation) {
1158
+ return error;
1159
+ }
1160
+ });
1161
+ oMessageManager.removeMessages(errorToRemove);
1162
+ }
1163
+ /**
1164
+ * Shows a popover if it needs to be shown.
1165
+ * TODO: Popover is shown if user has modified any data.
1166
+ * TODO: Popover is shown if there's a difference from draft admin data.
1167
+ *
1168
+ * @static
1169
+ * @name sap.fe.core.TransactionHelper._showDiscardPopover
1170
+ * @memberof sap.fe.core.TransactionHelper
1171
+ * @param oCancelButton The control which will open the popover
1172
+ * @param bIsModified
1173
+ * @param oResourceBundle
1174
+ * @returns Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
1175
+ * @ui5-restricted
1176
+ * @final
1177
+ */
1178
+ ;
1179
+
1180
+ _proto._showDiscardPopover = function _showDiscardPopover(oCancelButton, bIsModified, oResourceBundle) {
1181
+ // TODO: Implement this popover as a fragment as in v2??
1182
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1183
+ var that = this;
1184
+ that._bContinueDiscard = false; // to be implemented
1185
+
1186
+ return new Promise(function (resolve, reject) {
1187
+ if (!oCancelButton) {
1188
+ reject("Cancel button not found");
1189
+ } //Show popover only when data is changed.
1190
+
1191
+
1192
+ if (bIsModified) {
1193
+ var fnOnAfterDiscard = function () {
1194
+ oCancelButton.setEnabled(true);
1195
+
1196
+ if (that._bContinueDiscard) {
1197
+ resolve();
1198
+ } else {
1199
+ reject("Discard operation was rejected. Document has not been discarded");
1200
+ }
1201
+
1202
+ that._oPopover.detachAfterClose(fnOnAfterDiscard);
1203
+ };
1204
+
1205
+ if (!that._oPopover) {
1206
+ var oText = new Text({
1207
+ //This text is the same as LR v2.
1208
+ //TODO: Display message provided by app developer???
1209
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE", oResourceBundle)
1210
+ }),
1211
+ oButton = new Button({
1212
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle),
1213
+ width: "100%",
1214
+ press: function () {
1215
+ that.handleValidationError();
1216
+ that._bContinueDiscard = true;
1217
+
1218
+ that._oPopover.close();
1219
+ },
1220
+ ariaLabelledBy: oText
1221
+ });
1222
+ that._oPopover = new Popover({
1223
+ showHeader: false,
1224
+ placement: "Top",
1225
+ content: [new VBox({
1226
+ items: [oText, oButton]
1227
+ })],
1228
+ beforeOpen: function () {
1229
+ // make sure to NOT trigger multiple cancel flows
1230
+ oCancelButton.setEnabled(false);
1231
+
1232
+ that._oPopover.setInitialFocus(oButton);
1233
+ }
1234
+ });
1235
+
1236
+ that._oPopover.addStyleClass("sapUiContentPadding");
1237
+ }
1238
+
1239
+ that._oPopover.attachAfterClose(fnOnAfterDiscard);
1240
+
1241
+ that._oPopover.openBy(oCancelButton, false);
1242
+ } else {
1243
+ that.handleValidationError();
1244
+ resolve();
1245
+ }
1246
+ });
1247
+ }
1248
+ /**
1249
+ * Sets the document to modified state on patch event.
1250
+ *
1251
+ * @function
1252
+ * @static
1253
+ * @name sap.fe.core.TransactionHelper.handleDocumentModifications
1254
+ * @memberof sap.fe.core.TransactionHelper
1255
+ * @ui5-restricted
1256
+ * @final
1257
+ */
1258
+ ;
1259
+
1260
+ _proto.handleDocumentModifications = function handleDocumentModifications() {
1261
+ this._bIsModified = true;
1262
+ }
1263
+ /**
1264
+ * Retrieves the owner component.
1265
+ *
1266
+ * @function
1267
+ * @static
1268
+ * @private
1269
+ * @name sap.fe.core.TransactionHelper._getOwnerComponent
1270
+ * @memberof sap.fe.core.TransactionHelper
1271
+ * @returns The app component
1272
+ * @ui5-restricted
1273
+ * @final
1274
+ */
1275
+ ;
1276
+
1277
+ _proto._getAppComponent = function _getAppComponent() {
1278
+ return this._oAppComponent;
1279
+ };
1280
+
1281
+ _proto._onFieldChange = function _onFieldChange(oEvent, oCreateButton, messageHandler, fnValidateRequiredProperties) {
1282
+ messageHandler.removeTransitionMessages();
1283
+ var oField = oEvent.getSource();
1284
+ var oFieldPromise = oEvent.getParameter("promise");
1285
+
1286
+ if (oFieldPromise) {
1287
+ return oFieldPromise.then(function (value) {
1288
+ // Setting value of field as '' in case of value help and validating other fields
1289
+ oField.setValue(value);
1290
+ fnValidateRequiredProperties();
1291
+ return oField.getValue();
1292
+ }).catch(function (value) {
1293
+ if (value !== "") {
1294
+ //disabling the continue button in case of invalid value in field
1295
+ oCreateButton.setEnabled(false);
1296
+ } else {
1297
+ // validating all the fields in case of empty value in field
1298
+ oField.setValue(value);
1299
+ fnValidateRequiredProperties();
1300
+ }
1301
+ });
1302
+ }
1303
+ };
1304
+
1305
+ _proto._getNonDeletableText = function _getNonDeletableText(mParameters, vContexts, oResourceBundle) {
1306
+ var aNonDeletableContexts = mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length;
1307
+ return aNonDeletableContexts === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
1308
+ };
1309
+
1310
+ _proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, oTransientListBinding, oTransientContext, mFields, oModel, mParameters, messageHandler) {
1311
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1312
+ var that = this;
1313
+ var oDialog;
1314
+ var oParentControl = mParameters.parentControl,
1315
+ bSuccess = false;
1316
+ return new Promise(function (resolve, reject) {
1317
+ var sFragmentName = "sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog";
1318
+
1319
+ var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
1320
+ oResourceBundle = oParentControl.getController().oResourceBundle,
1321
+ oMetaModel = oModel.getMetaModel(),
1322
+ aImmutableFields = [],
1323
+ oAppComponent = that._getAppComponent(),
1324
+ sPath = oListBinding.isRelative() ? oListBinding.getResolvedPath() : oListBinding.getPath(),
1325
+ oEntitySetContext = oMetaModel.createBindingContext(sPath),
1326
+ sMetaPath = oMetaModel.getMetaPath(sPath);
1327
+
1328
+ for (var i in mFields) {
1329
+ aImmutableFields.push(oMetaModel.createBindingContext("".concat(sMetaPath, "/").concat(mFields[i])));
1330
+ }
1331
+
1332
+ var oImmutableCtxModel = new JSONModel(aImmutableFields);
1333
+ var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
1334
+ var aRequiredProperties = CommonUtils.getRequiredPropertiesFromInsertRestrictions(sMetaPath, oMetaModel);
1335
+ var oRequiredPropertyPathsCtxModel = new JSONModel(aRequiredProperties);
1336
+ var oRequiredPropertyPathsCtx = oRequiredPropertyPathsCtxModel.createBindingContext("/");
1337
+ return Promise.resolve(XMLPreprocessor.process(oFragment, {
1338
+ name: sFragmentName
1339
+ }, {
1340
+ bindingContexts: {
1341
+ entitySet: oEntitySetContext,
1342
+ fields: oImmutableCtx,
1343
+ requiredProperties: oRequiredPropertyPathsCtx
1344
+ },
1345
+ models: {
1346
+ entitySet: oEntitySetContext.getModel(),
1347
+ fields: oImmutableCtx.getModel(),
1348
+ metaModel: oMetaModel,
1349
+ requiredProperties: oRequiredPropertyPathsCtxModel
1350
+ }
1351
+ })).then(function (oNewFragment) {
1352
+ var aFormElements = [];
1353
+ var mFieldValueMap = {};
1354
+ var oCreateButton;
1355
+
1356
+ var validateRequiredProperties = function () {
1357
+ return Promise.all(aFormElements.map(function (oFormElement) {
1358
+ return oFormElement.getFields()[0];
1359
+ }).filter(function (oField) {
1360
+ // The continue button should remain disabled in case of error in any field of the create dialog
1361
+ return oField.getRequired() || oField.getValueState() === ValueState.Error && oField.getValue() !== "";
1362
+ }).map(function (oField) {
1363
+ var sFieldId = oField.getId();
1364
+
1365
+ if (sFieldId in mFieldValueMap) {
1366
+ return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
1367
+ return oField.getValueState() === ValueState.Error ? undefined : vValue;
1368
+ }).catch(function () {
1369
+ return undefined;
1370
+ });
1371
+ }
1372
+
1373
+ return oField.getValueState() === ValueState.Error ? undefined : oField.getValue();
1374
+ })).then(function (aResults) {
1375
+ return aResults.every(function (vValue) {
1376
+ return vValue !== undefined && vValue !== null && vValue !== "";
1377
+ });
1378
+ }).catch(function () {
1379
+ return false;
1380
+ }).then(function (bEnabled) {
1381
+ oCreateButton.setEnabled(bEnabled);
1382
+ });
1383
+ };
1384
+
1385
+ var oController = {
1386
+ /*
1387
+ fired on focus out from field or on selecting a value from the valuehelp.
1388
+ the create button is enabled when a value is added.
1389
+ liveChange is not fired when value is added from valuehelp.
1390
+ value validation is not done for create button enablement.
1391
+ */
1392
+ handleChange: function (oEvent) {
1393
+ var sFieldId = oEvent.getParameter("id");
1394
+ mFieldValueMap[sFieldId] = that._onFieldChange(oEvent, oCreateButton, messageHandler, validateRequiredProperties);
1395
+ },
1396
+
1397
+ /*
1398
+ fired on key press. the create button is enabled when a value is added.
1399
+ liveChange is not fired when value is added from valuehelp.
1400
+ value validation is not done for create button enablement.
1401
+ */
1402
+ handleLiveChange: function (oEvent) {
1403
+ var sFieldId = oEvent.getParameter("id");
1404
+ var vValue = oEvent.getParameter("value");
1405
+ mFieldValueMap[sFieldId] = vValue;
1406
+ validateRequiredProperties();
1407
+ }
1408
+ };
1409
+ return Fragment.load({
1410
+ definition: oNewFragment,
1411
+ controller: oController
1412
+ }).then(function (oDialogContent) {
1413
+ oDialog = new Dialog({
1414
+ title: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE", oResourceBundle),
1415
+ content: [oDialogContent],
1416
+ beginButton: {
1417
+ text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle),
1418
+ type: "Emphasized",
1419
+ press: function (oEvent) {
1420
+ var createButton = oEvent.getSource();
1421
+ createButton.setEnabled(false);
1422
+ BusyLocker.lock(oDialog);
1423
+ mParameters.bIsCreateDialog = true;
1424
+ return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
1425
+ return mFieldValueMap[sKey].then(function (oValue) {
1426
+ var oDialogValue = {};
1427
+ oDialogValue[sKey] = oValue;
1428
+ return oDialogValue;
1429
+ });
1430
+ })).then(function (aValues) {
1431
+ var onBeforeCreatePromise;
1432
+
1433
+ if (mParameters.beforeCreateCallBack) {
1434
+ onBeforeCreatePromise = mParameters.beforeCreateCallBack({
1435
+ contextPath: oListBinding && oListBinding.getPath(),
1436
+ createParameters: aValues
1437
+ });
1438
+ } else {
1439
+ onBeforeCreatePromise = Promise.resolve();
1440
+ }
1441
+
1442
+ return onBeforeCreatePromise;
1443
+ }).then(function () {
1444
+ var oPromise = that.onAfterCreateCompletion(oTransientListBinding, oTransientContext, mParameters);
1445
+ oModel.submitBatch("submitLater");
1446
+ return oPromise;
1447
+ }).then(function (oResponse) {
1448
+ if (!oResponse || oResponse && oResponse.bKeepDialogOpen !== true) {
1449
+ oDialog.setBindingContext(null);
1450
+ oDialog.close();
1451
+ resolve(oResponse);
1452
+ }
1453
+ }).catch(function (oError) {
1454
+ reject(oError);
1455
+ }).finally(function () {
1456
+ BusyLocker.unlock(oDialog);
1457
+ createButton.setEnabled(true);
1458
+ messageHandler.showMessages();
1459
+ });
1460
+ }
1461
+ },
1462
+ endButton: {
1463
+ text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
1464
+ press: function () {
1465
+ oDialog.close();
1466
+ }
1467
+ },
1468
+ afterClose: function () {
1469
+ var _oDialog$getBindingCo;
1470
+
1471
+ // show footer as per UX guidelines when dialog is not open
1472
+ (_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
1473
+ oDialog.destroy();
1474
+
1475
+ if (!bSuccess) {
1476
+ reject({
1477
+ bDeleteTransientContext: true,
1478
+ navigateBackFromTransientState: true
1479
+ });
1480
+ }
1481
+ }
1482
+ });
1483
+ aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
1484
+
1485
+ if (oParentControl && oParentControl.addDependent) {
1486
+ // if there is a parent control specified add the dialog as dependent
1487
+ oParentControl.addDependent(oDialog);
1488
+ }
1489
+
1490
+ oCreateButton = oDialog.getBeginButton();
1491
+ oDialog.setBindingContext(oTransientContext);
1492
+ return CommonUtils.setUserDefaults(oAppComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data).then(function () {
1493
+ validateRequiredProperties(); // footer must not be visible when the dialog is open as per UX guidelines
1494
+
1495
+ oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
1496
+ oDialog.open();
1497
+ }).catch(function (oError) {
1498
+ return messageHandler.showMessages().then(function () {
1499
+ return Promise.reject(oError);
1500
+ });
1501
+ });
1502
+ });
1503
+ });
1504
+ });
1505
+ };
1506
+
1507
+ _proto.onAfterCreateCompletion = function onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters) {
1508
+ var fnResolve, fnReject;
1509
+ var oPromise = new Promise(function (resolve, reject) {
1510
+ fnResolve = resolve;
1511
+ fnReject = reject;
1512
+ }); // eslint-disable-next-line @typescript-eslint/no-this-alias
1513
+
1514
+ var that = this; // Workaround suggested by OData model v4 colleagues
1515
+
1516
+ var fnCreateCompleted = function (oEvent) {
1517
+ var oContext = oEvent.getParameter("context"),
1518
+ bSuccess = oEvent.getParameter("success");
1519
+
1520
+ if (oContext === oNewDocumentContext) {
1521
+ oListBinding.detachCreateCompleted(fnCreateCompleted, that);
1522
+
1523
+ if (!bSuccess) {
1524
+ var oError = {
1525
+ bDeleteTransientContext: false
1526
+ };
1527
+
1528
+ if (!mParameters.keepTransientContextOnFailed) {
1529
+ // the context is deleted
1530
+ // this is needed to avoid console errors TO be checked with model colleagues
1531
+ oContext.created().then(undefined, function () {
1532
+ Log.trace("transient creation context deleted");
1533
+ }).catch(function (contextError) {
1534
+ Log.trace("transient creation context deletion error", contextError);
1535
+ });
1536
+
1537
+ if (!mParameters.bIsCreateDialog) {
1538
+ // if current state is transient (...), browser will come back to previous state
1539
+ oError.navigateBackFromTransientState = true;
1540
+ oError.bDeleteTransientContext = true;
1541
+ fnReject(oError);
1542
+ }
1543
+ }
1544
+
1545
+ fnResolve({
1546
+ bKeepDialogOpen: true
1547
+ });
1548
+ } else {
1549
+ return oContext.created().then(fnResolve);
1550
+ }
1551
+ }
1552
+ };
1553
+
1554
+ oListBinding.attachCreateCompleted(fnCreateCompleted, this);
1555
+ return oPromise;
1556
+ }
1557
+ /**
1558
+ * Retrieves the name of the NewAction to be executed.
1559
+ *
1560
+ * @function
1561
+ * @static
1562
+ * @private
1563
+ * @name sap.fe.core.TransactionHelper._getNewAction
1564
+ * @memberof sap.fe.core.TransactionHelper
1565
+ * @param oStartupParameters Startup parameters of the application
1566
+ * @param sCreateHash Hash to be checked for action type
1567
+ * @param oMetaModel The MetaModel used to check for NewAction parameter
1568
+ * @param sMetaPath The MetaPath
1569
+ * @returns The name of the action
1570
+ * @ui5-restricted
1571
+ * @final
1572
+ */
1573
+ ;
1574
+
1575
+ _proto._getNewAction = function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
1576
+ var sNewAction;
1577
+
1578
+ if (oStartupParameters && oStartupParameters.preferredMode && sCreateHash.indexOf("i-action=createWith") > -1) {
1579
+ var sPreferredMode = oStartupParameters.preferredMode[0];
1580
+ sNewAction = sPreferredMode.indexOf("createWith:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
1581
+ } else {
1582
+ sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction")) || oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction")) : undefined;
1583
+ }
1584
+
1585
+ return sNewAction;
1586
+ }
1587
+ /**
1588
+ * Retrieves the label for the title of a specific create action dialog, e.g. Create Sales Order from Quotation.
1589
+ *
1590
+ * The following priority is applied:
1591
+ * 1. label of line-item annotation.
1592
+ * 2. label annotated in the action.
1593
+ * 3. "Create" as a constant from i18n.
1594
+ *
1595
+ * @function
1596
+ * @static
1597
+ * @private
1598
+ * @name sap.fe.core.TransactionHelper._getSpecificCreateActionDialogLabel
1599
+ * @memberof sap.fe.core.TransactionHelper
1600
+ * @param oMetaModel The MetaModel used to check for the NewAction parameter
1601
+ * @param sMetaPath The MetaPath
1602
+ * @param sNewAction Contains the name of the action to be executed
1603
+ * @param oResourceBundleCore ResourceBundle to access the default Create label
1604
+ * @returns The label for the Create Action Dialog
1605
+ * @ui5-restricted
1606
+ * @final
1607
+ */
1608
+ ;
1609
+
1610
+ _proto._getSpecificCreateActionDialogLabel = function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
1611
+ var fnGetLabelFromLineItemAnnotation = function () {
1612
+ if (oMetaModel && oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem"))) {
1613
+ var iLineItemIndex = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem")).findIndex(function (oLineItem) {
1614
+ var aLineItemAction = oLineItem.Action ? oLineItem.Action.split("(") : undefined;
1615
+ return aLineItemAction ? aLineItemAction[0] === sNewAction : false;
1616
+ });
1617
+ return iLineItemIndex > -1 ? oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem"))[iLineItemIndex].Label : undefined;
1618
+ } else {
1619
+ return undefined;
1620
+ }
1621
+ };
1622
+
1623
+ return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject("".concat(sMetaPath, "/").concat(sNewAction, "@com.sap.vocabularies.Common.v1.Label")) || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
1624
+ };
1625
+
1626
+ return TransactionHelper;
1627
+ }();
1628
+
1629
+ return TransactionHelper;
1630
+ }, false);
1631
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sIm5hbWVzIjpbIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJsZW5ndGgiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJ0aGF0Iiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJvQ3JlYXRpb25Qcm9taXNlIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwicmVqZWN0IiwiYnVzeU1vZGUiLCJzSWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJjYWxsQWN0aW9uIiwiY29udGV4dHMiLCJzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibGFiZWwiLCJfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbCIsImJpbmRpbmdQYXJhbWV0ZXJzIiwicGFyZW50Q29udHJvbCIsImJJc0NyZWF0ZUFjdGlvbiIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiSW5saW5lIiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsIkNvbW1vblV0aWxzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwic0Z1bmN0aW9uUGF0aCIsIm9GdW5jdGlvbkNvbnRleHQiLCJvRnVuY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwidGhlbiIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJvbkJlZm9yZUNyZWF0ZVByb21pc2UiLCJjb250ZXh0UGF0aCIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsIm9SZXN1bHQiLCJyZXNwb25zZSIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJoYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMiLCJzaG93TWVzc2FnZURpYWxvZyIsImJEZWxldGVUcmFuc2llbnRDb250ZXh0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJmaW5hbGx5IiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhZnRlckRlbGV0ZVByb2Nlc3MiLCJjaGVja0JveCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJpc0NoZWNrQm94VmlzaWJsZSIsImlzQ2hlY2tCb3hTZWxlY3RlZCIsInNldFByb3BlcnR5Iiwib2JqIiwic2VsZWN0ZWRDb250ZXh0cyIsImZpbHRlciIsImVsZW1lbnQiLCJkZWxldGFibGVDb250ZXh0cyIsImluZGV4T2YiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXROYW1lIiwiZGVsZXRlRG9jdW1lbnQiLCJ2SW5Db250ZXh0cyIsImZuUmVqZWN0IiwiZm5SZXNvbHZlIiwiYURlbGV0YWJsZUNvbnRleHRzIiwiaXNMb2NrZWRUZXh0VmlzaWJsZSIsImNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIiwiYkRpYWxvZ0NvbmZpcm1lZCIsImFQYXJhbXMiLCJvRGVsZXRlTWVzc2FnZSIsInRpdGxlIiwiZ2V0VGV4dCIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwidkNvbnRleHRzIiwiQXJyYXkiLCJpc0FycmF5IiwiaSIsIm9Db250ZXh0RGF0YSIsIkhhc0RyYWZ0RW50aXR5IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJblByb2Nlc3NCeVVzZXIiLCJEcmFmdElzQ3JlYXRlZEJ5TWUiLCJzTG9ja2VkVXNlciIsImRyYWZ0QWRtaW5EYXRhIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJvTGluZUNvbnRleHREYXRhIiwicGF0aCIsInNUaXRsZSIsInNLZXkiLCJnZXRLZXlzIiwic0tleVZhbHVlIiwic0Rlc2NyaXB0aW9uIiwidW5TYXZlZENvbnRleHRzIiwic0xhc3RDaGFuZ2VkQnlVc2VyIiwiY29uY2F0IiwibG9ja2VkQ29udGV4dHMiLCJub25EZWxldGFibGVUZXh0IiwiX2dldE5vbkRlbGV0YWJsZVRleHQiLCJjaGVja0JveFRleHQiLCJzTm9uRGVsZXRhYmxlQ29udGV4dFRleHQiLCJvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sIiwib0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCIsIm9Db250ZW50IiwiVkJveCIsIml0ZW1zIiwiVGV4dCIsInZpc2libGUiLCJDaGVja0JveCIsInNlbGVjdGVkIiwic2VsZWN0Iiwib0V2ZW50IiwiZ2V0U291cmNlIiwiZ2V0U2VsZWN0ZWQiLCJmbkNvbmZpcm0iLCJvbkJlZm9yZURlbGV0ZVByb21pc2UiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsImJpbmQiLCJkcmFmdCIsImRlbGV0ZURyYWZ0Iiwic2hvd01lc3NhZ2VzIiwib0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiZ2V0VmlzaWJsZSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsIm5vRGlhbG9nIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJ3YXJuaW5nIiwiZWRpdERvY3VtZW50Iiwib0VkaXRQcm9taXNlIiwiRXJyb3IiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJvTmV3Q29udGV4dCIsImVyciIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImNhbmNlbERvY3VtZW50Iiwib1BhcmFtc0NvbnRleHQiLCJvQ2FuY2VsQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwib25CZWZvcmVDYW5jZWxQcm9taXNlIiwic0Nhbm9uaWNhbFBhdGgiLCJzUE1vZGVsIiwiZHJhZnREYXRhQ29udGV4dCIsInJlcXVlc3RPYmplY3QiLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiX3Nob3dEaXNjYXJkUG9wb3ZlciIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY29udGV4dCIsIm9EZWxldGVQcm9taXNlIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiZGlzY2FyZERvY3VtZW50IiwiZGlzY2FyZGVkQ29udGV4dCIsInJlZnJlc2giLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsIm9TYXZlUHJvbWlzZSIsImFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnQiLCJiTmV3T2JqZWN0IiwiZm9yRWFjaCIsIm9MaXN0QmluZGluZyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQWN0aW9uTmFtZSIsIm9Qcm9taXNlIiwic05hbWUiLCJzcGxpdCIsIm1vZGVsIiwibVNpZGVFZmZlY3RzUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJvQXBwbGljYWJsZUNvbnRleHREaWFsb2ciLCJvQ29udHJvbGxlciIsIm9uQ29udGludWUiLCJhcHBsaWNhYmxlQ29udGV4dCIsImZuT3BlbkFuZEZpbGxEaWFsb2ciLCJvRGlhbG9nQ29udGVudCIsIm5Ob3RBcHBsaWNhYmxlIiwibm90QXBwbGljYWJsZUNvbnRleHQiLCJhTm90QXBwbGljYWJsZUl0ZW1zIiwib05vdEFwcGxpY2FibGVJdGVtc01vZGVsIiwiSlNPTk1vZGVsIiwib1RvdGFscyIsInRvdGFsIiwic2V0TW9kZWwiLCJzRnJhZ21lbnROYW1lIiwib0RpYWxvZ0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJnZXRDYW5vbmljYWxQYXRoIiwic0VudGl0eVNldCIsInN1YnN0ciIsIm9EaWFsb2dMYWJlbE1vZGVsIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlUeXBlIiwibW9kZWxzIiwibWV0YU1vZGVsIiwib0ZyYWdtZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJvUG9wb3ZlciIsImFkZERlcGVuZGVudCIsImNvbnRleHRUb1Byb2Nlc3MiLCJjYWxsQm91bmRBY3Rpb24iLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsIm9uU3VibWl0dGVkIiwib25SZXNwb25zZSIsImNvbnRyb2xJZCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJHZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJhVHJhbnNpZW50TWVzc2FnZXMiLCJnZXRNZXNzYWdlcyIsImhhbmRsZVZhbGlkYXRpb25FcnJvciIsIm9NZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZXJyb3JUb1JlbW92ZSIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJ2YWxpZGF0aW9uIiwicmVtb3ZlTWVzc2FnZXMiLCJiSXNNb2RpZmllZCIsImZuT25BZnRlckRpc2NhcmQiLCJzZXRFbmFibGVkIiwiX29Qb3BvdmVyIiwiZGV0YWNoQWZ0ZXJDbG9zZSIsIm9UZXh0Iiwib0J1dHRvbiIsIndpZHRoIiwiUG9wb3ZlciIsInNob3dIZWFkZXIiLCJwbGFjZW1lbnQiLCJiZWZvcmVPcGVuIiwic2V0SW5pdGlhbEZvY3VzIiwiYXR0YWNoQWZ0ZXJDbG9zZSIsIm9wZW5CeSIsIl9vbkZpZWxkQ2hhbmdlIiwib0NyZWF0ZUJ1dHRvbiIsImZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMiLCJvRmllbGQiLCJvRmllbGRQcm9taXNlIiwiZ2V0UGFyYW1ldGVyIiwidmFsdWUiLCJzZXRWYWx1ZSIsImdldFZhbHVlIiwiYU5vbkRlbGV0YWJsZUNvbnRleHRzIiwib1RyYW5zaWVudENvbnRleHQiLCJtRmllbGRzIiwib1BhcmVudENvbnRyb2wiLCJiU3VjY2VzcyIsImdldENvbnRyb2xsZXIiLCJhSW1tdXRhYmxlRmllbGRzIiwib0VudGl0eVNldENvbnRleHQiLCJvSW1tdXRhYmxlQ3R4TW9kZWwiLCJvSW1tdXRhYmxlQ3R4IiwiYVJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwiLCJvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4IiwiZW50aXR5U2V0IiwiZmllbGRzIiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwib05ld0ZyYWdtZW50IiwiYUZvcm1FbGVtZW50cyIsIm1GaWVsZFZhbHVlTWFwIiwidmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMiLCJvRm9ybUVsZW1lbnQiLCJnZXRGaWVsZHMiLCJnZXRSZXF1aXJlZCIsImdldFZhbHVlU3RhdGUiLCJzRmllbGRJZCIsImdldElkIiwidlZhbHVlIiwiYVJlc3VsdHMiLCJldmVyeSIsImJFbmFibGVkIiwiaGFuZGxlQ2hhbmdlIiwiaGFuZGxlTGl2ZUNoYW5nZSIsImNyZWF0ZUJ1dHRvbiIsImJJc0NyZWF0ZURpYWxvZyIsImtleXMiLCJvVmFsdWUiLCJvRGlhbG9nVmFsdWUiLCJhVmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsInN1Ym1pdEJhdGNoIiwib1Jlc3BvbnNlIiwiYktlZXBEaWFsb2dPcGVuIiwic2V0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImdldEFnZ3JlZ2F0aW9uIiwiZ2V0QmVnaW5CdXR0b24iLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJmbkNyZWF0ZUNvbXBsZXRlZCIsImRldGFjaENyZWF0ZUNvbXBsZXRlZCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJjcmVhdGVkIiwidHJhY2UiLCJjb250ZXh0RXJyb3IiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJwcmVmZXJyZWRNb2RlIiwic1ByZWZlcnJlZE1vZGUiLCJmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiIsImlMaW5lSXRlbUluZGV4IiwiZmluZEluZGV4Iiwib0xpbmVJdGVtIiwiYUxpbmVJdGVtQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUE4QkEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQS9CO0FBQ0EsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQW5DO0FBQ0EsTUFBTUMsVUFBVSxHQUFHQyxXQUFXLENBQUNELFVBQS9CO0FBQ0E7O0FBQ0EsV0FBU0UsYUFBVCxDQUF1QkMsV0FBdkIsRUFBeUM7QUFDeEMsUUFBSUEsV0FBVyxJQUFJQSxXQUFXLENBQUNDLFdBQTNCLElBQTBDRCxXQUFXLENBQUNDLFdBQVosR0FBMEJDLE9BQTFCLE9BQXdDLG1CQUF0RixFQUEyRztBQUMxR0YsTUFBQUEsV0FBVyxHQUFHLEVBQWQ7QUFDQTs7QUFDRCxXQUFPQSxXQUFXLElBQUksRUFBdEI7QUFDQTs7TUFFS0csaUI7QUFRTCwrQkFBWUMsYUFBWixFQUF5Q0MsV0FBekMsRUFBMkQ7QUFBQSxXQUozREMsWUFJMkQsR0FKbkMsS0FJbUM7QUFBQSxXQUgzREMsWUFHMkQsR0FIbkMsS0FHbUM7QUFBQSxXQUYzREMsaUJBRTJELEdBRjlCLEtBRThCO0FBQzFELFdBQUtDLGNBQUwsR0FBc0JMLGFBQXRCO0FBQ0EsV0FBS0MsV0FBTCxHQUFtQkEsV0FBbkI7QUFDQTs7OztXQUNESyxtQixHQUFBLDZCQUFvQkMsUUFBcEIsRUFBNkQ7QUFDNUQsVUFBSSxDQUFDLEtBQUtDLGlCQUFOLElBQTJCRCxRQUEvQixFQUF5QztBQUN4QyxZQUFJRSxLQUFKOztBQUNBLFlBQUlGLFFBQVEsQ0FBQ0csR0FBVCxDQUFhLCtCQUFiLENBQUosRUFBbUQ7QUFDbERELFVBQUFBLEtBQUssR0FBR0YsUUFBUSxDQUFDSSxPQUFULEVBQVI7QUFDQSxTQUZELE1BRU87QUFDTkYsVUFBQUEsS0FBSyxHQUFHRixRQUFRLENBQUNLLFVBQVQsS0FBd0JMLFFBQVEsQ0FBQ00s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WSxVQUExQixHQUF1QyxLQUE3RDtBQUNBLFdBTHFCLENBQXZCO0FBTUEsaUJBQU9rWSxjQUFjLEdBQUcsQ0FBQyxDQUFsQixHQUNKOVksVUFBVSxDQUFDa0IsU0FBWCxXQUF3QmpCLFNBQXhCLDRDQUEwRTZZLGNBQTFFLEVBQTBGSyxLQUR0RixHQUVKclksU0FGSDtBQUdBLFNBVkQsTUFVTztBQUNOLGlCQUFPQSxTQUFQO0FBQ0E7QUFDRCxPQWREOztBQWdCQSxhQUNDK1gsZ0NBQWdDLE1BQy9CN1ksVUFBVSxJQUFJQSxVQUFVLENBQUNrQixTQUFYLFdBQXdCakIsU0FBeEIsY0FBcUNXLFVBQXJDLDJDQURmLElBRUNrQixtQkFBbUIsSUFBSUEsbUJBQW1CLENBQUNzRyxPQUFwQixDQUE0QiwwQ0FBNUIsQ0FIekI7QUFLQSxLOzs7OztTQUdhbkwsaUIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IENoZWNrQm94IGZyb20gXCJzYXAvbS9DaGVja0JveFwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4LCBPRGF0YUxpc3RCaW5kaW5nLCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGU7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5jb25zdCBWYWx1ZVN0YXRlID0gY29yZUxpYnJhcnkuVmFsdWVTdGF0ZTtcbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmIChtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5nZXRNZXRhZGF0YSAmJiBtUGFyYW1ldGVycy5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fTtcblx0fVxuXHRyZXR1cm4gbVBhcmFtZXRlcnMgfHwge307XG59XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0X29BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0b0xvY2tPYmplY3Q6IGFueTtcblx0c1Byb2dyYW1taW5nTW9kZWw/OiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbDtcblx0X2JJc01vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XG5cdF9iQ3JlYXRlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRfYkNvbnRpbnVlRGlzY2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRfb1BvcG92ZXIhOiBQb3BvdmVyO1xuXHRjb25zdHJ1Y3RvcihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIG9Mb2NrT2JqZWN0OiBhbnkpIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLm9Mb2NrT2JqZWN0ID0gb0xvY2tPYmplY3Q7XG5cdH1cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dD86IGFueSk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRpZiAoIXRoaXMuc1Byb2dyYW1taW5nTW9kZWwgJiYgb0NvbnRleHQpIHtcblx0XHRcdGxldCBzUGF0aDtcblx0XHRcdGlmIChvQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNQYXRoID0gb0NvbnRleHQuaXNSZWxhdGl2ZSgpID8gb0NvbnRleHQuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBzUGF0aCkpIHtcblx0XHRcdFx0dGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCA9IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHR0aGlzLnNQcm9ncmFtbWluZ01vZGVsID0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBhcyB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGlzIGEgc2luZ2xldG9uIHdlIGRvbid0IHN0b3JlIHRoZSBub24gZHJhZnQgYXMgdGhlIHVzZXIgY291bGRcblx0XHRcdFx0Ly8gc3RhcnQgd2l0aCBhIG5vbiBkcmFmdCBjaGlsZCBwYWdlIGFuZCBuYXZpZ2F0ZXMgYmFjayB0byBhIGRyYWZ0IGVuYWJsZWQgb25lXG5cdFx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5zUHJvZ3JhbW1pbmdNb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHZhbGlkYXRlRG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvTWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5idXN5TW9kZV0gR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmUgVE9ETzogdG8gYmUgcmVmYWN0b3JlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZF0gSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuaW5hY3RpdmVdIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSBiRnJvbUNvcHlQYXN0ZVxuXHQgKiBAcGFyYW0gb1ZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRjcmVhdGVEb2N1bWVudChcblx0XHRvTWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHsgZGF0YT86IGFueTsgYnVzeU1vZGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBhbnk7IGluYWN0aXZlPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZTogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnksXG5cdFx0YkZyb21Db3B5UGFzdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRvVmlldzogYW55XG5cdCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzLFxuXHRcdFx0b01vZGVsID0gb01haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKSxcblx0XHRcdHNDcmVhdGVIYXNoID0gdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCksXG5cdFx0XHRvQ29tcG9uZW50RGF0YSA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpLmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRzTmV3QWN0aW9uID0gIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHRcdD8gdGhpcy5fZ2V0TmV3QWN0aW9uKG9TdGFydHVwUGFyYW1ldGVycywgc0NyZWF0ZUhhc2gsIG9NZXRhTW9kZWwsIHNNZXRhUGF0aClcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0bGV0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzOiBhbnkgPSB7IFwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0c1wiOiB0cnVlIH07XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYCkgfHxcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRgJHtNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYFxuXHRcdFx0KTtcblx0XHRsZXQgYkZ1bmN0aW9uT25OYXZQcm9wO1xuXHRcdGxldCBvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnk7XG5cdFx0aWYgKHNGdW5jdGlvbk5hbWUpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYCkgJiZcblx0XHRcdFx0TW9kZWxIZWxwZXIuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzTWV0YVBhdGgpKSAhPT0gc01ldGFQYXRoXG5cdFx0XHQpIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJGdW5jdGlvbk9uTmF2UHJvcCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob01haW5MaXN0QmluZGluZyk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMuYnVzeU1vZGUgPT09IFwiTG9jYWxcIikge1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBsb2NhbCBidXN5IG1vZGUgd2UgdXNlIHRoZSBsaXN0IGJpbmRpbmcgbmFtZVxuXHRcdFx0Ly8gdGhlcmUncyBubyBBUFkgeWV0IHNvIHdlIGhhdmUgdG8gdXNlIHRoZSAuc0lkIFRPRE8gcHJvdmlkZSBhIHB1YmxpYyBtZXRob2Q/XG5cdFx0XHRzQnVzeVBhdGggPSBgL2J1c3lMb2NhbC8ke29NYWluTGlzdEJpbmRpbmcuc0lkfWA7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gYkZyb21Db3B5UGFzdGUgPyBudWxsIDogbVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QsIHNCdXN5UGF0aCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlQ29yZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdG9DcmVhdGlvblByb21pc2UgPSB0aGlzLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb250ZXh0czogb01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCksXG5cdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRsYWJlbDogdGhpcy5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHNOZXdBY3Rpb24sIG9SZXNvdXJjZUJ1bmRsZUNvcmUpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBiSXNOZXdQYWdlQ3JlYXRpb25cblx0XHRcdFx0PyBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCBvVmlldylcblx0XHRcdFx0OiBbXTtcblx0XHRcdHNGdW5jdGlvbk5hbWUgPSBiRnJvbUNvcHlQYXN0ZSA/IG51bGwgOiBzRnVuY3Rpb25OYW1lO1xuXHRcdFx0bGV0IHNGdW5jdGlvblBhdGgsIG9GdW5jdGlvbkNvbnRleHQ7XG5cdFx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0XHQvL2JvdW5kIHRvIHRoZSBzb3VyY2UgZW50aXR5OlxuXHRcdFx0XHRpZiAoYkZ1bmN0aW9uT25OYXZQcm9wKSB7XG5cdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0YCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YDtcblx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0YCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YDtcblx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IG9GdW5jdGlvbiA9IHNGdW5jdGlvblBhdGggJiYgKG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkgYXMgYW55KTtcblx0XHRcdGlmIChvRnVuY3Rpb24gJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpICYmIG9GdW5jdGlvbi5nZXRPYmplY3QoKVswXS4kSXNCb3VuZCkge1xuXHRcdFx0XHRvQ3JlYXRpb25Qcm9taXNlID0gb3BlcmF0aW9ucy5jYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvRnVuY3Rpb25Db250ZXh0LCBvTW9kZWwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0NyZWF0aW9uUHJvbWlzZSA9IG9wZXJhdGlvbnMuY2FsbEZ1bmN0aW9uSW1wb3J0KHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdG9DcmVhdGlvblByb21pc2UgPSBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uICR7c0Z1bmN0aW9uTmFtZX1gLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0gb0RhdGEgPyBPYmplY3QuYXNzaWduKHt9LCBvRGF0YSwgbVBhcmFtZXRlcnMuZGF0YSkgOiBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kYXRhKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuZGF0YVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvVHJhbnNpZW50TGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob01haW5MaXN0QmluZGluZy5nZXRQYXRoKCksIG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCBbXSwgW10sIHtcblx0XHRcdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcInN1Ym1pdExhdGVyXCJcblx0XHRcdFx0XHRcdH0pIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRcdFx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvKiAqL1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvVHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKG1QYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoYXQuX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0YU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyxcblx0XHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxldCBvbkJlZm9yZUNyZWF0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWFpbkxpc3RCaW5kaW5nICYmIG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b25CZWZvcmVDcmVhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb01haW5MaXN0QmluZGluZy5jcmVhdGUoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmluYWN0aXZlXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuaW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTWFpbkxpc3RCaW5kaW5nLCBvTmV3RG9jdW1lbnRDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb0NyZWF0aW9uUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGNyZWF0ZSBtb2RlIHNoYWxsIGN1cnJlbnRseSBvbmx5IGJlIHNldCBvbiBjcmVhdGluZyBhIHJvb3QgZG9jdW1lbnRcblx0XHRcdFx0XHR0aGF0Ll9iQ3JlYXRlTW9kZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQgfHwgKG9SZXN1bHQgJiYgb1Jlc3VsdC5yZXNwb25zZSk7XG5cdFx0XHRcdC8vIFRPRE86IHdoZXJlIGRvZXMgdGhpcyBvbmUgY29taW5nIGZyb20/Pz9cblx0XHRcdFx0aWYgKG9SZXN1bHQgJiYgb1Jlc3VsdC5iQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkKSB7XG5cdFx0XHRcdFx0dGhhdC5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBmb3IgaW5zdGFuY2UsIG9uIGNhbmNlbCBvZiBjcmVhdGUgZGlhbG9nLCB0aGUgcHJvbWlzZSBpcyByZWplY3RlZFxuXHRcdFx0XHRcdC8vIGEgcmV0dXJuIGhlcmUgd291bGQgcmVzdG9yZSB0aGUgcHJvbWlzZSBjaGFpbiBhbmQgcmVzdWx0IGluIGVycm9ycyB3aGlsZSByb3V0aW5nXG5cdFx0XHRcdFx0Ly8gc29sdXRpb24gLSAgcmVqZWN0IGhlcmUgYXMgd2VsbFxuXHRcdFx0XHRcdGlmIChvRXJyb3IgJiYgb0Vycm9yLmJEZWxldGVUcmFuc2llbnRDb250ZXh0ICYmIG9OZXdEb2N1bWVudENvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IG1vZGVsIGFzIENvbnRleHQuZGVsZXRlIHJlc3VsdHMgaW4gYW4gZXJyb3Jcblx0XHRcdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0XHRcdC8vIHRoaXMgbGluZSBzaG93cyB0aGUgZXhwZWN0ZWQgY29uc29sZSBlcnJvciBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IFJlcXVlc3QgY2FuY2VsZWQ6IFBPU1QgVHJhdmVsOyBncm91cDogc3VibWl0TGF0ZXJcblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBGaW5kIHRoZSBhY3RpdmUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cywgb25seSBmb3IgdGhlIGRyYWZ0IHJvb3RzLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIGJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHJldHVybnMgQXJyYXkgb2YgdGhlIGFjdGl2ZSBjb250ZXh0c1xuXHQgKi9cblx0ZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzKGFDb250ZXh0czogVjRDb250ZXh0W10sIGJGaW5kQWN0aXZlQ29udGV4dHM6IGFueSkge1xuXHRcdGlmICghYkZpbmRBY3RpdmVDb250ZXh0cykge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBhY3RpdmVDb250ZXh0cyA9IGFDb250ZXh0cy5yZWR1Y2UoZnVuY3Rpb24gKGFSZXN1bHQ6IGFueSwgb0NvbnRleHQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRpZiAob01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCkpIHtcblx0XHRcdFx0Y29uc3QgYklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHksXG5cdFx0XHRcdFx0Ykhhc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLkhhc0FjdGl2ZUVudGl0eTtcblx0XHRcdFx0aWYgKCFiSXNBY3RpdmVFbnRpdHkgJiYgYkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0XHRcdGNvbnN0IG9BY3RpdmVDb250ZXh0ID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRhUmVzdWx0LnB1c2gob0FjdGl2ZUNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVJlc3VsdDtcblx0XHR9LCBbXSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0YWN0aXZlQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblx0YWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzOiBhbnksIGNoZWNrQm94OiBhbnksIGFDb250ZXh0czogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGlmIChvSW50ZXJuYWxNb2RlbENvbnRleHQgJiYgb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiKSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChjaGVja0JveC5pc0NoZWNrQm94VmlzaWJsZSA9PT0gdHJ1ZSAmJiBjaGVja0JveC5pc0NoZWNrQm94U2VsZWN0ZWQgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vaWYgdW5zYXZlZCBvYmplY3RzIGFyZSBub3QgZGVsZXRlZCB0aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBlbmFibGVkIHRvIHRydWUgYW5kIHVwZGF0ZSB0aGUgbW9kZWwgZGF0YSBmb3IgbmV4dCBkZWxldGlvblxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBvYmogPSBPYmplY3QuYXNzaWduKG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRPYmplY3QoKSwge30pO1xuXHRcdFx0XHRvYmouc2VsZWN0ZWRDb250ZXh0cyA9IG9iai5zZWxlY3RlZENvbnRleHRzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iai5kZWxldGFibGVDb250ZXh0cy5pbmRleE9mKGVsZW1lbnQpID09PSAtMTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9iai5kZWxldGFibGVDb250ZXh0cyA9IFtdO1xuXHRcdFx0XHRvYmouc2VsZWN0ZWRDb250ZXh0cyA9IFtdO1xuXHRcdFx0XHRvYmoubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMubGVuZ3RoO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJcIiwgb2JqKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgZmFsc2UpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIFtdKTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfREVMRVRFX1RPQVNUX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfUExVUkFMXCIsIG9SZXNvdXJjZUJ1bmRsZSwgbnVsbCwgbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gdkluQ29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgTnVtYmVyIG9mIG9iamVjdHMgc2VsZWN0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm5vRGlhbG9nIFRvIGRpc2FibGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50IGFyZSBkZWxldGVkXG5cdCAqL1xuXHRkZWxldGVEb2N1bWVudCh2SW5Db250ZXh0czogVjRDb250ZXh0LCBtUGFyYW1ldGVyczogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdGxldCBmblJlamVjdDogRnVuY3Rpb24sXG5cdFx0XHRmblJlc29sdmU6IEZ1bmN0aW9uLFxuXHRcdFx0YURlbGV0YWJsZUNvbnRleHRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQ6IGJvb2xlYW4sXG5cdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRsZXQgYVBhcmFtcztcblx0XHRsZXQgb0RlbGV0ZU1lc3NhZ2U6IGFueSA9IHtcblx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIilcblx0XHR9O1xuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0KTtcblx0XHRsZXQgdkNvbnRleHRzOiBWNENvbnRleHRbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2SW5Db250ZXh0cykpIHtcblx0XHRcdHZDb250ZXh0cyA9IHZJbkNvbnRleHRzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2Q29udGV4dHMgPSBbdkluQ29udGV4dHNdO1xuXHRcdH1cblx0XHRQcm9taXNlLnJlc29sdmUodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHZDb250ZXh0c1swXSkpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc1Byb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdkNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gdkNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgc0xvY2tlZFVzZXIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBvQ29udGV4dERhdGEgJiYgb0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNMb2NrZWRVc2VyID0gZHJhZnRBZG1pbkRhdGFbXCJJblByb2Nlc3NCeVVzZXJcIl07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NMb2NrZWRVc2VyXTtcblx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogZm5SZWplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSwgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gKyBcIiBcIl07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFttUGFyYW1ldGVycy50aXRsZSwgXCJcIl07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZSA9IHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IDEgJiYgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PSB2Q29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0xpbmVDb250ZXh0RGF0YSA9IHZDb250ZXh0c1swXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnRpdGxlICYmIG1QYXJhbWV0ZXJzLnRpdGxlLnBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVGl0bGUgPSBvTGluZUNvbnRleHREYXRhW21QYXJhbWV0ZXJzLnRpdGxlLnBhdGhdO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNLZXkgPSBDb21tb25VdGlscy5nZXRLZXlzKFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhhdC5fb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHRcdHZDb250ZXh0c1swXS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzS2V5VmFsdWUgPSBzS2V5ID8gb0xpbmVDb250ZXh0RGF0YVtzS2V5XSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzRGVzY3JpcHRpb24gPVxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gJiYgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24ucGF0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IG9MaW5lQ29udGV4dERhdGFbbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24ucGF0aF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNUaXRsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNEZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NUaXRsZSwgc0Rlc2NyaXB0aW9uICsgXCIgXCJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFtzVGl0bGUsIFwiXCJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzS2V5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc0tleVZhbHVlLCBcIlwiXTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSBvbmUgdW5zYXZlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGFEZWxldGFibGVDb250ZXh0c1swXS5nZXRPYmplY3QoKVtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdO1xuXHRcdFx0XHRcdFx0XHRsZXQgc0xhc3RDaGFuZ2VkQnlVc2VyID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0c0xhc3RDaGFuZ2VkQnlVc2VyID1cblx0XHRcdFx0XHRcdFx0XHRcdGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvblwiXSB8fCBkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyXCJdIHx8IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFtzTGFzdENoYW5nZWRCeVVzZXJdO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgbXVsdGlwbGUgdW5zYXZlZCBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNfTVVMVElQTEVfT0JKRUNUU1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PVxuXHRcdFx0XHRcdFx0XHR2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMpKS5sZW5ndGhcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgdW5zYXZlZCwgbG9ja2VkICxkZWxldGFibGUgb2JqZWN0cyBidXQgbm90IG5vbi1kZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPVxuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvL2lmIG5vbi1kZWxldGFibGUgb2JqZWN0cyBleGlzdHMgYWxvbmcgd2l0aCBhbnkgb2YgdW5zYXZlZCAsZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPVxuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1BMVVJBTF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFthRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSB0aGF0Ll9nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB2Q29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1BBR0VfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCwgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIHx8IGlzTG9ja2VkVGV4dFZpc2libGUpICYmXG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvL2lmIG9ubHkgdW5zYXZlZCBhbmQgZWl0aGVyIG9yIGJvdGggb2YgbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgdGhlbiB3ZSBoaWRlIHRoZSBjaGVjayBib3hcblx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgJiYgaXNMb2NrZWRUZXh0VmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHQvL2lmIG5vbi1kZWxldGFibGUgb2JqZWN0cyBleGlzdCBhbG9uZyB3aXRoIGRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNOb25EZWxldGFibGVDb250ZXh0VGV4dCA9IHRoYXQuX2dldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHZDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0Ly9pZiBib3RoIGxvY2tlZCBhbmQgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IGFsb25nIHdpdGggZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHRzTm9uRGVsZXRhYmxlQ29udGV4dFRleHQgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XCIgXCIgK1xuXHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURfQU5EX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLCBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNdXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRcdHNOb25EZWxldGFibGVDb250ZXh0VGV4dCArXG5cdFx0XHRcdFx0XHRcdFx0XHRcIiBcIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTE9DS0VEX0FORF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2w7XG5cdFx0XHRcdGNvbnN0IG9Db250ZW50ID0gbmV3IFZCb3goe1xuXHRcdFx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdFx0XHQob05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNMb2NrZWRUZXh0VmlzaWJsZSB8fCBjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0KG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLnRleHRcblx0XHRcdFx0XHRcdH0pKSxcblx0XHRcdFx0XHRcdG5ldyBDaGVja0JveCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLmNoZWNrQm94VGV4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdDogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWQgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0U2VsZWN0ZWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNDaGVja0JveFZpc2libGVcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpO1xuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YkRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IGFDb250ZXh0cyA9IGFEZWxldGFibGVDb250ZXh0cztcblx0XHRcdFx0XHRsZXQgb25CZWZvcmVEZWxldGVQcm9taXNlO1xuXHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0b25CZWZvcmVEZWxldGVQcm9taXNlID0gbVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2soeyBjb250ZXh0czogYUNvbnRleHRzIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvbkJlZm9yZURlbGV0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlRGVsZXRlUHJvbWlzZVxuXHRcdFx0XHRcdFx0LnRoZW4odGhhdC5maW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMuYmluZCh0aGF0LCBhQ29udGV4dHMsIG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMpKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFjdGl2ZUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly9tYWtlIHN1cmUgdG8gZmV0Y2ggdGhlIGFjdGl2ZSBjb250ZXh0cyBiZWZvcmUgZGVsZXRpbmcgdGhlIGRyYWZ0c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzLm1hcChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9kZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlLXRocm93IGVycm9yIHRvIGVuZm9yY2UgcmVqZWN0aW5nIHRoZSBnZW5lcmFsIHByb21pc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGVja0JveCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJpc0NoZWNrQm94VmlzaWJsZVwiOiBpc0NoZWNrQm94VmlzaWJsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJpc0NoZWNrQm94U2VsZWN0ZWRcIjogaXNDaGVja0JveFNlbGVjdGVkXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGl2ZUNvbnRleHRzICYmIGFjdGl2ZUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0LmFmdGVyRGVsZXRlUHJvY2VzcyhtUGFyYW1ldGVycywgY2hlY2tCb3gsIGFDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKS50aGVuKGZuUmVzb2x2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdC5hZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnMsIGNoZWNrQm94LCBhQ29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZm5SZXNvbHZlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IFtvQ29udGVudF0sXG5cdFx0XHRcdFx0YXJpYUxhYmVsbGVkQnk6IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wuZ2V0VmlzaWJsZSgpXG5cdFx0XHRcdFx0XHQ/IFtvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sLCBvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sXVxuXHRcdFx0XHRcdFx0OiBvRGVsZXRlTWVzc2FnZVRleHRDb250cm9sLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5Db25maXJtKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdFx0XHRpZiAoIWJEaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYXMgYW55KTtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm5vRGlhbG9nKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiQ291bGRuJ3QgZ2V0IFByb2dyYW1taW5nIG1vZGVsXCIpO1xuXHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRmblJlamVjdCA9IHJlamVjdDtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEVkaXRzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG9WaWV3IEN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGVkaXREb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0LCBvVmlldzogVmlldywgbWVzc2FnZUhhbmRsZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRsZXQgb0VkaXRQcm9taXNlO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0XHR9XG5cdFx0dGhpcy5fYklzTW9kaWZpZWQgPSBmYWxzZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0Ly8gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIGVkaXQgYWN0aW9uIHdlJ2xsIGhhdmUgdG8gcmVtb3ZlIGFsbCBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRvRWRpdFByb21pc2UgPSBkcmFmdC5jcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksIHtcblx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHR9IGFzIGFueSk7XG5cdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdG9FZGl0UHJvbWlzZSA9IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRWRpdCBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBvRWRpdFByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvTmV3Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdHRoYXQuX2JDcmVhdGVNb2RlID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29uY3VycmVudEVkaXRGbGFnOiB0cnVlIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgY2FuY2VsZWQgb3IgZGVsZXRlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBDYW5jZWwgQnV0dG9uIG9mIHRoZSBkaXNjYXJkIHBvcG92ZXIgKG1hbmRhdG9yeSBmb3Igbm93KVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdG1JblBhcmFtZXRlcnM6IHsgY2FuY2VsQnV0dG9uOiBhbnk7IHNraXBEaXNjYXJkUG9wb3ZlcjogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZTogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbDtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9QYXJhbXNDb250ZXh0ID0gb0NvbnRleHQsXG5cdFx0XHRvQ2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uLFxuXHRcdFx0b01vZGVsID0gb1BhcmFtc0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRsZXQgb25CZWZvcmVDYW5jZWxQcm9taXNlLCBzQ2Fub25pY2FsUGF0aDogc3RyaW5nO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzUE1vZGVsOiBhbnkpIHtcblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPSBzUE1vZGVsO1xuXHRcdFx0XHRpZiAoc1BNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGlmICghdGhhdC5fYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKS50aGVuKGZ1bmN0aW9uIChkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gIShkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoYXQuX3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uLCB0aGF0Ll9iSXNNb2RpZmllZCwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRcdG9uQmVmb3JlQ2FuY2VsUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b25CZWZvcmVDYW5jZWxQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9uQmVmb3JlQ2FuY2VsUHJvbWlzZTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2Vcblx0XHRcdFx0c3dpdGNoIChzUHJvZ3JhbW1pbmdNb2RlbCkge1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDpcblx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1zQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpLnRoZW4oZnVuY3Rpb24gKGJIYXNBY3RpdmVFbnRpdHk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgb0RlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghYkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zQ29udGV4dCAmJiBvUGFyYW1zQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVQcm9taXNlID0gZHJhZnQuZGVsZXRlRHJhZnQob1BhcmFtc0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRGVsZXRlUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgb0FjdGl2ZUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b1BhcmFtc0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVDb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uIChzUGF0aDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0Nhbm9uaWNhbFBhdGggPSBzUGF0aDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1BhcmFtc0NvbnRleHQgJiYgb1BhcmFtc0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtc0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlUHJvbWlzZSA9IGRyYWZ0LmRlbGV0ZURyYWZ0KG9QYXJhbXNDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RlbGV0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkcmFmdC5kZWxldGVEcmFmdChvUGFyYW1zQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9vUGFyYW1zQ29udGV4dC5kZWxldGUoKSBpbiB0aGUgcHJldmlvdXMgcHJvbWlzZSBkb2VzbnQgcmV0dXJuIGFueXRoaW5nIHVwb24gc3VjY2Vzcy5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0FjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpICE9PSBzQ2Fub25pY2FsUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBhY3RpdmUgY29udGV4dCBpcyB1c2luZyB0aGUgc2libGluZyBlbnRpdHkgLSB0aGlzIHBhdGggaXMgbm90IGFjY2Vzc2libGUgYW55bW9yZSBhcyB3ZSBkZWxldGVkIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGRvY3VtZW50IC0gdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgY2Fub25pY2FsIHBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQWN0aXZlQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQ2Fub25pY2FsUGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k6XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCkudGhlbihmdW5jdGlvbiAoZGlzY2FyZGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmICghdGhhdC5fYkNyZWF0ZU1vZGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGRpc2NhcmRlZENvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XG5cdFx0XHRcdHRoYXQuX2JJc01vZGlmaWVkID0gZmFsc2U7XG5cdFx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvclxuXHQgKiBAcGFyYW0gYUJpbmRpbmdzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdHNhdmVEb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0LCBvUmVzb3VyY2VCdW5kbGU6IGFueSwgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGFueSwgYUJpbmRpbmdzOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9TYXZlUHJvbWlzZTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0XHR9XG5cdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7fSk7XG5cdFx0fSBlbHNlIGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdG9TYXZlUHJvbWlzZSA9IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU2F2ZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2F2ZVByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQWN0aXZlRG9jdW1lbnQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBiTmV3T2JqZWN0ID1cblx0XHRcdFx0XHR0aGF0LnNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSA/IHRoYXQuX2JDcmVhdGVNb2RlIDogIW9Db250ZXh0LmdldE9iamVjdCgpLkhhc0FjdGl2ZUVudGl0eTtcblx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdFx0Yk5ld09iamVjdFxuXHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9DUkVBVEVEXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfU0FWRURcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR0aGF0Ll9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50O1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0aWYgKGFCaW5kaW5ncyAmJiBhQmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdFx0YUJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24gKG9MaXN0QmluZGluZzogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSAmJiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhhdC5fZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvblxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGNhbGxBY3Rpb24oc0FjdGlvbk5hbWU6IHN0cmluZywgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcgfCBudWxsLCBtZXNzYWdlSGFuZGxlcjogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRsZXQgb0NvbnRleHQsIG9Nb2RlbDogYW55LCBvUHJvbWlzZTtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycztcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblx0XHRzQWN0aW9uTmFtZSA9IHNOYW1lIHx8IHNBY3Rpb25OYW1lO1xuXHRcdG9Db250ZXh0ID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKG9Db250ZXh0ICYmICgoQXJyYXkuaXNBcnJheShvQ29udGV4dCkgJiYgb0NvbnRleHQubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShvQ29udGV4dCkpKSB7XG5cdFx0XHRvQ29udGV4dCA9IEFycmF5LmlzQXJyYXkob0NvbnRleHQpID8gb0NvbnRleHRbMF0gOiBvQ29udGV4dDtcblx0XHRcdG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c1BhcmFtZXRlcnMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSB8fCB7fTtcblx0XHRpZiAob0NvbnRleHQgJiYgb01vZGVsKSB7XG5cdFx0XHRvUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0bGV0IG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZzogRGlhbG9nO1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VyIGNhbmNlbHMgYWN0aW9uXG5cdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uQ29udGludWU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXJzIGNvbnRpbnVlcyB0aGUgYWN0aW9uIHdpdGggdGhlIGJvdW5kIGNvbnRleHRzXG5cdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUobVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgZm5PcGVuQW5kRmlsbERpYWxvZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRsZXQgb0RpYWxvZ0NvbnRlbnQ7XG5cdFx0XHRcdFx0Y29uc3Qgbk5vdEFwcGxpY2FibGUgPSBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zID0gW107XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0b0RpYWxvZ0NvbnRlbnQgPSBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dFtpXS5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMucHVzaChvRGlhbG9nQ29udGVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9Ob3RBcHBsaWNhYmxlSXRlbXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoYU5vdEFwcGxpY2FibGVJdGVtcyk7XG5cdFx0XHRcdFx0Y29uc3Qgb1RvdGFscyA9IG5ldyBKU09OTW9kZWwoeyB0b3RhbDogbk5vdEFwcGxpY2FibGUsIGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCB9KTtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cuc2V0TW9kZWwob05vdEFwcGxpY2FibGVJdGVtc01vZGVsLCBcIm5vdEFwcGxpY2FibGVcIik7XG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dCAmJiBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGggPj0gMSkge1xuXHRcdFx0XHRcdC8vIFNob3cgdGhlIGNvbnRleHRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIGFuZCB3aWxsIG5vdCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkXG5cdFx0XHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwLmZlLmNvcmUuY29udHJvbHMuQWN0aW9uUGFydGlhbFwiO1xuXHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dGcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBtUGFyYW1ldGVycy5jb250ZXh0c1swXS5nZXRDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IGAke3NDYW5vbmljYWxQYXRoLnN1YnN0cigwLCBzQ2Fub25pY2FsUGF0aC5pbmRleE9mKFwiKFwiKSl9L2A7XG5cdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZ0xhYmVsTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlUeXBlOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IG9EaWFsb2dMYWJlbE1vZGVsXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9GcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1BvcG92ZXI6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0XHRmbk9wZW5BbmRGaWxsRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLnRoZW4oZnVuY3Rpb24gKGNvbnRleHRUb1Byb2Nlc3M6IGFueSkge1xuXHRcdFx0XHRpZiAoY29udGV4dFRvUHJvY2Vzcykge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRpb25zLmNhbGxCb3VuZEFjdGlvbihzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2Vzcywgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXNwb25zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUT0RPOiBjb25maXJtIGlmIGFjdGlvbiBpbXBvcnQgbmVlZHMgc2lkZSBlZmZlY3RzLlxuXHRcdFx0b1Byb21pc2UgPSBvcGVyYXRpb25zLmNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0FwcENvbXBvbmVudCwge1xuXHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9Qcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc3VsdDogYW55KSB7XG5cdFx0XHRcdC8vIFN1Y2NlZWRlZFxuXHRcdFx0XHRyZXR1cm4gdGhhdC5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHRoYXQuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBIYW5kbGVzIG1lc3NhZ2VzIGZvciBhY3Rpb24gY2FsbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI19oYW5kbGVBY3Rpb25SZXNwb25zZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdkaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNoYW5kbGVWYWxpZGF0aW9uRXJyb3Jcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCkge1xuXHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRcdGVycm9yVG9SZW1vdmUgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRcdFx0XHRpZiAoZXJyb3IudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGVycm9yVG9SZW1vdmUpO1xuXHR9XG5cdC8qKlxuXHQgKiBTaG93cyBhIHBvcG92ZXIgaWYgaXQgbmVlZHMgdG8gYmUgc2hvd24uXG5cdCAqIFRPRE86IFBvcG92ZXIgaXMgc2hvd24gaWYgdXNlciBoYXMgbW9kaWZpZWQgYW55IGRhdGEuXG5cdCAqIFRPRE86IFBvcG92ZXIgaXMgc2hvd24gaWYgdGhlcmUncyBhIGRpZmZlcmVuY2UgZnJvbSBkcmFmdCBhZG1pbiBkYXRhLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9zaG93RGlzY2FyZFBvcG92ZXJcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvQ2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gYklzTW9kaWZpZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9zaG93RGlzY2FyZFBvcG92ZXIob0NhbmNlbEJ1dHRvbjogYW55LCBiSXNNb2RpZmllZDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHBvcG92ZXIgYXMgYSBmcmFnbWVudCBhcyBpbiB2Mj8/XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IGZhbHNlO1xuXHRcdC8vIHRvIGJlIGltcGxlbWVudGVkXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmICghb0NhbmNlbEJ1dHRvbikge1xuXHRcdFx0XHRyZWplY3QoXCJDYW5jZWwgYnV0dG9uIG5vdCBmb3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vU2hvdyBwb3BvdmVyIG9ubHkgd2hlbiBkYXRhIGlzIGNoYW5nZWQuXG5cdFx0XHRpZiAoYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZm5PbkFmdGVyRGlzY2FyZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRoYXQuX2JDb250aW51ZURpc2NhcmQpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRGlzY2FyZCBvcGVyYXRpb24gd2FzIHJlamVjdGVkLiBEb2N1bWVudCBoYXMgbm90IGJlZW4gZGlzY2FyZGVkXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5kZXRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoIXRoYXQuX29Qb3BvdmVyKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHQgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdC8vVGhpcyB0ZXh0IGlzIHRoZSBzYW1lIGFzIExSIHYyLlxuXHRcdFx0XHRcdFx0XHQvL1RPRE86IERpc3BsYXkgbWVzc2FnZSBwcm92aWRlZCBieSBhcHAgZGV2ZWxvcGVyPz8/XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9NRVNTQUdFXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0b0J1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JDb250aW51ZURpc2NhcmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvVGV4dFxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyID0gbmV3IFBvcG92ZXIoe1xuXHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XHRcdG5ldyBWQm94KHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtczogW29UZXh0LCBvQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRvIE5PVCB0cmlnZ2VyIG11bHRpcGxlIGNhbmNlbCBmbG93c1xuXHRcdFx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMob0J1dHRvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIub3BlbkJ5KG9DYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogU2V0cyB0aGUgZG9jdW1lbnQgdG8gbW9kaWZpZWQgc3RhdGUgb24gcGF0Y2ggZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9uc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCkge1xuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBvd25lciBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRPd25lckNvbXBvbmVudFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHJldHVybnMgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldEFwcENvbXBvbmVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudDtcblx0fVxuXG5cdF9vbkZpZWxkQ2hhbmdlKG9FdmVudDogYW55LCBvQ3JlYXRlQnV0dG9uOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBhbnksIGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXM6IEZ1bmN0aW9uKSB7XG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3Qgb0ZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IG9GaWVsZFByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRpZiAob0ZpZWxkUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9GaWVsZFByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIGZpZWxkIGFzICcnIGluIGNhc2Ugb2YgdmFsdWUgaGVscCBhbmQgdmFsaWRhdGluZyBvdGhlciBmaWVsZHNcblx0XHRcdFx0XHRvRmllbGQuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRcdGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gXCJcIikge1xuXHRcdFx0XHRcdFx0Ly9kaXNhYmxpbmcgdGhlIGNvbnRpbnVlIGJ1dHRvbiBpbiBjYXNlIG9mIGludmFsaWQgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9DcmVhdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIHZhbGlkYXRpbmcgYWxsIHRoZSBmaWVsZHMgaW4gY2FzZSBvZiBlbXB0eSB2YWx1ZSBpbiBmaWVsZFxuXHRcdFx0XHRcdFx0b0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcblx0XHRcdFx0XHRcdGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXHRfZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVyczogYW55LCB2Q29udGV4dHM6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRjb25zdCBhTm9uRGVsZXRhYmxlQ29udGV4dHMgPSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoO1xuXHRcdHJldHVybiBhTm9uRGVsZXRhYmxlQ29udGV4dHMgPT09IDFcblx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XVxuXHRcdFx0ICApXG5cdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyAtIHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKS5sZW5ndGgsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRdXG5cdFx0XHQgICk7XG5cdH1cblxuXHRfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRvTGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmc6IGFueSxcblx0XHRvVHJhbnNpZW50Q29udGV4dDogYW55LFxuXHRcdG1GaWVsZHM6IGFueSxcblx0XHRvTW9kZWw6IGFueSxcblx0XHRtUGFyYW1ldGVyczogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBhbnlcblx0KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRiU3VjY2VzcyA9IGZhbHNlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzRGlhbG9nXCI7XG5cdFx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YUltbXV0YWJsZUZpZWxkczogYW55W10gPSBbXSxcblx0XHRcdFx0b0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRzUGF0aCA9IG9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyBvTGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NNZXRhUGF0aH0vJHttRmllbGRzW2ldfWApKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9JbW11dGFibGVDdHhNb2RlbCA9IG5ldyBKU09OTW9kZWwoYUltbXV0YWJsZUZpZWxkcyk7XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4ID0gb0ltbXV0YWJsZUN0eE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0O1xuXHRcdFx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllcyA9IENvbW1vblV0aWxzLmdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMoc01ldGFQYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdGNvbnN0IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbCA9IG5ldyBKU09OTW9kZWwoYVJlcXVpcmVkUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4ID0gb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0O1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0WE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0b0ZyYWdtZW50LFxuXHRcdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHgsXG5cdFx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllczogb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdHJlcXVpcmVkUHJvcGVydGllczogb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpLnRoZW4oZnVuY3Rpb24gKG9OZXdGcmFnbWVudDogYW55KSB7XG5cdFx0XHRcdGxldCBhRm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRjb25zdCBtRmllbGRWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0XHRcdGxldCBvQ3JlYXRlQnV0dG9uOiBCdXR0b247XG5cdFx0XHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdGFGb3JtRWxlbWVudHNcblx0XHRcdFx0XHRcdFx0Lm1hcChmdW5jdGlvbiAob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0Zvcm1FbGVtZW50LmdldEZpZWxkcygpWzBdO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvRmllbGQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBjb250aW51ZSBidXR0b24gc2hvdWxkIHJlbWFpbiBkaXNhYmxlZCBpbiBjYXNlIG9mIGVycm9yIGluIGFueSBmaWVsZCBvZiB0aGUgY3JlYXRlIGRpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKSB8fCAob0ZpZWxkLmdldFZhbHVlU3RhdGUoKSA9PT0gVmFsdWVTdGF0ZS5FcnJvciAmJiBvRmllbGQuZ2V0VmFsdWUoKSAhPT0gXCJcIik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRmllbGQuZ2V0SWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0ZpZWxkSWQgaW4gbUZpZWxkVmFsdWVNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAodlZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlU3RhdGUoKSA9PT0gVmFsdWVTdGF0ZS5FcnJvciA/IHVuZGVmaW5lZCA6IHZWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3IgPyB1bmRlZmluZWQgOiBvRmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoYVJlc3VsdHM6IGFueVtdKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhUmVzdWx0cy5ldmVyeShmdW5jdGlvbiAodlZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdlZhbHVlICE9PSB1bmRlZmluZWQgJiYgdlZhbHVlICE9PSBudWxsICYmIHZWYWx1ZSAhPT0gXCJcIjtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChiRW5hYmxlZDogYm9vbGVhbikge1xuXHRcdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoYkVuYWJsZWQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0XHRcdC8qXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24gZm9jdXMgb3V0IGZyb20gZmllbGQgb3Igb24gc2VsZWN0aW5nIGEgdmFsdWUgZnJvbSB0aGUgdmFsdWVoZWxwLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdHRoZSBjcmVhdGUgYnV0dG9uIGlzIGVuYWJsZWQgd2hlbiBhIHZhbHVlIGlzIGFkZGVkLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgdmFsaWRhdGlvbiBpcyBub3QgZG9uZSBmb3IgY3JlYXRlIGJ1dHRvbiBlbmFibGVtZW50LlxuICAgIFx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdGhhbmRsZUNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpZFwiKTtcblx0XHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHRoYXQuX29uRmllbGRDaGFuZ2Uob0V2ZW50LCBvQ3JlYXRlQnV0dG9uLCBtZXNzYWdlSGFuZGxlciwgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0LypcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRmaXJlZCBvbiBrZXkgcHJlc3MuIHRoZSBjcmVhdGUgYnV0dG9uIGlzIGVuYWJsZWQgd2hlbiBhIHZhbHVlIGlzIGFkZGVkLlxuICAgIFx0XHRcdFx0XHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgdmFsaWRhdGlvbiBpcyBub3QgZG9uZSBmb3IgY3JlYXRlIGJ1dHRvbiBlbmFibGVtZW50LlxuICAgIFx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRcdGhhbmRsZUxpdmVDaGFuZ2U6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRjb25zdCB2VmFsdWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSB2VmFsdWU7XG5cdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoe1xuXHRcdFx0XHRcdGRlZmluaXRpb246IG9OZXdGcmFnbWVudCxcblx0XHRcdFx0XHRjb250cm9sbGVyOiBvQ29udHJvbGxlclxuXHRcdFx0XHR9KS50aGVuKGZ1bmN0aW9uIChvRGlhbG9nQ29udGVudDogYW55KSB7XG5cdFx0XHRcdFx0b0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdFx0dGl0bGU6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURV9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjcmVhdGVCdXR0b24gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iSXNDcmVhdGVEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKG1GaWVsZFZhbHVlTWFwKS5tYXAoZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUZpZWxkVmFsdWVNYXBbc0tleV0udGhlbihmdW5jdGlvbiAob1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nVmFsdWU6IGFueSA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2dWYWx1ZVtzS2V5XSA9IG9WYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RpYWxvZ1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFWYWx1ZXM6IGFueVtdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBvbkJlZm9yZUNyZWF0ZVByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uQmVmb3JlQ3JlYXRlUHJvbWlzZSA9IG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGFWYWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvbkJlZm9yZUNyZWF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb25CZWZvcmVDcmVhdGVQcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSB0aGF0Lm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvVHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTW9kZWwuc3VibWl0QmF0Y2goXCJzdWJtaXRMYXRlclwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9SZXNwb25zZSB8fCAob1Jlc3BvbnNlICYmIG9SZXNwb25zZS5iS2VlcERpYWxvZ09wZW4gIT09IHRydWUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUob1Jlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRlbmRCdXR0b246IHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHNob3cgZm9vdGVyIGFzIHBlciBVWCBndWlkZWxpbmVzIHdoZW4gZGlhbG9nIGlzIG5vdCBvcGVuXG5cdFx0XHRcdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0YUZvcm1FbGVtZW50cyA9IG9EaWFsb2dDb250ZW50XG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpXG5cdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0XHRcdGlmIChvUGFyZW50Q29udHJvbCAmJiBvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQob1RyYW5zaWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHJldHVybiBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0YUltbXV0YWJsZUZpZWxkcyxcblx0XHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHRcdFx0XHQvLyBmb290ZXIgbXVzdCBub3QgYmUgdmlzaWJsZSB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbiBhcyBwZXIgVVggZ3VpZGVsaW5lc1xuXHRcdFx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcImlzQ3JlYXRlRGlhbG9nT3BlblwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uLCBmblJlamVjdDogRnVuY3Rpb247XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0Zm5SZWplY3QgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Ly8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgT0RhdGEgbW9kZWwgdjQgY29sbGVhZ3Vlc1xuXHRcdGNvbnN0IGZuQ3JlYXRlQ29tcGxldGVkID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpLFxuXHRcdFx0XHRiU3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKG9Db250ZXh0ID09PSBvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoYXQpO1xuXHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yOiBhbnkgPSB7IGJEZWxldGVUcmFuc2llbnRDb250ZXh0OiBmYWxzZSB9O1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuXG5cdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0b0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHRcdFx0XHQudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGNvbnRleHRFcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRpb24gZXJyb3JcIiwgY29udGV4dEVycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZykge1xuXHRcdFx0XHRcdFx0XHQvLyBpZiBjdXJyZW50IHN0YXRlIGlzIHRyYW5zaWVudCAoLi4uKSwgYnJvd3NlciB3aWxsIGNvbWUgYmFjayB0byBwcmV2aW91cyBzdGF0ZVxuXHRcdFx0XHRcdFx0XHRvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0Vycm9yLmJEZWxldGVUcmFuc2llbnRDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0Zm5SZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm5SZXNvbHZlKHsgYktlZXBEaWFsb2dPcGVuOiB0cnVlIH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5jcmVhdGVkKCkudGhlbihmblJlc29sdmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0TmV3QWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgc0NyZWF0ZUhhc2g6IHN0cmluZywgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHNNZXRhUGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVXaXRoXCIpID4gLTEpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0c1ByZWZlcnJlZE1vZGUuaW5kZXhPZihcImNyZWF0ZVdpdGg6XCIpID4gLTEgPyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApIHx8XG5cdFx0XHRcdFx0ICBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uYClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHNOZXdBY3Rpb247XG5cdH1cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbGFiZWwgZm9yIHRoZSB0aXRsZSBvZiBhIHNwZWNpZmljIGNyZWF0ZSBhY3Rpb24gZGlhbG9nLCBlLmcuIENyZWF0ZSBTYWxlcyBPcmRlciBmcm9tIFF1b3RhdGlvbi5cblx0ICpcblx0ICogVGhlIGZvbGxvd2luZyBwcmlvcml0eSBpcyBhcHBsaWVkOlxuXHQgKiAxLiBsYWJlbCBvZiBsaW5lLWl0ZW0gYW5ub3RhdGlvbi5cblx0ICogMi4gbGFiZWwgYW5ub3RhdGVkIGluIHRoZSBhY3Rpb24uXG5cdCAqIDMuIFwiQ3JlYXRlXCIgYXMgYSBjb25zdGFudCBmcm9tIGkxOG4uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZUNvcmUgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZyxcblx0XHRzTmV3QWN0aW9uOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlQ29yZTogUmVzb3VyY2VCdW5kbGVcblx0KSB7XG5cdFx0Y29uc3QgZm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAob01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApKSB7XG5cdFx0XHRcdGNvbnN0IGlMaW5lSXRlbUluZGV4ID0gb01ldGFNb2RlbFxuXHRcdFx0XHRcdC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1gKVxuXHRcdFx0XHRcdC5maW5kSW5kZXgoZnVuY3Rpb24gKG9MaW5lSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhTGluZUl0ZW1BY3Rpb24gPSBvTGluZUl0ZW0uQWN0aW9uID8gb0xpbmVJdGVtLkFjdGlvbi5zcGxpdChcIihcIikgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYUxpbmVJdGVtQWN0aW9uID8gYUxpbmVJdGVtQWN0aW9uWzBdID09PSBzTmV3QWN0aW9uIDogZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBpTGluZUl0ZW1JbmRleCA+IC0xXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApW2lMaW5lSXRlbUluZGV4XS5MYWJlbFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZuR2V0TGFiZWxGcm9tTGluZUl0ZW1Bbm5vdGF0aW9uKCkgfHxcblx0XHRcdChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSkgfHxcblx0XHRcdChvUmVzb3VyY2VCdW5kbGVDb3JlICYmIG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIikpXG5cdFx0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2FjdGlvbkhlbHBlcjtcbiJdfQ==