@sapui5/sap.fe.core 1.99.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -1,809 +1,791 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/ui/core/mvc/ControllerExtension",
9
- "sap/ui/core/mvc/OverrideExecution",
10
- "sap/base/Log",
11
- "sap/base/util/merge",
12
- "sap/ui/fl/apply/api/ControlVariantApplyAPI",
13
- "sap/ui/mdc/p13n/StateUtil",
14
- "sap/fe/navigation/library",
15
- "sap/fe/core/CommonUtils",
16
- "sap/fe/core/helpers/KeepAliveHelper",
17
- "sap/fe/core/helpers/ModelHelper"
18
- ],
19
- function(
20
- ControllerExtension,
21
- OverrideExecution,
22
- Log,
23
- mergeObjects,
24
- ControlVariantApplyAPI,
25
- StateUtil,
26
- NavLibrary,
27
- CommonUtils,
28
- KeepAliveHelper,
29
- ModelHelper
30
- ) {
31
- "use strict";
32
-
33
- // additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
34
- // "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
35
- // Therefore adding a symbol like # or @
36
- var ADDITIONAL_STATES_KEY = "#additionalStates",
37
- NavType = NavLibrary.NavType;
38
-
39
- ///////////////////////////////////////////////////////////////////
40
- // methods to retrieve & apply states for the different controls //
41
- ///////////////////////////////////////////////////////////////////
42
-
43
- var _mControlStateHandlerMap = {
44
- "sap.ui.fl.variants.VariantManagement": {
45
- retrieve: function(oVM) {
46
- return {
47
- "variantId": oVM.getCurrentVariantKey()
48
- };
49
- },
50
- apply: function(oVM, oControlState) {
51
- if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
52
- var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId)
53
- ? oControlState.variantId
54
- : oVM.getStandardVariantKey();
55
- return ControlVariantApplyAPI.activateVariant({
56
- element: oVM,
57
- variantReference: sVariantReference
58
- });
59
- }
60
- }
61
- },
62
- "sap.m.IconTabBar": {
63
- retrieve: function(oTabBar) {
64
- return {
65
- selectedKey: oTabBar.getSelectedKey()
66
- };
67
- },
68
- apply: function(oTabBar, oControlState) {
69
- if (oControlState && oControlState.selectedKey) {
70
- var oSelectedItem = oTabBar.getItems().find(function(oItem) {
71
- return oItem.getKey() === oControlState.selectedKey;
72
- });
73
- if (oSelectedItem) {
74
- oTabBar.setSelectedItem(oSelectedItem);
75
- }
76
- }
77
- }
78
- },
79
- "sap.ui.mdc.FilterBar": {
80
- retrieve: function(oFilterBar) {
81
- return StateUtil.retrieveExternalState(oFilterBar).then(function(mFilterBarState) {
82
- // remove sensitive or view state irrelevant fields
83
- var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
84
- mFilter = mFilterBarState.filter || {};
85
- aPropertiesInfo
86
- .filter(function(oPropertyInfo) {
87
- return (
88
- mFilter[oPropertyInfo.path] &&
89
- (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0)
90
- );
91
- })
92
- .forEach(function(oPropertyInfo) {
93
- delete mFilter[oPropertyInfo.path];
94
- });
95
- return mFilterBarState;
96
- });
97
- },
98
- apply: function(oFilterBar, oControlState) {
99
- if (oControlState) {
100
- return StateUtil.applyExternalState(oFilterBar, oControlState);
101
- }
102
- }
103
- },
104
- "sap.ui.mdc.Table": {
105
- retrieve: function(oTable) {
106
- return StateUtil.retrieveExternalState(oTable);
107
- },
108
- apply: function(oTable, oControlState) {
109
- if (oControlState) {
110
- return StateUtil.applyExternalState(oTable, oControlState);
111
- }
112
- },
113
- refreshBinding: function(oTable) {
114
- var oTableBinding = oTable.getRowBinding();
115
- if (oTableBinding) {
116
- var oRootBinding = oTableBinding.getRootBinding();
117
- if (oRootBinding === oTableBinding) {
118
- // absolute binding
119
- oTableBinding.refresh();
120
- } else {
121
- // relative binding
122
- var oHeaderContext = oTableBinding.getHeaderContext();
123
- var sGroupId = oTableBinding.getGroupId();
124
-
125
- if (oHeaderContext) {
126
- oHeaderContext.requestSideEffects([{ $NavigationPropertyPath: "" }], sGroupId);
127
- }
128
- }
129
- } else {
130
- Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
131
- }
132
- }
133
- },
134
- "sap.uxap.ObjectPageLayout": {
135
- retrieve: function(oOPLayout) {
136
- return {
137
- selectedSection: oOPLayout.getSelectedSection()
138
- };
139
- },
140
- apply: function(oOPLayout, oControlState) {
141
- oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
142
- },
143
- refreshBinding: function(oOPLayout) {
144
- var oBindingContext = oOPLayout.getBindingContext();
145
- var oBinding = oBindingContext && oBindingContext.getBinding();
146
- if (oBinding) {
147
- var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
148
- var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
149
- if (sStrategy === "self") {
150
- // Refresh main context and 1-1 navigation properties or OP
151
- var oModel = oBindingContext.getModel(),
152
- oMetaModel = oModel.getMetaModel(),
153
- oNavigationProperties =
154
- CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
155
- $kind: "NavigationProperty"
156
- }) || {},
157
- aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function(aPrev, sNavProp) {
158
- if (oNavigationProperties[sNavProp].$isCollection !== true) {
159
- aPrev.push({ $NavigationPropertyPath: sNavProp });
160
- }
161
- return aPrev;
162
- }, []),
163
- aProperties = [{ $PropertyPath: "*" }],
164
- sGroupId = oBinding.getGroupId();
165
-
166
- oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
167
- } else if (sStrategy === "includingDependents") {
168
- // Complete refresh
169
- oBinding.refresh();
170
- }
171
- } else {
172
- Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
173
- }
174
- }
175
- },
176
- "sap.fe.macros.table.QuickFilterContainer": {
177
- retrieve: function(oQuickFilter) {
178
- return {
179
- selectedKey: oQuickFilter.getSelectorKey()
180
- };
181
- },
182
- apply: function(oQuickFilter, oControlState) {
183
- oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
184
- }
185
- },
186
- "sap.m.SegmentedButton": {
187
- retrieve: function(oSegmentedButton) {
188
- return {
189
- selectedKey: oSegmentedButton.getSelectedKey()
190
- };
191
- },
192
- apply: function(oSegmentedButton, oControlState) {
193
- oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
194
- }
195
- },
196
- "sap.m.Select": {
197
- retrieve: function(oSelect) {
198
- return {
199
- selectedKey: oSelect.getSelectedKey()
200
- };
201
- },
202
- apply: function(oSelect, oControlState) {
203
- oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
204
- }
205
- },
206
- "sap.f.DynamicPage": {
207
- retrieve: function(oDynamicPage) {
208
- return {
209
- headerExpanded: oDynamicPage.getHeaderExpanded()
210
- };
211
- },
212
- apply: function(oDynamicPage, oControlState) {
213
- oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
214
- }
215
- },
216
- "sap.ui.core.mvc.View": {
217
- retrieve: function(oView) {
218
- var oController = oView.getController();
219
- if (oController && oController.viewState) {
220
- return oController.viewState.retrieveViewState(oController.viewState);
221
- }
222
- return {};
223
- },
224
- apply: function(oView, oControlState, oNavParameters) {
225
- var oController = oView.getController();
226
- if (oController && oController.viewState) {
227
- return oController.viewState.applyViewState(oControlState, oNavParameters);
228
- }
229
- },
230
- refreshBinding: function(oView) {
231
- var oController = oView.getController();
232
- if (oController && oController.viewState) {
233
- return oController.viewState.refreshViewBindings();
234
- }
235
- }
236
- },
237
- "sap.ui.core.ComponentContainer": {
238
- retrieve: function(oComponentContainer) {
239
- var oComponent = oComponentContainer.getComponentInstance();
240
- if (oComponent) {
241
- return this.retrieveControlState(oComponent.getRootControl());
242
- }
243
- return {};
244
- },
245
- apply: function(oComponentContainer, oControlState, oNavParameters) {
246
- var oComponent = oComponentContainer.getComponentInstance();
247
- if (oComponent) {
248
- return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
249
- }
250
- }
251
- }
252
- };
253
-
254
- /**
255
- * @class A controller extension offering hooks for state handling
256
- *
257
- * If you need to maintain a specific state for your application, you can use the controller extension.
258
- *
259
- * @name sap.fe.core.controllerextensions.ViewState
260
- * @hideconstructor
261
- * @public
262
- * @since 1.85.0
263
- */
264
- var ViewState = ControllerExtension.extend("sap.fe.core.controllerextensions.ViewState", {
265
- metadata: {
266
- methods: {
267
- refreshViewBindings: { "public": true, "final": true },
268
- adaptBindingRefreshControls: {
269
- "public": true,
270
- "final": false,
271
- overrideExecution: OverrideExecution.After
272
- },
273
- getControlRefreshBindingHandler: {
274
- "public": false,
275
- "final": true
276
- },
277
- refreshControlBinding: {
278
- "public": false,
279
- "final": true
280
- },
281
- adaptBindingRefreshHandler: {
282
- "public": true,
283
- "final": false,
284
- overrideExecution: OverrideExecution.After
285
- },
286
- collectResults: { "public": false, "final": true },
287
- adaptControlStateHandler: {
288
- "public": true,
289
- "final": false,
290
- overrideExecution: OverrideExecution.After
291
- },
292
- getControlStateHandler: { "public": false, "final": true },
293
- adaptStateControls: {
294
- "public": true,
295
- "final": false,
296
- overrideExecution: OverrideExecution.After
297
- },
298
- retrieveAdditionalStates: {
299
- "public": true,
300
- "final": false,
301
- overrideExecution: OverrideExecution.After
302
- },
303
- retrieveViewState: { "public": true, "final": true },
304
- retrieveControlState: { "public": false, "final": true },
305
- applyInitialStateOnly: {
306
- "public": true,
307
- "final": false,
308
- overrideExecution: OverrideExecution.Instead
309
- },
310
- applyViewState: { "public": true, "final": true },
311
- applyControlState: { "public": false, "final": true },
312
- applyAdditionalStates: {
313
- "public": true,
314
- "final": false,
315
- overrideExecution: OverrideExecution.After
316
- },
317
- applyNavigationParameters: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
318
- onBeforeStateApplied: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
319
- onAfterStateApplied: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
320
- onSuspend: { "public": true, "final": false, overrideExecution: OverrideExecution.After },
321
- onRestore: { "public": true, "final": false, overrideExecution: OverrideExecution.After }
322
- }
323
- },
324
-
325
- /**
326
- * Constructor.
327
- */
328
- constructor: function() {
329
- ControllerExtension.apply(this);
330
- var that = this;
331
- that._iRetrievingStateCounter = 0;
332
- this._pInitialStateApplied = new Promise(function(resolve) {
333
- that._pInitialStateAppliedResolve = resolve;
334
- });
335
- },
336
-
337
- /**
338
- * @private
339
- * @name sap.fe.core.controllerextensions.ViewState.getMetadata
340
- * @function
341
- */
342
- /**
343
- * @private
344
- * @name sap.fe.core.controllerextensions.ViewState.extend
345
- * @function
346
- */
347
-
348
- refreshViewBindings: function() {
349
- var that = this;
350
- return that.collectResults(that.base.viewState.adaptBindingRefreshControls).then(function(aControls) {
351
- var oPromiseChain = Promise.resolve();
352
- aControls
353
- .filter(function(oControl) {
354
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
355
- })
356
- .forEach(function(oControl) {
357
- oPromiseChain = oPromiseChain.then(that.refreshControlBinding.bind(that, oControl));
358
- });
359
- return oPromiseChain;
360
- });
361
- },
362
- /**
363
- * This function should add all controls relevant for refreshing to the provided control array.
364
- *
365
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
366
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
367
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
368
- * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
369
- * @protected
370
- */
371
- adaptBindingRefreshControls: function(aCollectedControls) {},
372
-
373
- refreshControlBinding: function(oControl) {
374
- var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl),
375
- oPromiseChain = Promise.resolve(),
376
- that = this;
377
- if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
378
- Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
379
- } else {
380
- oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(that, oControl));
381
- }
382
- return oPromiseChain;
383
- },
384
-
385
- /**
386
- * Returns a map of <code>refreshBinding</code> function for a certain control.
387
- *
388
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
389
- * @returns {object} A plain object with one function: <code>refreshBinding</code>
390
- */
391
-
392
- getControlRefreshBindingHandler: function(oControl) {
393
- var oRefreshBindingHandler = {};
394
- if (oControl) {
395
- for (var sType in _mControlStateHandlerMap) {
396
- if (oControl.isA(sType)) {
397
- // pass only the refreshBinding handler in an object so that :
398
- // 1. Application has access only to refreshBinding and not apply and reterive at this stage
399
- // 2. Application modifications to the object will be reflected here (as we pass by reference)
400
- oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
401
- break;
402
- }
403
- }
404
- }
405
- this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
406
- return oRefreshBindingHandler;
407
- },
408
- /**
409
- * Customize the <code>refreshBinding</code> function for a certain control.
410
- *
411
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
412
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
413
- *
414
- * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
415
- * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
416
- *
417
- * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
418
- * @protected
419
- */
420
- adaptBindingRefreshHandler: function(oControl, oControlHandler) {},
421
-
422
- /**
423
- * Called when the application is suspended due to keep-alive mode.
424
- *
425
- * @alias sap.fe.core.controllerextensions.ViewState#onSuspend
426
- * @public
427
- */
428
- onSuspend: function() {},
429
-
430
- /**
431
- * Called when the application is restored due to keep-alive mode.
432
- *
433
- * @alias sap.fe.core.controllerextensions.ViewState#onRestore
434
- * @public
435
- */
436
- onRestore: function() {},
437
-
438
- /**
439
- * Destructor method for objects.
440
- */
441
- destroy: function() {
442
- delete this._pInitialStateApplied;
443
- delete this._pInitialStateAppliedResolve;
444
- delete this._iRetrievingStateCounter;
445
- ControllerExtension.prototype.destroy.apply(this);
446
- },
447
-
448
- /**
449
- * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
450
- * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
451
- *
452
- * @param {Function} fnCall The function to be called
453
- * @returns {Promise} A promise to be resolved with the result of all overrides
454
- */
455
- collectResults: function(fnCall) {
456
- var aResults = [],
457
- aArguments = Array.prototype.slice.call(arguments, 1);
458
- aArguments.push(aResults);
459
- fnCall.apply(this, aArguments);
460
- return Promise.all(aResults);
461
- },
462
-
463
- /**
464
- * Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
465
- *
466
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
467
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
468
- *
469
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
470
- * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
471
- *
472
- * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
473
- * @protected
474
- */
475
- adaptControlStateHandler: function(oControl, aControlHandler) {
476
- // to be overridden if needed
477
- },
478
-
479
- /**
480
- * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
481
- *
482
- * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
483
- * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
484
- */
485
- getControlStateHandler: function(oControl) {
486
- var aInternalControlStateHandler = [],
487
- aCustomControlStateHandler = [];
488
- if (oControl) {
489
- for (var sType in _mControlStateHandlerMap) {
490
- if (oControl.isA(sType)) {
491
- // avoid direct manipulation of internal _mControlStateHandlerMap
492
- aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
493
- break;
494
- }
495
- }
496
- }
497
- this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
498
- return aInternalControlStateHandler.concat(aCustomControlStateHandler);
499
- },
500
-
501
- /**
502
- * This function should add all controls for given view that should be considered for the state handling to the provided control array.
503
- *
504
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
505
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
506
- * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
507
- * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
508
- * @protected
509
- */
510
- adaptStateControls: function(aCollectedControls) {
511
- // to be overridden if needed
512
- },
513
-
514
- /**
515
- * Returns the key to be used for given control.
516
- *
517
- * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
518
- * @returns {string} The key to be used for storing the controls state
519
- */
520
- getStateKey: function(oControl) {
521
- return this.getView().getLocalId(oControl.getId()) || oControl.getId();
522
- },
523
-
524
- /**
525
- * Retrieve the view state of this extensions view.
526
- * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
527
- *
528
- * @returns {Promise} A promise resolving the view state
529
- *
530
- * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
531
- * @public
532
- */
533
- retrieveViewState: function() {
534
- var that = this;
535
- ++that._iRetrievingStateCounter;
536
- return that._pInitialStateApplied
537
- .then(function() {
538
- return that.collectResults(that.base.viewState.adaptStateControls);
539
- })
540
- .then(function(aControls) {
541
- return Promise.all(
542
- aControls
543
- .filter(function(oControl) {
544
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
545
- })
546
- .map(function(oControl) {
547
- return that.retrieveControlState(oControl).then(function(vResult) {
548
- return {
549
- key: that.getStateKey(oControl),
550
- value: vResult
551
- };
552
- });
553
- })
554
- );
555
- })
556
- .then(function(aResolvedStates) {
557
- return aResolvedStates.reduce(function(oStates, mState) {
558
- var oCurrentState = {};
559
- oCurrentState[mState.key] = mState.value;
560
- return mergeObjects(oStates, oCurrentState);
561
- }, {});
562
- })
563
- .then(function(oViewState) {
564
- return Promise.resolve(that._retrieveAdditionalStates()).then(function(mAdditionalStates) {
565
- if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
566
- oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
567
- }
568
- return oViewState;
569
- });
570
- })
571
- .finally(function() {
572
- --that._iRetrievingStateCounter;
573
- })
574
- .then(function(oViewState) {
575
- return that._iRetrievingStateCounter === 0 ? oViewState : undefined;
576
- });
577
- },
578
-
579
- /**
580
- * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
581
- *
582
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
583
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
584
- *
585
- * @param {object} mAdditionalStates The additional state
586
- *
587
- * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
588
- * @protected
589
- */
590
- retrieveAdditionalStates: function(mAdditionalStates) {
591
- // to be overridden if needed
592
- },
593
-
594
- /**
595
- * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
596
- *
597
- * @returns {object | Promise<object>} Additional view states
598
- */
599
- _retrieveAdditionalStates: function() {
600
- var mAdditionalStates = {};
601
- this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
602
- return mAdditionalStates;
603
- },
604
-
605
- /**
606
- * Returns the current state for the given control.
607
- *
608
- * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
609
- * @returns {Promise<object>} The state for the given control
610
- */
611
- retrieveControlState: function(oControl) {
612
- var aControlStateHandlers = this.getControlStateHandler(oControl);
613
- return Promise.all(
614
- aControlStateHandlers.map(function(mControlStateHandler) {
615
- if (typeof mControlStateHandler.retrieve !== "function") {
616
- throw new Error(
617
- "controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName()
618
- );
619
- }
620
- return mControlStateHandler.retrieve.call(this, oControl);
621
- })
622
- ).then(function(aStates) {
623
- return aStates.reduce(function(oFinalState, oCurrentState) {
624
- return mergeObjects(oFinalState, oCurrentState);
625
- }, {});
626
- });
627
- },
628
-
629
- /**
630
- * Defines whether the view state should only be applied once initially.
631
- *
632
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
633
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
634
- *
635
- * Important:
636
- * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
637
- *
638
- * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
639
- * else any new view state is also applied on follow-up calls (default)
640
- *
641
- * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
642
- * @protected
643
- */
644
- applyInitialStateOnly: function() {
645
- return true;
646
- },
647
- /**
648
- * Applies the given view state to this extensions view.
649
- *
650
- * @param {object} oViewState The view state to apply (can be undefined)
651
- * @param {object} oNavParameter The current navigation parameter
652
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
653
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
654
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
655
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
656
- *
657
- * @returns {Promise} Promise for async state handling
658
- *
659
- * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
660
- * @public
661
- */
662
- applyViewState: function(oViewState, oNavParameter) {
663
- var that = this;
664
- if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
665
- return Promise.resolve();
666
- }
667
- return this.collectResults(this.base.viewState.onBeforeStateApplied)
668
- .then(function() {
669
- return that.collectResults(that.base.viewState.adaptStateControls);
670
- })
671
- .then(function(aControls) {
672
- var oPromiseChain = Promise.resolve();
673
- aControls
674
- .filter(function(oControl) {
675
- return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
676
- })
677
- .forEach(function(oControl) {
678
- var sKey = that.getStateKey(oControl);
679
- oPromiseChain = oPromiseChain.then(
680
- that.applyControlState.bind(that, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter)
681
- );
682
- });
683
- return oPromiseChain;
684
- })
685
- .then(function() {
686
- if (oNavParameter.navigationType === NavType.iAppState) {
687
- return that.collectResults(
688
- that.base.viewState.applyAdditionalStates,
689
- oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined
690
- );
691
- } else {
692
- return that.collectResults(that.base.viewState.applyNavigationParameters, oNavParameter);
693
- }
694
- })
695
- .finally(function() {
696
- return that.collectResults(that.base.viewState.onAfterStateApplied).then(that._setInitialStateApplied.bind(that));
697
- });
698
- },
699
-
700
- _checkIfVariantIdIsAvailable: function(oVM, sVariantId) {
701
- var aVariants = oVM.getVariants(),
702
- bIsControlStateVariantAvailable = false;
703
- aVariants.forEach(function(oVariant) {
704
- if (oVariant.key === sVariantId) {
705
- bIsControlStateVariantAvailable = true;
706
- }
707
- });
708
- return bIsControlStateVariantAvailable;
709
- },
710
-
711
- _setInitialStateApplied: function() {
712
- if (this._pInitialStateAppliedResolve) {
713
- var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
714
- delete this._pInitialStateAppliedResolve;
715
- pInitialStateAppliedResolve();
716
- }
717
- },
718
-
719
- _getInitialStateApplied: function() {
720
- return !this._pInitialStateAppliedResolve;
721
- },
722
-
723
- /**
724
- * Hook to react before a state for given view is applied.
725
- *
726
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
727
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
728
- *
729
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
730
- *
731
- * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
732
- * @protected
733
- */
734
- onBeforeStateApplied: function(aPromises) {},
735
-
736
- /**
737
- * Hook to react when state for given view was applied.
738
- *
739
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
740
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
741
- *
742
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
743
- *
744
- * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
745
- * @protected
746
- */
747
- onAfterStateApplied: function(aPromises) {},
748
-
749
- /**
750
- * Applying additional, not control related, states - is called only if navigation type is iAppState.
751
- *
752
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
753
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
754
- *
755
- * @param {object} oViewState The current view state
756
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
757
- *
758
- * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
759
- * @protected
760
- */
761
- applyAdditionalStates: function(oViewState, aPromises) {
762
- // to be overridden if needed
763
- },
764
-
765
- /**
766
- * Apply navigation parameters - is called only if navigation type is not iAppState.
767
- *
768
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
769
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
770
- *
771
- * @param {object} oNavParameter The current navigation parameter
772
- * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
773
- * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
774
- * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
775
- * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
776
- * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
777
- *
778
- * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
779
- * @protected
780
- */
781
- applyNavigationParameters: function(oNavParameter, aPromises) {
782
- // to be overridden if needed
783
- },
784
-
785
- /**
786
- * Applying the given state to the given control.
787
- *
788
- * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
789
- * @param {object} oControlState The state for the given control
790
- * @param {object} oNavParameters The current navigation parameters
791
- * @returns {any} Return a promise for async state handling
792
- */
793
- applyControlState: function(oControl, oControlState, oNavParameters) {
794
- var aControlStateHandlers = this.getControlStateHandler(oControl),
795
- oPromiseChain = Promise.resolve(),
796
- that = this;
797
- aControlStateHandlers.forEach(function(mControlStateHandler) {
798
- if (typeof mControlStateHandler.apply !== "function") {
799
- throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
800
- }
801
- oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(that, oControl, oControlState, oNavParameters));
802
- });
803
- return oPromiseChain;
804
- }
805
- });
806
-
807
- return ViewState;
808
- }
809
- );
5
+ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/base/Log", "sap/base/util/merge", "sap/ui/fl/apply/api/ControlVariantApplyAPI", "sap/ui/mdc/p13n/StateUtil", "sap/fe/navigation/library", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/controllerextensions/ControllerExtensionMetadata"], function (ControllerExtension, OverrideExecution, Log, mergeObjects, ControlVariantApplyAPI, StateUtil, NavLibrary, CommonUtils, KeepAliveHelper, ModelHelper, ClassSupport, ControllerExtensionMetadata) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _class, _class2;
9
+
10
+ var UI5Class = ClassSupport.UI5Class;
11
+ var Public = ClassSupport.Public;
12
+ var Private = ClassSupport.Private;
13
+ var Final = ClassSupport.Final;
14
+ var Extensible = ClassSupport.Extensible;
15
+
16
+ function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
17
+
18
+ function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
19
+
20
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
21
+
22
+ 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); }
23
+
24
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
+
26
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
27
+
28
+ // additionalStates are stored next to control IDs, so name clash avoidance needed. Fortunately IDs have restrictions:
29
+ // "Allowed is a sequence of characters (capital/lowercase), digits, underscores, dashes, points and/or colons."
30
+ // Therefore adding a symbol like # or @
31
+ var ADDITIONAL_STATES_KEY = "#additionalStates",
32
+ NavType = NavLibrary.NavType; ///////////////////////////////////////////////////////////////////
33
+ // methods to retrieve & apply states for the different controls //
34
+ ///////////////////////////////////////////////////////////////////
35
+
36
+ var _mControlStateHandlerMap = {
37
+ "sap.ui.fl.variants.VariantManagement": {
38
+ retrieve: function (oVM) {
39
+ return {
40
+ "variantId": oVM.getCurrentVariantKey()
41
+ };
42
+ },
43
+ apply: function (oVM, oControlState) {
44
+ if (oControlState && oControlState.variantId !== undefined && oControlState.variantId !== oVM.getCurrentVariantKey()) {
45
+ var sVariantReference = this._checkIfVariantIdIsAvailable(oVM, oControlState.variantId) ? oControlState.variantId : oVM.getStandardVariantKey();
46
+ return ControlVariantApplyAPI.activateVariant({
47
+ element: oVM,
48
+ variantReference: sVariantReference
49
+ });
50
+ }
51
+ }
52
+ },
53
+ "sap.m.IconTabBar": {
54
+ retrieve: function (oTabBar) {
55
+ return {
56
+ selectedKey: oTabBar.getSelectedKey()
57
+ };
58
+ },
59
+ apply: function (oTabBar, oControlState) {
60
+ if (oControlState && oControlState.selectedKey) {
61
+ var oSelectedItem = oTabBar.getItems().find(function (oItem) {
62
+ return oItem.getKey() === oControlState.selectedKey;
63
+ });
64
+
65
+ if (oSelectedItem) {
66
+ oTabBar.setSelectedItem(oSelectedItem);
67
+ }
68
+ }
69
+ }
70
+ },
71
+ "sap.ui.mdc.FilterBar": {
72
+ retrieve: function (oFilterBar) {
73
+ return StateUtil.retrieveExternalState(oFilterBar).then(function (mFilterBarState) {
74
+ // remove sensitive or view state irrelevant fields
75
+ var aPropertiesInfo = oFilterBar.getPropertyInfoSet(),
76
+ mFilter = mFilterBarState.filter || {};
77
+ aPropertiesInfo.filter(function (oPropertyInfo) {
78
+ return mFilter[oPropertyInfo.path] && (oPropertyInfo.removeFromAppState || mFilter[oPropertyInfo.path].length === 0);
79
+ }).forEach(function (oPropertyInfo) {
80
+ delete mFilter[oPropertyInfo.path];
81
+ });
82
+ return mFilterBarState;
83
+ });
84
+ },
85
+ apply: function (oFilterBar, oControlState) {
86
+ if (oControlState) {
87
+ return StateUtil.applyExternalState(oFilterBar, oControlState);
88
+ }
89
+ }
90
+ },
91
+ "sap.ui.mdc.Table": {
92
+ retrieve: function (oTable) {
93
+ return StateUtil.retrieveExternalState(oTable);
94
+ },
95
+ apply: function (oTable, oControlState) {
96
+ if (oControlState) {
97
+ return StateUtil.applyExternalState(oTable, oControlState);
98
+ }
99
+ },
100
+ refreshBinding: function (oTable) {
101
+ var oTableBinding = oTable.getRowBinding();
102
+
103
+ if (oTableBinding) {
104
+ var oRootBinding = oTableBinding.getRootBinding();
105
+
106
+ if (oRootBinding === oTableBinding) {
107
+ // absolute binding
108
+ oTableBinding.refresh();
109
+ } else {
110
+ // relative binding
111
+ var oHeaderContext = oTableBinding.getHeaderContext();
112
+ var sGroupId = oTableBinding.getGroupId();
113
+
114
+ if (oHeaderContext) {
115
+ oHeaderContext.requestSideEffects([{
116
+ $NavigationPropertyPath: ""
117
+ }], sGroupId);
118
+ }
119
+ }
120
+ } else {
121
+ Log.info("Table: " + oTable.getId() + " was not refreshed. No binding found!");
122
+ }
123
+ }
124
+ },
125
+ "sap.uxap.ObjectPageLayout": {
126
+ retrieve: function (oOPLayout) {
127
+ return {
128
+ selectedSection: oOPLayout.getSelectedSection()
129
+ };
130
+ },
131
+ apply: function (oOPLayout, oControlState) {
132
+ oControlState && oOPLayout.setSelectedSection(oControlState.selectedSection);
133
+ },
134
+ refreshBinding: function (oOPLayout) {
135
+ var oBindingContext = oOPLayout.getBindingContext();
136
+ var oBinding = oBindingContext && oBindingContext.getBinding();
137
+
138
+ if (oBinding) {
139
+ var sMetaPath = ModelHelper.getMetaPathForContext(oBindingContext);
140
+ var sStrategy = KeepAliveHelper.getControlRefreshStrategyForContextPath(oOPLayout, sMetaPath);
141
+
142
+ if (sStrategy === "self") {
143
+ // Refresh main context and 1-1 navigation properties or OP
144
+ var oModel = oBindingContext.getModel(),
145
+ oMetaModel = oModel.getMetaModel(),
146
+ oNavigationProperties = CommonUtils.getContextPathProperties(oMetaModel, sMetaPath, {
147
+ $kind: "NavigationProperty"
148
+ }) || {},
149
+ aNavPropertiesToRequest = Object.keys(oNavigationProperties).reduce(function (aPrev, sNavProp) {
150
+ if (oNavigationProperties[sNavProp].$isCollection !== true) {
151
+ aPrev.push({
152
+ $NavigationPropertyPath: sNavProp
153
+ });
154
+ }
155
+
156
+ return aPrev;
157
+ }, []),
158
+ aProperties = [{
159
+ $PropertyPath: "*"
160
+ }],
161
+ sGroupId = oBinding.getGroupId();
162
+ oBindingContext.requestSideEffects(aProperties.concat(aNavPropertiesToRequest), sGroupId);
163
+ } else if (sStrategy === "includingDependents") {
164
+ // Complete refresh
165
+ oBinding.refresh();
166
+ }
167
+ } else {
168
+ Log.info("ObjectPage: " + oOPLayout.getId() + " was not refreshed. No binding found!");
169
+ }
170
+ }
171
+ },
172
+ "sap.fe.macros.table.QuickFilterContainer": {
173
+ retrieve: function (oQuickFilter) {
174
+ return {
175
+ selectedKey: oQuickFilter.getSelectorKey()
176
+ };
177
+ },
178
+ apply: function (oQuickFilter, oControlState) {
179
+ oControlState && oQuickFilter.setSelectorKey(oControlState.selectedKey);
180
+ }
181
+ },
182
+ "sap.m.SegmentedButton": {
183
+ retrieve: function (oSegmentedButton) {
184
+ return {
185
+ selectedKey: oSegmentedButton.getSelectedKey()
186
+ };
187
+ },
188
+ apply: function (oSegmentedButton, oControlState) {
189
+ oControlState && oSegmentedButton.setSelectedKey(oControlState.selectedKey);
190
+ }
191
+ },
192
+ "sap.m.Select": {
193
+ retrieve: function (oSelect) {
194
+ return {
195
+ selectedKey: oSelect.getSelectedKey()
196
+ };
197
+ },
198
+ apply: function (oSelect, oControlState) {
199
+ oControlState && oSelect.setSelectedKey(oControlState.selectedKey);
200
+ }
201
+ },
202
+ "sap.f.DynamicPage": {
203
+ retrieve: function (oDynamicPage) {
204
+ return {
205
+ headerExpanded: oDynamicPage.getHeaderExpanded()
206
+ };
207
+ },
208
+ apply: function (oDynamicPage, oControlState) {
209
+ oControlState && oDynamicPage.setHeaderExpanded(oControlState.headerExpanded);
210
+ }
211
+ },
212
+ "sap.ui.core.mvc.View": {
213
+ retrieve: function (oView) {
214
+ var oController = oView.getController();
215
+
216
+ if (oController && oController.viewState) {
217
+ return oController.viewState.retrieveViewState(oController.viewState);
218
+ }
219
+
220
+ return {};
221
+ },
222
+ apply: function (oView, oControlState, oNavParameters) {
223
+ var oController = oView.getController();
224
+
225
+ if (oController && oController.viewState) {
226
+ return oController.viewState.applyViewState(oControlState, oNavParameters);
227
+ }
228
+ },
229
+ refreshBinding: function (oView) {
230
+ var oController = oView.getController();
231
+
232
+ if (oController && oController.viewState) {
233
+ return oController.viewState.refreshViewBindings();
234
+ }
235
+ }
236
+ },
237
+ "sap.ui.core.ComponentContainer": {
238
+ retrieve: function (oComponentContainer) {
239
+ var oComponent = oComponentContainer.getComponentInstance();
240
+
241
+ if (oComponent) {
242
+ return this.retrieveControlState(oComponent.getRootControl());
243
+ }
244
+
245
+ return {};
246
+ },
247
+ apply: function (oComponentContainer, oControlState, oNavParameters) {
248
+ var oComponent = oComponentContainer.getComponentInstance();
249
+
250
+ if (oComponent) {
251
+ return this.applyControlState(oComponent.getRootControl(), oControlState, oNavParameters);
252
+ }
253
+ }
254
+ }
255
+ };
256
+ /**
257
+ * A controller extension offering hooks for state handling
258
+ *
259
+ * If you need to maintain a specific state for your application, you can use the controller extension.
260
+ *
261
+ * @hideconstructor
262
+ * @public
263
+ * @since 1.85.0
264
+ */
265
+
266
+ var ViewState = (_dec = UI5Class("sap.fe.core.controllerextensions.ViewState", ControllerExtensionMetadata), _dec2 = Extensible(OverrideExecution.After), _dec3 = Extensible(OverrideExecution.After), _dec4 = Extensible(OverrideExecution.After), _dec5 = Extensible(OverrideExecution.After), _dec6 = Extensible(OverrideExecution.After), _dec7 = Extensible(OverrideExecution.After), _dec8 = Extensible(OverrideExecution.After), _dec9 = Extensible(OverrideExecution.Instead), _dec10 = Extensible(OverrideExecution.After), _dec11 = Extensible(OverrideExecution.After), _dec12 = Extensible(OverrideExecution.After), _dec13 = Extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
267
+ _inherits(ViewState, _ControllerExtension);
268
+
269
+ /**
270
+ * Constructor.
271
+ */
272
+ function ViewState() {
273
+ var _this;
274
+
275
+ _this = _ControllerExtension.call(this) || this;
276
+ _this._iRetrievingStateCounter = 0;
277
+ _this._pInitialStateApplied = new Promise(function (resolve) {
278
+ _this._pInitialStateAppliedResolve = resolve;
279
+ });
280
+ return _this;
281
+ }
282
+ /**
283
+ * @private
284
+ * @name sap.fe.core.controllerextensions.ViewState.getMetadata
285
+ * @function
286
+ */
287
+
288
+ /**
289
+ * @private
290
+ * @name sap.fe.core.controllerextensions.ViewState.extend
291
+ * @function
292
+ */
293
+
294
+
295
+ var _proto = ViewState.prototype;
296
+
297
+ _proto.refreshViewBindings = function refreshViewBindings() {
298
+ var _this2 = this;
299
+
300
+ return this.collectResults(this.base.viewState.adaptBindingRefreshControls).then(function (aControls) {
301
+ var oPromiseChain = Promise.resolve();
302
+ aControls.filter(function (oControl) {
303
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
304
+ }).forEach(function (oControl) {
305
+ oPromiseChain = oPromiseChain.then(_this2.refreshControlBinding.bind(_this2, oControl));
306
+ });
307
+ return oPromiseChain;
308
+ });
309
+ }
310
+ /**
311
+ * This function should add all controls relevant for refreshing to the provided control array.
312
+ *
313
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
314
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
315
+ * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
316
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshControls
317
+ * @protected
318
+ */
319
+ ;
320
+
321
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
322
+ adaptBindingRefreshControls = function adaptBindingRefreshControls(aCollectedControls) {// to be overriden
323
+ };
324
+
325
+ _proto.refreshControlBinding = function refreshControlBinding(oControl) {
326
+ var oControlRefreshBindingHandler = this.getControlRefreshBindingHandler(oControl);
327
+ var oPromiseChain = Promise.resolve();
328
+
329
+ if (typeof oControlRefreshBindingHandler.refreshBinding !== "function") {
330
+ Log.info("refreshBinding handler for control: " + oControl.getMetadata().getName() + " is not provided");
331
+ } else {
332
+ oPromiseChain = oPromiseChain.then(oControlRefreshBindingHandler.refreshBinding.bind(this, oControl));
333
+ }
334
+
335
+ return oPromiseChain;
336
+ }
337
+ /**
338
+ * Returns a map of <code>refreshBinding</code> function for a certain control.
339
+ *
340
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
341
+ * @returns {object} A plain object with one function: <code>refreshBinding</code>
342
+ */
343
+ ;
344
+
345
+ _proto.getControlRefreshBindingHandler = function getControlRefreshBindingHandler(oControl) {
346
+ var oRefreshBindingHandler = {};
347
+
348
+ if (oControl) {
349
+ for (var sType in _mControlStateHandlerMap) {
350
+ if (oControl.isA(sType)) {
351
+ // pass only the refreshBinding handler in an object so that :
352
+ // 1. Application has access only to refreshBinding and not apply and reterive at this stage
353
+ // 2. Application modifications to the object will be reflected here (as we pass by reference)
354
+ oRefreshBindingHandler["refreshBinding"] = _mControlStateHandlerMap[sType].refreshBinding || {};
355
+ break;
356
+ }
357
+ }
358
+ }
359
+
360
+ this.base.viewState.adaptBindingRefreshHandler(oControl, oRefreshBindingHandler);
361
+ return oRefreshBindingHandler;
362
+ }
363
+ /**
364
+ * Customize the <code>refreshBinding</code> function for a certain control.
365
+ *
366
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
367
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
368
+ *
369
+ * @param {sap.ui.base.ManagedObject} oControl The control for which the refresh handler is adapted.
370
+ * @param {Array<object>} oControlHandler A plain object which can have one function: <code>refreshBinding</code>
371
+ *
372
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptBindingRefreshHandler
373
+ * @protected
374
+ */
375
+ ;
376
+
377
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
378
+ adaptBindingRefreshHandler = function adaptBindingRefreshHandler(oControl, oControlHandler) {// to be overriden
379
+ }
380
+ /**
381
+ * Called when the application is suspended due to keep-alive mode.
382
+ *
383
+ * @alias sap.fe.core.controllerextensions.ViewState#onSuspend
384
+ * @public
385
+ */
386
+ ;
387
+
388
+ _proto.onSuspend = function onSuspend() {// to be overriden
389
+ }
390
+ /**
391
+ * Called when the application is restored due to keep-alive mode.
392
+ *
393
+ * @alias sap.fe.core.controllerextensions.ViewState#onRestore
394
+ * @public
395
+ */
396
+ ;
397
+
398
+ _proto.onRestore = function onRestore() {// to be overriden
399
+ }
400
+ /**
401
+ * Destructor method for objects.
402
+ */
403
+ ;
404
+
405
+ _proto.destroy = function destroy() {
406
+ delete this._pInitialStateAppliedResolve;
407
+
408
+ _get(_getPrototypeOf(ViewState.prototype), "destroy", this).call(this);
409
+ }
410
+ /**
411
+ * Helper function to enable multi override. It is adding an additional parameter (array) to the provided
412
+ * function (and its parameters), that will be evaluated via <code>Promise.all</code>.
413
+ *
414
+ * @param {Function} fnCall The function to be called
415
+ * @param args
416
+ * @returns {Promise} A promise to be resolved with the result of all overrides
417
+ */
418
+ ;
419
+
420
+ _proto.collectResults = function collectResults(fnCall) {
421
+ var aResults = [];
422
+
423
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
424
+ args[_key - 1] = arguments[_key];
425
+ }
426
+
427
+ args.push(aResults);
428
+ fnCall.apply(this, args);
429
+ return Promise.all(aResults);
430
+ }
431
+ /**
432
+ * Customize the <code>retrieve</code> and <code>apply</code> functions for a certain control.
433
+ *
434
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
435
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
436
+ *
437
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
438
+ * @param {Array<object>} aControlHandler A list of plain objects with two functions: <code>retrieve</code> and <code>apply</code>
439
+ *
440
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptControlStateHandler
441
+ * @protected
442
+ */
443
+ ;
444
+
445
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
446
+ adaptControlStateHandler = function adaptControlStateHandler(oControl, aControlHandler) {// to be overridden if needed
447
+ }
448
+ /**
449
+ * Returns a map of <code>retrieve</code> and <code>apply</code> functions for a certain control.
450
+ *
451
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state handler for
452
+ * @returns {object} A plain object with two functions: <code>retrieve</code> and <code>apply</code>
453
+ */
454
+ ;
455
+
456
+ _proto.getControlStateHandler = function getControlStateHandler(oControl) {
457
+ var aInternalControlStateHandler = [],
458
+ aCustomControlStateHandler = [];
459
+
460
+ if (oControl) {
461
+ for (var sType in _mControlStateHandlerMap) {
462
+ if (oControl.isA(sType)) {
463
+ // avoid direct manipulation of internal _mControlStateHandlerMap
464
+ aInternalControlStateHandler.push(Object.assign({}, _mControlStateHandlerMap[sType]));
465
+ break;
466
+ }
467
+ }
468
+ }
469
+
470
+ this.base.viewState.adaptControlStateHandler(oControl, aCustomControlStateHandler);
471
+ return aInternalControlStateHandler.concat(aCustomControlStateHandler);
472
+ }
473
+ /**
474
+ * This function should add all controls for given view that should be considered for the state handling to the provided control array.
475
+ *
476
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
477
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
478
+ * @param {Array<sap.ui.base.ManagedObject>} aCollectedControls The collected controls
479
+ * @alias sap.fe.core.controllerextensions.ViewState#adaptStateControls
480
+ * @protected
481
+ */
482
+ ;
483
+
484
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
485
+ adaptStateControls = function adaptStateControls(aCollectedControls) {// to be overridden if needed
486
+ }
487
+ /**
488
+ * Returns the key to be used for given control.
489
+ *
490
+ * @param {sap.ui.base.ManagedObject} oControl The control to get state key for
491
+ * @returns {string} The key to be used for storing the controls state
492
+ */
493
+ ;
494
+
495
+ _proto.getStateKey = function getStateKey(oControl) {
496
+ return this.getView().getLocalId(oControl.getId()) || oControl.getId();
497
+ }
498
+ /**
499
+ * Retrieve the view state of this extensions view.
500
+ * When this function is called more than once before finishing, all but the final response will resolve to <code>undefined</code>.
501
+ *
502
+ * @returns {Promise} A promise resolving the view state
503
+ *
504
+ * @alias sap.fe.core.controllerextensions.ViewState#retrieveViewState
505
+ * @public
506
+ */
507
+ ;
508
+
509
+ _proto.retrieveViewState = function retrieveViewState() {
510
+ var _this3 = this;
511
+
512
+ ++this._iRetrievingStateCounter;
513
+ return this._pInitialStateApplied.then(function () {
514
+ return _this3.collectResults(_this3.base.viewState.adaptStateControls);
515
+ }).then(function (aControls) {
516
+ return Promise.all(aControls.filter(function (oControl) {
517
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
518
+ }).map(function (oControl) {
519
+ return _this3.retrieveControlState(oControl).then(function (vResult) {
520
+ return {
521
+ key: _this3.getStateKey(oControl),
522
+ value: vResult
523
+ };
524
+ });
525
+ }));
526
+ }).then(function (aResolvedStates) {
527
+ return aResolvedStates.reduce(function (oStates, mState) {
528
+ var oCurrentState = {};
529
+ oCurrentState[mState.key] = mState.value;
530
+ return mergeObjects(oStates, oCurrentState);
531
+ }, {});
532
+ }).then(function (oViewState) {
533
+ return Promise.resolve(_this3._retrieveAdditionalStates()).then(function (mAdditionalStates) {
534
+ if (mAdditionalStates && Object.keys(mAdditionalStates).length) {
535
+ oViewState[ADDITIONAL_STATES_KEY] = mAdditionalStates;
536
+ }
537
+
538
+ return oViewState;
539
+ });
540
+ }).finally(function () {
541
+ --_this3._iRetrievingStateCounter;
542
+ }).then(function (oViewState) {
543
+ return _this3._iRetrievingStateCounter === 0 ? oViewState : undefined;
544
+ });
545
+ }
546
+ /**
547
+ * Extend the map of additional states (not control bound) to be added to the current view state of the given view.
548
+ *
549
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
550
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
551
+ *
552
+ * @param {object} mAdditionalStates The additional state
553
+ *
554
+ * @alias sap.fe.core.controllerextensions.ViewState#retrieveAdditionalStates
555
+ * @protected
556
+ */
557
+ ;
558
+
559
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
560
+ retrieveAdditionalStates = function retrieveAdditionalStates(mAdditionalStates) {// to be overridden if needed
561
+ }
562
+ /**
563
+ * Returns a map of additional states (not control bound) to be added to the current view state of the given view.
564
+ *
565
+ * @returns {object | Promise<object>} Additional view states
566
+ */
567
+ ;
568
+
569
+ _proto._retrieveAdditionalStates = function _retrieveAdditionalStates() {
570
+ var mAdditionalStates = {};
571
+ this.base.viewState.retrieveAdditionalStates(mAdditionalStates);
572
+ return mAdditionalStates;
573
+ }
574
+ /**
575
+ * Returns the current state for the given control.
576
+ *
577
+ * @param {sap.ui.base.ManagedObject} oControl The object to get the state for
578
+ * @returns {Promise<object>} The state for the given control
579
+ */
580
+ ;
581
+
582
+ _proto.retrieveControlState = function retrieveControlState(oControl) {
583
+ var _this4 = this;
584
+
585
+ var aControlStateHandlers = this.getControlStateHandler(oControl);
586
+ return Promise.all(aControlStateHandlers.map(function (mControlStateHandler) {
587
+ if (typeof mControlStateHandler.retrieve !== "function") {
588
+ throw new Error("controlStateHandler.retrieve is not a function for control: " + oControl.getMetadata().getName());
589
+ }
590
+
591
+ return mControlStateHandler.retrieve.call(_this4, oControl);
592
+ })).then(function (aStates) {
593
+ return aStates.reduce(function (oFinalState, oCurrentState) {
594
+ return mergeObjects(oFinalState, oCurrentState);
595
+ }, {});
596
+ });
597
+ }
598
+ /**
599
+ * Defines whether the view state should only be applied once initially.
600
+ *
601
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
602
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
603
+ *
604
+ * Important:
605
+ * You should only override this method for custom pages and not for the standard ListReportPage and ObjectPage!
606
+ *
607
+ * @returns {boolean} If <code>true</code>, only the initial view state is applied once,
608
+ * else any new view state is also applied on follow-up calls (default)
609
+ *
610
+ * @alias sap.fe.core.controllerextensions.ViewState#applyInitialStateOnly
611
+ * @protected
612
+ */
613
+ ;
614
+
615
+ _proto.applyInitialStateOnly = function applyInitialStateOnly() {
616
+ return true;
617
+ }
618
+ /**
619
+ * Applies the given view state to this extensions view.
620
+ *
621
+ * @param {object} oViewState The view state to apply (can be undefined)
622
+ * @param {object} oNavParameter The current navigation parameter
623
+ * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
624
+ * @param {object} oNavParameter.selectionVariant The selectionVariant from the navigation
625
+ * @param {object} oNavParameter.selectionVariantDefaults The selectionVariant defaults from the navigation
626
+ * @param {boolean} oNavParameter.requiresStandardVariant Defines whether standard variant must be used in VM
627
+ *
628
+ * @returns {Promise} Promise for async state handling
629
+ *
630
+ * @alias sap.fe.core.controllerextensions.ViewState#applyViewState
631
+ * @public
632
+ */
633
+ ;
634
+
635
+ _proto.applyViewState = function applyViewState(oViewState, oNavParameter) {
636
+ var _this5 = this;
637
+
638
+ if (this.base.viewState.applyInitialStateOnly() && this._getInitialStateApplied()) {
639
+ return Promise.resolve();
640
+ }
641
+
642
+ return this.collectResults(this.base.viewState.onBeforeStateApplied).then(function () {
643
+ return _this5.collectResults(_this5.base.viewState.adaptStateControls);
644
+ }).then(function (aControls) {
645
+ var oPromiseChain = Promise.resolve();
646
+ aControls.filter(function (oControl) {
647
+ return oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject");
648
+ }).forEach(function (oControl) {
649
+ var sKey = _this5.getStateKey(oControl);
650
+
651
+ oPromiseChain = oPromiseChain.then(_this5.applyControlState.bind(_this5, oControl, oViewState ? oViewState[sKey] : undefined, oNavParameter));
652
+ });
653
+ return oPromiseChain;
654
+ }).then(function () {
655
+ if (oNavParameter.navigationType === NavType.iAppState) {
656
+ return _this5.collectResults(_this5.base.viewState.applyAdditionalStates, oViewState ? oViewState[ADDITIONAL_STATES_KEY] : undefined);
657
+ } else {
658
+ return _this5.collectResults(_this5.base.viewState.applyNavigationParameters, oNavParameter);
659
+ }
660
+ }).finally(function () {
661
+ return _this5.collectResults(_this5.base.viewState.onAfterStateApplied).then(_this5._setInitialStateApplied.bind(_this5));
662
+ });
663
+ };
664
+
665
+ _proto._checkIfVariantIdIsAvailable = function _checkIfVariantIdIsAvailable(oVM, sVariantId) {
666
+ var aVariants = oVM.getVariants();
667
+ var bIsControlStateVariantAvailable = false;
668
+ aVariants.forEach(function (oVariant) {
669
+ if (oVariant.key === sVariantId) {
670
+ bIsControlStateVariantAvailable = true;
671
+ }
672
+ });
673
+ return bIsControlStateVariantAvailable;
674
+ };
675
+
676
+ _proto._setInitialStateApplied = function _setInitialStateApplied() {
677
+ if (this._pInitialStateAppliedResolve) {
678
+ var pInitialStateAppliedResolve = this._pInitialStateAppliedResolve;
679
+ delete this._pInitialStateAppliedResolve;
680
+ pInitialStateAppliedResolve();
681
+ }
682
+ };
683
+
684
+ _proto._getInitialStateApplied = function _getInitialStateApplied() {
685
+ return !this._pInitialStateAppliedResolve;
686
+ }
687
+ /**
688
+ * Hook to react before a state for given view is applied.
689
+ *
690
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
691
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
692
+ *
693
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
694
+ *
695
+ * @alias sap.fe.core.controllerextensions.ViewState#onBeforeStateApplied
696
+ * @protected
697
+ */
698
+ ;
699
+
700
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
701
+ onBeforeStateApplied = function onBeforeStateApplied(aPromises) {// to be overriden
702
+ }
703
+ /**
704
+ * Hook to react when state for given view was applied.
705
+ *
706
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
707
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
708
+ *
709
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
710
+ *
711
+ * @alias sap.fe.core.controllerextensions.ViewState#onAfterStateApplied
712
+ * @protected
713
+ */
714
+ ;
715
+
716
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
717
+ onAfterStateApplied = function onAfterStateApplied(aPromises) {// to be overriden
718
+ }
719
+ /**
720
+ * Applying additional, not control related, states - is called only if navigation type is iAppState.
721
+ *
722
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
723
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
724
+ *
725
+ * @param {object} oViewState The current view state
726
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
727
+ *
728
+ * @alias sap.fe.core.controllerextensions.ViewState#applyAdditionalStates
729
+ * @protected
730
+ */
731
+ ;
732
+
733
+ _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
734
+ applyAdditionalStates = function applyAdditionalStates(oViewState, aPromises) {// to be overridden if needed
735
+ }
736
+ /**
737
+ * Apply navigation parameters - is called only if navigation type is not iAppState.
738
+ *
739
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
740
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
741
+ *
742
+ * @param {object} oNavParameter The current navigation parameter
743
+ * @param {sap.fe.navigation.NavType} oNavParameter.navigationType The actual navigation type
744
+ * @param {object} [oNavParameter.selectionVariant] The selectionVariant from the navigation
745
+ * @param {object} [oNavParameter.selectionVariantDefaults] The selectionVariant defaults from the navigation
746
+ * @param {boolean} [oNavParameter.requiresStandardVariant] Defines whether standard variant must be used in VM
747
+ * @param {Promise} aPromises Extensible array of promises to be resolved before continuing
748
+ *
749
+ * @alias sap.fe.core.controllerextensions.ViewState#applyNavigationParameters
750
+ * @protected
751
+ */
752
+ ;
753
+
754
+ _proto.applyNavigationParameters = function applyNavigationParameters( // eslint-disable-next-line @typescript-eslint/no-unused-vars
755
+ oNavParameter, // eslint-disable-next-line @typescript-eslint/no-unused-vars
756
+ aPromises) {// to be overridden if needed
757
+ }
758
+ /**
759
+ * Applying the given state to the given control.
760
+ *
761
+ * @param {sap.ui.base.ManagedObject} oControl The object to apply the given state
762
+ * @param {object} oControlState The state for the given control
763
+ * @param {object} [oNavParameters] The current navigation parameters
764
+ * @returns {any} Return a promise for async state handling
765
+ */
766
+ ;
767
+
768
+ _proto.applyControlState = function applyControlState(oControl, oControlState, oNavParameters) {
769
+ var _this6 = this;
770
+
771
+ var aControlStateHandlers = this.getControlStateHandler(oControl);
772
+ var oPromiseChain = Promise.resolve();
773
+ aControlStateHandlers.forEach(function (mControlStateHandler) {
774
+ if (typeof mControlStateHandler.apply !== "function") {
775
+ throw new Error("controlStateHandler.apply is not a function for control: " + oControl.getMetadata().getName());
776
+ }
777
+
778
+ oPromiseChain = oPromiseChain.then(mControlStateHandler.apply.bind(_this6, oControl, oControlState, oNavParameters));
779
+ });
780
+ return oPromiseChain;
781
+ };
782
+
783
+ _proto.getInterface = function getInterface() {
784
+ return this;
785
+ };
786
+
787
+ return ViewState;
788
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "refreshViewBindings", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshViewBindings"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshControls", [Public, _dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "refreshControlBinding", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "refreshControlBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlRefreshBindingHandler", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlRefreshBindingHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptBindingRefreshHandler", [Public, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptBindingRefreshHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onSuspend", [Public, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onSuspend"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRestore", [Public, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRestore"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "collectResults", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "collectResults"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptControlStateHandler", [Public, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getControlStateHandler", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getControlStateHandler"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "adaptStateControls", [Public, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "adaptStateControls"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getStateKey", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getStateKey"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveViewState", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveAdditionalStates", [Public, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "retrieveControlState", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "retrieveControlState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyInitialStateOnly", [Public, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "applyInitialStateOnly"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyViewState", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "applyViewState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable", [Private], Object.getOwnPropertyDescriptor(_class2.prototype, "_checkIfVariantIdIsAvailable"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeStateApplied", [Public, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterStateApplied", [Public, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterStateApplied"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyAdditionalStates", [Public, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "applyAdditionalStates"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyNavigationParameters", [Public, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "applyNavigationParameters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyControlState", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "applyControlState"), _class2.prototype)), _class2)) || _class);
789
+ return ViewState;
790
+ }, false);
791
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJuYW1lcyI6WyJBRERJVElPTkFMX1NUQVRFU19LRVkiLCJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIl9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCIsInJldHJpZXZlIiwib1ZNIiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJhcHBseSIsIm9Db250cm9sU3RhdGUiLCJ2YXJpYW50SWQiLCJ1bmRlZmluZWQiLCJzVmFyaWFudFJlZmVyZW5jZSIsIl9jaGVja0lmVmFyaWFudElkSXNBdmFpbGFibGUiLCJnZXRTdGFuZGFyZFZhcmlhbnRLZXkiLCJDb250cm9sVmFyaWFudEFwcGx5QVBJIiwiYWN0aXZhdGVWYXJpYW50IiwiZWxlbWVudCIsInZhcmlhbnRSZWZlcmVuY2UiLCJvVGFiQmFyIiwic2VsZWN0ZWRLZXkiLCJnZXRTZWxlY3RlZEtleSIsIm9TZWxlY3RlZEl0ZW0iLCJnZXRJdGVtcyIsImZpbmQiLCJvSXRlbSIsImdldEtleSIsInNldFNlbGVjdGVkSXRlbSIsIm9GaWx0ZXJCYXIiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwibUZpbHRlckJhclN0YXRlIiwiYVByb3BlcnRpZXNJbmZvIiwiZ2V0UHJvcGVydHlJbmZvU2V0IiwibUZpbHRlciIsImZpbHRlciIsIm9Qcm9wZXJ0eUluZm8iLCJwYXRoIiwicmVtb3ZlRnJvbUFwcFN0YXRlIiwibGVuZ3RoIiwiZm9yRWFjaCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsIm9UYWJsZSIsInJlZnJlc2hCaW5kaW5nIiwib1RhYmxlQmluZGluZyIsImdldFJvd0JpbmRpbmciLCJvUm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInJlZnJlc2giLCJvSGVhZGVyQ29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJzR3JvdXBJZCIsImdldEdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIkxvZyIsImluZm8iLCJnZXRJZCIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYVByZXYiLCJzTmF2UHJvcCIsIiRpc0NvbGxlY3Rpb24iLCJwdXNoIiwiYVByb3BlcnRpZXMiLCIkUHJvcGVydHlQYXRoIiwiY29uY2F0Iiwib1F1aWNrRmlsdGVyIiwiZ2V0U2VsZWN0b3JLZXkiLCJzZXRTZWxlY3RvcktleSIsIm9TZWdtZW50ZWRCdXR0b24iLCJzZXRTZWxlY3RlZEtleSIsIm9TZWxlY3QiLCJvRHluYW1pY1BhZ2UiLCJoZWFkZXJFeHBhbmRlZCIsImdldEhlYWRlckV4cGFuZGVkIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvVmlldyIsIm9Db250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsInZpZXdTdGF0ZSIsInJldHJpZXZlVmlld1N0YXRlIiwib05hdlBhcmFtZXRlcnMiLCJhcHBseVZpZXdTdGF0ZSIsInJlZnJlc2hWaWV3QmluZGluZ3MiLCJvQ29tcG9uZW50Q29udGFpbmVyIiwib0NvbXBvbmVudCIsImdldENvbXBvbmVudEluc3RhbmNlIiwicmV0cmlldmVDb250cm9sU3RhdGUiLCJnZXRSb290Q29udHJvbCIsImFwcGx5Q29udHJvbFN0YXRlIiwiVmlld1N0YXRlIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJFeHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsIkluc3RlYWQiLCJfaVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIiLCJfcEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUiLCJjb2xsZWN0UmVzdWx0cyIsImJhc2UiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJvUHJvbWlzZUNoYWluIiwib0NvbnRyb2wiLCJpc0EiLCJyZWZyZXNoQ29udHJvbEJpbmRpbmciLCJiaW5kIiwiYUNvbGxlY3RlZENvbnRyb2xzIiwib0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIiLCJnZXRDb250cm9sUmVmcmVzaEJpbmRpbmdIYW5kbGVyIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwib1JlZnJlc2hCaW5kaW5nSGFuZGxlciIsInNUeXBlIiwiYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIiLCJvQ29udHJvbEhhbmRsZXIiLCJvblN1c3BlbmQiLCJvblJlc3RvcmUiLCJkZXN0cm95IiwiZm5DYWxsIiwiYVJlc3VsdHMiLCJhcmdzIiwiYWxsIiwiYWRhcHRDb250cm9sU3RhdGVIYW5kbGVyIiwiYUNvbnRyb2xIYW5kbGVyIiwiZ2V0Q29udHJvbFN0YXRlSGFuZGxlciIsImFJbnRlcm5hbENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlciIsImFzc2lnbiIsImFkYXB0U3RhdGVDb250cm9scyIsImdldFN0YXRlS2V5IiwiZ2V0VmlldyIsImdldExvY2FsSWQiLCJtYXAiLCJ2UmVzdWx0Iiwia2V5IiwidmFsdWUiLCJhUmVzb2x2ZWRTdGF0ZXMiLCJvU3RhdGVzIiwibVN0YXRlIiwib0N1cnJlbnRTdGF0ZSIsIm1lcmdlT2JqZWN0cyIsIm9WaWV3U3RhdGUiLCJfcmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwibUFkZGl0aW9uYWxTdGF0ZXMiLCJmaW5hbGx5IiwicmV0cmlldmVBZGRpdGlvbmFsU3RhdGVzIiwiYUNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwibUNvbnRyb2xTdGF0ZUhhbmRsZXIiLCJFcnJvciIsImNhbGwiLCJhU3RhdGVzIiwib0ZpbmFsU3RhdGUiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJvTmF2UGFyYW1ldGVyIiwiX2dldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJvbkJlZm9yZVN0YXRlQXBwbGllZCIsInNLZXkiLCJuYXZpZ2F0aW9uVHlwZSIsImlBcHBTdGF0ZSIsImFwcGx5QWRkaXRpb25hbFN0YXRlcyIsImFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvbkFmdGVyU3RhdGVBcHBsaWVkIiwiX3NldEluaXRpYWxTdGF0ZUFwcGxpZWQiLCJzVmFyaWFudElkIiwiYVZhcmlhbnRzIiwiZ2V0VmFyaWFudHMiLCJiSXNDb250cm9sU3RhdGVWYXJpYW50QXZhaWxhYmxlIiwib1ZhcmlhbnQiLCJwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUiLCJhUHJvbWlzZXMiLCJnZXRJbnRlcmZhY2UiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxxQkFBcUIsR0FBRyxtQkFBOUI7QUFBQSxNQUNDQyxPQUFPLEdBQUdDLFVBQVUsQ0FBQ0QsT0FEdEIsQyxDQUVBO0FBQ0E7QUFDQTs7QUFDQSxNQUFNRSx3QkFBNkMsR0FBRztBQUNyRCw0Q0FBd0M7QUFDdkNDLE1BQUFBLFFBQVEsRUFBRSxVQUFTQyxHQUFULEVBQW1CO0FBQzVCLGVBQU87QUFDTix1QkFBYUEsR0FBRyxDQUFDQyxvQkFBSjtBQURQLFNBQVA7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QUlELGFBQWEsR0FBR1AsT0FBTyxDQUFDQyxPQUFSLEVBQXBCO0FBQ0FtRCxNQUFBQSxxQkFBcUIsQ0FBQ3hJLE9BQXRCLENBQThCLFVBQUN5SSxvQkFBRCxFQUErQjtBQUM1RCxZQUFJLE9BQU9BLG9CQUFvQixDQUFDMUssS0FBNUIsS0FBc0MsVUFBMUMsRUFBc0Q7QUFDckQsZ0JBQU0sSUFBSTJLLEtBQUosQ0FBVSw4REFBOEQ5QyxRQUFRLENBQUNPLFdBQVQsR0FBdUJDLE9BQXZCLEVBQXhFLENBQU47QUFDQTs7QUFDRFQsUUFBQUEsYUFBYSxHQUFHQSxhQUFhLENBQUNyRyxJQUFkLENBQW1CbUosb0JBQW9CLENBQUMxSyxLQUFyQixDQUEyQmdJLElBQTNCLENBQWdDLE1BQWhDLEVBQXNDSCxRQUF0QyxFQUFnRDVILGFBQWhELEVBQStEa0csY0FBL0QsQ0FBbkIsQ0FBaEI7QUFDQSxPQUxEO0FBTUEsYUFBT3lCLGFBQVA7QUFDQSxLOztXQUNEcUUsWSxHQUFBLHdCQUFlO0FBQ2QsYUFBTyxJQUFQO0FBQ0EsSzs7O0lBaGpCc0JDLG1CLHlFQTRCdEJDLE0sRUFDQUMsSywrS0F1QkFELE0sd0xBT0FFLE8sRUFDQUQsSyxxTEFtQkFDLE8sRUFDQUQsSywwTEE2QkFELE0sMktBYUFBLE0sMEpBWUFBLE0sK0pBc0JBRSxPLEVBQ0FELEssdUtBb0JBRCxNLHNMQWFBRSxPLEVBQ0FELEsseUtBMEJBRCxNLHFLQWFBQSxNLEVBQ0FDLEssNkpBY0FELE0sRUFDQUMsSywwS0F5REFELE0sb0xBd0JBRSxPLEVBQ0FELEssMEtBZ0NBRCxNLDJLQW9CQUEsTSxFQUNBQyxLLDJLQThDQUMsTyxpTEFrQ0FGLE0sZ0xBa0JBQSxNLGlMQW1CQUEsTSx1TEF1QkFBLE0sbUxBd0JBRSxPLEVBQ0FELEs7U0FpQmF4RixTIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBDb250cm9sVmFyaWFudEFwcGx5QVBJIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvYXBpL0NvbnRyb2xWYXJpYW50QXBwbHlBUElcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCBOYXZMaWJyYXJ5IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9saWJyYXJ5XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBFeHRlbnNpYmxlLCBGaW5hbCwgUHJpdmF0ZSwgUHVibGljLCBVSTVDbGFzcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuLy8gYWRkaXRpb25hbFN0YXRlcyBhcmUgc3RvcmVkIG5leHQgdG8gY29udHJvbCBJRHMsIHNvIG5hbWUgY2xhc2ggYXZvaWRhbmNlIG5lZWRlZC4gRm9ydHVuYXRlbHkgSURzIGhhdmUgcmVzdHJpY3Rpb25zOlxuLy8gXCJBbGxvd2VkIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyAoY2FwaXRhbC9sb3dlcmNhc2UpLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBkYXNoZXMsIHBvaW50cyBhbmQvb3IgY29sb25zLlwiXG4vLyBUaGVyZWZvcmUgYWRkaW5nIGEgc3ltYm9sIGxpa2UgIyBvciBAXG5jb25zdCBBRERJVElPTkFMX1NUQVRFU19LRVkgPSBcIiNhZGRpdGlvbmFsU3RhdGVzXCIsXG5cdE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBtZXRob2RzIHRvIHJldHJpZXZlICYgYXBwbHkgc3RhdGVzIGZvciB0aGUgZGlmZmVyZW50IGNvbnRyb2xzIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBfbUNvbnRyb2xTdGF0ZUhhbmRsZXJNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG5cdFwic2FwLnVpLmZsLnZhcmlhbnRzLlZhcmlhbnRNYW5hZ2VtZW50XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1ZNOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFwidmFyaWFudElkXCI6IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uKG9WTTogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlICYmIG9Db250cm9sU3RhdGUudmFyaWFudElkICE9PSB1bmRlZmluZWQgJiYgb0NvbnRyb2xTdGF0ZS52YXJpYW50SWQgIT09IG9WTS5nZXRDdXJyZW50VmFyaWFudEtleSgpKSB7XG5cdFx0XHRcdGNvbnN0IHNWYXJpYW50UmVmZXJlbmNlID0gdGhpcy5fY2hlY2tJZlZhcmlhbnRJZElzQXZhaWxhYmxlKG9WTSwgb0NvbnRyb2xTdGF0ZS52YXJpYW50SWQpXG5cdFx0XHRcdFx0PyBvQ29udHJvbFN0YXRlLnZhcmlhbnRJZFxuXHRcdFx0XHRcdDogb1ZNLmdldFN0YW5kYXJkVmFyaWFudEtleSgpO1xuXHRcdFx0XHRyZXR1cm4gQ29udHJvbFZhcmlhbnRBcHBseUFQSS5hY3RpdmF0ZVZhcmlhbnQoe1xuXHRcdFx0XHRcdGVsZW1lbnQ6IG9WTSxcblx0XHRcdFx0XHR2YXJpYW50UmVmZXJlbmNlOiBzVmFyaWFudFJlZmVyZW5jZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLm0uSWNvblRhYkJhclwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9UYWJCYXI6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9UYWJCYXIuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvVGFiQmFyOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUgJiYgb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSkge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRJdGVtID0gb1RhYkJhci5nZXRJdGVtcygpLmZpbmQoZnVuY3Rpb24ob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvSXRlbS5nZXRLZXkoKSA9PT0gb0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRJdGVtKSB7XG5cdFx0XHRcdFx0b1RhYkJhci5zZXRTZWxlY3RlZEl0ZW0ob1NlbGVjdGVkSXRlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdFwic2FwLnVpLm1kYy5GaWx0ZXJCYXJcIjoge1xuXHRcdHJldHJpZXZlOiBmdW5jdGlvbihvRmlsdGVyQmFyOiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIpLnRoZW4oZnVuY3Rpb24obUZpbHRlckJhclN0YXRlOiBhbnkpIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIHNlbnNpdGl2ZSBvciB2aWV3IHN0YXRlIGlycmVsZXZhbnQgZmllbGRzXG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0aWVzSW5mbyA9IG9GaWx0ZXJCYXIuZ2V0UHJvcGVydHlJbmZvU2V0KCksXG5cdFx0XHRcdFx0bUZpbHRlciA9IG1GaWx0ZXJCYXJTdGF0ZS5maWx0ZXIgfHwge307XG5cdFx0XHRcdGFQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24ob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRtRmlsdGVyW29Qcm9wZXJ0eUluZm8ucGF0aF0gJiYgKG9Qcm9wZXJ0eUluZm8ucmVtb3ZlRnJvbUFwcFN0YXRlIHx8IG1GaWx0ZXJbb1Byb3BlcnR5SW5mby5wYXRoXS5sZW5ndGggPT09IDApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24ob1Byb3BlcnR5SW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgbUZpbHRlcltvUHJvcGVydHlJbmZvLnBhdGhdO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gbUZpbHRlckJhclN0YXRlO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob0ZpbHRlckJhcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udHJvbFN0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBTdGF0ZVV0aWwuYXBwbHlFeHRlcm5hbFN0YXRlKG9GaWx0ZXJCYXIsIG9Db250cm9sU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudWkubWRjLlRhYmxlXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1RhYmxlOiBhbnkpIHtcblx0XHRcdHJldHVybiBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKG9UYWJsZSk7XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob1RhYmxlOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0aWYgKG9Db250cm9sU3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUob1RhYmxlLCBvQ29udHJvbFN0YXRlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbihvVGFibGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1RhYmxlQmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvVGFibGVCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvUm9vdEJpbmRpbmcgPT09IG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBiaW5kaW5nXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gcmVsYXRpdmUgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IG9IZWFkZXJDb250ZXh0ID0gb1RhYmxlQmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0dyb3VwSWQgPSBvVGFibGVCaW5kaW5nLmdldEdyb3VwSWQoKTtcblxuXHRcdFx0XHRcdGlmIChvSGVhZGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0b0hlYWRlckNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBzR3JvdXBJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cuaW5mbyhcIlRhYmxlOiBcIiArIG9UYWJsZS5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAudXhhcC5PYmplY3RQYWdlTGF5b3V0XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkU2VjdGlvbjogb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uKG9PUExheW91dDogYW55LCBvQ29udHJvbFN0YXRlOiBhbnkpIHtcblx0XHRcdG9Db250cm9sU3RhdGUgJiYgb09QTGF5b3V0LnNldFNlbGVjdGVkU2VjdGlvbihvQ29udHJvbFN0YXRlLnNlbGVjdGVkU2VjdGlvbik7XG5cdFx0fSxcblx0XHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24ob09QTGF5b3V0OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGlmIChvQmluZGluZykge1xuXHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRcdGlmIChzU3RyYXRlZ3kgPT09IFwic2VsZlwiKSB7XG5cdFx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXMgPVxuXHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdFx0JGtpbmQ6IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHRcdFx0fSkgfHwge30sXG5cdFx0XHRcdFx0XHRhTmF2UHJvcGVydGllc1RvUmVxdWVzdCA9IE9iamVjdC5rZXlzKG9OYXZpZ2F0aW9uUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uKGFQcmV2OiBhbnlbXSwgc05hdlByb3A6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByZXYucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2UHJvcCB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0XHR9LCBbXSksXG5cdFx0XHRcdFx0XHRhUHJvcGVydGllcyA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKGFQcm9wZXJ0aWVzLmNvbmNhdChhTmF2UHJvcGVydGllc1RvUmVxdWVzdCksIHNHcm91cElkKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJPYmplY3RQYWdlOiBcIiArIG9PUExheW91dC5nZXRJZCgpICsgXCIgd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0XCJzYXAuZmUubWFjcm9zLnRhYmxlLlF1aWNrRmlsdGVyQ29udGFpbmVyXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1F1aWNrRmlsdGVyOiBhbnkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbGVjdGVkS2V5OiBvUXVpY2tGaWx0ZXIuZ2V0U2VsZWN0b3JLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvUXVpY2tGaWx0ZXI6IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9RdWlja0ZpbHRlci5zZXRTZWxlY3RvcktleShvQ29udHJvbFN0YXRlLnNlbGVjdGVkS2V5KTtcblx0XHR9XG5cdH0sXG5cdFwic2FwLm0uU2VnbWVudGVkQnV0dG9uXCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1NlZ21lbnRlZEJ1dHRvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzZWxlY3RlZEtleTogb1NlZ21lbnRlZEJ1dHRvbi5nZXRTZWxlY3RlZEtleSgpXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YXBwbHk6IGZ1bmN0aW9uKG9TZWdtZW50ZWRCdXR0b246IGFueSwgb0NvbnRyb2xTdGF0ZTogYW55KSB7XG5cdFx0XHRvQ29udHJvbFN0YXRlICYmIG9TZWdtZW50ZWRCdXR0b24uc2V0U2VsZWN0ZWRLZXkob0NvbnRyb2xTdGF0ZS5zZWxlY3RlZEtleSk7XG5cdFx0fVxuXHR9LFxuXHRcInNhcC5tLlNlbGVjdFwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9TZWxlY3Q6IGFueSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2VsZWN0ZWRLZXk6IG9TZWxlY3QuZ2V0U2VsZWN0ZWRLZXkoKVxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvU2VsZWN0OiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvU2VsZWN0LnNldFNlbGVjdGVkS2V5KG9Db250cm9sU3RhdGUuc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblx0XCJzYXAuZi5EeW5hbWljUGFnZVwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9EeW5hbWljUGFnZTogYW55KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRoZWFkZXJFeHBhbmRlZDogb0R5bmFtaWNQYWdlLmdldEhlYWRlckV4cGFuZGVkKClcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob0R5bmFtaWNQYWdlOiBhbnksIG9Db250cm9sU3RhdGU6IGFueSkge1xuXHRcdFx0b0NvbnRyb2xTdGF0ZSAmJiBvRHluYW1pY1BhZ2Uuc2V0SGVhZGVyRXhwYW5kZWQob0NvbnRyb2xTdGF0ZS5oZWFkZXJFeHBhbmRlZCk7XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5jb3JlLm12Yy5WaWV3XCI6IHtcblx0XHRyZXRyaWV2ZTogZnVuY3Rpb24ob1ZpZXc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbGxlci52aWV3U3RhdGUucmV0cmlldmVWaWV3U3RhdGUob0NvbnRyb2xsZXIudmlld1N0YXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGFwcGx5OiBmdW5jdGlvbihvVmlldzogYW55LCBvQ29udHJvbFN0YXRlOiBhbnksIG9OYXZQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnZpZXdTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIudmlld1N0YXRlLmFwcGx5Vmlld1N0YXRlKG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbihvVmlldzogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5yZWZyZXNoVmlld0JpbmRpbmdzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiOiB7XG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uKG9Db21wb25lbnRDb250YWluZXI6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db21wb25lbnRDb250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcblx0XHRcdGlmIChvQ29tcG9uZW50KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJldHJpZXZlQ29udHJvbFN0YXRlKG9Db21wb25lbnQuZ2V0Um9vdENvbnRyb2woKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRhcHBseTogZnVuY3Rpb24ob0NvbXBvbmVudENvbnRhaW5lcjogYW55LCBvQ29udHJvbFN0YXRlOiBhbnksIG9OYXZQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29tcG9uZW50Q29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRpZiAob0NvbXBvbmVudCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNvbnRyb2xTdGF0ZShvQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCksIG9Db250cm9sU3RhdGUsIG9OYXZQYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgaG9va3MgZm9yIHN0YXRlIGhhbmRsaW5nXG4gKlxuICogSWYgeW91IG5lZWQgdG8gbWFpbnRhaW4gYSBzcGVjaWZpYyBzdGF0ZSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB1c2UgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuICpcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjg1LjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFZpZXdTdGF0ZSBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9pUmV0cmlldmluZ1N0YXRlQ291bnRlcjogbnVtYmVyO1xuXHRwcml2YXRlIF9wSW5pdGlhbFN0YXRlQXBwbGllZDogUHJvbWlzZTx1bmtub3duPjtcblx0cHJpdmF0ZSBfcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlPzogRnVuY3Rpb247XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3Rvci5cblx0ICovXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIgPSAwO1xuXHRcdHRoaXMuX3BJbml0aWFsU3RhdGVBcHBsaWVkID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHR0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZS5nZXRNZXRhZGF0YVxuXHQgKiBAZnVuY3Rpb25cblx0ICovXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUuZXh0ZW5kXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRyZWZyZXNoVmlld0JpbmRpbmdzKCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzKS50aGVuKChhQ29udHJvbHM6IGFueSkgPT4ge1xuXHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdGFDb250cm9sc1xuXHRcdFx0XHQuZmlsdGVyKChvQ29udHJvbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4odGhpcy5yZWZyZXNoQ29udHJvbEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYWxsIGNvbnRyb2xzIHJlbGV2YW50IGZvciByZWZyZXNoaW5nIHRvIHRoZSBwcm92aWRlZCBjb250cm9sIGFycmF5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0ge0FycmF5PHNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3Q+fSBhQ29sbGVjdGVkQ29udHJvbHMgVGhlIGNvbGxlY3RlZCBjb250cm9sc1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0QmluZGluZ1JlZnJlc2hDb250cm9sc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0QmluZGluZ1JlZnJlc2hDb250cm9scyhhQ29sbGVjdGVkQ29udHJvbHM6IE1hbmFnZWRPYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHJlZnJlc2hDb250cm9sQmluZGluZyhvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIgPSB0aGlzLmdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2wpO1xuXHRcdGxldCBvUHJvbWlzZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0aWYgKHR5cGVvZiBvQ29udHJvbFJlZnJlc2hCaW5kaW5nSGFuZGxlci5yZWZyZXNoQmluZGluZyAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRMb2cuaW5mbyhcInJlZnJlc2hCaW5kaW5nIGhhbmRsZXIgZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgKyBcIiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Qcm9taXNlQ2hhaW4gPSBvUHJvbWlzZUNoYWluLnRoZW4ob0NvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIucmVmcmVzaEJpbmRpbmcuYmluZCh0aGlzLCBvQ29udHJvbCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2VDaGFpbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbWFwIG9mIDxjb2RlPnJlZnJlc2hCaW5kaW5nPC9jb2RlPiBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdH0gb0NvbnRyb2wgVGhlIGNvbnRyb2wgdG8gZ2V0IHN0YXRlIGhhbmRsZXIgZm9yXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEEgcGxhaW4gb2JqZWN0IHdpdGggb25lIGZ1bmN0aW9uOiA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT5cblx0ICovXG5cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdGdldENvbnRyb2xSZWZyZXNoQmluZGluZ0hhbmRsZXIob0NvbnRyb2w6IGFueSk6IGFueSB7XG5cdFx0Y29uc3Qgb1JlZnJlc2hCaW5kaW5nSGFuZGxlcjogYW55ID0ge307XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIHBhc3Mgb25seSB0aGUgcmVmcmVzaEJpbmRpbmcgaGFuZGxlciBpbiBhbiBvYmplY3Qgc28gdGhhdCA6XG5cdFx0XHRcdFx0Ly8gMS4gQXBwbGljYXRpb24gaGFzIGFjY2VzcyBvbmx5IHRvIHJlZnJlc2hCaW5kaW5nIGFuZCBub3QgYXBwbHkgYW5kIHJldGVyaXZlIGF0IHRoaXMgc3RhZ2Vcblx0XHRcdFx0XHQvLyAyLiBBcHBsaWNhdGlvbiBtb2RpZmljYXRpb25zIHRvIHRoZSBvYmplY3Qgd2lsbCBiZSByZWZsZWN0ZWQgaGVyZSAoYXMgd2UgcGFzcyBieSByZWZlcmVuY2UpXG5cdFx0XHRcdFx0b1JlZnJlc2hCaW5kaW5nSGFuZGxlcltcInJlZnJlc2hCaW5kaW5nXCJdID0gX21Db250cm9sU3RhdGVIYW5kbGVyTWFwW3NUeXBlXS5yZWZyZXNoQmluZGluZyB8fCB7fTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyKG9Db250cm9sLCBvUmVmcmVzaEJpbmRpbmdIYW5kbGVyKTtcblx0XHRyZXR1cm4gb1JlZnJlc2hCaW5kaW5nSGFuZGxlcjtcblx0fVxuXHQvKipcblx0ICogQ3VzdG9taXplIHRoZSA8Y29kZT5yZWZyZXNoQmluZGluZzwvY29kZT4gZnVuY3Rpb24gZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIGZvciB3aGljaCB0aGUgcmVmcmVzaCBoYW5kbGVyIGlzIGFkYXB0ZWQuXG5cdCAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gb0NvbnRyb2xIYW5kbGVyIEEgcGxhaW4gb2JqZWN0IHdoaWNoIGNhbiBoYXZlIG9uZSBmdW5jdGlvbjogPGNvZGU+cmVmcmVzaEJpbmRpbmc8L2NvZGU+XG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXJcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgb0NvbnRyb2xIYW5kbGVyOiBhbnlbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBzdXNwZW5kZWQgZHVlIHRvIGtlZXAtYWxpdmUgbW9kZS5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvblN1c3BlbmRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25TdXNwZW5kKCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyByZXN0b3JlZCBkdWUgdG8ga2VlcC1hbGl2ZSBtb2RlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uUmVzdG9yZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJlc3RvcmUoKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGVuXG5cdH1cblxuXHQvKipcblx0ICogRGVzdHJ1Y3RvciBtZXRob2QgZm9yIG9iamVjdHMuXG5cdCAqL1xuXHRkZXN0cm95KCkge1xuXHRcdGRlbGV0ZSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlbHBlciBmdW5jdGlvbiB0byBlbmFibGUgbXVsdGkgb3ZlcnJpZGUuIEl0IGlzIGFkZGluZyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciAoYXJyYXkpIHRvIHRoZSBwcm92aWRlZFxuXHQgKiBmdW5jdGlvbiAoYW5kIGl0cyBwYXJhbWV0ZXJzKSwgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCB2aWEgPGNvZGU+UHJvbWlzZS5hbGw8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbkNhbGwgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gYXJnc1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCBvZiBhbGwgb3ZlcnJpZGVzXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0Y29sbGVjdFJlc3VsdHMoZm5DYWxsOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pIHtcblx0XHRjb25zdCBhUmVzdWx0czogYW55W10gPSBbXTtcblx0XHRhcmdzLnB1c2goYVJlc3VsdHMpO1xuXHRcdGZuQ2FsbC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEN1c3RvbWl6ZSB0aGUgPGNvZGU+cmV0cmlldmU8L2NvZGU+IGFuZCA8Y29kZT5hcHBseTwvY29kZT4gZnVuY3Rpb25zIGZvciBhIGNlcnRhaW4gY29udHJvbC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUgaGFuZGxlciBmb3Jcblx0ICogQHBhcmFtIHtBcnJheTxvYmplY3Q+fSBhQ29udHJvbEhhbmRsZXIgQSBsaXN0IG9mIHBsYWluIG9iamVjdHMgd2l0aCB0d28gZnVuY3Rpb25zOiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FkYXB0Q29udHJvbFN0YXRlSGFuZGxlclxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogTWFuYWdlZE9iamVjdCwgYUNvbnRyb2xIYW5kbGVyOiBvYmplY3RbXSkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiA8Y29kZT5yZXRyaWV2ZTwvY29kZT4gYW5kIDxjb2RlPmFwcGx5PC9jb2RlPiBmdW5jdGlvbnMgZm9yIGEgY2VydGFpbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBjb250cm9sIHRvIGdldCBzdGF0ZSBoYW5kbGVyIGZvclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBBIHBsYWluIG9iamVjdCB3aXRoIHR3byBmdW5jdGlvbnM6IDxjb2RlPnJldHJpZXZlPC9jb2RlPiBhbmQgPGNvZGU+YXBwbHk8L2NvZGU+XG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0Z2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3QgYUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlciA9IFtdLFxuXHRcdFx0YUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueVtdID0gW107XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNUeXBlIGluIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcCkge1xuXHRcdFx0XHRpZiAob0NvbnRyb2wuaXNBKHNUeXBlKSkge1xuXHRcdFx0XHRcdC8vIGF2b2lkIGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgaW50ZXJuYWwgX21Db250cm9sU3RhdGVIYW5kbGVyTWFwXG5cdFx0XHRcdFx0YUludGVybmFsQ29udHJvbFN0YXRlSGFuZGxlci5wdXNoKE9iamVjdC5hc3NpZ24oe30sIF9tQ29udHJvbFN0YXRlSGFuZGxlck1hcFtzVHlwZV0pKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCwgYUN1c3RvbUNvbnRyb2xTdGF0ZUhhbmRsZXIpO1xuXHRcdHJldHVybiBhSW50ZXJuYWxDb250cm9sU3RhdGVIYW5kbGVyLmNvbmNhdChhQ3VzdG9tQ29udHJvbFN0YXRlSGFuZGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYWRkIGFsbCBjb250cm9scyBmb3IgZ2l2ZW4gdmlldyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGUgc3RhdGUgaGFuZGxpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRyb2wgYXJyYXkuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7QXJyYXk8c2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdD59IGFDb2xsZWN0ZWRDb250cm9scyBUaGUgY29sbGVjdGVkIGNvbnRyb2xzXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYWRhcHRTdGF0ZUNvbnRyb2xzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0YWRhcHRTdGF0ZUNvbnRyb2xzKGFDb2xsZWN0ZWRDb250cm9sczogTWFuYWdlZE9iamVjdFtdKSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0fSBvQ29udHJvbCBUaGUgY29udHJvbCB0byBnZXQgc3RhdGUga2V5IGZvclxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUga2V5IHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIGNvbnRyb2xzIHN0YXRlXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRnZXRTdGF0ZUtleShvQ29udHJvbDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldExvY2FsSWQob0NvbnRyb2wuZ2V0SWQoKSkgfHwgb0NvbnRyb2wuZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgdmlldyBzdGF0ZSBvZiB0aGlzIGV4dGVuc2lvbnMgdmlldy5cblx0ICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBiZWZvcmUgZmluaXNoaW5nLCBhbGwgYnV0IHRoZSBmaW5hbCByZXNwb25zZSB3aWxsIHJlc29sdmUgdG8gPGNvZGU+dW5kZWZpbmVkPC9jb2RlPi5cblx0ICpcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSByZXNvbHZpbmcgdGhlIHZpZXcgc3RhdGVcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNyZXRyaWV2ZVZpZXdTdGF0ZVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRyZXRyaWV2ZVZpZXdTdGF0ZSgpIHtcblx0XHQrK3RoaXMuX2lSZXRyaWV2aW5nU3RhdGVDb3VudGVyO1xuXHRcdHJldHVybiB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyh0aGlzLmJhc2Uudmlld1N0YXRlLmFkYXB0U3RhdGVDb250cm9scyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKGFDb250cm9sczogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhQ29udHJvbHNcblx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24ob0NvbnRyb2w6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0Lm1hcCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXRyaWV2ZUNvbnRyb2xTdGF0ZShvQ29udHJvbCkudGhlbigodlJlc3VsdDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogdGhpcy5nZXRTdGF0ZUtleShvQ29udHJvbCksXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdlJlc3VsdFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbihhUmVzb2x2ZWRTdGF0ZXM6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gYVJlc29sdmVkU3RhdGVzLnJlZHVjZShmdW5jdGlvbihvU3RhdGVzOiBhbnksIG1TdGF0ZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTdGF0ZTogYW55ID0ge307XG5cdFx0XHRcdFx0b0N1cnJlbnRTdGF0ZVttU3RhdGUua2V5XSA9IG1TdGF0ZS52YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbWVyZ2VPYmplY3RzKG9TdGF0ZXMsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0XHR9LCB7fSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JldHJpZXZlQWRkaXRpb25hbFN0YXRlcygpKS50aGVuKGZ1bmN0aW9uKG1BZGRpdGlvbmFsU3RhdGVzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAobUFkZGl0aW9uYWxTdGF0ZXMgJiYgT2JqZWN0LmtleXMobUFkZGl0aW9uYWxTdGF0ZXMpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0b1ZpZXdTdGF0ZVtBRERJVElPTkFMX1NUQVRFU19LRVldID0gbUFkZGl0aW9uYWxTdGF0ZXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBvVmlld1N0YXRlO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC0tdGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXI7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9WaWV3U3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faVJldHJpZXZpbmdTdGF0ZUNvdW50ZXIgPT09IDAgPyBvVmlld1N0YXRlIDogdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogRXh0ZW5kIHRoZSBtYXAgb2YgYWRkaXRpb25hbCBzdGF0ZXMgKG5vdCBjb250cm9sIGJvdW5kKSB0byBiZSBhZGRlZCB0byB0aGUgY3VycmVudCB2aWV3IHN0YXRlIG9mIHRoZSBnaXZlbiB2aWV3LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUFkZGl0aW9uYWxTdGF0ZXMgVGhlIGFkZGl0aW9uYWwgc3RhdGVcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRyZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMobUFkZGl0aW9uYWxTdGF0ZXM6IG9iamVjdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG1hcCBvZiBhZGRpdGlvbmFsIHN0YXRlcyAobm90IGNvbnRyb2wgYm91bmQpIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgb2YgdGhlIGdpdmVuIHZpZXcuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3QgfCBQcm9taXNlPG9iamVjdD59IEFkZGl0aW9uYWwgdmlldyBzdGF0ZXNcblx0ICovXG5cdF9yZXRyaWV2ZUFkZGl0aW9uYWxTdGF0ZXMoKSB7XG5cdFx0Y29uc3QgbUFkZGl0aW9uYWxTdGF0ZXMgPSB7fTtcblx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLnJldHJpZXZlQWRkaXRpb25hbFN0YXRlcyhtQWRkaXRpb25hbFN0YXRlcyk7XG5cdFx0cmV0dXJuIG1BZGRpdGlvbmFsU3RhdGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBzdGF0ZSBmb3Jcblx0ICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gY29udHJvbFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHJldHJpZXZlQ29udHJvbFN0YXRlKG9Db250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBhQ29udHJvbFN0YXRlSGFuZGxlcnMgPSB0aGlzLmdldENvbnRyb2xTdGF0ZUhhbmRsZXIob0NvbnRyb2wpO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFDb250cm9sU3RhdGVIYW5kbGVycy5tYXAoKG1Db250cm9sU3RhdGVIYW5kbGVyOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29udHJvbFN0YXRlSGFuZGxlci5yZXRyaWV2ZSBpcyBub3QgYSBmdW5jdGlvbiBmb3IgY29udHJvbDogXCIgKyBvQ29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1Db250cm9sU3RhdGVIYW5kbGVyLnJldHJpZXZlLmNhbGwodGhpcywgb0NvbnRyb2wpO1xuXHRcdFx0fSlcblx0XHQpLnRoZW4oKGFTdGF0ZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRyZXR1cm4gYVN0YXRlcy5yZWR1Y2UoZnVuY3Rpb24ob0ZpbmFsU3RhdGU6IGFueSwgb0N1cnJlbnRTdGF0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBtZXJnZU9iamVjdHMob0ZpbmFsU3RhdGUsIG9DdXJyZW50U3RhdGUpO1xuXHRcdFx0fSwge30pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgdmlldyBzdGF0ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIG9uY2UgaW5pdGlhbGx5LlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZH0uXG5cdCAqXG5cdCAqIEltcG9ydGFudDpcblx0ICogWW91IHNob3VsZCBvbmx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjdXN0b20gcGFnZXMgYW5kIG5vdCBmb3IgdGhlIHN0YW5kYXJkIExpc3RSZXBvcnRQYWdlIGFuZCBPYmplY3RQYWdlIVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG9ubHkgdGhlIGluaXRpYWwgdmlldyBzdGF0ZSBpcyBhcHBsaWVkIG9uY2UsXG5cdCAqIGVsc2UgYW55IG5ldyB2aWV3IHN0YXRlIGlzIGFsc28gYXBwbGllZCBvbiBmb2xsb3ctdXAgY2FsbHMgKGRlZmF1bHQpXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5WaWV3U3RhdGUjYXBwbHlJbml0aWFsU3RhdGVPbmx5XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0YXBwbHlJbml0aWFsU3RhdGVPbmx5KCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdC8qKlxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiB2aWV3IHN0YXRlIHRvIHRoaXMgZXh0ZW5zaW9ucyB2aWV3LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXdTdGF0ZSBUaGUgdmlldyBzdGF0ZSB0byBhcHBseSAoY2FuIGJlIHVuZGVmaW5lZClcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvTmF2UGFyYW1ldGVyLnNlbGVjdGlvblZhcmlhbnQgVGhlIHNlbGVjdGlvblZhcmlhbnQgZnJvbSB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHMgVGhlIHNlbGVjdGlvblZhcmlhbnQgZGVmYXVsdHMgZnJvbSB0aGUgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG9OYXZQYXJhbWV0ZXIucmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQgRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIGZvciBhc3luYyBzdGF0ZSBoYW5kbGluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5Vmlld1N0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdGFwcGx5Vmlld1N0YXRlKFxuXHRcdG9WaWV3U3RhdGU6IGFueSxcblx0XHRvTmF2UGFyYW1ldGVyOiB7XG5cdFx0XHRuYXZpZ2F0aW9uVHlwZTogYW55O1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnREZWZhdWx0cz86IG9iamVjdDtcblx0XHRcdHJlcXVpcmVzU3RhbmRhcmRWYXJpYW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8YW55PiB7XG5cdFx0aWYgKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlJbml0aWFsU3RhdGVPbmx5KCkgJiYgdGhpcy5fZ2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25CZWZvcmVTdGF0ZUFwcGxpZWQpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYWRhcHRTdGF0ZUNvbnRyb2xzKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoYUNvbnRyb2xzOiBhbnkpID0+IHtcblx0XHRcdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0YUNvbnRyb2xzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbihvQ29udHJvbDogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuZm9yRWFjaCgob0NvbnRyb2w6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0tleSA9IHRoaXMuZ2V0U3RhdGVLZXkob0NvbnRyb2wpO1xuXHRcdFx0XHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBseUNvbnRyb2xTdGF0ZS5iaW5kKHRoaXMsIG9Db250cm9sLCBvVmlld1N0YXRlID8gb1ZpZXdTdGF0ZVtzS2V5XSA6IHVuZGVmaW5lZCwgb05hdlBhcmFtZXRlcilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKG9OYXZQYXJhbWV0ZXIubmF2aWdhdGlvblR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sbGVjdFJlc3VsdHMoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2Uudmlld1N0YXRlLmFwcGx5QWRkaXRpb25hbFN0YXRlcyxcblx0XHRcdFx0XHRcdG9WaWV3U3RhdGUgPyBvVmlld1N0YXRlW0FERElUSU9OQUxfU1RBVEVTX0tFWV0gOiB1bmRlZmluZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUuYXBwbHlOYXZpZ2F0aW9uUGFyYW1ldGVycywgb05hdlBhcmFtZXRlcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbGxlY3RSZXN1bHRzKHRoaXMuYmFzZS52aWV3U3RhdGUub25BZnRlclN0YXRlQXBwbGllZCkudGhlbih0aGlzLl9zZXRJbml0aWFsU3RhdGVBcHBsaWVkLmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAUHJpdmF0ZVxuXHRfY2hlY2tJZlZhcmlhbnRJZElzQXZhaWxhYmxlKG9WTTogYW55LCBzVmFyaWFudElkOiBhbnkpIHtcblx0XHRjb25zdCBhVmFyaWFudHMgPSBvVk0uZ2V0VmFyaWFudHMoKTtcblx0XHRsZXQgYklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IGZhbHNlO1xuXHRcdGFWYXJpYW50cy5mb3JFYWNoKGZ1bmN0aW9uKG9WYXJpYW50OiBhbnkpIHtcblx0XHRcdGlmIChvVmFyaWFudC5rZXkgPT09IHNWYXJpYW50SWQpIHtcblx0XHRcdFx0YklzQ29udHJvbFN0YXRlVmFyaWFudEF2YWlsYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGJJc0NvbnRyb2xTdGF0ZVZhcmlhbnRBdmFpbGFibGU7XG5cdH1cblxuXHRfc2V0SW5pdGlhbFN0YXRlQXBwbGllZCgpIHtcblx0XHRpZiAodGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBwSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmUgPSB0aGlzLl9wSW5pdGlhbFN0YXRlQXBwbGllZFJlc29sdmU7XG5cdFx0XHRkZWxldGUgdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHRcdFx0cEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cdF9nZXRJbml0aWFsU3RhdGVBcHBsaWVkKCkge1xuXHRcdHJldHVybiAhdGhpcy5fcEluaXRpYWxTdGF0ZUFwcGxpZWRSZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gcmVhY3QgYmVmb3JlIGEgc3RhdGUgZm9yIGdpdmVuIHZpZXcgaXMgYXBwbGllZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI29uQmVmb3JlU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVTdGF0ZUFwcGxpZWQoYVByb21pc2VzOiBQcm9taXNlPGFueT4pIHtcblx0XHQvLyB0byBiZSBvdmVycmlkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBIb29rIHRvIHJlYWN0IHdoZW4gc3RhdGUgZm9yIGdpdmVuIHZpZXcgd2FzIGFwcGxpZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNvbkFmdGVyU3RhdGVBcHBsaWVkXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25BZnRlclN0YXRlQXBwbGllZChhUHJvbWlzZXM6IFByb21pc2U8YW55Pikge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRlblxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5aW5nIGFkZGl0aW9uYWwsIG5vdCBjb250cm9sIHJlbGF0ZWQsIHN0YXRlcyAtIGlzIGNhbGxlZCBvbmx5IGlmIG5hdmlnYXRpb24gdHlwZSBpcyBpQXBwU3RhdGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVmlld1N0YXRlIFRoZSBjdXJyZW50IHZpZXcgc3RhdGVcblx0ICogQHBhcmFtIHtQcm9taXNlfSBhUHJvbWlzZXMgRXh0ZW5zaWJsZSBhcnJheSBvZiBwcm9taXNlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZ1xuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuVmlld1N0YXRlI2FwcGx5QWRkaXRpb25hbFN0YXRlc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRAUHVibGljXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdGFwcGx5QWRkaXRpb25hbFN0YXRlcyhvVmlld1N0YXRlOiBvYmplY3QsIGFQcm9taXNlczogUHJvbWlzZTxhbnk+KSB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkZWRcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgLSBpcyBjYWxsZWQgb25seSBpZiBuYXZpZ2F0aW9uIHR5cGUgaXMgbm90IGlBcHBTdGF0ZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9OYXZQYXJhbWV0ZXIgVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSBvTmF2UGFyYW1ldGVyLm5hdmlnYXRpb25UeXBlIFRoZSBhY3R1YWwgbmF2aWdhdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50XSBUaGUgc2VsZWN0aW9uVmFyaWFudCBmcm9tIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb05hdlBhcmFtZXRlci5zZWxlY3Rpb25WYXJpYW50RGVmYXVsdHNdIFRoZSBzZWxlY3Rpb25WYXJpYW50IGRlZmF1bHRzIGZyb20gdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtib29sZWFufSBbb05hdlBhcmFtZXRlci5yZXF1aXJlc1N0YW5kYXJkVmFyaWFudF0gRGVmaW5lcyB3aGV0aGVyIHN0YW5kYXJkIHZhcmlhbnQgbXVzdCBiZSB1c2VkIGluIFZNXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gYVByb21pc2VzIEV4dGVuc2libGUgYXJyYXkgb2YgcHJvbWlzZXMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlZpZXdTdGF0ZSNhcHBseU5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFwcGx5TmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdG9OYXZQYXJhbWV0ZXI6IHtcblx0XHRcdG5hdmlnYXRpb25UeXBlOiBhbnk7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudERlZmF1bHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cmVxdWlyZXNTdGFuZGFyZFZhcmlhbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRcdGFQcm9taXNlczogUHJvbWlzZTxhbnk+XG5cdCkge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZGVkXG5cdH1cblxuXHQvKipcblx0ICogQXBwbHlpbmcgdGhlIGdpdmVuIHN0YXRlIHRvIHRoZSBnaXZlbiBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5iYXNlLk1hbmFnZWRPYmplY3R9IG9Db250cm9sIFRoZSBvYmplY3QgdG8gYXBwbHkgdGhlIGdpdmVuIHN0YXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbFN0YXRlIFRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbnRyb2xcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvTmF2UGFyYW1ldGVyc10gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIHthbnl9IFJldHVybiBhIHByb21pc2UgZm9yIGFzeW5jIHN0YXRlIGhhbmRsaW5nXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0YXBwbHlDb250cm9sU3RhdGUob0NvbnRyb2w6IGFueSwgb0NvbnRyb2xTdGF0ZTogb2JqZWN0LCBvTmF2UGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdGNvbnN0IGFDb250cm9sU3RhdGVIYW5kbGVycyA9IHRoaXMuZ2V0Q29udHJvbFN0YXRlSGFuZGxlcihvQ29udHJvbCk7XG5cdFx0bGV0IG9Qcm9taXNlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRhQ29udHJvbFN0YXRlSGFuZGxlcnMuZm9yRWFjaCgobUNvbnRyb2xTdGF0ZUhhbmRsZXI6IGFueSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRyb2xTdGF0ZUhhbmRsZXIuYXBwbHkgaXMgbm90IGEgZnVuY3Rpb24gZm9yIGNvbnRyb2w6IFwiICsgb0NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0fVxuXHRcdFx0b1Byb21pc2VDaGFpbiA9IG9Qcm9taXNlQ2hhaW4udGhlbihtQ29udHJvbFN0YXRlSGFuZGxlci5hcHBseS5iaW5kKHRoaXMsIG9Db250cm9sLCBvQ29udHJvbFN0YXRlLCBvTmF2UGFyYW1ldGVycykpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvUHJvbWlzZUNoYWluO1xuXHR9XG5cdGdldEludGVyZmFjZSgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWV3U3RhdGU7XG4iXX0=