@sapui5/sap.fe.core 1.97.0 → 1.100.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 (306) hide show
  1. package/package.json +7 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +309 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +315 -0
  5. package/src/sap/fe/core/AppComponent.js +389 -397
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +198 -181
  8. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  9. package/src/sap/fe/core/BaseController.js +83 -58
  10. package/src/sap/fe/core/BaseController.ts +68 -0
  11. package/src/sap/fe/core/BusyLocker.js +105 -121
  12. package/src/sap/fe/core/BusyLocker.ts +98 -0
  13. package/src/sap/fe/core/CommonUtils.js +2164 -2379
  14. package/src/sap/fe/core/CommonUtils.ts +2177 -0
  15. package/src/sap/fe/core/ExtensionAPI.js +279 -266
  16. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  17. package/src/sap/fe/core/PageController.js +218 -125
  18. package/src/sap/fe/core/PageController.ts +129 -0
  19. package/src/sap/fe/core/RouterProxy.js +924 -807
  20. package/src/sap/fe/core/RouterProxy.ts +840 -0
  21. package/src/sap/fe/core/Synchronization.js +41 -35
  22. package/src/sap/fe/core/Synchronization.ts +29 -0
  23. package/src/sap/fe/core/TemplateComponent.js +173 -155
  24. package/src/sap/fe/core/TemplateComponent.ts +173 -0
  25. package/src/sap/fe/core/TemplateModel.js +79 -54
  26. package/src/sap/fe/core/TemplateModel.ts +63 -0
  27. package/src/sap/fe/core/TransactionHelper.js +1560 -1579
  28. package/src/sap/fe/core/TransactionHelper.ts +1717 -0
  29. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  30. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  31. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  32. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  33. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  34. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  35. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  36. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  37. package/src/sap/fe/core/actions/draft.js +521 -581
  38. package/src/sap/fe/core/actions/draft.ts +566 -0
  39. package/src/sap/fe/core/actions/messageHandling.js +564 -511
  40. package/src/sap/fe/core/actions/messageHandling.ts +552 -0
  41. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  42. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  43. package/src/sap/fe/core/actions/operations.js +1093 -1211
  44. package/src/sap/fe/core/actions/operations.ts +1192 -0
  45. package/src/sap/fe/core/actions/sticky.js +114 -104
  46. package/src/sap/fe/core/actions/sticky.ts +119 -0
  47. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
  48. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  49. package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
  50. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  51. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  53. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  55. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  57. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  59. package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
  61. package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
  62. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  63. package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  65. package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
  66. package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
  67. package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
  68. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  69. package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
  70. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  71. package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
  72. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  73. package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  75. package/src/sap/fe/core/controllerextensions/Share.js +220 -244
  76. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  77. package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
  78. package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
  79. package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
  80. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
  82. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/CommandExecution.js +68 -66
  84. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  85. package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
  86. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  87. package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
  88. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  89. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
  90. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  91. package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
  92. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  93. package/src/sap/fe/core/controls/FilterBar.js +163 -159
  94. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  95. package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
  96. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  97. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
  98. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  99. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  100. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
  101. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  102. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
  103. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  104. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
  105. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  106. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
  107. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  108. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  109. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  110. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  111. package/src/sap/fe/core/converters/ConverterContext.js +348 -367
  112. package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
  113. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  114. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
  115. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
  116. package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
  117. package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
  118. package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
  119. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  120. package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
  121. package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
  123. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  125. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  126. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  127. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  128. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  129. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  130. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
  131. package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
  132. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  133. package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
  134. package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
  135. package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
  136. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
  137. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
  138. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
  139. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
  140. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  141. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  142. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  143. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  144. package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
  145. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  146. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  147. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  148. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  149. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  150. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  151. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  152. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  153. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  154. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
  155. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
  156. package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
  157. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
  158. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  159. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  160. package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
  161. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  162. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  163. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  164. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  166. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  167. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  168. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  169. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  170. package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
  171. package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
  172. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  173. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  174. package/src/sap/fe/core/fpm/Component.js +51 -54
  175. package/src/sap/fe/core/fpm/Component.ts +48 -0
  176. package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
  177. package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
  178. package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
  179. package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
  180. package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
  181. package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
  183. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
  184. package/src/sap/fe/core/helpers/EditState.js +81 -84
  185. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  186. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  187. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  188. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  189. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  190. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  191. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  192. package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
  193. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  194. package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
  195. package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
  196. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  197. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  198. package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
  199. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
  200. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  201. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  202. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  203. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  204. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  205. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  206. package/src/sap/fe/core/library.js +427 -425
  207. package/src/sap/fe/core/library.support.js +23 -27
  208. package/src/sap/fe/core/library.support.ts +23 -0
  209. package/src/sap/fe/core/library.ts +420 -0
  210. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
  211. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
  212. package/src/sap/fe/core/messagebundle.properties +78 -13
  213. package/src/sap/fe/core/messagebundle_ar.properties +58 -7
  214. package/src/sap/fe/core/messagebundle_bg.properties +58 -7
  215. package/src/sap/fe/core/messagebundle_ca.properties +58 -7
  216. package/src/sap/fe/core/messagebundle_cs.properties +59 -8
  217. package/src/sap/fe/core/messagebundle_cy.properties +58 -7
  218. package/src/sap/fe/core/messagebundle_da.properties +58 -7
  219. package/src/sap/fe/core/messagebundle_de.properties +58 -7
  220. package/src/sap/fe/core/messagebundle_el.properties +58 -7
  221. package/src/sap/fe/core/messagebundle_en.properties +57 -6
  222. package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
  223. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
  224. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
  225. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
  226. package/src/sap/fe/core/messagebundle_es.properties +58 -7
  227. package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
  228. package/src/sap/fe/core/messagebundle_et.properties +58 -7
  229. package/src/sap/fe/core/messagebundle_fi.properties +60 -9
  230. package/src/sap/fe/core/messagebundle_fr.properties +64 -13
  231. package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
  232. package/src/sap/fe/core/messagebundle_hi.properties +58 -7
  233. package/src/sap/fe/core/messagebundle_hr.properties +58 -7
  234. package/src/sap/fe/core/messagebundle_hu.properties +59 -8
  235. package/src/sap/fe/core/messagebundle_id.properties +61 -10
  236. package/src/sap/fe/core/messagebundle_it.properties +58 -7
  237. package/src/sap/fe/core/messagebundle_iw.properties +58 -7
  238. package/src/sap/fe/core/messagebundle_ja.properties +58 -7
  239. package/src/sap/fe/core/messagebundle_kk.properties +58 -7
  240. package/src/sap/fe/core/messagebundle_ko.properties +58 -7
  241. package/src/sap/fe/core/messagebundle_lt.properties +58 -7
  242. package/src/sap/fe/core/messagebundle_lv.properties +59 -8
  243. package/src/sap/fe/core/messagebundle_ms.properties +58 -7
  244. package/src/sap/fe/core/messagebundle_nl.properties +58 -7
  245. package/src/sap/fe/core/messagebundle_no.properties +58 -7
  246. package/src/sap/fe/core/messagebundle_pl.properties +58 -7
  247. package/src/sap/fe/core/messagebundle_pt.properties +59 -8
  248. package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
  249. package/src/sap/fe/core/messagebundle_ro.properties +58 -7
  250. package/src/sap/fe/core/messagebundle_ru.properties +58 -7
  251. package/src/sap/fe/core/messagebundle_sh.properties +58 -7
  252. package/src/sap/fe/core/messagebundle_sk.properties +58 -7
  253. package/src/sap/fe/core/messagebundle_sl.properties +58 -7
  254. package/src/sap/fe/core/messagebundle_sv.properties +59 -8
  255. package/src/sap/fe/core/messagebundle_th.properties +58 -7
  256. package/src/sap/fe/core/messagebundle_tr.properties +60 -9
  257. package/src/sap/fe/core/messagebundle_uk.properties +58 -7
  258. package/src/sap/fe/core/messagebundle_vi.properties +58 -7
  259. package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
  260. package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
  261. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  262. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  263. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
  264. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  265. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
  266. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
  267. package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
  268. package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
  269. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
  272. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  273. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
  274. package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
  276. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
  278. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
  279. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  280. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  281. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  282. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  283. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  284. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  285. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  286. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  287. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  288. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  289. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  290. package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
  291. package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
  292. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  295. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  296. package/src/sap/fe/core/templating/FilterHelper.js +140 -78
  297. package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
  298. package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
  299. package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
  300. package/src/sap/fe/core/templating/UIFormatters.js +76 -135
  301. package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
  302. package/src/sap/fe/core/type/Email.js +1 -1
  303. package/src/sap/fe/core/type/Email.ts +4 -6
  304. package/ui5.yaml +0 -3
  305. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  306. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -1,408 +1,312 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
+ sap.ui.define(["sap/ui/model/odata/v4/AnnotationHelper", "sap/fe/core/CommonUtils", "sap/m/library", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/BindingExpression"], function (ODataModelAnnotationHelper, CommonUtils, mLibrary, StableIdHelper, ModelHelper, BindingExpression) {
6
+ "use strict";
5
7
 
6
- sap.ui.define(
7
- [
8
- "sap/base/Log",
9
- "sap/ui/model/odata/v4/AnnotationHelper",
10
- "sap/fe/core/CommonUtils",
11
- "sap/m/library",
12
- "sap/base/strings/formatMessage",
13
- "sap/fe/macros/CommonHelper",
14
- "sap/fe/core/helpers/StableIdHelper",
15
- "sap/fe/core/helpers/ModelHelper"
16
- ],
17
- function(Log, ODataModelAnnotationHelper, CommonUtils, mLibrary, formatMessage, CommonHelper, StableIdHelper, ModelHelper) {
18
- "use strict";
19
-
20
- var ButtonType = mLibrary.ButtonType;
21
-
22
- var AnnotationHelper = {
23
- /* this helper can be activated to debug template processing
24
- debug: function (oContext) {
25
- //debugger;
26
- },
27
- */
28
-
29
- getTargetContext: function(oTarget) {
30
- var sTarget = oTarget.getObject(oTarget.getPath()),
31
- sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(oTarget.getPath());
32
- return sNavigationPath + "/" + sTarget;
33
- },
34
-
35
- getNavigationContext: function(oContext) {
36
- return ODataModelAnnotationHelper.getNavigationPath(oContext.getPath());
37
- },
38
-
39
- /**
40
- * Checks if the navigation collection is insertable.
41
- *
42
- * @function
43
- * @static
44
- * @name sap.fe.core.AnnotationHelper.getNavigationInsertableRestrictions
45
- * @memberof sap.fe.core.AnnotationHelper
46
- * @param oCollection
47
- * @param {string} sCurrentCollectionName The name of the navigation collection
48
- * @param {Array} aRestrictedProperties Array of RestrictedProperties of NavigationRestrictions of the root collection
49
- * @param {boolean} bInsertable Insertable value of the navigation collection
50
- * @param bCreationRow
51
- * @returns {string} Expression if insertable or insertable path, false otherwise
52
- * @private
53
- * @ui5-restricted
54
- */
55
- getNavigationInsertableRestrictions: function(
56
- oCollection,
57
- sCurrentCollectionName,
58
- aRestrictedProperties,
59
- bInsertable,
60
- bCreationRow
61
- ) {
62
- // If insertable = true via NavigationRestriction of root collection, navigation collection is insertable
63
- // If NOT insertable via NavigationRestriction of root collection, navigation collection is NOT insertable
64
- // If insertable property is undefined for the NavigationRestrictions of the root collection,
65
- // then insertable property of the navigation collection is considered.
66
- // If insertable = true, navigation collection is insertable
67
- // If insertable = false, navigation collection is NOT insertable
68
- // If Insertable is undefined via navigation restriction of root collection
69
- // and Insertable is undefined at navigation collection,
70
- // then navigation collection is insertable.
71
- var i,
72
- oNavigationProperty,
73
- sPath = "";
74
- for (i in aRestrictedProperties) {
75
- oNavigationProperty = aRestrictedProperties[i];
76
- if (
77
- oNavigationProperty.NavigationProperty.$NavigationPropertyPath === sCurrentCollectionName &&
78
- oNavigationProperty.InsertRestrictions
79
- ) {
80
- if (oNavigationProperty.InsertRestrictions.Insertable && oNavigationProperty.InsertRestrictions.Insertable.$Path) {
81
- if (bCreationRow) {
82
- sPath = oCollection.$Partner + "/";
83
- }
84
- return (
85
- "{= ${" +
86
- sPath +
87
- oNavigationProperty.InsertRestrictions.Insertable.$Path +
88
- "} && ${ui>/editMode} === 'Editable' }"
89
- );
90
- }
91
- return oNavigationProperty.InsertRestrictions.Insertable ? "{= ${ui>/editMode} === 'Editable' }" : false;
92
- }
93
- }
94
- if (bInsertable && bInsertable.$Path && bInsertable.$Path.indexOf("/") > -1) {
95
- var aSplitInsertablePath = bInsertable.$Path.split("/");
96
- var sNavigationPath = aSplitInsertablePath[0];
97
- var sPartner = oCollection.$Partner;
98
- if (sNavigationPath !== sPartner) {
99
- // check for parent property
100
- return "{= ${ui>/editMode} === 'Editable'}";
101
- }
102
- if (bCreationRow) {
103
- sCurrentCollectionName = "";
104
- } else {
105
- sCurrentCollectionName = sCurrentCollectionName + "/";
106
- }
107
- return "{= ${ui>/editMode} === 'Editable' && ${" + sCurrentCollectionName + bInsertable.$Path + "}}";
108
- }
109
- return "{= " + (bInsertable !== false) + " && ${ui>/editMode} === 'Editable'}";
110
- },
111
- /**
112
- * Checks if the footer is visible or not.
113
- *
114
- * @function
115
- * @static
116
- * @name sap.fe.core.AnnotationHelper.showFooter
117
- * @memberof sap.fe.core.AnnotationHelper
118
- * @param {Array} aDataFields Array of DataFields in the identification
119
- * @param {boolean} bConsiderEditable Whether the edit mode binding is required or not
120
- * @returns {string} An expression if all the actions are ui.hidden, true otherwise
121
- * @private
122
- * @ui5-restricted
123
- **/
124
- showFooter: function(aDataFields, bConsiderEditable) {
125
- var sHiddenExpression = "";
126
- var sSemiHiddenExpression;
127
- var aHiddenActionPath = [];
128
-
129
- for (var i in aDataFields) {
130
- var oDataField = aDataFields[i];
131
- if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && oDataField.Determining === true) {
132
- if (!oDataField["@com.sap.vocabularies.UI.v1.Hidden"]) {
133
- return true;
134
- } else if (oDataField["@com.sap.vocabularies.UI.v1.Hidden"].$Path) {
135
- if (aHiddenActionPath.indexOf(oDataField["@com.sap.vocabularies.UI.v1.Hidden"].$Path) === -1) {
136
- aHiddenActionPath.push(oDataField["@com.sap.vocabularies.UI.v1.Hidden"].$Path);
137
- }
138
- }
139
- }
140
- }
141
-
142
- if (aHiddenActionPath.length) {
143
- for (var index in aHiddenActionPath) {
144
- if (aHiddenActionPath[index]) {
145
- sSemiHiddenExpression = "(%{" + aHiddenActionPath[index] + "} === true ? false : true )";
146
- }
147
- if (index == aHiddenActionPath.length - 1) {
148
- sHiddenExpression = sHiddenExpression + sSemiHiddenExpression;
149
- } else {
150
- sHiddenExpression = sHiddenExpression + sSemiHiddenExpression + "||";
151
- }
152
- }
153
- return (
154
- "{= " +
155
- (bConsiderEditable ? "(" : "") +
156
- sHiddenExpression +
157
- (bConsiderEditable ? " || ${ui>/editMode} === 'Editable') " : " ") +
158
- "&& ${internal>isCreateDialogOpen} !== true}"
159
- );
160
- } else {
161
- return (
162
- "{= " + (bConsiderEditable ? "${ui>/editMode} === 'Editable' && " : "") + "${internal>isCreateDialogOpen} !== true}"
163
- );
164
- }
165
- },
166
-
167
- /**
168
- * Returns the metamodel path correctly for bound actions. For unbound actions,
169
- * an incorrect path is returned, but is ignored during templating.
170
- *
171
- * For example, for the bound action someNameSpace.SomeBoundAction of the entity set SomeEntitySet,
172
- * the string "/SomeEntitySet/someNameSpace.SomeBoundAction" is returned.
173
- * @function
174
- * @static
175
- * @name sap.fe.core.AnnotationHelper.getActionContext
176
- * @memberof sap.fe.core.AnnotationHelper
177
- * @param {object} oAction The context object for the action
178
- * @returns {string} Correct metamodel path for bound and incorrect path for unbound actions
179
- * @private
180
- * @ui5-restricted
181
- **/
182
- getActionContext: function(oAction) {
183
- return CommonUtils.getActionPath(oAction, true);
184
- },
185
- /**
186
- * Returns the metamodel path correctly for overloaded bound actions. For unbound actions,
187
- * incorrect path is returned but during templating it is ignored.
188
- * e.g. for bound action someNameSpace.SomeBoundAction of entity set SomeEntitySet,
189
- * the string "/SomeEntitySet/someNameSpace.SomeBoundAction/@$ui5.overload/0" is returned.
190
- * @function
191
- * @static
192
- * @name sap.fe.core.AnnotationHelper.getPathToBoundActionOverload
193
- * @memberof sap.fe.core.AnnotationHelper
194
- * @param {object} oAction The context object for the action
195
- * @returns {string} Correct metamodel path for bound action overload and incorrect path for unbound actions
196
- * @private
197
- * @ui5-restricted
198
- **/
199
- getPathToBoundActionOverload: function(oAction) {
200
- var sPath = CommonUtils.getActionPath(oAction, true);
201
- return sPath + "/@$ui5.overload/0";
202
- },
203
- /**
204
- * Returns an expression to determine Emphasized button type based on Criticality across all actions
205
- * If critical action is rendered, its considered to be the primary action. Hence template's default primary action is set back to Default.
206
- * @function
207
- * @static
208
- * @name sap.fe.core.AnnotationHelper.buildEmphasizedButtonExpression
209
- * @memberof sap.fe.core.AnnotationHelper
210
- * @param {Array} aIdentification Array of all the DataFields in Identification
211
- * @returns {string} An expression to deduce if button type is Default or Emphasized
212
- * @private
213
- * @ui5-restricted
214
- **/
215
- buildEmphasizedButtonExpression: function(aIdentification) {
216
- if (!aIdentification) {
217
- return ButtonType.Emphasized;
218
- }
219
- var sFormatEmphasizedExpression;
220
- var bIsAlwaysDefault,
221
- sHiddenSimplePath,
222
- sHiddenExpression = "";
223
- aIdentification.forEach(function(oDataField) {
224
- var oCriticalityProperty = oDataField.Criticality;
225
- var oDataFieldHidden = oDataField["@com.sap.vocabularies.UI.v1.Hidden"];
226
- if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && !bIsAlwaysDefault && oCriticalityProperty) {
227
- if (!sFormatEmphasizedExpression && oDataFieldHidden === true) {
228
- // if DataField is set to hidden, we can skip other checks and return Default button type
229
- sFormatEmphasizedExpression = ButtonType.Emphasized;
230
- return;
231
- }
232
- if (oDataFieldHidden && oDataFieldHidden.$Path) {
233
- // when visibility of critical button is based on path, collect all paths for expression
234
- sHiddenSimplePath = oDataFieldHidden.$Path;
235
- if (sHiddenExpression) {
236
- sHiddenExpression = sHiddenExpression + " && ";
237
- }
238
- sHiddenExpression = sHiddenExpression + "%{" + sHiddenSimplePath + "} === true";
239
- sFormatEmphasizedExpression = "{= (" + sHiddenExpression + ") ? 'Emphasized' : 'Default' }";
240
- }
241
- switch (oCriticalityProperty.$EnumMember) {
242
- // supported criticality are [Positive/3/'3'] and [Negative/1/'1']
243
- case "com.sap.vocabularies.UI.v1.CriticalityType/Negative":
244
- case "com.sap.vocabularies.UI.v1.CriticalityType/Positive":
245
- case "1":
246
- case 1:
247
- case "3":
248
- case 3:
249
- if (!oDataFieldHidden) {
250
- sFormatEmphasizedExpression = ButtonType.Default;
251
- bIsAlwaysDefault = true;
252
- }
253
- sFormatEmphasizedExpression = sFormatEmphasizedExpression || ButtonType.Default;
254
- break;
255
- default:
256
- sFormatEmphasizedExpression = ButtonType.Emphasized;
257
- }
258
- if (oCriticalityProperty.$Path) {
259
- // when Criticality is set using a path, use the path for deducing the Emphsized type for default Primary Action
260
- var sCombinedHiddenExpression = sHiddenExpression ? "!(" + sHiddenExpression + ") && " : "";
261
- sFormatEmphasizedExpression =
262
- "{= " +
263
- sCombinedHiddenExpression +
264
- "((${" +
265
- oCriticalityProperty.$Path +
266
- "} === 'com.sap.vocabularies.UI.v1.CriticalityType/Negative') || (${" +
267
- oCriticalityProperty.$Path +
268
- "} === '1') || (${" +
269
- oCriticalityProperty.$Path +
270
- "} === 1) " +
271
- "|| (${" +
272
- oCriticalityProperty.$Path +
273
- "} === 'com.sap.vocabularies.UI.v1.CriticalityType/Positive') || (${" +
274
- oCriticalityProperty.$Path +
275
- "} === '3') || (${" +
276
- oCriticalityProperty.$Path +
277
- "} === 3)) ? " +
278
- "'Default'" +
279
- " : " +
280
- "'Emphasized'" +
281
- " }";
282
- }
283
- }
284
- });
285
- return sFormatEmphasizedExpression || ButtonType.Emphasized;
286
- },
287
- /**
288
- * Method to determine if the programming model is sticky.
289
- *
290
- * @function
291
- * @name isStickySessionSupported
292
- * @param {object} [vCollectionOrMetaModel] The collection or the metadata model
293
- * @param {object} [oInterface] Contains the context, used in oDataContext
294
- * @returns {boolean} `true` if sticky, `false` otherwise
295
- */
296
- isStickySessionSupported: function(vCollectionOrMetaModel, oInterface) {
297
- var oMetaModel;
298
- if (arguments.length > 1) {
299
- oMetaModel = oInterface.context.getModel();
300
- } else {
301
- oMetaModel = vCollectionOrMetaModel;
302
- }
303
- return ModelHelper.isStickySessionSupported(oMetaModel);
304
- },
305
- /**
306
- * Method returns Whether the action type is manifest or not.
307
- *
308
- * @function
309
- * @name isManifestActionVisible
310
- * @param {object} [oAction] The action object
311
- * @returns {boolean} `true` if action is coming from manifest, `false` otherwise
312
- */
313
- isManifestAction: function(oAction) {
314
- var aActions = [
315
- "Primary",
316
- "DefaultApply",
317
- "Secondary",
318
- "ForAction",
319
- "ForNavigation",
320
- "SwitchToActiveObject",
321
- "SwitchToDraftObject"
322
- ];
323
- return aActions.indexOf(oAction.type) < 0;
324
- },
325
- /**
326
- * Method returns whether footer is visible or not on object / sub object page.
327
- *
328
- * @function
329
- * @name getFooterVisible
330
- * @param {object} [oFooterActions] The footer action object coming from convertor
331
- * @param {Array} [aDataFields] Data field array for normal footer visiblity processing
332
- * @returns {boolean} `true` if custom actions are present otherwise call function showFooter
333
- */
334
- getFooterVisible: function(oFooterActions, aDataFields) {
335
- var bCustomActionFlag = false;
336
- oFooterActions.forEach(
337
- function(action) {
338
- var isCustomAction = this.isManifestAction(action);
339
- if (isCustomAction) {
340
- bCustomActionFlag = true;
341
- }
342
- }.bind(this)
343
- );
344
- if (bCustomActionFlag) {
345
- return true;
346
- } else {
347
- return this.showFooter(aDataFields, true);
348
- }
349
- },
350
- /**
351
- * Build an expression calling an action handler via the FPM helper's actionWrapper function
352
- *
353
- * This function assumes that the 'FPM.actionWrapper()' function is available at runtime.
354
- *
355
- * @param {object} oAction Action metadata
356
- * @param {string} oAction.handlerModule Module containing the action handler method
357
- * @param {string} oAction.handlerMethod Action handler method name
358
- * @param {object} [oThis] `this` (if the function is called from a macro)
359
- * @param {string} oThis.id The table's ID
360
- * @returns {string} The action wrapper binding expression
361
- */
362
- buildActionWrapper: function(oAction, oThis) {
363
- var aParams = [
364
- "$event",
365
- CommonHelper.addSingleQuotes(oAction.handlerModule, true),
366
- CommonHelper.addSingleQuotes(oAction.handlerMethod, true)
367
- ];
368
-
369
- if (oThis && oThis.id) {
370
- var oAdditionalParams = {
371
- contexts: "${internal>selectedContexts}"
372
- };
373
- aParams.push(CommonHelper.objectToString(oAdditionalParams));
374
- }
375
-
376
- return "FPM.actionWrapper(" + aParams.join(", ") + ")";
377
- },
378
-
379
- /**
380
- * Method returns an VariantBackReference expression based on variantManagement and oConverterContext value.
381
- *
382
- * @function
383
- * @name getVariantBackReference
384
- * @param {object} oViewData Object Containing View Data
385
- * @param {object} oConverterContext Object containing converted context
386
- * @returns {string}
387
- */
388
- getVariantBackReference: function(oViewData, oConverterContext) {
389
- if (oViewData && oViewData.variantManagement === "Page") {
390
- return "fe::PageVariantManagement";
391
- }
392
- if (oViewData && oViewData.variantManagement === "Control") {
393
- return StableIdHelper.generate([oConverterContext.filterBarId, "VariantManagement"]);
394
- }
395
- return undefined;
396
- },
397
- getDefaultPath: function(aViews) {
398
- for (var i = 0; i < aViews.length; i++) {
399
- if (aViews[i].defaultPath) {
400
- return aViews[i].defaultPath;
401
- }
402
- }
403
- }
404
- };
405
- return AnnotationHelper;
406
- },
407
- true
408
- );
8
+ var ref = BindingExpression.ref;
9
+ var fn = BindingExpression.fn;
10
+ var compileBinding = BindingExpression.compileBinding;
11
+ var generate = StableIdHelper.generate;
12
+
13
+ var ButtonType = mLibrary.ButtonType;
14
+ var AnnotationHelper = {
15
+ /* this helper can be activated to debug template processing
16
+ debug: function (oContext) {
17
+ //debugger;
18
+ },
19
+ */
20
+ getTargetContext: function (oTarget) {
21
+ var sTarget = oTarget.getObject(oTarget.getPath()),
22
+ sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(oTarget.getPath());
23
+ return sNavigationPath + "/" + sTarget;
24
+ },
25
+ getNavigationContext: function (oContext) {
26
+ return ODataModelAnnotationHelper.getNavigationPath(oContext.getPath());
27
+ },
28
+
29
+ /**
30
+ * Checks if the footer is visible or not.
31
+ *
32
+ * @function
33
+ * @static
34
+ * @name sap.fe.core.AnnotationHelper.showFooter
35
+ * @memberof sap.fe.core.AnnotationHelper
36
+ * @param {Array} aDataFields Array of DataFields in the identification
37
+ * @param {boolean} bConsiderEditable Whether the edit mode binding is required or not
38
+ * @returns {string} An expression if all the actions are ui.hidden, true otherwise
39
+ * @private
40
+ * @ui5-restricted
41
+ **/
42
+ showFooter: function (aDataFields, bConsiderEditable) {
43
+ var sHiddenExpression = "";
44
+ var sSemiHiddenExpression;
45
+ var aHiddenActionPath = [];
46
+
47
+ for (var i in aDataFields) {
48
+ var oDataField = aDataFields[i];
49
+
50
+ if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && oDataField.Determining === true) {
51
+ var hiddenExpression = oDataField["@".concat("com.sap.vocabularies.UI.v1.Hidden")];
52
+
53
+ if (!hiddenExpression) {
54
+ return true;
55
+ } else if (hiddenExpression.$Path) {
56
+ if (aHiddenActionPath.indexOf(hiddenExpression.$Path) === -1) {
57
+ aHiddenActionPath.push(hiddenExpression.$Path);
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ if (aHiddenActionPath.length) {
64
+ for (var index = 0; index < aHiddenActionPath.length; index++) {
65
+ if (aHiddenActionPath[index]) {
66
+ sSemiHiddenExpression = "(%{" + aHiddenActionPath[index] + "} === true ? false : true )";
67
+ }
68
+
69
+ if (index == aHiddenActionPath.length - 1) {
70
+ sHiddenExpression = sHiddenExpression + sSemiHiddenExpression;
71
+ } else {
72
+ sHiddenExpression = sHiddenExpression + sSemiHiddenExpression + "||";
73
+ }
74
+ }
75
+
76
+ return "{= " + (bConsiderEditable ? "(" : "") + sHiddenExpression + (bConsiderEditable ? " || ${ui>/editMode} === 'Editable') " : " ") + "&& ${internal>isCreateDialogOpen} !== true}";
77
+ } else {
78
+ return "{= " + (bConsiderEditable ? "${ui>/editMode} === 'Editable' && " : "") + "${internal>isCreateDialogOpen} !== true}";
79
+ }
80
+ },
81
+
82
+ /**
83
+ * Returns the metamodel path correctly for bound actions. For unbound actions,
84
+ * an incorrect path is returned, but is ignored during templating.
85
+ *
86
+ * For example, for the bound action someNameSpace.SomeBoundAction of the entity set SomeEntitySet,
87
+ * the string "/SomeEntitySet/someNameSpace.SomeBoundAction" is returned.
88
+ *
89
+ * @function
90
+ * @static
91
+ * @name sap.fe.core.AnnotationHelper.getActionContext
92
+ * @memberof sap.fe.core.AnnotationHelper
93
+ * @param {object} oAction The context object for the action
94
+ * @returns {string} Correct metamodel path for bound and incorrect path for unbound actions
95
+ * @private
96
+ * @ui5-restricted
97
+ **/
98
+ getActionContext: function (oAction) {
99
+ return CommonUtils.getActionPath(oAction, true);
100
+ },
101
+
102
+ /**
103
+ * Returns the metamodel path correctly for overloaded bound actions. For unbound actions,
104
+ * incorrect path is returned but during templating it is ignored.
105
+ * e.g. for bound action someNameSpace.SomeBoundAction of entity set SomeEntitySet,
106
+ * the string "/SomeEntitySet/someNameSpace.SomeBoundAction/@$ui5.overload/0" is returned.
107
+ *
108
+ * @function
109
+ * @static
110
+ * @name sap.fe.core.AnnotationHelper.getPathToBoundActionOverload
111
+ * @memberof sap.fe.core.AnnotationHelper
112
+ * @param {object} oAction The context object for the action
113
+ * @returns {string} Correct metamodel path for bound action overload and incorrect path for unbound actions
114
+ * @private
115
+ * @ui5-restricted
116
+ **/
117
+ getPathToBoundActionOverload: function (oAction) {
118
+ var sPath = CommonUtils.getActionPath(oAction, true);
119
+ return sPath + "/@$ui5.overload/0";
120
+ },
121
+
122
+ /**
123
+ * Returns an expression to determine Emphasized button type based on Criticality across all actions
124
+ * If critical action is rendered, its considered to be the primary action. Hence template's default primary action is set back to Default.
125
+ *
126
+ * @function
127
+ * @static
128
+ * @name sap.fe.core.AnnotationHelper.buildEmphasizedButtonExpression
129
+ * @memberof sap.fe.core.AnnotationHelper
130
+ * @param {Array} aIdentification Array of all the DataFields in Identification
131
+ * @returns {string} An expression to deduce if button type is Default or Emphasized
132
+ * @private
133
+ * @ui5-restricted
134
+ **/
135
+ buildEmphasizedButtonExpression: function (aIdentification) {
136
+ if (!aIdentification) {
137
+ return ButtonType.Emphasized;
138
+ }
139
+
140
+ var sFormatEmphasizedExpression;
141
+ var bIsAlwaysDefault,
142
+ sHiddenSimplePath,
143
+ sHiddenExpression = "";
144
+ aIdentification.forEach(function (oDataField) {
145
+ var oCriticalityProperty = oDataField.Criticality;
146
+ var oDataFieldHidden = oDataField["@com.sap.vocabularies.UI.v1.Hidden"];
147
+
148
+ if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && !bIsAlwaysDefault && oCriticalityProperty) {
149
+ if (!sFormatEmphasizedExpression && oDataFieldHidden === true) {
150
+ // if DataField is set to hidden, we can skip other checks and return Default button type
151
+ sFormatEmphasizedExpression = ButtonType.Emphasized;
152
+ return;
153
+ }
154
+
155
+ if (oDataFieldHidden && oDataFieldHidden.$Path) {
156
+ // when visibility of critical button is based on path, collect all paths for expression
157
+ sHiddenSimplePath = oDataFieldHidden.$Path;
158
+
159
+ if (sHiddenExpression) {
160
+ sHiddenExpression = sHiddenExpression + " && ";
161
+ }
162
+
163
+ sHiddenExpression = sHiddenExpression + "%{" + sHiddenSimplePath + "} === true";
164
+ sFormatEmphasizedExpression = "{= (" + sHiddenExpression + ") ? 'Emphasized' : 'Default' }";
165
+ }
166
+
167
+ switch (oCriticalityProperty.$EnumMember) {
168
+ // supported criticality are [Positive/3/'3'] and [Negative/1/'1']
169
+ case "com.sap.vocabularies.UI.v1.CriticalityType/Negative":
170
+ case "com.sap.vocabularies.UI.v1.CriticalityType/Positive":
171
+ case "1":
172
+ case 1:
173
+ case "3":
174
+ case 3:
175
+ if (!oDataFieldHidden) {
176
+ sFormatEmphasizedExpression = ButtonType.Default;
177
+ bIsAlwaysDefault = true;
178
+ }
179
+
180
+ sFormatEmphasizedExpression = sFormatEmphasizedExpression || ButtonType.Default;
181
+ break;
182
+
183
+ default:
184
+ sFormatEmphasizedExpression = ButtonType.Emphasized;
185
+ }
186
+
187
+ if (oCriticalityProperty.$Path) {
188
+ // when Criticality is set using a path, use the path for deducing the Emphsized type for default Primary Action
189
+ var sCombinedHiddenExpression = sHiddenExpression ? "!(" + sHiddenExpression + ") && " : "";
190
+ sFormatEmphasizedExpression = "{= " + sCombinedHiddenExpression + "((${" + oCriticalityProperty.$Path + "} === 'com.sap.vocabularies.UI.v1.CriticalityType/Negative') || (${" + oCriticalityProperty.$Path + "} === '1') || (${" + oCriticalityProperty.$Path + "} === 1) " + "|| (${" + oCriticalityProperty.$Path + "} === 'com.sap.vocabularies.UI.v1.CriticalityType/Positive') || (${" + oCriticalityProperty.$Path + "} === '3') || (${" + oCriticalityProperty.$Path + "} === 3)) ? " + "'Default'" + " : " + "'Emphasized'" + " }";
191
+ }
192
+ }
193
+ });
194
+ return sFormatEmphasizedExpression || ButtonType.Emphasized;
195
+ },
196
+
197
+ /**
198
+ * Method to determine if the programming model is sticky.
199
+ *
200
+ * @function
201
+ * @name isStickySessionSupported
202
+ * @param {object} [vCollectionOrMetaModel] The collection or the metadata model
203
+ * @param {object} [oInterface] Contains the context, used in oDataContext
204
+ * @returns {boolean} `true` if sticky, `false` otherwise
205
+ */
206
+ isStickySessionSupported: function (vCollectionOrMetaModel, oInterface) {
207
+ var oMetaModel;
208
+
209
+ if (oInterface) {
210
+ oMetaModel = oInterface.context.getModel();
211
+ } else {
212
+ oMetaModel = vCollectionOrMetaModel;
213
+ }
214
+
215
+ return ModelHelper.isStickySessionSupported(oMetaModel);
216
+ },
217
+
218
+ /**
219
+ * Method returns Whether the action type is manifest or not.
220
+ *
221
+ * @function
222
+ * @name isManifestActionVisible
223
+ * @param {object} oAction The action object
224
+ * @returns {boolean} `true` if action is coming from manifest, `false` otherwise
225
+ */
226
+ isManifestAction: function (oAction) {
227
+ var aActions = ["Primary", "DefaultApply", "Secondary", "ForAction", "ForNavigation", "SwitchToActiveObject", "SwitchToDraftObject"];
228
+ return aActions.indexOf(oAction.type) < 0;
229
+ },
230
+
231
+ /**
232
+ * Method returns whether footer is visible or not on object / sub object page.
233
+ *
234
+ * @function
235
+ * @name getFooterVisible
236
+ * @param {Array} oFooterActions The footer action object coming from convertor
237
+ * @param {Array} aDataFields Data field array for normal footer visiblity processing
238
+ * @returns {boolean} `true` if custom actions are present otherwise call function showFooter
239
+ */
240
+ getFooterVisible: function (oFooterActions, aDataFields) {
241
+ var bCustomActionFlag = false;
242
+ oFooterActions.forEach(function (action) {
243
+ var isCustomAction = AnnotationHelper.isManifestAction(action);
244
+
245
+ if (isCustomAction) {
246
+ bCustomActionFlag = true;
247
+ }
248
+ });
249
+
250
+ if (bCustomActionFlag) {
251
+ return true;
252
+ } else {
253
+ return this.showFooter(aDataFields, true);
254
+ }
255
+ },
256
+
257
+ /**
258
+ * Build an expression calling an action handler via the FPM helper's actionWrapper function
259
+ *
260
+ * This function assumes that the 'FPM.actionWrapper()' function is available at runtime.
261
+ *
262
+ * @param {object} oAction Action metadata
263
+ * @param {string} oAction.handlerModule Module containing the action handler method
264
+ * @param {string} oAction.handlerMethod Action handler method name
265
+ * @param {object} [oThis] `this` (if the function is called from a macro)
266
+ * @param {string} oThis.id The table's ID
267
+ * @returns {string} The action wrapper binding expression
268
+ */
269
+ buildActionWrapper: function (oAction, oThis) {
270
+ var aParams = [ref("$event"), oAction.handlerModule, oAction.handlerMethod];
271
+
272
+ if (oThis && oThis.id) {
273
+ var oAdditionalParams = {
274
+ contexts: ref("${internal>selectedContexts}")
275
+ };
276
+ aParams.push(oAdditionalParams);
277
+ }
278
+
279
+ return compileBinding(fn("FPM.actionWrapper", aParams));
280
+ },
281
+
282
+ /**
283
+ * Method returns an VariantBackReference expression based on variantManagement and oConverterContext value.
284
+ *
285
+ * @function
286
+ * @name getVariantBackReference
287
+ * @param {object} oViewData Object Containing View Data
288
+ * @param {object} oConverterContext Object containing converted context
289
+ * @returns {string}
290
+ */
291
+ getVariantBackReference: function (oViewData, oConverterContext) {
292
+ if (oViewData && oViewData.variantManagement === "Page") {
293
+ return "fe::PageVariantManagement";
294
+ }
295
+
296
+ if (oViewData && oViewData.variantManagement === "Control") {
297
+ return generate([oConverterContext.filterBarId, "VariantManagement"]);
298
+ }
299
+
300
+ return undefined;
301
+ },
302
+ getDefaultPath: function (aViews) {
303
+ for (var i = 0; i < aViews.length; i++) {
304
+ if (aViews[i].defaultPath) {
305
+ return aViews[i].defaultPath;
306
+ }
307
+ }
308
+ }
309
+ };
310
+ return AnnotationHelper;
311
+ }, false);
312
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFubm90YXRpb25IZWxwZXIudHMiXSwibmFtZXMiOlsiQnV0dG9uVHlwZSIsIm1MaWJyYXJ5IiwiQW5ub3RhdGlvbkhlbHBlciIsImdldFRhcmdldENvbnRleHQiLCJvVGFyZ2V0Iiwic1RhcmdldCIsImdldE9iamVjdCIsImdldFBhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiZ2V0TmF2aWdhdGlvbkNvbnRleHQiLCJvQ29udGV4dCIsInNob3dGb290ZXIiLCJhRGF0YUZpZWxkcyIsImJDb25zaWRlckVkaXRhYmxlIiwic0hpZGRlbkV4cHJlc3Npb24iLCJzU2VtaUhpZGRlbkV4cHJlc3Npb24iLCJhSGlkZGVuQWN0aW9uUGF0aCIsImkiLCJvRGF0YUZpZWxkIiwiJFR5cGUiLCJEZXRlcm1pbmluZyIsImhpZGRlbkV4cHJlc3Npb24iLCIkUGF0aCIsImluZGV4T2YiLCJwdXNoIiwibGVuZ3RoIiwiaW5kZXgiLCJnZXRBY3Rpb25Db250ZXh0Iiwib0FjdGlvbiIsIkNvbW1vblV0aWxzIiwiZ2V0QWN0aW9uUGF0aCIsImdldFBhdGhUb0JvdW5kQWN0aW9uT3ZlcmxvYWQiLCJzUGF0aCIsImJ1aWxkRW1waGFzaXplZEJ1dHRvbkV4cHJlc3Npb24iLCJhSWRlbnRpZmljYXRpb24iLCJFbXBoYXNpemVkIiwic0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uIiwiYklzQWx3YXlzRGVmYXVsdCIsInNIaWRkZW5TaW1wbGVQYXRoIiwiZm9yRWFjaCIsIm9Dcml0aWNhbGl0eVByb3BlcnR5IiwiQ3JpdGljYWxpdHkiLCJvRGF0YUZpZWxkSGlkZGVuIiwiJEVudW1NZW1iZXIiLCJEZWZhdWx0Iiwic0NvbWJpbmVkSGlkZGVuRXhwcmVzc2lvbiIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInZDb2xsZWN0aW9uT3JNZXRhTW9kZWwiLCJvSW50ZXJmYWNlIiwib01ldGFNb2RlbCIsImNvbnRleHQiLCJnZXRNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNNYW5pZmVzdEFjdGlvbiIsImFBY3Rpb25zIiwidHlwZSIsImdldEZvb3RlclZpc2libGUiLCJvRm9vdGVyQWN0aW9ucyIsImJDdXN0b21BY3Rpb25GbGFnIiwiYWN0aW9uIiwiaXNDdXN0b21BY3Rpb24iLCJidWlsZEFjdGlvbldyYXBwZXIiLCJvVGhpcyIsImFQYXJhbXMiLCJyZWYiLCJoYW5kbGVyTW9kdWxlIiwiaGFuZGxlck1ldGhvZCIsImlkIiwib0FkZGl0aW9uYWxQYXJhbXMiLCJjb250ZXh0cyIsImNvbXBpbGVCaW5kaW5nIiwiZm4iLCJnZXRWYXJpYW50QmFja1JlZmVyZW5jZSIsIm9WaWV3RGF0YSIsIm9Db252ZXJ0ZXJDb250ZXh0IiwidmFyaWFudE1hbmFnZW1lbnQiLCJnZW5lcmF0ZSIsImZpbHRlckJhcklkIiwidW5kZWZpbmVkIiwiZ2V0RGVmYXVsdFBhdGgiLCJhVmlld3MiLCJkZWZhdWx0UGF0aCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBS0EsTUFBTUEsVUFBVSxHQUFHQyxRQUFRLENBQUNELFVBQTVCO0FBQ0EsTUFBTUUsZ0JBQWdCLEdBQUc7QUFDeEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUVDQyxJQUFBQSxnQkFBZ0IsRUFBRSxVQUFTQyxPQUFULEVBQXVCO0FBQ3hDLFVBQU1DLE9BQU8sR0FBR0QsT0FBTyxDQUFDRSxTQUFSLENBQWtCRixPQUFPLENBQUNHLE9BQVIsRUFBbEIsQ0FBaEI7QUFBQSxVQUNDQyxlQUFlLEdBQUdDLDBCQUEwQixDQUFDQyxpQkFBM0IsQ0FBNkNOLE9BQU8sQ0FBQ0csT0FBUixFQUE3QyxDQURuQjtBQUVBLGFBQU9DLGVBQWUsR0FBRyxHQUFsQixHQUF3QkgsT0FBL0I7QUFDQSxLQVh1QjtBQWF4Qk0sSUFBQUEsb0JBQW9CLEVBQUUsVUFBU0MsUUFBVCxFQUF3QjtBQUM3QyxhQUFPSCwwQkFBMEIsQ0FBQ0MsaUJBQTNCLENBQTZDRSxRQUFRLENB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O0FBQ3JDLFdBQUssSUFBSS9ELENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcrRCxNQUFNLENBQUN2RCxNQUEzQixFQUFtQ1IsQ0FBQyxFQUFwQyxFQUF3QztBQUN2QyxZQUFJK0QsTUFBTSxDQUFDL0QsQ0FBRCxDQUFOLENBQVVnRSxXQUFkLEVBQTJCO0FBQzFCLGlCQUFPRCxNQUFNLENBQUMvRCxDQUFELENBQU4sQ0FBVWdFLFdBQWpCO0FBQ0E7QUFDRDtBQUNEO0FBL1N1QixHQUF6QjtTQWtUZWpGLGdCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgbUxpYnJhcnkgZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgY29tcGlsZUJpbmRpbmcsIGZuLCByZWYgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVGVybXMsIFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcbmNvbnN0IEFubm90YXRpb25IZWxwZXIgPSB7XG5cdC8qIHRoaXMgaGVscGVyIGNhbiBiZSBhY3RpdmF0ZWQgdG8gZGVidWcgdGVtcGxhdGUgcHJvY2Vzc2luZ1xuXHRcdFx0IGRlYnVnOiBmdW5jdGlvbiAob0NvbnRleHQpIHtcblx0XHRcdCAvL2RlYnVnZ2VyO1xuXHRcdFx0IH0sXG5cdFx0XHQgKi9cblxuXHRnZXRUYXJnZXRDb250ZXh0OiBmdW5jdGlvbihvVGFyZ2V0OiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0ID0gb1RhcmdldC5nZXRPYmplY3Qob1RhcmdldC5nZXRQYXRoKCkpLFxuXHRcdFx0c05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgob1RhcmdldC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBzTmF2aWdhdGlvblBhdGggKyBcIi9cIiArIHNUYXJnZXQ7XG5cdH0sXG5cblx0Z2V0TmF2aWdhdGlvbkNvbnRleHQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgZm9vdGVyIGlzIHZpc2libGUgb3Igbm90LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5Bbm5vdGF0aW9uSGVscGVyLnNob3dGb290ZXJcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLkFubm90YXRpb25IZWxwZXJcblx0ICogQHBhcmFtIHtBcnJheX0gYURhdGFGaWVsZHMgQXJyYXkgb2YgRGF0YUZpZWxkcyBpbiB0aGUgaWRlbnRpZmljYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBiQ29uc2lkZXJFZGl0YWJsZSBXaGV0aGVyIHRoZSBlZGl0IG1vZGUgYmluZGluZyBpcyByZXF1aXJlZCBvciBub3Rcblx0ICogQHJldHVybnMge3N0cmluZ30gQW4gZXhwcmVzc2lvbiBpZiBhbGwgdGhlIGFjdGlvbnMgYXJlIHVpLmhpZGRlbiwgdHJ1ZSBvdGhlcndpc2Vcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqKi9cblx0c2hvd0Zvb3RlcjogZnVuY3Rpb24oYURhdGFGaWVsZHM6IGFueVtdLCBiQ29uc2lkZXJFZGl0YWJsZTogYm9vbGVhbikge1xuXHRcdGxldCBzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdFx0bGV0IHNTZW1pSGlkZGVuRXhwcmVzc2lvbjtcblx0XHRjb25zdCBhSGlkZGVuQWN0aW9uUGF0aCA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpIGluIGFEYXRhRmllbGRzKSB7XG5cdFx0XHRjb25zdCBvRGF0YUZpZWxkID0gYURhdGFGaWVsZHNbaV07XG5cdFx0XHRpZiAob0RhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uICYmIG9EYXRhRmllbGQuRGV0ZXJtaW5pbmcgPT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgaGlkZGVuRXhwcmVzc2lvbiA9IG9EYXRhRmllbGRbYEAke1VJQW5ub3RhdGlvblRlcm1zLkhpZGRlbn1gXTtcblx0XHRcdFx0aWYgKCFoaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCkge1xuXHRcdFx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aC5pbmRleE9mKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0YUhpZGRlbkFjdGlvblBhdGgucHVzaChoaWRkZW5FeHByZXNzaW9uLiRQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aFtpbmRleF0pIHtcblx0XHRcdFx0XHRzU2VtaUhpZGRlbkV4cHJlc3Npb24gPSBcIigle1wiICsgYUhpZGRlbkFjdGlvblBhdGhbaW5kZXhdICsgXCJ9ID09PSB0cnVlID8gZmFsc2UgOiB0cnVlIClcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaW5kZXggPT0gYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIHNTZW1pSGlkZGVuRXhwcmVzc2lvbiArIFwifHxcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XCJ7PSBcIiArXG5cdFx0XHRcdChiQ29uc2lkZXJFZGl0YWJsZSA/IFwiKFwiIDogXCJcIikgK1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiArXG5cdFx0XHRcdChiQ29uc2lkZXJFZGl0YWJsZSA/IFwiIHx8ICR7dWk+L2VkaXRNb2RlfSA9PT0gJ0VkaXRhYmxlJykgXCIgOiBcIiBcIikgK1xuXHRcdFx0XHRcIiYmICR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIlxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiez0gXCIgKyAoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiR7dWk+L2VkaXRNb2RlfSA9PT0gJ0VkaXRhYmxlJyAmJiBcIiA6IFwiXCIpICsgXCIke2ludGVybmFsPmlzQ3JlYXRlRGlhbG9nT3Blbn0gIT09IHRydWV9XCI7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtZXRhbW9kZWwgcGF0aCBjb3JyZWN0bHkgZm9yIGJvdW5kIGFjdGlvbnMuIEZvciB1bmJvdW5kIGFjdGlvbnMsXG5cdCAqICBhbiBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCwgYnV0IGlzIGlnbm9yZWQgZHVyaW5nIHRlbXBsYXRpbmcuXG5cdCAqXG5cdCAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGJvdW5kIGFjdGlvbiBzb21lTmFtZVNwYWNlLlNvbWVCb3VuZEFjdGlvbiBvZiB0aGUgZW50aXR5IHNldCBTb21lRW50aXR5U2V0LFxuXHQgKiB0aGUgc3RyaW5nIFwiL1NvbWVFbnRpdHlTZXQvc29tZU5hbWVTcGFjZS5Tb21lQm91bmRBY3Rpb25cIiBpcyByZXR1cm5lZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuQW5ub3RhdGlvbkhlbHBlci5nZXRBY3Rpb25Db250ZXh0XG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Bbm5vdGF0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBDb3JyZWN0IG1ldGFtb2RlbCBwYXRoIGZvciBib3VuZCBhbmQgaW5jb3JyZWN0IHBhdGggZm9yIHVuYm91bmQgYWN0aW9uc1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICoqL1xuXHRnZXRBY3Rpb25Db250ZXh0OiBmdW5jdGlvbihvQWN0aW9uOiBvYmplY3QpIHtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0QWN0aW9uUGF0aChvQWN0aW9uLCB0cnVlKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG1ldGFtb2RlbCBwYXRoIGNvcnJlY3RseSBmb3Igb3ZlcmxvYWRlZCBib3VuZCBhY3Rpb25zLiBGb3IgdW5ib3VuZCBhY3Rpb25zLFxuXHQgKiBpbmNvcnJlY3QgcGF0aCBpcyByZXR1cm5lZCBidXQgZHVyaW5nIHRlbXBsYXRpbmcgaXQgaXMgaWdub3JlZC5cblx0ICogZS5nLiBmb3IgYm91bmQgYWN0aW9uIHNvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uIG9mIGVudGl0eSBzZXQgU29tZUVudGl0eVNldCxcblx0ICogdGhlIHN0cmluZyBcIi9Tb21lRW50aXR5U2V0L3NvbWVOYW1lU3BhY2UuU29tZUJvdW5kQWN0aW9uL0AkdWk1Lm92ZXJsb2FkLzBcIiBpcyByZXR1cm5lZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuQW5ub3RhdGlvbkhlbHBlci5nZXRQYXRoVG9Cb3VuZEFjdGlvbk92ZXJsb2FkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Bbm5vdGF0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQWN0aW9uIFRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBDb3JyZWN0IG1ldGFtb2RlbCBwYXRoIGZvciBib3VuZCBhY3Rpb24gb3ZlcmxvYWQgYW5kIGluY29ycmVjdCBwYXRoIGZvciB1bmJvdW5kIGFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqKi9cblx0Z2V0UGF0aFRvQm91bmRBY3Rpb25PdmVybG9hZDogZnVuY3Rpb24ob0FjdGlvbjogb2JqZWN0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBDb21tb25VdGlscy5nZXRBY3Rpb25QYXRoKG9BY3Rpb24sIHRydWUpO1xuXHRcdHJldHVybiBzUGF0aCArIFwiL0AkdWk1Lm92ZXJsb2FkLzBcIjtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgRW1waGFzaXplZCAgYnV0dG9uIHR5cGUgYmFzZWQgb24gQ3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zXG5cdCAqIElmIGNyaXRpY2FsIGFjdGlvbiBpcyByZW5kZXJlZCwgaXRzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHByaW1hcnkgYWN0aW9uLiBIZW5jZSB0ZW1wbGF0ZSdzIGRlZmF1bHQgcHJpbWFyeSBhY3Rpb24gaXMgc2V0IGJhY2sgdG8gRGVmYXVsdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuQW5ub3RhdGlvbkhlbHBlci5idWlsZEVtcGhhc2l6ZWRCdXR0b25FeHByZXNzaW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5Bbm5vdGF0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFJZGVudGlmaWNhdGlvbiBBcnJheSBvZiBhbGwgdGhlIERhdGFGaWVsZHMgaW4gSWRlbnRpZmljYXRpb25cblx0ICogQHJldHVybnMge3N0cmluZ30gQW4gZXhwcmVzc2lvbiB0byBkZWR1Y2UgaWYgYnV0dG9uIHR5cGUgaXMgRGVmYXVsdCBvciBFbXBoYXNpemVkXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiovXG5cdGJ1aWxkRW1waGFzaXplZEJ1dHRvbkV4cHJlc3Npb246IGZ1bmN0aW9uKGFJZGVudGlmaWNhdGlvbj86IGFueVtdKSB7XG5cdFx0aWYgKCFhSWRlbnRpZmljYXRpb24pIHtcblx0XHRcdHJldHVybiBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG5cdFx0fVxuXHRcdGxldCBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRsZXQgYklzQWx3YXlzRGVmYXVsdDogYm9vbGVhbixcblx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoLFxuXHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBcIlwiO1xuXHRcdGFJZGVudGlmaWNhdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKG9EYXRhRmllbGQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NyaXRpY2FsaXR5UHJvcGVydHkgPSBvRGF0YUZpZWxkLkNyaXRpY2FsaXR5O1xuXHRcdFx0Y29uc3Qgb0RhdGFGaWVsZEhpZGRlbiA9IG9EYXRhRmllbGRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdFx0aWYgKG9EYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgJiYgIWJJc0Fsd2F5c0RlZmF1bHQgJiYgb0NyaXRpY2FsaXR5UHJvcGVydHkpIHtcblx0XHRcdFx0aWYgKCFzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gJiYgb0RhdGFGaWVsZEhpZGRlbiA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdC8vIGlmIERhdGFGaWVsZCBpcyBzZXQgdG8gaGlkZGVuLCB3ZSBjYW4gc2tpcCBvdGhlciBjaGVja3MgYW5kIHJldHVybiBEZWZhdWx0IGJ1dHRvbiB0eXBlXG5cdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob0RhdGFGaWVsZEhpZGRlbiAmJiBvRGF0YUZpZWxkSGlkZGVuLiRQYXRoKSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiB2aXNpYmlsaXR5IG9mIGNyaXRpY2FsIGJ1dHRvbiBpcyBiYXNlZCBvbiBwYXRoLCBjb2xsZWN0IGFsbCBwYXRocyBmb3IgZXhwcmVzc2lvblxuXHRcdFx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoID0gb0RhdGFGaWVsZEhpZGRlbi4kUGF0aDtcblx0XHRcdFx0XHRpZiAoc0hpZGRlbkV4cHJlc3Npb24pIHtcblx0XHRcdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBcIiAmJiBcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiJXtcIiArIHNIaWRkZW5TaW1wbGVQYXRoICsgXCJ9ID09PSB0cnVlXCI7XG5cdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gXCJ7PSAoXCIgKyBzSGlkZGVuRXhwcmVzc2lvbiArIFwiKSA/ICdFbXBoYXNpemVkJyA6ICdEZWZhdWx0JyB9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3dpdGNoIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kRW51bU1lbWJlcikge1xuXHRcdFx0XHRcdC8vIHN1cHBvcnRlZCBjcml0aWNhbGl0eSBhcmUgW1Bvc2l0aXZlLzMvJzMnXSBhbmQgW05lZ2F0aXZlLzEvJzEnXVxuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIjpcblx0XHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlL1Bvc2l0aXZlXCI6XG5cdFx0XHRcdFx0Y2FzZSBcIjFcIjpcblx0XHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0Y2FzZSBcIjNcIjpcblx0XHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0XHRpZiAoIW9EYXRhRmllbGRIaWRkZW4pIHtcblx0XHRcdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdFx0XHRiSXNBbHdheXNEZWZhdWx0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiB8fCBCdXR0b25UeXBlLkRlZmF1bHQ7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID0gQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCkge1xuXHRcdFx0XHRcdC8vIHdoZW4gQ3JpdGljYWxpdHkgaXMgc2V0IHVzaW5nIGEgcGF0aCwgdXNlIHRoZSBwYXRoIGZvciBkZWR1Y2luZyB0aGUgRW1waHNpemVkIHR5cGUgZm9yIGRlZmF1bHQgUHJpbWFyeSBBY3Rpb25cblx0XHRcdFx0XHRjb25zdCBzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gPyBcIiEoXCIgKyBzSGlkZGVuRXhwcmVzc2lvbiArIFwiKSAmJiBcIiA6IFwiXCI7XG5cdFx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID1cblx0XHRcdFx0XHRcdFwiez0gXCIgK1xuXHRcdFx0XHRcdFx0c0NvbWJpbmVkSGlkZGVuRXhwcmVzc2lvbiArXG5cdFx0XHRcdFx0XHRcIigoJHtcIiArXG5cdFx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XHRcIn0gPT09ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmUnKSB8fCAoJHtcIiArXG5cdFx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XHRcIn0gPT09ICcxJykgfHwgKCR7XCIgK1xuXHRcdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFx0XCJ9ID09PSAxKSBcIiArXG5cdFx0XHRcdFx0XHRcInx8ICgke1wiICtcblx0XHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRcdG9Dcml0aWNhbGl0eVByb3BlcnR5LiRQYXRoICtcblx0XHRcdFx0XHRcdFwifSA9PT0gJzMnKSB8fCAoJHtcIiArXG5cdFx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XHRcIn0gPT09IDMpKSA/IFwiICtcblx0XHRcdFx0XHRcdFwiJ0RlZmF1bHQnXCIgK1xuXHRcdFx0XHRcdFx0XCIgOiBcIiArXG5cdFx0XHRcdFx0XHRcIidFbXBoYXNpemVkJ1wiICtcblx0XHRcdFx0XHRcdFwiIH1cIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbdkNvbGxlY3Rpb25Pck1ldGFNb2RlbF0gVGhlIGNvbGxlY3Rpb24gb3IgdGhlIG1ldGFkYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0ludGVyZmFjZV0gQ29udGFpbnMgdGhlIGNvbnRleHQsIHVzZWQgaW4gb0RhdGFDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgc3RpY2t5LCBgZmFsc2VgIG90aGVyd2lzZVxuXHQgKi9cblx0aXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkOiBmdW5jdGlvbih2Q29sbGVjdGlvbk9yTWV0YU1vZGVsOiBvYmplY3QgfCB1bmRlZmluZWQsIG9JbnRlcmZhY2U6IGFueSB8IHVuZGVmaW5lZCkge1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGlmIChvSW50ZXJmYWNlKSB7XG5cdFx0XHRvTWV0YU1vZGVsID0gb0ludGVyZmFjZS5jb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9NZXRhTW9kZWwgPSB2Q29sbGVjdGlvbk9yTWV0YU1vZGVsO1xuXHRcdH1cblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9NZXRhTW9kZWwpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHJldHVybnMgV2hldGhlciB0aGUgYWN0aW9uIHR5cGUgaXMgbWFuaWZlc3Qgb3Igbm90LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaXNNYW5pZmVzdEFjdGlvblZpc2libGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9BY3Rpb24gVGhlIGFjdGlvbiBvYmplY3Rcblx0ICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhY3Rpb24gaXMgY29taW5nIGZyb20gbWFuaWZlc3QsIGBmYWxzZWAgb3RoZXJ3aXNlXG5cdCAqL1xuXHRpc01hbmlmZXN0QWN0aW9uOiBmdW5jdGlvbihvQWN0aW9uOiBhbnkpIHtcblx0XHRjb25zdCBhQWN0aW9ucyA9IFtcblx0XHRcdFwiUHJpbWFyeVwiLFxuXHRcdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcdFwiU2Vjb25kYXJ5XCIsXG5cdFx0XHRcIkZvckFjdGlvblwiLFxuXHRcdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XHRcIlN3aXRjaFRvQWN0aXZlT2JqZWN0XCIsXG5cdFx0XHRcIlN3aXRjaFRvRHJhZnRPYmplY3RcIlxuXHRcdF07XG5cdFx0cmV0dXJuIGFBY3Rpb25zLmluZGV4T2Yob0FjdGlvbi50eXBlKSA8IDA7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgcmV0dXJucyB3aGV0aGVyIGZvb3RlciBpcyB2aXNpYmxlIG9yIG5vdCBvbiBvYmplY3QgLyBzdWIgb2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRGb290ZXJWaXNpYmxlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IG9Gb290ZXJBY3Rpb25zIFRoZSBmb290ZXIgYWN0aW9uIG9iamVjdCBjb21pbmcgZnJvbSBjb252ZXJ0b3Jcblx0ICogQHBhcmFtIHtBcnJheX0gYURhdGFGaWVsZHMgRGF0YSBmaWVsZCBhcnJheSBmb3Igbm9ybWFsIGZvb3RlciB2aXNpYmxpdHkgcHJvY2Vzc2luZ1xuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGN1c3RvbSBhY3Rpb25zIGFyZSBwcmVzZW50IG90aGVyd2lzZSBjYWxsIGZ1bmN0aW9uIHNob3dGb290ZXJcblx0ICovXG5cdGdldEZvb3RlclZpc2libGU6IGZ1bmN0aW9uKG9Gb290ZXJBY3Rpb25zOiBhbnlbXSwgYURhdGFGaWVsZHM6IGFueVtdKSB7XG5cdFx0bGV0IGJDdXN0b21BY3Rpb25GbGFnID0gZmFsc2U7XG5cdFx0b0Zvb3RlckFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbihhY3Rpb246IGFueSkge1xuXHRcdFx0Y29uc3QgaXNDdXN0b21BY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLmlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKTtcblx0XHRcdGlmIChpc0N1c3RvbUFjdGlvbikge1xuXHRcdFx0XHRiQ3VzdG9tQWN0aW9uRmxhZyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKGJDdXN0b21BY3Rpb25GbGFnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuc2hvd0Zvb3RlcihhRGF0YUZpZWxkcywgdHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogQnVpbGQgYW4gZXhwcmVzc2lvbiBjYWxsaW5nIGFuIGFjdGlvbiBoYW5kbGVyIHZpYSB0aGUgRlBNIGhlbHBlcidzIGFjdGlvbldyYXBwZXIgZnVuY3Rpb25cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlICdGUE0uYWN0aW9uV3JhcHBlcigpJyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgYXQgcnVudGltZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9BY3Rpb24gQWN0aW9uIG1ldGFkYXRhXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvQWN0aW9uLmhhbmRsZXJNb2R1bGUgTW9kdWxlIGNvbnRhaW5pbmcgdGhlIGFjdGlvbiBoYW5kbGVyIG1ldGhvZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gb0FjdGlvbi5oYW5kbGVyTWV0aG9kIEFjdGlvbiBoYW5kbGVyIG1ldGhvZCBuYW1lXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb1RoaXNdIGB0aGlzYCAoaWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGEgbWFjcm8pXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvVGhpcy5pZCBUaGUgdGFibGUncyBJRFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYWN0aW9uIHdyYXBwZXIgYmluZGluZ1x0ZXhwcmVzc2lvblxuXHQgKi9cblx0YnVpbGRBY3Rpb25XcmFwcGVyOiBmdW5jdGlvbihvQWN0aW9uOiB7IGhhbmRsZXJNb2R1bGU6IHN0cmluZzsgaGFuZGxlck1ldGhvZDogc3RyaW5nIH0sIG9UaGlzOiB7IGlkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGFQYXJhbXM6IGFueVtdID0gW3JlZihcIiRldmVudFwiKSwgb0FjdGlvbi5oYW5kbGVyTW9kdWxlLCBvQWN0aW9uLmhhbmRsZXJNZXRob2RdO1xuXG5cdFx0aWYgKG9UaGlzICYmIG9UaGlzLmlkKSB7XG5cdFx0XHRjb25zdCBvQWRkaXRpb25hbFBhcmFtcyA9IHtcblx0XHRcdFx0Y29udGV4dHM6IHJlZihcIiR7aW50ZXJuYWw+c2VsZWN0ZWRDb250ZXh0c31cIilcblx0XHRcdH07XG5cdFx0XHRhUGFyYW1zLnB1c2gob0FkZGl0aW9uYWxQYXJhbXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoZm4oXCJGUE0uYWN0aW9uV3JhcHBlclwiLCBhUGFyYW1zKSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCByZXR1cm5zIGFuIFZhcmlhbnRCYWNrUmVmZXJlbmNlIGV4cHJlc3Npb24gYmFzZWQgb24gdmFyaWFudE1hbmFnZW1lbnQgYW5kIG9Db252ZXJ0ZXJDb250ZXh0IHZhbHVlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0VmFyaWFudEJhY2tSZWZlcmVuY2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9WaWV3RGF0YSBPYmplY3QgQ29udGFpbmluZyBWaWV3IERhdGFcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db252ZXJ0ZXJDb250ZXh0IE9iamVjdCBjb250YWluaW5nIGNvbnZlcnRlZCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRnZXRWYXJpYW50QmFja1JlZmVyZW5jZTogZnVuY3Rpb24ob1ZpZXdEYXRhOiBhbnksIG9Db252ZXJ0ZXJDb250ZXh0OiBhbnkpIHtcblx0XHRpZiAob1ZpZXdEYXRhICYmIG9WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudCA9PT0gXCJQYWdlXCIpIHtcblx0XHRcdHJldHVybiBcImZlOjpQYWdlVmFyaWFudE1hbmFnZW1lbnRcIjtcblx0XHR9XG5cdFx0aWYgKG9WaWV3RGF0YSAmJiBvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiKSB7XG5cdFx0XHRyZXR1cm4gZ2VuZXJhdGUoW29Db252ZXJ0ZXJDb250ZXh0LmZpbHRlckJhcklkLCBcIlZhcmlhbnRNYW5hZ2VtZW50XCJdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSxcblx0Z2V0RGVmYXVsdFBhdGg6IGZ1bmN0aW9uKGFWaWV3czogYW55KSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVmlld3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChhVmlld3NbaV0uZGVmYXVsdFBhdGgpIHtcblx0XHRcdFx0cmV0dXJuIGFWaWV3c1tpXS5kZWZhdWx0UGF0aDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFubm90YXRpb25IZWxwZXI7XG4iXX0=