@sapui5/sap.fe.core 1.100.0 → 1.102.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 (295) hide show
  1. package/package.json +4 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AppComponent.js +23 -30
  4. package/src/sap/fe/core/AppComponent.ts +35 -40
  5. package/src/sap/fe/core/AppStateHandler.js +8 -8
  6. package/src/sap/fe/core/AppStateHandler.ts +11 -11
  7. package/src/sap/fe/core/BaseController.js +9 -9
  8. package/src/sap/fe/core/BaseController.ts +3 -4
  9. package/src/sap/fe/core/CommonUtils.js +122 -101
  10. package/src/sap/fe/core/CommonUtils.ts +239 -193
  11. package/src/sap/fe/core/ExtensionAPI.js +12 -13
  12. package/src/sap/fe/core/ExtensionAPI.ts +21 -31
  13. package/src/sap/fe/core/PageController.js +19 -13
  14. package/src/sap/fe/core/PageController.ts +40 -34
  15. package/src/sap/fe/core/TemplateComponent.js +198 -123
  16. package/src/sap/fe/core/TemplateComponent.ts +109 -121
  17. package/src/sap/fe/core/TemplateModel.js +7 -9
  18. package/src/sap/fe/core/TemplateModel.ts +3 -3
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +935 -0
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +837 -0
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  27. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  28. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  29. package/src/sap/fe/core/controllerextensions/EditFlow.js +660 -288
  30. package/src/sap/fe/core/controllerextensions/EditFlow.ts +513 -331
  31. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +11 -11
  32. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -7
  33. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +43 -25
  34. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +132 -103
  35. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +16 -16
  36. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +64 -55
  37. package/src/sap/fe/core/controllerextensions/InternalRouting.js +166 -99
  38. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +187 -149
  39. package/src/sap/fe/core/controllerextensions/KPIManagement.js +14 -14
  40. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -11
  41. package/src/sap/fe/core/controllerextensions/MassEdit.js +13 -12
  42. package/src/sap/fe/core/controllerextensions/MassEdit.ts +22 -22
  43. package/src/sap/fe/core/controllerextensions/MessageHandler.js +14 -26
  44. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +20 -30
  45. package/src/sap/fe/core/controllerextensions/PageReady.js +25 -23
  46. package/src/sap/fe/core/controllerextensions/PageReady.ts +49 -47
  47. package/src/sap/fe/core/controllerextensions/Paginator.js +24 -15
  48. package/src/sap/fe/core/controllerextensions/Paginator.ts +35 -20
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -10
  50. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  51. package/src/sap/fe/core/controllerextensions/Routing.js +11 -11
  52. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  53. package/src/sap/fe/core/controllerextensions/Share.js +34 -16
  54. package/src/sap/fe/core/controllerextensions/Share.ts +50 -32
  55. package/src/sap/fe/core/controllerextensions/SideEffects.js +15 -15
  56. package/src/sap/fe/core/controllerextensions/SideEffects.ts +64 -65
  57. package/src/sap/fe/core/controllerextensions/ViewState.js +27 -31
  58. package/src/sap/fe/core/controllerextensions/ViewState.ts +103 -102
  59. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  60. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  61. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  62. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +90 -132
  63. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  64. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +18 -8
  65. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +264 -0
  66. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +35 -33
  67. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +100 -0
  68. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  69. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1584 -0
  70. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +190 -159
  71. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +780 -0
  72. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +329 -76
  73. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1149 -0
  74. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +169 -97
  75. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  76. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  77. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +592 -0
  78. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +83 -60
  79. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  80. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +52 -36
  81. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  82. package/src/sap/fe/core/controls/Any.js +28 -0
  83. package/src/sap/fe/core/controls/Any.ts +30 -0
  84. package/src/sap/fe/core/controls/CommandExecution.js +50 -16
  85. package/src/sap/fe/core/controls/CommandExecution.ts +31 -22
  86. package/src/sap/fe/core/controls/ConditionalWrapper.js +136 -65
  87. package/src/sap/fe/core/controls/ConditionalWrapper.ts +49 -58
  88. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +371 -0
  89. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +282 -0
  90. package/src/sap/fe/core/controls/CustomQuickViewPage.js +74 -36
  91. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +23 -32
  92. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +52 -5
  93. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +127 -67
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +127 -67
  95. package/src/sap/fe/core/controls/FieldWrapper.js +171 -87
  96. package/src/sap/fe/core/controls/FieldWrapper.ts +69 -80
  97. package/src/sap/fe/core/controls/FileWrapper.js +360 -0
  98. package/src/sap/fe/core/controls/FileWrapper.ts +202 -0
  99. package/src/sap/fe/core/controls/FilterBar.js +154 -119
  100. package/src/sap/fe/core/controls/FilterBar.ts +128 -123
  101. package/src/sap/fe/core/controls/FormElementWrapper.js +102 -37
  102. package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -35
  103. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  104. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  105. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +111 -89
  106. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +86 -82
  107. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -193
  108. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +211 -204
  109. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +152 -116
  110. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +105 -105
  111. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  112. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  113. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +41 -81
  114. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -35
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -35
  117. package/src/sap/fe/core/converters/ManifestSettings.js +3 -1
  118. package/src/sap/fe/core/converters/ManifestSettings.ts +9 -2
  119. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  120. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  121. package/src/sap/fe/core/converters/annotations/DataField.js +20 -5
  122. package/src/sap/fe/core/converters/annotations/DataField.ts +27 -6
  123. package/src/sap/fe/core/converters/controls/Common/Action.js +14 -21
  124. package/src/sap/fe/core/converters/controls/Common/Action.ts +23 -28
  125. package/src/sap/fe/core/converters/controls/Common/Chart.js +17 -10
  126. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -14
  127. package/src/sap/fe/core/converters/controls/Common/Form.js +16 -18
  128. package/src/sap/fe/core/converters/controls/Common/Form.ts +20 -20
  129. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  130. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -3
  131. package/src/sap/fe/core/converters/controls/Common/Table.js +389 -173
  132. package/src/sap/fe/core/converters/controls/Common/Table.ts +440 -244
  133. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +26 -16
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +27 -19
  135. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +78 -47
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +146 -107
  137. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  138. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  139. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +30 -25
  140. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +39 -34
  141. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  142. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  143. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  144. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  145. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  146. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  147. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +27 -24
  148. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +49 -40
  149. package/src/sap/fe/core/converters/templates/ListReportConverter.js +33 -22
  150. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +77 -62
  151. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +28 -28
  152. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +38 -45
  153. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  154. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  155. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  156. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  157. package/src/sap/fe/core/formatters/TableFormatter.js +74 -13
  158. package/src/sap/fe/core/formatters/TableFormatter.ts +71 -16
  159. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  160. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  161. package/src/sap/fe/core/fpm/Component.js +46 -17
  162. package/src/sap/fe/core/fpm/Component.ts +11 -16
  163. package/src/sap/fe/core/helpers/AppStartupHelper.js +4 -4
  164. package/src/sap/fe/core/helpers/AppStartupHelper.ts +3 -3
  165. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  166. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  167. package/src/sap/fe/core/helpers/ClassSupport.js +273 -256
  168. package/src/sap/fe/core/helpers/ClassSupport.ts +315 -237
  169. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  170. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  171. package/src/sap/fe/core/helpers/MassEditHelper.js +522 -147
  172. package/src/sap/fe/core/helpers/MassEditHelper.ts +563 -236
  173. package/src/sap/fe/core/helpers/ModelHelper.js +29 -1
  174. package/src/sap/fe/core/helpers/ModelHelper.ts +39 -26
  175. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  176. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  177. package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -3
  178. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +3 -1
  179. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  181. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -7
  182. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -8
  183. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  184. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  185. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  186. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  187. package/src/sap/fe/core/library.js +13 -5
  188. package/src/sap/fe/core/library.ts +26 -17
  189. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  190. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +0 -3
  191. package/src/sap/fe/core/messagebundle.properties +135 -180
  192. package/src/sap/fe/core/messagebundle_ar.properties +31 -64
  193. package/src/sap/fe/core/messagebundle_bg.properties +31 -64
  194. package/src/sap/fe/core/messagebundle_ca.properties +31 -64
  195. package/src/sap/fe/core/messagebundle_cs.properties +31 -64
  196. package/src/sap/fe/core/messagebundle_cy.properties +32 -65
  197. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  198. package/src/sap/fe/core/messagebundle_de.properties +29 -62
  199. package/src/sap/fe/core/messagebundle_el.properties +32 -65
  200. package/src/sap/fe/core/messagebundle_en.properties +32 -65
  201. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -62
  202. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -74
  203. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +32 -65
  204. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +20 -6
  205. package/src/sap/fe/core/messagebundle_es.properties +31 -64
  206. package/src/sap/fe/core/messagebundle_es_MX.properties +31 -64
  207. package/src/sap/fe/core/messagebundle_et.properties +31 -64
  208. package/src/sap/fe/core/messagebundle_fi.properties +29 -62
  209. package/src/sap/fe/core/messagebundle_fr.properties +36 -69
  210. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -66
  211. package/src/sap/fe/core/messagebundle_hi.properties +29 -62
  212. package/src/sap/fe/core/messagebundle_hr.properties +32 -65
  213. package/src/sap/fe/core/messagebundle_hu.properties +30 -63
  214. package/src/sap/fe/core/messagebundle_id.properties +32 -65
  215. package/src/sap/fe/core/messagebundle_it.properties +31 -64
  216. package/src/sap/fe/core/messagebundle_iw.properties +31 -64
  217. package/src/sap/fe/core/messagebundle_ja.properties +29 -62
  218. package/src/sap/fe/core/messagebundle_kk.properties +31 -64
  219. package/src/sap/fe/core/messagebundle_ko.properties +31 -64
  220. package/src/sap/fe/core/messagebundle_lt.properties +31 -64
  221. package/src/sap/fe/core/messagebundle_lv.properties +32 -65
  222. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  223. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  224. package/src/sap/fe/core/messagebundle_no.properties +31 -64
  225. package/src/sap/fe/core/messagebundle_pl.properties +34 -67
  226. package/src/sap/fe/core/messagebundle_pt.properties +32 -65
  227. package/src/sap/fe/core/messagebundle_pt_PT.properties +31 -64
  228. package/src/sap/fe/core/messagebundle_ro.properties +33 -66
  229. package/src/sap/fe/core/messagebundle_ru.properties +33 -66
  230. package/src/sap/fe/core/messagebundle_sh.properties +31 -64
  231. package/src/sap/fe/core/messagebundle_sk.properties +31 -64
  232. package/src/sap/fe/core/messagebundle_sl.properties +29 -62
  233. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  234. package/src/sap/fe/core/messagebundle_th.properties +31 -64
  235. package/src/sap/fe/core/messagebundle_tr.properties +31 -64
  236. package/src/sap/fe/core/messagebundle_uk.properties +32 -65
  237. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  238. package/src/sap/fe/core/messagebundle_zh_CN.properties +32 -65
  239. package/src/sap/fe/core/messagebundle_zh_TW.properties +34 -67
  240. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +4 -4
  241. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  242. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +5 -5
  243. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +1 -2
  244. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +11 -8
  245. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -13
  246. package/src/sap/fe/core/services/NavigationServiceFactory.js +5 -5
  247. package/src/sap/fe/core/services/NavigationServiceFactory.ts +9 -5
  248. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -4
  249. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +1 -1
  250. package/src/sap/fe/core/services/RoutingServiceFactory.js +105 -66
  251. package/src/sap/fe/core/services/RoutingServiceFactory.ts +59 -49
  252. package/src/sap/fe/core/services/ShellServicesFactory.js +104 -29
  253. package/src/sap/fe/core/services/ShellServicesFactory.ts +64 -30
  254. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  255. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +11 -10
  257. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +38 -51
  258. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  259. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +6 -3
  260. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  261. package/src/sap/fe/core/support/CommonHelper.ts +0 -3
  262. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -9
  263. package/src/sap/fe/core/templating/DataModelPathHelper.ts +32 -38
  264. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  265. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +27 -6
  266. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  267. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  268. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  269. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  270. package/src/sap/fe/core/templating/PropertyHelper.js +70 -33
  271. package/src/sap/fe/core/templating/PropertyHelper.ts +49 -27
  272. package/src/sap/fe/core/templating/UIFormatters.js +133 -22
  273. package/src/sap/fe/core/templating/UIFormatters.ts +144 -50
  274. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  275. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  276. package/src/sap/fe/core/type/Email.js +26 -8
  277. package/src/sap/fe/core/type/Email.ts +8 -7
  278. package/src/sap/fe/core/AnnotationHelper.js +0 -312
  279. package/src/sap/fe/core/AnnotationHelper.ts +0 -315
  280. package/src/sap/fe/core/RouterProxy.js +0 -926
  281. package/src/sap/fe/core/TransactionHelper.js +0 -1562
  282. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -392
  283. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -136
  284. package/src/sap/fe/core/actions/collaboration/Manage.js +0 -262
  285. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +0 -103
  286. package/src/sap/fe/core/actions/draft.js +0 -523
  287. package/src/sap/fe/core/actions/messageHandling.js +0 -567
  288. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  289. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  290. package/src/sap/fe/core/actions/operations.js +0 -1096
  291. package/src/sap/fe/core/actions/sticky.js +0 -130
  292. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -78
  293. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +0 -65
  294. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  295. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -0,0 +1,592 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText", "sap/m/MessageBox", "sap/m/MessageItem", "sap/m/MessageToast", "sap/m/MessageView", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/format/DateFormat", "sap/ui/core/IconPool", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/model/json/JSONModel"], function (Bar, Button, Dialog, FormattedText, MessageBox, MessageItem, MessageToast, MessageView, Text, Core, DateFormat, IconPool, CoreLib, Message, Filter, FilterOperator, JSONModel) {
6
+ "use strict";
7
+
8
+ var MessageType = CoreLib.MessageType;
9
+ var aMessageList = [];
10
+ var aMessageDataList = [];
11
+ var aResolveFunctions = [];
12
+ var oDialog;
13
+ var oBackButton;
14
+ var oMessageTemplate;
15
+ var oMessageView;
16
+
17
+ function fnFormatTechnicalDetails() {
18
+ var sPreviousGroupName; // Insert technical detail if it exists
19
+
20
+ function insertDetail(oProperty) {
21
+ return oProperty.property ? "( ${" + oProperty.property + '} ? ("<p>' + oProperty.property.substr(Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1) + ' : " + ' + "${" + oProperty.property + '} + "</p>") : "" )' : "";
22
+ } // Insert groupname if it exists
23
+
24
+
25
+ function insertGroupName(oProperty) {
26
+ var sHTML = "";
27
+
28
+ if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
29
+ sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
30
+ sPreviousGroupName = oProperty.groupName;
31
+ }
32
+
33
+ return sHTML;
34
+ } // List of technical details to be shown
35
+
36
+
37
+ function getPaths() {
38
+ var sTD = "technicalDetails"; // name of property in message model data for technical details
39
+
40
+ return [{
41
+ "groupName": "",
42
+ "property": sTD + "/status"
43
+ }, {
44
+ "groupName": "",
45
+ "property": sTD + "/statusText"
46
+ }, {
47
+ "groupName": "Application",
48
+ "property": sTD + "/error/@SAP__common.Application/ComponentId"
49
+ }, {
50
+ "groupName": "Application",
51
+ "property": sTD + "/error/@SAP__common.Application/ServiceId"
52
+ }, {
53
+ "groupName": "Application",
54
+ "property": sTD + "/error/@SAP__common.Application/ServiceRepository"
55
+ }, {
56
+ "groupName": "Application",
57
+ "property": sTD + "/error/@SAP__common.Application/ServiceVersion"
58
+ }, {
59
+ "groupName": "ErrorResolution",
60
+ "property": sTD + "/error/@SAP__common.ErrorResolution/Analysis"
61
+ }, {
62
+ "groupName": "ErrorResolution",
63
+ "property": sTD + "/error/@SAP__common.ErrorResolution/Note"
64
+ }, {
65
+ "groupName": "ErrorResolution",
66
+ "property": sTD + "/error/@SAP__common.ErrorResolution/DetailedNote"
67
+ }, {
68
+ "groupName": "ErrorResolution",
69
+ "property": sTD + "/error/@SAP__common.ExceptionCategory"
70
+ }, {
71
+ "groupName": "ErrorResolution",
72
+ "property": sTD + "/error/@SAP__common.TimeStamp"
73
+ }, {
74
+ "groupName": "ErrorResolution",
75
+ "property": sTD + "/error/@SAP__common.TransactionId"
76
+ }, {
77
+ "groupName": "Messages",
78
+ "property": sTD + "/error/code"
79
+ }, {
80
+ "groupName": "Messages",
81
+ "property": sTD + "/error/message"
82
+ }];
83
+ }
84
+
85
+ var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
86
+ getPaths().forEach(function (oProperty) {
87
+ sHTML = sHTML + insertGroupName(oProperty) + "" + insertDetail(oProperty) + " + ";
88
+ });
89
+ return sHTML;
90
+ }
91
+
92
+ function fnFormatDescription() {
93
+ var sHTML = "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
94
+ return sHTML;
95
+ }
96
+ /**
97
+ * Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
98
+
99
+ * @function
100
+ * @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
101
+ * @memberof sap.fe.core.actions.messageHandling
102
+ * @param {Array} [aMessages] Messages list
103
+ * @returns {string} Highest priority message from the available messages
104
+ * @private
105
+ * @ui5-restricted
106
+ */
107
+
108
+
109
+ function fnGetHighestMessagePriority(aMessages) {
110
+ var sMessagePriority = MessageType.None;
111
+ var iLength = aMessages.length;
112
+ var oMessageCount = {
113
+ Error: 0,
114
+ Warning: 0,
115
+ Success: 0,
116
+ Information: 0
117
+ };
118
+
119
+ for (var i = 0; i < iLength; i++) {
120
+ ++oMessageCount[aMessages[i].getType()];
121
+ }
122
+
123
+ if (oMessageCount[MessageType.Error] > 0) {
124
+ sMessagePriority = MessageType.Error;
125
+ } else if (oMessageCount[MessageType.Warning] > 0) {
126
+ sMessagePriority = MessageType.Warning;
127
+ } else if (oMessageCount[MessageType.Success] > 0) {
128
+ sMessagePriority = MessageType.Success;
129
+ } else if (oMessageCount[MessageType.Information] > 0) {
130
+ sMessagePriority = MessageType.Information;
131
+ }
132
+
133
+ return sMessagePriority;
134
+ } // function which modify e-Tag messages only.
135
+ // returns : true, if any e-Tag message is modified, otherwise false.
136
+
137
+
138
+ function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle) {
139
+ var aMessages = oMessageManager.getMessageModel().getObject("/");
140
+ var bMessagesModified = false;
141
+ var sEtagMessage = "";
142
+ aMessages.forEach(function (oMessage, i) {
143
+ var oTechnicalDetails = oMessage.getTechnicalDetails();
144
+
145
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
146
+ sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
147
+ oMessageManager.removeMessages(aMessages[i]);
148
+ oMessage.setMessage(sEtagMessage);
149
+ oMessage.target = "";
150
+ oMessageManager.addMessages(oMessage);
151
+ bMessagesModified = true;
152
+ }
153
+ });
154
+ return bMessagesModified;
155
+ } // Dialog close Handling
156
+
157
+
158
+ function dialogCloseHandler() {
159
+ oDialog.close();
160
+ oBackButton.setVisible(false);
161
+ aMessageList = [];
162
+ var oMessageDialogModel = oMessageView.getModel();
163
+
164
+ if (oMessageDialogModel) {
165
+ oMessageDialogModel.setData({});
166
+ }
167
+
168
+ removeUnboundTransitionMessages();
169
+ }
170
+
171
+ function getRetryAfterMessage(oMessage, bMessageDialog) {
172
+ var dNow = new Date();
173
+ var oTechnicalDetails = oMessage.getTechnicalDetails();
174
+ var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
175
+ var sRetryAfterMessage;
176
+
177
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
178
+ var dRetryAfter = oTechnicalDetails.retryAfter;
179
+ var oDateFormat;
180
+
181
+ if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
182
+ //different years
183
+ oDateFormat = DateFormat.getDateTimeInstance({
184
+ pattern: "MMMM dd, yyyy 'at' hh:mm a"
185
+ });
186
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
187
+ } else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
188
+ //same year
189
+ if (bMessageDialog) {
190
+ //less than 2 min
191
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") + " " + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
192
+ } else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
193
+ oDateFormat = DateFormat.getDateTimeInstance({
194
+ pattern: "MMMM dd 'at' hh:mm a"
195
+ }); //different months or different days of same month
196
+
197
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
198
+ } else {
199
+ //same day
200
+ oDateFormat = DateFormat.getDateTimeInstance({
201
+ pattern: "hh:mm a"
202
+ });
203
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY", [oDateFormat.format(dRetryAfter)]);
204
+ }
205
+ }
206
+ }
207
+
208
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
209
+ sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
210
+ }
211
+
212
+ return sRetryAfterMessage;
213
+ }
214
+
215
+ function prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow) {
216
+ if (!bStrictHandlingFlow) {
217
+ oMessageTemplate = oMessageTemplate || new MessageItem(undefined, {
218
+ counter: {
219
+ path: "counter"
220
+ },
221
+ title: "{message}",
222
+ subtitle: "{additionalText}",
223
+ longtextUrl: "{descriptionUrl}",
224
+ type: {
225
+ path: "type"
226
+ },
227
+ description: "{= ${" + "description} || ${technicalDetails} ? " + '"<html><body>" + ' + fnFormatDescription() + " + " + fnFormatTechnicalDetails() + '"</body></html>"' + ' : "" }',
228
+ markupDescription: true
229
+ });
230
+ } else {
231
+ oMessageTemplate = new MessageItem({
232
+ title: "{message}",
233
+ type: "Warning",
234
+ longtextUrl: "{descriptionUrl}"
235
+ });
236
+ }
237
+
238
+ oMessageView = oMessageView || new MessageView({
239
+ showDetailsPageHeader: false,
240
+ itemSelect: function () {
241
+ oBackButton.setVisible(true);
242
+ },
243
+ items: {
244
+ path: "/",
245
+ template: oMessageTemplate
246
+ }
247
+ });
248
+ oBackButton = oBackButton || new Button({
249
+ icon: IconPool.getIconURI("nav-back"),
250
+ visible: false,
251
+ press: function () {
252
+ oMessageView.navigateBack();
253
+ this.setVisible(false);
254
+ }
255
+ }); // Update proper ETag Mismatch error
256
+
257
+ oMessageView.setModel(oMessageDialogModel);
258
+ return {
259
+ oMessageView: oMessageView,
260
+ oBackButton: oBackButton
261
+ };
262
+ }
263
+
264
+ function showUnboundMessages(aCustomMessages, oContext, bHasEtagMessage, bShowBoundTransition, errorTargetsInAPM) {
265
+ var aUnboundMessages = this.getMessages();
266
+ var oMessageManager = Core.getMessageManager();
267
+ var sHighestPriority;
268
+ var sHighestPriorityText;
269
+ var aFilters = [new Filter({
270
+ path: "code",
271
+ operator: FilterOperator.NE,
272
+ value1: null
273
+ }), new Filter({
274
+ path: "persistent",
275
+ operator: FilterOperator.NE,
276
+ value1: false
277
+ })];
278
+ var showMessageDialog = false,
279
+ showMessageBox = false;
280
+
281
+ if (bShowBoundTransition) {
282
+ aUnboundMessages = aUnboundMessages.concat(getMessages(true, true)); // we only want to show bound transition messages not bound state messages hence add a filter for the same
283
+
284
+ aFilters.push(new Filter({
285
+ path: "persistent",
286
+ operator: FilterOperator.EQ,
287
+ value1: true
288
+ }));
289
+
290
+ var fnCheckControlIdInDialog = function (aControlIds) {
291
+ var index = Infinity,
292
+ oControl = Core.byId(aControlIds[0]);
293
+ var errorFieldControl = Core.byId(aControlIds[0]);
294
+
295
+ while (oControl) {
296
+ var fieldRankinDialog = oControl instanceof Dialog ? errorFieldControl.getParent().findElements(true).indexOf(errorFieldControl) : Infinity;
297
+
298
+ if (oControl instanceof Dialog) {
299
+ if (index > fieldRankinDialog) {
300
+ index = fieldRankinDialog; // Set the focus to the dialog's control
301
+
302
+ errorFieldControl.focus();
303
+ } // messages with target inside sap.m.Dialog should not bring up the message dialog
304
+
305
+
306
+ return false;
307
+ }
308
+
309
+ oControl = oControl.getParent();
310
+ }
311
+
312
+ return true;
313
+ };
314
+
315
+ aFilters.push(new Filter({
316
+ path: "controlIds",
317
+ test: fnCheckControlIdInDialog,
318
+ caseSensitive: true
319
+ }));
320
+ } else {
321
+ // only unbound messages have to be shown so add filter accordingly
322
+ aFilters.push(new Filter({
323
+ path: "target",
324
+ operator: FilterOperator.EQ,
325
+ value1: ""
326
+ }));
327
+ }
328
+
329
+ if (aCustomMessages && aCustomMessages.length) {
330
+ aCustomMessages.forEach(function (oMessage) {
331
+ var messageCode = oMessage.code ? oMessage.code : "";
332
+ oMessageManager.addMessages(new Message({
333
+ message: oMessage.text,
334
+ type: oMessage.type,
335
+ target: "",
336
+ persistent: true,
337
+ code: messageCode
338
+ })); //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
339
+ });
340
+ }
341
+
342
+ var oMessageDialogModel = oMessageView && oMessageView.getModel() || new JSONModel();
343
+
344
+ if (aUnboundMessages.length === 1 && (aUnboundMessages[0].getCode() === "503" || aUnboundMessages[0].getTarget() !== undefined && aUnboundMessages[0].getTarget() !== "")) {
345
+ if (aUnboundMessages[0].getCode() !== "503") {
346
+ showMessageBox = !errorTargetsInAPM;
347
+ } else {
348
+ showMessageBox = true;
349
+ }
350
+ } else {
351
+ var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
352
+ aCurrentContexts = oListBinding.getCurrentContexts();
353
+
354
+ if (aCurrentContexts && aCurrentContexts.length > 0) {
355
+ // Don't show dialog incase there are no errors to show
356
+ showMessageDialog = !errorTargetsInAPM; // if false, show messages in dialog
357
+ // As fitering has already happened here hence
358
+ // using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
359
+ // So we create new json model to use for the message dialog view.
360
+
361
+ var aMessages = [];
362
+ aCurrentContexts.forEach(function (oContext) {
363
+ var oMessage;
364
+ oMessage = oContext.getObject();
365
+ aMessages.push(oMessage);
366
+ aMessageDataList = aMessages;
367
+ }); // if(aMessages.length === 0 && aMessageList.length) {
368
+ // oMessageDialogModel.setData(aMessages);
369
+ // }
370
+
371
+ var existingMessages = [];
372
+
373
+ if (Array.isArray(oMessageDialogModel.getData())) {
374
+ existingMessages = oMessageDialogModel.getData();
375
+ }
376
+
377
+ var oUniqueObj = {};
378
+ var aModelDataArray = [];
379
+ aModelDataArray = aMessageDataList.concat(existingMessages).filter(function (obj) {
380
+ // remove entries having duplicate message ids
381
+ return !oUniqueObj[obj.id] && (oUniqueObj[obj.id] = true);
382
+ });
383
+ oMessageDialogModel.setData(aModelDataArray);
384
+ }
385
+ }
386
+
387
+ if (aUnboundMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
388
+ // Don't show the popup if there are no transient messages
389
+ return Promise.resolve(true);
390
+ } else if (aUnboundMessages.length === 1 && aUnboundMessages[0].getType() === MessageType.Success && !aCustomMessages) {
391
+ return new Promise(function (resolve) {
392
+ MessageToast.show(aUnboundMessages[0].message);
393
+
394
+ if (oMessageDialogModel) {
395
+ oMessageDialogModel.setData({});
396
+ }
397
+
398
+ oMessageManager.removeMessages(aUnboundMessages);
399
+ resolve();
400
+ });
401
+ } else if (showMessageDialog) {
402
+ aResolveFunctions = aResolveFunctions || [];
403
+ return new Promise(function (resolve, reject) {
404
+ aResolveFunctions.push(resolve);
405
+ Core.getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
406
+ var bStrictHandlingFlow = false;
407
+ var bHasEtagMessage = fnModifyETagMessagesOnly(oMessageManager, oResourceBundle);
408
+ var oMessageObject = prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow);
409
+ oDialog = oDialog || new Dialog({
410
+ resizable: true,
411
+ content: oMessageObject.oMessageView,
412
+ endButton: new Button({
413
+ press: function () {
414
+ dialogCloseHandler(); // also remove bound transition messages if we were showing them
415
+
416
+ if (bShowBoundTransition) {
417
+ removeBoundTransitionMessages();
418
+ }
419
+ },
420
+ text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
421
+ }),
422
+ customHeader: new Bar({
423
+ contentMiddle: [new Text({
424
+ text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
425
+ })],
426
+ contentLeft: [oBackButton]
427
+ }),
428
+ contentWidth: "37.5em",
429
+ contentHeight: "21.5em",
430
+ verticalScrolling: false,
431
+ afterClose: function () {
432
+ for (var i = 0; i < aResolveFunctions.length; i++) {
433
+ aResolveFunctions[i].call();
434
+ }
435
+
436
+ aResolveFunctions = [];
437
+ }
438
+ });
439
+
440
+ if (bHasEtagMessage) {
441
+ sap.ui.require(["sap/m/ButtonType"], function (ButtonType) {
442
+ oDialog.setBeginButton(new Button({
443
+ press: function () {
444
+ dialogCloseHandler();
445
+
446
+ if (oContext.hasPendingChanges()) {
447
+ oContext.getBinding().resetChanges();
448
+ }
449
+
450
+ oContext.refresh();
451
+ },
452
+ text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
453
+ type: ButtonType.Emphasized
454
+ }));
455
+ });
456
+ } else {
457
+ oDialog.destroyBeginButton();
458
+ }
459
+
460
+ sHighestPriority = fnGetHighestMessagePriority(oMessageView.getItems());
461
+ sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
462
+ oDialog.setState(sHighestPriority);
463
+ oDialog.getCustomHeader().getContentMiddle()[0].setText(sHighestPriorityText);
464
+ oMessageView.navigateBack();
465
+ oDialog.open();
466
+ }).catch(reject);
467
+ });
468
+ } else if (showMessageBox) {
469
+ return new Promise(function (resolve) {
470
+ var oMessage = aUnboundMessages[0];
471
+
472
+ if (oMessage.technicalDetails && aMessageList.indexOf(oMessage.technicalDetails.originalMessage.message) === -1) {
473
+ aMessageList.push(oMessage.technicalDetails.originalMessage.message);
474
+ var formattedTextString = "<html><body>";
475
+ var retryAfterMessage = getRetryAfterMessage(oMessage, true);
476
+
477
+ if (retryAfterMessage) {
478
+ formattedTextString = "<h6>" + retryAfterMessage + "</h6><br>";
479
+ }
480
+
481
+ if (oMessage.getCode() !== "503") {
482
+ formattedTextString = formattedTextString + oMessage.additionalText + ": " + oMessage.getMessage() + "</html></body>";
483
+ } else {
484
+ formattedTextString = formattedTextString + oMessage.getMessage() + "</html></body>";
485
+ }
486
+
487
+ var formattedText = new FormattedText({
488
+ htmlText: formattedTextString
489
+ });
490
+ MessageBox.error(formattedText, {
491
+ onClose: function () {
492
+ aMessageList = [];
493
+
494
+ if (bShowBoundTransition) {
495
+ removeBoundTransitionMessages();
496
+ }
497
+
498
+ removeUnboundTransitionMessages();
499
+ resolve(true);
500
+ }
501
+ });
502
+ }
503
+ });
504
+ } else {
505
+ return Promise.resolve(true);
506
+ }
507
+ }
508
+
509
+ function getTranslatedTextForMessageDialog(sHighestPriority) {
510
+ var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
511
+
512
+ switch (sHighestPriority) {
513
+ case "Error":
514
+ return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
515
+
516
+ case "Information":
517
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
518
+
519
+ case "Success":
520
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
521
+
522
+ case "Warning":
523
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
524
+
525
+ default:
526
+ return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
527
+ }
528
+ }
529
+
530
+ function removeUnboundTransitionMessages() {
531
+ removeTransitionMessages(false);
532
+ }
533
+
534
+ function removeBoundTransitionMessages() {
535
+ removeTransitionMessages(true);
536
+ }
537
+
538
+ function getMessages() {
539
+ var bBoundMessages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
540
+ var bTransitionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
541
+ var i;
542
+ var oMessageManager = Core.getMessageManager(),
543
+ oMessageModel = oMessageManager.getMessageModel(),
544
+ aMessages = oMessageModel.getObject("/"),
545
+ oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
546
+ aTransitionMessages = [];
547
+
548
+ for (i = 0; i < aMessages.length; i++) {
549
+ if ((!bTransitionOnly || aMessages[i].persistent) && (bBoundMessages && aMessages[i].target !== "" || !bBoundMessages && (!aMessages[i].target || aMessages[i].target === "")) && aMessages[i].code) {
550
+ aTransitionMessages.push(aMessages[i]);
551
+ }
552
+ }
553
+
554
+ for (i = 0; i < aTransitionMessages.length; i++) {
555
+ if (aTransitionMessages[i].code === "503" && aTransitionMessages[i].message !== "" && aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1) {
556
+ aTransitionMessages[i].message = "\n" + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX") + aTransitionMessages[i].message;
557
+ }
558
+ }
559
+
560
+ return aTransitionMessages;
561
+ }
562
+
563
+ function removeTransitionMessages(bBoundMessages) {
564
+ var aMessagesToBeDeleted = getMessages(bBoundMessages, true);
565
+
566
+ if (aMessagesToBeDeleted.length > 0) {
567
+ Core.getMessageManager().removeMessages(aMessagesToBeDeleted);
568
+ }
569
+ }
570
+ /**
571
+ * Static functions for Fiori Message Handling
572
+ *
573
+ * @namespace
574
+ * @alias sap.fe.core.actions.messageHandling
575
+ * @private
576
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
577
+ * @since 1.56.0
578
+ */
579
+
580
+
581
+ var messageHandling = {
582
+ getMessages: getMessages,
583
+ showUnboundMessages: showUnboundMessages,
584
+ removeUnboundTransitionMessages: removeUnboundTransitionMessages,
585
+ removeBoundTransitionMessages: removeBoundTransitionMessages,
586
+ modifyETagMessagesOnly: fnModifyETagMessagesOnly,
587
+ getRetryAfterMessage: getRetryAfterMessage,
588
+ prepareMessageViewForDialog: prepareMessageViewForDialog
589
+ };
590
+ return messageHandling;
591
+ }, false);
592
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1lc3NhZ2VIYW5kbGluZy50cyJdLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVRlbXBsYXRlIiwib01lc3NhZ2VWaWV3IiwiZm5Gb3JtYXRUZWNobmljYWxEZXRhaWxzIiwic1ByZXZpb3VzR3JvdXBOYW1lIiwiaW5zZXJ0RGV0YWlsIiwib1Byb3BlcnR5IiwicHJvcGVydHkiLCJzdWJzdHIiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJpbnNlcnRHcm91cE5hbWUiLCJzSFRNTCIsImdyb3VwTmFtZSIsImdldFBhdGhzIiwic1REIiwiZm9yRWFjaCIsImZuRm9ybWF0RGVzY3JpcHRpb24iLCJmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkiLCJhTWVzc2FnZXMiLCJzTWVzc2FnZVByaW9yaXR5IiwiTm9uZSIsImlMZW5ndGgiLCJsZW5ndGgiLCJvTWVzc2FnZUNvdW50IiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiaSIsImdldFR5cGUiLCJmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXRPYmplY3QiLCJiTWVzc2FnZXNNb2RpZmllZCIsInNFdGFnTWVzc2FnZSIsIm9NZXNzYWdlIiwib1RlY2huaWNhbERldGFpbHMiLCJnZXRUZWNobmljYWxEZXRhaWxzIiwiaHR0cFN0YXR1cyIsImdldFRleHQiLCJyZW1vdmVNZXNzYWdlcyIsInNldE1lc3NhZ2UiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsImRpYWxvZ0Nsb3NlSGFuZGxlciIsImNsb3NlIiwic2V0VmlzaWJsZSIsIm9NZXNzYWdlRGlhbG9nTW9kZWwiLCJnZXRNb2RlbCIsInNldERhdGEiLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZ2V0UmV0cnlBZnRlck1lc3NhZ2UiLCJiTWVzc2FnZURpYWxvZyIsImROb3ciLCJEYXRlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsInNSZXRyeUFmdGVyTWVzc2FnZSIsInJldHJ5QWZ0ZXIiLCJkUmV0cnlBZnRlciIsIm9EYXRlRm9ybWF0IiwiZ2V0RnVsbFllYXIiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZVRpbWVJbnN0YW5jZSIsInBhdHRlcm4iLCJmb3JtYXQiLCJnZXRNb250aCIsImdldERhdGUiLCJwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2ciLCJiU3RyaWN0SGFuZGxpbmdGbG93IiwiTWVzc2FnZUl0ZW0iLCJ1bmRlZmluZWQiLCJjb3VudGVyIiwicGF0aCIsInRpdGxlIiwic3VidGl0bGUiLCJsb25ndGV4dFVybCIsInR5cGUiLCJkZXNjcmlwdGlvbiIsIm1hcmt1cERlc2NyaXB0aW9uIiwiTWVzc2FnZVZpZXciLCJzaG93RGV0YWlsc1BhZ2VIZWFkZXIiLCJpdGVtU2VsZWN0IiwiaXRlbXMiLCJ0ZW1wbGF0ZSIsIkJ1dHRvbiIsImljb24iLCJJY29uUG9vbCIsImdldEljb25VUkkiLCJ2aXNpYmxlIiwicHJlc3MiLCJuYXZpZ2F0ZUJhY2siLCJzZXRNb2RlbCIsInNob3dVbmJvdW5kTWVzc2FnZXMiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvQ29udGV4dCIsImJIYXNFdGFnTWVzc2FnZSIsImJTaG93Qm91bmRUcmFuc2l0aW9uIiwiZXJyb3JUYXJnZXRzSW5BUE0iLCJhVW5ib3VuZE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJnZXRNZXNzYWdlTWFuYWdlciIsInNIaWdoZXN0UHJpb3JpdHkiLCJzSGlnaGVzdFByaW9yaXR5VGV4dCIsImFGaWx0ZXJzIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIk5FIiwidmFsdWUxIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJzaG93TWVzc2FnZUJveCIsImNvbmNhdCIsInB1c2giLCJFUSIsImZuQ2hlY2tDb250cm9sSWRJbkRpYWxvZyIsImFDb250cm9sSWRzIiwiaW5kZXgiLCJJbmZpbml0eSIsIm9Db250cm9sIiwiYnlJZCIsImVycm9yRmllbGRDb250cm9sIiwiZmllbGRSYW5raW5EaWFsb2ciLCJEaWFsb2ciLCJnZXRQYXJlbnQiLCJmaW5kRWxlbWVudHMiLCJpbmRleE9mIiwiZm9jdXMiLCJ0ZXN0IiwiY2FzZVNlbnNpdGl2ZSIsIm1lc3NhZ2VDb2RlIiwiY29kZSIsIk1lc3NhZ2UiLCJtZXNzYWdlIiwidGV4dCIsInBlcnNpc3RlbnQiLCJKU09OTW9kZWwiLCJnZXRDb2RlIiwiZ2V0VGFyZ2V0Iiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJhQ3VycmVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwiZXhpc3RpbmdNZXNzYWdlcyIsIkFycmF5IiwiaXNBcnJheSIsImdldERhdGEiLCJvVW5pcXVlT2JqIiwiYU1vZGVsRGF0YUFycmF5IiwiZmlsdGVyIiwib2JqIiwiaWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJyZWplY3QiLCJ0aGVuIiwib01lc3NhZ2VPYmplY3QiLCJyZXNpemFibGUiLCJjb250ZW50IiwiZW5kQnV0dG9uIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJjdXN0b21IZWFkZXIiLCJCYXIiLCJjb250ZW50TWlkZGxlIiwiVGV4dCIsImNvbnRlbnRMZWZ0IiwiY29udGVudFdpZHRoIiwiY29udGVudEhlaWdodCIsInZlcnRpY2FsU2Nyb2xsaW5nIiwiYWZ0ZXJDbG9zZSIsImNhbGwiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJCdXR0b25UeXBlIiwic2V0QmVnaW5CdXR0b24iLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJyZWZyZXNoIiwiRW1waGFzaXplZCIsImRlc3Ryb3lCZWdpbkJ1dHRvbiIsImdldEl0ZW1zIiwiZ2V0VHJhbnNsYXRlZFRleHRGb3JNZXNzYWdlRGlhbG9nIiwic2V0U3RhdGUiLCJnZXRDdXN0b21IZWFkZXIiLCJnZXRDb250ZW50TWlkZGxlIiwic2V0VGV4dCIsIm9wZW4iLCJjYXRjaCIsInRlY2huaWNhbERldGFpbHMiLCJvcmlnaW5hbE1lc3NhZ2UiLCJmb3JtYXR0ZWRUZXh0U3RyaW5nIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJhZGRpdGlvbmFsVGV4dCIsImdldE1lc3NhZ2UiLCJmb3JtYXR0ZWRUZXh0IiwiRm9ybWF0dGVkVGV4dCIsImh0bWxUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwib25DbG9zZSIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImJCb3VuZE1lc3NhZ2VzIiwiYlRyYW5zaXRpb25Pbmx5Iiwib01lc3NhZ2VNb2RlbCIsImFUcmFuc2l0aW9uTWVzc2FnZXMiLCJhTWVzc2FnZXNUb0JlRGVsZXRlZCIsIm1lc3NhZ2VIYW5kbGluZyIsIm1vZGlmeUVUYWdNZXNzYWdlc09ubHkiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFtQkEsTUFBTUEsV0FBVyxHQUFHQyxPQUFPLENBQUNELFdBQTVCO0FBQ0EsTUFBSUUsWUFBbUIsR0FBRyxFQUExQjtBQUNBLE1BQUlDLGdCQUF1QixHQUFHLEVBQTlCO0FBQ0EsTUFBSUMsaUJBQXdCLEdBQUcsRUFBL0I7QUFDQSxNQUFJQyxPQUFKO0FBQ0EsTUFBSUMsV0FBSjtBQUNBLE1BQUlDLGdCQUFKO0FBQ0EsTUFBSUMsWUFBSjs7QUFrQkEsV0FBU0Msd0JBQVQsR0FBb0M7QUFDbkMsUUFBSUMsa0JBQUosQ0FEbUMsQ0FHbkM7O0FBQ0EsYUFBU0MsWUFBVCxDQUFzQkMsU0FBdEIsRUFBc0M7QUFDckMsYUFBT0EsU0FBUyxDQUFDQyxRQUFWLEdBQ0osU0FDQUQsU0FBUyxDQUFDQyxRQURWLEdBRUEsV0FGQSxHQUdBRCxTQUFTLENBQUNDLFFBQVYsQ0FBbUJDLE1BQW5CLENBQTBCQyxJQUFJLENBQUNDLEdBQUwsQ0FBU0osU0FBUyxDQUFDQyxRQUFWLENBQW1CSSxXQUFuQixDQUErQixHQUEvQixDQUFULEVBQThDTCxTQUFTLENBQUNDLFFBQVYsQ0FBbUJJLFdBQW5CLENBQStCLEdBQS9CLENBQTlDLElBQXFGLENBQS9HLENBSEEsR0FJQSxTQUpBLEdBS0EsSUFMQSxHQU1BTCxTQUFTLENBQUNDLFFBTlYsR0FPQSxvQkFSSSxHQVNKLEVBVEg7QUFVQSxLQWZrQyxDQWdCbkM7OztBQUNBLGFBQVNLLGVBQVQsQ0FBeUJOLFNBQXpCLEVBQXlDO0FBQ3hDLFVBQUlPLEtBQUssR0FBRyxFQUFaOztBQUNBLFVBQUlQLFNBQVMsQ0FBQ1EsU0FBVixJQUF1QlIsU0FBUyxDQUFDQyxRQUFqQyxJQUE2Q0QsU0FBUyxDQUFDUSxTQUFWLEtBQXdCVixrQkFBekUsRUFBNkY7QUFDNUZTLFFBQUFBLEtBQUssSUFBSSxTQUFTUCxTQUFTLENBQUNDLFFBQW5CLEdBQThCLGVBQTlCLEdBQWdERCxTQUFTLENBQUNRLFNBQTFELEdBQXNFLGtCQUEvRTtBQUNBVixRQUFBQSxrQkFBa0IsR0FBR0UsU0FBUyxDQUFDUSxTQUEvQjtBQUNBOztBQUNELGFBQU9ELEtBQVA7QUFDQSxLQXhCa0MsQ0EwQm5DOzs7QUFDQSxhQUFTRSxRQUFULEdBQW9CO0FBQ25CLFVBQU1DLEdBQUcsR0FBRyxrQkFBWixDQURtQixDQUNhOztBQUNoQyxhQUFPLENBQ047QUFBRSxxQkFBYSxFQUFmO0FBQW1CLG9CQUFZQSxHQUFHLEdBQUc7QUFBckMsT0FETSxFQUVOO0FBQUUscUJBQWEsRUFBZjtBQUFtQixvQkFBWUEsR0FBRyxHQUFHO0FBQXJDLE9BRk0sRUFHTjtBQUFFLHFCQUFhLGFBQWY7QUFBOEIsb0JBQVlBLEdBQUcsR0FBRztBQUFoRCxPQUhNLEVBSU47QUFBRSxxQkFBYSxhQUFmO0FBQThCLG9CQUFZQSxHQUFHLEdBQUc7QUFBaEQsT0FKTSxFQUtOO0FBQUUscUJBQWEsYUFBZjtBQUE4QixvQkFBWUEsR0FBRyxHQUFHO0FBQWhELE9BTE0sRUFNTjtBQUFFLHFCQUFhLGFBQWY7QUFBOEIsb0JBQVlBLEdBQUcsR0FBRztBQUFoRCxPQU5NLEVBT047QUFBRSxxQkFBYSxpQkFBZjtBQUFrQyxvQkFBWUEsR0FBRyxHQUFHO0FBQXBELE9BUE0sRUFRTjtBQUFFLHFCQUFhLGlCQUFmO0FBQWtDLG9CQUFZQSxHQUFHLEdBQUc7QUFBcEQsT0FSTSxFQVNOO0FBQUUscUJBQWEsaUJBQWY7QUFBa0Msb0JBQVlBLEdBQUcsR0FBRztBQUFwRCxPQVRNLEVBVU47QUFBRSxxQkFBYSxpQkFBZjtBQUFrQyxvQkFBWUEsR0FBRyxHQUFHO0FBQXBELE9BVk0sRUFXTjtBQUFFLHFCQUFhLGlCQUFmO0FBQWtDLG9CQUFZQSxHQUFHLEdBQUc7QUFBcEQsT0FYTSxFQVlOO0FBQUUscUJBQWEsaUJBQWY7QUFBa0Msb0JBQVlBLEdBQUcsR0FBRztBQUFwRCxPQVpNLEVBYU47QUFBRSxxQkFBYSxVQUFmO0FBQTJCLG9CQUFZQSxHQUFHLEdBQUc7QUFBN0MsT0FiTSxFQWNOO0FBQUUscUJBQWEsVUFBZjtBQUEyQixvQkFBWUEsR0FBRyxHQUFHO0FBQTdDLE9BZE0sQ0FBUDtBQWdCQTs7QUFFRCxRQUFJSCxLQUFLLEdBQUcsaUJBQWlCLHFCQUFqQixHQUF5QyxtREFBckQ7QUFDQUUsSUFBQUEsUUFBUSxHQUFHRSxPQUFYLENBQW1CLFVBQVVYLFNBQVYsRUFBOEQ7QUFDaEZPLE1BQUFBLEtBQUssR0FBR0EsS0FBSyxHQUFHRCxlQUFlLENBQUNOLFNBQUQsQ0FBdkIsR0FBcUMsRUFBckMsR0FBMENELFlBQVksQ0FBQ0MsU0FBRCxDQUF0RCxHQUFvRSxLQUE1RTtBQUNBLEtBRkQ7QUFHQSxXQUFPTyxLQUFQO0FBQ0E7O0FBQ0QsV0FBU0ssbUJBQVQsR0FBK0I7QUFDOUIsUUFBTUwsS0FBSyxHQUFHLFFBQVEsNkNBQVIsR0FBd0QscUJBQXRFO0FBQ0EsV0FBT0EsS0FBUDtBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsV0FBU00sMkJBQVQsQ0FBcUNDLFNBQXJDLEVBQXVEO0FBQ3RELFFBQUlDLGdCQUFnQixHQUFHM0IsV0FBVyxDQUFDNEIsSUFBbkM7QUFDQSxRQUFNQyxPQUFPLEdBQUdILFNBQVMsQ0FBQ0ksTUFBMUI7QUFDQSxRQUFNQyxhQUFrQixHQUFHO0FBQUVDLE1BQUFBLEtBQUssRUFBRSxDQUFUO0FBQVlDLE1BQUFBLE9BQU8sRUFBRSxDQUFyQjtBQUF3QkMsTUFBQUEsT0FBTyxFQUFFLENBQWpDO0FBQW9DQyxNQUFBQSxXQUFXLEVBQUU7QUFBakQsS0FBM0I7O0FBRUEsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHUCxPQUFwQixFQUE2Qk8sQ0FBQyxFQUE5QixFQUFrQztBQUNqQyxRQUFFTCxhQUFhLENBQUNMLFNBQVMsQ0FBQ1UsQ0FBRCxDQUFULENBQWFDLE9BQWIsRUFBRCxDQUFmO0FBQ0E7O0FBQ0QsUUFBSU4sYUFBYSxDQUFDL0IsV0FBVyxDQUFDZ0MsS0FBYixDQUFiLEdBQW1DLENBQXZDLEVBQTBDO0FBQ3pDTCxNQUFBQSxnQkFBZ0IsR0FBRzNCLFdBQVcsQ0FBQ2dDLEtBQS9CO0FBQ0EsS0FGRCxNQUVPLElBQUlELGFBQWEsQ0FBQy9CLFdBQVcsQ0FBQ2lDLE9BQWIsQ0FBYixHQUFxQyxDQUF6QyxFQUE0QztBQUNsRE4sTUFBQUEsZ0JBQWdCLEdBQUczQixXQUFXLENBQUNpQyxPQUEvQjtBQUNBLEtBRk0sTUFFQSxJQUFJRixhQUFhLENBQUMvQixXQUFXLENBQUNrQyxPQUFiLENBQWIsR0FBcUMsQ0FBekMsRUFBNEM7QUFDbERQLE1BQUFBLGdCQUFnQixHQUFHM0IsV0FBVyxDQUFDa0MsT0FBL0I7QUFDQSxLQUZNLE1BRUEsSUFBSUgsYUFBYSxDQUFDL0IsV0FBVyxDQUFDbUMsV0FBYixDQUFiLEdBQXlDLENBQTdDLEVBQWdEO0FBQ3REUixNQUFBQSxnQkFBZ0IsR0FBRzNCLFdBQVcsQ0FBQ21DLFdBQS9CO0FBQ0E7O0FBQ0QsV0FBT1IsZ0JBQVA7QUFDQSxHLENBQ0Q7QUFDQTs7O0FBQ0EsV0FBU1csd0JBQVQsQ0FBa0NDLGVBQWxDLEVBQXdEQyxlQUF4RCxFQUE4RTtBQUM3RSxRQUFNZCxTQUFTLEdBQUdhLGVBQWUsQ0FBQ0UsZUFBaEIsR0FBa0NDLFNBQWxDLENBQTRDLEdBQTVDLENBQWxCO0FBQ0EsUUFBSUMsaUJBQWlCLEdBQUcsS0FBeEI7QUFDQSxRQUFJQyxZQUFZLEdBQUcsRUFBbkI7QUFDQWxCLElBQUFBLFNBQVMsQ0FBQ0gsT0FBVixDQUFrQixVQUFVc0IsUUFBVixFQUF5QlQsQ0FBekIsRUFBaUM7QUFDbEQsVUFBTVUsaUJBQWlCLEdBQUdELFFBQVEsQ0FBQ0UsbUJBQVQsRUFBMUI7O0FBQ0EsVUFBSUQsaUJBQWlCLElBQUlBLGlCQUFpQixDQUFDRSxVQUFsQixLQUFpQyxHQUExRCxFQUErRDtBQUM5REosUUFBQUEsWUFBWSxHQUFHQSxZQUFZLElBQUlKLGVBQWUsQ0FBQ1MsT0FBaEIsQ0FBd0IsNkNBQXhCLENBQS9CO0FBQ0FWLFFBQUFBLGVBQWUsQ0FBQ1csY0FBaEIsQ0FBK0J4QixTQUFTLENBQUNVLENBQUQsQ0FBeEM7QUFDQVMsUUFBQUEsUUFBUSxDQUFDTSxVQUFULENBQW9CUCxZQUFwQjtBQUNBQyxRQUFBQSxRQUFRLENBQUNPLE1BQVQsR0FBa0IsRUFBbEI7QUFDQWIsUUFBQUEsZUFBZSxDQUFDYyxXQUFoQixDQUE0QlIsUUFBNUI7QUFDQUYsUUFBQUEsaUJBQWlCLEdBQUcsSUFBcEI7QUFDQTtBQUNELEtBVkQ7QUFXQSxXQUFPQSxpQkFBUDtBQUNBLEcsQ0FDRDs7O0FBQ0EsV0FBU1csa0JBQVQsR0FBOEI7QUFDN0JqRCxJQUFBQSxPQUFPLENBQUNrRCxLQUFSO0FBQ0FqRCxJQUFBQSxXQUFXLENBQUNrRCxVQUFaLENBQXVCLEtBQXZCO0FBQ0F0RCxJQUFBQSxZQUFZLEdBQUcsRUFBZjtBQUNBLFFBQU11RCxtQkFBd0IsR0FBR2pELFlBQVksQ0FBQ2tELFFBQWIsRUFBakM7O0FBQ0EsUUFBSUQsbUJBQUosRUFBeUI7QUFDeEJBLE1BQUFBLG1CQUFtQixDQUFDRSxPQUFwQixDQUE0QixFQUE1QjtBQUNBOztBQUNEQyxJQUFBQSwrQkFBK0I7QUFDL0I7O0FBQ0QsV0FBU0Msb0JBQVQsQ0FBOEJoQixRQUE5QixFQUE2Q2lCLGNBQTdDLEVBQW1FO0FBQ2xFLFFBQU1DLElBQUksR0FBRyxJQUFJQyxJQUFKLEVBQWI7QUFDQSxRQUFNbEIsaUJBQWlCLEdBQUdELFFBQVEsQ0FBQ0UsbUJBQVQsRUFBMUI7QUFDQSxRQUFNUCxlQUFlLEdBQUl5QixJQUFELENBQWlCQyx3QkFBakIsQ0FBMEMsYUFBMUMsQ0FBeEI7QUFDQSxRQUFJQyxrQkFBSjs7QUFDQSxRQUFJckIsaUJBQWlCLElBQUlBLGlCQUFpQixDQUFDRSxVQUFsQixLQUFpQyxHQUF0RCxJQUE2REYsaUJBQWlCLENBQUNzQixVQUFuRixFQUErRjtBQUM5RixVQUFNQyxXQUFXLEdBQUd2QixpQkFBaUIsQ0FBQ3NCLFVBQXRDO0FBQ0EsVUFBSUUsV0FBSjs7QUFDQSxVQUFJUCxJQUFJLENBQUNRLFdBQUwsT0FBdUJGLFdBQVcsQ0FBQ0UsV0FBWixFQUEzQixFQUFzRDtBQUNyRDtBQUNBRCxRQUFBQSxXQUFXLEdBQUdFLFVBQVUsQ0FBQ0MsbUJBQVgsQ0FBK0I7QUFDNUNDLFVBQUFBLE9BQU8sRUFBRTtBQURtQyxTQUEvQixDQUFkO0FBR0FQLFFBQUFBLGtCQUFrQixHQUFHM0IsZUFBZSxDQUFDUyxPQUFoQixDQUF3QixvQ0FBeEIsRUFBOEQsQ0FBQ3FCLFdBQVcsQ0FBQ0ssTUFBWixDQUFtQk4sV0FBbkIsQ0FBRCxDQUE5RCxDQUFyQjtBQUNBLE9BTkQsTUFNTyxJQUFJTixJQUFJLENBQUNRLFdBQUwsTUFBc0JGLFdBQVcsQ0FBQ0UsV0FBWixFQUExQixFQUFxRDtBQUMzRDtBQUNBLFlBQUlULGNBQUosRUFBb0I7QUFDbkI7QUFDQUssVUFBQUEsa0JBQWtCLEdBQ2pCM0IsZUFBZSxDQUFDUyxPQUFoQixDQUF3QixvQ0FBeEIsSUFDQSxHQURBLEdBRUFULGVBQWUsQ0FBQ1MsT0FBaEIsQ0FBd0IsbUNBQXhCLENBSEQ7QUFJQSxTQU5ELE1BTU8sSUFBSWMsSUFBSSxDQUFDYSxRQUFMLE9BQW9CUCxXQUFXLENBQUNPLFFBQVosRUFBcEIsSUFBOENiLElBQUksQ0FBQ2MsT0FBTCxPQUFtQlIsV0FBVyxDQUFDUSxPQUFaLEVBQXJFLEVBQTRGO0FBQ2xHUCxVQUFBQSxXQUFXLEdBQUdFLFVBQVUsQ0FBQ0MsbUJBQVgsQ0FBK0I7QUFDNUNDLFlBQUFBLE9BQU8sRUFBRTtBQURtQyxXQUEvQixDQUFkLENBRGtHLENBRzlGOztBQUNKUCxVQUFBQSxrQkFBa0IsR0FBRzNCLGVBQWUsQ0FBQ1MsT0FBaEIsQ0FBd0Isb0NBQXhCLEVBQThELENBQUNxQixXQUFXLENBQUNLLE1BQVosQ0FBbUJOLFdBQW5CLENBQUQsQ0FBOUQsQ0FBckI7QUFDQSxTQUxNLE1BS0E7QUFDTjtBQUNBQyxVQUFBQSxXQUFXLEdBQUdFLFVBQVUsQ0FBQ0MsbUJBQVgsQ0FBK0I7QUFDNUNDLFlBQUFBLE9BQU8sRUFBRTtBQURtQyxXQUEvQixDQUFkO0FBR0FQLFVBQUFBLGtCQUFrQixHQUFHM0IsZUFBZSxDQUFDUyxPQUFoQixDQUF3Qix3Q0FBeEIsRUFBa0UsQ0FBQ3FCLFdBQVcsQ0FBQ0ssTUFBWixDQUFtQk4sV0FBbkIsQ0FBRCxDQUFsRSxDQUFyQjtBQUNBO0FBQ0Q7QUFDRDs7QUFFRCxRQUFJdkIsaUJBQWlCLElBQUlBLGlCQUFpQixDQUFDRSxVQUFsQixLQUFpQyxHQUF0RCxJQUE2RCxDQUFDRixpQkFBaUIsQ0FBQ3NCLFVBQXBGLEVBQWdHO0FBQy9GRCxNQUFBQSxrQkFBa0IsR0FBRzNCLGVBQWUsQ0FBQ1MsT0FBaEIsQ0FBd0IsbURBQXhCLENBQXJCO0FBQ0E7O0FBQ0QsV0FBT2tCLGtCQUFQO0FBQ0E7O0FBRUQsV0FBU1csMkJBQVQsQ0FBcUNyQixtQkFBckMsRUFBcUVzQixtQkFBckUsRUFBbUc7QUFDbEcsUUFBSSxDQUFDQSxtQkFBTCxFQUEwQjtBQUN6QnhFLE1BQUFBLGdCQUFnQixHQUNmQSxnQkFBZ0IsSUFDaEIsSUFBSXlFLFdBQUosQ0FBZ0JDLFNBQWhCLEVBQTJCO0FBQzFCQyxRQUFBQSxPQUFPLEVBQUU7QUFBRUMsVUFBQUEsSUFBSSxFQUFFO0FBQVIsU0FEaUI7QUFFMUJDLFFBQUFBLEtBQUssRUFBRSxXQUZtQjtBQUcxQkMsUUFBQUEsUUFBUSxFQUFFLGtCQUhnQjtBQUkxQkMsUUFBQUEsV0FBVyxFQUFFLGtCQUphO0FBSzFCQyxRQUFBQSxJQUFJLEVBQUU7QUFBRUosVUFBQUEsSUFBSSxFQUFFO0FBQVIsU0FMb0I7QUFNMUJLLFFBQUFBLFdBQVcsRUFDVixVQUNBLHdDQURBLEdBRUEsbUJBRkEsR0FHQWhFLG1CQUFtQixFQUhuQixHQUlBLEtBSkEsR0FLQWYsd0JBQXdCLEVBTHhCLEdBTUEsa0JBTkEsR0FPQSxTQWR5QjtBQWUxQmdGLFFBQUFBLGlCQUFpQixFQUFFO0FBZk8sT0FBM0IsQ0FGRDtBQW1CQSxLQXBCRCxNQW9CTztBQUNObEYsTUFBQUEsZ0JBQWdCLEdBQUcsSUFBSXlFLFdBQUosQ0FBZ0I7QUFDbENJLFFBQUFBLEtBQUssRUFBRSxXQUQyQjtBQUVsQ0csUUFBQUEsSUFBSSxFQUFFLFNBRjRCO0FBR2xDRCxRQUFBQSxXQUFXLEVBQUU7QUFIcUIsT0FBaEIsQ0FBbkI7QUFLQTs7QUFDRDlFLElBQUFBLFlBQVksR0FDWEEsWUFBWSxJQUNaLElBQUlrRixXQUFKLENBQWdCO0FBQ2ZDLE1BQUFBLHFCQUFxQixFQUFFLEtBRFI7QUFFZkMsTUFBQUEsVUFBVSxFQUFFLFlBQVk7QUFDdkJ0RixRQUFBQSxXQUFXLENBQUNrRCxVQUFaLENBQXVCLElBQXZCO0FBQ0EsT0FKYztBQUtmcUMsTUFBQUEsS0FBSyxFQUFFO0FBQ05WLFFBQUFBLElBQUksRUFBRSxHQURBO0FBRU5XLFFBQUFBLFFBQVEsRUFBRXZGO0FBRko7QUFMUSxLQUFoQixDQUZEO0FBWUFELElBQUFBLFdBQVcsR0FDVkEsV0FBVyxJQUNYLElBQUl5RixNQUFKLENBQVc7QUFDVkMsTUFBQUEsSUFBSSxFQUFFQyxRQUFRLENBQUNDLFVBQVQsQ0FBb0IsVUFBcEIsQ0FESTtBQUVWQyxNQUFBQSxPQUFPLEVBQUUsS0FGQztBQUdWQyxNQUFBQSxLQUFLLEVBQUUsWUFBd0I7QUFDOUI1RixRQUFBQSxZQUFZLENBQUM2RixZQUFiO0FBQ0EsYUFBSzdDLFVBQUwsQ0FBZ0IsS0FBaEI7QUFDQTtBQU5TLEtBQVgsQ0FGRCxDQXhDa0csQ0FrRGxHOztBQUNBaEQsSUFBQUEsWUFBWSxDQUFDOEYsUUFBYixDQUFzQjdDLG1CQUF0QjtBQUNBLFdBQU87QUFDTmpELE1BQUFBLFlBQVksRUFBWkEsWUFETTtBQUVORixNQUFBQSxXQUFXLEVBQVhBO0FBRk0sS0FBUDtBQUlBOztBQUVELFdBQVNpRyxtQkFBVCxDQUVDQyxlQUZELEVBR0NDLFFBSEQsRUFJQ0MsZUFKRCxFQUtDQyxvQkFMRCxFQU1DQyxpQkFORCxFQU9FO0FBQ0QsUUFBSUMsZ0JBQWdCLEdBQUcsS0FBS0MsV0FBTCxFQUF2QjtBQUNBLFFBQU12RSxlQUFlLEdBQUcwQixJQUFJLENBQUM4QyxpQkFBTCxFQUF4QjtBQUNBLFFBQUlDLGdCQUFKO0FBQ0EsUUFBSUMsb0JBQUo7QUFDQSxRQUFNQyxRQUFRLEdBQUcsQ0FDaEIsSUFBSUMsTUFBSixDQUFXO0FBQUVoQyxNQUFBQSxJQUFJLEVBQUUsTUFBUjtBQUFnQmlDLE1BQUFBLFFBQVEsRUFBRUMsY0FBYyxDQUFDQyxFQUF6QztBQUE2Q0MsTUFBQUEsTUFBTSxFQUFFO0FBQXJELEtBQVgsQ0FEZ0IsRUFFaEIsSUFBSUosTUFBSixDQUFXO0FBQUVoQyxNQUFBQSxJQUFJLEVBQUUsWUFBUjtBQUFzQmlDLE1BQUFBLFFBQVEsRUFBRUMsY0FBYyxDQUFDQyxFQUEvQztBQUFtREMsTUFBQUEsTUFBTSxFQUFFO0FBQTNELEtBQVgsQ0FGZ0IsQ0FBakI7QUFJQSxRQUFJQyxpQkFBc0MsR0FBRyxLQUE3QztBQUFBLFFBQ0NDLGNBQW1DLEdBQUcsS0FEdkM7O0FBR0EsUUFBSWQsb0JBQUosRUFBMEI7QUFDekJFLE1BQUFBLGdCQUFnQixHQUFHQSxnQkFBZ0IsQ0FBQ2EsTUFBakIsQ0FBd0JaLFdBQVcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFuQyxDQUFuQixDQUR5QixDQUV6Qjs7QUFDQUksTUFBQUEsUUFBUSxDQUFDUyxJQUFULENBQWMsSUFBSVIsTUFBSixDQUFXO0FBQUVoQyxRQUFBQSxJQUFJLEVBQUUsWUFBUjtBQUFzQmlDLFFBQUFBLFFBQVEsRUFBRUMsY0FBYyxDQUFDTyxFQUEvQztBQUFtREwsUUFBQUEsTUFBTSxFQUFFO0FBQTNELE9BQVgsQ0FBZDs7QUFDQSxVQUFNTSx3QkFBd0IsR0FBRyxVQUFVQyxXQUFWLEVBQTRCO0FBQzVELFlBQUlDLEtBQUssR0FBR0MsUUFBWjtBQUFBLFlBQ0NDLFFBQVEsR0FBR2hFLElBQUksQ0FBQ2lFLElBQUwsQ0FBVUosV0FBVyxDQUFDLENBQUQsQ0FBckIsQ0FEWjtBQUVBLFlBQU1LLGlCQUFpQixHQUFHbEUsSUFBSSxDQUFDaUUsSUFBTCxDQUFVSixXQUFXLENBQUMsQ0FBRCxDQUFyQixDQUExQjs7QUFDQSxlQUFPRyxRQUFQLEVBQWlCO0FBQ2hCLGNBQU1HLGlCQUFpQixHQUN0QkgsUUFBUSxZQUFZSSxNQUFwQixHQUNJRixpQkFBaUIsQ0FBQ0csU0FBbEIsRUFBRCxDQUF1Q0MsWUFBdkMsQ0FBb0QsSUFBcEQsRUFBMERDLE9BQTFELENBQWtFTCxpQkFBbEUsQ0FESCxHQUVHSCxRQUhKOztBQUlBLGNBQUlDLFFBQVEsWUFBWUksTUFBeEIsRUFBZ0M7QUFDL0IsZ0JBQUlOLEtBQUssR0FBR0ssaUJBQVosRUFBK0I7QUFDOUJMLGNBQUFBLEtBQUssR0FBR0ssaUJBQVIsQ0FEOEIsQ0FFOUI7O0FBQ0FELGNBQUFBLGlCQUFpQixDQUFDTSxLQUFsQjtBQUNBLGFBTDhCLENBTS9COzs7QUFDQSxtQkFBTyxLQUFQO0FBQ0E7O0FBQ0RSLFVBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDSyxTQUFULEVBQVg7QUFDQTs7QUFDRCxlQUFPLElBQVA7QUFDQSxPQXJCRDs7QUFzQkFwQixNQUFBQSxRQUFRLENBQUNTLElBQVQsQ0FDQyxJQUFJUixNQUFKLENBQVc7QUFDVmhDLFFBQUFBLElBQUksRUFBRSxZQURJO0FBRVZ1RCxRQUFBQSxJQUFJLEVBQUViLHdCQUZJO0FBR1ZjLFFBQUFBLGFBQWEsRUFBRTtBQUhMLE9BQVgsQ0FERDtBQU9BLEtBakNELE1BaUNPO0FBQ047QUFDQXpCLE1BQUFBLFFBQVEsQ0FBQ1MsSUFBVCxDQUFjLElBQUlSLE1BQUosQ0FBVztBQUFFaEMsUUFBQUEsSUFBSSxFQUFFLFFBQVI7QUFBa0JpQyxRQUFBQSxRQUFRLEVBQUVDLGNBQWMsQ0FBQ08sRUFBM0M7QUFBK0NMLFFBQUFBLE1BQU0sRUFBRTtBQUF2RCxPQUFYLENBQWQ7QUFDQTs7QUFDRCxRQUFJZixlQUFlLElBQUlBLGVBQWUsQ0FBQzFFLE1BQXZDLEVBQStDO0FBQzlDMEUsTUFBQUEsZUFBZSxDQUFDakYsT0FBaEIsQ0FBd0IsVUFBVXNCLFFBQVYsRUFBeUI7QUFDaEQsWUFBTStGLFdBQVcsR0FBRy9GLFFBQVEsQ0FBQ2dHLElBQVQsR0FBZ0JoRyxRQUFRLENBQUNnRyxJQUF6QixHQUFnQyxFQUFwRDtBQUNBdEcsUUFBQUEsZUFBZSxDQUFDYyxXQUFoQixDQUNDLElBQUl5RixPQUFKLENBQVk7QUFDWEMsVUFBQUEsT0FBTyxFQUFFbEcsUUFBUSxDQUFDbUcsSUFEUDtBQUVYekQsVUFBQUEsSUFBSSxFQUFFMUMsUUFBUSxDQUFDMEMsSUFGSjtBQUdYbkMsVUFBQUEsTUFBTSxFQUFFLEVBSEc7QUFJWDZGLFVBQUFBLFVBQVUsRUFBRSxJQUpEO0FBS1hKLFVBQUFBLElBQUksRUFBRUQ7QUFMSyxTQUFaLENBREQsRUFGZ0QsQ0FXaEQ7QUFDQSxPQVpEO0FBYUE7O0FBQ0QsUUFBTW5GLG1CQUFtQixHQUFJakQsWUFBWSxJQUFLQSxZQUFZLENBQUNrRCxRQUFiLEVBQWxCLElBQTRELElBQUl3RixTQUFKLEVBQXhGOztBQUNBLFFBQ0NyQyxnQkFBZ0IsQ0FBQy9FLE1BQWpCLEtBQTRCLENBQTVCLEtBQ0MrRSxnQkFBZ0IsQ0FBQyxDQUFELENBQWhCLENBQW9Cc0MsT0FBcEIsT0FBa0MsS0FBbEMsSUFDQ3RDLGdCQUFnQixDQUFDLENBQUQsQ0FBaEIsQ0FBb0J1QyxTQUFwQixPQUFvQ25FLFNBQXBDLElBQWlENEIsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQnVDLFNBQXBCLE9BQW9DLEVBRnZGLENBREQsRUFJRTtBQUNELFVBQUl2QyxnQkFBZ0IsQ0FBQyxDQUFELENBQWhCLENBQW9Cc0MsT0FBcEIsT0FBa0MsS0FBdEMsRUFBNkM7QUFDNUMxQixRQUFBQSxjQUFjLEdBQUcsQ0FBQ2IsaUJBQWxCO0FBQ0EsT0FGRCxNQUVPO0FBQ05hLFFBQUFBLGNBQWMsR0FBRyxJQUFqQjtBQUNBO0FBQ0QsS0FWRCxNQVVPO0FBQ04sVUFBTTRCLFlBQVksR0FBRzlHLGVBQWUsQ0FBQ0UsZUFBaEIsR0FBa0M2RyxRQUFsQyxDQUEyQyxHQUEzQyxFQUFnRHJFLFNBQWhELEVBQTJEQSxTQUEzRCxFQUFzRWlDLFFBQXRFLENBQXJCO0FBQUEsVUFDQ3FDLGdCQUFnQixHQUFHRixZQUFZLENBQUNHLGtCQUFiLEVBRHBCOztBQUVBLFVBQUlELGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ3pILE1BQWpCLEdBQTBCLENBQWxELEVBQXFEO0FBQ3BEO0FBQ0EwRixRQUFBQSxpQkFBaUIsR0FBRyxDQUFDWixpQkFBckIsQ0FGb0QsQ0FFWjtBQUN4QztBQUNBO0FBQ0E7O0FBQ0EsWUFBTWxGLFNBQWdCLEdBQUcsRUFBekI7QUFDQTZILFFBQUFBLGdCQUFnQixDQUFDaEksT0FBakIsQ0FBeUIsVUFBVWtGLFFBQVYsRUFBeUI7QUFDakQsY0FBSTVELFFBQUo7QUFDQUEsVUFBQUEsUUFBUSxHQUFHNEQsUUFBUSxDQUFDL0QsU0FBVCxFQUFYO0FBQ0FoQixVQUFBQSxTQUFTLENBQUNpRyxJQUFWLENBQWU5RSxRQUFmO0FBQ0ExQyxVQUFBQSxnQkFBZ0IsR0FBR3VCLFNBQW5CO0FBQ0EsU0FMRCxFQVBvRCxDQWFwRDtBQUNBO0FBQ0E7O0FBQ0EsWUFBSStILGdCQUF1QixHQUFHLEVBQTlCOztBQUNBLFlBQUlDLEtBQUssQ0FBQ0MsT0FBTixDQUFjbEcsbUJBQW1CLENBQUNtRyxPQUFwQixFQUFkLENBQUosRUFBa0Q7QUFDakRILFVBQUFBLGdCQUFnQixHQUFHaEcsbUJBQW1CLENBQUNtRyxPQUFwQixFQUFuQjtBQUNBOztBQUNELFlBQU1DLFVBQWUsR0FBRyxFQUF4QjtBQUNBLFlBQUlDLGVBQXNCLEdBQUcsRUFBN0I7QUFDQUEsUUFBQUEsZUFBZSxHQUFHM0osZ0JBQWdCLENBQUN1SCxNQUFqQixDQUF3QitCLGdCQUF4QixFQUEwQ00sTUFBMUMsQ0FBaUQsVUFBVUMsR0FBVixFQUFlO0FBQ2pGO0FBQ0EsaUJBQU8sQ0FBQ0gsVUFBVSxDQUFDRyxHQUFHLENBQUNDLEVBQUwsQ0FBWCxLQUF3QkosVUFBVSxDQUFDRyxHQUFHLENBQUNDLEVBQUwsQ0FBVixHQUFxQixJQUE3QyxDQUFQO0FBQ0EsU0FIaUIsQ0FBbEI7QUFJQXhHLFFBQUFBLG1CQUFtQixDQUFDRSxPQUFwQixDQUE0Qm1HLGVBQTVCO0FBQ0E7QUFDRDs7QUFDRCxRQUFJakQsZ0JBQWdCLENBQUMvRSxNQUFqQixLQUE0QixDQUE1QixJQUFpQyxDQUFDMEUsZUFBbEMsSUFBcUQsQ0FBQ0UsZUFBMUQsRUFBMkU7QUFDMUU7QUFDQSxhQUFPd0QsT0FBTyxDQUFDQyxPQUFSLENBQWdCLElBQWhCLENBQVA7QUFDQSxLQUhELE1BR08sSUFBSXRELGdCQUFnQixDQUFDL0UsTUFBakIsS0FBNEIsQ0FBNUIsSUFBaUMrRSxnQkFBZ0IsQ0FBQyxDQUFELENBQWhCLENBQW9CeEUsT0FBcEIsT0FBa0NyQyxXQUFXLENBQUNrQyxPQUEvRSxJQUEwRixDQUFDc0UsZUFBL0YsRUFBZ0g7QUFDdEgsYUFBTyxJQUFJMEQsT0FBSixDQUFrQixVQUFDQyxPQUFELEVBQWE7QUFDckNDLFFBQUFBLFlBQVksQ0FBQ0MsSUFBYixDQUFrQnhELGdCQUFnQixDQUFDLENBQUQsQ0FBaEIsQ0FBb0JrQyxPQUF0Qzs7QUFDQSxZQUFJdEYsbUJBQUosRUFBeUI7QUFDeEJBLFVBQUFBLG1CQUFtQixDQUFDRSxPQUFwQixDQUE0QixFQUE1QjtBQUNBOztBQUNEcEIsUUFBQUEsZUFBZSxDQUFDVyxjQUFoQixDQUErQjJELGdCQUEvQjtBQUNBc0QsUUFBQUEsT0FBTztBQUNQLE9BUE0sQ0FBUDtBQVFBLEtBVE0sTUFTQSxJQUFJM0MsaUJBQUosRUFBdUI7QUFDN0JwSCxNQUFBQSxpQkFBaUIsR0FBR0EsaUJBQWlCLElBQUksRUFBekM7QUFDQSxhQUFPLElBQUk4SixPQUFKLENBQVksVUFBVUMsT0FBVixFQUF5Q0csTUFBekMsRUFBeUU7QUFDM0ZsSyxRQUFBQSxpQkFBaUIsQ0FBQ3VILElBQWxCLENBQXVCd0MsT0FBdkI7QUFDQ2xHLFFBQUFBLElBQUQsQ0FDRUMsd0JBREYsQ0FDMkIsYUFEM0IsRUFDMEMsSUFEMUMsRUFFRXFHLElBRkYsQ0FFTyxVQUFVL0gsZUFBVixFQUFnQztBQUNyQyxjQUFNdUMsbUJBQW1CLEdBQUcsS0FBNUI7QUFDQSxjQUFNMkIsZUFBZSxHQUFHcEUsd0JBQXdCLENBQUNDLGVBQUQsRUFBa0JDLGVBQWxCLENBQWhEO0FBQ0EsY0FBTWdJLGNBQWMsR0FBRzFGLDJCQUEyQixDQUFDckIsbUJBQUQsRUFBc0JzQixtQkFBdEIsQ0FBbEQ7QUFDQTFFLFVBQUFBLE9BQU8sR0FDTkEsT0FBTyxJQUNQLElBQUlnSSxNQUFKLENBQVc7QUFDVm9DLFlBQUFBLFNBQVMsRUFBRSxJQUREO0FBRVZDLFlBQUFBLE9BQU8sRUFBRUYsY0FBYyxDQUFDaEssWUFGZDtBQUdWbUssWUFBQUEsU0FBUyxFQUFFLElBQUk1RSxNQUFKLENBQVc7QUFDckJLLGNBQUFBLEtBQUssRUFBRSxZQUFZO0FBQ2xCOUMsZ0JBQUFBLGtCQUFrQixHQURBLENBRWxCOztBQUNBLG9CQUFJcUQsb0JBQUosRUFBMEI7QUFDekJpRSxrQkFBQUEsNkJBQTZCO0FBQzdCO0FBQ0QsZUFQb0I7QUFRckI1QixjQUFBQSxJQUFJLEVBQUV4RyxlQUFlLENBQUNTLE9BQWhCLENBQXdCLHNCQUF4QjtBQVJlLGFBQVgsQ0FIRDtBQWFWNEgsWUFBQUEsWUFBWSxFQUFFLElBQUlDLEdBQUosQ0FBUTtBQUNyQkMsY0FBQUEsYUFBYSxFQUFFLENBQ2QsSUFBSUMsSUFBSixDQUFTO0FBQ1JoQyxnQkFBQUEsSUFBSSxFQUFFeEcsZUFBZSxDQUFDUyxPQUFoQixDQUF3QixvREFBeEI7QUFERSxlQUFULENBRGMsQ0FETTtBQU1yQmdJLGNBQUFBLFdBQVcsRUFBRSxDQUFDM0ssV0FBRDtBQU5RLGFBQVIsQ0FiSjtBQXFCVjRLLFlBQUFBLFlBQVksRUFBRSxRQXJCSjtBQXNCVkMsWUFBQUEsYUFBYSxFQUFFLFFBdEJMO0FBdUJWQyxZQUFBQSxpQkFBaUIsRUFBRSxLQXZCVDtBQXdCVkMsWUFBQUEsVUFBVSxFQUFFLFlBQVk7QUFDdkIsbUJBQUssSUFBSWpKLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdoQyxpQkFBaUIsQ0FBQzBCLE1BQXRDLEVBQThDTSxDQUFDLEVBQS9DLEVBQW1EO0FBQ2xEaEMsZ0JBQUFBLGlCQUFpQixDQUFDZ0MsQ0FBRCxDQUFqQixDQUFxQmtKLElBQXJCO0FBQ0E7O0FBQ0RsTCxjQUFBQSxpQkFBaUIsR0FBRyxFQUFwQjtBQUNBO0FBN0JTLFdBQVgsQ0FGRDs7QUFrQ0EsY0FBSXNHLGVBQUosRUFBcUI7QUFDcEI2RSxZQUFBQSxHQUFHLENBQUNDLEVBQUosQ0FBT0MsT0FBUCxDQUFlLENBQUMsa0JBQUQsQ0FBZixFQUFxQyxVQUFVQyxVQUFWLEVBQTJCO0FBQy9EckwsY0FBQUEsT0FBTyxDQUFDc0wsY0FBUixDQUNDLElBQUk1RixNQUFKLENBQVc7QUFDVkssZ0JBQUFBLEtBQUssRUFBRSxZQUFZO0FBQ2xCOUMsa0JBQUFBLGtCQUFrQjs7QUFDbEIsc0JBQUltRCxRQUFRLENBQUNtRixpQkFBVCxFQUFKLEVBQWtDO0FBQ2pDbkYsb0JBQUFBLFFBQVEsQ0FBQ29GLFVBQVQsR0FBc0JDLFlBQXRCO0FBQ0E7O0FBQ0RyRixrQkFBQUEsUUFBUSxDQUFDc0YsT0FBVDtBQUNBLGlCQVBTO0FBUVYvQyxnQkFBQUEsSUFBSSxFQUFFeEcsZUFBZSxDQUFDUyxPQUFoQixDQUF3Qix3QkFBeEIsQ0FSSTtBQVNWc0MsZ0JBQUFBLElBQUksRUFBRW1HLFVBQVUsQ0FBQ007QUFUUCxlQUFYLENBREQ7QUFhQSxhQWREO0FBZUEsV0FoQkQsTUFnQk87QUFDTjNMLFlBQUFBLE9BQU8sQ0FBQzRMLGtCQUFSO0FBQ0E7O0FBQ0RqRixVQUFBQSxnQkFBZ0IsR0FBR3ZGLDJCQUEyQixDQUFDakIsWUFBWSxDQUFDMEwsUUFBYixFQUFELENBQTlDO0FBQ0FqRixVQUFBQSxvQkFBb0IsR0FBR2tGLGlDQUFpQyxDQUFDbkYsZ0JBQUQsQ0FBeEQ7QUFDQTNHLFVBQUFBLE9BQU8sQ0FBQytMLFFBQVIsQ0FBaUJwRixnQkFBakI7QUFDQzNHLFVBQUFBLE9BQU8sQ0FBQ2dNLGVBQVIsRUFBRCxDQUFtQ0MsZ0JBQW5DLEdBQXNELENBQXRELEVBQXlEQyxPQUF6RCxDQUFpRXRGLG9CQUFqRTtBQUNBekcsVUFBQUEsWUFBWSxDQUFDNkYsWUFBYjtBQUNBaEcsVUFBQUEsT0FBTyxDQUFDbU0sSUFBUjtBQUNBLFNBakVGLEVBa0VFQyxLQWxFRixDQWtFUW5DLE1BbEVSO0FBbUVBLE9BckVNLENBQVA7QUFzRUEsS0F4RU0sTUF3RUEsSUFBSTdDLGNBQUosRUFBb0I7QUFDMUIsYUFBTyxJQUFJeUMsT0FBSixDQUFZLFVBQVVDLE9BQVYsRUFBbUI7QUFDckMsWUFBTXRILFFBQVEsR0FBR2dFLGdCQUFnQixDQUFDLENBQUQsQ0FBakM7O0FBQ0EsWUFBSWhFLFFBQVEsQ0FBQzZKLGdCQUFULElBQTZCeE0sWUFBWSxDQUFDc0ksT0FBYixDQUFxQjNGLFFBQVEsQ0FBQzZKLGdCQUFULENBQTBCQyxlQUExQixDQUEwQzVELE9BQS9ELE1BQTRFLENBQUMsQ0FBOUcsRUFBaUg7QUFDaEg3SSxVQUFBQSxZQUFZLENBQUN5SCxJQUFiLENBQWtCOUUsUUFBUSxDQUFDNkosZ0JBQVQsQ0FBMEJDLGVBQTFCLENBQTBDNUQsT0FBNUQ7QUFDQSxjQUFJNkQsbUJBQW1CLEdBQUcsY0FBMUI7QUFDQSxjQUFNQyxpQkFBaUIsR0FBR2hKLG9CQUFvQixDQUFDaEIsUUFBRCxFQUFXLElBQVgsQ0FBOUM7O0FBQ0EsY0FBSWdLLGlCQUFKLEVBQXVCO0FBQ3RCRCxZQUFBQSxtQkFBbUIsR0FBRyxTQUFTQyxpQkFBVCxHQUE2QixXQUFuRDtBQUNBOztBQUNELGNBQUloSyxRQUFRLENBQUNzRyxPQUFULE9BQXVCLEtBQTNCLEVBQWtDO0FBQ2pDeUQsWUFBQUEsbUJBQW1CLEdBQUdBLG1CQUFtQixHQUFHL0osUUFBUSxDQUFDaUssY0FBL0IsR0FBZ0QsSUFBaEQsR0FBdURqSyxRQUFRLENBQUNrSyxVQUFULEVBQXZELEdBQStFLGdCQUFyRztBQUNBLFdBRkQsTUFFTztBQUNOSCxZQUFBQSxtQkFBbUIsR0FBR0EsbUJBQW1CLEdBQUcvSixRQUFRLENBQUNrSyxVQUFULEVBQXRCLEdBQThDLGdCQUFwRTtBQUNBOztBQUNELGNBQU1DLGFBQWtCLEdBQUcsSUFBSUMsYUFBSixDQUFrQjtBQUM1Q0MsWUFBQUEsUUFBUSxFQUFFTjtBQURrQyxXQUFsQixDQUEzQjtBQUdBTyxVQUFBQSxVQUFVLENBQUNDLEtBQVgsQ0FBaUJKLGFBQWpCLEVBQWdDO0FBQy9CSyxZQUFBQSxPQUFPLEVBQUUsWUFBWTtBQUNwQm5OLGNBQUFBLFlBQVksR0FBRyxFQUFmOztBQUNBLGtCQUFJeUcsb0JBQUosRUFBMEI7QUFDekJpRSxnQkFBQUEsNkJBQTZCO0FBQzdCOztBQUNEaEgsY0FBQUEsK0JBQStCO0FBQy9CdUcsY0FBQUEsT0FBTyxDQUFDLElBQUQsQ0FBUDtBQUNBO0FBUjhCLFdBQWhDO0FBVUE7QUFDRCxPQTVCTSxDQUFQO0FBNkJBLEtBOUJNLE1BOEJBO0FBQ04sYUFBT0QsT0FBTyxDQUFDQyxPQUFSLENBQWdCLElBQWhCLENBQVA7QUFDQTtBQUNEOztBQUNELFdBQVNnQyxpQ0FBVCxDQUEyQ25GLGdCQUEzQyxFQUFrRTtBQUNqRSxRQUFNeEUsZUFBZSxHQUFJeUIsSUFBRCxDQUFpQkMsd0JBQWpCLENBQTBDLGFBQTFDLENBQXhCOztBQUNBLFlBQVE4QyxnQkFBUjtBQUNDLFdBQUssT0FBTDtBQUNDLGVBQU94RSxlQUFlLENBQUNTLE9BQWhCLENBQXdCLGdEQUF4QixDQUFQOztBQUNELFdBQUssYUFBTDtBQUNDLGVBQU9ULGVBQWUsQ0FBQ1MsT0FBaEIsQ0FBd0IseURBQXhCLENBQVA7O0FBQ0QsV0FBSyxTQUFMO0FBQ0MsZUFBT1QsZUFBZSxDQUFDUyxPQUFoQixDQUF3Qiw0REFBeEIsQ0FBUDs7QUFDRCxXQUFLLFNBQUw7QUFDQyxlQUFPVCxlQUFlLENBQUNTLE9BQWhCLENBQXdCLDREQUF4QixDQUFQOztBQUNEO0FBQ0MsZUFBT1QsZUFBZSxDQUFDUyxPQUFoQixDQUF3QixvREFBeEIsQ0FBUDtBQVZGO0FBWUE7O0FBQ0QsV0FBU1csK0JBQVQsR0FBMkM7QUFDMUMwSixJQUFBQSx3QkFBd0IsQ0FBQyxLQUFELENBQXhCO0FBQ0E7O0FBQ0QsV0FBUzFDLDZCQUFULEdBQXlDO0FBQ3hDMEMsSUFBQUEsd0JBQXdCLENBQUMsSUFBRCxDQUF4QjtBQUNBOztBQUNELFdBQVN4RyxXQUFULEdBQXdGO0FBQUEsUUFBbkV5RyxjQUFtRSx1RUFBekMsS0FBeUM7QUFBQSxRQUFsQ0MsZUFBa0MsdUVBQVAsS0FBTztBQUN2RixRQUFJcEwsQ0FBSjtBQUNBLFFBQU1HLGVBQWUsR0FBSTBCLElBQUQsQ0FBd0I4QyxpQkFBeEIsRUFBeEI7QUFBQSxRQUNDMEcsYUFBYSxHQUFHbEwsZUFBZSxDQUFDRSxlQUFoQixFQURqQjtBQUFBLFFBRUNmLFNBQVMsR0FBRytMLGFBQWEsQ0FBQy9LLFNBQWQsQ0FBd0IsR0FBeEIsQ0FGYjtBQUFBLFFBR0NGLGVBQWUsR0FBSXlCLElBQUQsQ0FBaUJDLHdCQUFqQixDQUEwQyxhQUExQyxDQUhuQjtBQUFBLFFBSUN3SixtQkFBbUIsR0FBRyxFQUp2Qjs7QUFNQSxTQUFLdEwsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHVixTQUFTLENBQUNJLE1BQTFCLEVBQWtDTSxDQUFDLEVBQW5DLEVBQXVDO0FBQ3RDLFVBQ0MsQ0FBQyxDQUFDb0wsZUFBRCxJQUFvQjlMLFNBQVMsQ0FBQ1UsQ0FBRCxDQUFULENBQWE2RyxVQUFsQyxNQUNFc0UsY0FBYyxJQUFJN0wsU0FBUyxDQUFDVSxDQUFELENBQVQsQ0FBYWdCLE1BQWIsS0FBd0IsRUFBM0MsSUFBbUQsQ0FBQ21LLGNBQUQsS0FBb0IsQ0FBQzdMLFNBQVMsQ0FBQ1UsQ0FBRCxDQUFULENBQWFnQixNQUFkLElBQXdCMUIsU0FBUyxDQUFDVSxDQUFELENBQVQsQ0FBYWdCLE1BQWIsS0FBd0IsRUFBcEUsQ0FEcEQsS0FFQTFCLFNBQVMsQ0FBQ1UsQ0FBRCxDQUFULENBQWF5RyxJQUhkLEVBSUU7QUFDRDZFLFFBQUFBLG1CQUFtQixDQUFDL0YsSUFBcEIsQ0FBeUJqRyxTQUFTLENBQUNVLENBQUQsQ0FBbEM7QUFDQTtBQUNEOztBQUVELFNBQUtBLENBQUMsR0FBRyxDQUFULEVBQVlBLENBQUMsR0FBR3NMLG1CQUFtQixDQUFDNUwsTUFBcEMsRUFBNENNLENBQUMsRUFBN0MsRUFBaUQ7QUFDaEQsVUFDQ3NMLG1CQUFtQixDQUFDdEwsQ0FBRCxDQUFuQixDQUF1QnlHLElBQXZCLEtBQWdDLEtBQWhDLElBQ0E2RSxtQkFBbUIsQ0FBQ3RMLENBQUQsQ0FBbkIsQ0FBdUIyRyxPQUF2QixLQUFtQyxFQURuQyxJQUVBMkUsbUJBQW1CLENBQUN0TCxDQUFELENBQW5CLENBQXVCMkcsT0FBdkIsQ0FBK0JQLE9BQS9CLENBQXVDaEcsZUFBZSxDQUFDUyxPQUFoQixDQUF3Qiw2Q0FBeEIsQ0FBdkMsTUFBbUgsQ0FBQyxDQUhySCxFQUlFO0FBQ0R5SyxRQUFBQSxtQkFBbUIsQ0FBQ3RMLENBQUQsQ0FBbkIsQ0FBdUIyRyxPQUF2QixHQUNDLE9BQU92RyxlQUFlLENBQUNTLE9BQWhCLENBQXdCLDZDQUF4QixDQUFQLEdBQWdGeUssbUJBQW1CLENBQUN0TCxDQUFELENBQW5CLENBQXVCMkcsT0FEeEc7QUFFQTtBQUNEOztBQUNELFdBQU8yRSxtQkFBUDtBQUNBOztBQUNELFdBQVNKLHdCQUFULENBQWtDQyxjQUFsQyxFQUF1RDtBQUN0RCxRQUFNSSxvQkFBb0IsR0FBRzdHLFdBQVcsQ0FBQ3lHLGNBQUQsRUFBaUIsSUFBakIsQ0FBeEM7O0FBRUEsUUFBSUksb0JBQW9CLENBQUM3TCxNQUFyQixHQUE4QixDQUFsQyxFQUFxQztBQUNwQ21DLE1BQUFBLElBQUksQ0FBQzhDLGlCQUFMLEdBQXlCN0QsY0FBekIsQ0FBd0N5SyxvQkFBeEM7QUFDQTtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxNQUFNQyxlQUFvQyxHQUFHO0FBQzVDOUcsSUFBQUEsV0FBVyxFQUFFQSxXQUQrQjtBQUU1Q1AsSUFBQUEsbUJBQW1CLEVBQUVBLG1CQUZ1QjtBQUc1QzNDLElBQUFBLCtCQUErQixFQUFFQSwrQkFIVztBQUk1Q2dILElBQUFBLDZCQUE2QixFQUFFQSw2QkFKYTtBQUs1Q2lELElBQUFBLHNCQUFzQixFQUFFdkwsd0JBTG9CO0FBTTVDdUIsSUFBQUEsb0JBQW9CLEVBQUVBLG9CQU5zQjtBQU81Q2lCLElBQUFBLDJCQUEyQixFQUFFQTtBQVBlLEdBQTdDO1NBVWU4SSxlIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFyIGZyb20gXCJzYXAvbS9CYXJcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgRm9ybWF0dGVkVGV4dCBmcm9tIFwic2FwL20vRm9ybWF0dGVkVGV4dFwiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBNZXNzYWdlSXRlbSBmcm9tIFwic2FwL20vTWVzc2FnZUl0ZW1cIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IE1lc3NhZ2VWaWV3IGZyb20gXCJzYXAvbS9NZXNzYWdlVmlld1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IERhdGVGb3JtYXQgZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdC9EYXRlRm9ybWF0XCI7XG5pbXBvcnQgSWNvblBvb2wgZnJvbSBcInNhcC91aS9jb3JlL0ljb25Qb29sXCI7XG5pbXBvcnQgQ29yZUxpYiBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBNZXNzYWdlVHlwZSA9IENvcmVMaWIuTWVzc2FnZVR5cGU7XG5sZXQgYU1lc3NhZ2VMaXN0OiBhbnlbXSA9IFtdO1xubGV0IGFNZXNzYWdlRGF0YUxpc3Q6IGFueVtdID0gW107XG5sZXQgYVJlc29sdmVGdW5jdGlvbnM6IGFueVtdID0gW107XG5sZXQgb0RpYWxvZzogRGlhbG9nO1xubGV0IG9CYWNrQnV0dG9uOiBCdXR0b247XG5sZXQgb01lc3NhZ2VUZW1wbGF0ZTogTWVzc2FnZUl0ZW07XG5sZXQgb01lc3NhZ2VWaWV3OiBNZXNzYWdlVmlldztcblxuZXhwb3J0IHR5cGUgbWVzc2FnZUhhbmRsaW5nVHlwZSA9IHtcblx0Z2V0TWVzc2FnZXM6IChiQm91bmRNZXNzYWdlcz86IGFueSwgYlRyYW5zaXRpb25Pbmx5PzogYW55KSA9PiBhbnlbXTtcblx0c2hvd1VuYm91bmRNZXNzYWdlczogKFxuXHRcdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRcdG9Db250ZXh0PzogYW55LFxuXHRcdGJIYXNFdGFnTWVzc2FnZT86IGJvb2xlYW4sXG5cdFx0YlNob3dCb3VuZFRyYW5zaXRpb24/OiBib29sZWFuLFxuXHRcdGVycm9yVGFyZ2V0c0luQVBNPzogYm9vbGVhblxuXHQpID0+IFByb21pc2U8YW55Pjtcblx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlczogKCkgPT4gdm9pZDtcblx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6ICgpID0+IHZvaWQ7XG5cdG1vZGlmeUVUYWdNZXNzYWdlc09ubHk6IChvTWVzc2FnZU1hbmFnZXI6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBhbnkpID0+IGJvb2xlYW47XG5cdGdldFJldHJ5QWZ0ZXJNZXNzYWdlOiAob01lc3NhZ2U6IGFueSwgYk1lc3NhZ2VEaWFsb2c/OiBhbnkpID0+IGFueTtcblx0cHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nOiAob01lc3NhZ2VEaWFsb2dNb2RlbDogSlNPTk1vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93OiBib29sZWFuKSA9PiBhbnk7XG59O1xuXG5mdW5jdGlvbiBmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSB7XG5cdGxldCBzUHJldmlvdXNHcm91cE5hbWU6IHN0cmluZztcblxuXHQvLyBJbnNlcnQgdGVjaG5pY2FsIGRldGFpbCBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIG9Qcm9wZXJ0eS5wcm9wZXJ0eVxuXHRcdFx0PyBcIiggJHtcIiArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5ICtcblx0XHRcdFx0XHQnfSA/IChcIjxwPicgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eS5zdWJzdHIoTWF0aC5tYXgob1Byb3BlcnR5LnByb3BlcnR5Lmxhc3RJbmRleE9mKFwiL1wiKSwgb1Byb3BlcnR5LnByb3BlcnR5Lmxhc3RJbmRleE9mKFwiLlwiKSkgKyAxKSArXG5cdFx0XHRcdFx0JyA6IFwiICsgJyArXG5cdFx0XHRcdFx0XCIke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ICsgXCI8L3A+XCIpIDogXCJcIiApJ1xuXHRcdFx0OiBcIlwiO1xuXHR9XG5cdC8vIEluc2VydCBncm91cG5hbWUgaWYgaXQgZXhpc3RzXG5cdGZ1bmN0aW9uIGluc2VydEdyb3VwTmFtZShvUHJvcGVydHk6IGFueSkge1xuXHRcdGxldCBzSFRNTCA9IFwiXCI7XG5cdFx0aWYgKG9Qcm9wZXJ0eS5ncm91cE5hbWUgJiYgb1Byb3BlcnR5LnByb3BlcnR5ICYmIG9Qcm9wZXJ0eS5ncm91cE5hbWUgIT09IHNQcmV2aW91c0dyb3VwTmFtZSkge1xuXHRcdFx0c0hUTUwgKz0gXCIoICR7XCIgKyBvUHJvcGVydHkucHJvcGVydHkgKyAnfSA/IFwiPGJyPjxoMz4nICsgb1Byb3BlcnR5Lmdyb3VwTmFtZSArICc8L2gzPlwiIDogXCJcIiApICsgJztcblx0XHRcdHNQcmV2aW91c0dyb3VwTmFtZSA9IG9Qcm9wZXJ0eS5ncm91cE5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBzSFRNTDtcblx0fVxuXG5cdC8vIExpc3Qgb2YgdGVjaG5pY2FsIGRldGFpbHMgdG8gYmUgc2hvd25cblx0ZnVuY3Rpb24gZ2V0UGF0aHMoKSB7XG5cdFx0Y29uc3Qgc1REID0gXCJ0ZWNobmljYWxEZXRhaWxzXCI7IC8vIG5hbWUgb2YgcHJvcGVydHkgaW4gbWVzc2FnZSBtb2RlbCBkYXRhIGZvciB0ZWNobmljYWwgZGV0YWlsc1xuXHRcdHJldHVybiBbXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvc3RhdHVzXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9zdGF0dXNUZXh0XCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9Db21wb25lbnRJZFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZUlkXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlUmVwb3NpdG9yeVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVZlcnNpb25cIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FcnJvclJlc29sdXRpb24vQW5hbHlzaXNcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FcnJvclJlc29sdXRpb24vTm90ZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9EZXRhaWxlZE5vdGVcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5FeGNlcHRpb25DYXRlZ29yeVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLlRpbWVTdGFtcFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLlRyYW5zYWN0aW9uSWRcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIk1lc3NhZ2VzXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvY29kZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiTWVzc2FnZXNcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9tZXNzYWdlXCIgfVxuXHRcdF07XG5cdH1cblxuXHRsZXQgc0hUTUwgPSBcIk9iamVjdC5rZXlzKFwiICsgXCIke3RlY2huaWNhbERldGFpbHN9XCIgKyAnKS5sZW5ndGggPiAwID8gXCI8aDI+VGVjaG5pY2FsIERldGFpbHM8L2gyPlwiIDogXCJcIiAnO1xuXHRnZXRQYXRocygpLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wZXJ0eTogeyBncm91cE5hbWU6IHN0cmluZzsgcHJvcGVydHk6IHN0cmluZyB9KSB7XG5cdFx0c0hUTUwgPSBzSFRNTCArIGluc2VydEdyb3VwTmFtZShvUHJvcGVydHkpICsgXCJcIiArIGluc2VydERldGFpbChvUHJvcGVydHkpICsgXCIgKyBcIjtcblx0fSk7XG5cdHJldHVybiBzSFRNTDtcbn1cbmZ1bmN0aW9uIGZuRm9ybWF0RGVzY3JpcHRpb24oKSB7XG5cdGNvbnN0IHNIVE1MID0gXCIoJHtcIiArICdkZXNjcmlwdGlvbn0gPyAoXCI8aDI+RGVzY3JpcHRpb248L2gyPlwiICsgJHsnICsgJ2Rlc2NyaXB0aW9ufSkgOiBcIlwiKSc7XG5cdHJldHVybiBzSFRNTDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIHR5cGUoRXJyb3IvV2FybmluZy9TdWNjZXNzL0luZm9ybWF0aW9uKSBmcm9tIHRoZSBhdmFpbGFibGUgbWVzc2FnZXMuXG5cbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5tZXNzYWdlSGFuZGxpbmcuZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5tZXNzYWdlSGFuZGxpbmdcbiAqIEBwYXJhbSB7QXJyYXl9IFthTWVzc2FnZXNdIE1lc3NhZ2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZSBmcm9tIHRoZSBhdmFpbGFibGUgbWVzc2FnZXNcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5KGFNZXNzYWdlczogYW55W10pIHtcblx0bGV0IHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRjb25zdCBpTGVuZ3RoID0gYU1lc3NhZ2VzLmxlbmd0aDtcblx0Y29uc3Qgb01lc3NhZ2VDb3VudDogYW55ID0geyBFcnJvcjogMCwgV2FybmluZzogMCwgU3VjY2VzczogMCwgSW5mb3JtYXRpb246IDAgfTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykge1xuXHRcdCsrb01lc3NhZ2VDb3VudFthTWVzc2FnZXNbaV0uZ2V0VHlwZSgpXTtcblx0fVxuXHRpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5FcnJvcl0gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuV2FybmluZ10gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5TdWNjZXNzXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLkluZm9ybWF0aW9uXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdH1cblx0cmV0dXJuIHNNZXNzYWdlUHJpb3JpdHk7XG59XG4vLyBmdW5jdGlvbiB3aGljaCBtb2RpZnkgZS1UYWcgbWVzc2FnZXMgb25seS5cbi8vIHJldHVybnMgOiB0cnVlLCBpZiBhbnkgZS1UYWcgbWVzc2FnZSBpcyBtb2RpZmllZCwgb3RoZXJ3aXNlIGZhbHNlLlxuZnVuY3Rpb24gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlcjogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRjb25zdCBhTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0T2JqZWN0KFwiL1wiKTtcblx0bGV0IGJNZXNzYWdlc01vZGlmaWVkID0gZmFsc2U7XG5cdGxldCBzRXRhZ01lc3NhZ2UgPSBcIlwiO1xuXHRhTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSwgaTogYW55KSB7XG5cdFx0Y29uc3Qgb1RlY2huaWNhbERldGFpbHMgPSBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDQxMikge1xuXHRcdFx0c0V0YWdNZXNzYWdlID0gc0V0YWdNZXNzYWdlIHx8IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfVEVDSE5JQ0FMX0lTU1VFU1wiKTtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhTWVzc2FnZXNbaV0pO1xuXHRcdFx0b01lc3NhZ2Uuc2V0TWVzc2FnZShzRXRhZ01lc3NhZ2UpO1xuXHRcdFx0b01lc3NhZ2UudGFyZ2V0ID0gXCJcIjtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRiTWVzc2FnZXNNb2RpZmllZCA9IHRydWU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGJNZXNzYWdlc01vZGlmaWVkO1xufVxuLy8gRGlhbG9nIGNsb3NlIEhhbmRsaW5nXG5mdW5jdGlvbiBkaWFsb2dDbG9zZUhhbmRsZXIoKSB7XG5cdG9EaWFsb2cuY2xvc2UoKTtcblx0b0JhY2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7XG5cdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRjb25zdCBvTWVzc2FnZURpYWxvZ01vZGVsOiBhbnkgPSBvTWVzc2FnZVZpZXcuZ2V0TW9kZWwoKTtcblx0aWYgKG9NZXNzYWdlRGlhbG9nTW9kZWwpIHtcblx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoe30pO1xuXHR9XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcbn1cbmZ1bmN0aW9uIGdldFJldHJ5QWZ0ZXJNZXNzYWdlKG9NZXNzYWdlOiBhbnksIGJNZXNzYWdlRGlhbG9nPzogYW55KSB7XG5cdGNvbnN0IGROb3cgPSBuZXcgRGF0ZSgpO1xuXHRjb25zdCBvVGVjaG5pY2FsRGV0YWlscyA9IG9NZXNzYWdlLmdldFRlY2huaWNhbERldGFpbHMoKTtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0bGV0IHNSZXRyeUFmdGVyTWVzc2FnZTtcblx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDUwMyAmJiBvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyKSB7XG5cdFx0Y29uc3QgZFJldHJ5QWZ0ZXIgPSBvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyO1xuXHRcdGxldCBvRGF0ZUZvcm1hdDtcblx0XHRpZiAoZE5vdy5nZXRGdWxsWWVhcigpICE9PSBkUmV0cnlBZnRlci5nZXRGdWxsWWVhcigpKSB7XG5cdFx0XHQvL2RpZmZlcmVudCB5ZWFyc1xuXHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRwYXR0ZXJuOiBcIk1NTU0gZGQsIHl5eXkgJ2F0JyBoaDptbSBhXCJcblx0XHRcdH0pO1xuXHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0fSBlbHNlIGlmIChkTm93LmdldEZ1bGxZZWFyKCkgPT0gZFJldHJ5QWZ0ZXIuZ2V0RnVsbFllYXIoKSkge1xuXHRcdFx0Ly9zYW1lIHllYXJcblx0XHRcdGlmIChiTWVzc2FnZURpYWxvZykge1xuXHRcdFx0XHQvL2xlc3MgdGhhbiAyIG1pblxuXHRcdFx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPVxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19USVRMRVwiKSArXG5cdFx0XHRcdFx0XCIgXCIgK1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19ERVNDXCIpO1xuXHRcdFx0fSBlbHNlIGlmIChkTm93LmdldE1vbnRoKCkgIT09IGRSZXRyeUFmdGVyLmdldE1vbnRoKCkgfHwgZE5vdy5nZXREYXRlKCkgIT09IGRSZXRyeUFmdGVyLmdldERhdGUoKSkge1xuXHRcdFx0XHRvRGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0cGF0dGVybjogXCJNTU1NIGRkICdhdCcgaGg6bW0gYVwiXG5cdFx0XHRcdH0pOyAvL2RpZmZlcmVudCBtb250aHMgb3IgZGlmZmVyZW50IGRheXMgb2Ygc2FtZSBtb250aFxuXHRcdFx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JcIiwgW29EYXRlRm9ybWF0LmZvcm1hdChkUmV0cnlBZnRlcildKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vc2FtZSBkYXlcblx0XHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHBhdHRlcm46IFwiaGg6bW0gYVwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JfREFZXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDUwMyAmJiAhb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcikge1xuXHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUl9OT19SRVRSWV9BRlRFUlwiKTtcblx0fVxuXHRyZXR1cm4gc1JldHJ5QWZ0ZXJNZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2cob01lc3NhZ2VEaWFsb2dNb2RlbDogSlNPTk1vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93OiBib29sZWFuKSB7XG5cdGlmICghYlN0cmljdEhhbmRsaW5nRmxvdykge1xuXHRcdG9NZXNzYWdlVGVtcGxhdGUgPVxuXHRcdFx0b01lc3NhZ2VUZW1wbGF0ZSB8fFxuXHRcdFx0bmV3IE1lc3NhZ2VJdGVtKHVuZGVmaW5lZCwge1xuXHRcdFx0XHRjb3VudGVyOiB7IHBhdGg6IFwiY291bnRlclwiIH0sXG5cdFx0XHRcdHRpdGxlOiBcInttZXNzYWdlfVwiLFxuXHRcdFx0XHRzdWJ0aXRsZTogXCJ7YWRkaXRpb25hbFRleHR9XCIsXG5cdFx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIixcblx0XHRcdFx0dHlwZTogeyBwYXRoOiBcInR5cGVcIiB9LFxuXHRcdFx0XHRkZXNjcmlwdGlvbjpcblx0XHRcdFx0XHRcIns9ICR7XCIgK1xuXHRcdFx0XHRcdFwiZGVzY3JpcHRpb259IHx8ICR7dGVjaG5pY2FsRGV0YWlsc30gPyBcIiArXG5cdFx0XHRcdFx0J1wiPGh0bWw+PGJvZHk+XCIgKyAnICtcblx0XHRcdFx0XHRmbkZvcm1hdERlc2NyaXB0aW9uKCkgK1xuXHRcdFx0XHRcdFwiICsgXCIgK1xuXHRcdFx0XHRcdGZuRm9ybWF0VGVjaG5pY2FsRGV0YWlscygpICtcblx0XHRcdFx0XHQnXCI8L2JvZHk+PC9odG1sPlwiJyArXG5cdFx0XHRcdFx0JyA6IFwiXCIgfScsXG5cdFx0XHRcdG1hcmt1cERlc2NyaXB0aW9uOiB0cnVlXG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvTWVzc2FnZVRlbXBsYXRlID0gbmV3IE1lc3NhZ2VJdGVtKHtcblx0XHRcdHRpdGxlOiBcInttZXNzYWdlfVwiLFxuXHRcdFx0dHlwZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRsb25ndGV4dFVybDogXCJ7ZGVzY3JpcHRpb25Vcmx9XCJcblx0XHR9KTtcblx0fVxuXHRvTWVzc2FnZVZpZXcgPVxuXHRcdG9NZXNzYWdlVmlldyB8fFxuXHRcdG5ldyBNZXNzYWdlVmlldyh7XG5cdFx0XHRzaG93RGV0YWlsc1BhZ2VIZWFkZXI6IGZhbHNlLFxuXHRcdFx0aXRlbVNlbGVjdDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRvQmFja0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0fSxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0XHR0ZW1wbGF0ZTogb01lc3NhZ2VUZW1wbGF0ZVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRvQmFja0J1dHRvbiA9XG5cdFx0b0JhY2tCdXR0b24gfHxcblx0XHRuZXcgQnV0dG9uKHtcblx0XHRcdGljb246IEljb25Qb29sLmdldEljb25VUkkoXCJuYXYtYmFja1wiKSxcblx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0cHJlc3M6IGZ1bmN0aW9uICh0aGlzOiBCdXR0b24pIHtcblx0XHRcdFx0b01lc3NhZ2VWaWV3Lm5hdmlnYXRlQmFjaygpO1xuXHRcdFx0XHR0aGlzLnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHQvLyBVcGRhdGUgcHJvcGVyIEVUYWcgTWlzbWF0Y2ggZXJyb3Jcblx0b01lc3NhZ2VWaWV3LnNldE1vZGVsKG9NZXNzYWdlRGlhbG9nTW9kZWwpO1xuXHRyZXR1cm4ge1xuXHRcdG9NZXNzYWdlVmlldyxcblx0XHRvQmFja0J1dHRvblxuXHR9O1xufVxuXG5mdW5jdGlvbiBzaG93VW5ib3VuZE1lc3NhZ2VzKFxuXHR0aGlzOiBtZXNzYWdlSGFuZGxpbmdUeXBlLFxuXHRhQ3VzdG9tTWVzc2FnZXM/OiBhbnlbXSxcblx0b0NvbnRleHQ/OiBhbnksXG5cdGJIYXNFdGFnTWVzc2FnZT86IGJvb2xlYW4sXG5cdGJTaG93Qm91bmRUcmFuc2l0aW9uPzogYm9vbGVhbixcblx0ZXJyb3JUYXJnZXRzSW5BUE0/OiBib29sZWFuXG4pIHtcblx0bGV0IGFVbmJvdW5kTWVzc2FnZXMgPSB0aGlzLmdldE1lc3NhZ2VzKCk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0bGV0IHNIaWdoZXN0UHJpb3JpdHk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5VGV4dDtcblx0Y29uc3QgYUZpbHRlcnMgPSBbXG5cdFx0bmV3IEZpbHRlcih7IHBhdGg6IFwiY29kZVwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuTkUsIHZhbHVlMTogbnVsbCB9KSxcblx0XHRuZXcgRmlsdGVyKHsgcGF0aDogXCJwZXJzaXN0ZW50XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5ORSwgdmFsdWUxOiBmYWxzZSB9KVxuXHRdO1xuXHRsZXQgc2hvd01lc3NhZ2VEaWFsb2c6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcblx0XHRzaG93TWVzc2FnZUJveDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG5cdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdGFVbmJvdW5kTWVzc2FnZXMgPSBhVW5ib3VuZE1lc3NhZ2VzLmNvbmNhdChnZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0Ly8gd2Ugb25seSB3YW50IHRvIHNob3cgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBub3QgYm91bmQgc3RhdGUgbWVzc2FnZXMgaGVuY2UgYWRkIGEgZmlsdGVyIGZvciB0aGUgc2FtZVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogdHJ1ZSB9KSk7XG5cdFx0Y29uc3QgZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nID0gZnVuY3Rpb24gKGFDb250cm9sSWRzOiBhbnkpIHtcblx0XHRcdGxldCBpbmRleCA9IEluZmluaXR5LFxuXHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChhQ29udHJvbElkc1swXSkgYXMgTWFuYWdlZE9iamVjdDtcblx0XHRcdGNvbnN0IGVycm9yRmllbGRDb250cm9sID0gQ29yZS5ieUlkKGFDb250cm9sSWRzWzBdKSBhcyBDb250cm9sO1xuXHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkUmFua2luRGlhbG9nID1cblx0XHRcdFx0XHRvQ29udHJvbCBpbnN0YW5jZW9mIERpYWxvZ1xuXHRcdFx0XHRcdFx0PyAoZXJyb3JGaWVsZENvbnRyb2wuZ2V0UGFyZW50KCkgYXMgYW55KS5maW5kRWxlbWVudHModHJ1ZSkuaW5kZXhPZihlcnJvckZpZWxkQ29udHJvbClcblx0XHRcdFx0XHRcdDogSW5maW5pdHk7XG5cdFx0XHRcdGlmIChvQ29udHJvbCBpbnN0YW5jZW9mIERpYWxvZykge1xuXHRcdFx0XHRcdGlmIChpbmRleCA+IGZpZWxkUmFua2luRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRpbmRleCA9IGZpZWxkUmFua2luRGlhbG9nO1xuXHRcdFx0XHRcdFx0Ly8gU2V0IHRoZSBmb2N1cyB0byB0aGUgZGlhbG9nJ3MgY29udHJvbFxuXHRcdFx0XHRcdFx0ZXJyb3JGaWVsZENvbnRyb2wuZm9jdXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gbWVzc2FnZXMgd2l0aCB0YXJnZXQgaW5zaWRlIHNhcC5tLkRpYWxvZyBzaG91bGQgbm90IGJyaW5nIHVwIHRoZSBtZXNzYWdlIGRpYWxvZ1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0XHRhRmlsdGVycy5wdXNoKFxuXHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdHBhdGg6IFwiY29udHJvbElkc1wiLFxuXHRcdFx0XHR0ZXN0OiBmbkNoZWNrQ29udHJvbElkSW5EaWFsb2csXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IHRydWVcblx0XHRcdH0pXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHQvLyBvbmx5IHVuYm91bmQgbWVzc2FnZXMgaGF2ZSB0byBiZSBzaG93biBzbyBhZGQgZmlsdGVyIGFjY29yZGluZ2x5XG5cdFx0YUZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgcGF0aDogXCJ0YXJnZXRcIiwgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLCB2YWx1ZTE6IFwiXCIgfSkpO1xuXHR9XG5cdGlmIChhQ3VzdG9tTWVzc2FnZXMgJiYgYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdGFDdXN0b21NZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlQ29kZSA9IG9NZXNzYWdlLmNvZGUgPyBvTWVzc2FnZS5jb2RlIDogXCJcIjtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdG1lc3NhZ2U6IG9NZXNzYWdlLnRleHQsXG5cdFx0XHRcdFx0dHlwZTogb01lc3NhZ2UudHlwZSxcblx0XHRcdFx0XHR0YXJnZXQ6IFwiXCIsXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRjb2RlOiBtZXNzYWdlQ29kZVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdC8vVGhlIHRhcmdldCBhbmQgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlIGFyZSBoYXJkY29kZWQgYXMgXCJcIiBhbmQgdHJ1ZSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBkZWFscyB3aXRoIG9ubHkgdW5ib3VuZCBtZXNzYWdlcy5cblx0XHR9KTtcblx0fVxuXHRjb25zdCBvTWVzc2FnZURpYWxvZ01vZGVsID0gKG9NZXNzYWdlVmlldyAmJiAob01lc3NhZ2VWaWV3LmdldE1vZGVsKCkgYXMgSlNPTk1vZGVsKSkgfHwgbmV3IEpTT05Nb2RlbCgpO1xuXHRpZiAoXG5cdFx0YVVuYm91bmRNZXNzYWdlcy5sZW5ndGggPT09IDEgJiZcblx0XHQoYVVuYm91bmRNZXNzYWdlc1swXS5nZXRDb2RlKCkgPT09IFwiNTAzXCIgfHxcblx0XHRcdChhVW5ib3VuZE1lc3NhZ2VzWzBdLmdldFRhcmdldCgpICE9PSB1bmRlZmluZWQgJiYgYVVuYm91bmRNZXNzYWdlc1swXS5nZXRUYXJnZXQoKSAhPT0gXCJcIikpXG5cdCkge1xuXHRcdGlmIChhVW5ib3VuZE1lc3NhZ2VzWzBdLmdldENvZGUoKSAhPT0gXCI1MDNcIikge1xuXHRcdFx0c2hvd01lc3NhZ2VCb3ggPSAhZXJyb3JUYXJnZXRzSW5BUE07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmJpbmRMaXN0KFwiL1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYUZpbHRlcnMpLFxuXHRcdFx0YUN1cnJlbnRDb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRpZiAoYUN1cnJlbnRDb250ZXh0cyAmJiBhQ3VycmVudENvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIERvbid0IHNob3cgZGlhbG9nIGluY2FzZSB0aGVyZSBhcmUgbm8gZXJyb3JzIHRvIHNob3dcblx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gIWVycm9yVGFyZ2V0c0luQVBNOyAvLyBpZiBmYWxzZSwgc2hvdyBtZXNzYWdlcyBpbiBkaWFsb2dcblx0XHRcdC8vIEFzIGZpdGVyaW5nIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGhlcmUgaGVuY2Vcblx0XHRcdC8vIHVzaW5nIHRoZSBtZXNzYWdlIG1vZGVsIGFnYWluIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cgdmlldyBhbmQgdGhlbiBmaWx0ZXJpbmcgb24gdGhhdCBiaW5kaW5nIGFnYWluIGlzIHVubmVjZXNzYXJ5LlxuXHRcdFx0Ly8gU28gd2UgY3JlYXRlIG5ldyBqc29uIG1vZGVsIHRvIHVzZSBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nIHZpZXcuXG5cdFx0XHRjb25zdCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cdFx0XHRhQ3VycmVudENvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0bGV0IG9NZXNzYWdlO1xuXHRcdFx0XHRvTWVzc2FnZSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRhTWVzc2FnZXMucHVzaChvTWVzc2FnZSk7XG5cdFx0XHRcdGFNZXNzYWdlRGF0YUxpc3QgPSBhTWVzc2FnZXM7XG5cdFx0XHR9KTtcblx0XHRcdC8vIGlmKGFNZXNzYWdlcy5sZW5ndGggPT09IDAgJiYgYU1lc3NhZ2VMaXN0Lmxlbmd0aCkge1xuXHRcdFx0Ly8gXHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoYU1lc3NhZ2VzKTtcblx0XHRcdC8vIH1cblx0XHRcdGxldCBleGlzdGluZ01lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob01lc3NhZ2VEaWFsb2dNb2RlbC5nZXREYXRhKCkpKSB7XG5cdFx0XHRcdGV4aXN0aW5nTWVzc2FnZXMgPSBvTWVzc2FnZURpYWxvZ01vZGVsLmdldERhdGEoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9VbmlxdWVPYmo6IGFueSA9IHt9O1xuXHRcdFx0bGV0IGFNb2RlbERhdGFBcnJheTogYW55W10gPSBbXTtcblx0XHRcdGFNb2RlbERhdGFBcnJheSA9IGFNZXNzYWdlRGF0YUxpc3QuY29uY2F0KGV4aXN0aW5nTWVzc2FnZXMpLmZpbHRlcihmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRcdC8vIHJlbW92ZSBlbnRyaWVzIGhhdmluZyBkdXBsaWNhdGUgbWVzc2FnZSBpZHNcblx0XHRcdFx0cmV0dXJuICFvVW5pcXVlT2JqW29iai5pZF0gJiYgKG9VbmlxdWVPYmpbb2JqLmlkXSA9IHRydWUpO1xuXHRcdFx0fSk7XG5cdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoYU1vZGVsRGF0YUFycmF5KTtcblx0XHR9XG5cdH1cblx0aWYgKGFVbmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAwICYmICFhQ3VzdG9tTWVzc2FnZXMgJiYgIWJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdC8vIERvbid0IHNob3cgdGhlIHBvcHVwIGlmIHRoZXJlIGFyZSBubyB0cmFuc2llbnQgbWVzc2FnZXNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9IGVsc2UgaWYgKGFVbmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxICYmIGFVbmJvdW5kTWVzc2FnZXNbMF0uZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzICYmICFhQ3VzdG9tTWVzc2FnZXMpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KGFVbmJvdW5kTWVzc2FnZXNbMF0ubWVzc2FnZSk7XG5cdFx0XHRpZiAob01lc3NhZ2VEaWFsb2dNb2RlbCkge1xuXHRcdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoe30pO1xuXHRcdFx0fVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGFVbmJvdW5kTWVzc2FnZXMpO1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHNob3dNZXNzYWdlRGlhbG9nKSB7XG5cdFx0YVJlc29sdmVGdW5jdGlvbnMgPSBhUmVzb2x2ZUZ1bmN0aW9ucyB8fCBbXTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHQoQ29yZSBhcyBDb3JlRXgpXG5cdFx0XHRcdC5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBiU3RyaWN0SGFuZGxpbmdGbG93ID0gZmFsc2U7XG5cdFx0XHRcdFx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyhvTWVzc2FnZURpYWxvZ01vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93KTtcblx0XHRcdFx0XHRvRGlhbG9nID1cblx0XHRcdFx0XHRcdG9EaWFsb2cgfHxcblx0XHRcdFx0XHRcdG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IG9NZXNzYWdlT2JqZWN0Lm9NZXNzYWdlVmlldyxcblx0XHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBhbHNvIHJlbW92ZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGlmIHdlIHdlcmUgc2hvd2luZyB0aGVtXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYlNob3dCb3VuZFRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfQ0xPU0VcIilcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGN1c3RvbUhlYWRlcjogbmV3IEJhcih7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudE1pZGRsZTogW1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudExlZnQ6IFtvQmFja0J1dHRvbl1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRXaWR0aDogXCIzNy41ZW1cIixcblx0XHRcdFx0XHRcdFx0Y29udGVudEhlaWdodDogXCIyMS41ZW1cIixcblx0XHRcdFx0XHRcdFx0dmVydGljYWxTY3JvbGxpbmc6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUmVzb2x2ZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVGdW5jdGlvbnNbaV0uY2FsbCgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZUZ1bmN0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGlmIChiSGFzRXRhZ01lc3NhZ2UpIHtcblx0XHRcdFx0XHRcdHNhcC51aS5yZXF1aXJlKFtcInNhcC9tL0J1dHRvblR5cGVcIl0sIGZ1bmN0aW9uIChCdXR0b25UeXBlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCZWdpbkJ1dHRvbihcblx0XHRcdFx0XHRcdFx0XHRuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpYWxvZ0Nsb3NlSGFuZGxlcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9SRUZSRVNIXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogQnV0dG9uVHlwZS5FbXBoYXNpemVkXG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3lCZWdpbkJ1dHRvbigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzSGlnaGVzdFByaW9yaXR5ID0gZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5KG9NZXNzYWdlVmlldy5nZXRJdGVtcygpKTtcblx0XHRcdFx0XHRzSGlnaGVzdFByaW9yaXR5VGV4dCA9IGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5KTtcblx0XHRcdFx0XHRvRGlhbG9nLnNldFN0YXRlKHNIaWdoZXN0UHJpb3JpdHkpO1xuXHRcdFx0XHRcdChvRGlhbG9nLmdldEN1c3RvbUhlYWRlcigpIGFzIGFueSkuZ2V0Q29udGVudE1pZGRsZSgpWzBdLnNldFRleHQoc0hpZ2hlc3RQcmlvcml0eVRleHQpO1xuXHRcdFx0XHRcdG9NZXNzYWdlVmlldy5uYXZpZ2F0ZUJhY2soKTtcblx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoc2hvd01lc3NhZ2VCb3gpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlID0gYVVuYm91bmRNZXNzYWdlc1swXTtcblx0XHRcdGlmIChvTWVzc2FnZS50ZWNobmljYWxEZXRhaWxzICYmIGFNZXNzYWdlTGlzdC5pbmRleE9mKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpID09PSAtMSkge1xuXHRcdFx0XHRhTWVzc2FnZUxpc3QucHVzaChvTWVzc2FnZS50ZWNobmljYWxEZXRhaWxzLm9yaWdpbmFsTWVzc2FnZS5tZXNzYWdlKTtcblx0XHRcdFx0bGV0IGZvcm1hdHRlZFRleHRTdHJpbmcgPSBcIjxodG1sPjxib2R5PlwiO1xuXHRcdFx0XHRjb25zdCByZXRyeUFmdGVyTWVzc2FnZSA9IGdldFJldHJ5QWZ0ZXJNZXNzYWdlKG9NZXNzYWdlLCB0cnVlKTtcblx0XHRcdFx0aWYgKHJldHJ5QWZ0ZXJNZXNzYWdlKSB7XG5cdFx0XHRcdFx0Zm9ybWF0dGVkVGV4dFN0cmluZyA9IFwiPGg2PlwiICsgcmV0cnlBZnRlck1lc3NhZ2UgKyBcIjwvaDY+PGJyPlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvTWVzc2FnZS5nZXRDb2RlKCkgIT09IFwiNTAzXCIpIHtcblx0XHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gZm9ybWF0dGVkVGV4dFN0cmluZyArIG9NZXNzYWdlLmFkZGl0aW9uYWxUZXh0ICsgXCI6IFwiICsgb01lc3NhZ2UuZ2V0TWVzc2FnZSgpICsgXCI8L2h0bWw+PC9ib2R5PlwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRleHRTdHJpbmcgPSBmb3JtYXR0ZWRUZXh0U3RyaW5nICsgb01lc3NhZ2UuZ2V0TWVzc2FnZSgpICsgXCI8L2h0bWw+PC9ib2R5PlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlZFRleHQ6IGFueSA9IG5ldyBGb3JtYXR0ZWRUZXh0KHtcblx0XHRcdFx0XHRodG1sVGV4dDogZm9ybWF0dGVkVGV4dFN0cmluZ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihmb3JtYXR0ZWRUZXh0LCB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YU1lc3NhZ2VMaXN0ID0gW107XG5cdFx0XHRcdFx0XHRpZiAoYlNob3dCb3VuZFRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2xhdGVkVGV4dEZvck1lc3NhZ2VEaWFsb2coc0hpZ2hlc3RQcmlvcml0eTogYW55KSB7XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdHN3aXRjaCAoc0hpZ2hlc3RQcmlvcml0eSkge1xuXHRcdGNhc2UgXCJFcnJvclwiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9FUlJPUlwiKTtcblx0XHRjYXNlIFwiSW5mb3JtYXRpb25cIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0lORk9cIik7XG5cdFx0Y2FzZSBcIlN1Y2Nlc3NcIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1NVQ0NFU1NcIik7XG5cdFx0Y2FzZSBcIldhcm5pbmdcIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIik7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpO1xuXHR9XG59XG5mdW5jdGlvbiByZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCkge1xuXHRyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyh0cnVlKTtcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzKGJCb3VuZE1lc3NhZ2VzOiBib29sZWFuID0gZmFsc2UsIGJUcmFuc2l0aW9uT25seTogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdGxldCBpO1xuXHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSAoQ29yZSBhcyBDb3JlRXggYXMgYW55KS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdG9NZXNzYWdlTW9kZWwgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCksXG5cdFx0YU1lc3NhZ2VzID0gb01lc3NhZ2VNb2RlbC5nZXRPYmplY3QoXCIvXCIpLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YVRyYW5zaXRpb25NZXNzYWdlcyA9IFtdO1xuXG5cdGZvciAoaSA9IDA7IGkgPCBhTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoXG5cdFx0XHQoIWJUcmFuc2l0aW9uT25seSB8fCBhTWVzc2FnZXNbaV0ucGVyc2lzdGVudCkgJiZcblx0XHRcdCgoYkJvdW5kTWVzc2FnZXMgJiYgYU1lc3NhZ2VzW2ldLnRhcmdldCAhPT0gXCJcIikgfHwgKCFiQm91bmRNZXNzYWdlcyAmJiAoIWFNZXNzYWdlc1tpXS50YXJnZXQgfHwgYU1lc3NhZ2VzW2ldLnRhcmdldCA9PT0gXCJcIikpKSAmJlxuXHRcdFx0YU1lc3NhZ2VzW2ldLmNvZGVcblx0XHQpIHtcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXMucHVzaChhTWVzc2FnZXNbaV0pO1xuXHRcdH1cblx0fVxuXG5cdGZvciAoaSA9IDA7IGkgPCBhVHJhbnNpdGlvbk1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5jb2RlID09PSBcIjUwM1wiICYmXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UgIT09IFwiXCIgJiZcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZS5pbmRleE9mKG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19CQUNLRU5EX1BSRUZJWFwiKSkgPT09IC0xXG5cdFx0KSB7XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UgPVxuXHRcdFx0XHRcIlxcblwiICsgb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0JBQ0tFTkRfUFJFRklYXCIpICsgYVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVRyYW5zaXRpb25NZXNzYWdlcztcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhiQm91bmRNZXNzYWdlczogYW55KSB7XG5cdGNvbnN0IGFNZXNzYWdlc1RvQmVEZWxldGVkID0gZ2V0TWVzc2FnZXMoYkJvdW5kTWVzc2FnZXMsIHRydWUpO1xuXG5cdGlmIChhTWVzc2FnZXNUb0JlRGVsZXRlZC5sZW5ndGggPiAwKSB7XG5cdFx0Q29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2VzKGFNZXNzYWdlc1RvQmVEZWxldGVkKTtcblx0fVxufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIEZpb3JpIE1lc3NhZ2UgSGFuZGxpbmdcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5tZXNzYWdlSGFuZGxpbmdcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTYuMFxuICovXG5jb25zdCBtZXNzYWdlSGFuZGxpbmc6IG1lc3NhZ2VIYW5kbGluZ1R5cGUgPSB7XG5cdGdldE1lc3NhZ2VzOiBnZXRNZXNzYWdlcyxcblx0c2hvd1VuYm91bmRNZXNzYWdlczogc2hvd1VuYm91bmRNZXNzYWdlcyxcblx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlczogcmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcyxcblx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6IHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzLFxuXHRtb2RpZnlFVGFnTWVzc2FnZXNPbmx5OiBmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHksXG5cdGdldFJldHJ5QWZ0ZXJNZXNzYWdlOiBnZXRSZXRyeUFmdGVyTWVzc2FnZSxcblx0cHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nOiBwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2dcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc3NhZ2VIYW5kbGluZztcbiJdfQ==