@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,204 +1,233 @@
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(
6
- [
7
- "sap/ui/core/service/Service",
8
- "sap/ui/core/service/ServiceFactory",
9
- "sap/ui/model/resource/ResourceModel",
10
- "sap/ui/core/cache/CacheManager",
11
- "sap/base/strings/hash"
12
- ],
13
- function(Service, ServiceFactory, ResourceModel, CacheManager, hash) {
14
- "use strict";
15
-
16
- function getMetadataETag(sUrl, sETag, mUpdatedMetaModelETags) {
17
- return new Promise(function(resolve, reject) {
18
- // There is an Url in the FE cache, that's not in the MetaModel yet -> we need to check the ETag
19
- jQuery
20
- .ajax(sUrl, { method: "GET" })
21
- .done(function(oResponse, sTextStatus, jqXHR) {
22
- // ETag is not the same -> invalid
23
- // ETag is the same -> valid
24
- // If ETag is available use it, otherwise use Last-Modified
25
- mUpdatedMetaModelETags[sUrl] = jqXHR.getResponseHeader("ETag") || jqXHR.getResponseHeader("Last-Modified");
26
- resolve(sETag === mUpdatedMetaModelETags[sUrl]);
27
- })
28
- .fail(function() {
29
- // Case 2z - Make sure we update the map so that we invalidate the cache
30
- mUpdatedMetaModelETags[sUrl] = "";
31
- resolve(false);
32
- });
33
- });
34
- }
35
-
36
- var CacheHandlerService = Service.extend("sap.fe.core.services.CacheHandlerService", {
37
- initPromise: null,
38
- init: function() {
39
- var that = this;
40
- var oContext = this.getContext();
41
- this.oFactory = oContext.factory;
42
- var mSettings = oContext.settings;
43
- if (!mSettings.metaModel) {
44
- throw new Error("a `metaModel` property is expected when instantiating the CacheHandlerService");
45
- }
46
- this.oMetaModel = mSettings.metaModel;
47
- this.oAppComponent = mSettings.appComponent;
48
- this.oComponent = mSettings.component;
49
- this.initPromise = this.oMetaModel.fetchEntityContainer().then(function() {
50
- return that;
51
- });
52
- this.mCacheNeedsInvalidate = {};
53
- },
54
- exit: function() {
55
- // Deregister global instance
56
- this.oFactory.removeGlobalInstance(this.oMetaModel);
57
- },
58
- validateCacheKey: function(sCacheIdentifier) {
59
- var that = this;
60
- // Keep track if the cache will anyway need to be updated
61
- var bCacheNeedUpdate = true;
62
- return CacheManager.get(sCacheIdentifier)
63
- .then(function(mCacheOutput) {
64
- // We provide a default key so that an xml view cache is written
65
- var mMetaModelETags = that.getETags();
66
- var sUpdatedCacheKey = JSON.stringify(mMetaModelETags);
67
- // Case #1a - No cache, so mCacheOuput is empty, cacheKey = current metamodel ETags
68
- if (mCacheOutput) {
69
- // Case #2 - Cache entry found, check if it's still valid
70
- var mUpdatedMetaModelETags = {};
71
- var mCachedETags = JSON.parse(mCacheOutput.cachedETags);
72
- return Promise.all(
73
- Object.keys(mCachedETags).map(function(sUrl) {
74
- // Check validity of every single Url that's in the FE Cache object
75
- if (mCachedETags[sUrl]) {
76
- if (mMetaModelETags[sUrl]) {
77
- // Case #2a - Same number of ETags in the cache and in the metadata
78
- mUpdatedMetaModelETags[sUrl] = mMetaModelETags[sUrl];
79
- return mCachedETags[sUrl] === mMetaModelETags[sUrl];
80
- } else {
81
- // Case #2b - No ETag in the cache for that URL, cachedETags was enhanced
82
- return getMetadataETag(sUrl, mCachedETags[sUrl], mUpdatedMetaModelETags);
83
- }
84
- } else {
85
- // Case #2z - Last Templating added an URL without ETag
86
- mUpdatedMetaModelETags[sUrl] = mMetaModelETags[sUrl];
87
- return mCachedETags[sUrl] === mMetaModelETags[sUrl];
88
- }
89
- })
90
- ).then(function(aValidETags) {
91
- bCacheNeedUpdate = aValidETags.indexOf(false) >= 0;
92
- // Case #2a - Same number of ETags and all valid -> we return the viewCacheKey
93
- // Case #2b - Different number of ETags and still all valid -> we return the viewCacheKey
94
- // Case #2c - Same number of ETags but different values, main service Etag has changed, use that as cache key
95
- // Case #2d - Different number of ETags but different value, main service Etag or linked service Etag has changed, new ETags should be used as cacheKey
96
- // Case #2z - Cache has an invalid Etag - if there is an Etag provided from MetaModel use it as cacheKey
97
- if (
98
- Object.keys(mUpdatedMetaModelETags).some(function(sUrl) {
99
- return !mUpdatedMetaModelETags[sUrl];
100
- })
101
- ) {
102
- // At least one of the MetaModel URLs doesn't provide an ETag, so no caching
103
- return null;
104
- } else {
105
- return bCacheNeedUpdate ? JSON.stringify(mUpdatedMetaModelETags) : mCacheOutput.viewCacheKey;
106
- }
107
- });
108
- } else if (
109
- Object.keys(mMetaModelETags).some(function(sUrl) {
110
- return !mMetaModelETags[sUrl];
111
- })
112
- ) {
113
- // Check if cache can be used (all the metadata and annotations have to provide at least a ETag or a Last-Modified header)
114
- // Case #1-b - No Cache, mCacheOuput is empty, but metamodel etags cannot be used, so no caching
115
- bCacheNeedUpdate = true;
116
- sUpdatedCacheKey = null;
117
- }
118
- return sUpdatedCacheKey;
119
- })
120
- .catch(function(e) {
121
- // Don't use view cache in case of issues with the LRU cache
122
- bCacheNeedUpdate = true;
123
- return null;
124
- })
125
- .then(function(sCacheKey) {
126
- that.mCacheNeedsInvalidate[sCacheIdentifier] = bCacheNeedUpdate;
127
- return sCacheKey;
128
- });
129
- },
130
- invalidateIfNeeded: function(sCacheKeys, sCacheIdentifier) {
131
- // Check FE cache after XML view is processed completely
132
- var sDataSourceETags = JSON.stringify(this.getETags());
133
- if (this.mCacheNeedsInvalidate[sCacheIdentifier] || (sCacheKeys && sCacheKeys !== sDataSourceETags)) {
134
- // Something in the sources and/or its ETags changed -> update the FE cache
135
- var mCacheKeys = {};
136
- // New ETags that need to be verified, may differ from the one used to generate the view
137
- mCacheKeys.cachedETags = sDataSourceETags;
138
- // Old ETags that are used for the xml view cache as key
139
- mCacheKeys.viewCacheKey = sCacheKeys;
140
- return CacheManager.set(sCacheIdentifier, mCacheKeys);
141
- } else {
142
- return Promise.resolve();
143
- }
144
- },
145
- getETags: function() {
146
- var mMetaModelETags = this.oMetaModel.getETags();
147
- // ETags from UI5 are either a Date or a string, let's rationalize that
148
- Object.keys(mMetaModelETags).forEach(function(sMetaModelKey) {
149
- if (mMetaModelETags[sMetaModelKey] instanceof Date) {
150
- // MetaModel contains a Last-Modified timestamp for the URL
151
- mMetaModelETags[sMetaModelKey] = mMetaModelETags[sMetaModelKey].toISOString();
152
- }
153
- });
154
-
155
- // add also the manifest hash as UI5 only considers the root component hash
156
- var oManifestContent = this.oAppComponent.getManifest();
157
- var sManifestHash = hash(
158
- JSON.stringify({
159
- sapApp: oManifestContent["sap.app"],
160
- viewData: this.oComponent.getViewData()
161
- })
162
- );
163
- mMetaModelETags["manifest"] = sManifestHash;
164
- return mMetaModelETags;
165
- }
166
- });
167
-
168
- return ServiceFactory.extend("sap.fe.core.services.CacheHandlerServiceFactory", {
169
- _oInstanceRegistry: {},
170
- createInstance: function(oServiceContext) {
171
- var sMetaModelId = oServiceContext.settings.metaModel.getId();
172
- if (!this._oInstanceRegistry[sMetaModelId]) {
173
- this._oInstanceRegistry[sMetaModelId] = new CacheHandlerService(
174
- Object.assign(
175
- {
176
- factory: this,
177
- scopeObject: null,
178
- scopeType: "service"
179
- },
180
- oServiceContext
181
- )
182
- );
183
- }
184
- var that = this;
185
- return this._oInstanceRegistry[sMetaModelId].initPromise
186
- .then(function() {
187
- return that._oInstanceRegistry[sMetaModelId];
188
- })
189
- .catch(function(e) {
190
- // In case of error delete the global instance;
191
- that._oInstanceRegistry[sMetaModelId] = null;
192
- throw e;
193
- });
194
- },
195
- getInstance: function(oMetaModel) {
196
- return this._oInstanceRegistry[oMetaModel.getId()];
197
- },
198
- removeGlobalInstance: function(oMetaModel) {
199
- this._oInstanceRegistry[oMetaModel.getId()] = null;
200
- }
201
- });
202
- },
203
- true
204
- );
5
+ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/core/cache/CacheManager", "sap/base/strings/hash", "sap/ui/thirdparty/jquery"], function (Service, ServiceFactory, CacheManager, hash, jQuery) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+
10
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
11
+
12
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
13
+
14
+ function getMetadataETag(sUrl, sETag, mUpdatedMetaModelETags) {
15
+ return new Promise(function (resolve) {
16
+ // There is an Url in the FE cache, that's not in the MetaModel yet -> we need to check the ETag
17
+ jQuery.ajax(sUrl, {
18
+ method: "GET"
19
+ }).done(function (oResponse, sTextStatus, jqXHR) {
20
+ // ETag is not the same -> invalid
21
+ // ETag is the same -> valid
22
+ // If ETag is available use it, otherwise use Last-Modified
23
+ mUpdatedMetaModelETags[sUrl] = jqXHR.getResponseHeader("ETag") || jqXHR.getResponseHeader("Last-Modified");
24
+ resolve(sETag === mUpdatedMetaModelETags[sUrl]);
25
+ }).fail(function () {
26
+ // Case 2z - Make sure we update the map so that we invalidate the cache
27
+ mUpdatedMetaModelETags[sUrl] = "";
28
+ resolve(false);
29
+ });
30
+ });
31
+ }
32
+
33
+ var CacheHandlerService = /*#__PURE__*/function (_Service) {
34
+ _inherits(CacheHandlerService, _Service);
35
+
36
+ function CacheHandlerService() {
37
+ return _Service.apply(this, arguments) || this;
38
+ }
39
+
40
+ _exports.CacheHandlerService = CacheHandlerService;
41
+ var _proto = CacheHandlerService.prototype;
42
+
43
+ _proto.init = function init() {
44
+ var _this = this;
45
+
46
+ var oContext = this.getContext();
47
+ this.oFactory = oContext.factory;
48
+ var mSettings = oContext.settings;
49
+
50
+ if (!mSettings.metaModel) {
51
+ throw new Error("a `metaModel` property is expected when instantiating the CacheHandlerService");
52
+ }
53
+
54
+ this.oMetaModel = mSettings.metaModel;
55
+ this.oAppComponent = mSettings.appComponent;
56
+ this.oComponent = mSettings.component;
57
+ this.initPromise = this.oMetaModel.fetchEntityContainer().then(function () {
58
+ return _this;
59
+ });
60
+ this.mCacheNeedsInvalidate = {};
61
+ };
62
+
63
+ _proto.exit = function exit() {
64
+ // Deregister global instance
65
+ this.oFactory.removeGlobalInstance(this.oMetaModel);
66
+ };
67
+
68
+ _proto.validateCacheKey = function validateCacheKey(sCacheIdentifier) {
69
+ var _this2 = this;
70
+
71
+ // Keep track if the cache will anyway need to be updated
72
+ var bCacheNeedUpdate = true;
73
+ return CacheManager.get(sCacheIdentifier).then(function (mCacheOutput) {
74
+ // We provide a default key so that an xml view cache is written
75
+ var mMetaModelETags = _this2.getETags();
76
+
77
+ var sUpdatedCacheKey = JSON.stringify(mMetaModelETags); // Case #1a - No cache, so mCacheOuput is empty, cacheKey = current metamodel ETags
78
+
79
+ if (mCacheOutput) {
80
+ // Case #2 - Cache entry found, check if it's still valid
81
+ var mUpdatedMetaModelETags = {};
82
+ var mCachedETags = JSON.parse(mCacheOutput.cachedETags);
83
+ return Promise.all(Object.keys(mCachedETags).map(function (sUrl) {
84
+ // Check validity of every single Url that's in the FE Cache object
85
+ if (mCachedETags[sUrl]) {
86
+ if (mMetaModelETags[sUrl]) {
87
+ // Case #2a - Same number of ETags in the cache and in the metadata
88
+ mUpdatedMetaModelETags[sUrl] = mMetaModelETags[sUrl];
89
+ return mCachedETags[sUrl] === mMetaModelETags[sUrl];
90
+ } else {
91
+ // Case #2b - No ETag in the cache for that URL, cachedETags was enhanced
92
+ return getMetadataETag(sUrl, mCachedETags[sUrl], mUpdatedMetaModelETags);
93
+ }
94
+ } else {
95
+ // Case #2z - Last Templating added an URL without ETag
96
+ mUpdatedMetaModelETags[sUrl] = mMetaModelETags[sUrl];
97
+ return mCachedETags[sUrl] === mMetaModelETags[sUrl];
98
+ }
99
+ })).then(function (aValidETags) {
100
+ bCacheNeedUpdate = aValidETags.indexOf(false) >= 0; // Case #2a - Same number of ETags and all valid -> we return the viewCacheKey
101
+ // Case #2b - Different number of ETags and still all valid -> we return the viewCacheKey
102
+ // Case #2c - Same number of ETags but different values, main service Etag has changed, use that as cache key
103
+ // Case #2d - Different number of ETags but different value, main service Etag or linked service Etag has changed, new ETags should be used as cacheKey
104
+ // Case #2z - Cache has an invalid Etag - if there is an Etag provided from MetaModel use it as cacheKey
105
+
106
+ if (Object.keys(mUpdatedMetaModelETags).some(function (sUrl) {
107
+ return !mUpdatedMetaModelETags[sUrl];
108
+ })) {
109
+ // At least one of the MetaModel URLs doesn't provide an ETag, so no caching
110
+ return null;
111
+ } else {
112
+ return bCacheNeedUpdate ? JSON.stringify(mUpdatedMetaModelETags) : mCacheOutput.viewCacheKey;
113
+ }
114
+ });
115
+ } else if (Object.keys(mMetaModelETags).some(function (sUrl) {
116
+ return !mMetaModelETags[sUrl];
117
+ })) {
118
+ // Check if cache can be used (all the metadata and annotations have to provide at least a ETag or a Last-Modified header)
119
+ // Case #1-b - No Cache, mCacheOuput is empty, but metamodel etags cannot be used, so no caching
120
+ bCacheNeedUpdate = true;
121
+ sUpdatedCacheKey = null;
122
+ }
123
+
124
+ return sUpdatedCacheKey;
125
+ }).catch(function () {
126
+ // Don't use view cache in case of issues with the LRU cache
127
+ bCacheNeedUpdate = true;
128
+ return null;
129
+ }).then(function (sCacheKey) {
130
+ _this2.mCacheNeedsInvalidate[sCacheIdentifier] = bCacheNeedUpdate;
131
+ return sCacheKey;
132
+ });
133
+ };
134
+
135
+ _proto.invalidateIfNeeded = function invalidateIfNeeded(sCacheKeys, sCacheIdentifier) {
136
+ // Check FE cache after XML view is processed completely
137
+ var sDataSourceETags = JSON.stringify(this.getETags());
138
+
139
+ if (this.mCacheNeedsInvalidate[sCacheIdentifier] || sCacheKeys && sCacheKeys !== sDataSourceETags) {
140
+ // Something in the sources and/or its ETags changed -> update the FE cache
141
+ var mCacheKeys = {}; // New ETags that need to be verified, may differ from the one used to generate the view
142
+
143
+ mCacheKeys.cachedETags = sDataSourceETags; // Old ETags that are used for the xml view cache as key
144
+
145
+ mCacheKeys.viewCacheKey = sCacheKeys;
146
+ return CacheManager.set(sCacheIdentifier, mCacheKeys);
147
+ } else {
148
+ return Promise.resolve();
149
+ }
150
+ };
151
+
152
+ _proto.getETags = function getETags() {
153
+ var mMetaModelETags = this.oMetaModel.getETags(); // ETags from UI5 are either a Date or a string, let's rationalize that
154
+
155
+ Object.keys(mMetaModelETags).forEach(function (sMetaModelKey) {
156
+ if (mMetaModelETags[sMetaModelKey] instanceof Date) {
157
+ // MetaModel contains a Last-Modified timestamp for the URL
158
+ mMetaModelETags[sMetaModelKey] = mMetaModelETags[sMetaModelKey].toISOString();
159
+ }
160
+ }); // add also the manifest hash as UI5 only considers the root component hash
161
+
162
+ var oManifestContent = this.oAppComponent.getManifest();
163
+ var sManifestHash = hash(JSON.stringify({
164
+ sapApp: oManifestContent["sap.app"],
165
+ viewData: this.oComponent.getViewData()
166
+ }));
167
+ mMetaModelETags["manifest"] = sManifestHash;
168
+ return mMetaModelETags;
169
+ };
170
+
171
+ _proto.getInterface = function getInterface() {
172
+ return this;
173
+ };
174
+
175
+ return CacheHandlerService;
176
+ }(Service);
177
+
178
+ _exports.CacheHandlerService = CacheHandlerService;
179
+
180
+ var CacheHandlerServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
181
+ _inherits(CacheHandlerServiceFactory, _ServiceFactory);
182
+
183
+ function CacheHandlerServiceFactory() {
184
+ var _this3;
185
+
186
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
187
+ args[_key] = arguments[_key];
188
+ }
189
+
190
+ _this3 = _ServiceFactory.call.apply(_ServiceFactory, [this].concat(args)) || this;
191
+ _this3._oInstanceRegistry = {};
192
+ return _this3;
193
+ }
194
+
195
+ var _proto2 = CacheHandlerServiceFactory.prototype;
196
+
197
+ _proto2.createInstance = function createInstance(oServiceContext) {
198
+ var _this4 = this;
199
+
200
+ var sMetaModelId = oServiceContext.settings.metaModel.getId();
201
+ var cacheHandlerInstance = this._oInstanceRegistry[sMetaModelId];
202
+
203
+ if (!cacheHandlerInstance) {
204
+ this._oInstanceRegistry[sMetaModelId] = cacheHandlerInstance = new CacheHandlerService(Object.assign({
205
+ factory: this,
206
+ scopeObject: null,
207
+ scopeType: "service"
208
+ }, oServiceContext));
209
+ }
210
+
211
+ return cacheHandlerInstance.initPromise.then(function () {
212
+ return _this4._oInstanceRegistry[sMetaModelId];
213
+ }).catch(function (e) {
214
+ // In case of error delete the global instance;
215
+ _this4._oInstanceRegistry[sMetaModelId] = null;
216
+ throw e;
217
+ });
218
+ };
219
+
220
+ _proto2.getInstance = function getInstance(oMetaModel) {
221
+ return this._oInstanceRegistry[oMetaModel.getId()];
222
+ };
223
+
224
+ _proto2.removeGlobalInstance = function removeGlobalInstance(oMetaModel) {
225
+ this._oInstanceRegistry[oMetaModel.getId()] = null;
226
+ };
227
+
228
+ return CacheHandlerServiceFactory;
229
+ }(ServiceFactory);
230
+
231
+ return CacheHandlerServiceFactory;
232
+ }, false);
233
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5LnRzIl0sIm5hbWVzIjpbImdldE1ldGFkYXRhRVRhZyIsInNVcmwiLCJzRVRhZyIsIm1VcGRhdGVkTWV0YU1vZGVsRVRhZ3MiLCJQcm9taXNlIiwicmVzb2x2ZSIsImpRdWVyeSIsImFqYXgiLCJtZXRob2QiLCJkb25lIiwib1Jlc3BvbnNlIiwic1RleHRTdGF0dXMiLCJqcVhIUiIsImdldFJlc3BvbnNlSGVhZGVyIiwiZmFpbCIsIkNhY2hlSGFuZGxlclNlcnZpY2UiLCJpbml0Iiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0ZhY3RvcnkiLCJmYWN0b3J5IiwibVNldHRpbmdzIiwic2V0dGluZ3MiLCJtZXRhTW9kZWwiLCJFcnJvciIsIm9NZXRhTW9kZWwiLCJvQXBwQ29tcG9uZW50IiwiYXBwQ29tcG9uZW50Iiwib0NvbXBvbmVudCIsImNvbXBvbmVudCIsImluaXRQcm9taXNlIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJ0aGVuIiwibUNhY2hlTmVlZHNJbnZhbGlkYXRlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwidmFsaWRhdGVDYWNoZUtleSIsInNDYWNoZUlkZW50aWZpZXIiLCJiQ2FjaGVOZWVkVXBkYXRlIiwiQ2FjaGVNYW5hZ2VyIiwiZ2V0IiwibUNhY2hlT3V0cHV0IiwibU1ldGFNb2RlbEVUYWdzIiwiZ2V0RVRhZ3MiLCJzVXBkYXRlZENhY2hlS2V5IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1DYWNoZWRFVGFncyIsInBhcnNlIiwiY2FjaGVkRVRhZ3MiLCJhbGwiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwiYVZhbGlkRVRhZ3MiLCJpbmRleE9mIiwic29tZSIsInZpZXdDYWNoZUtleSIsImNhdGNoIiwic0NhY2hlS2V5IiwiaW52YWxpZGF0ZUlmTmVlZGVkIiwic0NhY2hlS2V5cyIsInNEYXRhU291cmNlRVRhZ3MiLCJtQ2FjaGVLZXlzIiwic2V0IiwiZm9yRWFjaCIsInNNZXRhTW9kZWxLZXkiLCJEYXRlIiwidG9JU09TdHJpbmciLCJvTWFuaWZlc3RDb250ZW50IiwiZ2V0TWFuaWZlc3QiLCJzTWFuaWZlc3RIYXNoIiwiaGFzaCIsInNhcEFwcCIsInZpZXdEYXRhIiwiZ2V0Vmlld0RhdGEiLCJnZXRJbnRlcmZhY2UiLCJTZXJ2aWNlIiwiQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkiLCJfb0luc3RhbmNlUmVnaXN0cnkiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsInNNZXRhTW9kZWxJZCIsImdldElkIiwiY2FjaGVIYW5kbGVySW5zdGFuY2UiLCJhc3NpZ24iLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsImUiLCJnZXRJbnN0YW5jZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBUUEsV0FBU0EsZUFBVCxDQUF5QkMsSUFBekIsRUFBb0NDLEtBQXBDLEVBQWdEQyxzQkFBaEQsRUFBNkU7QUFDNUUsV0FBTyxJQUFJQyxPQUFKLENBQVksVUFBU0MsT0FBVCxFQUFrQjtBQUNwQztBQUNDQyxNQUFBQSxNQUFELENBQ0VDLElBREYsQ0FDT04sSUFEUCxFQUNhO0FBQUVPLFFBQUFBLE1BQU0sRUFBRTtBQUFWLE9BRGIsRUFFRUMsSUFGRixDQUVPLFVBQVNDLFNBQVQsRUFBeUJDLFdBQXpCLEVBQTJDQyxLQUEzQyxFQUF1RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQVQsUUFBQUEsc0JBQXNCLENBQUNGLElBQUQsQ0FBdEIsR0FBK0JXLEtBQUssQ0FBQ0MsaUJBQU4sQ0FBd0IsTUFBeEIsS0FBbUNELEtBQUssQ0FBQ0MsaUJBQU4sQ0FBd0IsZUFBeEIsQ0FBbEU7QUFDQVIsUUFBQUEsT0FBTyxDQUFDSCxLQUFLLEtBQUtDLHNCQUFzQixDQUFDRixJQUFELENBQWpDLENBQVA7QUFDQSxPQVJGLEVBU0VhLElBVEYsQ0FTTyxZQUFXO0FBQ2hCO0FBQ0FYLFFBQUFBLHNCQUFzQixDQUFDRixJQUFELENBQXRCLEdB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QUNBLEs7O1lBQ0RoRCxvQixHQUFBLDhCQUFxQlYsVUFBckIsRUFBaUQ7QUFDaEQsV0FBS3NELGtCQUFMLENBQXdCdEQsVUFBVSxDQUFDMEQsS0FBWCxFQUF4QixJQUE4QyxJQUE5QztBQUNBLEs7OztJQWpDdUNPLGM7O1NBb0MxQlosMEIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvY2FjaGUvQ2FjaGVNYW5hZ2VyXCI7XG5pbXBvcnQgaGFzaCBmcm9tIFwic2FwL2Jhc2Uvc3RyaW5ncy9oYXNoXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBVSUNvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvVUlDb21wb25lbnRcIjtcblxuZnVuY3Rpb24gZ2V0TWV0YWRhdGFFVGFnKHNVcmw6IGFueSwgc0VUYWc6IGFueSwgbVVwZGF0ZWRNZXRhTW9kZWxFVGFnczogYW55KSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG5cdFx0Ly8gVGhlcmUgaXMgYW4gVXJsIGluIHRoZSBGRSBjYWNoZSwgdGhhdCdzIG5vdCBpbiB0aGUgTWV0YU1vZGVsIHlldCAtPiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBFVGFnXG5cdFx0KGpRdWVyeSBhcyBhbnkpXG5cdFx0XHQuYWpheChzVXJsLCB7IG1ldGhvZDogXCJHRVRcIiB9KVxuXHRcdFx0LmRvbmUoZnVuY3Rpb24ob1Jlc3BvbnNlOiBhbnksIHNUZXh0U3RhdHVzOiBhbnksIGpxWEhSOiBhbnkpIHtcblx0XHRcdFx0Ly8gRVRhZyBpcyBub3QgdGhlIHNhbWUgLT4gaW52YWxpZFxuXHRcdFx0XHQvLyBFVGFnIGlzIHRoZSBzYW1lIC0+IHZhbGlkXG5cdFx0XHRcdC8vIElmIEVUYWcgaXMgYXZhaWxhYmxlIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSBMYXN0LU1vZGlmaWVkXG5cdFx0XHRcdG1VcGRhdGVkTWV0YU1vZGVsRVRhZ3Nbc1VybF0gPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcihcIkVUYWdcIikgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMYXN0LU1vZGlmaWVkXCIpO1xuXHRcdFx0XHRyZXNvbHZlKHNFVGFnID09PSBtVXBkYXRlZE1ldGFNb2RlbEVUYWdzW3NVcmxdKTtcblx0XHRcdH0pXG5cdFx0XHQuZmFpbChmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gQ2FzZSAyeiAtIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIG1hcCBzbyB0aGF0IHdlIGludmFsaWRhdGUgdGhlIGNhY2hlXG5cdFx0XHRcdG1VcGRhdGVkTWV0YU1vZGVsRVRhZ3Nbc1VybF0gPSBcIlwiO1xuXHRcdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdH0pO1xuXHR9KTtcbn1cbnR5cGUgQ2FjaGVIYW5kbGVyU2VydmljZVNldHRpbmdzID0ge1xuXHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsO1xufTtcblxuZXhwb3J0IGNsYXNzIENhY2hlSGFuZGxlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPENhY2hlSGFuZGxlclNlcnZpY2VTZXR0aW5ncz4ge1xuXHRyZXNvbHZlRm46IGFueTtcblx0cmVqZWN0Rm46IGFueTtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cblx0b0ZhY3RvcnkhOiBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeTtcblx0b01ldGFNb2RlbCE6IE9EYXRhTWV0YU1vZGVsO1xuXHRvQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRvQ29tcG9uZW50ITogVUlDb21wb25lbnQ7XG5cdG1DYWNoZU5lZWRzSW52YWxpZGF0ZTogYW55O1xuXG5cdGluaXQoKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHR0aGlzLm9GYWN0b3J5ID0gb0NvbnRleHQuZmFjdG9yeTtcblx0XHRjb25zdCBtU2V0dGluZ3MgPSBvQ29udGV4dC5zZXR0aW5ncztcblx0XHRpZiAoIW1TZXR0aW5ncy5tZXRhTW9kZWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImEgYG1ldGFNb2RlbGAgcHJvcGVydHkgaXMgZXhwZWN0ZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBDYWNoZUhhbmRsZXJTZXJ2aWNlXCIpO1xuXHRcdH1cblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBtU2V0dGluZ3MubWV0YU1vZGVsO1xuXHRcdHRoaXMub0FwcENvbXBvbmVudCA9IG1TZXR0aW5ncy5hcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5vQ29tcG9uZW50ID0gbVNldHRpbmdzLmNvbXBvbmVudDtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gKHRoaXMub01ldGFNb2RlbCBhcyBhbnkpLmZldGNoRW50aXR5Q29udGFpbmVyKCkudGhlbigoKSA9PiB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9KTtcblx0XHR0aGlzLm1DYWNoZU5lZWRzSW52YWxpZGF0ZSA9IHt9O1xuXHR9XG5cdGV4aXQoKSB7XG5cdFx0Ly8gRGVyZWdpc3RlciBnbG9iYWwgaW5zdGFuY2Vcblx0XHR0aGlzLm9GYWN0b3J5LnJlbW92ZUdsb2JhbEluc3RhbmNlKHRoaXMub01ldGFNb2RlbCk7XG5cdH1cblx0dmFsaWRhdGVDYWNoZUtleShzQ2FjaGVJZGVudGlmaWVyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdC8vIEtlZXAgdHJhY2sgaWYgdGhlIGNhY2hlIHdpbGwgYW55d2F5IG5lZWQgdG8gYmUgdXBkYXRlZFxuXHRcdGxldCBiQ2FjaGVOZWVkVXBkYXRlID0gdHJ1ZTtcblx0XHRyZXR1cm4gQ2FjaGVNYW5hZ2VyLmdldChzQ2FjaGVJZGVudGlmaWVyKVxuXHRcdFx0LnRoZW4oKG1DYWNoZU91dHB1dDogYW55KSA9PiB7XG5cdFx0XHRcdC8vIFdlIHByb3ZpZGUgYSBkZWZhdWx0IGtleSBzbyB0aGF0IGFuIHhtbCB2aWV3IGNhY2hlIGlzIHdyaXR0ZW5cblx0XHRcdFx0Y29uc3QgbU1ldGFNb2RlbEVUYWdzID0gdGhpcy5nZXRFVGFncygpO1xuXHRcdFx0XHRsZXQgc1VwZGF0ZWRDYWNoZUtleTogc3RyaW5nIHwgbnVsbCA9IEpTT04uc3RyaW5naWZ5KG1NZXRhTW9kZWxFVGFncyk7XG5cdFx0XHRcdC8vIENhc2UgIzFhIC0gTm8gY2FjaGUsIHNvIG1DYWNoZU91cHV0IGlzIGVtcHR5LCBjYWNoZUtleSA9IGN1cnJlbnQgbWV0YW1vZGVsIEVUYWdzXG5cdFx0XHRcdGlmIChtQ2FjaGVPdXRwdXQpIHtcblx0XHRcdFx0XHQvLyBDYXNlICMyIC0gQ2FjaGUgZW50cnkgZm91bmQsIGNoZWNrIGlmIGl0J3Mgc3RpbGwgdmFsaWRcblx0XHRcdFx0XHRjb25zdCBtVXBkYXRlZE1ldGFNb2RlbEVUYWdzOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRjb25zdCBtQ2FjaGVkRVRhZ3MgPSBKU09OLnBhcnNlKG1DYWNoZU91dHB1dC5jYWNoZWRFVGFncyk7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUNhY2hlZEVUYWdzKS5tYXAoZnVuY3Rpb24oc1VybDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIHZhbGlkaXR5IG9mIGV2ZXJ5IHNpbmdsZSBVcmwgdGhhdCdzIGluIHRoZSBGRSBDYWNoZSBvYmplY3Rcblx0XHRcdFx0XHRcdFx0aWYgKG1DYWNoZWRFVGFnc1tzVXJsXSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtTWV0YU1vZGVsRVRhZ3Nbc1VybF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENhc2UgIzJhIC0gU2FtZSBudW1iZXIgb2YgRVRhZ3MgaW4gdGhlIGNhY2hlIGFuZCBpbiB0aGUgbWV0YWRhdGFcblx0XHRcdFx0XHRcdFx0XHRcdG1VcGRhdGVkTWV0YU1vZGVsRVRhZ3Nbc1VybF0gPSBtTWV0YU1vZGVsRVRhZ3Nbc1VybF07XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbUNhY2hlZEVUYWdzW3NVcmxdID09PSBtTWV0YU1vZGVsRVRhZ3Nbc1VybF07XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENhc2UgIzJiIC0gTm8gRVRhZyBpbiB0aGUgY2FjaGUgZm9yIHRoYXQgVVJMLCBjYWNoZWRFVGFncyB3YXMgZW5oYW5jZWRcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBnZXRNZXRhZGF0YUVUYWcoc1VybCwgbUNhY2hlZEVUYWdzW3NVcmxdLCBtVXBkYXRlZE1ldGFNb2RlbEVUYWdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAjMnogLSBMYXN0IFRlbXBsYXRpbmcgYWRkZWQgYW4gVVJMIHdpdGhvdXQgRVRhZ1xuXHRcdFx0XHRcdFx0XHRcdG1VcGRhdGVkTWV0YU1vZGVsRVRhZ3Nbc1VybF0gPSBtTWV0YU1vZGVsRVRhZ3Nbc1VybF07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1DYWNoZWRFVGFnc1tzVXJsXSA9PT0gbU1ldGFNb2RlbEVUYWdzW3NVcmxdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCkudGhlbihmdW5jdGlvbihhVmFsaWRFVGFnczogYW55W10pIHtcblx0XHRcdFx0XHRcdGJDYWNoZU5lZWRVcGRhdGUgPSBhVmFsaWRFVGFncy5pbmRleE9mKGZhbHNlKSA+PSAwO1xuXHRcdFx0XHRcdFx0Ly8gQ2FzZSAjMmEgLSBTYW1lIG51bWJlciBvZiBFVGFncyBhbmQgYWxsIHZhbGlkIC0+IHdlIHJldHVybiB0aGUgdmlld0NhY2hlS2V5XG5cdFx0XHRcdFx0XHQvLyBDYXNlICMyYiAtIERpZmZlcmVudCBudW1iZXIgb2YgRVRhZ3MgYW5kIHN0aWxsIGFsbCB2YWxpZCAtPiB3ZSByZXR1cm4gdGhlIHZpZXdDYWNoZUtleVxuXHRcdFx0XHRcdFx0Ly8gQ2FzZSAjMmMgLSBTYW1lIG51bWJlciBvZiBFVGFncyBidXQgZGlmZmVyZW50IHZhbHVlcywgbWFpbiBzZXJ2aWNlIEV0YWcgaGFzIGNoYW5nZWQsIHVzZSB0aGF0IGFzIGNhY2hlIGtleVxuXHRcdFx0XHRcdFx0Ly8gQ2FzZSAjMmQgLSBEaWZmZXJlbnQgbnVtYmVyIG9mIEVUYWdzIGJ1dCBkaWZmZXJlbnQgdmFsdWUsIG1haW4gc2VydmljZSBFdGFnIG9yIGxpbmtlZCBzZXJ2aWNlIEV0YWcgaGFzIGNoYW5nZWQsIG5ldyBFVGFncyBzaG91bGQgYmUgdXNlZCBhcyBjYWNoZUtleVxuXHRcdFx0XHRcdFx0Ly8gQ2FzZSAjMnogLSBDYWNoZSBoYXMgYW4gaW52YWxpZCBFdGFnIC0gaWYgdGhlcmUgaXMgYW4gRXRhZyBwcm92aWRlZCBmcm9tIE1ldGFNb2RlbCB1c2UgaXQgYXMgY2FjaGVLZXlcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobVVwZGF0ZWRNZXRhTW9kZWxFVGFncykuc29tZShmdW5jdGlvbihzVXJsOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gIW1VcGRhdGVkTWV0YU1vZGVsRVRhZ3Nbc1VybF07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQXQgbGVhc3Qgb25lIG9mIHRoZSBNZXRhTW9kZWwgVVJMcyBkb2Vzbid0IHByb3ZpZGUgYW4gRVRhZywgc28gbm8gY2FjaGluZ1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBiQ2FjaGVOZWVkVXBkYXRlID8gSlNPTi5zdHJpbmdpZnkobVVwZGF0ZWRNZXRhTW9kZWxFVGFncykgOiBtQ2FjaGVPdXRwdXQudmlld0NhY2hlS2V5O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKG1NZXRhTW9kZWxFVGFncykuc29tZShmdW5jdGlvbihzVXJsOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiAhbU1ldGFNb2RlbEVUYWdzW3NVcmxdO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIENoZWNrIGlmIGNhY2hlIGNhbiBiZSB1c2VkIChhbGwgdGhlIG1ldGFkYXRhIGFuZCBhbm5vdGF0aW9ucyBoYXZlIHRvIHByb3ZpZGUgYXQgbGVhc3QgYSBFVGFnIG9yIGEgTGFzdC1Nb2RpZmllZCBoZWFkZXIpXG5cdFx0XHRcdFx0Ly8gQ2FzZSAjMS1iIC0gTm8gQ2FjaGUsIG1DYWNoZU91cHV0IGlzIGVtcHR5LCBidXQgbWV0YW1vZGVsIGV0YWdzIGNhbm5vdCBiZSB1c2VkLCBzbyBubyBjYWNoaW5nXG5cdFx0XHRcdFx0YkNhY2hlTmVlZFVwZGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0c1VwZGF0ZWRDYWNoZUtleSA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNVcGRhdGVkQ2FjaGVLZXk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0Ly8gRG9uJ3QgdXNlIHZpZXcgY2FjaGUgaW4gY2FzZSBvZiBpc3N1ZXMgd2l0aCB0aGUgTFJVIGNhY2hlXG5cdFx0XHRcdGJDYWNoZU5lZWRVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoc0NhY2hlS2V5OiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5tQ2FjaGVOZWVkc0ludmFsaWRhdGVbc0NhY2hlSWRlbnRpZmllcl0gPSBiQ2FjaGVOZWVkVXBkYXRlO1xuXHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0fSk7XG5cdH1cblx0aW52YWxpZGF0ZUlmTmVlZGVkKHNDYWNoZUtleXM6IHN0cmluZywgc0NhY2hlSWRlbnRpZmllcjogc3RyaW5nKSB7XG5cdFx0Ly8gQ2hlY2sgRkUgY2FjaGUgYWZ0ZXIgWE1MIHZpZXcgaXMgcHJvY2Vzc2VkIGNvbXBsZXRlbHlcblx0XHRjb25zdCBzRGF0YVNvdXJjZUVUYWdzID0gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRFVGFncygpKTtcblx0XHRpZiAodGhpcy5tQ2FjaGVOZWVkc0ludmFsaWRhdGVbc0NhY2hlSWRlbnRpZmllcl0gfHwgKHNDYWNoZUtleXMgJiYgc0NhY2hlS2V5cyAhPT0gc0RhdGFTb3VyY2VFVGFncykpIHtcblx0XHRcdC8vIFNvbWV0aGluZyBpbiB0aGUgc291cmNlcyBhbmQvb3IgaXRzIEVUYWdzIGNoYW5nZWQgLT4gdXBkYXRlIHRoZSBGRSBjYWNoZVxuXHRcdFx0Y29uc3QgbUNhY2hlS2V5czogYW55ID0ge307XG5cdFx0XHQvLyBOZXcgRVRhZ3MgdGhhdCBuZWVkIHRvIGJlIHZlcmlmaWVkLCBtYXkgZGlmZmVyIGZyb20gdGhlIG9uZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB2aWV3XG5cdFx0XHRtQ2FjaGVLZXlzLmNhY2hlZEVUYWdzID0gc0RhdGFTb3VyY2VFVGFncztcblx0XHRcdC8vIE9sZCBFVGFncyB0aGF0IGFyZSB1c2VkIGZvciB0aGUgeG1sIHZpZXcgY2FjaGUgYXMga2V5XG5cdFx0XHRtQ2FjaGVLZXlzLnZpZXdDYWNoZUtleSA9IHNDYWNoZUtleXM7XG5cdFx0XHRyZXR1cm4gQ2FjaGVNYW5hZ2VyLnNldChzQ2FjaGVJZGVudGlmaWVyLCBtQ2FjaGVLZXlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXHRnZXRFVGFncygpIHtcblx0XHRjb25zdCBtTWV0YU1vZGVsRVRhZ3MgPSAodGhpcy5vTWV0YU1vZGVsIGFzIGFueSkuZ2V0RVRhZ3MoKTtcblx0XHQvLyBFVGFncyBmcm9tIFVJNSBhcmUgZWl0aGVyIGEgRGF0ZSBvciBhIHN0cmluZywgbGV0J3MgcmF0aW9uYWxpemUgdGhhdFxuXHRcdE9iamVjdC5rZXlzKG1NZXRhTW9kZWxFVGFncykuZm9yRWFjaChmdW5jdGlvbihzTWV0YU1vZGVsS2V5OiBzdHJpbmcpIHtcblx0XHRcdGlmIChtTWV0YU1vZGVsRVRhZ3Nbc01ldGFNb2RlbEtleV0gaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRcdC8vIE1ldGFNb2RlbCBjb250YWlucyBhIExhc3QtTW9kaWZpZWQgdGltZXN0YW1wIGZvciB0aGUgVVJMXG5cdFx0XHRcdG1NZXRhTW9kZWxFVGFnc1tzTWV0YU1vZGVsS2V5XSA9IG1NZXRhTW9kZWxFVGFnc1tzTWV0YU1vZGVsS2V5XS50b0lTT1N0cmluZygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gYWRkIGFsc28gdGhlIG1hbmlmZXN0IGhhc2ggYXMgVUk1IG9ubHkgY29uc2lkZXJzIHRoZSByb290IGNvbXBvbmVudCBoYXNoXG5cdFx0Y29uc3Qgb01hbmlmZXN0Q29udGVudDogYW55ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KCk7XG5cdFx0Y29uc3Qgc01hbmlmZXN0SGFzaCA9IGhhc2goXG5cdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdHNhcEFwcDogb01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0sXG5cdFx0XHRcdHZpZXdEYXRhOiAodGhpcy5vQ29tcG9uZW50IGFzIGFueSkuZ2V0Vmlld0RhdGEoKVxuXHRcdFx0fSlcblx0XHQpO1xuXHRcdG1NZXRhTW9kZWxFVGFnc1tcIm1hbmlmZXN0XCJdID0gc01hbmlmZXN0SGFzaDtcblx0XHRyZXR1cm4gbU1ldGFNb2RlbEVUYWdzO1xuXHR9XG5cdGdldEludGVyZmFjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8Q2FjaGVIYW5kbGVyU2VydmljZVNldHRpbmdzPiB7XG5cdF9vSW5zdGFuY2VSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgQ2FjaGVIYW5kbGVyU2VydmljZSB8IG51bGw+ID0ge307XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Q2FjaGVIYW5kbGVyU2VydmljZVNldHRpbmdzPikge1xuXHRcdGNvbnN0IHNNZXRhTW9kZWxJZCA9IG9TZXJ2aWNlQ29udGV4dC5zZXR0aW5ncy5tZXRhTW9kZWwuZ2V0SWQoKTtcblx0XHRsZXQgY2FjaGVIYW5kbGVySW5zdGFuY2UgPSB0aGlzLl9vSW5zdGFuY2VSZWdpc3RyeVtzTWV0YU1vZGVsSWRdO1xuXHRcdGlmICghY2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX29JbnN0YW5jZVJlZ2lzdHJ5W3NNZXRhTW9kZWxJZF0gPSBjYWNoZUhhbmRsZXJJbnN0YW5jZSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlKFxuXHRcdFx0XHRPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGZhY3Rvcnk6IHRoaXMsXG5cdFx0XHRcdFx0XHRzY29wZU9iamVjdDogbnVsbCxcblx0XHRcdFx0XHRcdHNjb3BlVHlwZTogXCJzZXJ2aWNlXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9TZXJ2aWNlQ29udGV4dFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZUhhbmRsZXJJbnN0YW5jZS5pbml0UHJvbWlzZVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fb0luc3RhbmNlUmVnaXN0cnlbc01ldGFNb2RlbElkXSBhcyBDYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgZXJyb3IgZGVsZXRlIHRoZSBnbG9iYWwgaW5zdGFuY2U7XG5cdFx0XHRcdHRoaXMuX29JbnN0YW5jZVJlZ2lzdHJ5W3NNZXRhTW9kZWxJZF0gPSBudWxsO1xuXHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0fSk7XG5cdH1cblx0Z2V0SW5zdGFuY2Uob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0XHRyZXR1cm4gdGhpcy5fb0luc3RhbmNlUmVnaXN0cnlbb01ldGFNb2RlbC5nZXRJZCgpXTtcblx0fVxuXHRyZW1vdmVHbG9iYWxJbnN0YW5jZShvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCkge1xuXHRcdHRoaXMuX29JbnN0YW5jZVJlZ2lzdHJ5W29NZXRhTW9kZWwuZ2V0SWQoKV0gPSBudWxsO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5O1xuIl19