@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,480 +1,431 @@
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/core/service/ServiceFactoryRegistry",
10
- "sap/ui/model/base/ManagedObjectModel",
11
- "sap/ui/model/resource/ResourceModel",
12
- "sap/ui/core/mvc/View",
13
- "sap/ui/core/Component",
14
- "sap/ui/model/json/JSONModel",
15
- "sap/base/Log",
16
- "sap/fe/core/TemplateModel",
17
- "sap/fe/core/helpers/DynamicAnnotationPathHelper",
18
- "sap/ui/core/cache/CacheManager",
19
- "sap/ui/VersionInfo",
20
- "sap/ui/Device"
21
- ],
22
- function(
23
- Service,
24
- ServiceFactory,
25
- ServiceFactoryRegistry,
26
- ManagedObjectModel,
27
- ResourceModel,
28
- View,
29
- Component,
30
- JSONModel,
31
- Log,
32
- TemplateModel,
33
- DynamicAnnotationPathHelper,
34
- CacheManager,
35
- VersionInfo,
36
- Device
37
- ) {
38
- "use strict";
39
-
40
- var TemplatedViewService = Service.extend("sap.fe.core.services.TemplatedViewService", {
41
- initPromise: null,
42
- init: function() {
43
- var that = this;
44
- var aServiceDependencies = [];
45
- var oContext = this.getContext();
46
- var oComponent = oContext.scopeObject;
47
- var oAppComponent = Component.getOwnerComponentFor(oComponent);
48
- var oMetaModel = oAppComponent.getMetaModel();
49
- var sStableId = oAppComponent.getMetadata().getComponentName() + "::" + oAppComponent.getLocalId(oComponent.getId());
50
- var aEnhanceI18n = oComponent.getEnhanceI18n() || [];
51
- var sAppNamespace;
52
-
53
- if (aEnhanceI18n) {
54
- sAppNamespace = oAppComponent.getMetadata().getComponentName();
55
- for (var i = 0; i < aEnhanceI18n.length; i++) {
56
- // In order to support text-verticalization applications can also passs a resource model defined in the manifest
57
- // UI5 takes care of text-verticalization for resource models defined in the manifest
58
- // Hence check if the given key is a resource model defined in the manifest
59
- // if so this model should be used to enhance the sap.fe resource model so pass it as it is
60
- var oResourceModel = oAppComponent.getModel(aEnhanceI18n[i]);
61
- if (oResourceModel && oResourceModel.isA("sap.ui.model.resource.ResourceModel")) {
62
- aEnhanceI18n[i] = oResourceModel;
63
- } else {
64
- aEnhanceI18n[i] = sAppNamespace + "." + aEnhanceI18n[i].replace(".properties", "");
65
- }
66
- }
67
- }
68
-
69
- var sCacheIdentifier =
70
- oAppComponent.getMetadata().getName() +
71
- "_" +
72
- sStableId +
73
- "_" +
74
- sap.ui
75
- .getCore()
76
- .getConfiguration()
77
- .getLanguageTag();
78
- aServiceDependencies.push(
79
- ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService")
80
- .createInstance({
81
- scopeType: "component",
82
- scopeObject: oComponent,
83
- settings: {
84
- bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
85
- enhanceI18n: aEnhanceI18n,
86
- modelName: "sap.fe.i18n"
87
- }
88
- })
89
- .then(function(oResourceModelService) {
90
- that.oResourceModelService = oResourceModelService;
91
- return oResourceModelService.getResourceModel();
92
- })
93
- );
94
-
95
- aServiceDependencies.push(
96
- ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService")
97
- .createInstance({
98
- settings: {
99
- metaModel: oMetaModel,
100
- appComponent: oAppComponent,
101
- component: oComponent
102
- }
103
- })
104
- .then(function(oCacheHandlerService) {
105
- that.oCacheHandlerService = oCacheHandlerService;
106
- return oCacheHandlerService.validateCacheKey(sCacheIdentifier);
107
- })
108
- );
109
- aServiceDependencies.push(
110
- VersionInfo.load()
111
- .then(function(oInfo) {
112
- var sTimestamp = "";
113
- if (!oInfo.libraries) {
114
- sTimestamp = sap.ui.buildinfo.buildtime;
115
- } else {
116
- oInfo.libraries.forEach(function(oLibrary) {
117
- sTimestamp += oLibrary.buildTimestamp;
118
- });
119
- }
120
- return sTimestamp;
121
- })
122
- .catch(function() {
123
- return "<NOVALUE>";
124
- })
125
- );
126
-
127
- var sPageModelCacheKey = "";
128
- this.initPromise = Promise.all(aServiceDependencies)
129
- .then(function(aDependenciesResult) {
130
- var sCacheKey = aDependenciesResult[1];
131
- var sVersionInfo = aDependenciesResult[2];
132
- var oShellServices = oAppComponent.getShellServices();
133
- var oSideEffectsServices = oAppComponent.getSideEffectsService();
134
-
135
- oSideEffectsServices.initializeSideEffects(oAppComponent.getEnvironmentCapabilities().getCapabilities());
136
-
137
- sPageModelCacheKey =
138
- sCacheKey + "-" + sVersionInfo + "-" + sStableId + "-" + oShellServices.instanceType + "-pageModel";
139
- return Promise.all(aDependenciesResult.concat([that._getCachedModel(sPageModelCacheKey)]));
140
- })
141
- .then(function(aDependenciesResult) {
142
- var oResourceModel = aDependenciesResult[0];
143
- var sCacheKey = aDependenciesResult[1];
144
- var oPageModelCache = aDependenciesResult[3];
145
- return new Promise(function(resolve) {
146
- sap.ui.require(
147
- ["sap/fe/core/converters/TemplateConverter", "sap/fe/core/converters/MetaModelConverter"],
148
- function(TemplateConverter, MetaModelConverter) {
149
- resolve(
150
- that.createView(
151
- oResourceModel,
152
- sStableId,
153
- sCacheKey,
154
- sPageModelCacheKey,
155
- oPageModelCache,
156
- TemplateConverter,
157
- MetaModelConverter
158
- )
159
- );
160
- }
161
- );
162
- });
163
- })
164
- .then(function(sCacheKey) {
165
- var oCacheHandlerService = ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").getInstance(
166
- oMetaModel
167
- );
168
- oCacheHandlerService.invalidateIfNeeded(sCacheKey, sCacheIdentifier);
169
- });
170
- },
171
- _getCachedModel: function(sCacheKey) {
172
- if (
173
- sap.ui
174
- .getCore()
175
- .getConfiguration()
176
- .getViewCache()
177
- ) {
178
- return CacheManager.get(sCacheKey);
179
- }
180
- return undefined;
181
- },
182
- _setCachedModel: function(sCacheKey, oCacheModel) {
183
- if (
184
- sap.ui
185
- .getCore()
186
- .getConfiguration()
187
- .getViewCache()
188
- ) {
189
- CacheManager.set(sCacheKey, oCacheModel);
190
- }
191
- return undefined;
192
- },
193
- /**
194
- * Refresh the current view using the same configuration as before.
195
- * This is useful for our demokit !
196
- *
197
- * @param oComponent
198
- * @returns {Promise<void>}
199
- * @private
200
- */
201
- refreshView: function(oComponent) {
202
- var that = this;
203
- var oRootView = oComponent.getRootControl();
204
- if (oRootView) {
205
- oRootView.destroy();
206
- } else if (that.oView) {
207
- that.oView.destroy();
208
- }
209
- return that
210
- .createView(that.resourceModel, that.stableId, "", "", undefined, that.TemplateConverter, that.MetaModelConverter)
211
- .then(function() {
212
- oComponent.oContainer.invalidate();
213
- })
214
- .catch(function(oError) {
215
- oComponent.oContainer.invalidate();
216
- Log.error(oError);
217
- });
218
- },
219
- createView: function(
220
- oResourceModel,
221
- sStableId,
222
- sCacheKey,
223
- sPageModelCacheKey,
224
- oPageModelCache,
225
- TemplateConverter,
226
- MetaModelConverter
227
- ) {
228
- var that = this;
229
- that.resourceModel = oResourceModel;
230
- that.stableId = sStableId;
231
- that.TemplateConverter = TemplateConverter;
232
- that.MetaModelConverter = MetaModelConverter;
233
- var oContext = this.getContext(),
234
- mServiceSettings = oContext.settings,
235
- sConverterType = mServiceSettings.converterType,
236
- oComponent = oContext.scopeObject,
237
- oAppComponent = Component.getOwnerComponentFor(oComponent),
238
- sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent).options.settings
239
- .fullContextPath,
240
- oMetaModel = oAppComponent.getMetaModel(),
241
- oManifestContent = oAppComponent.getManifest(),
242
- oDeviceModel = new JSONModel(sap.ui.Device).setDefaultBindingMode("OneWay"),
243
- oManifestModel = new JSONModel(oManifestContent),
244
- bError = false,
245
- oPageModel,
246
- oViewDataModel,
247
- oViewSettings,
248
- mViewData;
249
-
250
- this.oFactory = oContext.factory;
251
-
252
- function getViewSettings() {
253
- var aSplitPath = sFullContextPath.split("/");
254
- var sEntitySetPath = aSplitPath.reduce(function(sPathSoFar, sNextPathPart) {
255
- if (sNextPathPart === "") {
256
- return sPathSoFar;
257
- }
258
- if (sPathSoFar === "") {
259
- sPathSoFar = "/" + sNextPathPart;
260
- } else {
261
- var oTarget = oMetaModel.getObject(sPathSoFar + "/$NavigationPropertyBinding/" + sNextPathPart);
262
- if (oTarget && Object.keys(oTarget).length > 0) {
263
- sPathSoFar += "/$NavigationPropertyBinding";
264
- }
265
- sPathSoFar += "/" + sNextPathPart;
266
- }
267
- return sPathSoFar;
268
- }, "");
269
- var oViewSettings = {
270
- type: "XML",
271
- preprocessors: {
272
- xml: {
273
- bindingContexts: {
274
- entitySet: sEntitySetPath ? oMetaModel.createBindingContext(sEntitySetPath) : null,
275
- fullContextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
276
- contextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
277
- converterContext: oPageModel.createBindingContext("/", null, { noResolve: true }),
278
- viewData: mViewData ? oViewDataModel.createBindingContext("/") : null
279
- },
280
- models: {
281
- entitySet: oMetaModel,
282
- fullContextPath: oMetaModel,
283
- contextPath: oMetaModel,
284
- "sap.fe.i18n": oResourceModel,
285
- metaModel: oMetaModel,
286
- "device": oDeviceModel, // TODO: discuss names here
287
- manifest: oManifestModel,
288
- converterContext: oPageModel,
289
- viewData: oViewDataModel
290
- },
291
- appComponent: oAppComponent
292
- }
293
- },
294
- id: sStableId,
295
- viewName: mServiceSettings.viewName || oComponent.getViewName(),
296
- viewData: mViewData,
297
- cache: { keys: [sCacheKey] },
298
- models: {
299
- "sap.fe.i18n": oResourceModel
300
- },
301
- height: "100%"
302
- };
303
- return oViewSettings;
304
- }
305
- function createErrorPage(reason) {
306
- // just replace the view name and add an additional model containing the reason, but
307
- // keep the other settings
308
- Log.error(reason.message, reason);
309
- oViewSettings.viewName = mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage";
310
- oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
311
-
312
- return oComponent.runAsOwner(function() {
313
- return View.create(oViewSettings).then(function(oView) {
314
- that.oView = oView;
315
- that.oView.setModel(new ManagedObjectModel(that.oView), "$view");
316
- oComponent.setAggregation("rootControl", that.oView);
317
- return sCacheKey;
318
- });
319
- });
320
- }
321
- return oAppComponent
322
- .getService("routingService")
323
- .then(function(oRoutingService) {
324
- // Retrieve the viewLevel for the component
325
- var oTargetInfo = oRoutingService.getTargetInformationFor(oComponent);
326
- var mOutbounds =
327
- oManifestContent["sap.app"] &&
328
- oManifestContent["sap.app"].crossNavigation &&
329
- oManifestContent["sap.app"].crossNavigation.outbounds;
330
- var mNavigation = oComponent.getNavigation() || {};
331
- Object.keys(mNavigation).forEach(function(navigationObjectKey) {
332
- var navigationObject = mNavigation[navigationObjectKey];
333
- var outboundConfig;
334
- if (
335
- navigationObject.detail &&
336
- navigationObject.detail.outbound &&
337
- mOutbounds[navigationObject.detail.outbound]
338
- ) {
339
- outboundConfig = mOutbounds[navigationObject.detail.outbound];
340
- navigationObject.detail.outboundDetail = {
341
- semanticObject: outboundConfig.semanticObject,
342
- action: outboundConfig.action,
343
- parameters: outboundConfig.parameters
344
- };
345
- }
346
- if (
347
- navigationObject.create &&
348
- navigationObject.create.outbound &&
349
- mOutbounds[navigationObject.create.outbound]
350
- ) {
351
- outboundConfig = mOutbounds[navigationObject.create.outbound];
352
- navigationObject.create.outboundDetail = {
353
- semanticObject: outboundConfig.semanticObject,
354
- action: outboundConfig.action,
355
- parameters: outboundConfig.parameters
356
- };
357
- }
358
- });
359
- mViewData = {
360
- navigation: mNavigation,
361
- viewLevel: oTargetInfo.viewLevel,
362
- stableId: sStableId,
363
- contentDensities: oManifestContent["sap.ui5"].contentDensities,
364
- resourceBundle: oResourceModel.__bundle,
365
- fullContextPath: sFullContextPath,
366
- isDesktop: Device.system.desktop
367
- };
368
-
369
- if (oComponent.getViewData) {
370
- Object.assign(mViewData, oComponent.getViewData());
371
- }
372
-
373
- var oShellServices = oAppComponent.getShellServices();
374
- mViewData.converterType = sConverterType;
375
- mViewData.shellContentDensity = oShellServices.getContentDensity();
376
- oViewDataModel = new JSONModel(mViewData);
377
- if (mViewData && mViewData.controlConfiguration) {
378
- Object.keys(mViewData.controlConfiguration).forEach(function(sAnnotationPath) {
379
- if (sAnnotationPath.indexOf("[") !== -1) {
380
- var sTargetAnnotationPath = DynamicAnnotationPathHelper.resolveDynamicExpression(
381
- sAnnotationPath,
382
- oMetaModel
383
- );
384
- mViewData.controlConfiguration[sTargetAnnotationPath] = mViewData.controlConfiguration[sAnnotationPath];
385
- }
386
- });
387
- }
388
- MetaModelConverter.convertTypes(oMetaModel, oAppComponent.getEnvironmentCapabilities().getCapabilities());
389
- oPageModel = new TemplateModel(function() {
390
- try {
391
- if (!!oPageModelCache) {
392
- return oPageModelCache;
393
- } else {
394
- var oDiagnostics = oAppComponent.getDiagnostics();
395
- var iIssueCount = oDiagnostics.getIssues().length;
396
- var oConverterPageModel = TemplateConverter.convertPage(
397
- sConverterType,
398
- oMetaModel,
399
- mViewData,
400
- oDiagnostics,
401
- sFullContextPath,
402
- oAppComponent.getEnvironmentCapabilities().getCapabilities()
403
- );
404
-
405
- var aIssues = oDiagnostics.getIssues();
406
- var aAddedIssues = aIssues.slice(iIssueCount);
407
- if (aAddedIssues.length > 0) {
408
- Log.warning(
409
- "Some issues have been detected in your project, please check the UI5 support assistant rule for sap.fe.core"
410
- );
411
- }
412
- // Fire and forget in the cache
413
- that._setCachedModel(sPageModelCacheKey, oConverterPageModel);
414
- return oConverterPageModel;
415
- }
416
- } catch (error) {
417
- Log.error(error, error);
418
- return {};
419
- }
420
- }, oMetaModel);
421
-
422
- if (!bError) {
423
- oViewSettings = getViewSettings();
424
- // Setting the pageModel on the component for potential reuse
425
- oComponent.setModel(oPageModel, "_pageModel");
426
- return oComponent.runAsOwner(function() {
427
- return View.create(oViewSettings)
428
- .catch(createErrorPage)
429
- .then(function(oView) {
430
- that.oView = oView;
431
- that.oView.setModel(new ManagedObjectModel(that.oView), "$view");
432
- that.oView.setModel(oViewDataModel, "viewData");
433
- oComponent.setAggregation("rootControl", that.oView);
434
- return sCacheKey;
435
- })
436
- .catch(Log.error);
437
- });
438
- }
439
- })
440
- .catch(function(error) {
441
- Log.error(error.message, error);
442
- throw new Error("Error while creating view : " + error);
443
- });
444
- },
445
- getView: function() {
446
- return this.oView;
447
- },
448
- exit: function() {
449
- // Deregister global instance
450
- this.oResourceModelService && this.oResourceModelService.destroy();
451
- this.oCacheHandlerService && this.oCacheHandlerService.destroy();
452
- this.oFactory.removeGlobalInstance();
453
- }
454
- });
455
-
456
- var oServiceFactory = ServiceFactory.extend("sap.fe.core.services.TemplatedViewServiceFactory", {
457
- _oInstanceRegistry: {},
458
- iCreatingViews: 0,
459
- createInstance: function(oServiceContext) {
460
- oServiceFactory.prototype.iCreatingViews++;
461
-
462
- var oTemplatedViewService = new TemplatedViewService(Object.assign({ factory: this }, oServiceContext));
463
- return oTemplatedViewService.initPromise.then(function() {
464
- oServiceFactory.prototype.iCreatingViews--;
465
- return oTemplatedViewService;
466
- });
467
- },
468
- removeGlobalInstance: function() {
469
- this._oInstanceRegistry = {};
470
- }
471
- });
472
-
473
- oServiceFactory.getNumberOfViewsInCreationState = function() {
474
- return oServiceFactory.prototype.iCreatingViews;
475
- };
476
-
477
- return oServiceFactory;
478
- },
479
- true
480
- );
5
+ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/core/service/ServiceFactoryRegistry", "sap/ui/model/base/ManagedObjectModel", "sap/ui/core/mvc/View", "sap/ui/core/Component", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/TemplateModel", "sap/ui/core/cache/CacheManager", "sap/ui/VersionInfo", "sap/ui/Device", "sap/base/util/UriParameters", "../helpers/DynamicAnnotationPathHelper"], function (Service, ServiceFactory, ServiceFactoryRegistry, ManagedObjectModel, View, Component, JSONModel, Log, TemplateModel, CacheManager, VersionInfo, Device, UriParameters, DynamicAnnotationPathHelper) {
6
+ "use strict";
7
+
8
+ var resolveDynamicExpression = DynamicAnnotationPathHelper.resolveDynamicExpression;
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
+ var TemplatedViewService = /*#__PURE__*/function (_Service) {
15
+ _inherits(TemplatedViewService, _Service);
16
+
17
+ function TemplatedViewService() {
18
+ return _Service.apply(this, arguments) || this;
19
+ }
20
+
21
+ var _proto = TemplatedViewService.prototype;
22
+
23
+ _proto.init = function init() {
24
+ var _this = this;
25
+
26
+ var aServiceDependencies = [];
27
+ var oContext = this.getContext();
28
+ var oComponent = oContext.scopeObject;
29
+ var oAppComponent = Component.getOwnerComponentFor(oComponent);
30
+ var oMetaModel = oAppComponent.getMetaModel();
31
+ var sStableId = oAppComponent.getMetadata().getComponentName() + "::" + oAppComponent.getLocalId(oComponent.getId());
32
+ var aEnhanceI18n = oComponent.getEnhanceI18n() || [];
33
+ var sAppNamespace;
34
+ this.oFactory = oContext.factory;
35
+
36
+ if (aEnhanceI18n) {
37
+ sAppNamespace = oAppComponent.getMetadata().getComponentName();
38
+
39
+ for (var i = 0; i < aEnhanceI18n.length; i++) {
40
+ // In order to support text-verticalization applications can also passs a resource model defined in the manifest
41
+ // UI5 takes care of text-verticalization for resource models defined in the manifest
42
+ // Hence check if the given key is a resource model defined in the manifest
43
+ // if so this model should be used to enhance the sap.fe resource model so pass it as it is
44
+ var oResourceModel = oAppComponent.getModel(aEnhanceI18n[i]);
45
+
46
+ if (oResourceModel && oResourceModel.isA("sap.ui.model.resource.ResourceModel")) {
47
+ aEnhanceI18n[i] = oResourceModel;
48
+ } else {
49
+ aEnhanceI18n[i] = sAppNamespace + "." + aEnhanceI18n[i].replace(".properties", "");
50
+ }
51
+ }
52
+ }
53
+
54
+ var sCacheIdentifier = oAppComponent.getMetadata().getName() + "_" + sStableId + "_" + sap.ui.getCore().getConfiguration().getLanguageTag();
55
+ aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService").createInstance({
56
+ scopeType: "component",
57
+ scopeObject: oComponent,
58
+ settings: {
59
+ bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
60
+ enhanceI18n: aEnhanceI18n,
61
+ modelName: "sap.fe.i18n"
62
+ }
63
+ }).then(function (oResourceModelService) {
64
+ _this.oResourceModelService = oResourceModelService;
65
+ return oResourceModelService.getResourceModel();
66
+ }));
67
+ aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").createInstance({
68
+ settings: {
69
+ metaModel: oMetaModel,
70
+ appComponent: oAppComponent,
71
+ component: oComponent
72
+ }
73
+ }).then(function (oCacheHandlerService) {
74
+ _this.oCacheHandlerService = oCacheHandlerService;
75
+ return oCacheHandlerService.validateCacheKey(sCacheIdentifier);
76
+ }));
77
+ aServiceDependencies.push(VersionInfo.load().then(function (oInfo) {
78
+ var sTimestamp = "";
79
+
80
+ if (!oInfo.libraries) {
81
+ sTimestamp = sap.ui.buildinfo.buildtime;
82
+ } else {
83
+ oInfo.libraries.forEach(function (oLibrary) {
84
+ sTimestamp += oLibrary.buildTimestamp;
85
+ });
86
+ }
87
+
88
+ return sTimestamp;
89
+ }).catch(function () {
90
+ return "<NOVALUE>";
91
+ }));
92
+ var sPageModelCacheKey;
93
+ this.initPromise = Promise.all(aServiceDependencies).then(function (aDependenciesResult) {
94
+ var sCacheKey = aDependenciesResult[1];
95
+ var sVersionInfo = aDependenciesResult[2];
96
+ var oShellServices = oAppComponent.getShellServices();
97
+ var oSideEffectsServices = oAppComponent.getSideEffectsService();
98
+ oSideEffectsServices.initializeSideEffects(oAppComponent.getEnvironmentCapabilities().getCapabilities()); // In case there is no cache key we ignore the view cache
99
+
100
+ sPageModelCacheKey = sCacheKey ? sCacheKey + "-" + sVersionInfo + "-" + sStableId + "-" + oShellServices.instanceType + "-pageModel" : undefined;
101
+ return Promise.all(aDependenciesResult.concat([_this._getCachedModel(sPageModelCacheKey)]));
102
+ }).then(function (aDependenciesResult) {
103
+ var oResourceModel = aDependenciesResult[0];
104
+ var sCacheKey = aDependenciesResult[1];
105
+ var oPageModelCache = aDependenciesResult[3];
106
+ return new Promise(function (resolve) {
107
+ sap.ui.require(["sap/fe/core/converters/TemplateConverter", "sap/fe/core/converters/MetaModelConverter"], function (TemplateConverter, MetaModelConverter) {
108
+ resolve(_this.createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter));
109
+ });
110
+ });
111
+ }).then(function (sCacheKey) {
112
+ var oCacheHandlerService = ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").getInstance(oMetaModel);
113
+ oCacheHandlerService.invalidateIfNeeded(sCacheKey, sCacheIdentifier);
114
+ });
115
+ };
116
+
117
+ _proto._getCachedModel = function _getCachedModel(sCacheKey) {
118
+ if (sCacheKey && sap.ui.getCore().getConfiguration().getViewCache()) {
119
+ return CacheManager.get(sCacheKey);
120
+ }
121
+
122
+ return undefined;
123
+ };
124
+
125
+ _proto._setCachedModel = function _setCachedModel(sCacheKey, oCacheModel) {
126
+ if (sCacheKey && sap.ui.getCore().getConfiguration().getViewCache()) {
127
+ CacheManager.set(sCacheKey, oCacheModel);
128
+ }
129
+
130
+ return undefined;
131
+ }
132
+ /**
133
+ * Refresh the current view using the same configuration as before.
134
+ * This is useful for our demokit !
135
+ *
136
+ * @param oComponent
137
+ * @returns {Promise<void>}
138
+ * @private
139
+ */
140
+ ;
141
+
142
+ _proto.refreshView = function refreshView(oComponent) {
143
+ var oRootView = oComponent.getRootControl();
144
+
145
+ if (oRootView) {
146
+ oRootView.destroy();
147
+ } else if (this.oView) {
148
+ this.oView.destroy();
149
+ }
150
+
151
+ return this.createView(this.resourceModel, this.stableId, "", "", undefined, this.TemplateConverter, this.MetaModelConverter).then(function () {
152
+ oComponent.oContainer.invalidate();
153
+ }).catch(function (oError) {
154
+ oComponent.oContainer.invalidate();
155
+ Log.error(oError);
156
+ });
157
+ };
158
+
159
+ _proto.createView = function createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter) {
160
+ var _this2 = this;
161
+
162
+ this.resourceModel = oResourceModel;
163
+ this.stableId = sStableId;
164
+ this.TemplateConverter = TemplateConverter;
165
+ this.MetaModelConverter = MetaModelConverter;
166
+ var oContext = this.getContext();
167
+ var mServiceSettings = oContext.settings;
168
+ var sConverterType = mServiceSettings.converterType;
169
+ var oComponent = oContext.scopeObject;
170
+ var oAppComponent = Component.getOwnerComponentFor(oComponent);
171
+ var sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent).options.settings.fullContextPath;
172
+ var oMetaModel = oAppComponent.getMetaModel();
173
+ var oManifestContent = oAppComponent.getManifest();
174
+ var oDeviceModel = new JSONModel(sap.ui.Device).setDefaultBindingMode("OneWay");
175
+ var oManifestModel = new JSONModel(oManifestContent);
176
+ var bError = false;
177
+ var oPageModel, oViewDataModel, oViewSettings, mViewData;
178
+
179
+ function getViewSettings() {
180
+ var aSplitPath = sFullContextPath.split("/");
181
+ var sEntitySetPath = aSplitPath.reduce(function (sPathSoFar, sNextPathPart) {
182
+ if (sNextPathPart === "") {
183
+ return sPathSoFar;
184
+ }
185
+
186
+ if (sPathSoFar === "") {
187
+ sPathSoFar = "/" + sNextPathPart;
188
+ } else {
189
+ var oTarget = oMetaModel.getObject(sPathSoFar + "/$NavigationPropertyBinding/" + sNextPathPart);
190
+
191
+ if (oTarget && Object.keys(oTarget).length > 0) {
192
+ sPathSoFar += "/$NavigationPropertyBinding";
193
+ }
194
+
195
+ sPathSoFar += "/" + sNextPathPart;
196
+ }
197
+
198
+ return sPathSoFar;
199
+ }, "");
200
+ var oViewSettings = {
201
+ type: "XML",
202
+ preprocessors: {
203
+ xml: {
204
+ bindingContexts: {
205
+ entitySet: sEntitySetPath ? oMetaModel.createBindingContext(sEntitySetPath) : null,
206
+ fullContextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
207
+ contextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
208
+ converterContext: oPageModel.createBindingContext("/", undefined, {
209
+ noResolve: true
210
+ }),
211
+ viewData: mViewData ? oViewDataModel.createBindingContext("/") : null
212
+ },
213
+ models: {
214
+ entitySet: oMetaModel,
215
+ fullContextPath: oMetaModel,
216
+ contextPath: oMetaModel,
217
+ "sap.fe.i18n": oResourceModel,
218
+ metaModel: oMetaModel,
219
+ "device": oDeviceModel,
220
+ // TODO: discuss names here
221
+ manifest: oManifestModel,
222
+ converterContext: oPageModel,
223
+ viewData: oViewDataModel
224
+ },
225
+ appComponent: oAppComponent
226
+ }
227
+ },
228
+ id: sStableId,
229
+ viewName: mServiceSettings.viewName || oComponent.getViewName(),
230
+ viewData: mViewData,
231
+ cache: {
232
+ keys: [sCacheKey]
233
+ },
234
+ models: {
235
+ "sap.fe.i18n": oResourceModel
236
+ },
237
+ height: "100%"
238
+ };
239
+ return oViewSettings;
240
+ }
241
+
242
+ var createErrorPage = function (reason) {
243
+ // just replace the view name and add an additional model containing the reason, but
244
+ // keep the other settings
245
+ Log.error(reason.message, reason);
246
+ oViewSettings.viewName = mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage";
247
+ oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
248
+ return oComponent.runAsOwner(function () {
249
+ return View.create(oViewSettings).then(function (oView) {
250
+ _this2.oView = oView;
251
+
252
+ _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
253
+
254
+ oComponent.setAggregation("rootControl", _this2.oView);
255
+ return sCacheKey;
256
+ });
257
+ });
258
+ };
259
+
260
+ return oAppComponent.getService("routingService").then(function (oRoutingService) {
261
+ // Retrieve the viewLevel for the component
262
+ var oTargetInfo = oRoutingService.getTargetInformationFor(oComponent);
263
+ var mOutbounds = oManifestContent["sap.app"] && oManifestContent["sap.app"].crossNavigation && oManifestContent["sap.app"].crossNavigation.outbounds;
264
+ var mNavigation = oComponent.getNavigation() || {};
265
+ Object.keys(mNavigation).forEach(function (navigationObjectKey) {
266
+ var navigationObject = mNavigation[navigationObjectKey];
267
+ var outboundConfig;
268
+
269
+ if (navigationObject.detail && navigationObject.detail.outbound && mOutbounds[navigationObject.detail.outbound]) {
270
+ outboundConfig = mOutbounds[navigationObject.detail.outbound];
271
+ navigationObject.detail.outboundDetail = {
272
+ semanticObject: outboundConfig.semanticObject,
273
+ action: outboundConfig.action,
274
+ parameters: outboundConfig.parameters
275
+ };
276
+ }
277
+
278
+ if (navigationObject.create && navigationObject.create.outbound && mOutbounds[navigationObject.create.outbound]) {
279
+ outboundConfig = mOutbounds[navigationObject.create.outbound];
280
+ navigationObject.create.outboundDetail = {
281
+ semanticObject: outboundConfig.semanticObject,
282
+ action: outboundConfig.action,
283
+ parameters: outboundConfig.parameters
284
+ };
285
+ }
286
+ });
287
+ mViewData = {
288
+ navigation: mNavigation,
289
+ viewLevel: oTargetInfo.viewLevel,
290
+ stableId: sStableId,
291
+ contentDensities: oManifestContent["sap.ui5"].contentDensities,
292
+ resourceBundle: oResourceModel.__bundle,
293
+ fullContextPath: sFullContextPath,
294
+ isDesktop: Device.system.desktop,
295
+ isPhone: Device.system.phone
296
+ };
297
+
298
+ if (oComponent.getViewData) {
299
+ Object.assign(mViewData, oComponent.getViewData());
300
+ }
301
+
302
+ var oShellServices = oAppComponent.getShellServices();
303
+ mViewData.converterType = sConverterType;
304
+ mViewData.shellContentDensity = oShellServices.getContentDensity();
305
+ mViewData.useNewLazyLoading = UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest") === "true";
306
+ mViewData.retrieveTextFromValueList = oManifestContent["sap.fe"] && oManifestContent["sap.fe"].form ? oManifestContent["sap.fe"].form.retrieveTextFromValueList : undefined;
307
+ oViewDataModel = new JSONModel(mViewData);
308
+
309
+ if (mViewData && mViewData.controlConfiguration) {
310
+ Object.keys(mViewData.controlConfiguration).forEach(function (sAnnotationPath) {
311
+ if (sAnnotationPath.indexOf("[") !== -1) {
312
+ var sTargetAnnotationPath = resolveDynamicExpression(sAnnotationPath, oMetaModel);
313
+ mViewData.controlConfiguration[sTargetAnnotationPath] = mViewData.controlConfiguration[sAnnotationPath];
314
+ }
315
+ });
316
+ }
317
+
318
+ MetaModelConverter.convertTypes(oMetaModel, oAppComponent.getEnvironmentCapabilities().getCapabilities());
319
+ oPageModel = new TemplateModel(function () {
320
+ try {
321
+ if (!!oPageModelCache) {
322
+ return oPageModelCache;
323
+ } else {
324
+ var oDiagnostics = oAppComponent.getDiagnostics();
325
+ var iIssueCount = oDiagnostics.getIssues().length;
326
+ var oConverterPageModel = TemplateConverter.convertPage(sConverterType, oMetaModel, mViewData, oDiagnostics, sFullContextPath, oAppComponent.getEnvironmentCapabilities().getCapabilities());
327
+ var aIssues = oDiagnostics.getIssues();
328
+ var aAddedIssues = aIssues.slice(iIssueCount);
329
+
330
+ if (aAddedIssues.length > 0) {
331
+ Log.warning("Some issues have been detected in your project, please check the UI5 support assistant rule for sap.fe.core");
332
+ }
333
+
334
+ return oConverterPageModel;
335
+ }
336
+ } catch (error) {
337
+ Log.error(error, error);
338
+ return {};
339
+ }
340
+ }, oMetaModel);
341
+
342
+ if (!bError) {
343
+ oViewSettings = getViewSettings(); // Setting the pageModel on the component for potential reuse
344
+
345
+ oComponent.setModel(oPageModel, "_pageModel");
346
+ return oComponent.runAsOwner(function () {
347
+ return View.create(oViewSettings).catch(createErrorPage).then(function (oView) {
348
+ _this2.oView = oView;
349
+
350
+ _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
351
+
352
+ _this2.oView.setModel(oViewDataModel, "viewData");
353
+
354
+ oComponent.setAggregation("rootControl", _this2.oView); // Fire and forget in the cache
355
+
356
+ if (!oPageModelCache) {
357
+ _this2._setCachedModel(sPageModelCacheKey, oPageModel.getData());
358
+ }
359
+
360
+ return sCacheKey;
361
+ }).catch(function (e) {
362
+ return Log.error(e.message, e);
363
+ });
364
+ });
365
+ }
366
+ }).catch(function (error) {
367
+ Log.error(error.message, error);
368
+ throw new Error("Error while creating view : " + error);
369
+ });
370
+ };
371
+
372
+ _proto.getView = function getView() {
373
+ return this.oView;
374
+ };
375
+
376
+ _proto.getInterface = function getInterface() {
377
+ return this;
378
+ };
379
+
380
+ _proto.exit = function exit() {
381
+ // Deregister global instance
382
+ this.oResourceModelService && this.oResourceModelService.destroy();
383
+ this.oCacheHandlerService && this.oCacheHandlerService.destroy();
384
+ this.oFactory.removeGlobalInstance();
385
+ };
386
+
387
+ return TemplatedViewService;
388
+ }(Service);
389
+
390
+ var TemplatedViewServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
391
+ _inherits(TemplatedViewServiceFactory, _ServiceFactory);
392
+
393
+ function TemplatedViewServiceFactory() {
394
+ var _this3;
395
+
396
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
397
+ args[_key] = arguments[_key];
398
+ }
399
+
400
+ _this3 = _ServiceFactory.call.apply(_ServiceFactory, [this].concat(args)) || this;
401
+ _this3._oInstanceRegistry = {};
402
+ return _this3;
403
+ }
404
+
405
+ var _proto2 = TemplatedViewServiceFactory.prototype;
406
+
407
+ _proto2.createInstance = function createInstance(oServiceContext) {
408
+ TemplatedViewServiceFactory.iCreatingViews++;
409
+ var oTemplatedViewService = new TemplatedViewService(Object.assign({
410
+ factory: this
411
+ }, oServiceContext));
412
+ return oTemplatedViewService.initPromise.then(function () {
413
+ TemplatedViewServiceFactory.iCreatingViews--;
414
+ return oTemplatedViewService;
415
+ });
416
+ };
417
+
418
+ _proto2.removeGlobalInstance = function removeGlobalInstance() {
419
+ this._oInstanceRegistry = {};
420
+ };
421
+
422
+ TemplatedViewServiceFactory.getNumberOfViewsInCreationState = function getNumberOfViewsInCreationState() {
423
+ return TemplatedViewServiceFactory.iCreatingViews;
424
+ };
425
+
426
+ return TemplatedViewServiceFactory;
427
+ }(ServiceFactory);
428
+
429
+ return TemplatedViewServiceFactory;
430
+ }, false);
431
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsImluaXQiLCJhU2VydmljZURlcGVuZGVuY2llcyIsIm9Db250ZXh0IiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9BcHBDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzU3RhYmxlSWQiLCJnZXRNZXRhZGF0YSIsImdldENvbXBvbmVudE5hbWUiLCJnZXRMb2NhbElkIiwiZ2V0SWQiLCJhRW5oYW5jZUkxOG4iLCJnZXRFbmhhbmNlSTE4biIsInNBcHBOYW1lc3BhY2UiLCJvRmFjdG9yeSIsImZhY3RvcnkiLCJpIiwibGVuZ3RoIiwib1Jlc291cmNlTW9kZWwiLCJnZXRNb2RlbCIsImlzQSIsInJlcGxhY2UiLCJzQ2FjaGVJZGVudGlmaWVyIiwiZ2V0TmFtZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZVRhZyIsInB1c2giLCJTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IiwiZ2V0IiwiY3JlYXRlSW5zdGFuY2UiLCJzY29wZVR5cGUiLCJzZXR0aW5ncyIsImJ1bmRsZXMiLCJlbmhhbmNlSTE4biIsIm1vZGVsTmFtZSIsInRoZW4iLCJvUmVzb3VyY2VNb2RlbFNlcnZpY2UiLCJnZXRSZXNvdXJjZU1vZGVsIiwibWV0YU1vZGVsIiwiYXBwQ29tcG9uZW50IiwiY29tcG9uZW50Iiwib0NhY2hlSGFuZGxlclNlcnZpY2UiLCJ2YWxpZGF0ZUNhY2hlS2V5IiwiVmVyc2lvbkluZm8iLCJsb2FkIiwib0luZm8iLCJzVGltZXN0YW1wIiwibGlicmFyaWVzIiwiYnVpbGRpbmZvIiwiYnVpbGR0aW1lIiwiZm9yRWFjaCIsIm9MaWJyYXJ5IiwiYnVpbGRUaW1lc3RhbXAiLCJjYXRjaCIsInNQYWdlTW9kZWxDYWNoZUtleSIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsImFsbCIsImFEZXBlbmRlbmNpZXNSZXN1bHQiLCJzQ2FjaGVLZXkiLCJzVmVyc2lvbkluZm8iLCJvU2hlbGxTZXJ2aWNlcyIsImdldFNoZWxsU2VydmljZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImluaXRpYWxpemVTaWRlRWZmZWN0cyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiaW5zdGFuY2VUeXBlIiwidW5kZWZpbmVkIiwiY29uY2F0IiwiX2dldENhY2hlZE1vZGVsIiwib1BhZ2VNb2RlbENhY2hlIiwicmVzb2x2ZSIsInJlcXVpcmUiLCJUZW1wbGF0ZUNvbnZlcnRlciIsIk1ldGFNb2RlbENvbnZlcnRlciIsImNyZWF0ZVZpZXciLCJnZXRJbnN0YW5jZSIsImludmFsaWRhdGVJZk5lZWRlZCIsImdldFZpZXdDYWNoZSIsIkNhY2hlTWFuYWdlciIsIl9zZXRDYWNoZWRNb2RlbCIsIm9DYWNoZU1vZGVsIiwic2V0IiwicmVmcmVzaFZpZXciLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsImRlc3Ryb3kiLCJvVmlldyIsInJlc291cmNlTW9kZWwiLCJzdGFibGVJZCIsIm9Db250YWluZXIiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtU2VydmljZVNldHRpbmdzIiwic0NvbnZlcnRlclR5cGUiLCJjb252ZXJ0ZXJUeXBlIiwic0Z1bGxDb250ZXh0UGF0aCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvcHRpb25zIiwiZnVsbENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiSlNPTk1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJiRXJyb3IiLCJvUGFnZU1vZGVsIiwib1ZpZXdEYXRhTW9kZWwiLCJvVmlld1NldHRpbmdzIiwibVZpZXdEYXRhIiwiZ2V0Vmlld1NldHRpbmdzIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic0VudGl0eVNldFBhdGgiLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJPYmplY3QiLCJrZXlzIiwidHlwZSIsInByZXByb2Nlc3NvcnMiLCJ4bWwiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsInZpZXdEYXRhIiwibW9kZWxzIiwibWFuaWZlc3QiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJjYWNoZSIsImhlaWdodCIsImNyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm1lc3NhZ2UiLCJlcnJvclZpZXdOYW1lIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsIk1hbmFnZWRPYmplY3RNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0U2VydmljZSIsIm9Sb3V0aW5nU2VydmljZSIsIm9UYXJnZXRJbmZvIiwibU91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm1OYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbiIsIm5hdmlnYXRpb25PYmplY3RLZXkiLCJuYXZpZ2F0aW9uT2JqZWN0Iiwib3V0Ym91bmRDb25maWciLCJkZXRhaWwiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJwYXJhbWV0ZXJzIiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJyZXNvdXJjZUJ1bmRsZSIsIl9fYnVuZGxlIiwiaXNEZXNrdG9wIiwic3lzdGVtIiwiZGVza3RvcCIsImlzUGhvbmUiLCJwaG9uZSIsImdldFZpZXdEYXRhIiwiYXNzaWduIiwic2hlbGxDb250ZW50RGVuc2l0eSIsImdldENvbnRlbnREZW5zaXR5IiwidXNlTmV3TGF6eUxvYWRpbmciLCJVcmlQYXJhbWV0ZXJzIiwiZnJvbVF1ZXJ5Iiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInNUYXJnZXRBbm5vdGF0aW9uUGF0aCIsInJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiIsImNvbnZlcnRUeXBlcyIsIlRlbXBsYXRlTW9kZWwiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsImlJc3N1ZUNvdW50IiwiZ2V0SXNzdWVzIiwib0NvbnZlcnRlclBhZ2VNb2RlbCIsImNvbnZlcnRQYWdlIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsImdldERhdGEiLCJlIiwiRXJyb3IiLCJnZXRWaWV3IiwiZ2V0SW50ZXJmYWNlIiwiZXhpdCIsInJlbW92ZUdsb2JhbEluc3RhbmNlIiwiU2VydmljZSIsIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSIsIl9vSW5zdGFuY2VSZWdpc3RyeSIsIm9TZXJ2aWNlQ29udGV4dCIsImlDcmVhdGluZ1ZpZXdzIiwib1RlbXBsYXRlZFZpZXdTZXJ2aWNlIiwiZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7O01BcUJNQSxvQjs7Ozs7Ozs7O1dBVUxDLEksR0FBQSxnQkFBTztBQUFBOztBQUNOLFVBQU1DLG9CQUFvQixHQUFHLEVBQTdCO0FBQ0EsVUFBTUMsUUFBUSxHQUFHLEtBQUtDLFVBQUwsRUFBakI7QUFDQSxVQUFNQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csV0FBNUI7QUFDQSxVQUFNQyxhQUFhLEdB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QUFBLHdCQUFvQjtBQUNuQixhQUFPLElBQVA7QUFDQSxLOztXQUNEQyxJLEdBQUEsZ0JBQU87QUFDTjtBQUNBLFdBQUtwTCxxQkFBTCxJQUE4QixLQUFLQSxxQkFBTCxDQUEyQm9ELE9BQTNCLEVBQTlCO0FBQ0EsV0FBSy9DLG9CQUFMLElBQTZCLEtBQUtBLG9CQUFMLENBQTBCK0MsT0FBMUIsRUFBN0I7QUFDQSxXQUFLN0UsUUFBTCxDQUFjOE0sb0JBQWQ7QUFDQSxLOzs7SUE5WmlDQyxPOztNQWdhN0JDLDJCOzs7Ozs7Ozs7OzthQUNMQyxrQixHQUEyRCxFOzs7Ozs7WUFFM0QvTCxjLEdBQUEsd0JBQWVnTSxlQUFmLEVBQThFO0FBQzdFRixNQUFBQSwyQkFBMkIsQ0FBQ0csY0FBNUI7QUFFQSxVQUFNQyxxQkFBcUIsR0FBRyxJQUFJeE8sb0JBQUosQ0FBeUJ1SSxNQUFNLENBQUN5RCxNQUFQLENBQWM7QUFBRTNLLFFBQUFBLE9BQU8sRUFBRTtBQUFYLE9BQWQsRUFBaUNpTixlQUFqQyxDQUF6QixDQUE5QjtBQUNBLGFBQU9FLHFCQUFxQixDQUFDeEssV0FBdEIsQ0FBa0NwQixJQUFsQyxDQUF1QyxZQUFXO0FBQ3hEd0wsUUFBQUEsMkJBQTJCLENBQUNHLGNBQTVCO0FBQ0EsZUFBT0MscUJBQVA7QUFDQSxPQUhNLENBQVA7QUFJQSxLOztZQUNETixvQixHQUFBLGdDQUF1QjtBQUN0QixXQUFLRyxrQkFBTCxHQUEwQixFQUExQjtBQUNBLEs7O2dDQUNNSSwrQixHQUFQLDJDQUF5QztBQUN4QyxhQUFPTCwyQkFBMkIsQ0FBQ0csY0FBbkM7QUFDQSxLOzs7SUFqQndDRyxjOztTQW9CM0JOLDJCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5UmVnaXN0cnlcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0TW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9iYXNlL01hbmFnZWRPYmplY3RNb2RlbFwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgVGVtcGxhdGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVNb2RlbFwiO1xuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvY2FjaGUvQ2FjaGVNYW5hZ2VyXCI7XG5pbXBvcnQgVmVyc2lvbkluZm8gZnJvbSBcInNhcC91aS9WZXJzaW9uSW5mb1wiO1xuaW1wb3J0IERldmljZSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IFVyaVBhcmFtZXRlcnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvVXJpUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi9SZXNvdXJjZU1vZGVsU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ2FjaGVIYW5kbGVyU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9DYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB7IHJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0R5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlclwiO1xuXG50eXBlIFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3MgPSB7fTtcblxuY2xhc3MgVGVtcGxhdGVkVmlld1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFRlbXBsYXRlZFZpZXdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdG9WaWV3ITogVmlldztcblx0b1Jlc291cmNlTW9kZWxTZXJ2aWNlITogUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cdG9DYWNoZUhhbmRsZXJTZXJ2aWNlITogQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0b0ZhY3RvcnkhOiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3Rvcnk7XG5cdHJlc291cmNlTW9kZWwhOiB0eXBlb2YgUmVzb3VyY2VNb2RlbDtcblx0c3RhYmxlSWQhOiBzdHJpbmc7XG5cdFRlbXBsYXRlQ29udmVydGVyOiBhbnk7XG5cdE1ldGFNb2RlbENvbnZlcnRlcjogYW55O1xuXHRpbml0KCkge1xuXHRcdGNvbnN0IGFTZXJ2aWNlRGVwZW5kZW5jaWVzID0gW107XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvQ29tcG9uZW50KSBhcyBBcHBDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc1N0YWJsZUlkID0gb0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKSArIFwiOjpcIiArIG9BcHBDb21wb25lbnQuZ2V0TG9jYWxJZChvQ29tcG9uZW50LmdldElkKCkpO1xuXHRcdGNvbnN0IGFFbmhhbmNlSTE4biA9IG9Db21wb25lbnQuZ2V0RW5oYW5jZUkxOG4oKSB8fCBbXTtcblx0XHRsZXQgc0FwcE5hbWVzcGFjZTtcblx0XHR0aGlzLm9GYWN0b3J5ID0gb0NvbnRleHQuZmFjdG9yeTtcblx0XHRpZiAoYUVuaGFuY2VJMThuKSB7XG5cdFx0XHRzQXBwTmFtZXNwYWNlID0gb0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldENvbXBvbmVudE5hbWUoKTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUVuaGFuY2VJMThuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGV4dC12ZXJ0aWNhbGl6YXRpb24gYXBwbGljYXRpb25zIGNhbiBhbHNvIHBhc3NzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gVUk1IHRha2VzIGNhcmUgb2YgdGV4dC12ZXJ0aWNhbGl6YXRpb24gZm9yIHJlc291cmNlIG1vZGVscyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHQvLyBIZW5jZSBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGEgcmVzb3VyY2UgbW9kZWwgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gaWYgc28gdGhpcyBtb2RlbCBzaG91bGQgYmUgdXNlZCB0byBlbmhhbmNlIHRoZSBzYXAuZmUgcmVzb3VyY2UgbW9kZWwgc28gcGFzcyBpdCBhcyBpdCBpc1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoYUVuaGFuY2VJMThuW2ldKTtcblx0XHRcdFx0aWYgKG9SZXNvdXJjZU1vZGVsICYmIG9SZXNvdXJjZU1vZGVsLmlzQShcInNhcC51aS5tb2RlbC5yZXNvdXJjZS5SZXNvdXJjZU1vZGVsXCIpKSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gb1Jlc291cmNlTW9kZWw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUVuaGFuY2VJMThuW2ldID0gc0FwcE5hbWVzcGFjZSArIFwiLlwiICsgYUVuaGFuY2VJMThuW2ldLnJlcGxhY2UoXCIucHJvcGVydGllc1wiLCBcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHNDYWNoZUlkZW50aWZpZXIgPVxuXHRcdFx0b0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSArXG5cdFx0XHRcIl9cIiArXG5cdFx0XHRzU3RhYmxlSWQgK1xuXHRcdFx0XCJfXCIgK1xuXHRcdFx0c2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldENvbmZpZ3VyYXRpb24oKVxuXHRcdFx0XHQuZ2V0TGFuZ3VhZ2VUYWcoKTtcblx0XHRhU2VydmljZURlcGVuZGVuY2llcy5wdXNoKFxuXHRcdFx0U2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5SZXNvdXJjZU1vZGVsU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNjb3BlVHlwZTogXCJjb21wb25lbnRcIixcblx0XHRcdFx0XHRzY29wZU9iamVjdDogb0NvbXBvbmVudCxcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0YnVuZGxlczogW1wic2FwLmZlLmNvcmUubWVzc2FnZWJ1bmRsZVwiLCBcInNhcC5mZS5tYWNyb3MubWVzc2FnZWJ1bmRsZVwiLCBcInNhcC5mZS50ZW1wbGF0ZXMubWVzc2FnZWJ1bmRsZVwiXSxcblx0XHRcdFx0XHRcdGVuaGFuY2VJMThuOiBhRW5oYW5jZUkxOG4sXG5cdFx0XHRcdFx0XHRtb2RlbE5hbWU6IFwic2FwLmZlLmkxOG5cIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKG9SZXNvdXJjZU1vZGVsU2VydmljZTogUmVzb3VyY2VNb2RlbFNlcnZpY2UpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZU1vZGVsU2VydmljZSA9IG9SZXNvdXJjZU1vZGVsU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb1Jlc291cmNlTW9kZWxTZXJ2aWNlLmdldFJlc291cmNlTW9kZWwoKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuQ2FjaGVIYW5kbGVyU2VydmljZVwiKVxuXHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9Db21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvQ2FjaGVIYW5kbGVyU2VydmljZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZSA9IG9DYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVyU2VydmljZS52YWxpZGF0ZUNhY2hlS2V5KHNDYWNoZUlkZW50aWZpZXIpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdChWZXJzaW9uSW5mbyBhcyBhbnkpXG5cdFx0XHRcdC5sb2FkKClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0luZm86IGFueSkge1xuXHRcdFx0XHRcdGxldCBzVGltZXN0YW1wID0gXCJcIjtcblx0XHRcdFx0XHRpZiAoIW9JbmZvLmxpYnJhcmllcykge1xuXHRcdFx0XHRcdFx0c1RpbWVzdGFtcCA9IChzYXAudWkgYXMgYW55KS5idWlsZGluZm8uYnVpbGR0aW1lO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvSW5mby5saWJyYXJpZXMuZm9yRWFjaChmdW5jdGlvbihvTGlicmFyeTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgKz0gb0xpYnJhcnkuYnVpbGRUaW1lc3RhbXA7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHNUaW1lc3RhbXA7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCI8Tk9WQUxVRT5cIjtcblx0XHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0bGV0IHNQYWdlTW9kZWxDYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChhU2VydmljZURlcGVuZGVuY2llcylcblx0XHRcdC50aGVuKChhRGVwZW5kZW5jaWVzUmVzdWx0OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdO1xuXHRcdFx0XHRjb25zdCBzVmVyc2lvbkluZm8gPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzJdO1xuXHRcdFx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cblx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZXMuaW5pdGlhbGl6ZVNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBubyBjYWNoZSBrZXkgd2UgaWdub3JlIHRoZSB2aWV3IGNhY2hlXG5cdFx0XHRcdHNQYWdlTW9kZWxDYWNoZUtleSA9IHNDYWNoZUtleVxuXHRcdFx0XHRcdD8gc0NhY2hlS2V5ICsgXCItXCIgKyBzVmVyc2lvbkluZm8gKyBcIi1cIiArIHNTdGFibGVJZCArIFwiLVwiICsgb1NoZWxsU2VydmljZXMuaW5zdGFuY2VUeXBlICsgXCItcGFnZU1vZGVsXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFEZXBlbmRlbmNpZXNSZXN1bHQuY29uY2F0KFt0aGlzLl9nZXRDYWNoZWRNb2RlbChzUGFnZU1vZGVsQ2FjaGVLZXkpXSkpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhRGVwZW5kZW5jaWVzUmVzdWx0OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VNb2RlbCA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMF07XG5cdFx0XHRcdGNvbnN0IHNDYWNoZUtleSA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbMV07XG5cdFx0XHRcdGNvbnN0IG9QYWdlTW9kZWxDYWNoZSA9IGFEZXBlbmRlbmNpZXNSZXN1bHRbM107XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShcblx0XHRcdFx0XHRcdFtcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIiwgXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiXSxcblx0XHRcdFx0XHRcdChUZW1wbGF0ZUNvbnZlcnRlcjogYW55LCBNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY3JlYXRlVmlldyhcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0c1N0YWJsZUlkLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0NhY2hlS2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0c1BhZ2VNb2RlbENhY2hlS2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b1BhZ2VNb2RlbENhY2hlLFxuXHRcdFx0XHRcdFx0XHRcdFx0VGVtcGxhdGVDb252ZXJ0ZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXJcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oc0NhY2hlS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0NhY2hlSGFuZGxlclNlcnZpY2UgPSBTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIikuZ2V0SW5zdGFuY2Uob01ldGFNb2RlbCk7XG5cdFx0XHRcdG9DYWNoZUhhbmRsZXJTZXJ2aWNlLmludmFsaWRhdGVJZk5lZWRlZChzQ2FjaGVLZXksIHNDYWNoZUlkZW50aWZpZXIpO1xuXHRcdFx0fSk7XG5cdH1cblx0X2dldENhY2hlZE1vZGVsKHNDYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKFxuXHRcdFx0c0NhY2hlS2V5ICYmXG5cdFx0XHRzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdC5nZXRWaWV3Q2FjaGUoKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIENhY2hlTWFuYWdlci5nZXQoc0NhY2hlS2V5KTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRfc2V0Q2FjaGVkTW9kZWwoc0NhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9DYWNoZU1vZGVsOiBhbnkpIHtcblx0XHRpZiAoXG5cdFx0XHRzQ2FjaGVLZXkgJiZcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldFZpZXdDYWNoZSgpXG5cdFx0KSB7XG5cdFx0XHRDYWNoZU1hbmFnZXIuc2V0KHNDYWNoZUtleSwgb0NhY2hlTW9kZWwpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHZpZXcgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBiZWZvcmUuXG5cdCAqIFRoaXMgaXMgdXNlZnVsIGZvciBvdXIgZGVtb2tpdCAhXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVmcmVzaFZpZXcob0NvbXBvbmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGlmIChvUm9vdFZpZXcpIHtcblx0XHRcdG9Sb290Vmlldy5kZXN0cm95KCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm9WaWV3KSB7XG5cdFx0XHR0aGlzLm9WaWV3LmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyh0aGlzLnJlc291cmNlTW9kZWwsIHRoaXMuc3RhYmxlSWQsIFwiXCIsIFwiXCIsIHVuZGVmaW5lZCwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciwgdGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXHRjcmVhdGVWaWV3KFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBhbnksXG5cdFx0c1N0YWJsZUlkOiBhbnksXG5cdFx0c0NhY2hlS2V5OiBhbnksXG5cdFx0c1BhZ2VNb2RlbENhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0b1BhZ2VNb2RlbENhY2hlOiBhbnksXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IGFueSxcblx0XHRNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueVxuXHQpIHtcblx0XHR0aGlzLnJlc291cmNlTW9kZWwgPSBvUmVzb3VyY2VNb2RlbDtcblx0XHR0aGlzLnN0YWJsZUlkID0gc1N0YWJsZUlkO1xuXHRcdHRoaXMuVGVtcGxhdGVDb252ZXJ0ZXIgPSBUZW1wbGF0ZUNvbnZlcnRlcjtcblx0XHR0aGlzLk1ldGFNb2RlbENvbnZlcnRlciA9IE1ldGFNb2RlbENvbnZlcnRlcjtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG1TZXJ2aWNlU2V0dGluZ3MgPSBvQ29udGV4dC5zZXR0aW5ncztcblx0XHRjb25zdCBzQ29udmVydGVyVHlwZSA9IG1TZXJ2aWNlU2V0dGluZ3MuY29udmVydGVyVHlwZTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpIGFzIEFwcENvbXBvbmVudDtcblx0XHRjb25zdCBzRnVsbENvbnRleHRQYXRoID0gb0FwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKG9Db21wb25lbnQpLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG9NYW5pZmVzdENvbnRlbnQ6IGFueSA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3QoKTtcblx0XHRjb25zdCBvRGV2aWNlTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHNhcC51aS5EZXZpY2UpLnNldERlZmF1bHRCaW5kaW5nTW9kZShcIk9uZVdheVwiKTtcblx0XHRjb25zdCBvTWFuaWZlc3RNb2RlbCA9IG5ldyBKU09OTW9kZWwob01hbmlmZXN0Q29udGVudCk7XG5cdFx0Y29uc3QgYkVycm9yID0gZmFsc2U7XG5cdFx0bGV0IG9QYWdlTW9kZWw6IFRlbXBsYXRlTW9kZWwsIG9WaWV3RGF0YU1vZGVsOiBNb2RlbCwgb1ZpZXdTZXR0aW5nczogYW55LCBtVmlld0RhdGE6IGFueTtcblxuXHRcdGZ1bmN0aW9uIGdldFZpZXdTZXR0aW5ncygpIHtcblx0XHRcdGNvbnN0IGFTcGxpdFBhdGggPSBzRnVsbENvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gYVNwbGl0UGF0aC5yZWR1Y2UoZnVuY3Rpb24oc1BhdGhTb0ZhcjogYW55LCBzTmV4dFBhdGhQYXJ0OiBhbnkpIHtcblx0XHRcdFx0aWYgKHNOZXh0UGF0aFBhcnQgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc1BhdGhTb0ZhciA9PT0gXCJcIikge1xuXHRcdFx0XHRcdHNQYXRoU29GYXIgPSBcIi9cIiArIHNOZXh0UGF0aFBhcnQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNQYXRoU29GYXIgKyBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy9cIiArIHNOZXh0UGF0aFBhcnQpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIE9iamVjdC5rZXlzKG9UYXJnZXQpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHNQYXRoU29GYXIgKz0gXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c1BhdGhTb0ZhciArPSBcIi9cIiArIHNOZXh0UGF0aFBhcnQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNQYXRoU29GYXI7XG5cdFx0XHR9LCBcIlwiKTtcblx0XHRcdGNvbnN0IG9WaWV3U2V0dGluZ3MgPSB7XG5cdFx0XHRcdHR5cGU6IFwiWE1MXCIsXG5cdFx0XHRcdHByZXByb2Nlc3NvcnM6IHtcblx0XHRcdFx0XHR4bWw6IHtcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNFbnRpdHlTZXRQYXRoID8gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdWxsQ29udGV4dFBhdGgpIDogbnVsbCxcblx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdWxsQ29udGV4dFBhdGgpIDogbnVsbCxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiwgdW5kZWZpbmVkLCB7IG5vUmVzb2x2ZTogdHJ1ZSB9KSxcblx0XHRcdFx0XHRcdFx0dmlld0RhdGE6IG1WaWV3RGF0YSA/IG9WaWV3RGF0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSA6IG51bGxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcInNhcC5mZS5pMThuXCI6IG9SZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFwiZGV2aWNlXCI6IG9EZXZpY2VNb2RlbCwgLy8gVE9ETzogZGlzY3VzcyBuYW1lcyBoZXJlXG5cdFx0XHRcdFx0XHRcdG1hbmlmZXN0OiBvTWFuaWZlc3RNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dDogb1BhZ2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0dmlld0RhdGE6IG9WaWV3RGF0YU1vZGVsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpZDogc1N0YWJsZUlkLFxuXHRcdFx0XHR2aWV3TmFtZTogbVNlcnZpY2VTZXR0aW5ncy52aWV3TmFtZSB8fCBvQ29tcG9uZW50LmdldFZpZXdOYW1lKCksXG5cdFx0XHRcdHZpZXdEYXRhOiBtVmlld0RhdGEsXG5cdFx0XHRcdGNhY2hlOiB7IGtleXM6IFtzQ2FjaGVLZXldIH0sXG5cdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFwic2FwLmZlLmkxOG5cIjogb1Jlc291cmNlTW9kZWxcblx0XHRcdFx0fSxcblx0XHRcdFx0aGVpZ2h0OiBcIjEwMCVcIlxuXHRcdFx0fTtcblx0XHRcdHJldHVybiBvVmlld1NldHRpbmdzO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGVFcnJvclBhZ2UgPSAocmVhc29uOiBhbnkpID0+IHtcblx0XHRcdC8vIGp1c3QgcmVwbGFjZSB0aGUgdmlldyBuYW1lIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBtb2RlbCBjb250YWluaW5nIHRoZSByZWFzb24sIGJ1dFxuXHRcdFx0Ly8ga2VlcCB0aGUgb3RoZXIgc2V0dGluZ3Ncblx0XHRcdExvZy5lcnJvcihyZWFzb24ubWVzc2FnZSwgcmVhc29uKTtcblx0XHRcdG9WaWV3U2V0dGluZ3Mudmlld05hbWUgPSBtU2VydmljZVNldHRpbmdzLmVycm9yVmlld05hbWUgfHwgXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy52aWV3LlRlbXBsYXRpbmdFcnJvclBhZ2VcIjtcblx0XHRcdG9WaWV3U2V0dGluZ3MucHJlcHJvY2Vzc29ycy54bWwubW9kZWxzW1wiZXJyb3JcIl0gPSBuZXcgSlNPTk1vZGVsKHJlYXNvbik7XG5cblx0XHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gVmlldy5jcmVhdGUob1ZpZXdTZXR0aW5ncykudGhlbigob1ZpZXc6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG5ldyBNYW5hZ2VkT2JqZWN0TW9kZWwodGhpcy5vVmlldyksIFwiJHZpZXdcIik7XG5cdFx0XHRcdFx0b0NvbXBvbmVudC5zZXRBZ2dyZWdhdGlvbihcInJvb3RDb250cm9sXCIsIHRoaXMub1ZpZXcpO1xuXHRcdFx0XHRcdHJldHVybiBzQ2FjaGVLZXk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRyZXR1cm4gb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIFJldHJpZXZlIHRoZSB2aWV3TGV2ZWwgZm9yIHRoZSBjb21wb25lbnRcblx0XHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudCk7XG5cdFx0XHRcdGNvbnN0IG1PdXRib3VuZHMgPVxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuYXBwXCJdICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0uY3Jvc3NOYXZpZ2F0aW9uICYmXG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0uY3Jvc3NOYXZpZ2F0aW9uLm91dGJvdW5kcztcblx0XHRcdFx0Y29uc3QgbU5hdmlnYXRpb24gPSBvQ29tcG9uZW50LmdldE5hdmlnYXRpb24oKSB8fCB7fTtcblx0XHRcdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb24pLmZvckVhY2goZnVuY3Rpb24obmF2aWdhdGlvbk9iamVjdEtleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbk9iamVjdCA9IG1OYXZpZ2F0aW9uW25hdmlnYXRpb25PYmplY3RLZXldO1xuXHRcdFx0XHRcdGxldCBvdXRib3VuZENvbmZpZztcblx0XHRcdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5kZXRhaWwgJiYgbmF2aWdhdGlvbk9iamVjdC5kZXRhaWwub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF0pIHtcblx0XHRcdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZF07XG5cdFx0XHRcdFx0XHRuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZERldGFpbCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczogb3V0Ym91bmRDb25maWcucGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG5hdmlnYXRpb25PYmplY3QuY3JlYXRlICYmIG5hdmlnYXRpb25PYmplY3QuY3JlYXRlLm91dGJvdW5kICYmIG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdKSB7XG5cdFx0XHRcdFx0XHRvdXRib3VuZENvbmZpZyA9IG1PdXRib3VuZHNbbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmRdO1xuXHRcdFx0XHRcdFx0bmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmREZXRhaWwgPSB7XG5cdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvdXRib3VuZENvbmZpZy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiBvdXRib3VuZENvbmZpZy5hY3Rpb24sXG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnM6IG91dGJvdW5kQ29uZmlnLnBhcmFtZXRlcnNcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bVZpZXdEYXRhID0ge1xuXHRcdFx0XHRcdG5hdmlnYXRpb246IG1OYXZpZ2F0aW9uLFxuXHRcdFx0XHRcdHZpZXdMZXZlbDogb1RhcmdldEluZm8udmlld0xldmVsLFxuXHRcdFx0XHRcdHN0YWJsZUlkOiBzU3RhYmxlSWQsXG5cdFx0XHRcdFx0Y29udGVudERlbnNpdGllczogb01hbmlmZXN0Q29udGVudFtcInNhcC51aTVcIl0uY29udGVudERlbnNpdGllcyxcblx0XHRcdFx0XHRyZXNvdXJjZUJ1bmRsZTogb1Jlc291cmNlTW9kZWwuX19idW5kbGUsXG5cdFx0XHRcdFx0ZnVsbENvbnRleHRQYXRoOiBzRnVsbENvbnRleHRQYXRoLFxuXHRcdFx0XHRcdGlzRGVza3RvcDogKERldmljZSBhcyBhbnkpLnN5c3RlbS5kZXNrdG9wLFxuXHRcdFx0XHRcdGlzUGhvbmU6IChEZXZpY2UgYXMgYW55KS5zeXN0ZW0ucGhvbmVcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAob0NvbXBvbmVudC5nZXRWaWV3RGF0YSkge1xuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24obVZpZXdEYXRhLCBvQ29tcG9uZW50LmdldFZpZXdEYXRhKCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRcdFx0bVZpZXdEYXRhLmNvbnZlcnRlclR5cGUgPSBzQ29udmVydGVyVHlwZTtcblx0XHRcdFx0bVZpZXdEYXRhLnNoZWxsQ29udGVudERlbnNpdHkgPSBvU2hlbGxTZXJ2aWNlcy5nZXRDb250ZW50RGVuc2l0eSgpO1xuXHRcdFx0XHRtVmlld0RhdGEudXNlTmV3TGF6eUxvYWRpbmcgPSBVcmlQYXJhbWV0ZXJzLmZyb21RdWVyeSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoXCJzYXAtZmUteHgtbGF6eWxvYWRpbmd0ZXN0XCIpID09PSBcInRydWVcIjtcblx0XHRcdFx0bVZpZXdEYXRhLnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgPVxuXHRcdFx0XHRcdG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl0gJiYgb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXS5mb3JtXG5cdFx0XHRcdFx0XHQ/IG9NYW5pZmVzdENvbnRlbnRbXCJzYXAuZmVcIl0uZm9ybS5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0XG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0b1ZpZXdEYXRhTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1WaWV3RGF0YSk7XG5cdFx0XHRcdGlmIChtVmlld0RhdGEgJiYgbVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMobVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHNBbm5vdGF0aW9uUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRpZiAoc0Fubm90YXRpb25QYXRoLmluZGV4T2YoXCJbXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVGFyZ2V0QW5ub3RhdGlvblBhdGggPSByZXNvbHZlRHluYW1pY0V4cHJlc3Npb24oc0Fubm90YXRpb25QYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0bVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uW3NUYXJnZXRBbm5vdGF0aW9uUGF0aF0gPSBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc0Fubm90YXRpb25QYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG9NZXRhTW9kZWwsIG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cdFx0XHRcdG9QYWdlTW9kZWwgPSBuZXcgVGVtcGxhdGVNb2RlbCgoKSA9PiB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmICghIW9QYWdlTW9kZWxDYWNoZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbENhY2hlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWdub3N0aWNzID0gb0FwcENvbXBvbmVudC5nZXREaWFnbm9zdGljcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db252ZXJ0ZXJQYWdlTW9kZWwgPSBUZW1wbGF0ZUNvbnZlcnRlci5jb252ZXJ0UGFnZShcblx0XHRcdFx0XHRcdFx0XHRzQ29udmVydGVyVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRvRGlhZ25vc3RpY3MsXG5cdFx0XHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBhSXNzdWVzID0gb0RpYWdub3N0aWNzLmdldElzc3VlcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFBZGRlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvQ29udmVydGVyUGFnZU1vZGVsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IsIGVycm9yKTtcblx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIG9NZXRhTW9kZWwpO1xuXG5cdFx0XHRcdGlmICghYkVycm9yKSB7XG5cdFx0XHRcdFx0b1ZpZXdTZXR0aW5ncyA9IGdldFZpZXdTZXR0aW5ncygpO1xuXHRcdFx0XHRcdC8vIFNldHRpbmcgdGhlIHBhZ2VNb2RlbCBvbiB0aGUgY29tcG9uZW50IGZvciBwb3RlbnRpYWwgcmV1c2Vcblx0XHRcdFx0XHRvQ29tcG9uZW50LnNldE1vZGVsKG9QYWdlTW9kZWwsIFwiX3BhZ2VNb2RlbFwiKTtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbXBvbmVudC5ydW5Bc093bmVyKCgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goY3JlYXRlRXJyb3JQYWdlKVxuXHRcdFx0XHRcdFx0XHQudGhlbigob1ZpZXc6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub1ZpZXcgPSBvVmlldztcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG5ldyBNYW5hZ2VkT2JqZWN0TW9kZWwodGhpcy5vVmlldyksIFwiJHZpZXdcIik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vVmlldy5zZXRNb2RlbChvVmlld0RhdGFNb2RlbCwgXCJ2aWV3RGF0YVwiKTtcblx0XHRcdFx0XHRcdFx0XHRvQ29tcG9uZW50LnNldEFnZ3JlZ2F0aW9uKFwicm9vdENvbnRyb2xcIiwgdGhpcy5vVmlldyk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmlyZSBhbmQgZm9yZ2V0IGluIHRoZSBjYWNoZVxuXHRcdFx0XHRcdFx0XHRcdGlmICghb1BhZ2VNb2RlbENhY2hlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRDYWNoZWRNb2RlbChzUGFnZU1vZGVsQ2FjaGVLZXksIChvUGFnZU1vZGVsIGFzIGFueSkuZ2V0RGF0YSgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNDYWNoZUtleTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGUgPT4gTG9nLmVycm9yKGUubWVzc2FnZSwgZSkpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yKTtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdmlldyA6IFwiICsgZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblx0Z2V0VmlldygpIHtcblx0XHRyZXR1cm4gdGhpcy5vVmlldztcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRleGl0KCkge1xuXHRcdC8vIERlcmVnaXN0ZXIgZ2xvYmFsIGluc3RhbmNlXG5cdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UgJiYgdGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgJiYgdGhpcy5vQ2FjaGVIYW5kbGVyU2VydmljZS5kZXN0cm95KCk7XG5cdFx0dGhpcy5vRmFjdG9yeS5yZW1vdmVHbG9iYWxJbnN0YW5jZSgpO1xuXHR9XG59XG5jbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPiB7XG5cdF9vSW5zdGFuY2VSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVkVmlld1NlcnZpY2U+ID0ge307XG5cdHN0YXRpYyBpQ3JlYXRpbmdWaWV3czogMDtcblx0Y3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxUZW1wbGF0ZWRWaWV3U2VydmljZVNldHRpbmdzPikge1xuXHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cysrO1xuXG5cdFx0Y29uc3Qgb1RlbXBsYXRlZFZpZXdTZXJ2aWNlID0gbmV3IFRlbXBsYXRlZFZpZXdTZXJ2aWNlKE9iamVjdC5hc3NpZ24oeyBmYWN0b3J5OiB0aGlzIH0sIG9TZXJ2aWNlQ29udGV4dCkpO1xuXHRcdHJldHVybiBvVGVtcGxhdGVkVmlld1NlcnZpY2UuaW5pdFByb21pc2UudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5pQ3JlYXRpbmdWaWV3cy0tO1xuXHRcdFx0cmV0dXJuIG9UZW1wbGF0ZWRWaWV3U2VydmljZTtcblx0XHR9KTtcblx0fVxuXHRyZW1vdmVHbG9iYWxJbnN0YW5jZSgpIHtcblx0XHR0aGlzLl9vSW5zdGFuY2VSZWdpc3RyeSA9IHt9O1xuXHR9XG5cdHN0YXRpYyBnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlKCkge1xuXHRcdHJldHVybiBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3M7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5O1xuIl19