@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
@@ -2,29 +2,536 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define([], function () {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros/internal/valuehelp/ValueListHelper", "sap/ui/core/Core"], function (Log, ModelHelper, ValueListHelper, Core) {
6
6
  "use strict";
7
7
 
8
- /**
9
- * Constructor for a new Visual Filter Container.
10
- * Used for visual filters
11
- *
12
- * @param {string} [sId] ID for the new control, generated automatically if no ID is given
13
- * @extends sap.ui.mdc.filterbar.IFilterContainer
14
- * @class
15
- * @private
16
- * @alias sap.fe.core.controls.filterbar.VisualFilterContainer
17
- */
18
8
  var MassEditHandlers = {
19
- handleMassEditChange: function (oEvent) {
20
- var oSource = oEvent && oEvent.getSource();
21
- var aParams = oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
22
- var oFieldsInfoData = oSource && oSource.getModel("fieldsInfo").getData();
23
- var oDataObject; //TODO - Value Help Handling Load Value Help when respective value is selected in combo Box in dialog
9
+ /**
10
+ * Called for property change in the transient context.
11
+ *
12
+ * @function
13
+ * @param newValue New value of the property.
14
+ * @param dataProperty Final context returned after the paginator action
15
+ * @param mdcFieldId Final context returned after the paginator action
16
+ */
17
+ contextPropertyChange: function (newValue, dataProperty, mdcFieldId) {
18
+ // Called for
19
+ // 1. Out Parameters.
20
+ // 2. Transient context property change.
21
+ var source = Core.byId(mdcFieldId);
22
+ var transCtx = source && source.getBindingContext();
23
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
24
+ var values = fieldInfoModel.getProperty("/values/".concat(dataProperty)) || fieldInfoModel.getProperty("/unitData/".concat(dataProperty)) || [];
24
25
 
25
- /*
26
- if (aParams[0] === "ValueHelp") {
27
- } */
26
+ if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
27
+ MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
28
+ }
29
+
30
+ var isDialogOpen = fieldInfoModel && fieldInfoModel.getProperty("/isOpen");
31
+
32
+ if (!isDialogOpen || !source.getVisible()) {
33
+ return;
34
+ }
35
+
36
+ MassEditHandlers._updateSelectKey(source, dataProperty, newValue);
37
+ },
38
+
39
+ /**
40
+ * Called for change in the MDC field.
41
+ * This is called on selection done through VHD.
42
+ * This is not called on change of the dropdown as we are using a custom MassEditSelect control and not general Select.
43
+ *
44
+ * @function
45
+ * @param event Event object for change.
46
+ * @param propertyName Property path.
47
+ */
48
+ handleMDCFieldChange: function (event, propertyName) {
49
+ // Called for
50
+ // 1. VHD property change.
51
+ var source = event && event.getSource();
52
+ var changePromise = event && event.getParameter("promise");
53
+ var comboBox = source.getContent();
54
+
55
+ if (!comboBox || !propertyName) {
56
+ return;
57
+ }
58
+
59
+ changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
60
+ Log.warning("VHD selection couldn't be populated in the mass edit field.".concat(err));
61
+ });
62
+ },
63
+
64
+ /**
65
+ * Called for selection change through the drop down.
66
+ *
67
+ * @function
68
+ * @param event Event object for change.
69
+ */
70
+ handleSelectionChange: function (event) {
71
+ // Called for Manual selection from dropdown(comboBox or select)
72
+ // 1. VHD select.
73
+ // 2. Any value change in the control.
74
+ var source = event && event.getSource();
75
+ var key = source.getSelectedKey();
76
+ var params = source && key && key.split("/");
77
+ var propertyName;
78
+
79
+ if (params[0] === "UseValueHelpValue") {
80
+ var prevItem = event.getParameter("previousSelectedItem");
81
+ var selectKey = prevItem.getKey();
82
+ propertyName = params.slice(1).join("/");
83
+
84
+ MassEditHandlers._onVHSelect(source, propertyName, selectKey);
85
+
86
+ return;
87
+ }
88
+
89
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
90
+ propertyName = MassEditHandlers._getPropertyNameFromKey(key);
91
+
92
+ MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), true);
93
+
94
+ MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), false);
95
+
96
+ MassEditHandlers._updateResults(source, params, true);
97
+ },
98
+
99
+ /**
100
+ * Update selections to results and the suggests in drop downs.
101
+ *
102
+ * @function
103
+ * @param source MDC field that was changed.
104
+ * @param propertyName Property path.
105
+ * @param value New value.
106
+ */
107
+ _updateSelectKeyForMDCFieldChange: function (source, propertyName, value) {
108
+ var transCtx = source && source.getBindingContext();
109
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
110
+ var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
111
+
112
+ if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
113
+ MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
114
+ }
115
+
116
+ MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, false, true);
117
+
118
+ MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, false, true);
119
+
120
+ var formattedValue = source.getFormFormattedValue();
121
+
122
+ MassEditHandlers._updateSelectKey(source, propertyName, value, formattedValue);
123
+ },
124
+
125
+ /**
126
+ * Update suggests for all drop downs with InParameter as the propertyName.
127
+ *
128
+ * @function
129
+ * @param fieldInfoModel Runtime model with parameters store information.
130
+ * @param propertyName Property path.
131
+ * @param resetValues Should the values be reset to original state.
132
+ * @param keepExistingSelection Should the existing selection before update remain.
133
+ */
134
+ _updateSuggestionForFieldsWithInParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
135
+ var values = fieldInfoModel.getProperty("/values");
136
+ var unitData = fieldInfoModel.getProperty("/unitData");
137
+ var fieldPaths = Object.keys(values);
138
+ var unitFieldPaths = Object.keys(unitData);
139
+ fieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/values/", propertyName, resetValues, keepExistingSelection));
140
+ unitFieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/unitData/", propertyName, resetValues, keepExistingSelection));
141
+ },
142
+
143
+ /**
144
+ * Update suggests for a drop down with InParameter as the srcPropertyName.
145
+ *
146
+ * @function
147
+ * @param fieldInfoModel Runtime model with parameters store information.
148
+ * @param pathPrefix Path in the runtime model.
149
+ * @param srcPropertyName The InParameter Property path.
150
+ * @param resetValues Should the values be reset to original state.
151
+ * @param keepExistingSelection Should the existing selection before update remain.
152
+ * @param propertyName Property path that needs update of suggestions.
153
+ */
154
+ _updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
155
+ var valueListInfo = fieldInfoModel.getProperty("".concat(pathPrefix + propertyName, "/valueListInfo"));
156
+
157
+ if (valueListInfo && srcPropertyName != propertyName) {
158
+ var inParameters = valueListInfo.inParameters;
159
+
160
+ if (inParameters && inParameters.length > 0 && inParameters.includes(srcPropertyName)) {
161
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix + propertyName, resetValues, keepExistingSelection);
162
+ }
163
+ }
164
+ },
165
+
166
+ /**
167
+ * Update suggests for all OutParameter's drop downs of the propertyName.
168
+ *
169
+ * @function
170
+ * @param fieldInfoModel Runtime model with parameters store information.
171
+ * @param propertyName Property path.
172
+ * @param resetValues Should the values be reset to original state.
173
+ * @param keepExistingSelection Should the existing selection before update remain.
174
+ */
175
+ _updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
176
+ var valueListInfo = fieldInfoModel.getProperty("/values/".concat(propertyName, "/valueListInfo")) || fieldInfoModel.getProperty("/unitData/".concat(propertyName, "/valueListInfo"));
177
+
178
+ if (valueListInfo && valueListInfo.outParameters) {
179
+ var outParameters = valueListInfo.outParameters;
180
+
181
+ if (outParameters.length && outParameters.length > 0) {
182
+ MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
183
+
184
+ var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
185
+
186
+ if (pathPrefix) {
187
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
188
+ }
189
+ }
190
+ }
191
+ },
192
+
193
+ /**
194
+ * Update suggests for a drop down with InParameter as the srcPropertyName.
195
+ *
196
+ * @function
197
+ * @param outParameters String arrary of OutParameter property paths.
198
+ * @param fieldInfoModel Runtime model with parameters store information.
199
+ * @param resetValues Should the values be reset to original state.
200
+ * @param keepExistingSelection Should the existing selection before update remain.
201
+ */
202
+ _updateOutParameterSuggetions: function (outParameters, fieldInfoModel, resetValues, keepExistingSelection) {
203
+ var values = fieldInfoModel.getProperty("/values");
204
+ var unitData = fieldInfoModel.getProperty("/unitData");
205
+ var fieldPaths = Object.keys(values);
206
+ var unitFieldPaths = Object.keys(unitData);
207
+ outParameters.forEach(function (outParameter) {
208
+ if (fieldPaths.includes(outParameter)) {
209
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(outParameter), resetValues, keepExistingSelection);
210
+ } else if (unitFieldPaths.includes(outParameter)) {
211
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/unitData/".concat(outParameter), resetValues, keepExistingSelection);
212
+ }
213
+ });
214
+ },
215
+
216
+ /**
217
+ * Update suggests for a drop down of a field.
218
+ *
219
+ * @function
220
+ * @param fieldInfoModel Runtime model with parameters store information.
221
+ * @param fieldPathAbsolute Complete runtime property path.
222
+ * @param resetValues Should the values be reset to original state.
223
+ * @param keepExistingSelection Should the existing selection before update remain.
224
+ */
225
+ _updateFieldPathSuggestions: function (fieldInfoModel, fieldPathAbsolute, resetValues, keepExistingSelection) {
226
+ var options = fieldInfoModel.getProperty(fieldPathAbsolute);
227
+ var defaultOptions = options.defaultOptions;
228
+ var selectedKey = fieldInfoModel.getProperty("".concat(fieldPathAbsolute, "/selectedKey"));
229
+ var existingSelection = keepExistingSelection && options.find(function (option) {
230
+ return option.key === selectedKey;
231
+ });
232
+
233
+ if (resetValues) {
234
+ var selectOptions = options.selectOptions;
235
+ options.length = 0;
236
+ defaultOptions.forEach(function (defaultOption) {
237
+ return options.push(defaultOption);
238
+ });
239
+ selectOptions.forEach(function (selectOption) {
240
+ return options.push(selectOption);
241
+ });
242
+ } else {
243
+ options.length = 0;
244
+ defaultOptions.forEach(function (defaultOption) {
245
+ return options.push(defaultOption);
246
+ });
247
+ }
248
+
249
+ fieldInfoModel.setProperty(fieldPathAbsolute, options);
250
+
251
+ if (existingSelection && !options.includes(existingSelection)) {
252
+ options.push(existingSelection);
253
+ fieldInfoModel.setProperty("".concat(fieldPathAbsolute, "/selectedKey"), selectedKey);
254
+ }
255
+ },
256
+
257
+ /**
258
+ * Update In and Out Parameters in the MED.
259
+ *
260
+ * @function
261
+ * @param transCtx The transient context of the MED.
262
+ * @param source MDC field.
263
+ * @param fieldInfoModel Runtime model with parameters store information.
264
+ * @param propertyName Property path.
265
+ */
266
+ _setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
267
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
268
+
269
+ if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
270
+ return;
271
+ }
272
+
273
+ var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source);
274
+
275
+ if (fieldValueHelp && fieldValueHelp.getDialogContent().getTable()) {
276
+ var inParameters = (fieldValueHelp.getInParameters() || []).map(function (inParam) {
277
+ return inParam.getFieldPath();
278
+ });
279
+ var outParameters = (fieldValueHelp.getInParameters() || []).map(function (outParam) {
280
+ return outParam.getFieldPath();
281
+ });
282
+ var info = {
283
+ inParameters: inParameters.map(function (inParam) {
284
+ return inParam.getFieldPath();
285
+ }),
286
+ outParameters: outParameters.map(function (outParam) {
287
+ return outParam.getFieldPath();
288
+ })
289
+ };
290
+ fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
291
+
292
+ if (info.outParameters.length > 0) {
293
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
294
+ }
295
+ } else {
296
+ MassEditHandlers._requestValueList(transCtx, source, fieldInfoModel, propertyName);
297
+ }
298
+ },
299
+
300
+ /**
301
+ * Request and update In and Out Parameters in the MED.
302
+ *
303
+ * @function
304
+ * @param transCtx The transient context of the MED.
305
+ * @param source MDC field.
306
+ * @param fieldInfoModel Runtime model with parameters store information.
307
+ * @param propertyName Property path.
308
+ */
309
+ _requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
310
+ var metaPath = ModelHelper.getMetaPathForContext(transCtx);
311
+ var propertyPath = metaPath && "".concat(metaPath, "/").concat(propertyName);
312
+ var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
313
+ var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
314
+ var fieldValueHelp = dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
315
+ return dependent.getId() === fieldHelp;
316
+ });
317
+
318
+ if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
319
+ fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
320
+ }
321
+
322
+ var metaModel = transCtx.getModel().getMetaModel();
323
+ ValueListHelper.createVHUIModel(propertyPath, fieldValueHelp);
324
+ var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, metaModel, propertyPath);
325
+ valueListInfo.then(function (vLinfo) {
326
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
327
+ var info = {
328
+ inParameters: vLinfo.inParameters.map(function (inParam) {
329
+ return inParam.getFieldPath();
330
+ }),
331
+ outParameters: vLinfo.outParameters.map(function (outParam) {
332
+ return outParam.getFieldPath();
333
+ })
334
+ };
335
+ fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
336
+
337
+ if (info.outParameters.length > 0) {
338
+ MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
339
+ }
340
+ }).catch(function () {
341
+ Log.warning("Mass Edit: Couldn't load valueList info for ".concat(propertyPath));
342
+ });
343
+ },
344
+
345
+ /**
346
+ * Get field help control from MDC field.
347
+ *
348
+ * @function
349
+ * @param transCtx The transient context of the MED.
350
+ * @param source MDC field.
351
+ * @returns Field Help control.
352
+ */
353
+ _getValueHelp: function (transCtx, source) {
354
+ var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
355
+ var fieldHelp = source === null || source === void 0 ? void 0 : source.getFieldHelp();
356
+ return dependents === null || dependents === void 0 ? void 0 : dependents.find(function (dependent) {
357
+ return dependent.getId() === fieldHelp;
358
+ });
359
+ },
360
+
361
+ /**
362
+ * Colled on drop down selection of VHD option.
363
+ *
364
+ * @function
365
+ * @param source Custom Mass Edit Select control.
366
+ * @param propertyName Property path.
367
+ * @param selectKey Previous key before the VHD was selected.
368
+ */
369
+ _onVHSelect: function (source, propertyName, selectKey) {
370
+ // Called for
371
+ // 1. VHD selected.
372
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
373
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
374
+ var transCtx = source.getBindingContext();
375
+
376
+ var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
377
+
378
+ if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
379
+ fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
380
+ }
381
+
382
+ source.fireValueHelpRequest();
383
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), selectKey);
384
+ },
385
+
386
+ /**
387
+ * Gets Property name from selection key.
388
+ *
389
+ * @function
390
+ * @param key Selection key.
391
+ * @returns Property name.
392
+ */
393
+ _getPropertyNameFromKey: function (key) {
394
+ var propertyName = "";
395
+
396
+ if (key.startsWith("Default/") || key.startsWith("ClearFieldValue/") || key.startsWith("UseValueHelpValue/")) {
397
+ propertyName = key.substring(key.indexOf("/") + 1);
398
+ } else {
399
+ propertyName = key.substring(0, key.lastIndexOf("/"));
400
+ }
401
+
402
+ return propertyName;
403
+ },
404
+
405
+ /**
406
+ * Update selection to Custom Mass Edit Select from MDC field.
407
+ *
408
+ * @function
409
+ * @param source MDC field.
410
+ * @param propertyName Property path.
411
+ * @param value Value to update.
412
+ * @param fullText Full text to use.
413
+ */
414
+ _updateSelectKey: function (source, propertyName, value, fullText) {
415
+ // Called for
416
+ // 1. VHD property change
417
+ // 2. Out Parameters.
418
+ // 3. Transient context property change.
419
+ var comboBox = source.getContent();
420
+
421
+ if (!comboBox || !propertyName) {
422
+ return;
423
+ }
424
+
425
+ var key = comboBox.getSelectedKey();
426
+
427
+ if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
428
+ return;
429
+ }
430
+
431
+ var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
432
+ var fieldInfoModel = source && source.getModel("fieldsInfo");
433
+ var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
434
+ var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
435
+ var relatedField = values.find(function (fieldData) {
436
+ var _fieldData$textInfo;
437
+
438
+ return (fieldData === null || fieldData === void 0 ? void 0 : (_fieldData$textInfo = fieldData.textInfo) === null || _fieldData$textInfo === void 0 ? void 0 : _fieldData$textInfo.value) === value || fieldData.text === value;
439
+ });
440
+
441
+ if (relatedField) {
442
+ if (fullText && relatedField.textInfo && relatedField.textInfo.descriptionPath && (relatedField.text != formattedText || relatedField.textInfo.fullText != formattedText)) {
443
+ // Update the full text only when provided.
444
+ relatedField.text = formattedText;
445
+ relatedField.textInfo.fullText = formattedText;
446
+ relatedField.textInfo.description = source.getAdditionalValue();
447
+ }
448
+
449
+ if (relatedField.key === key) {
450
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
451
+ return;
452
+ }
453
+
454
+ key = relatedField.key;
455
+ } else if ([undefined, null, ""].indexOf(value) === -1) {
456
+ key = "".concat(propertyName, "/").concat(value);
457
+ var selectionInfo = {
458
+ text: formattedText,
459
+ key: key,
460
+ textInfo: {
461
+ description: source.getAdditionalValue(),
462
+ descriptionPath: values && values.textInfo && values.textInfo.descriptionPath,
463
+ fullText: formattedText,
464
+ textArrangement: source.getDisplay(),
465
+ value: source.getValue(),
466
+ valuePath: propertyName
467
+ }
468
+ };
469
+ values.push(selectionInfo);
470
+ values.selectOptions = values.selectOptions || [];
471
+ values.selectOptions.push(selectionInfo);
472
+ fieldInfoModel.setProperty(propPath + propertyName, values);
473
+ } else {
474
+ key = "Default/".concat(propertyName);
475
+ }
476
+
477
+ fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
478
+
479
+ MassEditHandlers._updateResults(comboBox);
480
+ },
481
+
482
+ /**
483
+ * Get Value from Drop down.
484
+ *
485
+ * @function
486
+ * @param source Drop down control.
487
+ * @returns Value of selection.
488
+ */
489
+ _getValue: function (source) {
490
+ var _getSelectedItem;
491
+
492
+ return source.getMetadata().getName() === "sap.fe.core.controls.MassEditSelect" ? (_getSelectedItem = source.getSelectedItem()) === null || _getSelectedItem === void 0 ? void 0 : _getSelectedItem.getText() : source.getValue();
493
+ },
494
+ _getValueOnEmpty: function (oSource, fieldsInfoModel, value, sPropertyName) {
495
+ if (!value) {
496
+ var values = fieldsInfoModel.getProperty("/values/".concat(sPropertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(sPropertyName)) || [];
497
+
498
+ if (values.unitProperty) {
499
+ value = 0;
500
+ oSource.setValue(value);
501
+ } else if (values.inputType === "CheckBox") {
502
+ value = false;
503
+ }
504
+ }
505
+
506
+ return value;
507
+ },
508
+ _valueExists: function (value) {
509
+ return value != undefined && value != null;
510
+ },
511
+
512
+ /**
513
+ * Updates selections to runtime model.
514
+ *
515
+ * @function
516
+ * @param oSource Drop down control.
517
+ * @param aParams Parts of key in runtime model.
518
+ * @param updateTransCtx Should transient context be updated with the value.
519
+ */
520
+ _updateResults: function (oSource) {
521
+ var aParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
522
+ var updateTransCtx = arguments.length > 2 ? arguments[2] : undefined;
523
+ // Called for
524
+ // 1. VHD property change.
525
+ // 2. Out parameter.
526
+ // 3. transient context property change.
527
+ var fieldsInfoModel = oSource && oSource.getModel("fieldsInfo");
528
+ var oFieldsInfoData = fieldsInfoModel && fieldsInfoModel.getData();
529
+
530
+ var value = MassEditHandlers._getValue(oSource);
531
+
532
+ aParams = aParams.length > 0 ? aParams : oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
533
+ var oDataObject;
534
+ var sPropertyName = oSource.getId().substring(oSource.getId().lastIndexOf(":") + 1);
28
535
 
29
536
  if (aParams[0] === "Default") {
30
537
  oDataObject = {
@@ -32,31 +539,29 @@ sap.ui.define([], function () {
32
539
  value: aParams[0]
33
540
  };
34
541
  } else if (aParams[0] === "ClearFieldValue") {
542
+ value = "";
543
+ value = MassEditHandlers._getValueOnEmpty(oSource, fieldsInfoModel, value, sPropertyName);
35
544
  oDataObject = {
36
545
  keyValue: aParams[1],
37
- value: ""
546
+ value: value
38
547
  };
39
548
  } else if (!aParams) {
40
- var sPropertyName = oSource.getId().substring(oSource.getId().lastIndexOf(":") + 1);
549
+ value = MassEditHandlers._getValueOnEmpty(oSource, fieldsInfoModel, value, sPropertyName);
41
550
  oDataObject = {
42
551
  keyValue: sPropertyName,
43
- value: oSource.getValue()
552
+ value: value
44
553
  };
45
554
  } else {
46
- var aRelatedField = aParams[0] && (oFieldsInfoData.values && oFieldsInfoData.values[aParams[0]] && oFieldsInfoData.values[aParams[0]].filter(function (oFieldData) {
47
- return oFieldData.text === oSource.getValue();
48
- }) || oFieldsInfoData.unitData && oFieldsInfoData.unitData[aParams[0]] && oFieldsInfoData.unitData[aParams[0]].filter(function (oFieldData) {
49
- return oFieldData.text === oSource.getValue();
50
- }));
51
- var iValueIndex = (oFieldsInfoData.values[aParams[0]] || oFieldsInfoData.unitData[aParams[0]]).findIndex(function (data) {
52
- return typeof data.text === "boolean" && data.text === Boolean(oSource.getValue());
555
+ var propertyName = aParams.slice(0, -1).join("/");
556
+ var propertyValues = fieldsInfoModel.getProperty("/values/".concat(propertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
557
+ var relatedField = (propertyValues || []).find(function (oFieldData) {
558
+ var _oFieldData$textInfo;
559
+
560
+ return (oFieldData === null || oFieldData === void 0 ? void 0 : (_oFieldData$textInfo = oFieldData.textInfo) === null || _oFieldData$textInfo === void 0 ? void 0 : _oFieldData$textInfo.value) === value || oFieldData.text === value;
53
561
  });
54
- oDataObject = aRelatedField && aRelatedField[0] && aRelatedField[0].textInfo ? {
55
- keyValue: aParams[0],
56
- value: aRelatedField[0].textInfo.value
57
- } : {
58
- keyValue: aParams[0],
59
- value: iValueIndex !== -1 ? oFieldsInfoData.values[aParams[0]][iValueIndex].text : oSource.getValue()
562
+ oDataObject = {
563
+ keyValue: propertyName,
564
+ value: relatedField.textInfo && MassEditHandlers._valueExists(relatedField.textInfo.value) ? relatedField.textInfo.value : relatedField.text
60
565
  };
61
566
  }
62
567
 
@@ -73,8 +578,18 @@ sap.ui.define([], function () {
73
578
  } else {
74
579
  oFieldsInfoData.results.push(oDataObject);
75
580
  }
581
+
582
+ if (updateTransCtx && !oDataObject.keyValue.includes("/")) {
583
+ var transCtx = oSource.getBindingContext();
584
+
585
+ if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
586
+ transCtx.setProperty(oDataObject.keyValue, null);
587
+ } else if (oDataObject) {
588
+ transCtx.setProperty(oDataObject.keyValue, oDataObject.value);
589
+ }
590
+ }
76
591
  }
77
592
  };
78
593
  return MassEditHandlers;
79
594
  }, false);
80
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImhhbmRsZU1hc3NFZGl0Q2hhbmdlIiwib0V2ZW50Iiwib1NvdXJjZSIsImdldFNvdXJjZSIsImFQYXJhbXMiLCJnZXRTZWxlY3RlZEtleSIsInNwbGl0Iiwib0ZpZWxkc0luZm9EYXRhIiwiZ2V0TW9kZWwiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJrZXlWYWx1ZSIsInZhbHVlIiwic1Byb3BlcnR5TmFtZSIsImdldElkIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJnZXRWYWx1ZSIsImFSZWxhdGVkRmllbGQiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJvRmllbGREYXRhIiwidGV4dCIsInVuaXREYXRhIiwiaVZhbHVlSW5kZXgiLCJmaW5kSW5kZXgiLCJkYXRhIiwiQm9vbGVhbiIsInRleHRJbmZvIiwiYkV4aXN0aW5nRWxlbWVudGluZGV4IiwiaSIsInJlc3VsdHMiLCJsZW5ndGgiLCJwdXNoIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxnQkFBZ0IsR0FBRztBQUN4QkMsSUFBQUEsb0JBQW9CLEVBQUUsVUFBVUMsTUFBVixFQUF1QjtBQUM1QyxVQUFNQyxPQUFPLEdBQUdELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxTQUFQLEVBQTFCO0FBQ0EsVUFBTUMsT0FBTyxHQUFHRixPQUFPLElBQUlBLE9BQU8sQ0FBQ0csY0FBUixFQUFYLElBQXVDSCxPQUFPLENBQUNHLGNBQVIsR0FBeUJDLEtBQXpCLENBQStCLEdBQS9CLENBQXZEO0FBQ0EsVUFBTUMsZUFBZSxHQUFHTCxPQUFPLElBQUlBLE9BQU8sQ0FBQ00sUUFBUixDQUFpQixZQUFqQixFQUErQkMsT0FBL0IsRUFBbkM7QUFDQSxVQUFJQyxXQUFKLENBSjRDLENBSzVDOztBQUNBO0FBQ0Y7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QTlCLEVBQW1Db0IsV0FBbkMsRUFBZ0RGLElBQXJFLEdBQTRFcEIsT0FBTyxDQUFDZSxRQUFSO0FBRm5GLFNBSEo7QUFPQTs7QUFDRCxVQUFJWSxxQkFBcUIsR0FBRyxDQUFDLENBQTdCOztBQUNBLFdBQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3ZCLGVBQWUsQ0FBQ3dCLE9BQWhCLENBQXdCQyxNQUE1QyxFQUFvREYsQ0FBQyxFQUFyRCxFQUF5RDtBQUN4RCxZQUFJdkIsZUFBZSxDQUFDd0IsT0FBaEIsQ0FBd0JELENBQXhCLEVBQTJCbkIsUUFBM0IsS0FBd0NELFdBQVcsQ0FBQ0MsUUFBeEQsRUFBa0U7QUFDakVrQixVQUFBQSxxQkFBcUIsR0FBR0MsQ0FBeEI7QUFDQTtBQUNEOztBQUNELFVBQUlELHFCQUFxQixLQUFLLENBQUMsQ0FBL0IsRUFBa0M7QUFDakN0QixRQUFBQSxlQUFlLENBQUN3QixPQUFoQixDQUF3QkYscUJBQXhCLElBQWlEbkIsV0FBakQ7QUFDQSxPQUZELE1BRU87QUFDTkgsUUFBQUEsZUFBZSxDQUFDd0IsT0FBaEIsQ0FBd0JFLElBQXhCLENBQTZCdkIsV0FBN0I7QUFDQTtBQUNEO0FBekR1QixHQUF6QjtTQTREZVgsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uc3RydWN0b3IgZm9yIGEgbmV3IFZpc3VhbCBGaWx0ZXIgQ29udGFpbmVyLlxuICogVXNlZCBmb3IgdmlzdWFsIGZpbHRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NJZF0gSUQgZm9yIHRoZSBuZXcgY29udHJvbCwgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbm8gSUQgaXMgZ2l2ZW5cbiAqIEBleHRlbmRzIHNhcC51aS5tZGMuZmlsdGVyYmFyLklGaWx0ZXJDb250YWluZXJcbiAqIEBjbGFzc1xuICogQHByaXZhdGVcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXG4gKi9cbmNvbnN0IE1hc3NFZGl0SGFuZGxlcnMgPSB7XG5cdGhhbmRsZU1hc3NFZGl0Q2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvU291cmNlID0gb0V2ZW50ICYmIG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBhUGFyYW1zID0gb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBvU291cmNlICYmIG9Tb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpLmdldERhdGEoKTtcblx0XHRsZXQgb0RhdGFPYmplY3Q7XG5cdFx0Ly9UT0RPIC0gVmFsdWUgSGVscCBIYW5kbGluZyBMb2FkIFZhbHVlIEhlbHAgd2hlbiByZXNwZWN0aXZlIHZhbHVlIGlzIHNlbGVjdGVkIGluIGNvbWJvIEJveCBpbiBkaWFsb2dcblx0XHQvKlxuXHRcdFx0XHRpZiAoYVBhcmFtc1swXSA9PT0gXCJWYWx1ZUhlbHBcIikge1xuXHRcdFx0XHR9ICovXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHsga2V5VmFsdWU6IGFQYXJhbXNbMV0sIHZhbHVlOiBhUGFyYW1zWzBdIH07XG5cdFx0fSBlbHNlIGlmIChhUGFyYW1zWzBdID09PSBcIkNsZWFyRmllbGRWYWx1ZVwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHsga2V5VmFsdWU6IGFQYXJhbXNbMV0sIHZhbHVlOiBcIlwiIH07XG5cdFx0fSBlbHNlIGlmICghYVBhcmFtcykge1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IG9Tb3VyY2UuZ2V0SWQoKS5zdWJzdHJpbmcob1NvdXJjZS5nZXRJZCgpLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpO1xuXHRcdFx0b0RhdGFPYmplY3QgPSB7XG5cdFx0XHRcdGtleVZhbHVlOiBzUHJvcGVydHlOYW1lLFxuXHRcdFx0XHR2YWx1ZTogb1NvdXJjZS5nZXRWYWx1ZSgpXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBhUmVsYXRlZEZpZWxkID1cblx0XHRcdFx0YVBhcmFtc1swXSAmJlxuXHRcdFx0XHQoKG9GaWVsZHNJbmZvRGF0YS52YWx1ZXMgJiZcblx0XHRcdFx0XHRvRmllbGRzSW5mb0RhdGEudmFsdWVzW2FQYXJhbXNbMF1dICYmXG5cdFx0XHRcdFx0b0ZpZWxkc0luZm9EYXRhLnZhbHVlc1thUGFyYW1zWzBdXS5maWx0ZXIoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZERhdGEudGV4dCA9PT0gb1NvdXJjZS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdH0pKSB8fFxuXHRcdFx0XHRcdChvRmllbGRzSW5mb0RhdGEudW5pdERhdGEgJiZcblx0XHRcdFx0XHRcdG9GaWVsZHNJbmZvRGF0YS51bml0RGF0YVthUGFyYW1zWzBdXSAmJlxuXHRcdFx0XHRcdFx0b0ZpZWxkc0luZm9EYXRhLnVuaXREYXRhW2FQYXJhbXNbMF1dLmZpbHRlcihmdW5jdGlvbiAob0ZpZWxkRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGREYXRhLnRleHQgPT09IG9Tb3VyY2UuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdH0pKSk7XG5cdFx0XHRjb25zdCBpVmFsdWVJbmRleCA9IChvRmllbGRzSW5mb0RhdGEudmFsdWVzW2FQYXJhbXNbMF1dIHx8IG9GaWVsZHNJbmZvRGF0YS51bml0RGF0YVthUGFyYW1zWzBdXSkuZmluZEluZGV4KGZ1bmN0aW9uIChcblx0XHRcdFx0ZGF0YTogYW55XG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBkYXRhLnRleHQgPT09IFwiYm9vbGVhblwiICYmIGRhdGEudGV4dCA9PT0gQm9vbGVhbihvU291cmNlLmdldFZhbHVlKCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9XG5cdFx0XHRcdGFSZWxhdGVkRmllbGQgJiYgYVJlbGF0ZWRGaWVsZFswXSAmJiBhUmVsYXRlZEZpZWxkWzBdLnRleHRJbmZvXG5cdFx0XHRcdFx0PyB7IGtleVZhbHVlOiBhUGFyYW1zWzBdLCB2YWx1ZTogYVJlbGF0ZWRGaWVsZFswXS50ZXh0SW5mby52YWx1ZSB9XG5cdFx0XHRcdFx0OiB7XG5cdFx0XHRcdFx0XHRcdGtleVZhbHVlOiBhUGFyYW1zWzBdLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogaVZhbHVlSW5kZXggIT09IC0xID8gb0ZpZWxkc0luZm9EYXRhLnZhbHVlc1thUGFyYW1zWzBdXVtpVmFsdWVJbmRleF0udGV4dCA6IG9Tb3VyY2UuZ2V0VmFsdWUoKVxuXHRcdFx0XHRcdCAgfTtcblx0XHR9XG5cdFx0bGV0IGJFeGlzdGluZ0VsZW1lbnRpbmRleCA9IC0xO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb0ZpZWxkc0luZm9EYXRhLnJlc3VsdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChvRmllbGRzSW5mb0RhdGEucmVzdWx0c1tpXS5rZXlWYWx1ZSA9PT0gb0RhdGFPYmplY3Qua2V5VmFsdWUpIHtcblx0XHRcdFx0YkV4aXN0aW5nRWxlbWVudGluZGV4ID0gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGJFeGlzdGluZ0VsZW1lbnRpbmRleCAhPT0gLTEpIHtcblx0XHRcdG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2JFeGlzdGluZ0VsZW1lbnRpbmRleF0gPSBvRGF0YU9iamVjdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHMucHVzaChvRGF0YU9iamVjdCk7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXNzRWRpdEhhbmRsZXJzO1xuIl19
595
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hc3NFZGl0SGFuZGxlcnMudHMiXSwibmFtZXMiOlsiTWFzc0VkaXRIYW5kbGVycyIsImNvbnRleHRQcm9wZXJ0eUNoYW5nZSIsIm5ld1ZhbHVlIiwiZGF0YVByb3BlcnR5IiwibWRjRmllbGRJZCIsInNvdXJjZSIsIkNvcmUiLCJieUlkIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImZpZWxkSW5mb01vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZXMiLCJnZXRQcm9wZXJ0eSIsImlucHV0VHlwZSIsInZhbHVlTGlzdEluZm8iLCJfc2V0VmFsdWVMaXN0SW5mbyIsImlzRGlhbG9nT3BlbiIsImdldFZpc2libGUiLCJfdXBkYXRlU2VsZWN0S2V5IiwiaGFuZGxlTURDRmllbGRDaGFuZ2UiLCJldmVudCIsInByb3BlcnR5TmFtZSIsImdldFNvdXJjZSIsImNoYW5nZVByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJjb21ib0JveCIsImdldENvbnRlbnQiLCJ0aGVuIiwiX3VwZGF0ZVNlbGVjdEtleUZvck1EQ0ZpZWxkQ2hhbmdlIiwiYmluZCIsImNhdGNoIiwiZXJyIiwiTG9nIiwid2FybmluZyIsImhhbmRsZVNlbGVjdGlvbkNoYW5nZSIsImtleSIsImdldFNlbGVjdGVkS2V5IiwicGFyYW1zIiwic3BsaXQiLCJwcmV2SXRlbSIsInNlbGVjdEtleSIsImdldEtleSIsInNsaWNlIiwiam9pbiIsIl9vblZIU2VsZWN0IiwiX2dldFByb3BlcnR5TmFtZUZyb21LZXkiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhJblBhcmFtZXRlcnMiLCJzdGFydHNXaXRoIiwiX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVycyIsIl91cGRhdGVSZXN1bHRzIiwidmFsdWUiLCJmb3JtYXR0ZWRWYWx1ZSIsImdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSIsInJlc2V0VmFsdWVzIiwia2VlcEV4aXN0aW5nU2VsZWN0aW9uIiwidW5pdERhdGEiLCJmaWVsZFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsInVuaXRGaWVsZFBhdGhzIiwiZm9yRWFjaCIsIl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMiLCJwYXRoUHJlZml4Iiwic3JjUHJvcGVydHlOYW1lIiwiaW5QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJfdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMiLCJvdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZU91dFBhcmFtZXRlclN1Z2dldGlvbnMiLCJvdXRQYXJhbWV0ZXIiLCJmaWVsZFBhdGhBYnNvbHV0ZSIsIm9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdGVkS2V5IiwiZXhpc3RpbmdTZWxlY3Rpb24iLCJmaW5kIiwib3B0aW9uIiwic2VsZWN0T3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJwdXNoIiwic2VsZWN0T3B0aW9uIiwic2V0UHJvcGVydHkiLCJwcm9wUGF0aCIsImZpZWxkVmFsdWVIZWxwIiwiX2dldFZhbHVlSGVscCIsImdldERpYWxvZ0NvbnRlbnQiLCJnZXRUYWJsZSIsImdldEluUGFyYW1ldGVycyIsIm1hcCIsImluUGFyYW0iLCJnZXRGaWVsZFBhdGgiLCJvdXRQYXJhbSIsImluZm8iLCJfcmVxdWVzdFZhbHVlTGlzdCIsIm1ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJwcm9wZXJ0eVBhdGgiLCJkZXBlbmRlbnRzIiwiZ2V0RGVwZW5kZW50cyIsImZpZWxkSGVscCIsImdldEZpZWxkSGVscCIsImRlcGVuZGVudCIsImdldElkIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJrZXlWYWx1ZSIsInByb3BlcnR5VmFsdWVzIiwib0ZpZWxkRGF0YSIsImJFeGlzdGluZ0VsZW1lbnRpbmRleCIsImkiLCJyZXN1bHRzIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBcUJBLE1BQU1BLGdCQUFxQixHQUFHO0FBQzdCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEscUJBQXFCLEVBQUUsVUFBVUMsUUFBVixFQUF5QkMsWUFBekIsRUFBK0NDLFVBQS9DLEVBQW1FO0FBQ3pGO0FBQ0E7QUFDQTtBQUVBLFVBQU1DLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxJQUFMLENBQVVILFVBQVYsQ0FBZjtBQUNBLFVBQU1JLFFBQVEsR0FBR0gsTUFBTSxJQUFLQSxNQUFNLENBQUNJLGlCQUFQLEVBQTVCO0FBQ0EsVUFBTUMsY0FBYyxHQUFHTCxNQUFNLElBQUtBLE1BQU0sQ0FBQ00sUUFBUCxDQUFnQixZQUFoQixDQUFsQztBQUNBLFVBQU1DLE1BQU0sR0FDWEYsY0FB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QUFDRCxVQUFJRCxxQkFBcUIsS0FBSyxDQUFDLENBQS9CLEVBQWtDO0FBQ2pDTixRQUFBQSxlQUFlLENBQUNRLE9BQWhCLENBQXdCRixxQkFBeEIsSUFBaURKLFdBQWpEO0FBQ0EsT0FGRCxNQUVPO0FBQ05GLFFBQUFBLGVBQWUsQ0FBQ1EsT0FBaEIsQ0FBd0IxRSxJQUF4QixDQUE2Qm9FLFdBQTdCO0FBQ0E7O0FBQ0QsVUFBSUgsY0FBYyxJQUFJLENBQUNHLFdBQVcsQ0FBQ0MsUUFBWixDQUFxQm5GLFFBQXJCLENBQThCLEdBQTlCLENBQXZCLEVBQTJEO0FBQzFELFlBQU0zRCxRQUFRLEdBQUdvSSxPQUFPLENBQUNuSSxpQkFBUixFQUFqQjs7QUFDQSxZQUFJd0ksT0FBTyxDQUFDLENBQUQsQ0FBUCxLQUFlLFNBQWYsSUFBNEJBLE9BQU8sQ0FBQyxDQUFELENBQVAsS0FBZSxpQkFBL0MsRUFBa0U7QUFDakV6SSxVQUFBQSxRQUFRLENBQUMyRSxXQUFULENBQXFCa0UsV0FBVyxDQUFDQyxRQUFqQyxFQUEyQyxJQUEzQztBQUNBLFNBRkQsTUFFTyxJQUFJRCxXQUFKLEVBQWlCO0FBQ3ZCN0ksVUFBQUEsUUFBUSxDQUFDMkUsV0FBVCxDQUFxQmtFLFdBQVcsQ0FBQ0MsUUFBakMsRUFBMkNELFdBQVcsQ0FBQ2xHLEtBQXZEO0FBQ0E7QUFDRDtBQUNEO0FBcm1CNEIsR0FBOUI7U0F3bUJlbkQsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uc3RydWN0b3IgZm9yIGEgbmV3IFZpc3VhbCBGaWx0ZXIgQ29udGFpbmVyLlxuICogVXNlZCBmb3IgdmlzdWFsIGZpbHRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NJZF0gSUQgZm9yIHRoZSBuZXcgY29udHJvbCwgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbm8gSUQgaXMgZ2l2ZW5cbiAqIEBleHRlbmRzIHNhcC51aS5tZGMuZmlsdGVyYmFyLklGaWx0ZXJDb250YWluZXJcbiAqIEBjbGFzc1xuICogQHByaXZhdGVcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9scy5maWx0ZXJiYXIuVmlzdWFsRmlsdGVyQ29udGFpbmVyXG4gKi9cbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgVmFsdWVMaXN0SGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbWJvQm94IGZyb20gXCJzYXAvbS9Db21ib0JveFwiO1xuaW1wb3J0IHR5cGUgU2VsZWN0IGZyb20gXCJzYXAvbS9TZWxlY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgSW5QYXJhbWV0ZXIgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvSW5QYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIE91dFBhcmFtZXRlciBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9PdXRQYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlSGVscCh0cmFuc0N0eCwgc291cmNlKTtcblx0XHRpZiAoZmllbGRWYWx1ZUhlbHAgJiYgZmllbGRWYWx1ZUhlbHAuZ2V0RGlhbG9nQ29udGVudCgpLmdldFRhYmxlKCkpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IChmaWVsZFZhbHVlSGVscC5nZXRJblBhcmFtZXRlcnMoKSB8fCBbXSkubWFwKChpblBhcmFtOiBJblBhcmFtZXRlcikgPT4gaW5QYXJhbS5nZXRGaWVsZFBhdGgoKSk7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gKGZpZWxkVmFsdWVIZWxwLmdldEluUGFyYW1ldGVycygpIHx8IFtdKS5tYXAoKG91dFBhcmFtOiBPdXRQYXJhbWV0ZXIpID0+IG91dFBhcmFtLmdldEZpZWxkUGF0aCgpKTtcblx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJzOiBpblBhcmFtZXRlcnMubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uZ2V0RmllbGRQYXRoKCkpLFxuXHRcdFx0XHRvdXRQYXJhbWV0ZXJzOiBvdXRQYXJhbWV0ZXJzLm1hcCgob3V0UGFyYW06IGFueSkgPT4gb3V0UGFyYW0uZ2V0RmllbGRQYXRoKCkpXG5cdFx0XHR9O1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gLCBpbmZvKTtcblx0XHRcdGlmIChpbmZvLm91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl9yZXF1ZXN0VmFsdWVMaXN0KHRyYW5zQ3R4LCBzb3VyY2UsIGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUmVxdWVzdCBhbmQgdXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfcmVxdWVzdFZhbHVlTGlzdDogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWV0YVBhdGhGb3JDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSAobWV0YVBhdGggJiYgYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlOYW1lfWApIGFzIHN0cmluZztcblx0XHRjb25zdCBkZXBlbmRlbnRzID0gc291cmNlPy5nZXREZXBlbmRlbnRzKCk7XG5cdFx0Y29uc3QgZmllbGRIZWxwID0gc291cmNlPy5nZXRGaWVsZEhlbHAoKTtcblx0XHRjb25zdCBmaWVsZFZhbHVlSGVscCA9IGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0XHRpZiAoIWZpZWxkVmFsdWVIZWxwPy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRmaWVsZFZhbHVlSGVscD8uc2V0QmluZGluZ0NvbnRleHQodHJhbnNDdHgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSB0cmFuc0N0eC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFZhbHVlTGlzdEhlbHBlci5jcmVhdGVWSFVJTW9kZWwocHJvcGVydHlQYXRoLCBmaWVsZFZhbHVlSGVscCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBtZXRhTW9kZWwsIHByb3BlcnR5UGF0aCkgYXMgUHJvbWlzZTxhbnk+O1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblx0XHRcdFx0Y29uc3QgaW5mbzogYW55ID0ge1xuXHRcdFx0XHRcdGluUGFyYW1ldGVyczogdkxpbmZvLmluUGFyYW1ldGVycy5tYXAoKGluUGFyYW06IGFueSkgPT4gaW5QYXJhbS5nZXRGaWVsZFBhdGgoKSksXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyczogdkxpbmZvLm91dFBhcmFtZXRlcnMubWFwKChvdXRQYXJhbTogYW55KSA9PiBvdXRQYXJhbS5nZXRGaWVsZFBhdGgoKSlcblx0XHRcdFx0fTtcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gLCBpbmZvKTtcblx0XHRcdFx0aWYgKGluZm8ub3V0UGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlRmllbGRQYXRoU3VnZ2VzdGlvbnMoZmllbGRJbmZvTW9kZWwsIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWAsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBNYXNzIEVkaXQ6IENvdWxkbid0IGxvYWQgdmFsdWVMaXN0IGluZm8gZm9yICR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBmaWVsZCBoZWxwIGNvbnRyb2wgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gdHJhbnNDdHggVGhlIHRyYW5zaWVudCBjb250ZXh0IG9mIHRoZSBNRUQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcmV0dXJucyBGaWVsZCBIZWxwIGNvbnRyb2wuXG5cdCAqL1xuXHRfZ2V0VmFsdWVIZWxwOiBmdW5jdGlvbiAodHJhbnNDdHg6IENvbnRleHQsIHNvdXJjZTogRmllbGQpOiBhbnkge1xuXHRcdGNvbnN0IGRlcGVuZGVudHMgPSBzb3VyY2U/LmdldERlcGVuZGVudHMoKTtcblx0XHRjb25zdCBmaWVsZEhlbHAgPSBzb3VyY2U/LmdldEZpZWxkSGVscCgpO1xuXHRcdHJldHVybiBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbGxlZCBvbiBkcm9wIGRvd24gc2VsZWN0aW9uIG9mIFZIRCBvcHRpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIEN1c3RvbSBNYXNzIEVkaXQgU2VsZWN0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHNlbGVjdEtleSBQcmV2aW91cyBrZXkgYmVmb3JlIHRoZSBWSEQgd2FzIHNlbGVjdGVkLlxuXHQgKi9cblx0X29uVkhTZWxlY3Q6IGZ1bmN0aW9uIChzb3VyY2U6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHNlbGVjdEtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBzZWxlY3RlZC5cblxuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIHNvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblx0XHRjb25zdCB0cmFuc0N0eCA9IHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkVmFsdWVIZWxwID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWVIZWxwKHRyYW5zQ3R4LCBzb3VyY2UuZ2V0UGFyZW50KCkpO1xuXHRcdGlmICghZmllbGRWYWx1ZUhlbHA/LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdGZpZWxkVmFsdWVIZWxwPy5zZXRCaW5kaW5nQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0fVxuXHRcdHNvdXJjZS5maXJlVmFsdWVIZWxwUmVxdWVzdCgpO1xuXG5cdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7cHJvcFBhdGggKyBwcm9wZXJ0eU5hbWV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0S2V5KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyBQcm9wZXJ0eSBuYW1lIGZyb20gc2VsZWN0aW9uIGtleS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBrZXkgU2VsZWN0aW9uIGtleS5cblx0ICogQHJldHVybnMgUHJvcGVydHkgbmFtZS5cblx0ICovXG5cdF9nZXRQcm9wZXJ0eU5hbWVGcm9tS2V5OiBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRsZXQgcHJvcGVydHlOYW1lID0gXCJcIjtcblx0XHRpZiAoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJVc2VWYWx1ZUhlbHBWYWx1ZS9cIikpIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BlcnR5TmFtZSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzZWxlY3Rpb24gdG8gQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgZnJvbSBNREMgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gZnVsbFRleHQgRnVsbCB0ZXh0IHRvIHVzZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXk6IGZ1bmN0aW9uIChzb3VyY2U6IEZpZWxkLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZnVsbFRleHQ/OiBhbnkpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHByb3BlcnR5IGNoYW5nZVxuXHRcdC8vIDIuIE91dCBQYXJhbWV0ZXJzLlxuXHRcdC8vIDMuIFRyYW5zaWVudCBjb250ZXh0IHByb3BlcnR5IGNoYW5nZS5cblxuXHRcdGNvbnN0IGNvbWJvQm94ID0gc291cmNlLmdldENvbnRlbnQoKSBhcyBDb21ib0JveDtcblx0XHRpZiAoIWNvbWJvQm94IHx8ICFwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGtleTogc3RyaW5nID0gY29tYm9Cb3guZ2V0U2VsZWN0ZWRLZXkoKTtcblx0XHRpZiAoKGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpKSAmJiAhdmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0ID0gTWFzc0VkaXRIYW5kbGVycy5fdmFsdWVFeGlzdHMoZnVsbFRleHQpID8gZnVsbFRleHQgOiB2YWx1ZTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRjb25zdCByZWxhdGVkRmllbGQgPSB2YWx1ZXMuZmluZCgoZmllbGREYXRhOiBhbnkpID0+IGZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBmaWVsZERhdGEudGV4dCA9PT0gdmFsdWUpO1xuXG5cdFx0aWYgKHJlbGF0ZWRGaWVsZCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRmdWxsVGV4dCAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8gJiZcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uUGF0aCAmJlxuXHRcdFx0XHQocmVsYXRlZEZpZWxkLnRleHQgIT0gZm9ybWF0dGVkVGV4dCB8fCByZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgIT0gZm9ybWF0dGVkVGV4dClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBVcGRhdGUgdGhlIGZ1bGwgdGV4dCBvbmx5IHdoZW4gcHJvdmlkZWQuXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmZ1bGxUZXh0ID0gZm9ybWF0dGVkVGV4dDtcblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvLmRlc2NyaXB0aW9uID0gc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRGaWVsZC5rZXkgPT09IGtleSkge1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBrZXkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRrZXkgPSByZWxhdGVkRmllbGQua2V5O1xuXHRcdH0gZWxzZSBpZiAoW3VuZGVmaW5lZCwgbnVsbCwgXCJcIl0uaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG5cdFx0XHRrZXkgPSBgJHtwcm9wZXJ0eU5hbWV9LyR7dmFsdWV9YDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkluZm8gPSB7XG5cdFx0XHRcdHRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dGV4dEluZm86IHtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc291cmNlLmdldEFkZGl0aW9uYWxWYWx1ZSgpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogdmFsdWVzICYmIHZhbHVlcy50ZXh0SW5mbyAmJiB2YWx1ZXMudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdGZ1bGxUZXh0OiBmb3JtYXR0ZWRUZXh0LFxuXHRcdFx0XHRcdHRleHRBcnJhbmdlbWVudDogc291cmNlLmdldERpc3BsYXkoKSxcblx0XHRcdFx0XHR2YWx1ZTogc291cmNlLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBwcm9wZXJ0eU5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHZhbHVlcy5wdXNoKHNlbGVjdGlvbkluZm8pO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMgPSB2YWx1ZXMuc2VsZWN0T3B0aW9ucyB8fCBbXTtcblx0XHRcdHZhbHVlcy5zZWxlY3RPcHRpb25zLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShwcm9wUGF0aCArIHByb3BlcnR5TmFtZSwgdmFsdWVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0a2V5ID0gYERlZmF1bHQvJHtwcm9wZXJ0eU5hbWV9YDtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBrZXkpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoY29tYm9Cb3gpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgVmFsdWUgZnJvbSBEcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc291cmNlIERyb3AgZG93biBjb250cm9sLlxuXHQgKiBAcmV0dXJucyBWYWx1ZSBvZiBzZWxlY3Rpb24uXG5cdCAqL1xuXHRfZ2V0VmFsdWU6IGZ1bmN0aW9uIChzb3VyY2U6IENvbnRyb2wpIHtcblx0XHRyZXR1cm4gc291cmNlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5mZS5jb3JlLmNvbnRyb2xzLk1hc3NFZGl0U2VsZWN0XCJcblx0XHRcdD8gKHNvdXJjZSBhcyBTZWxlY3QpLmdldFNlbGVjdGVkSXRlbSgpPy5nZXRUZXh0KClcblx0XHRcdDogKHNvdXJjZSBhcyBDb21ib0JveCkuZ2V0VmFsdWUoKTtcblx0fSxcblxuXHRfZ2V0VmFsdWVPbkVtcHR5OiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBmaWVsZHNJbmZvTW9kZWw6IEpTT05Nb2RlbCwgdmFsdWU6IGFueSwgc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCF2YWx1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3NQcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0XHRpZiAodmFsdWVzLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHR2YWx1ZSA9IDA7XG5cdFx0XHRcdG9Tb3VyY2Uuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIkNoZWNrQm94XCIpIHtcblx0XHRcdFx0dmFsdWUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXG5cdF92YWx1ZUV4aXN0czogZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGw7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgc2VsZWN0aW9ucyB0byBydW50aW1lIG1vZGVsLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIG9Tb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBhUGFyYW1zIFBhcnRzIG9mIGtleSBpbiBydW50aW1lIG1vZGVsLlxuXHQgKiBAcGFyYW0gdXBkYXRlVHJhbnNDdHggU2hvdWxkIHRyYW5zaWVudCBjb250ZXh0IGJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWUuXG5cdCAqL1xuXHRfdXBkYXRlUmVzdWx0czogZnVuY3Rpb24gKG9Tb3VyY2U6IGFueSwgYVBhcmFtczogQXJyYXk8c3RyaW5nPiA9IFtdLCB1cGRhdGVUcmFuc0N0eDogYm9vbGVhbikge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlLlxuXHRcdC8vIDIuIE91dCBwYXJhbWV0ZXIuXG5cdFx0Ly8gMy4gdHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXHRcdGNvbnN0IGZpZWxkc0luZm9Nb2RlbCA9IG9Tb3VyY2UgJiYgb1NvdXJjZS5nZXRNb2RlbChcImZpZWxkc0luZm9cIik7XG5cdFx0Y29uc3Qgb0ZpZWxkc0luZm9EYXRhID0gZmllbGRzSW5mb01vZGVsICYmIGZpZWxkc0luZm9Nb2RlbC5nZXREYXRhKCk7XG5cdFx0bGV0IHZhbHVlID0gTWFzc0VkaXRIYW5kbGVycy5fZ2V0VmFsdWUob1NvdXJjZSBhcyBDb250cm9sKTtcblx0XHRhUGFyYW1zID0gYVBhcmFtcy5sZW5ndGggPiAwID8gYVBhcmFtcyA6IG9Tb3VyY2UgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpICYmIG9Tb3VyY2UuZ2V0U2VsZWN0ZWRLZXkoKS5zcGxpdChcIi9cIik7XG5cblx0XHRsZXQgb0RhdGFPYmplY3Q7XG5cdFx0Y29uc3Qgc1Byb3BlcnR5TmFtZSA9IG9Tb3VyY2UuZ2V0SWQoKS5zdWJzdHJpbmcob1NvdXJjZS5nZXRJZCgpLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpO1xuXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiBhUGFyYW1zWzBdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYVBhcmFtc1swXSA9PT0gXCJDbGVhckZpZWxkVmFsdWVcIikge1xuXHRcdFx0dmFsdWUgPSBcIlwiO1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogc1Byb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhUGFyYW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4ICYmICFvRGF0YU9iamVjdC5rZXlWYWx1ZS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdfQ==