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