@sapui5/sap.fe.core 1.99.0 → 1.101.1

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 (289) hide show
  1. package/package.json +6 -4
  2. package/src/sap/fe/core/.library +2 -3
  3. package/src/sap/fe/core/AnnotationHelper.js +43 -92
  4. package/src/sap/fe/core/AnnotationHelper.ts +43 -107
  5. package/src/sap/fe/core/AppComponent.js +381 -399
  6. package/src/sap/fe/core/AppComponent.ts +397 -0
  7. package/src/sap/fe/core/AppStateHandler.js +131 -162
  8. package/src/sap/fe/core/AppStateHandler.ts +2 -2
  9. package/src/sap/fe/core/BaseController.js +82 -58
  10. package/src/sap/fe/core/BaseController.ts +67 -0
  11. package/src/sap/fe/core/CommonUtils.js +179 -31
  12. package/src/sap/fe/core/CommonUtils.ts +295 -125
  13. package/src/sap/fe/core/ExtensionAPI.js +279 -274
  14. package/src/sap/fe/core/ExtensionAPI.ts +242 -0
  15. package/src/sap/fe/core/PageController.js +158 -29
  16. package/src/sap/fe/core/PageController.ts +65 -37
  17. package/src/sap/fe/core/RouterProxy.js +700 -750
  18. package/src/sap/fe/core/RouterProxy.ts +47 -31
  19. package/src/sap/fe/core/Synchronization.js +21 -31
  20. package/src/sap/fe/core/TemplateComponent.js +193 -118
  21. package/src/sap/fe/core/TemplateComponent.ts +104 -109
  22. package/src/sap/fe/core/TemplateModel.js +24 -44
  23. package/src/sap/fe/core/TemplateModel.ts +3 -3
  24. package/src/sap/fe/core/TransactionHelper.js +1368 -1369
  25. package/src/sap/fe/core/TransactionHelper.ts +201 -171
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
  27. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
  29. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
  31. package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
  32. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
  33. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  34. package/src/sap/fe/core/actions/draft.js +324 -220
  35. package/src/sap/fe/core/actions/draft.ts +209 -133
  36. package/src/sap/fe/core/actions/messageHandling.js +79 -48
  37. package/src/sap/fe/core/actions/messageHandling.ts +113 -83
  38. package/src/sap/fe/core/actions/operations.js +37 -18
  39. package/src/sap/fe/core/actions/operations.ts +51 -20
  40. package/src/sap/fe/core/actions/sticky.js +17 -4
  41. package/src/sap/fe/core/actions/sticky.ts +21 -4
  42. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
  43. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
  44. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
  45. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
  46. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
  47. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
  48. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
  49. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
  50. package/src/sap/fe/core/controllerextensions/EditFlow.js +1854 -1669
  51. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
  52. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  53. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
  54. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +716 -779
  55. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
  56. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  57. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
  58. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1056 -1005
  59. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
  60. package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -532
  61. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +13 -12
  62. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  63. package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
  64. package/src/sap/fe/core/controllerextensions/MessageHandler.js +221 -244
  65. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
  66. package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
  67. package/src/sap/fe/core/controllerextensions/PageReady.ts +57 -53
  68. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  69. package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
  70. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  71. package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
  72. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  73. package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
  74. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  75. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  76. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  77. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  78. package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
  79. package/src/sap/fe/core/controllerextensions/SideEffects.ts +68 -68
  80. package/src/sap/fe/core/controllerextensions/ViewState.js +774 -806
  81. package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
  82. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  83. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  84. package/src/sap/fe/core/controls/Any.js +28 -0
  85. package/src/sap/fe/core/controls/Any.ts +30 -0
  86. package/src/sap/fe/core/controls/CommandExecution.js +92 -68
  87. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  88. package/src/sap/fe/core/controls/ConditionalWrapper.js +165 -79
  89. package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
  90. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
  91. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
  92. package/src/sap/fe/core/controls/CustomQuickViewPage.js +167 -125
  93. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
  94. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
  95. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +163 -122
  96. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
  97. package/src/sap/fe/core/controls/FieldWrapper.js +212 -141
  98. package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
  99. package/src/sap/fe/core/controls/FileWrapper.js +313 -0
  100. package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
  101. package/src/sap/fe/core/controls/FilterBar.js +197 -159
  102. package/src/sap/fe/core/controls/FilterBar.ts +148 -0
  103. package/src/sap/fe/core/controls/FormElementWrapper.js +100 -39
  104. package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
  105. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  106. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  107. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +147 -115
  108. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
  109. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +300 -265
  110. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
  111. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +185 -140
  112. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  113. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  114. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  115. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
  116. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +75 -74
  117. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
  118. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  119. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  120. package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
  121. package/src/sap/fe/core/converters/ManifestSettings.ts +17 -2
  122. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  123. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  124. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  125. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  126. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  127. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  128. package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
  129. package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
  130. package/src/sap/fe/core/converters/controls/Common/Action.js +10 -10
  131. package/src/sap/fe/core/converters/controls/Common/Action.ts +20 -19
  132. package/src/sap/fe/core/converters/controls/Common/Chart.js +8 -8
  133. package/src/sap/fe/core/converters/controls/Common/Chart.ts +12 -11
  134. package/src/sap/fe/core/converters/controls/Common/Form.js +6 -6
  135. package/src/sap/fe/core/converters/controls/Common/Form.ts +7 -3
  136. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  137. package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
  138. package/src/sap/fe/core/converters/controls/Common/Table.js +326 -86
  139. package/src/sap/fe/core/converters/controls/Common/Table.ts +384 -167
  140. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +120 -55
  141. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +158 -98
  142. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +206 -223
  143. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +263 -287
  144. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
  145. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
  146. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +5 -2
  147. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +4 -1
  148. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  150. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  152. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  153. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  154. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  155. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  156. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
  157. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +51 -27
  158. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
  159. package/src/sap/fe/core/converters/templates/ListReportConverter.js +42 -25
  160. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +91 -65
  161. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
  162. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
  163. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  164. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  165. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  166. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  167. package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
  168. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -2
  169. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  170. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  171. package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
  172. package/src/sap/fe/core/formatters/ValueFormatter.ts +4 -7
  173. package/src/sap/fe/core/fpm/Component.js +80 -55
  174. package/src/sap/fe/core/fpm/Component.ts +43 -0
  175. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  176. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  177. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  178. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  179. package/src/sap/fe/core/helpers/ClassSupport.js +307 -166
  180. package/src/sap/fe/core/helpers/ClassSupport.ts +348 -155
  181. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  182. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  183. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  184. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  185. package/src/sap/fe/core/helpers/MassEditHelper.js +735 -684
  186. package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
  187. package/src/sap/fe/core/helpers/ModelHelper.js +53 -1
  188. package/src/sap/fe/core/helpers/ModelHelper.ts +46 -0
  189. package/src/sap/fe/core/helpers/PasteHelper.js +4 -4
  190. package/src/sap/fe/core/helpers/PasteHelper.ts +4 -3
  191. package/src/sap/fe/core/helpers/SemanticDateOperators.js +7 -3
  192. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +7 -1
  193. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  194. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
  195. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -7
  196. package/src/sap/fe/core/helpers/StableIdHelper.ts +0 -4
  197. package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
  198. package/src/sap/fe/core/jsx-runtime/jsx.ts +22 -8
  199. package/src/sap/fe/core/library.js +425 -451
  200. package/src/sap/fe/core/library.support.js +22 -33
  201. package/src/sap/fe/core/library.support.ts +23 -0
  202. package/src/sap/fe/core/library.ts +420 -0
  203. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  204. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -4
  205. package/src/sap/fe/core/messagebundle.properties +45 -13
  206. package/src/sap/fe/core/messagebundle_ar.properties +29 -7
  207. package/src/sap/fe/core/messagebundle_bg.properties +29 -7
  208. package/src/sap/fe/core/messagebundle_ca.properties +29 -7
  209. package/src/sap/fe/core/messagebundle_cs.properties +29 -7
  210. package/src/sap/fe/core/messagebundle_cy.properties +29 -7
  211. package/src/sap/fe/core/messagebundle_da.properties +29 -7
  212. package/src/sap/fe/core/messagebundle_de.properties +29 -7
  213. package/src/sap/fe/core/messagebundle_el.properties +29 -7
  214. package/src/sap/fe/core/messagebundle_en.properties +29 -7
  215. package/src/sap/fe/core/messagebundle_en_GB.properties +29 -7
  216. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +29 -7
  217. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +29 -7
  218. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +29 -7
  219. package/src/sap/fe/core/messagebundle_es.properties +29 -7
  220. package/src/sap/fe/core/messagebundle_es_MX.properties +29 -7
  221. package/src/sap/fe/core/messagebundle_et.properties +29 -7
  222. package/src/sap/fe/core/messagebundle_fi.properties +30 -8
  223. package/src/sap/fe/core/messagebundle_fr.properties +31 -9
  224. package/src/sap/fe/core/messagebundle_fr_CA.properties +31 -9
  225. package/src/sap/fe/core/messagebundle_hi.properties +29 -7
  226. package/src/sap/fe/core/messagebundle_hr.properties +29 -7
  227. package/src/sap/fe/core/messagebundle_hu.properties +29 -7
  228. package/src/sap/fe/core/messagebundle_id.properties +29 -7
  229. package/src/sap/fe/core/messagebundle_it.properties +29 -7
  230. package/src/sap/fe/core/messagebundle_iw.properties +29 -7
  231. package/src/sap/fe/core/messagebundle_ja.properties +28 -6
  232. package/src/sap/fe/core/messagebundle_kk.properties +29 -7
  233. package/src/sap/fe/core/messagebundle_ko.properties +29 -7
  234. package/src/sap/fe/core/messagebundle_lt.properties +29 -7
  235. package/src/sap/fe/core/messagebundle_lv.properties +30 -8
  236. package/src/sap/fe/core/messagebundle_ms.properties +29 -7
  237. package/src/sap/fe/core/messagebundle_nl.properties +29 -7
  238. package/src/sap/fe/core/messagebundle_no.properties +29 -7
  239. package/src/sap/fe/core/messagebundle_pl.properties +29 -7
  240. package/src/sap/fe/core/messagebundle_pt.properties +30 -8
  241. package/src/sap/fe/core/messagebundle_pt_PT.properties +29 -7
  242. package/src/sap/fe/core/messagebundle_ro.properties +29 -7
  243. package/src/sap/fe/core/messagebundle_ru.properties +29 -7
  244. package/src/sap/fe/core/messagebundle_sh.properties +29 -7
  245. package/src/sap/fe/core/messagebundle_sk.properties +29 -7
  246. package/src/sap/fe/core/messagebundle_sl.properties +29 -7
  247. package/src/sap/fe/core/messagebundle_sv.properties +30 -8
  248. package/src/sap/fe/core/messagebundle_th.properties +28 -6
  249. package/src/sap/fe/core/messagebundle_tr.properties +32 -10
  250. package/src/sap/fe/core/messagebundle_uk.properties +29 -7
  251. package/src/sap/fe/core/messagebundle_vi.properties +29 -7
  252. package/src/sap/fe/core/messagebundle_zh_CN.properties +29 -7
  253. package/src/sap/fe/core/messagebundle_zh_TW.properties +29 -7
  254. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
  255. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +1 -1
  256. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +158 -196
  257. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +5 -6
  258. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
  259. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  260. package/src/sap/fe/core/services/NavigationServiceFactory.js +287 -342
  261. package/src/sap/fe/core/services/NavigationServiceFactory.ts +11 -14
  262. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +70 -105
  263. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +6 -3
  264. package/src/sap/fe/core/services/RoutingServiceFactory.js +796 -820
  265. package/src/sap/fe/core/services/RoutingServiceFactory.ts +62 -53
  266. package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
  267. package/src/sap/fe/core/services/ShellServicesFactory.ts +33 -33
  268. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +570 -595
  269. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +23 -4
  270. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +357 -389
  271. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +25 -29
  272. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +43 -5
  273. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +7 -4
  274. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  275. package/src/sap/fe/core/support/CommonHelper.ts +1 -4
  276. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  277. package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
  278. package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
  279. package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
  280. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
  281. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  282. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  283. package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
  284. package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
  285. package/src/sap/fe/core/templating/UIFormatters.js +150 -44
  286. package/src/sap/fe/core/templating/UIFormatters.ts +165 -67
  287. package/src/sap/fe/core/type/Email.js +26 -8
  288. package/src/sap/fe/core/type/Email.ts +8 -7
  289. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -75
@@ -10,12 +10,6 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
10
10
  var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
11
11
  var convertTypes = MetaModelConverter.convertTypes;
12
12
 
13
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14
-
15
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
16
-
17
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
18
-
19
13
  /**
20
14
  * Checks whether an object is an annotation term.
21
15
  *
@@ -30,7 +24,7 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
30
24
  return objectPart && objectPart.hasOwnProperty("_type");
31
25
  }
32
26
 
33
- var getDataModelPathForEntitySet = function (resolvedMetaPath) {
27
+ var getDataModelPathForEntitySet = function (resolvedMetaPath, convertedTypes) {
34
28
  var rootEntitySet;
35
29
  var currentEntitySet;
36
30
  var previousEntitySet;
@@ -78,7 +72,8 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
78
72
  targetEntitySet: currentEntitySet,
79
73
  navigationProperties: navigationProperties,
80
74
  contextLocation: undefined,
81
- targetObject: resolvedMetaPath.target
75
+ targetObject: resolvedMetaPath.target,
76
+ convertedTypes: convertedTypes
82
77
  };
83
78
  dataModelPath.contextLocation = dataModelPath;
84
79
  return dataModelPath;
@@ -100,8 +95,6 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
100
95
 
101
96
  var ConverterContext = /*#__PURE__*/function () {
102
97
  function ConverterContext(convertedTypes, manifestSettings, diagnostics, mergeFn, targetDataModelPath) {
103
- _classCallCheck(this, ConverterContext);
104
-
105
98
  this.convertedTypes = convertedTypes;
106
99
  this.manifestSettings = manifestSettings;
107
100
  this.diagnostics = diagnostics;
@@ -118,409 +111,385 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
118
111
  */
119
112
 
120
113
 
121
- _createClass(ConverterContext, [{
122
- key: "_getEntityTypeFromFullyQualifiedName",
123
- value: function _getEntityTypeFromFullyQualifiedName(fullyQualifiedName) {
124
- var targetEntityType = this.convertedTypes.entityTypes.find(function (entityType) {
125
- if (fullyQualifiedName.startsWith(entityType.fullyQualifiedName)) {
126
- var replaceAnnotation = fullyQualifiedName.replace(entityType.fullyQualifiedName, "");
127
- return replaceAnnotation.startsWith("/") || replaceAnnotation.startsWith("@");
128
- }
129
-
130
- return false;
131
- });
132
- return targetEntityType;
133
- }
134
- /**
135
- * Retrieve the entityType associated with an annotation object.
136
- *
137
- * @param annotation The annotation object for which we want to find the entityType
138
- * @returns {EntityType} The EntityType the annotation refers to
139
- */
140
-
141
- }, {
142
- key: "getAnnotationEntityType",
143
- value: function getAnnotationEntityType(annotation) {
144
- if (annotation) {
145
- var annotationPath = annotation.fullyQualifiedName;
146
-
147
- var targetEntityType = this._getEntityTypeFromFullyQualifiedName(annotationPath);
148
-
149
- if (!targetEntityType) {
150
- throw new Error("Cannot find Entity Type for " + annotation.fullyQualifiedName);
151
- }
114
+ var _proto = ConverterContext.prototype;
152
115
 
153
- return targetEntityType;
154
- } else {
155
- return this.targetDataModelPath.targetEntityType;
156
- }
157
- }
158
- /**
159
- * Retrieve the manifest settings defined for a specific control within controlConfiguration.
160
- *
161
- * @param vAnnotationPath The annotation path or object to evaluate
162
- * @returns The control configuration for that specific anntoation path if it exists
163
- */
164
-
165
- }, {
166
- key: "getManifestControlConfiguration",
167
- value: function getManifestControlConfiguration(vAnnotationPath) {
168
- if (isAnnotationTerm(vAnnotationPath)) {
169
- return this.manifestWrapper.getControlConfiguration(vAnnotationPath.fullyQualifiedName.replace(this.targetDataModelPath.targetEntityType.fullyQualifiedName, ""));
116
+ _proto._getEntityTypeFromFullyQualifiedName = function _getEntityTypeFromFullyQualifiedName(fullyQualifiedName) {
117
+ var targetEntityType = this.convertedTypes.entityTypes.find(function (entityType) {
118
+ if (fullyQualifiedName.startsWith(entityType.fullyQualifiedName)) {
119
+ var replaceAnnotation = fullyQualifiedName.replace(entityType.fullyQualifiedName, "");
120
+ return replaceAnnotation.startsWith("/") || replaceAnnotation.startsWith("@");
170
121
  }
171
122
 
172
- return this.manifestWrapper.getControlConfiguration(vAnnotationPath);
173
- }
174
- /**
175
- * Create an absolute annotation path based on the current meta model context.
176
- *
177
- * @param sAnnotationPath The relative annotation path
178
- * @returns The correct annotation path based on the current context
179
- */
180
-
181
- }, {
182
- key: "getAbsoluteAnnotationPath",
183
- value: function getAbsoluteAnnotationPath(sAnnotationPath) {
184
- if (!sAnnotationPath) {
185
- return sAnnotationPath;
186
- }
123
+ return false;
124
+ });
125
+ return targetEntityType;
126
+ }
127
+ /**
128
+ * Retrieve the entityType associated with an annotation object.
129
+ *
130
+ * @param annotation The annotation object for which we want to find the entityType
131
+ * @returns {EntityType} The EntityType the annotation refers to
132
+ */
133
+ ;
134
+
135
+ _proto.getAnnotationEntityType = function getAnnotationEntityType(annotation) {
136
+ if (annotation) {
137
+ var annotationPath = annotation.fullyQualifiedName;
187
138
 
188
- if (sAnnotationPath[0] === "/") {
189
- return sAnnotationPath;
139
+ var targetEntityType = this._getEntityTypeFromFullyQualifiedName(annotationPath);
140
+
141
+ if (!targetEntityType) {
142
+ throw new Error("Cannot find Entity Type for " + annotation.fullyQualifiedName);
190
143
  }
191
144
 
192
- return this.baseContextPath + "/" + sAnnotationPath;
193
- }
194
- /**
195
- * Retrieve the current entitySet.
196
- *
197
- * @returns The current EntitySet if it exists.
198
- */
199
-
200
- }, {
201
- key: "getEntitySet",
202
- value: function getEntitySet() {
203
- return this.targetDataModelPath.targetEntitySet;
204
- }
205
- /**
206
- * Retrieve the context path.
207
- *
208
- * @returns The context path of the converter.
209
- */
210
-
211
- }, {
212
- key: "getContextPath",
213
- value: function getContextPath() {
214
- return this.baseContextPath;
215
- }
216
- /**
217
- * Retrieve the current data model object path.
218
- *
219
- * @returns The current data model object path
220
- */
221
-
222
- }, {
223
- key: "getDataModelObjectPath",
224
- value: function getDataModelObjectPath() {
225
- return this.targetDataModelPath;
226
- }
227
- /**
228
- * Get the EntityContainer.
229
- *
230
- * @returns The current service EntityContainer
231
- */
232
-
233
- }, {
234
- key: "getEntityContainer",
235
- value: function getEntityContainer() {
236
- return this.convertedTypes.entityContainer;
237
- }
238
- /**
239
- * Get the EntityType based on the fully qualified name.
240
- *
241
- * @returns The current EntityType.
242
- */
243
-
244
- }, {
245
- key: "getEntityType",
246
- value: function getEntityType() {
145
+ return targetEntityType;
146
+ } else {
247
147
  return this.targetDataModelPath.targetEntityType;
248
148
  }
249
- /**
250
- * Gets a singleton based on the fully qualified name.
251
- *
252
- * @param {string} fullyQualifiedName The fully qualified name of the singleton
253
- * @returns {Singleton | undefined} The singleton instance.
254
- */
255
-
256
- }, {
257
- key: "getSingleton",
258
- value: function getSingleton(fullyQualifiedName) {
259
- return this.convertedTypes.singletons.find(function (singleton) {
260
- return singleton.fullyQualifiedName === fullyQualifiedName;
261
- });
149
+ }
150
+ /**
151
+ * Retrieve the manifest settings defined for a specific control within controlConfiguration.
152
+ *
153
+ * @param vAnnotationPath The annotation path or object to evaluate
154
+ * @returns The control configuration for that specific anntoation path if it exists
155
+ */
156
+ ;
157
+
158
+ _proto.getManifestControlConfiguration = function getManifestControlConfiguration(vAnnotationPath) {
159
+ if (isAnnotationTerm(vAnnotationPath)) {
160
+ return this.manifestWrapper.getControlConfiguration(vAnnotationPath.fullyQualifiedName.replace(this.targetDataModelPath.targetEntityType.fullyQualifiedName, ""));
262
161
  }
263
- /**
264
- * Gets the entity type of the parameter in case of a parameterized service.
265
- * @returns {EntityType} The entity type of the parameter
266
- */
267
-
268
- }, {
269
- key: "getParameterEntityType",
270
- value: function getParameterEntityType() {
271
- var _parameterEntityType$, _parameterEntityType$2;
272
-
273
- var parameterEntityType = this.targetDataModelPath.startingEntitySet.entityType;
274
- var isParameterized = !!((_parameterEntityType$ = parameterEntityType.annotations) !== null && _parameterEntityType$ !== void 0 && (_parameterEntityType$2 = _parameterEntityType$.Common) !== null && _parameterEntityType$2 !== void 0 && _parameterEntityType$2.ResultContext);
275
- return isParameterized && parameterEntityType;
162
+
163
+ return this.manifestWrapper.getControlConfiguration(vAnnotationPath);
164
+ }
165
+ /**
166
+ * Create an absolute annotation path based on the current meta model context.
167
+ *
168
+ * @param sAnnotationPath The relative annotation path
169
+ * @returns The correct annotation path based on the current context
170
+ */
171
+ ;
172
+
173
+ _proto.getAbsoluteAnnotationPath = function getAbsoluteAnnotationPath(sAnnotationPath) {
174
+ if (!sAnnotationPath) {
175
+ return sAnnotationPath;
276
176
  }
277
- /**
278
- * Retrieves an annotation from an entity type based on annotation path.
279
- *
280
- * @param annotationPath The annotation path to be evaluated
281
- * @returns The target annotation path as well as a converter context to go with it
282
- */
283
-
284
- }, {
285
- key: "getEntityTypeAnnotation",
286
- value: function getEntityTypeAnnotation(annotationPath) {
287
- var _startingEntityType$a;
288
-
289
- if (annotationPath.indexOf("@") === -1) {
290
- annotationPath = "@" + annotationPath;
291
- }
292
177
 
293
- var targetObject = this.targetDataModelPath.targetEntityType.resolvePath(annotationPath, true);
294
- var rootEntitySet = this.targetDataModelPath.targetEntitySet;
295
- var currentEntityType = this.targetDataModelPath.targetEntityType;
296
- var startingEntityType = this.targetDataModelPath.startingEntitySet.entityType;
297
- var navigationProperties = this.targetDataModelPath.navigationProperties.concat();
298
- var i = 1;
299
- var currentObject;
300
- var navigatedPaths = [];
301
- var visitedObjects = targetObject.visitedObjects; // In case of parameterized service
302
-
303
- if (!rootEntitySet && (_startingEntityType$a = startingEntityType.annotations.Common) !== null && _startingEntityType$a !== void 0 && _startingEntityType$a.ResultContext) {
304
- rootEntitySet = this.targetDataModelPath.startingEntitySet;
305
- this.targetDataModelPath.navigationProperties.forEach(function (navObject) {
306
- navigatedPaths.push(navObject.name);
307
- });
308
- }
178
+ if (sAnnotationPath[0] === "/") {
179
+ return sAnnotationPath;
180
+ }
309
181
 
310
- while (i < visitedObjects.length) {
311
- currentObject = visitedObjects[i++];
182
+ return this.baseContextPath + "/" + sAnnotationPath;
183
+ }
184
+ /**
185
+ * Retrieve the current entitySet.
186
+ *
187
+ * @returns The current EntitySet if it exists.
188
+ */
189
+ ;
312
190
 
313
- if (currentObject._type === "NavigationProperty") {
314
- navigatedPaths.push(currentObject.name);
315
- navigationProperties.push(currentObject);
316
- currentEntityType = currentObject.targetType;
191
+ _proto.getEntitySet = function getEntitySet() {
192
+ return this.targetDataModelPath.targetEntitySet;
193
+ }
194
+ /**
195
+ * Retrieve the context path.
196
+ *
197
+ * @returns The context path of the converter.
198
+ */
199
+ ;
317
200
 
318
- if (rootEntitySet && rootEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
319
- var navPath = navigatedPaths.join("/");
320
- rootEntitySet = rootEntitySet.navigationPropertyBinding[currentObject.name] || rootEntitySet.navigationPropertyBinding[navPath];
321
- navigatedPaths = [];
322
- } else {
323
- rootEntitySet = undefined;
324
- }
325
- }
201
+ _proto.getContextPath = function getContextPath() {
202
+ return this.baseContextPath;
203
+ }
204
+ /**
205
+ * Retrieve the current data model object path.
206
+ *
207
+ * @returns The current data model object path
208
+ */
209
+ ;
326
210
 
327
- if (currentObject._type === "EntitySet") {
328
- rootEntitySet = currentObject;
329
- currentEntityType = rootEntitySet.entityType;
330
- }
331
- }
211
+ _proto.getDataModelObjectPath = function getDataModelObjectPath() {
212
+ return this.targetDataModelPath;
213
+ }
214
+ /**
215
+ * Get the EntityContainer.
216
+ *
217
+ * @returns The current service EntityContainer
218
+ */
219
+ ;
332
220
 
333
- var outDataModelPath = {
334
- startingEntitySet: this.targetDataModelPath.startingEntitySet,
335
- targetEntitySet: rootEntitySet,
336
- targetEntityType: currentEntityType,
337
- targetObject: navigationProperties[navigationProperties.length - 1],
338
- navigationProperties: navigationProperties,
339
- contextLocation: this.targetDataModelPath.contextLocation
340
- };
341
- return {
342
- annotation: targetObject.target,
343
- converterContext: new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, outDataModelPath)
344
- };
345
- }
346
- /**
347
- * Retrieve the type of template we're working on (e.g. ListReport / ObjectPage / ...).
348
- *
349
- * @returns The current tenplate type
350
- */
351
-
352
- }, {
353
- key: "getTemplateType",
354
- value: function getTemplateType() {
355
- return this.manifestWrapper.getTemplateType();
221
+ _proto.getEntityContainer = function getEntityContainer() {
222
+ return this.convertedTypes.entityContainer;
223
+ }
224
+ /**
225
+ * Get the EntityType based on the fully qualified name.
226
+ *
227
+ * @returns The current EntityType.
228
+ */
229
+ ;
230
+
231
+ _proto.getEntityType = function getEntityType() {
232
+ return this.targetDataModelPath.targetEntityType;
233
+ }
234
+ /**
235
+ * Gets the entity type of the parameter in case of a parameterized service.
236
+ * @returns {EntityType} The entity type of the parameter
237
+ */
238
+ ;
239
+
240
+ _proto.getParameterEntityType = function getParameterEntityType() {
241
+ var _parameterEntityType$, _parameterEntityType$2;
242
+
243
+ var parameterEntityType = this.targetDataModelPath.startingEntitySet.entityType;
244
+ var isParameterized = !!((_parameterEntityType$ = parameterEntityType.annotations) !== null && _parameterEntityType$ !== void 0 && (_parameterEntityType$2 = _parameterEntityType$.Common) !== null && _parameterEntityType$2 !== void 0 && _parameterEntityType$2.ResultContext);
245
+ return isParameterized && parameterEntityType;
246
+ }
247
+ /**
248
+ * Retrieves an annotation from an entity type based on annotation path.
249
+ *
250
+ * @param annotationPath The annotation path to be evaluated
251
+ * @returns The target annotation path as well as a converter context to go with it
252
+ */
253
+ ;
254
+
255
+ _proto.getEntityTypeAnnotation = function getEntityTypeAnnotation(annotationPath) {
256
+ var _startingEntityType$a;
257
+
258
+ if (annotationPath.indexOf("@") === -1) {
259
+ annotationPath = "@" + annotationPath;
356
260
  }
357
- /**
358
- * Retrieve a relative annotation path between an annotation path and an entity type.
359
- *
360
- * @param annotationPath
361
- * @param entityType
362
- * @returns The relative anntotation path.
363
- */
364
-
365
- }, {
366
- key: "getRelativeAnnotationPath",
367
- value: function getRelativeAnnotationPath(annotationPath, entityType) {
368
- return annotationPath.replace(entityType.fullyQualifiedName, "");
261
+
262
+ var targetObject = this.targetDataModelPath.targetEntityType.resolvePath(annotationPath, true);
263
+ var rootEntitySet = this.targetDataModelPath.targetEntitySet;
264
+ var currentEntityType = this.targetDataModelPath.targetEntityType;
265
+ var startingEntityType = this.targetDataModelPath.startingEntitySet.entityType;
266
+ var navigationProperties = this.targetDataModelPath.navigationProperties.concat();
267
+ var i = 1;
268
+ var currentObject;
269
+ var navigatedPaths = [];
270
+ var visitedObjects = targetObject.visitedObjects; // In case of parameterized service
271
+
272
+ if (!rootEntitySet && (_startingEntityType$a = startingEntityType.annotations.Common) !== null && _startingEntityType$a !== void 0 && _startingEntityType$a.ResultContext) {
273
+ rootEntitySet = this.targetDataModelPath.startingEntitySet;
274
+ this.targetDataModelPath.navigationProperties.forEach(function (navObject) {
275
+ navigatedPaths.push(navObject.name);
276
+ });
369
277
  }
370
- /**
371
- * Transform an entityType based path to an entitySet based one (ui5 templating generally expect an entitySetBasedPath).
372
- *
373
- * @param annotationPath
374
- * @returns The EntitySet based annotation path
375
- */
376
-
377
- }, {
378
- key: "getEntitySetBasedAnnotationPath",
379
- value: function getEntitySetBasedAnnotationPath(annotationPath) {
380
- if (!annotationPath) {
381
- return annotationPath;
382
- }
383
278
 
384
- var entityTypeFQN = this.targetDataModelPath.targetEntityType.fullyQualifiedName;
279
+ while (i < visitedObjects.length) {
280
+ currentObject = visitedObjects[i++];
385
281
 
386
- if (this.targetDataModelPath.targetEntitySet || (this.baseContextPath.startsWith("/") && this.baseContextPath.match(/\//g) || []).length > 1) {
387
- var replacedAnnotationPath = annotationPath.replace(entityTypeFQN, "/");
282
+ if (currentObject._type === "NavigationProperty") {
283
+ navigatedPaths.push(currentObject.name);
284
+ navigationProperties.push(currentObject);
285
+ currentEntityType = currentObject.targetType;
388
286
 
389
- if (replacedAnnotationPath.length > 2 && replacedAnnotationPath[0] === "/" && replacedAnnotationPath[1] === "/") {
390
- replacedAnnotationPath = replacedAnnotationPath.substr(1);
287
+ if (rootEntitySet && rootEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
288
+ var navPath = navigatedPaths.join("/");
289
+ rootEntitySet = rootEntitySet.navigationPropertyBinding[currentObject.name] || rootEntitySet.navigationPropertyBinding[navPath];
290
+ navigatedPaths = [];
291
+ } else {
292
+ rootEntitySet = undefined;
391
293
  }
294
+ }
392
295
 
393
- return this.baseContextPath + (replacedAnnotationPath.startsWith("/") ? replacedAnnotationPath : "/" + replacedAnnotationPath);
394
- } else {
395
- return "/" + annotationPath;
296
+ if (currentObject._type === "EntitySet") {
297
+ rootEntitySet = currentObject;
298
+ currentEntityType = rootEntitySet.entityType;
396
299
  }
397
300
  }
398
- /**
399
- * Retrieve the manifest wrapper for the current context.
400
- *
401
- * @returns The current manifest wrapper
402
- */
403
-
404
- }, {
405
- key: "getManifestWrapper",
406
- value: function getManifestWrapper() {
407
- return this.manifestWrapper;
408
- }
409
- }, {
410
- key: "getDiagnostics",
411
- value: function getDiagnostics() {
412
- return this.diagnostics;
413
- }
414
- /**
415
- * Retrieve the target from an absolute path.
416
- *
417
- * @param {string} path The path we want to get the target
418
- * @returns {ConverterContext}
419
- */
420
-
421
- }, {
422
- key: "resolveAbsolutePath",
423
- value: function resolveAbsolutePath(path) {
424
- return this.convertedTypes.resolvePath(path);
301
+
302
+ var outDataModelPath = {
303
+ startingEntitySet: this.targetDataModelPath.startingEntitySet,
304
+ targetEntitySet: rootEntitySet,
305
+ targetEntityType: currentEntityType,
306
+ targetObject: navigationProperties[navigationProperties.length - 1],
307
+ navigationProperties: navigationProperties,
308
+ contextLocation: this.targetDataModelPath.contextLocation,
309
+ convertedTypes: this.convertedTypes
310
+ };
311
+ return {
312
+ annotation: targetObject.target,
313
+ converterContext: new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, outDataModelPath)
314
+ };
315
+ }
316
+ /**
317
+ * Retrieve the type of template we're working on (e.g. ListReport / ObjectPage / ...).
318
+ *
319
+ * @returns The current tenplate type
320
+ */
321
+ ;
322
+
323
+ _proto.getTemplateType = function getTemplateType() {
324
+ return this.manifestWrapper.getTemplateType();
325
+ }
326
+ /**
327
+ * Retrieve the converted types.
328
+ * @returns The current converted types
329
+ */
330
+ ;
331
+
332
+ _proto.getConvertedTypes = function getConvertedTypes() {
333
+ return this.convertedTypes;
334
+ }
335
+ /**
336
+ * Retrieve a relative annotation path between an annotation path and an entity type.
337
+ *
338
+ * @param annotationPath
339
+ * @param entityType
340
+ * @returns The relative anntotation path.
341
+ */
342
+ ;
343
+
344
+ _proto.getRelativeAnnotationPath = function getRelativeAnnotationPath(annotationPath, entityType) {
345
+ return annotationPath.replace(entityType.fullyQualifiedName, "");
346
+ }
347
+ /**
348
+ * Transform an entityType based path to an entitySet based one (ui5 templating generally expect an entitySetBasedPath).
349
+ *
350
+ * @param annotationPath
351
+ * @returns The EntitySet based annotation path
352
+ */
353
+ ;
354
+
355
+ _proto.getEntitySetBasedAnnotationPath = function getEntitySetBasedAnnotationPath(annotationPath) {
356
+ if (!annotationPath) {
357
+ return annotationPath;
425
358
  }
426
- /**
427
- * Retrieve a new converter context, scoped for a different context path.
428
- *
429
- * @param {string} contextPath The path we want to orchestrate the converter context around
430
- * @returns {ConverterContext}
431
- */
432
-
433
- }, {
434
- key: "getConverterContextFor",
435
- value: function getConverterContextFor(contextPath) {
436
- var resolvedMetaPath = this.convertedTypes.resolvePath(contextPath);
437
- var targetPath = getDataModelPathForEntitySet(resolvedMetaPath);
438
- return new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, targetPath);
359
+
360
+ var entityTypeFQN = this.targetDataModelPath.targetEntityType.fullyQualifiedName;
361
+
362
+ if (this.targetDataModelPath.targetEntitySet || (this.baseContextPath.startsWith("/") && this.baseContextPath.match(/\//g) || []).length > 1) {
363
+ var replacedAnnotationPath = annotationPath.replace(entityTypeFQN, "/");
364
+
365
+ if (replacedAnnotationPath.length > 2 && replacedAnnotationPath[0] === "/" && replacedAnnotationPath[1] === "/") {
366
+ replacedAnnotationPath = replacedAnnotationPath.substr(1);
367
+ }
368
+
369
+ return this.baseContextPath + (replacedAnnotationPath.startsWith("/") ? replacedAnnotationPath : "/" + replacedAnnotationPath);
370
+ } else {
371
+ return "/" + annotationPath;
439
372
  }
440
- /**
441
- * Get all annotations of a given term and vocabulary on an entity type
442
- * (or on the current entity type if entityType isn't specified).
443
- *
444
- * @param vocabularyName
445
- * @param annotationTerm
446
- * @param [annotationSources]
447
- * @returns All the annotation for a specific term and vocabulary from an entity type
448
- */
449
-
450
- }, {
451
- key: "getAnnotationsByTerm",
452
- value: function getAnnotationsByTerm(vocabularyName, annotationTerm) {
453
- var annotationSources = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [this.getEntityType()];
454
- var outAnnotations = [];
455
- annotationSources.forEach(function (annotationSource) {
456
- if (annotationSource) {
457
- var annotations = (annotationSource === null || annotationSource === void 0 ? void 0 : annotationSource.annotations[vocabularyName]) || {};
458
-
459
- if (annotations) {
460
- outAnnotations = Object.keys(annotations).filter(function (annotation) {
461
- return annotations[annotation].term === annotationTerm;
462
- }).reduce(function (previousValue, key) {
463
- previousValue.push(annotations[key]);
464
- return previousValue;
465
- }, outAnnotations);
466
- }
373
+ }
374
+ /**
375
+ * Retrieve the manifest wrapper for the current context.
376
+ *
377
+ * @returns The current manifest wrapper
378
+ */
379
+ ;
380
+
381
+ _proto.getManifestWrapper = function getManifestWrapper() {
382
+ return this.manifestWrapper;
383
+ };
384
+
385
+ _proto.getDiagnostics = function getDiagnostics() {
386
+ return this.diagnostics;
387
+ }
388
+ /**
389
+ * Retrieve the target from an absolute path.
390
+ *
391
+ * @param {string} path The path we want to get the target
392
+ * @returns {ConverterContext}
393
+ */
394
+ ;
395
+
396
+ _proto.resolveAbsolutePath = function resolveAbsolutePath(path) {
397
+ return this.convertedTypes.resolvePath(path);
398
+ }
399
+ /**
400
+ * Retrieve a new converter context, scoped for a different context path.
401
+ *
402
+ * @param {string} contextPath The path we want to orchestrate the converter context around
403
+ * @returns {ConverterContext}
404
+ */
405
+ ;
406
+
407
+ _proto.getConverterContextFor = function getConverterContextFor(contextPath) {
408
+ var resolvedMetaPath = this.convertedTypes.resolvePath(contextPath);
409
+ var targetPath = getDataModelPathForEntitySet(resolvedMetaPath, this.convertedTypes);
410
+ return new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, targetPath);
411
+ }
412
+ /**
413
+ * Get all annotations of a given term and vocabulary on an entity type
414
+ * (or on the current entity type if entityType isn't specified).
415
+ *
416
+ * @param vocabularyName
417
+ * @param annotationTerm
418
+ * @param [annotationSources]
419
+ * @returns All the annotation for a specific term and vocabulary from an entity type
420
+ */
421
+ ;
422
+
423
+ _proto.getAnnotationsByTerm = function getAnnotationsByTerm(vocabularyName, annotationTerm) {
424
+ var annotationSources = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [this.getEntityType()];
425
+ var outAnnotations = [];
426
+ annotationSources.forEach(function (annotationSource) {
427
+ if (annotationSource) {
428
+ var annotations = (annotationSource === null || annotationSource === void 0 ? void 0 : annotationSource.annotations[vocabularyName]) || {};
429
+
430
+ if (annotations) {
431
+ outAnnotations = Object.keys(annotations).filter(function (annotation) {
432
+ return annotations[annotation].term === annotationTerm;
433
+ }).reduce(function (previousValue, key) {
434
+ previousValue.push(annotations[key]);
435
+ return previousValue;
436
+ }, outAnnotations);
467
437
  }
468
- });
469
- return outAnnotations;
470
- }
471
- /**
472
- * Retrieves the relative model path based on the current context path.
473
- *
474
- * @returns {string|undefined} The relative model path or undefined if the path is not resolveable
475
- */
476
-
477
- }, {
478
- key: "getRelativeModelPathFunction",
479
- value: function getRelativeModelPathFunction() {
480
- var targetDataModelPath = this.targetDataModelPath;
481
- return function (sPath) {
482
- var enhancedPath = enhanceDataModelPath(targetDataModelPath, sPath);
483
- return getContextRelativeTargetObjectPath(enhancedPath, true);
438
+ }
439
+ });
440
+ return outAnnotations;
441
+ }
442
+ /**
443
+ * Retrieves the relative model path based on the current context path.
444
+ *
445
+ * @returns {string|undefined} The relative model path or undefined if the path is not resolveable
446
+ */
447
+ ;
448
+
449
+ _proto.getRelativeModelPathFunction = function getRelativeModelPathFunction() {
450
+ var targetDataModelPath = this.targetDataModelPath;
451
+ return function (sPath) {
452
+ var enhancedPath = enhanceDataModelPath(targetDataModelPath, sPath);
453
+ return getContextRelativeTargetObjectPath(enhancedPath, true);
454
+ };
455
+ }
456
+ /**
457
+ * Create the converter context necessary for a macro based on a metamodel context.
458
+ * @param sEntitySetName
459
+ * @param oMetaModelContext
460
+ * @param diagnostics
461
+ * @param mergeFn
462
+ * @param targetDataModelPath
463
+ * @param manifestSettings
464
+ * @returns {ConverterContext} The current converter context
465
+ */
466
+ ;
467
+
468
+ ConverterContext.createConverterContextForMacro = function createConverterContextForMacro(sEntitySetName, oMetaModelContext, diagnostics, mergeFn, targetDataModelPath) {
469
+ var manifestSettings = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
470
+ var oMetaModel = oMetaModelContext.isA("sap.ui.model.odata.v4.ODataMetaModel") ? oMetaModelContext : oMetaModelContext.getModel();
471
+ var oConverterOutput = convertTypes(oMetaModel);
472
+ var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
473
+ return entitySet.name === sEntitySetName;
474
+ });
475
+
476
+ if (!targetDataModelPath) {
477
+ targetDataModelPath = {
478
+ startingEntitySet: targetEntitySet,
479
+ navigationProperties: [],
480
+ targetEntitySet: targetEntitySet,
481
+ targetEntityType: targetEntitySet.entityType,
482
+ targetObject: targetEntitySet,
483
+ convertedTypes: oConverterOutput
484
484
  };
485
485
  }
486
- /**
487
- * Create the converter context necessary for a macro based on a metamodel context.
488
- * @param sEntitySetName
489
- * @param oMetaModelContext
490
- * @param diagnostics
491
- * @param mergeFn
492
- * @param targetDataModelPath
493
- * @param manifestSettings
494
- * @returns {ConverterContext} The current converter context
495
- */
496
-
497
- }], [{
498
- key: "createConverterContextForMacro",
499
- value: function createConverterContextForMacro(sEntitySetName, oMetaModelContext, diagnostics, mergeFn, targetDataModelPath) {
500
- var manifestSettings = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
501
- var oMetaModel = oMetaModelContext.isA("sap.ui.model.odata.v4.ODataMetaModel") ? oMetaModelContext : oMetaModelContext.getModel();
502
- var oConverterOutput = convertTypes(oMetaModel);
503
- var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
504
- return entitySet.name === sEntitySetName;
505
- });
506
486
 
507
- if (!targetDataModelPath) {
508
- targetDataModelPath = {
509
- startingEntitySet: targetEntitySet,
510
- navigationProperties: [],
511
- targetEntitySet: targetEntitySet,
512
- targetEntityType: targetEntitySet.entityType,
513
- targetObject: targetEntitySet
514
- };
515
- }
516
-
517
- return new ConverterContext(oConverterOutput, manifestSettings, diagnostics, mergeFn, targetDataModelPath);
518
- }
519
- }]);
487
+ return new ConverterContext(oConverterOutput, manifestSettings, diagnostics, mergeFn, targetDataModelPath);
488
+ };
520
489
 
521
490
  return ConverterContext;
522
491
  }();
523
492
 
524
493
  return ConverterContext;
525
494
  }, false);
526
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiaXNBbm5vdGF0aW9uVGVybSIsInZBbm5vdGF0aW9uUGF0aCIsImlzU2VydmljZU9iamVjdCIsIm9iamVjdFBhcnQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQiLCJyZXNvbHZlZE1ldGFQYXRoIiwicm9vdEVudGl0eVNldCIsImN1cnJlbnRFbnRpdHlTZXQiLCJwcmV2aW91c0VudGl0eVNldCIsImN1cnJlbnRFbnRpdHlUeXBlIiwibmF2aWdhdGVkUGF0aHMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsIm9iamVjdFBhdGgiLCJmb3JFYWNoIiwiX3R5cGUiLCJwdXNoIiwibmFtZSIsInRhcmdldFR5cGUiLCJuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nIiwiam9pbiIsInVuZGVmaW5lZCIsImVudGl0eVR5cGUiLCJkYXRhTW9kZWxQYXRoIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwidGFyZ2V0RW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0IiwiQ29udmVydGVyQ29udGV4dCIsImNvbnZlcnRlZFR5cGVzIiwibWFuaWZlc3RTZXR0aW5ncyIsImRpYWdub3N0aWNzIiwibWVyZ2VGbiIsInRhcmdldERhdGFNb2RlbFBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJNYW5pZmVzdFdyYXBwZXIiLCJiYXNlQ29udGV4dFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwic3RhcnRzV2l0aCIsInJlcGxhY2VBbm5vdGF0aW9uIiwicmVwbGFjZSIsImFubm90YXRpb24iLCJhbm5vdGF0aW9uUGF0aCIsIl9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZSIsIkVycm9yIiwiZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJzQW5ub3RhdGlvblBhdGgiLCJlbnRpdHlDb250YWluZXIiLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwicGFyYW1ldGVyRW50aXR5VHlwZSIsImlzUGFyYW1ldGVyaXplZCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiUmVzdWx0Q29udGV4dCIsImluZGV4T2YiLCJyZXNvbHZlUGF0aCIsInN0YXJ0aW5nRW50aXR5VHlwZSIsImNvbmNhdCIsImkiLCJjdXJyZW50T2JqZWN0IiwidmlzaXRlZE9iamVjdHMiLCJuYXZPYmplY3QiLCJsZW5ndGgiLCJuYXZQYXRoIiwib3V0RGF0YU1vZGVsUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRUZW1wbGF0ZVR5cGUiLCJlbnRpdHlUeXBlRlFOIiwibWF0Y2giLCJyZXBsYWNlZEFubm90YXRpb25QYXRoIiwic3Vic3RyIiwicGF0aCIsImNvbnRleHRQYXRoIiwidGFyZ2V0UGF0aCIsInZvY2FidWxhcnlOYW1lIiwiYW5ub3RhdGlvblRlcm0iLCJhbm5vdGF0aW9uU291cmNlcyIsImdldEVudGl0eVR5cGUiLCJvdXRBbm5vdGF0aW9ucyIsImFubm90YXRpb25Tb3VyY2UiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwidGVybSIsInJlZHVjZSIsInByZXZpb3VzVmFsdWUiLCJrZXkiLCJzUGF0aCIsImVuaGFuY2VkUGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsInNFbnRpdHlTZXROYW1lIiwib01ldGFNb2RlbENvbnRleHQiLCJvTWV0YU1vZGVsIiwiaXNBIiwiZ2V0TW9kZWwiLCJvQ29udmVydGVyT3V0cHV0IiwiY29udmVydFR5cGVzIiwiZW50aXR5U2V0cyIsImVudGl0eVNldCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLGdCQUFnQixHQUFHLFVBQVNDLGVBQVQs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QUFNQyxnQkFBZ0IsR0FBR0MsWUFBWSxDQUFDSixVQUFELENBQXJDO0FBQ0EsWUFBTXpFLGVBQWUsR0FBRzRFLGdCQUFnQixDQUFDRSxVQUFqQixDQUE0QjlELElBQTVCLENBQWlDLFVBQUErRCxTQUFTO0FBQUEsaUJBQUlBLFNBQVMsQ0FBQ3hGLElBQVYsS0FBbUJnRixjQUF2QjtBQUFBLFNBQTFDLENBQXhCOztBQUNBLFlBQUksQ0FBQzlELG1CQUFMLEVBQTBCO0FBQ3pCQSxVQUFBQSxtQkFBbUIsR0FBRztBQUNyQlgsWUFBQUEsaUJBQWlCLEVBQUVFLGVBREU7QUFFckJkLFlBQUFBLG9CQUFvQixFQUFFLEVBRkQ7QUFHckJjLFlBQUFBLGVBQWUsRUFBRUEsZUFISTtBQUlyQkQsWUFBQUEsZ0JBQWdCLEVBQUVDLGVBQWUsQ0FBQ0osVUFKYjtBQUtyQk0sWUFBQUEsWUFBWSxFQUFFRjtBQUxPLFdBQXRCO0FBT0E7O0FBQ0QsZUFBTyxJQUFJSSxnQkFBSixDQUFxQndFLGdCQUFyQixFQUF1Q3RFLGdCQUF2QyxFQUF5REMsV0FBekQsRUFBc0VDLE9BQXRFLEVBQStFQyxtQkFBL0UsQ0FBUDtBQUNBOzs7Ozs7U0FHYUwsZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25UZXJtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBbnlBbm5vdGF0aW9uLFxuXHRDb252ZXJ0ZXJPdXRwdXQsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0RW50aXR5Q29udGFpbmVyLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdFNlcnZpY2VPYmplY3QsXG5cdFNpbmdsZXRvbixcblx0UmVzb2x1dGlvblRhcmdldCxcblx0U2VydmljZU9iamVjdEFuZEFubm90YXRpb25cbn0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IEJhc2VNYW5pZmVzdFNldHRpbmdzLCBUZW1wbGF0ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIFJlc29sdmVkVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBJRGlhZ25vc3RpY3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHtcblx0RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0ZW5oYW5jZURhdGFNb2RlbFBhdGgsXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgRW50aXR5VHlwZUFubm90YXRpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL2dlbmVyYXRlZC9FZG1fVHlwZXNcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RXcmFwcGVyXCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkQW5ub3RhdGlvbkNvbnRleHQgPSB7XG5cdGFubm90YXRpb246IEFueUFubm90YXRpb247XG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBhbm5vdGF0aW9uIHRlcm0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QW5ub3RhdGlvblRlcm08b2JqZWN0Pn0gdkFubm90YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNBbm5vdGF0aW9uVGVybSA9IGZ1bmN0aW9uKHZBbm5vdGF0aW9uUGF0aDogc3RyaW5nIHwgQW5ub3RhdGlvblRlcm08YW55Pik6IHZBbm5vdGF0aW9uUGF0aCBpcyBBbm5vdGF0aW9uVGVybTxhbnk+IHtcblx0cmV0dXJuIHR5cGVvZiB2QW5ub3RhdGlvblBhdGggPT09IFwib2JqZWN0XCI7XG59O1xuXG5mdW5jdGlvbiBpc1NlcnZpY2VPYmplY3Qob2JqZWN0UGFydDogU2VydmljZU9iamVjdEFuZEFubm90YXRpb24pOiBvYmplY3RQYXJ0IGlzIFNlcnZpY2VPYmplY3Qge1xuXHRyZXR1cm4gb2JqZWN0UGFydCAmJiBvYmplY3RQYXJ0Lmhhc093blByb3BlcnR5KFwiX3R5cGVcIik7XG59XG5cbmNvbnN0IGdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQgPSBmdW5jdGlvbihyZXNvbHZlZE1ldGFQYXRoOiBSZXNvbHV0aW9uVGFyZ2V0PGFueT4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0bGV0IHJvb3RFbnRpdHlTZXQ6IEVudGl0eVNldCB8IHVuZGVmaW5lZDtcblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IHVuZGVmaW5lZDtcblx0bGV0IHByZXZpb3VzRW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZDtcblx0bGV0IG5hdmlnYXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBbXTtcblx0cmVzb2x2ZWRNZXRhUGF0aC5vYmplY3RQYXRoLmZvckVhY2goKG9iamVjdFBhcnQ6IFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uKSA9PiB7XG5cdFx0aWYgKGlzU2VydmljZU9iamVjdChvYmplY3RQYXJ0KSkge1xuXHRcdFx0c3dpdGNoIChvYmplY3RQYXJ0Ll90eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJOYXZpZ2F0aW9uUHJvcGVydHlcIjpcblx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG9iamVjdFBhcnQubmFtZSk7XG5cdFx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChvYmplY3RQYXJ0KTtcblx0XHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IG9iamVjdFBhcnQudGFyZ2V0VHlwZTtcblx0XHRcdFx0XHRpZiAocHJldmlvdXNFbnRpdHlTZXQgJiYgcHJldmlvdXNFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBwcmV2aW91c0VudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW25hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpXTtcblx0XHRcdFx0XHRcdHByZXZpb3VzRW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0XHRcdG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRW50aXR5U2V0XCI6XG5cdFx0XHRcdFx0aWYgKHJvb3RFbnRpdHlTZXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cm9vdEVudGl0eVNldCA9IG9iamVjdFBhcnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBvYmplY3RQYXJ0O1xuXHRcdFx0XHRcdHByZXZpb3VzRW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IGN1cnJlbnRFbnRpdHlTZXQ/LmVudGl0eVR5cGU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgZGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogcm9vdEVudGl0eVNldCBhcyBFbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSxcblx0XHR0YXJnZXRFbnRpdHlTZXQ6IGN1cnJlbnRFbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdGNvbnRleHRMb2NhdGlvbjogdW5kZWZpbmVkLFxuXHRcdHRhcmdldE9iamVjdDogcmVzb2x2ZWRNZXRhUGF0aC50YXJnZXRcblx0fTtcblx0ZGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24gPSBkYXRhTW9kZWxQYXRoO1xuXHRyZXR1cm4gZGF0YU1vZGVsUGF0aDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29udmVydGVyQ29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBjb252ZXJ0ZXJzLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyT3V0cHV0fSBvQ29udmVydGVkVHlwZXMgVGhlIGNvbnZlcnRlZCBhbm5vdGF0aW9uIGFuZCBzZXJ2aWNlIHR5cGVzXG4gKiBAcGFyYW0ge0Jhc2VNYW5pZmVzdFNldHRpbmdzfSBvTWFuaWZlc3RTZXR0aW5ncyBUaGUgbWFuaWZlc3RTZXR0aW5ncyB0aGF0IGFwcGxpZXMgdG8gdGhpcyBwYWdlXG4gKiBAcGFyYW0ge1RlbXBsYXRlVHlwZX0gdGVtcGxhdGVUeXBlIFRoZSB0eXBlIG9mIHRlbXBsYXRlIHdlJ3JlIGxvb2tpbmcgYXQgcmlnaHQgbm93XG4gKiBAcGFyYW0ge0lTaGVsbFNlcnZpY2VzUHJveHl9IHNoZWxsU2VydmljZXMgVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIHNoZWxsc2VydmljZVxuICogQHBhcmFtIHtJRGlhZ25vc3RpY3N9IGRpYWdub3N0aWNzIFRoZSBkaWFnbm9zdGljcyBzaGltXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZuIFRoZSBmdW5jdGlvbiB0byBiZSB1c2VkIHRvIHBlcmZvbSBzb21lIGRlZXAgbWVyZ2VzIGJldHdlZW4gb2JqZWN0XG4gKiBAcGFyYW0ge0RhdGFNb2RlbE9iamVjdFBhdGh9IHRhcmdldERhdGFNb2RlbFBhdGggVGhlIGdsb2JhbCBwYXRoIHRvIHJlYWNoIHRoZSBlbnRpdHlTZXRcbiAqXG4gKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH0gQSBjb252ZXJ0ZXIgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlcnNcbiAqL1xuY2xhc3MgQ29udmVydGVyQ29udGV4dCB7XG5cdHByaXZhdGUgbWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXI7XG5cdHByaXZhdGUgYmFzZUNvbnRleHRQYXRoOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBjb252ZXJ0ZWRUeXBlczogQ29udmVydGVyT3V0cHV0LFxuXHRcdHByaXZhdGUgbWFuaWZlc3RTZXR0aW5nczogQmFzZU1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0cHJpdmF0ZSBkaWFnbm9zdGljczogSURpYWdub3N0aWNzLFxuXHRcdHByaXZhdGUgbWVyZ2VGbjogRnVuY3Rpb24sXG5cdFx0cHJpdmF0ZSB0YXJnZXREYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoXG5cdCkge1xuXHRcdHRoaXMubWFuaWZlc3RXcmFwcGVyID0gbmV3IE1hbmlmZXN0V3JhcHBlcih0aGlzLm1hbmlmZXN0U2V0dGluZ3MsIG1lcmdlRm4pO1xuXHRcdHRoaXMuYmFzZUNvbnRleHRQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aCh0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMge1Byb3BlcnR5fSBUaGUgcHJvcGVydHkgRW50aXR5VHlwZSBiYXNlZFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GdWxseVF1YWxpZmllZE5hbWUoZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gdGhpcy5jb252ZXJ0ZWRUeXBlcy5lbnRpdHlUeXBlcy5maW5kKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0aWYgKGZ1bGx5UXVhbGlmaWVkTmFtZS5zdGFydHNXaXRoKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lKSkge1xuXHRcdFx0XHRjb25zdCByZXBsYWNlQW5ub3RhdGlvbiA9IGZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKTtcblx0XHRcdFx0cmV0dXJuIHJlcGxhY2VBbm5vdGF0aW9uLnN0YXJ0c1dpdGgoXCIvXCIpIHx8IHJlcGxhY2VBbm5vdGF0aW9uLnN0YXJ0c1dpdGgoXCJAXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHRcdHJldHVybiB0YXJnZXRFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBlbnRpdHlUeXBlIGFzc29jaWF0ZWQgd2l0aCBhbiBhbm5vdGF0aW9uIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24gb2JqZWN0IGZvciB3aGljaCB3ZSB3YW50IHRvIGZpbmQgdGhlIGVudGl0eVR5cGVcblx0ICogQHJldHVybnMge0VudGl0eVR5cGV9IFRoZSBFbnRpdHlUeXBlIHRoZSBhbm5vdGF0aW9uIHJlZmVycyB0b1xuXHQgKi9cblx0Z2V0QW5ub3RhdGlvbkVudGl0eVR5cGUoYW5ub3RhdGlvbj86IEFubm90YXRpb25UZXJtPGFueT4pOiBFbnRpdHlUeXBlIHtcblx0XHRpZiAoYW5ub3RhdGlvbikge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSB0aGlzLl9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZShhbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRpZiAoIXRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgRW50aXR5IFR5cGUgZm9yIFwiICsgYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldEVudGl0eVR5cGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIG1hbmlmZXN0IHNldHRpbmdzIGRlZmluZWQgZm9yIGEgc3BlY2lmaWMgY29udHJvbCB3aXRoaW4gY29udHJvbENvbmZpZ3VyYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB2QW5ub3RhdGlvblBhdGggVGhlIGFubm90YXRpb24gcGF0aCBvciBvYmplY3QgdG8gZXZhbHVhdGVcblx0ICogQHJldHVybnMgVGhlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBhbm50b2F0aW9uIHBhdGggaWYgaXQgZXhpc3RzXG5cdCAqL1xuXHRnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZBbm5vdGF0aW9uUGF0aDogc3RyaW5nIHwgQW5ub3RhdGlvblRlcm08YW55Pik6IGFueSB7XG5cdFx0aWYgKGlzQW5ub3RhdGlvblRlcm0odkFubm90YXRpb25QYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWFuaWZlc3RXcmFwcGVyLmdldENvbnRyb2xDb25maWd1cmF0aW9uKFxuXHRcdFx0XHR2QW5ub3RhdGlvblBhdGguZnVsbHlRdWFsaWZpZWROYW1lLnJlcGxhY2UodGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubWFuaWZlc3RXcmFwcGVyLmdldENvbnRyb2xDb25maWd1cmF0aW9uKHZBbm5vdGF0aW9uUGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGFic29sdXRlIGFubm90YXRpb24gcGF0aCBiYXNlZCBvbiB0aGUgY3VycmVudCBtZXRhIG1vZGVsIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQW5ub3RhdGlvblBhdGggVGhlIHJlbGF0aXZlIGFubm90YXRpb24gcGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdCBhbm5vdGF0aW9uIHBhdGggYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChzQW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0aWYgKCFzQW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdHJldHVybiBzQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdGlmIChzQW5ub3RhdGlvblBhdGhbMF0gPT09IFwiL1wiKSB7XG5cdFx0XHRyZXR1cm4gc0Fubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGggKyBcIi9cIiArIHNBbm5vdGF0aW9uUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBlbnRpdHlTZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEVudGl0eVNldCBpZiBpdCBleGlzdHMuXG5cdCAqL1xuXHRnZXRFbnRpdHlTZXQoKTogRW50aXR5U2V0IHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBjb252ZXJ0ZXIuXG5cdCAqL1xuXHRnZXRDb250ZXh0UGF0aCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBkYXRhIG1vZGVsIG9iamVjdCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBkYXRhIG1vZGVsIG9iamVjdCBwYXRoXG5cdCAqL1xuXHRnZXREYXRhTW9kZWxPYmplY3RQYXRoKCk6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBFbnRpdHlDb250YWluZXIuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNlcnZpY2UgRW50aXR5Q29udGFpbmVyXG5cdCAqL1xuXHRnZXRFbnRpdHlDb250YWluZXIoKTogRW50aXR5Q29udGFpbmVyIHtcblx0XHRyZXR1cm4gdGhpcy5jb252ZXJ0ZWRUeXBlcy5lbnRpdHlDb250YWluZXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgRW50aXR5VHlwZS5cblx0ICovXG5cdGdldEVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYSBzaW5nbGV0b24gYmFzZWQgb24gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2luZ2xldG9uXG5cdCAqIEByZXR1cm5zIHtTaW5nbGV0b24gfCB1bmRlZmluZWR9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuXG5cdCAqL1xuXHRnZXRTaW5nbGV0b24oZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBTaW5nbGV0b24gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLnNpbmdsZXRvbnMuZmluZChzaW5nbGV0b24gPT4gc2luZ2xldG9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBwYXJhbWV0ZXJpemVkIHNlcnZpY2UuXG5cdCAqIEByZXR1cm5zIHtFbnRpdHlUeXBlfSBUaGUgZW50aXR5IHR5cGUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKi9cblx0Z2V0UGFyYW1ldGVyRW50aXR5VHlwZSgpOiBFbnRpdHlUeXBlIHtcblx0XHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0Y29uc3QgaXNQYXJhbWV0ZXJpemVkID0gISFwYXJhbWV0ZXJFbnRpdHlUeXBlLmFubm90YXRpb25zPy5Db21tb24/LlJlc3VsdENvbnRleHQ7XG5cdFx0cmV0dXJuIChpc1BhcmFtZXRlcml6ZWQgJiYgcGFyYW1ldGVyRW50aXR5VHlwZSkgYXMgRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYW4gYW5ub3RhdGlvbiBmcm9tIGFuIGVudGl0eSB0eXBlIGJhc2VkIG9uIGFubm90YXRpb24gcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb25QYXRoIFRoZSBhbm5vdGF0aW9uIHBhdGggdG8gYmUgZXZhbHVhdGVkXG5cdCAqIEByZXR1cm5zIFRoZSB0YXJnZXQgYW5ub3RhdGlvbiBwYXRoIGFzIHdlbGwgYXMgYSBjb252ZXJ0ZXIgY29udGV4dCB0byBnbyB3aXRoIGl0XG5cdCAqL1xuXHRnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihhbm5vdGF0aW9uUGF0aDogc3RyaW5nKTogUmVzb2x2ZWRBbm5vdGF0aW9uQ29udGV4dCB7XG5cdFx0aWYgKGFubm90YXRpb25QYXRoLmluZGV4T2YoXCJAXCIpID09PSAtMSkge1xuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBcIkBcIiArIGFubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRjb25zdCB0YXJnZXRPYmplY3Q6IFJlc29sdmVkVGFyZ2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoYW5ub3RhdGlvblBhdGgsIHRydWUpO1xuXG5cdFx0bGV0IHJvb3RFbnRpdHlTZXQgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0O1xuXHRcdGxldCBjdXJyZW50RW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IHN0YXJ0aW5nRW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmNvbmNhdCgpO1xuXHRcdGxldCBpID0gMTtcblx0XHRsZXQgY3VycmVudE9iamVjdDtcblx0XHRsZXQgbmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0XHRjb25zdCB2aXNpdGVkT2JqZWN0cyA9IHRhcmdldE9iamVjdC52aXNpdGVkT2JqZWN0cztcblx0XHQvLyBJbiBjYXNlIG9mIHBhcmFtZXRlcml6ZWQgc2VydmljZVxuXHRcdGlmICghcm9vdEVudGl0eVNldCAmJiBzdGFydGluZ0VudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5SZXN1bHRDb250ZXh0KSB7XG5cdFx0XHRyb290RW50aXR5U2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0O1xuXHRcdFx0dGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24obmF2T2JqZWN0KSB7XG5cdFx0XHRcdG5hdmlnYXRlZFBhdGhzLnB1c2gobmF2T2JqZWN0Lm5hbWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHdoaWxlIChpIDwgdmlzaXRlZE9iamVjdHMubGVuZ3RoKSB7XG5cdFx0XHRjdXJyZW50T2JqZWN0ID0gdmlzaXRlZE9iamVjdHNbaSsrXTtcblx0XHRcdGlmIChjdXJyZW50T2JqZWN0Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdG5hdmlnYXRlZFBhdGhzLnB1c2goY3VycmVudE9iamVjdC5uYW1lKTtcblx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChjdXJyZW50T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSk7XG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gKGN1cnJlbnRPYmplY3QgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlO1xuXHRcdFx0XHRpZiAocm9vdEVudGl0eVNldCAmJiByb290RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2UGF0aCA9IG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPVxuXHRcdFx0XHRcdFx0cm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW2N1cnJlbnRPYmplY3QubmFtZV0gfHwgcm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW25hdlBhdGhdO1xuXHRcdFx0XHRcdG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm9vdEVudGl0eVNldCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRPYmplY3QuX3R5cGUgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdFx0cm9vdEVudGl0eVNldCA9IGN1cnJlbnRPYmplY3QgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IHJvb3RFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qgb3V0RGF0YU1vZGVsUGF0aCA9IHtcblx0XHRcdHN0YXJ0aW5nRW50aXR5U2V0OiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQsXG5cdFx0XHR0YXJnZXRFbnRpdHlTZXQ6IHJvb3RFbnRpdHlTZXQsXG5cdFx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHRcdHRhcmdldE9iamVjdDogbmF2aWdhdGlvblByb3BlcnRpZXNbbmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0sXG5cdFx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGNvbnRleHRMb2NhdGlvbjogdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvblxuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFubm90YXRpb246IHRhcmdldE9iamVjdC50YXJnZXQgYXMgQW55QW5ub3RhdGlvbixcblx0XHRcdGNvbnZlcnRlckNvbnRleHQ6IG5ldyBDb252ZXJ0ZXJDb250ZXh0KFxuXHRcdFx0XHR0aGlzLmNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdHRoaXMuZGlhZ25vc3RpY3MsXG5cdFx0XHRcdHRoaXMubWVyZ2VGbixcblx0XHRcdFx0b3V0RGF0YU1vZGVsUGF0aFxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgd29ya2luZyBvbiAoZS5nLiBMaXN0UmVwb3J0IC8gT2JqZWN0UGFnZSAvIC4uLikuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRlbnBsYXRlIHR5cGVcblx0ICovXG5cdGdldFRlbXBsYXRlVHlwZSgpOiBUZW1wbGF0ZVR5cGUge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIHJlbGF0aXZlIGFubm90YXRpb24gcGF0aCBiZXR3ZWVuIGFuIGFubm90YXRpb24gcGF0aCBhbmQgYW4gZW50aXR5IHR5cGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aFxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgYW5udG90YXRpb24gcGF0aC5cblx0ICovXG5cdGdldFJlbGF0aXZlQW5ub3RhdGlvblBhdGgoYW5ub3RhdGlvblBhdGg6IHN0cmluZywgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25QYXRoLnJlcGxhY2UoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybSBhbiBlbnRpdHlUeXBlIGJhc2VkIHBhdGggdG8gYW4gZW50aXR5U2V0IGJhc2VkIG9uZSAodWk1IHRlbXBsYXRpbmcgZ2VuZXJhbGx5IGV4cGVjdCBhbiBlbnRpdHlTZXRCYXNlZFBhdGgpLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcblx0ICogQHJldHVybnMgVGhlIEVudGl0eVNldCBiYXNlZCBhbm5vdGF0aW9uIHBhdGhcblx0ICovXG5cdGdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0aWYgKCFhbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlRlFOID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdGlmIChcblx0XHRcdHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQgfHxcblx0XHRcdCgodGhpcy5iYXNlQ29udGV4dFBhdGguc3RhcnRzV2l0aChcIi9cIikgJiYgdGhpcy5iYXNlQ29udGV4dFBhdGgubWF0Y2goL1xcLy9nKSkgfHwgW10pLmxlbmd0aCA+IDFcblx0XHQpIHtcblx0XHRcdGxldCByZXBsYWNlZEFubm90YXRpb25QYXRoID0gYW5ub3RhdGlvblBhdGgucmVwbGFjZShlbnRpdHlUeXBlRlFOLCBcIi9cIik7XG5cdFx0XHRpZiAocmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5sZW5ndGggPiAyICYmIHJlcGxhY2VkQW5ub3RhdGlvblBhdGhbMF0gPT09IFwiL1wiICYmIHJlcGxhY2VkQW5ub3RhdGlvblBhdGhbMV0gPT09IFwiL1wiKSB7XG5cdFx0XHRcdHJlcGxhY2VkQW5ub3RhdGlvblBhdGggPSByZXBsYWNlZEFubm90YXRpb25QYXRoLnN1YnN0cigxKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aCArIChyZXBsYWNlZEFubm90YXRpb25QYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCA6IFwiL1wiICsgcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIi9cIiArIGFubm90YXRpb25QYXRoO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgbWFuaWZlc3Qgd3JhcHBlciBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgbWFuaWZlc3Qgd3JhcHBlclxuXHQgKi9cblx0Z2V0TWFuaWZlc3RXcmFwcGVyKCk6IE1hbmlmZXN0V3JhcHBlciB7XG5cdFx0cmV0dXJuIHRoaXMubWFuaWZlc3RXcmFwcGVyO1xuXHR9XG5cblx0Z2V0RGlhZ25vc3RpY3MoKTogSURpYWdub3N0aWNzIHtcblx0XHRyZXR1cm4gdGhpcy5kaWFnbm9zdGljcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgdGFyZ2V0IGZyb20gYW4gYWJzb2x1dGUgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggd2Ugd2FudCB0byBnZXQgdGhlIHRhcmdldFxuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH1cblx0ICovXG5cdHJlc29sdmVBYnNvbHV0ZVBhdGg8VD4ocGF0aDogc3RyaW5nKTogUmVzb2x1dGlvblRhcmdldDxUPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGgocGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBuZXcgY29udmVydGVyIGNvbnRleHQsIHNjb3BlZCBmb3IgYSBkaWZmZXJlbnQgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dFBhdGggVGhlIHBhdGggd2Ugd2FudCB0byBvcmNoZXN0cmF0ZSB0aGUgY29udmVydGVyIGNvbnRleHQgYXJvdW5kXG5cdCAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fVxuXHQgKi9cblx0Z2V0Q29udmVydGVyQ29udGV4dEZvcjxUPihjb250ZXh0UGF0aDogc3RyaW5nKTogQ29udmVydGVyQ29udGV4dCB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRNZXRhUGF0aDogUmVzb2x1dGlvblRhcmdldDxUPiA9IHRoaXMuY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGgoY29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldFBhdGggPSBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0KHJlc29sdmVkTWV0YVBhdGgpO1xuXHRcdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dCh0aGlzLmNvbnZlcnRlZFR5cGVzLCB0aGlzLm1hbmlmZXN0U2V0dGluZ3MsIHRoaXMuZGlhZ25vc3RpY3MsIHRoaXMubWVyZ2VGbiwgdGFyZ2V0UGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCBhbm5vdGF0aW9ucyBvZiBhIGdpdmVuIHRlcm0gYW5kIHZvY2FidWxhcnkgb24gYW4gZW50aXR5IHR5cGVcblx0ICogKG9yIG9uIHRoZSBjdXJyZW50IGVudGl0eSB0eXBlIGlmIGVudGl0eVR5cGUgaXNuJ3Qgc3BlY2lmaWVkKS5cblx0ICpcblx0ICogQHBhcmFtIHZvY2FidWxhcnlOYW1lXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uVGVybVxuXHQgKiBAcGFyYW0gW2Fubm90YXRpb25Tb3VyY2VzXVxuXHQgKiBAcmV0dXJucyBBbGwgdGhlIGFubm90YXRpb24gZm9yIGEgc3BlY2lmaWMgdGVybSBhbmQgdm9jYWJ1bGFyeSBmcm9tIGFuIGVudGl0eSB0eXBlXG5cdCAqL1xuXHRnZXRBbm5vdGF0aW9uc0J5VGVybShcblx0XHR2b2NhYnVsYXJ5TmFtZToga2V5b2YgRW50aXR5VHlwZUFubm90YXRpb25zLFxuXHRcdGFubm90YXRpb25UZXJtOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvblNvdXJjZXM6IChTZXJ2aWNlT2JqZWN0IHwgdW5kZWZpbmVkKVtdID0gW3RoaXMuZ2V0RW50aXR5VHlwZSgpXVxuXHQpOiBBbm5vdGF0aW9uVGVybTxhbnk+W10ge1xuXHRcdGxldCBvdXRBbm5vdGF0aW9uczogQW5ub3RhdGlvblRlcm08YW55PltdID0gW107XG5cdFx0YW5ub3RhdGlvblNvdXJjZXMuZm9yRWFjaChhbm5vdGF0aW9uU291cmNlID0+IHtcblx0XHRcdGlmIChhbm5vdGF0aW9uU291cmNlKSB7XG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uVGVybTxhbnk+PiA9IGFubm90YXRpb25Tb3VyY2U/LmFubm90YXRpb25zW3ZvY2FidWxhcnlOYW1lXSB8fCB7fTtcblx0XHRcdFx0aWYgKGFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0b3V0QW5ub3RhdGlvbnMgPSBPYmplY3Qua2V5cyhhbm5vdGF0aW9ucylcblx0XHRcdFx0XHRcdC5maWx0ZXIoYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uc1thbm5vdGF0aW9uXS50ZXJtID09PSBhbm5vdGF0aW9uVGVybSlcblx0XHRcdFx0XHRcdC5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IEFubm90YXRpb25UZXJtPGFueT5bXSwga2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdFx0cHJldmlvdXNWYWx1ZS5wdXNoKGFubm90YXRpb25zW2tleV0pO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHRcdFx0XHRcdH0sIG91dEFubm90YXRpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvdXRBbm5vdGF0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlbGF0aXZlIG1vZGVsIHBhdGggYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIHJlbGF0aXZlIG1vZGVsIHBhdGggb3IgdW5kZWZpbmVkIGlmIHRoZSBwYXRoIGlzIG5vdCByZXNvbHZlYWJsZVxuXHQgKi9cblx0Z2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGF0YU1vZGVsUGF0aCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aDtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0Y29uc3QgZW5oYW5jZWRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgodGFyZ2V0RGF0YU1vZGVsUGF0aCwgc1BhdGgpO1xuXHRcdFx0cmV0dXJuIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgoZW5oYW5jZWRQYXRoLCB0cnVlKTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgY29udmVydGVyIGNvbnRleHQgbmVjZXNzYXJ5IGZvciBhIG1hY3JvIGJhc2VkIG9uIGEgbWV0YW1vZGVsIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIGRpYWdub3N0aWNzXG5cdCAqIEBwYXJhbSBtZXJnZUZuXG5cdCAqIEBwYXJhbSB0YXJnZXREYXRhTW9kZWxQYXRoXG5cdCAqIEBwYXJhbSBtYW5pZmVzdFNldHRpbmdzXG5cdCAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fSBUaGUgY3VycmVudCBjb252ZXJ0ZXIgY29udGV4dFxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRzRW50aXR5U2V0TmFtZTogc3RyaW5nLFxuXHRcdG9NZXRhTW9kZWxDb250ZXh0OiBDb250ZXh0IHwgT0RhdGFNZXRhTW9kZWwsXG5cdFx0ZGlhZ25vc3RpY3M6IElEaWFnbm9zdGljcyxcblx0XHRtZXJnZUZuOiBGdW5jdGlvbixcblx0XHR0YXJnZXREYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRcdG1hbmlmZXN0U2V0dGluZ3M6IEJhc2VNYW5pZmVzdFNldHRpbmdzID0ge30gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3Ncblx0KTogQ29udmVydGVyQ29udGV4dCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvTWV0YU1vZGVsQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdD8gKG9NZXRhTW9kZWxDb250ZXh0IGFzIE9EYXRhTWV0YU1vZGVsKVxuXHRcdFx0OiAoKG9NZXRhTW9kZWxDb250ZXh0IGFzIENvbnRleHQpLmdldE1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdGNvbnN0IG9Db252ZXJ0ZXJPdXRwdXQgPSBjb252ZXJ0VHlwZXMob01ldGFNb2RlbCk7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gb0NvbnZlcnRlck91dHB1dC5lbnRpdHlTZXRzLmZpbmQoZW50aXR5U2V0ID0+IGVudGl0eVNldC5uYW1lID09PSBzRW50aXR5U2V0TmFtZSkgYXMgRW50aXR5U2V0O1xuXHRcdGlmICghdGFyZ2V0RGF0YU1vZGVsUGF0aCkge1xuXHRcdFx0dGFyZ2V0RGF0YU1vZGVsUGF0aCA9IHtcblx0XHRcdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdFx0XHR0YXJnZXRFbnRpdHlTZXQ6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZTogdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0XHRcdHRhcmdldE9iamVjdDogdGFyZ2V0RW50aXR5U2V0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQob0NvbnZlcnRlck91dHB1dCwgbWFuaWZlc3RTZXR0aW5ncywgZGlhZ25vc3RpY3MsIG1lcmdlRm4sIHRhcmdldERhdGFNb2RlbFBhdGgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnZlcnRlckNvbnRleHQ7XG4iXX0=
495
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiaXNBbm5vdGF0aW9uVGVybSIsInZBbm5vdGF0aW9uUGF0aCIsImlzU2VydmljZU9iamVjdCIsIm9iamVjdFBhcnQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQiLCJyZXNvbHZlZE1ldGFQYXRoIiwiY29udmVydGVkVHlwZXMiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVNldCIsInByZXZpb3VzRW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJuYXZpZ2F0ZWRQYXRocyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwib2JqZWN0UGF0aCIsImZvckVhY2giLCJfdHlwZSIsInB1c2giLCJuYW1lIiwidGFyZ2V0VHlwZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJqb2luIiwidW5kZWZpbmVkIiwiZW50aXR5VHlwZSIsImRhdGFNb2RlbFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsInRhcmdldEVudGl0eVR5cGUiLCJ0YXJnZXRFbnRpdHlTZXQiLCJjb250ZXh0TG9jYXRpb24iLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXQiLCJDb252ZXJ0ZXJDb250ZXh0IiwibWFuaWZlc3RTZXR0aW5ncyIsImRpYWdub3N0aWNzIiwibWVyZ2VGbiIsInRhcmdldERhdGFNb2RlbFBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJNYW5pZmVzdFdyYXBwZXIiLCJiYXNlQ29udGV4dFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwic3RhcnRzV2l0aCIsInJlcGxhY2VBbm5vdGF0aW9uIiwicmVwbGFjZSIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwiYW5ub3RhdGlvbiIsImFubm90YXRpb25QYXRoIiwiRXJyb3IiLCJnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwic0Fubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0IiwiZ2V0Q29udGV4dFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiZW50aXR5Q29udGFpbmVyIiwiZ2V0RW50aXR5VHlwZSIsImdldFBhcmFtZXRlckVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFbnRpdHlUeXBlIiwiaXNQYXJhbWV0ZXJpemVkIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJSZXN1bHRDb250ZXh0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJpbmRleE9mIiwicmVzb2x2ZVBhdGgiLCJzdGFydGluZ0VudGl0eVR5cGUiLCJjb25jYXQiLCJpIiwiY3VycmVudE9iamVjdCIsInZpc2l0ZWRPYmplY3RzIiwibmF2T2JqZWN0IiwibGVuZ3RoIiwibmF2UGF0aCIsIm91dERhdGFNb2RlbFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0IiwiZ2V0VGVtcGxhdGVUeXBlIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImVudGl0eVR5cGVGUU4iLCJtYXRjaCIsInJlcGxhY2VkQW5ub3RhdGlvblBhdGgiLCJzdWJzdHIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXREaWFnbm9zdGljcyIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJwYXRoIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImNvbnRleHRQYXRoIiwidGFyZ2V0UGF0aCIsImdldEFubm90YXRpb25zQnlUZXJtIiwidm9jYWJ1bGFyeU5hbWUiLCJhbm5vdGF0aW9uVGVybSIsImFubm90YXRpb25Tb3VyY2VzIiwib3V0QW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uU291cmNlIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsInRlcm0iLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwia2V5IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsInNQYXRoIiwiZW5oYW5jZWRQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwic0VudGl0eVNldE5hbWUiLCJvTWV0YU1vZGVsQ29udGV4dCIsIm9NZXRhTW9kZWwiLCJpc0EiLCJnZXRNb2RlbCIsIm9Db252ZXJ0ZXJPdXRwdXQiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlTZXRzIiwiZW50aXR5U2V0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUE2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsZ0JBQWdCLEdBQUcsVUFBU0MsZUFBVCxFQUFnRztBQUN4SCxXQUFPLE9BQU9BLGVBQVAsS0FBMkIsUUFBbEM7QUFDQSxHQUZEOztBQUlBLFdBQVNDLGVBQVQsQ0FBeUJDLFVBQXpCLEVBQThGO0FBQzdGLFdBQU9BLFVBQVUsSUFBSUEsVUFBVSxDQUFDQyxjQUFYLENBQTBCLE9BQTFCLENBQXJCO0FBQ0E7O0FBRUQsTUFBTUMsNEJBQTRCLEdBQUcsVUFDcENDLGdCQURvQyxFQUVwQ0MsY0FGb0MsRUFHZDtBQUN0QixRQUFJQyxhQUFKO0FBQ0EsUUFBSUMsZ0JBQUo7QUFDQSxRQUFJQyxpQkFBSjtBQUNBLFFBQUlDLGlCQUFKO0FBQ0EsUUFBSUMsY0FBd0IsR0FBRyxFQUEvQjtBQUNBLFFBQU1DLG9CQUEwQyxHQUFHLEVBQW5EO0FBQ0FQLElBQUFBLGdCQUFnQixDQUFDUSxVQUFqQixDQUE0QkMsT0FBNUIsQ0FBb0MsVUFBQ1osVUFBRCxFQUE0QztBQUFBOztBQUMvRSxVQUFJRCxlQUFlLENBQUNDLFVBQUQsQ0FBbkIsRUFBaUM7QUFDaEMsZ0JBQVFBLFVBQVUs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ckJjLFVBQUFBLGVBQWUsRUFBRUEsZUFISTtBQUlyQkQsVUFBQUEsZ0JBQWdCLEVBQUVDLGVBQWUsQ0FBQ0osVUFKYjtBQUtyQk0sVUFBQUEsWUFBWSxFQUFFRixlQUxPO0FBTXJCcEIsVUFBQUEsY0FBYyxFQUFFZ0g7QUFOSyxTQUF0QjtBQVFBOztBQUNELGFBQU8sSUFBSXhGLGdCQUFKLENBQXFCd0YsZ0JBQXJCLEVBQXVDdkYsZ0JBQXZDLEVBQXlEQyxXQUF6RCxFQUFzRUMsT0FBdEUsRUFBK0VDLG1CQUEvRSxDQUFQO0FBQ0EsSzs7Ozs7U0FHYUosZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25UZXJtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBbnlBbm5vdGF0aW9uLFxuXHRDb252ZXJ0ZXJPdXRwdXQsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0RW50aXR5Q29udGFpbmVyLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdFNlcnZpY2VPYmplY3QsXG5cdFJlc29sdXRpb25UYXJnZXQsXG5cdFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uXG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncywgVGVtcGxhdGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBSZXNvbHZlZFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IEVudGl0eVR5cGVBbm5vdGF0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9nZW5lcmF0ZWQvRWRtX1R5cGVzXCI7XG5pbXBvcnQgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0V3JhcHBlclwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEFubm90YXRpb25Db250ZXh0ID0ge1xuXHRhbm5vdGF0aW9uOiBBbnlBbm5vdGF0aW9uO1xuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0O1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgaXMgYW4gYW5ub3RhdGlvbiB0ZXJtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFubm90YXRpb25UZXJtPG9iamVjdD59IHZBbm5vdGF0aW9uUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQW5ub3RhdGlvblRlcm0gPSBmdW5jdGlvbih2QW5ub3RhdGlvblBhdGg6IHN0cmluZyB8IEFubm90YXRpb25UZXJtPGFueT4pOiB2QW5ub3RhdGlvblBhdGggaXMgQW5ub3RhdGlvblRlcm08YW55PiB7XG5cdHJldHVybiB0eXBlb2YgdkFubm90YXRpb25QYXRoID09PSBcIm9iamVjdFwiO1xufTtcblxuZnVuY3Rpb24gaXNTZXJ2aWNlT2JqZWN0KG9iamVjdFBhcnQ6IFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uKTogb2JqZWN0UGFydCBpcyBTZXJ2aWNlT2JqZWN0IHtcblx0cmV0dXJuIG9iamVjdFBhcnQgJiYgb2JqZWN0UGFydC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpO1xufVxuXG5jb25zdCBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0ID0gZnVuY3Rpb24oXG5cdHJlc29sdmVkTWV0YVBhdGg6IFJlc29sdXRpb25UYXJnZXQ8YW55Pixcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dFxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdGxldCByb290RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBwcmV2aW91c0VudGl0eVNldDogRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQ7XG5cdGxldCBuYXZpZ2F0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdHJlc29sdmVkTWV0YVBhdGgub2JqZWN0UGF0aC5mb3JFYWNoKChvYmplY3RQYXJ0OiBTZXJ2aWNlT2JqZWN0QW5kQW5ub3RhdGlvbikgPT4ge1xuXHRcdGlmIChpc1NlcnZpY2VPYmplY3Qob2JqZWN0UGFydCkpIHtcblx0XHRcdHN3aXRjaCAob2JqZWN0UGFydC5fdHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiTmF2aWdhdGlvblByb3BlcnR5XCI6XG5cdFx0XHRcdFx0bmF2aWdhdGVkUGF0aHMucHVzaChvYmplY3RQYXJ0Lm5hbWUpO1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2gob2JqZWN0UGFydCk7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBvYmplY3RQYXJ0LnRhcmdldFR5cGU7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzRW50aXR5U2V0ICYmIHByZXZpb3VzRW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gcHJldmlvdXNFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKV07XG5cdFx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkVudGl0eVNldFwiOlxuXHRcdFx0XHRcdGlmIChyb290RW50aXR5U2V0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBvYmplY3RQYXJ0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gb2JqZWN0UGFydDtcblx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBjdXJyZW50RW50aXR5U2V0Py5lbnRpdHlUeXBlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IHJvb3RFbnRpdHlTZXQgYXMgRW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGN1cnJlbnRFbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBjdXJyZW50RW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IHVuZGVmaW5lZCxcblx0XHR0YXJnZXRPYmplY3Q6IHJlc29sdmVkTWV0YVBhdGgudGFyZ2V0LFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHRkYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbiA9IGRhdGFNb2RlbFBhdGg7XG5cdHJldHVybiBkYXRhTW9kZWxQYXRoO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBDb252ZXJ0ZXJDb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGNvbnZlcnRlcnMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJPdXRwdXR9IG9Db252ZXJ0ZWRUeXBlcyBUaGUgY29udmVydGVkIGFubm90YXRpb24gYW5kIHNlcnZpY2UgdHlwZXNcbiAqIEBwYXJhbSB7QmFzZU1hbmlmZXN0U2V0dGluZ3N9IG9NYW5pZmVzdFNldHRpbmdzIFRoZSBtYW5pZmVzdFNldHRpbmdzIHRoYXQgYXBwbGllcyB0byB0aGlzIHBhZ2VcbiAqIEBwYXJhbSB7VGVtcGxhdGVUeXBlfSB0ZW1wbGF0ZVR5cGUgVGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgbG9va2luZyBhdCByaWdodCBub3dcbiAqIEBwYXJhbSB7SVNoZWxsU2VydmljZXNQcm94eX0gc2hlbGxTZXJ2aWNlcyBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgc2hlbGxzZXJ2aWNlXG4gKiBAcGFyYW0ge0lEaWFnbm9zdGljc30gZGlhZ25vc3RpY3MgVGhlIGRpYWdub3N0aWNzIHNoaW1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRm4gVGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gcGVyZm9tIHNvbWUgZGVlcCBtZXJnZXMgYmV0d2VlbiBvYmplY3RcbiAqIEBwYXJhbSB7RGF0YU1vZGVsT2JqZWN0UGF0aH0gdGFyZ2V0RGF0YU1vZGVsUGF0aCBUaGUgZ2xvYmFsIHBhdGggdG8gcmVhY2ggdGhlIGVudGl0eVNldFxuICpcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fSBBIGNvbnZlcnRlciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyc1xuICovXG5jbGFzcyBDb252ZXJ0ZXJDb250ZXh0IHtcblx0cHJpdmF0ZSBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlcjtcblx0cHJpdmF0ZSBiYXNlQ29udGV4dFBhdGg6IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdFx0cHJpdmF0ZSBtYW5pZmVzdFNldHRpbmdzOiBCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0XHRwcml2YXRlIGRpYWdub3N0aWNzOiBJRGlhZ25vc3RpY3MsXG5cdFx0cHJpdmF0ZSBtZXJnZUZuOiBGdW5jdGlvbixcblx0XHRwcml2YXRlIHRhcmdldERhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcblx0KSB7XG5cdFx0dGhpcy5tYW5pZmVzdFdyYXBwZXIgPSBuZXcgTWFuaWZlc3RXcmFwcGVyKHRoaXMubWFuaWZlc3RTZXR0aW5ncywgbWVyZ2VGbik7XG5cdFx0dGhpcy5iYXNlQ29udGV4dFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyB7UHJvcGVydHl9IFRoZSBwcm9wZXJ0eSBFbnRpdHlUeXBlIGJhc2VkXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSB0aGlzLmNvbnZlcnRlZFR5cGVzLmVudGl0eVR5cGVzLmZpbmQoZW50aXR5VHlwZSA9PiB7XG5cdFx0XHRpZiAoZnVsbHlRdWFsaWZpZWROYW1lLnN0YXJ0c1dpdGgoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IHJlcGxhY2VBbm5vdGF0aW9uID0gZnVsbHlRdWFsaWZpZWROYW1lLnJlcGxhY2UoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpO1xuXHRcdFx0XHRyZXR1cm4gcmVwbGFjZUFubm90YXRpb24uc3RhcnRzV2l0aChcIi9cIikgfHwgcmVwbGFjZUFubm90YXRpb24uc3RhcnRzV2l0aChcIkBcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRhcmdldEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGVudGl0eVR5cGUgYXNzb2NpYXRlZCB3aXRoIGFuIGFubm90YXRpb24gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiBvYmplY3QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgZW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIEVudGl0eVR5cGUgdGhlIGFubm90YXRpb24gcmVmZXJzIHRvXG5cdCAqL1xuXHRnZXRBbm5vdGF0aW9uRW50aXR5VHlwZShhbm5vdGF0aW9uPzogQW5ub3RhdGlvblRlcm08YW55Pik6IEVudGl0eVR5cGUge1xuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lKGFubm90YXRpb25QYXRoKTtcblx0XHRcdGlmICghdGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBFbnRpdHkgVHlwZSBmb3IgXCIgKyBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0RW50aXR5VHlwZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MgZGVmaW5lZCBmb3IgYSBzcGVjaWZpYyBjb250cm9sIHdpdGhpbiBjb250cm9sQ29uZmlndXJhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHZBbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIG9yIG9iamVjdCB0byBldmFsdWF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGFubnRvYXRpb24gcGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odkFubm90YXRpb25QYXRoOiBzdHJpbmcgfCBBbm5vdGF0aW9uVGVybTxhbnk+KTogYW55IHtcblx0XHRpZiAoaXNBbm5vdGF0aW9uVGVybSh2QW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24oXG5cdFx0XHRcdHZBbm5vdGF0aW9uUGF0aC5mdWxseVF1YWxpZmllZE5hbWUucmVwbGFjZSh0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24odkFubm90YXRpb25QYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gYWJzb2x1dGUgYW5ub3RhdGlvbiBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1ldGEgbW9kZWwgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNBbm5vdGF0aW9uUGF0aCBUaGUgcmVsYXRpdmUgYW5ub3RhdGlvbiBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZWN0IGFubm90YXRpb24gcGF0aCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdCAqL1xuXHRnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKHNBbm5vdGF0aW9uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRpZiAoIXNBbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0cmV0dXJuIHNBbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0aWYgKHNBbm5vdGF0aW9uUGF0aFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHJldHVybiBzQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aCArIFwiL1wiICsgc0Fubm90YXRpb25QYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGVudGl0eVNldC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgRW50aXR5U2V0IGlmIGl0IGV4aXN0cy5cblx0ICovXG5cdGdldEVudGl0eVNldCgpOiBFbnRpdHlTZXQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjb250ZXh0IHBhdGguXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGNvbnZlcnRlci5cblx0ICovXG5cdGdldENvbnRleHRQYXRoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZUNvbnRleHRQYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGRhdGEgbW9kZWwgb2JqZWN0IHBhdGguXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGRhdGEgbW9kZWwgb2JqZWN0IHBhdGhcblx0ICovXG5cdGdldERhdGFNb2RlbE9iamVjdFBhdGgoKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEVudGl0eUNvbnRhaW5lci5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2VydmljZSBFbnRpdHlDb250YWluZXJcblx0ICovXG5cdGdldEVudGl0eUNvbnRhaW5lcigpOiBFbnRpdHlDb250YWluZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLmVudGl0eUNvbnRhaW5lcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEVudGl0eVR5cGUgYmFzZWQgb24gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBFbnRpdHlUeXBlLlxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZSgpOiBFbnRpdHlUeXBlIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIGVudGl0eSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICovXG5cdGdldFBhcmFtZXRlckVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB7XG5cdFx0Y29uc3QgcGFyYW1ldGVyRW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHRcdHJldHVybiAoaXNQYXJhbWV0ZXJpemVkICYmIHBhcmFtZXRlckVudGl0eVR5cGUpIGFzIEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFuIGFubm90YXRpb24gZnJvbSBhbiBlbnRpdHkgdHlwZSBiYXNlZCBvbiBhbm5vdGF0aW9uIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIHRvIGJlIGV2YWx1YXRlZFxuXHQgKiBAcmV0dXJucyBUaGUgdGFyZ2V0IGFubm90YXRpb24gcGF0aCBhcyB3ZWxsIGFzIGEgY29udmVydGVyIGNvbnRleHQgdG8gZ28gd2l0aCBpdFxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IFJlc29sdmVkQW5ub3RhdGlvbkNvbnRleHQge1xuXHRcdGlmIChhbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQFwiKSA9PT0gLTEpIHtcblx0XHRcdGFubm90YXRpb25QYXRoID0gXCJAXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBSZXNvbHZlZFRhcmdldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKGFubm90YXRpb25QYXRoLCB0cnVlKTtcblxuXHRcdGxldCByb290RW50aXR5U2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldDtcblx0XHRsZXQgY3VycmVudEVudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBzdGFydGluZ0VudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5jb25jYXQoKTtcblx0XHRsZXQgaSA9IDE7XG5cdFx0bGV0IGN1cnJlbnRPYmplY3Q7XG5cdFx0bGV0IG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0Y29uc3QgdmlzaXRlZE9iamVjdHMgPSB0YXJnZXRPYmplY3QudmlzaXRlZE9iamVjdHM7XG5cdFx0Ly8gSW4gY2FzZSBvZiBwYXJhbWV0ZXJpemVkIHNlcnZpY2Vcblx0XHRpZiAoIXJvb3RFbnRpdHlTZXQgJiYgc3RhcnRpbmdFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uUmVzdWx0Q29udGV4dCkge1xuXHRcdFx0cm9vdEVudGl0eVNldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0XHRcdHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKG5hdk9iamVjdCkge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG5hdk9iamVjdC5uYW1lKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR3aGlsZSAoaSA8IHZpc2l0ZWRPYmplY3RzLmxlbmd0aCkge1xuXHRcdFx0Y3VycmVudE9iamVjdCA9IHZpc2l0ZWRPYmplY3RzW2krK107XG5cdFx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKGN1cnJlbnRPYmplY3QubmFtZSk7XG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2goY3VycmVudE9iamVjdCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IChjdXJyZW50T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZTtcblx0XHRcdFx0aWYgKHJvb3RFbnRpdHlTZXQgJiYgcm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdlBhdGggPSBuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRyb290RW50aXR5U2V0ID1cblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tjdXJyZW50T2JqZWN0Lm5hbWVdIHx8IHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZQYXRoXTtcblx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50T2JqZWN0Ll90eXBlID09PSBcIkVudGl0eVNldFwiKSB7XG5cdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBjdXJyZW50T2JqZWN0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSByb290RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG91dERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRzdGFydGluZ0VudGl0eVNldDogdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5U2V0OiByb290RW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUsXG5cdFx0XHR0YXJnZXRPYmplY3Q6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAtIDFdLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdFx0XHRjb250ZXh0TG9jYXRpb246IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHRjb252ZXJ0ZWRUeXBlczogdGhpcy5jb252ZXJ0ZWRUeXBlc1xuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFubm90YXRpb246IHRhcmdldE9iamVjdC50YXJnZXQgYXMgQW55QW5ub3RhdGlvbixcblx0XHRcdGNvbnZlcnRlckNvbnRleHQ6IG5ldyBDb252ZXJ0ZXJDb250ZXh0KFxuXHRcdFx0XHR0aGlzLmNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdHRoaXMuZGlhZ25vc3RpY3MsXG5cdFx0XHRcdHRoaXMubWVyZ2VGbixcblx0XHRcdFx0b3V0RGF0YU1vZGVsUGF0aFxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgd29ya2luZyBvbiAoZS5nLiBMaXN0UmVwb3J0IC8gT2JqZWN0UGFnZSAvIC4uLikuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRlbnBsYXRlIHR5cGVcblx0ICovXG5cdGdldFRlbXBsYXRlVHlwZSgpOiBUZW1wbGF0ZVR5cGUge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY29udmVydGVkIHR5cGVzLlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBjb252ZXJ0ZWQgdHlwZXNcblx0ICovXG5cdGdldENvbnZlcnRlZFR5cGVzKCk6IENvbnZlcnRlck91dHB1dCB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVydGVkVHlwZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSByZWxhdGl2ZSBhbm5vdGF0aW9uIHBhdGggYmV0d2VlbiBhbiBhbm5vdGF0aW9uIHBhdGggYW5kIGFuIGVudGl0eSB0eXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcblx0ICogQHBhcmFtIGVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVGhlIHJlbGF0aXZlIGFubnRvdGF0aW9uIHBhdGguXG5cdCAqL1xuXHRnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aC5yZXBsYWNlKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gYW4gZW50aXR5VHlwZSBiYXNlZCBwYXRoIHRvIGFuIGVudGl0eVNldCBiYXNlZCBvbmUgKHVpNSB0ZW1wbGF0aW5nIGdlbmVyYWxseSBleHBlY3QgYW4gZW50aXR5U2V0QmFzZWRQYXRoKS5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb25QYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBFbnRpdHlTZXQgYmFzZWQgYW5ub3RhdGlvbiBwYXRoXG5cdCAqL1xuXHRnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmICghYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZUZRTiA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0IHx8XG5cdFx0XHQoKHRoaXMuYmFzZUNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIHRoaXMuYmFzZUNvbnRleHRQYXRoLm1hdGNoKC9cXC8vZykpIHx8IFtdKS5sZW5ndGggPiAxXG5cdFx0KSB7XG5cdFx0XHRsZXQgcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb25QYXRoLnJlcGxhY2UoZW50aXR5VHlwZUZRTiwgXCIvXCIpO1xuXHRcdFx0aWYgKHJlcGxhY2VkQW5ub3RhdGlvblBhdGgubGVuZ3RoID4gMiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzBdID09PSBcIi9cIiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzFdID09PSBcIi9cIikge1xuXHRcdFx0XHRyZXBsYWNlZEFubm90YXRpb25QYXRoID0gcmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdWJzdHIoMSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGggKyAocmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJlcGxhY2VkQW5ub3RhdGlvblBhdGggOiBcIi9cIiArIHJlcGxhY2VkQW5ub3RhdGlvblBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCIvXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIG1hbmlmZXN0IHdyYXBwZXIgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IG1hbmlmZXN0IHdyYXBwZXJcblx0ICovXG5cdGdldE1hbmlmZXN0V3JhcHBlcigpOiBNYW5pZmVzdFdyYXBwZXIge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlcjtcblx0fVxuXG5cdGdldERpYWdub3N0aWNzKCk6IElEaWFnbm9zdGljcyB7XG5cdFx0cmV0dXJuIHRoaXMuZGlhZ25vc3RpY3M7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHRhcmdldCBmcm9tIGFuIGFic29sdXRlIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHdlIHdhbnQgdG8gZ2V0IHRoZSB0YXJnZXRcblx0ICogQHJldHVybnMge0NvbnZlcnRlckNvbnRleHR9XG5cdCAqL1xuXHRyZXNvbHZlQWJzb2x1dGVQYXRoPFQ+KHBhdGg6IHN0cmluZyk6IFJlc29sdXRpb25UYXJnZXQ8VD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoKHBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIGEgbmV3IGNvbnZlcnRlciBjb250ZXh0LCBzY29wZWQgZm9yIGEgZGlmZmVyZW50IGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoIFRoZSBwYXRoIHdlIHdhbnQgdG8gb3JjaGVzdHJhdGUgdGhlIGNvbnZlcnRlciBjb250ZXh0IGFyb3VuZFxuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH1cblx0ICovXG5cdGdldENvbnZlcnRlckNvbnRleHRGb3I8VD4oY29udGV4dFBhdGg6IHN0cmluZyk6IENvbnZlcnRlckNvbnRleHQge1xuXHRcdGNvbnN0IHJlc29sdmVkTWV0YVBhdGg6IFJlc29sdXRpb25UYXJnZXQ8VD4gPSB0aGlzLmNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoKGNvbnRleHRQYXRoKTtcblx0XHRjb25zdCB0YXJnZXRQYXRoID0gZ2V0RGF0YU1vZGVsUGF0aEZvckVudGl0eVNldChyZXNvbHZlZE1ldGFQYXRoLCB0aGlzLmNvbnZlcnRlZFR5cGVzKTtcblx0XHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQodGhpcy5jb252ZXJ0ZWRUeXBlcywgdGhpcy5tYW5pZmVzdFNldHRpbmdzLCB0aGlzLmRpYWdub3N0aWNzLCB0aGlzLm1lcmdlRm4sIHRhcmdldFBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbGwgYW5ub3RhdGlvbnMgb2YgYSBnaXZlbiB0ZXJtIGFuZCB2b2NhYnVsYXJ5IG9uIGFuIGVudGl0eSB0eXBlXG5cdCAqIChvciBvbiB0aGUgY3VycmVudCBlbnRpdHkgdHlwZSBpZiBlbnRpdHlUeXBlIGlzbid0IHNwZWNpZmllZCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB2b2NhYnVsYXJ5TmFtZVxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblRlcm1cblx0ICogQHBhcmFtIFthbm5vdGF0aW9uU291cmNlc11cblx0ICogQHJldHVybnMgQWxsIHRoZSBhbm5vdGF0aW9uIGZvciBhIHNwZWNpZmljIHRlcm0gYW5kIHZvY2FidWxhcnkgZnJvbSBhbiBlbnRpdHkgdHlwZVxuXHQgKi9cblx0Z2V0QW5ub3RhdGlvbnNCeVRlcm0oXG5cdFx0dm9jYWJ1bGFyeU5hbWU6IGtleW9mIEVudGl0eVR5cGVBbm5vdGF0aW9ucyxcblx0XHRhbm5vdGF0aW9uVGVybTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25Tb3VyY2VzOiAoU2VydmljZU9iamVjdCB8IHVuZGVmaW5lZClbXSA9IFt0aGlzLmdldEVudGl0eVR5cGUoKV1cblx0KTogQW5ub3RhdGlvblRlcm08YW55PltdIHtcblx0XHRsZXQgb3V0QW5ub3RhdGlvbnM6IEFubm90YXRpb25UZXJtPGFueT5bXSA9IFtdO1xuXHRcdGFubm90YXRpb25Tb3VyY2VzLmZvckVhY2goYW5ub3RhdGlvblNvdXJjZSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvblNvdXJjZSkge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgQW5ub3RhdGlvblRlcm08YW55Pj4gPSBhbm5vdGF0aW9uU291cmNlPy5hbm5vdGF0aW9uc1t2b2NhYnVsYXJ5TmFtZV0gfHwge307XG5cdFx0XHRcdGlmIChhbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdG91dEFubm90YXRpb25zID0gT2JqZWN0LmtleXMoYW5ub3RhdGlvbnMpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGFubm90YXRpb24gPT4gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbl0udGVybSA9PT0gYW5ub3RhdGlvblRlcm0pXG5cdFx0XHRcdFx0XHQucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBBbm5vdGF0aW9uVGVybTxhbnk+W10sIGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzVmFsdWUucHVzaChhbm5vdGF0aW9uc1trZXldKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0XHRcdFx0XHR9LCBvdXRBbm5vdGF0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gb3V0QW5ub3RhdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSByZWxhdGl2ZSBtb2RlbCBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFRoZSByZWxhdGl2ZSBtb2RlbCBwYXRoIG9yIHVuZGVmaW5lZCBpZiB0aGUgcGF0aCBpcyBub3QgcmVzb2x2ZWFibGVcblx0ICovXG5cdGdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbFBhdGggPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGg7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IGVuaGFuY2VkUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKHRhcmdldERhdGFNb2RlbFBhdGgsIHNQYXRoKTtcblx0XHRcdHJldHVybiBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKGVuaGFuY2VkUGF0aCwgdHJ1ZSk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbnZlcnRlciBjb250ZXh0IG5lY2Vzc2FyeSBmb3IgYSBtYWNybyBiYXNlZCBvbiBhIG1ldGFtb2RlbCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gc0VudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBkaWFnbm9zdGljc1xuXHQgKiBAcGFyYW0gbWVyZ2VGblxuXHQgKiBAcGFyYW0gdGFyZ2V0RGF0YU1vZGVsUGF0aFxuXHQgKiBAcGFyYW0gbWFuaWZlc3RTZXR0aW5nc1xuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH0gVGhlIGN1cnJlbnQgY29udmVydGVyIGNvbnRleHRcblx0ICovXG5cdHN0YXRpYyBjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0c0VudGl0eVNldE5hbWU6IHN0cmluZyxcblx0XHRvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dCB8IE9EYXRhTWV0YU1vZGVsLFxuXHRcdGRpYWdub3N0aWNzOiBJRGlhZ25vc3RpY3MsXG5cdFx0bWVyZ2VGbjogRnVuY3Rpb24sXG5cdFx0dGFyZ2V0RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0XHRtYW5pZmVzdFNldHRpbmdzOiBCYXNlTWFuaWZlc3RTZXR0aW5ncyA9IHt9IGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzXG5cdCk6IENvbnZlcnRlckNvbnRleHQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gb01ldGFNb2RlbENvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpXG5cdFx0XHQ/IChvTWV0YU1vZGVsQ29udGV4dCBhcyBPRGF0YU1ldGFNb2RlbClcblx0XHRcdDogKChvTWV0YU1vZGVsQ29udGV4dCBhcyBDb250ZXh0KS5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvQ29udmVydGVyT3V0cHV0ID0gY29udmVydFR5cGVzKG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IG9Db252ZXJ0ZXJPdXRwdXQuZW50aXR5U2V0cy5maW5kKGVudGl0eVNldCA9PiBlbnRpdHlTZXQubmFtZSA9PT0gc0VudGl0eVNldE5hbWUpIGFzIEVudGl0eVNldDtcblx0XHRpZiAoIXRhcmdldERhdGFNb2RlbFBhdGgpIHtcblx0XHRcdHRhcmdldERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRcdHN0YXJ0aW5nRW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGU6IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdFx0XHR0YXJnZXRPYmplY3Q6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0Y29udmVydGVkVHlwZXM6IG9Db252ZXJ0ZXJPdXRwdXRcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChvQ29udmVydGVyT3V0cHV0LCBtYW5pZmVzdFNldHRpbmdzLCBkaWFnbm9zdGljcywgbWVyZ2VGbiwgdGFyZ2V0RGF0YU1vZGVsUGF0aCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29udmVydGVyQ29udGV4dDtcbiJdfQ==