@sapui5/sap.fe.core 1.102.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +62 -26
  4. package/src/sap/fe/core/AppComponent.ts +56 -40
  5. package/src/sap/fe/core/AppStateHandler.js +10 -10
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/BaseController.js +11 -9
  8. package/src/sap/fe/core/BaseController.ts +15 -13
  9. package/src/sap/fe/core/CommonUtils.js +236 -109
  10. package/src/sap/fe/core/CommonUtils.ts +252 -136
  11. package/src/sap/fe/core/ExtensionAPI.js +24 -27
  12. package/src/sap/fe/core/ExtensionAPI.ts +36 -38
  13. package/src/sap/fe/core/PageController.js +4 -4
  14. package/src/sap/fe/core/PageController.ts +4 -5
  15. package/src/sap/fe/core/TemplateComponent.js +1 -1
  16. package/src/sap/fe/core/TemplateComponent.ts +6 -6
  17. package/src/sap/fe/core/TemplateModel.js +1 -1
  18. package/src/sap/fe/core/TemplateModel.ts +1 -1
  19. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
  20. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
  23. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
  24. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
  25. package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
  26. package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
  27. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
  28. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
  29. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
  30. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
  31. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
  32. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
  33. package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
  34. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
  35. package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
  36. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
  37. package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
  38. package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
  41. package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
  42. package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
  43. package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
  44. package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
  45. package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
  46. package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
  47. package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
  49. package/src/sap/fe/core/controllerextensions/Share.js +22 -22
  50. package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
  58. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
  60. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
  62. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
  69. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
  70. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
  71. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
  72. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
  73. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
  74. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
  75. package/src/sap/fe/core/controls/Any.js +9 -5
  76. package/src/sap/fe/core/controls/Any.ts +10 -4
  77. package/src/sap/fe/core/controls/CommandExecution.js +11 -25
  78. package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
  81. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
  82. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
  83. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  84. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
  85. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
  89. package/src/sap/fe/core/controls/FileWrapper.js +2 -2
  90. package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
  91. package/src/sap/fe/core/controls/FilterBar.js +6 -2
  92. package/src/sap/fe/core/controls/FilterBar.ts +13 -9
  93. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  94. package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
  95. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  96. package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
  97. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
  98. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
  99. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
  100. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
  101. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
  102. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
  103. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
  104. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
  105. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
  106. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
  107. package/src/sap/fe/core/converters/ConverterContext.js +26 -33
  108. package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
  109. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  110. package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
  111. package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
  112. package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
  113. package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
  114. package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
  115. package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
  116. package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
  117. package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
  118. package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
  119. package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
  120. package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
  121. package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
  122. package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
  123. package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
  124. package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
  125. package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
  126. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
  127. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
  128. package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
  129. package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
  130. package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
  131. package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
  132. package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
  133. package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
  134. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
  135. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
  136. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
  137. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
  138. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
  139. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
  140. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
  141. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
  142. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
  143. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
  144. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
  145. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
  146. package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
  147. package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
  148. package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
  149. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
  150. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
  151. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
  152. package/src/sap/fe/core/converters/helpers/ID.js +46 -46
  153. package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
  154. package/src/sap/fe/core/converters/helpers/Key.js +7 -7
  155. package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
  156. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  157. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
  158. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
  159. package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
  160. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
  161. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
  162. package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
  163. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
  164. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
  165. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
  166. package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
  167. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
  168. package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
  169. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
  170. package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
  171. package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
  172. package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
  173. package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
  174. package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
  175. package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
  176. package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
  177. package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
  178. package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
  179. package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
  180. package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
  181. package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
  182. package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
  183. package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
  184. package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
  185. package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
  186. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
  187. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
  188. package/src/sap/fe/core/helpers/EditState.js +1 -6
  189. package/src/sap/fe/core/helpers/EditState.ts +5 -10
  190. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
  191. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
  192. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
  194. package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
  195. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
  196. package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
  197. package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
  198. package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
  199. package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
  200. package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
  201. package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
  202. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  203. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
  204. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
  205. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
  206. package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
  207. package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
  208. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  209. package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
  210. package/src/sap/fe/core/library.js +42 -3
  211. package/src/sap/fe/core/library.ts +38 -0
  212. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
  213. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
  214. package/src/sap/fe/core/messagebundle.properties +49 -35
  215. package/src/sap/fe/core/messagebundle_ar.properties +13 -5
  216. package/src/sap/fe/core/messagebundle_bg.properties +13 -5
  217. package/src/sap/fe/core/messagebundle_ca.properties +13 -5
  218. package/src/sap/fe/core/messagebundle_cs.properties +13 -5
  219. package/src/sap/fe/core/messagebundle_cy.properties +14 -6
  220. package/src/sap/fe/core/messagebundle_da.properties +13 -5
  221. package/src/sap/fe/core/messagebundle_de.properties +15 -7
  222. package/src/sap/fe/core/messagebundle_el.properties +14 -6
  223. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  224. package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
  225. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
  226. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
  227. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
  228. package/src/sap/fe/core/messagebundle_es.properties +13 -5
  229. package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
  230. package/src/sap/fe/core/messagebundle_et.properties +13 -5
  231. package/src/sap/fe/core/messagebundle_fi.properties +14 -6
  232. package/src/sap/fe/core/messagebundle_fr.properties +14 -6
  233. package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
  234. package/src/sap/fe/core/messagebundle_hi.properties +14 -6
  235. package/src/sap/fe/core/messagebundle_hr.properties +14 -6
  236. package/src/sap/fe/core/messagebundle_hu.properties +13 -5
  237. package/src/sap/fe/core/messagebundle_id.properties +13 -5
  238. package/src/sap/fe/core/messagebundle_it.properties +33 -25
  239. package/src/sap/fe/core/messagebundle_iw.properties +13 -5
  240. package/src/sap/fe/core/messagebundle_ja.properties +14 -6
  241. package/src/sap/fe/core/messagebundle_kk.properties +13 -5
  242. package/src/sap/fe/core/messagebundle_ko.properties +13 -5
  243. package/src/sap/fe/core/messagebundle_lt.properties +13 -5
  244. package/src/sap/fe/core/messagebundle_lv.properties +14 -6
  245. package/src/sap/fe/core/messagebundle_ms.properties +13 -5
  246. package/src/sap/fe/core/messagebundle_nl.properties +13 -5
  247. package/src/sap/fe/core/messagebundle_no.properties +13 -5
  248. package/src/sap/fe/core/messagebundle_pl.properties +13 -5
  249. package/src/sap/fe/core/messagebundle_pt.properties +13 -5
  250. package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
  251. package/src/sap/fe/core/messagebundle_ro.properties +13 -5
  252. package/src/sap/fe/core/messagebundle_ru.properties +13 -5
  253. package/src/sap/fe/core/messagebundle_sh.properties +13 -5
  254. package/src/sap/fe/core/messagebundle_sk.properties +13 -5
  255. package/src/sap/fe/core/messagebundle_sl.properties +17 -9
  256. package/src/sap/fe/core/messagebundle_sv.properties +14 -6
  257. package/src/sap/fe/core/messagebundle_th.properties +13 -5
  258. package/src/sap/fe/core/messagebundle_tr.properties +13 -5
  259. package/src/sap/fe/core/messagebundle_uk.properties +13 -5
  260. package/src/sap/fe/core/messagebundle_vi.properties +13 -5
  261. package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
  262. package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
  263. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  268. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
  269. package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
  270. package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
  271. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
  273. package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
  274. package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
  275. package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
  276. package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
  277. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
  278. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
  279. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
  280. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
  281. package/src/sap/fe/core/support/CommonHelper.js +3 -2
  282. package/src/sap/fe/core/support/CommonHelper.ts +9 -13
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/Diagnostics.ts +5 -5
  285. package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
  288. package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
  289. package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
  290. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
  291. package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
  292. package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
  293. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  294. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
  295. package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
  296. package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
  297. package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
  298. package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
  299. package/src/sap/fe/core/templating/FilterHelper.js +10 -9
  300. package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
  301. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  302. package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
  303. package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
  304. package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
  305. package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
  306. package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
  307. package/src/sap/fe/core/templating/UIFormatters.js +148 -93
  308. package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
  309. package/src/sap/fe/core/type/Email.js +2 -2
  310. package/src/sap/fe/core/type/Email.ts +2 -2
  311. package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
@@ -2,1730 +2,2146 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define([], function () {
6
- "use strict";
5
+ sap.ui.define([], function() {
6
+ /*!
7
+ * SAP UI development toolkit for HTML5 (SAPUI5)
8
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
9
+ */
10
+ "use strict";
7
11
 
8
- var _exports = {};
9
-
10
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
11
-
12
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
13
-
14
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
-
16
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
17
-
18
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
19
-
20
- function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
21
-
22
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
-
24
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
-
26
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
27
-
28
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
29
-
30
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
31
-
32
- 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); } }
33
-
34
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
35
-
36
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
37
-
38
- var Path = /*#__PURE__*/_createClass(function Path(pathExpression, targetName, annotationsTerm, annotationType, term) {
39
- _classCallCheck(this, Path);
40
-
41
- this.path = pathExpression.Path;
42
- this.type = "Path";
43
- this.$target = targetName;
44
- this.term = term, this.annotationType = annotationType, this.annotationsTerm = annotationsTerm;
45
- });
46
-
47
- var TermToTypes;
48
-
49
- (function (TermToTypes) {
50
- TermToTypes["Org.OData.Authorization.V1.SecuritySchemes"] = "Org.OData.Authorization.V1.SecurityScheme";
51
- TermToTypes["Org.OData.Authorization.V1.Authorizations"] = "Org.OData.Authorization.V1.Authorization";
52
- TermToTypes["Org.OData.Core.V1.Revisions"] = "Org.OData.Core.V1.RevisionType";
53
- TermToTypes["Org.OData.Core.V1.Links"] = "Org.OData.Core.V1.Link";
54
- TermToTypes["Org.OData.Core.V1.Example"] = "Org.OData.Core.V1.ExampleValue";
55
- TermToTypes["Org.OData.Core.V1.Messages"] = "Org.OData.Core.V1.MessageType";
56
- TermToTypes["Org.OData.Core.V1.ValueException"] = "Org.OData.Core.V1.ValueExceptionType";
57
- TermToTypes["Org.OData.Core.V1.ResourceException"] = "Org.OData.Core.V1.ResourceExceptionType";
58
- TermToTypes["Org.OData.Core.V1.DataModificationException"] = "Org.OData.Core.V1.DataModificationExceptionType";
59
- TermToTypes["Org.OData.Core.V1.IsLanguageDependent"] = "Org.OData.Core.V1.Tag";
60
- TermToTypes["Org.OData.Core.V1.DereferenceableIDs"] = "Org.OData.Core.V1.Tag";
61
- TermToTypes["Org.OData.Core.V1.ConventionalIDs"] = "Org.OData.Core.V1.Tag";
62
- TermToTypes["Org.OData.Core.V1.Permissions"] = "Org.OData.Core.V1.Permission";
63
- TermToTypes["Org.OData.Core.V1.DefaultNamespace"] = "Org.OData.Core.V1.Tag";
64
- TermToTypes["Org.OData.Core.V1.Immutable"] = "Org.OData.Core.V1.Tag";
65
- TermToTypes["Org.OData.Core.V1.Computed"] = "Org.OData.Core.V1.Tag";
66
- TermToTypes["Org.OData.Core.V1.ComputedDefaultValue"] = "Org.OData.Core.V1.Tag";
67
- TermToTypes["Org.OData.Core.V1.IsURL"] = "Org.OData.Core.V1.Tag";
68
- TermToTypes["Org.OData.Core.V1.IsMediaType"] = "Org.OData.Core.V1.Tag";
69
- TermToTypes["Org.OData.Core.V1.ContentDisposition"] = "Org.OData.Core.V1.ContentDispositionType";
70
- TermToTypes["Org.OData.Core.V1.OptimisticConcurrency"] = "Edm.PropertyPath";
71
- TermToTypes["Org.OData.Core.V1.AdditionalProperties"] = "Org.OData.Core.V1.Tag";
72
- TermToTypes["Org.OData.Core.V1.AutoExpand"] = "Org.OData.Core.V1.Tag";
73
- TermToTypes["Org.OData.Core.V1.AutoExpandReferences"] = "Org.OData.Core.V1.Tag";
74
- TermToTypes["Org.OData.Core.V1.MayImplement"] = "Org.OData.Core.V1.QualifiedTypeName";
75
- TermToTypes["Org.OData.Core.V1.Ordered"] = "Org.OData.Core.V1.Tag";
76
- TermToTypes["Org.OData.Core.V1.PositionalInsert"] = "Org.OData.Core.V1.Tag";
77
- TermToTypes["Org.OData.Core.V1.AlternateKeys"] = "Org.OData.Core.V1.AlternateKey";
78
- TermToTypes["Org.OData.Core.V1.OptionalParameter"] = "Org.OData.Core.V1.OptionalParameterType";
79
- TermToTypes["Org.OData.Core.V1.OperationAvailable"] = "Edm.Boolean";
80
- TermToTypes["Org.OData.Core.V1.SymbolicName"] = "Org.OData.Core.V1.SimpleIdentifier";
81
- TermToTypes["Org.OData.Capabilities.V1.ConformanceLevel"] = "Org.OData.Capabilities.V1.ConformanceLevelType";
82
- TermToTypes["Org.OData.Capabilities.V1.AsynchronousRequestsSupported"] = "Org.OData.Core.V1.Tag";
83
- TermToTypes["Org.OData.Capabilities.V1.BatchContinueOnErrorSupported"] = "Org.OData.Core.V1.Tag";
84
- TermToTypes["Org.OData.Capabilities.V1.IsolationSupported"] = "Org.OData.Capabilities.V1.IsolationLevel";
85
- TermToTypes["Org.OData.Capabilities.V1.CrossJoinSupported"] = "Org.OData.Core.V1.Tag";
86
- TermToTypes["Org.OData.Capabilities.V1.CallbackSupported"] = "Org.OData.Capabilities.V1.CallbackType";
87
- TermToTypes["Org.OData.Capabilities.V1.ChangeTracking"] = "Org.OData.Capabilities.V1.ChangeTrackingType";
88
- TermToTypes["Org.OData.Capabilities.V1.CountRestrictions"] = "Org.OData.Capabilities.V1.CountRestrictionsType";
89
- TermToTypes["Org.OData.Capabilities.V1.NavigationRestrictions"] = "Org.OData.Capabilities.V1.NavigationRestrictionsType";
90
- TermToTypes["Org.OData.Capabilities.V1.IndexableByKey"] = "Org.OData.Core.V1.Tag";
91
- TermToTypes["Org.OData.Capabilities.V1.TopSupported"] = "Org.OData.Core.V1.Tag";
92
- TermToTypes["Org.OData.Capabilities.V1.SkipSupported"] = "Org.OData.Core.V1.Tag";
93
- TermToTypes["Org.OData.Capabilities.V1.ComputeSupported"] = "Org.OData.Core.V1.Tag";
94
- TermToTypes["Org.OData.Capabilities.V1.SelectSupport"] = "Org.OData.Capabilities.V1.SelectSupportType";
95
- TermToTypes["Org.OData.Capabilities.V1.BatchSupported"] = "Org.OData.Core.V1.Tag";
96
- TermToTypes["Org.OData.Capabilities.V1.BatchSupport"] = "Org.OData.Capabilities.V1.BatchSupportType";
97
- TermToTypes["Org.OData.Capabilities.V1.FilterRestrictions"] = "Org.OData.Capabilities.V1.FilterRestrictionsType";
98
- TermToTypes["Org.OData.Capabilities.V1.SortRestrictions"] = "Org.OData.Capabilities.V1.SortRestrictionsType";
99
- TermToTypes["Org.OData.Capabilities.V1.ExpandRestrictions"] = "Org.OData.Capabilities.V1.ExpandRestrictionsType";
100
- TermToTypes["Org.OData.Capabilities.V1.SearchRestrictions"] = "Org.OData.Capabilities.V1.SearchRestrictionsType";
101
- TermToTypes["Org.OData.Capabilities.V1.KeyAsSegmentSupported"] = "Org.OData.Core.V1.Tag";
102
- TermToTypes["Org.OData.Capabilities.V1.QuerySegmentSupported"] = "Org.OData.Core.V1.Tag";
103
- TermToTypes["Org.OData.Capabilities.V1.InsertRestrictions"] = "Org.OData.Capabilities.V1.InsertRestrictionsType";
104
- TermToTypes["Org.OData.Capabilities.V1.DeepInsertSupport"] = "Org.OData.Capabilities.V1.DeepInsertSupportType";
105
- TermToTypes["Org.OData.Capabilities.V1.UpdateRestrictions"] = "Org.OData.Capabilities.V1.UpdateRestrictionsType";
106
- TermToTypes["Org.OData.Capabilities.V1.DeepUpdateSupport"] = "Org.OData.Capabilities.V1.DeepUpdateSupportType";
107
- TermToTypes["Org.OData.Capabilities.V1.DeleteRestrictions"] = "Org.OData.Capabilities.V1.DeleteRestrictionsType";
108
- TermToTypes["Org.OData.Capabilities.V1.CollectionPropertyRestrictions"] = "Org.OData.Capabilities.V1.CollectionPropertyRestrictionsType";
109
- TermToTypes["Org.OData.Capabilities.V1.OperationRestrictions"] = "Org.OData.Capabilities.V1.OperationRestrictionsType";
110
- TermToTypes["Org.OData.Capabilities.V1.AnnotationValuesInQuerySupported"] = "Org.OData.Core.V1.Tag";
111
- TermToTypes["Org.OData.Capabilities.V1.ModificationQueryOptions"] = "Org.OData.Capabilities.V1.ModificationQueryOptionsType";
112
- TermToTypes["Org.OData.Capabilities.V1.ReadRestrictions"] = "Org.OData.Capabilities.V1.ReadRestrictionsType";
113
- TermToTypes["Org.OData.Capabilities.V1.CustomHeaders"] = "Org.OData.Capabilities.V1.CustomParameter";
114
- TermToTypes["Org.OData.Capabilities.V1.CustomQueryOptions"] = "Org.OData.Capabilities.V1.CustomParameter";
115
- TermToTypes["Org.OData.Capabilities.V1.MediaLocationUpdateSupported"] = "Org.OData.Core.V1.Tag";
116
- TermToTypes["Org.OData.Aggregation.V1.ApplySupported"] = "Org.OData.Aggregation.V1.ApplySupportedType";
117
- TermToTypes["Org.OData.Aggregation.V1.Groupable"] = "Org.OData.Core.V1.Tag";
118
- TermToTypes["Org.OData.Aggregation.V1.Aggregatable"] = "Org.OData.Core.V1.Tag";
119
- TermToTypes["Org.OData.Aggregation.V1.ContextDefiningProperties"] = "Edm.PropertyPath";
120
- TermToTypes["Org.OData.Aggregation.V1.LeveledHierarchy"] = "Edm.PropertyPath";
121
- TermToTypes["Org.OData.Aggregation.V1.RecursiveHierarchy"] = "Org.OData.Aggregation.V1.RecursiveHierarchyType";
122
- TermToTypes["Org.OData.Aggregation.V1.AvailableOnAggregates"] = "Org.OData.Aggregation.V1.AvailableOnAggregatesType";
123
- TermToTypes["Org.OData.Validation.V1.Minimum"] = "Edm.PrimitiveType";
124
- TermToTypes["Org.OData.Validation.V1.Maximum"] = "Edm.PrimitiveType";
125
- TermToTypes["Org.OData.Validation.V1.Exclusive"] = "Org.OData.Core.V1.Tag";
126
- TermToTypes["Org.OData.Validation.V1.AllowedValues"] = "Org.OData.Validation.V1.AllowedValue";
127
- TermToTypes["Org.OData.Validation.V1.MultipleOf"] = "Edm.Decimal";
128
- TermToTypes["Org.OData.Validation.V1.Constraint"] = "Org.OData.Validation.V1.ConstraintType";
129
- TermToTypes["Org.OData.Validation.V1.ItemsOf"] = "Org.OData.Validation.V1.ItemsOfType";
130
- TermToTypes["Org.OData.Validation.V1.OpenPropertyTypeConstraint"] = "Org.OData.Core.V1.QualifiedTypeName";
131
- TermToTypes["Org.OData.Validation.V1.DerivedTypeConstraint"] = "Org.OData.Core.V1.QualifiedTypeName";
132
- TermToTypes["Org.OData.Validation.V1.AllowedTerms"] = "Org.OData.Core.V1.QualifiedTermName";
133
- TermToTypes["Org.OData.Validation.V1.ApplicableTerms"] = "Org.OData.Core.V1.QualifiedTermName";
134
- TermToTypes["Org.OData.Validation.V1.MaxItems"] = "Edm.Int64";
135
- TermToTypes["Org.OData.Validation.V1.MinItems"] = "Edm.Int64";
136
- TermToTypes["Org.OData.Measures.V1.Scale"] = "Edm.Byte";
137
- TermToTypes["Org.OData.Measures.V1.DurationGranularity"] = "Org.OData.Measures.V1.DurationGranularityType";
138
- TermToTypes["com.sap.vocabularies.Analytics.v1.Dimension"] = "Org.OData.Core.V1.Tag";
139
- TermToTypes["com.sap.vocabularies.Analytics.v1.Measure"] = "Org.OData.Core.V1.Tag";
140
- TermToTypes["com.sap.vocabularies.Analytics.v1.AccumulativeMeasure"] = "Org.OData.Core.V1.Tag";
141
- TermToTypes["com.sap.vocabularies.Analytics.v1.RolledUpPropertyCount"] = "Edm.Int16";
142
- TermToTypes["com.sap.vocabularies.Analytics.v1.PlanningAction"] = "Org.OData.Core.V1.Tag";
143
- TermToTypes["com.sap.vocabularies.Analytics.v1.AggregatedProperties"] = "com.sap.vocabularies.Analytics.v1.AggregatedPropertyType";
144
- TermToTypes["com.sap.vocabularies.Common.v1.ServiceVersion"] = "Edm.Int32";
145
- TermToTypes["com.sap.vocabularies.Common.v1.ServiceSchemaVersion"] = "Edm.Int32";
146
- TermToTypes["com.sap.vocabularies.Common.v1.TextFor"] = "Edm.PropertyPath";
147
- TermToTypes["com.sap.vocabularies.Common.v1.IsLanguageIdentifier"] = "Org.OData.Core.V1.Tag";
148
- TermToTypes["com.sap.vocabularies.Common.v1.TextFormat"] = "com.sap.vocabularies.Common.v1.TextFormatType";
149
- TermToTypes["com.sap.vocabularies.Common.v1.IsDigitSequence"] = "Org.OData.Core.V1.Tag";
150
- TermToTypes["com.sap.vocabularies.Common.v1.IsUpperCase"] = "Org.OData.Core.V1.Tag";
151
- TermToTypes["com.sap.vocabularies.Common.v1.IsCurrency"] = "Org.OData.Core.V1.Tag";
152
- TermToTypes["com.sap.vocabularies.Common.v1.IsUnit"] = "Org.OData.Core.V1.Tag";
153
- TermToTypes["com.sap.vocabularies.Common.v1.UnitSpecificScale"] = "Edm.PrimitiveType";
154
- TermToTypes["com.sap.vocabularies.Common.v1.UnitSpecificPrecision"] = "Edm.PrimitiveType";
155
- TermToTypes["com.sap.vocabularies.Common.v1.SecondaryKey"] = "Edm.PropertyPath";
156
- TermToTypes["com.sap.vocabularies.Common.v1.MinOccurs"] = "Edm.Int64";
157
- TermToTypes["com.sap.vocabularies.Common.v1.MaxOccurs"] = "Edm.Int64";
158
- TermToTypes["com.sap.vocabularies.Common.v1.AssociationEntity"] = "Edm.NavigationPropertyPath";
159
- TermToTypes["com.sap.vocabularies.Common.v1.DerivedNavigation"] = "Edm.NavigationPropertyPath";
160
- TermToTypes["com.sap.vocabularies.Common.v1.Masked"] = "Org.OData.Core.V1.Tag";
161
- TermToTypes["com.sap.vocabularies.Common.v1.MaskedAlways"] = "Org.OData.Core.V1.Tag";
162
- TermToTypes["com.sap.vocabularies.Common.v1.SemanticObjectMapping"] = "com.sap.vocabularies.Common.v1.SemanticObjectMappingType";
163
- TermToTypes["com.sap.vocabularies.Common.v1.IsInstanceAnnotation"] = "Org.OData.Core.V1.Tag";
164
- TermToTypes["com.sap.vocabularies.Common.v1.FilterExpressionRestrictions"] = "com.sap.vocabularies.Common.v1.FilterExpressionRestrictionType";
165
- TermToTypes["com.sap.vocabularies.Common.v1.FieldControl"] = "com.sap.vocabularies.Common.v1.FieldControlType";
166
- TermToTypes["com.sap.vocabularies.Common.v1.Application"] = "com.sap.vocabularies.Common.v1.ApplicationType";
167
- TermToTypes["com.sap.vocabularies.Common.v1.Timestamp"] = "Edm.DateTimeOffset";
168
- TermToTypes["com.sap.vocabularies.Common.v1.ErrorResolution"] = "com.sap.vocabularies.Common.v1.ErrorResolutionType";
169
- TermToTypes["com.sap.vocabularies.Common.v1.Messages"] = "Edm.ComplexType";
170
- TermToTypes["com.sap.vocabularies.Common.v1.numericSeverity"] = "com.sap.vocabularies.Common.v1.NumericMessageSeverityType";
171
- TermToTypes["com.sap.vocabularies.Common.v1.MaximumNumericMessageSeverity"] = "com.sap.vocabularies.Common.v1.NumericMessageSeverityType";
172
- TermToTypes["com.sap.vocabularies.Common.v1.IsActionCritical"] = "Edm.Boolean";
173
- TermToTypes["com.sap.vocabularies.Common.v1.Attributes"] = "Edm.PropertyPath";
174
- TermToTypes["com.sap.vocabularies.Common.v1.RelatedRecursiveHierarchy"] = "Edm.AnnotationPath";
175
- TermToTypes["com.sap.vocabularies.Common.v1.Interval"] = "com.sap.vocabularies.Common.v1.IntervalType";
176
- TermToTypes["com.sap.vocabularies.Common.v1.ResultContext"] = "Org.OData.Core.V1.Tag";
177
- TermToTypes["com.sap.vocabularies.Common.v1.WeakReferentialConstraint"] = "com.sap.vocabularies.Common.v1.WeakReferentialConstraintType";
178
- TermToTypes["com.sap.vocabularies.Common.v1.IsNaturalPerson"] = "Org.OData.Core.V1.Tag";
179
- TermToTypes["com.sap.vocabularies.Common.v1.ValueList"] = "com.sap.vocabularies.Common.v1.ValueListType";
180
- TermToTypes["com.sap.vocabularies.Common.v1.ValueListRelevantQualifiers"] = "com.sap.vocabularies.Common.v1.SimpleIdentifier";
181
- TermToTypes["com.sap.vocabularies.Common.v1.ValueListWithFixedValues"] = "Org.OData.Core.V1.Tag";
182
- TermToTypes["com.sap.vocabularies.Common.v1.ValueListMapping"] = "com.sap.vocabularies.Common.v1.ValueListMappingType";
183
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYear"] = "Org.OData.Core.V1.Tag";
184
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarHalfyear"] = "Org.OData.Core.V1.Tag";
185
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarQuarter"] = "Org.OData.Core.V1.Tag";
186
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarMonth"] = "Org.OData.Core.V1.Tag";
187
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarWeek"] = "Org.OData.Core.V1.Tag";
188
- TermToTypes["com.sap.vocabularies.Common.v1.IsDayOfCalendarMonth"] = "Org.OData.Core.V1.Tag";
189
- TermToTypes["com.sap.vocabularies.Common.v1.IsDayOfCalendarYear"] = "Org.OData.Core.V1.Tag";
190
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearHalfyear"] = "Org.OData.Core.V1.Tag";
191
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearQuarter"] = "Org.OData.Core.V1.Tag";
192
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearMonth"] = "Org.OData.Core.V1.Tag";
193
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearWeek"] = "Org.OData.Core.V1.Tag";
194
- TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarDate"] = "Org.OData.Core.V1.Tag";
195
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYear"] = "Org.OData.Core.V1.Tag";
196
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalPeriod"] = "Org.OData.Core.V1.Tag";
197
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearPeriod"] = "Org.OData.Core.V1.Tag";
198
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalQuarter"] = "Org.OData.Core.V1.Tag";
199
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearQuarter"] = "Org.OData.Core.V1.Tag";
200
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalWeek"] = "Org.OData.Core.V1.Tag";
201
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearWeek"] = "Org.OData.Core.V1.Tag";
202
- TermToTypes["com.sap.vocabularies.Common.v1.IsDayOfFiscalYear"] = "Org.OData.Core.V1.Tag";
203
- TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearVariant"] = "Org.OData.Core.V1.Tag";
204
- TermToTypes["com.sap.vocabularies.Common.v1.MutuallyExclusiveTerm"] = "Org.OData.Core.V1.Tag";
205
- TermToTypes["com.sap.vocabularies.Common.v1.DraftRoot"] = "com.sap.vocabularies.Common.v1.DraftRootType";
206
- TermToTypes["com.sap.vocabularies.Common.v1.DraftNode"] = "com.sap.vocabularies.Common.v1.DraftNodeType";
207
- TermToTypes["com.sap.vocabularies.Common.v1.DraftActivationVia"] = "com.sap.vocabularies.Common.v1.SimpleIdentifier";
208
- TermToTypes["com.sap.vocabularies.Common.v1.EditableFieldFor"] = "Edm.PropertyPath";
209
- TermToTypes["com.sap.vocabularies.Common.v1.SemanticKey"] = "Edm.PropertyPath";
210
- TermToTypes["com.sap.vocabularies.Common.v1.SideEffects"] = "com.sap.vocabularies.Common.v1.SideEffectsType";
211
- TermToTypes["com.sap.vocabularies.Common.v1.DefaultValuesFunction"] = "com.sap.vocabularies.Common.v1.QualifiedName";
212
- TermToTypes["com.sap.vocabularies.Common.v1.FilterDefaultValue"] = "Edm.PrimitiveType";
213
- TermToTypes["com.sap.vocabularies.Common.v1.FilterDefaultValueHigh"] = "Edm.PrimitiveType";
214
- TermToTypes["com.sap.vocabularies.Common.v1.SortOrder"] = "com.sap.vocabularies.Common.v1.SortOrderType";
215
- TermToTypes["com.sap.vocabularies.Common.v1.RecursiveHierarchy"] = "com.sap.vocabularies.Common.v1.RecursiveHierarchyType";
216
- TermToTypes["com.sap.vocabularies.Common.v1.CreatedAt"] = "Edm.DateTimeOffset";
217
- TermToTypes["com.sap.vocabularies.Common.v1.CreatedBy"] = "com.sap.vocabularies.Common.v1.UserID";
218
- TermToTypes["com.sap.vocabularies.Common.v1.ChangedAt"] = "Edm.DateTimeOffset";
219
- TermToTypes["com.sap.vocabularies.Common.v1.ChangedBy"] = "com.sap.vocabularies.Common.v1.UserID";
220
- TermToTypes["com.sap.vocabularies.Common.v1.ApplyMultiUnitBehaviorForSortingAndFiltering"] = "Org.OData.Core.V1.Tag";
221
- TermToTypes["com.sap.vocabularies.CodeList.v1.CurrencyCodes"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
222
- TermToTypes["com.sap.vocabularies.CodeList.v1.UnitsOfMeasure"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
223
- TermToTypes["com.sap.vocabularies.CodeList.v1.StandardCode"] = "Edm.PropertyPath";
224
- TermToTypes["com.sap.vocabularies.CodeList.v1.ExternalCode"] = "Edm.PropertyPath";
225
- TermToTypes["com.sap.vocabularies.CodeList.v1.IsConfigurationDeprecationCode"] = "Edm.Boolean";
226
- TermToTypes["com.sap.vocabularies.Communication.v1.Contact"] = "com.sap.vocabularies.Communication.v1.ContactType";
227
- TermToTypes["com.sap.vocabularies.Communication.v1.Address"] = "com.sap.vocabularies.Communication.v1.AddressType";
228
- TermToTypes["com.sap.vocabularies.Communication.v1.IsEmailAddress"] = "Org.OData.Core.V1.Tag";
229
- TermToTypes["com.sap.vocabularies.Communication.v1.IsPhoneNumber"] = "Org.OData.Core.V1.Tag";
230
- TermToTypes["com.sap.vocabularies.Communication.v1.Event"] = "com.sap.vocabularies.Communication.v1.EventData";
231
- TermToTypes["com.sap.vocabularies.Communication.v1.Task"] = "com.sap.vocabularies.Communication.v1.TaskData";
232
- TermToTypes["com.sap.vocabularies.Communication.v1.Message"] = "com.sap.vocabularies.Communication.v1.MessageData";
233
- TermToTypes["com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchy"] = "com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchyType";
234
- TermToTypes["com.sap.vocabularies.PersonalData.v1.EntitySemantics"] = "com.sap.vocabularies.PersonalData.v1.EntitySemanticsType";
235
- TermToTypes["com.sap.vocabularies.PersonalData.v1.FieldSemantics"] = "com.sap.vocabularies.PersonalData.v1.FieldSemanticsType";
236
- TermToTypes["com.sap.vocabularies.PersonalData.v1.IsPotentiallyPersonal"] = "Org.OData.Core.V1.Tag";
237
- TermToTypes["com.sap.vocabularies.PersonalData.v1.IsPotentiallySensitive"] = "Org.OData.Core.V1.Tag";
238
- TermToTypes["com.sap.vocabularies.Session.v1.StickySessionSupported"] = "com.sap.vocabularies.Session.v1.StickySessionSupportedType";
239
- TermToTypes["com.sap.vocabularies.UI.v1.HeaderInfo"] = "com.sap.vocabularies.UI.v1.HeaderInfoType";
240
- TermToTypes["com.sap.vocabularies.UI.v1.Identification"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
241
- TermToTypes["com.sap.vocabularies.UI.v1.Badge"] = "com.sap.vocabularies.UI.v1.BadgeType";
242
- TermToTypes["com.sap.vocabularies.UI.v1.LineItem"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
243
- TermToTypes["com.sap.vocabularies.UI.v1.StatusInfo"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
244
- TermToTypes["com.sap.vocabularies.UI.v1.FieldGroup"] = "com.sap.vocabularies.UI.v1.FieldGroupType";
245
- TermToTypes["com.sap.vocabularies.UI.v1.ConnectedFields"] = "com.sap.vocabularies.UI.v1.ConnectedFieldsType";
246
- TermToTypes["com.sap.vocabularies.UI.v1.GeoLocations"] = "com.sap.vocabularies.UI.v1.GeoLocationType";
247
- TermToTypes["com.sap.vocabularies.UI.v1.GeoLocation"] = "com.sap.vocabularies.UI.v1.GeoLocationType";
248
- TermToTypes["com.sap.vocabularies.UI.v1.Contacts"] = "Edm.AnnotationPath";
249
- TermToTypes["com.sap.vocabularies.UI.v1.MediaResource"] = "com.sap.vocabularies.UI.v1.MediaResourceType";
250
- TermToTypes["com.sap.vocabularies.UI.v1.DataPoint"] = "com.sap.vocabularies.UI.v1.DataPointType";
251
- TermToTypes["com.sap.vocabularies.UI.v1.KPI"] = "com.sap.vocabularies.UI.v1.KPIType";
252
- TermToTypes["com.sap.vocabularies.UI.v1.Chart"] = "com.sap.vocabularies.UI.v1.ChartDefinitionType";
253
- TermToTypes["com.sap.vocabularies.UI.v1.ValueCriticality"] = "com.sap.vocabularies.UI.v1.ValueCriticalityType";
254
- TermToTypes["com.sap.vocabularies.UI.v1.CriticalityLabels"] = "com.sap.vocabularies.UI.v1.CriticalityLabelType";
255
- TermToTypes["com.sap.vocabularies.UI.v1.SelectionFields"] = "Edm.PropertyPath";
256
- TermToTypes["com.sap.vocabularies.UI.v1.Facets"] = "com.sap.vocabularies.UI.v1.Facet";
257
- TermToTypes["com.sap.vocabularies.UI.v1.HeaderFacets"] = "com.sap.vocabularies.UI.v1.Facet";
258
- TermToTypes["com.sap.vocabularies.UI.v1.QuickViewFacets"] = "com.sap.vocabularies.UI.v1.Facet";
259
- TermToTypes["com.sap.vocabularies.UI.v1.QuickCreateFacets"] = "com.sap.vocabularies.UI.v1.Facet";
260
- TermToTypes["com.sap.vocabularies.UI.v1.FilterFacets"] = "com.sap.vocabularies.UI.v1.ReferenceFacet";
261
- TermToTypes["com.sap.vocabularies.UI.v1.SelectionPresentationVariant"] = "com.sap.vocabularies.UI.v1.SelectionPresentationVariantType";
262
- TermToTypes["com.sap.vocabularies.UI.v1.PresentationVariant"] = "com.sap.vocabularies.UI.v1.PresentationVariantType";
263
- TermToTypes["com.sap.vocabularies.UI.v1.SelectionVariant"] = "com.sap.vocabularies.UI.v1.SelectionVariantType";
264
- TermToTypes["com.sap.vocabularies.UI.v1.ThingPerspective"] = "Org.OData.Core.V1.Tag";
265
- TermToTypes["com.sap.vocabularies.UI.v1.IsSummary"] = "Org.OData.Core.V1.Tag";
266
- TermToTypes["com.sap.vocabularies.UI.v1.PartOfPreview"] = "Org.OData.Core.V1.Tag";
267
- TermToTypes["com.sap.vocabularies.UI.v1.Map"] = "Org.OData.Core.V1.Tag";
268
- TermToTypes["com.sap.vocabularies.UI.v1.Gallery"] = "Org.OData.Core.V1.Tag";
269
- TermToTypes["com.sap.vocabularies.UI.v1.IsImageURL"] = "Org.OData.Core.V1.Tag";
270
- TermToTypes["com.sap.vocabularies.UI.v1.IsImage"] = "Org.OData.Core.V1.Tag";
271
- TermToTypes["com.sap.vocabularies.UI.v1.MultiLineText"] = "Org.OData.Core.V1.Tag";
272
- TermToTypes["com.sap.vocabularies.UI.v1.TextArrangement"] = "com.sap.vocabularies.UI.v1.TextArrangementType";
273
- TermToTypes["com.sap.vocabularies.UI.v1.Importance"] = "com.sap.vocabularies.UI.v1.ImportanceType";
274
- TermToTypes["com.sap.vocabularies.UI.v1.Hidden"] = "Org.OData.Core.V1.Tag";
275
- TermToTypes["com.sap.vocabularies.UI.v1.CreateHidden"] = "Org.OData.Core.V1.Tag";
276
- TermToTypes["com.sap.vocabularies.UI.v1.UpdateHidden"] = "Org.OData.Core.V1.Tag";
277
- TermToTypes["com.sap.vocabularies.UI.v1.DeleteHidden"] = "Org.OData.Core.V1.Tag";
278
- TermToTypes["com.sap.vocabularies.UI.v1.HiddenFilter"] = "Org.OData.Core.V1.Tag";
279
- TermToTypes["com.sap.vocabularies.UI.v1.DataFieldDefault"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
280
- TermToTypes["com.sap.vocabularies.UI.v1.Criticality"] = "com.sap.vocabularies.UI.v1.CriticalityType";
281
- TermToTypes["com.sap.vocabularies.UI.v1.CriticalityCalculation"] = "com.sap.vocabularies.UI.v1.CriticalityCalculationType";
282
- TermToTypes["com.sap.vocabularies.UI.v1.Emphasized"] = "Org.OData.Core.V1.Tag";
283
- TermToTypes["com.sap.vocabularies.UI.v1.OrderBy"] = "Edm.PropertyPath";
284
- TermToTypes["com.sap.vocabularies.UI.v1.ParameterDefaultValue"] = "Edm.PrimitiveType";
285
- TermToTypes["com.sap.vocabularies.UI.v1.RecommendationState"] = "com.sap.vocabularies.UI.v1.RecommendationStateType";
286
- TermToTypes["com.sap.vocabularies.UI.v1.RecommendationList"] = "com.sap.vocabularies.UI.v1.RecommendationListType";
287
- TermToTypes["com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext"] = "Org.OData.Core.V1.Tag";
288
- TermToTypes["com.sap.vocabularies.HTML5.v1.CssDefaults"] = "com.sap.vocabularies.HTML5.v1.CssDefaultsType";
289
- })(TermToTypes || (TermToTypes = {}));
290
-
291
- var defaultReferences = [{
292
- alias: "Capabilities",
293
- namespace: "Org.OData.Capabilities.V1",
294
- uri: ""
295
- }, {
296
- alias: "Aggregation",
297
- namespace: "Org.OData.Aggregation.V1",
298
- uri: ""
299
- }, {
300
- alias: "Validation",
301
- namespace: "Org.OData.Validation.V1",
302
- uri: ""
303
- }, {
304
- namespace: "Org.OData.Core.V1",
305
- alias: "Core",
306
- uri: ""
307
- }, {
308
- namespace: "Org.OData.Measures.V1",
309
- alias: "Measures",
310
- uri: ""
311
- }, {
312
- namespace: "com.sap.vocabularies.Common.v1",
313
- alias: "Common",
314
- uri: ""
315
- }, {
316
- namespace: "com.sap.vocabularies.UI.v1",
317
- alias: "UI",
318
- uri: ""
319
- }, {
320
- namespace: "com.sap.vocabularies.Session.v1",
321
- alias: "Session",
322
- uri: ""
323
- }, {
324
- namespace: "com.sap.vocabularies.Analytics.v1",
325
- alias: "Analytics",
326
- uri: ""
327
- }, {
328
- namespace: "com.sap.vocabularies.CodeList.v1",
329
- alias: "CodeList",
330
- uri: ""
331
- }, {
332
- namespace: "com.sap.vocabularies.PersonalData.v1",
333
- alias: "PersonalData",
334
- uri: ""
335
- }, {
336
- namespace: "com.sap.vocabularies.Communication.v1",
337
- alias: "Communication",
338
- uri: ""
339
- }, {
340
- namespace: "com.sap.vocabularies.HTML5.v1",
341
- alias: "HTML5",
342
- uri: ""
343
- }];
344
- _exports.defaultReferences = defaultReferences;
345
-
346
- function alias(references, unaliasedValue) {
347
- if (!references.reverseReferenceMap) {
348
- references.reverseReferenceMap = references.reduce(function (map, reference) {
349
- map[reference.namespace] = reference;
350
- return map;
351
- }, {});
352
- }
12
+ function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
353
13
 
354
- if (!unaliasedValue) {
355
- return unaliasedValue;
356
- }
14
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
357
15
 
358
- var lastDotIndex = unaliasedValue.lastIndexOf(".");
359
- var namespace = unaliasedValue.substr(0, lastDotIndex);
360
- var value = unaliasedValue.substr(lastDotIndex + 1);
361
- var reference = references.reverseReferenceMap[namespace];
362
-
363
- if (reference) {
364
- return "".concat(reference.alias, ".").concat(value);
365
- } else {
366
- // Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
367
- if (unaliasedValue.indexOf("@") !== -1) {
368
- var _unaliasedValue$split = unaliasedValue.split("@"),
369
- _unaliasedValue$split2 = _toArray(_unaliasedValue$split),
370
- preAlias = _unaliasedValue$split2[0],
371
- postAlias = _unaliasedValue$split2.slice(1);
372
-
373
- return "".concat(preAlias, "@").concat(alias(references, postAlias.join("@")));
374
- } else {
375
- return unaliasedValue;
376
- }
377
- }
378
- }
16
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
379
17
 
380
- function unalias(references, aliasedValue) {
381
- if (!references.referenceMap) {
382
- references.referenceMap = references.reduce(function (map, reference) {
383
- map[reference.alias] = reference;
384
- return map;
385
- }, {});
386
- }
18
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
387
19
 
388
- if (!aliasedValue) {
389
- return aliasedValue;
390
- }
20
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
391
21
 
392
- var _aliasedValue$split = aliasedValue.split("."),
393
- _aliasedValue$split2 = _toArray(_aliasedValue$split),
394
- alias = _aliasedValue$split2[0],
395
- value = _aliasedValue$split2.slice(1);
396
-
397
- var reference = references.referenceMap[alias];
398
-
399
- if (reference) {
400
- return "".concat(reference.namespace, ".").concat(value.join("."));
401
- } else {
402
- // Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
403
- if (aliasedValue.indexOf("@") !== -1) {
404
- var _aliasedValue$split3 = aliasedValue.split("@"),
405
- _aliasedValue$split4 = _toArray(_aliasedValue$split3),
406
- preAlias = _aliasedValue$split4[0],
407
- postAlias = _aliasedValue$split4.slice(1);
408
-
409
- return "".concat(preAlias, "@").concat(unalias(references, postAlias.join("@")));
410
- } else {
411
- return aliasedValue;
412
- }
413
- }
414
- }
22
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
415
23
 
416
- function buildObjectMap(parserOutput) {
417
- var objectMap = {};
24
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
418
25
 
419
- if (parserOutput.schema.entityContainer && parserOutput.schema.entityContainer.fullyQualifiedName) {
420
- objectMap[parserOutput.schema.entityContainer.fullyQualifiedName] = parserOutput.schema.entityContainer;
421
- }
26
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
422
27
 
423
- parserOutput.schema.entitySets.forEach(function (entitySet) {
424
- objectMap[entitySet.fullyQualifiedName] = entitySet;
425
- });
426
- parserOutput.schema.actions.forEach(function (action) {
427
- objectMap[action.fullyQualifiedName] = action;
28
+ var AnnotationConverter;
29
+ /******/
428
30
 
429
- if (action.isBound) {
430
- var unBoundActionName = action.fullyQualifiedName.split("(")[0];
31
+ (function () {
32
+ // webpackBootstrap
431
33
 
432
- if (!objectMap[unBoundActionName]) {
433
- objectMap[unBoundActionName] = {
434
- _type: "UnboundGenericAction",
435
- actions: []
436
- };
437
- }
34
+ /******/
35
+ "use strict";
36
+ /******/
37
+
38
+ var __webpack_modules__ = {
39
+ /***/
40
+ 875:
41
+ /***/
42
+ function (__unused_webpack_module, exports, __webpack_require__) {
43
+ Object.defineProperty(exports, "__esModule", {
44
+ value: true
45
+ });
46
+ exports.convert = void 0;
47
+
48
+ var utils_1 = __webpack_require__(69);
49
+ /**
50
+ *
51
+ */
52
+
53
+
54
+ var Path =
55
+ /**
56
+ * @param pathExpression
57
+ * @param targetName
58
+ * @param annotationsTerm
59
+ * @param term
60
+ */
61
+ function Path(pathExpression, targetName, annotationsTerm, term) {
62
+ this.path = pathExpression.Path;
63
+ this.type = 'Path';
64
+ this.$target = targetName;
65
+ this.term = term;
66
+ this.annotationsTerm = annotationsTerm;
67
+ };
68
+ /**
69
+ * Creates a Map based on the fullyQualifiedName of each object part of the metadata.
70
+ *
71
+ * @param rawMetadata the rawMetadata we're working against
72
+ * @returns the objectmap for easy access to the different object of the metadata
73
+ */
438
74
 
439
- objectMap[unBoundActionName].actions.push(action);
440
- }
441
75
 
442
- action.parameters.forEach(function (parameter) {
443
- objectMap[parameter.fullyQualifiedName] = parameter;
444
- });
445
- });
446
- parserOutput.schema.complexTypes.forEach(function (complexType) {
447
- objectMap[complexType.fullyQualifiedName] = complexType;
448
- complexType.properties.forEach(function (property) {
449
- objectMap[property.fullyQualifiedName] = property;
450
- });
451
- });
452
- parserOutput.schema.typeDefinitions.forEach(function (typeDefinition) {
453
- objectMap[typeDefinition.fullyQualifiedName] = typeDefinition;
454
- });
455
- parserOutput.schema.entityTypes.forEach(function (entityType) {
456
- objectMap[entityType.fullyQualifiedName] = entityType;
457
- entityType.entityProperties.forEach(function (property) {
458
- objectMap[property.fullyQualifiedName] = property;
459
-
460
- if (property.type.indexOf("Edm") !== 0) {
461
- // Handle complex types
462
- var complexTypeDefinition = objectMap[property.type];
463
-
464
- if (complexTypeDefinition && complexTypeDefinition._type === "ComplexType" && complexTypeDefinition.properties) {
465
- complexTypeDefinition.properties.forEach(function (complexTypeProp) {
466
- var complexTypePropTarget = Object.assign(complexTypeProp, {
467
- _type: "Property",
468
- fullyQualifiedName: property.fullyQualifiedName + "/" + complexTypeProp.name
469
- });
470
- objectMap[complexTypePropTarget.fullyQualifiedName] = complexTypePropTarget;
471
- });
472
- }
473
- }
474
- });
475
- entityType.navigationProperties.forEach(function (navProperty) {
476
- objectMap[navProperty.fullyQualifiedName] = navProperty;
477
- });
478
- });
479
- Object.keys(parserOutput.schema.annotations).forEach(function (annotationSource) {
480
- parserOutput.schema.annotations[annotationSource].forEach(function (annotationList) {
481
- var currentTargetName = unalias(parserOutput.references, annotationList.target);
482
- annotationList.annotations.forEach(function (annotation) {
483
- var annotationFQN = "".concat(currentTargetName, "@").concat(unalias(parserOutput.references, annotation.term));
76
+ function buildObjectMap(rawMetadata) {
77
+ var _a;
484
78
 
485
- if (annotation.qualifier) {
486
- annotationFQN += "#".concat(annotation.qualifier);
487
- }
79
+ var objectMap = {};
488
80
 
489
- if (typeof annotation !== "object") {
490
- debugger;
491
- }
81
+ if ((_a = rawMetadata.schema.entityContainer) === null || _a === void 0 ? void 0 : _a.fullyQualifiedName) {
82
+ objectMap[rawMetadata.schema.entityContainer.fullyQualifiedName] = rawMetadata.schema.entityContainer;
83
+ }
492
84
 
493
- objectMap[annotationFQN] = annotation;
494
- annotation.fullyQualifiedName = annotationFQN;
85
+ rawMetadata.schema.entitySets.forEach(function (entitySet) {
86
+ objectMap[entitySet.fullyQualifiedName] = entitySet;
495
87
  });
496
- });
497
- });
498
- return objectMap;
499
- }
88
+ rawMetadata.schema.actions.forEach(function (action) {
89
+ objectMap[action.fullyQualifiedName] = action;
500
90
 
501
- function combinePath(currentTarget, path) {
502
- if (path.startsWith("@")) {
503
- return currentTarget + unalias(defaultReferences, path);
504
- } else {
505
- return currentTarget + "/" + path;
506
- }
507
- }
91
+ if (action.isBound) {
92
+ var unBoundActionName = action.fullyQualifiedName.split('(')[0];
508
93
 
509
- function addAnnotationErrorMessage(path, oErrorMsg) {
510
- if (!ALL_ANNOTATION_ERRORS[path]) {
511
- ALL_ANNOTATION_ERRORS[path] = [oErrorMsg];
512
- } else {
513
- ALL_ANNOTATION_ERRORS[path].push(oErrorMsg);
514
- }
515
- }
94
+ if (!objectMap[unBoundActionName]) {
95
+ objectMap[unBoundActionName] = {
96
+ _type: 'UnboundGenericAction',
97
+ actions: []
98
+ };
99
+ }
516
100
 
517
- function resolveTarget(objectMap, currentTarget, path) {
518
- var pathOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
519
- var includeVisitedObjects = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
520
- var annotationType = arguments.length > 5 ? arguments[5] : undefined;
521
- var annotationsTerm = arguments.length > 6 ? arguments[6] : undefined;
101
+ objectMap[unBoundActionName].actions.push(action);
102
+ var actionSplit = action.fullyQualifiedName.split('(');
103
+ objectMap["".concat(actionSplit[1].split(')')[0], "/").concat(actionSplit[0])] = action;
104
+ }
522
105
 
523
- if (!path) {
524
- return undefined;
525
- } //const propertyPath = path;
106
+ action.parameters.forEach(function (parameter) {
107
+ objectMap[parameter.fullyQualifiedName] = parameter;
108
+ });
109
+ });
110
+ rawMetadata.schema.complexTypes.forEach(function (complexType) {
111
+ objectMap[complexType.fullyQualifiedName] = complexType;
112
+ complexType.properties.forEach(function (property) {
113
+ objectMap[property.fullyQualifiedName] = property;
114
+ });
115
+ });
116
+ rawMetadata.schema.typeDefinitions.forEach(function (typeDefinition) {
117
+ objectMap[typeDefinition.fullyQualifiedName] = typeDefinition;
118
+ });
119
+ rawMetadata.schema.entityTypes.forEach(function (entityType) {
120
+ entityType.annotations = {}; // 'annotations' property is mandatory
121
+
122
+ objectMap[entityType.fullyQualifiedName] = entityType;
123
+ entityType.entityProperties.forEach(function (property) {
124
+ objectMap[property.fullyQualifiedName] = property; // Handle complex types
125
+
126
+ var complexTypeDefinition = objectMap[property.type];
127
+
128
+ if ((0, utils_1.isComplexTypeDefinition)(complexTypeDefinition)) {
129
+ complexTypeDefinition.properties.forEach(function (complexTypeProp) {
130
+ var complexTypePropTarget = Object.assign(complexTypeProp, {
131
+ _type: 'Property',
132
+ fullyQualifiedName: property.fullyQualifiedName + '/' + complexTypeProp.name
133
+ });
134
+ objectMap[complexTypePropTarget.fullyQualifiedName] = complexTypePropTarget;
135
+ });
136
+ }
137
+ });
138
+ entityType.navigationProperties.forEach(function (navProperty) {
139
+ objectMap[navProperty.fullyQualifiedName] = navProperty;
140
+ });
141
+ });
142
+ Object.keys(rawMetadata.schema.annotations).forEach(function (annotationSource) {
143
+ rawMetadata.schema.annotations[annotationSource].forEach(function (annotationList) {
144
+ var currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
145
+ annotationList.annotations.forEach(function (annotation) {
146
+ var annotationFQN = "".concat(currentTargetName, "@").concat((0, utils_1.unalias)(rawMetadata.references, annotation.term));
526
147
 
148
+ if (annotation.qualifier) {
149
+ annotationFQN += "#".concat(annotation.qualifier);
150
+ }
527
151
 
528
- var aVisitedObjects = [];
152
+ objectMap[annotationFQN] = annotation;
153
+ annotation.fullyQualifiedName = annotationFQN;
154
+ });
155
+ });
156
+ });
157
+ return objectMap;
158
+ }
159
+ /**
160
+ * Combine two strings representing path in the metamodel while ensuring their specificities (annotation...) are respected.
161
+ *
162
+ * @param currentTarget the current path
163
+ * @param path the part we want to append
164
+ * @returns the complete path including the extension.
165
+ */
166
+
167
+
168
+ function combinePath(currentTarget, path) {
169
+ if (path.startsWith('@')) {
170
+ return currentTarget + (0, utils_1.unalias)(utils_1.defaultReferences, path);
171
+ } else {
172
+ return currentTarget + '/' + path;
173
+ }
174
+ }
529
175
 
530
- if (currentTarget && currentTarget._type === "Property") {
531
- currentTarget = objectMap[currentTarget.fullyQualifiedName.split("/")[0]];
532
- }
176
+ var ALL_ANNOTATION_ERRORS = {};
177
+ var ANNOTATION_ERRORS = [];
178
+ /**
179
+ * @param path
180
+ * @param oErrorMsg
181
+ */
533
182
 
534
- path = combinePath(currentTarget.fullyQualifiedName, path);
535
- var pathSplit = path.split("/");
536
- var targetPathSplit = [];
537
- pathSplit.forEach(function (pathPart) {
538
- // Separate out the annotation
539
- if (pathPart.indexOf("@") !== -1) {
540
- var _pathPart$split = pathPart.split("@"),
541
- _pathPart$split2 = _slicedToArray(_pathPart$split, 2),
542
- _path = _pathPart$split2[0],
543
- annotationPath = _pathPart$split2[1];
544
-
545
- targetPathSplit.push(_path);
546
- targetPathSplit.push("@".concat(annotationPath));
547
- } else {
548
- targetPathSplit.push(pathPart);
549
- }
550
- });
551
- var currentPath = path;
552
- var currentContext = currentTarget;
553
- var target = targetPathSplit.reduce(function (currentValue, pathPart) {
554
- if (pathPart === "$Type" && currentValue._type === "EntityType") {
555
- return currentValue;
183
+ function addAnnotationErrorMessage(path, oErrorMsg) {
184
+ if (!ALL_ANNOTATION_ERRORS[path]) {
185
+ ALL_ANNOTATION_ERRORS[path] = [oErrorMsg];
186
+ } else {
187
+ ALL_ANNOTATION_ERRORS[path].push(oErrorMsg);
188
+ }
556
189
  }
190
+ /**
191
+ * Resolves a specific path based on the objectMap.
192
+ *
193
+ * @param objectMap
194
+ * @param currentTarget
195
+ * @param path
196
+ * @param pathOnly
197
+ * @param includeVisitedObjects
198
+ * @param annotationsTerm
199
+ * @returns the resolved object
200
+ */
201
+
202
+
203
+ function _resolveTarget(objectMap, currentTarget, path) {
204
+ var pathOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
205
+ var includeVisitedObjects = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
206
+ var annotationsTerm = arguments.length > 5 ? arguments[5] : undefined;
207
+ var oErrorMsg;
208
+
209
+ if (!path) {
210
+ return undefined;
211
+ }
557
212
 
558
- if (pathPart.length === 0) {
559
- // Empty Path after an entitySet means entityType
560
- if (currentValue && currentValue._type === "EntitySet" && currentValue.entityType) {
561
- if (includeVisitedObjects) {
562
- aVisitedObjects.push(currentValue);
563
- }
213
+ var aVisitedObjects = [];
564
214
 
565
- currentValue = currentValue.entityType;
215
+ if (currentTarget && currentTarget._type === 'Property') {
216
+ currentTarget = objectMap[currentTarget.fullyQualifiedName.split('/')[0]];
566
217
  }
567
218
 
568
- if (currentValue && currentValue._type === "NavigationProperty" && currentValue.targetType) {
569
- if (includeVisitedObjects) {
570
- aVisitedObjects.push(currentValue);
219
+ path = combinePath(currentTarget.fullyQualifiedName, path);
220
+ var pathSplit = path.split('/');
221
+ var targetPathSplit = [];
222
+ pathSplit.forEach(function (pathPart) {
223
+ // Separate out the annotation
224
+ if (pathPart.indexOf('@') !== -1) {
225
+ var _pathPart$split = pathPart.split('@'),
226
+ _pathPart$split2 = _slicedToArray(_pathPart$split, 2),
227
+ splittedPath = _pathPart$split2[0],
228
+ annotationPath = _pathPart$split2[1];
229
+
230
+ targetPathSplit.push(splittedPath);
231
+ targetPathSplit.push("@".concat(annotationPath));
232
+ } else {
233
+ targetPathSplit.push(pathPart);
234
+ }
235
+ });
236
+ var currentPath = path;
237
+ var currentContext = currentTarget;
238
+ var target = targetPathSplit.reduce(function (currentValue, pathPart) {
239
+ if (pathPart === '$Type' && currentValue._type === 'EntityType') {
240
+ return currentValue;
571
241
  }
572
242
 
573
- currentValue = currentValue.targetType;
574
- }
243
+ if ((pathPart === '@$ui5.overload' || pathPart === '0') && currentValue._type === 'Action') {
244
+ return currentValue;
245
+ }
575
246
 
576
- return currentValue;
577
- }
247
+ if (pathPart.length === 0) {
248
+ // Empty Path after an entitySet means entityType
249
+ if (currentValue && currentValue._type === 'EntitySet' && currentValue.entityType) {
250
+ if (includeVisitedObjects) {
251
+ aVisitedObjects.push(currentValue);
252
+ }
578
253
 
579
- if (includeVisitedObjects && currentValue !== null && currentValue !== undefined) {
580
- aVisitedObjects.push(currentValue);
581
- }
254
+ currentValue = currentValue.entityType;
255
+ }
582
256
 
583
- if (!currentValue) {
584
- currentPath = pathPart;
585
- } else if (currentValue._type === "EntitySet" && pathPart === "$Type") {
586
- currentValue = currentValue.targetType;
587
- return currentValue;
588
- } else if (currentValue._type === "EntitySet" && currentValue.entityType) {
589
- currentPath = combinePath(currentValue.entityTypeName, pathPart);
590
- } else if (currentValue._type === "NavigationProperty" && currentValue.targetTypeName) {
591
- currentPath = combinePath(currentValue.targetTypeName, pathPart);
592
- } else if (currentValue._type === "NavigationProperty" && currentValue.targetType) {
593
- currentPath = combinePath(currentValue.targetType.fullyQualifiedName, pathPart);
594
- } else if (currentValue._type === "Property") {
595
- // ComplexType or Property
596
- if (currentValue.targetType) {
597
- currentPath = combinePath(currentValue.targetType.fullyQualifiedName, pathPart);
598
- } else {
599
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
600
- }
601
- } else if (currentValue._type === "Action" && currentValue.isBound) {
602
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
257
+ if (currentValue && currentValue._type === 'NavigationProperty' && currentValue.targetType) {
258
+ if (includeVisitedObjects) {
259
+ aVisitedObjects.push(currentValue);
260
+ }
603
261
 
604
- if (!objectMap[currentPath]) {
605
- currentPath = combinePath(currentValue.sourceType, pathPart);
606
- }
607
- } else if (currentValue._type === "ActionParameter" && currentValue.isEntitySet) {
608
- currentPath = combinePath(currentValue.type, pathPart);
609
- } else if (currentValue._type === "ActionParameter" && !currentValue.isEntitySet) {
610
- currentPath = combinePath(currentTarget.fullyQualifiedName.substr(0, currentTarget.fullyQualifiedName.lastIndexOf("/")), pathPart);
262
+ currentValue = currentValue.targetType;
263
+ }
611
264
 
612
- if (!objectMap[currentPath]) {
613
- var lastIdx = currentTarget.fullyQualifiedName.lastIndexOf("/");
265
+ return currentValue;
266
+ }
614
267
 
615
- if (lastIdx === -1) {
616
- lastIdx = currentTarget.fullyQualifiedName.length;
268
+ if (includeVisitedObjects && currentValue !== null && currentValue !== undefined) {
269
+ aVisitedObjects.push(currentValue);
617
270
  }
618
271
 
619
- currentPath = combinePath(objectMap[currentTarget.fullyQualifiedName.substr(0, lastIdx)].sourceType, pathPart);
620
- }
621
- } else {
622
- currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
623
-
624
- if (pathPart !== "name" && currentValue[pathPart] !== undefined) {
625
- return currentValue[pathPart];
626
- } else if (pathPart === "$AnnotationPath" && currentValue.$target) {
627
- var _currentContext = objectMap[currentValue.fullyQualifiedName.split("@")[0]];
628
- var subTarget = resolveTarget(objectMap, _currentContext, currentValue.value, false, true);
629
- subTarget.visitedObjects.forEach(function (visitedSubObject) {
630
- if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
631
- aVisitedObjects.push(visitedSubObject);
272
+ if (!currentValue) {
273
+ currentPath = pathPart;
274
+ } else if (currentValue._type === 'EntitySet' && pathPart === '$Type') {
275
+ currentValue = currentValue.targetType;
276
+ return currentValue;
277
+ } else if (currentValue._type === 'EntitySet' && currentValue.entityType) {
278
+ currentPath = combinePath(currentValue.entityTypeName, pathPart);
279
+ } else if (currentValue._type === 'NavigationProperty') {
280
+ currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
281
+
282
+ if (!objectMap[currentPath]) {
283
+ // Fallback log error
284
+ currentPath = combinePath(currentValue.targetTypeName, pathPart);
632
285
  }
633
- });
634
- return subTarget.target;
635
- } else if (pathPart === "$Path" && currentValue.$target) {
636
- currentContext = aVisitedObjects.concat().reverse().find(function (obj) {
637
- return obj._type === "EntityType" || obj._type === "EntitySet" || obj._type === "NavigationProperty";
638
- });
286
+ } else if (currentValue._type === 'Property') {
287
+ // ComplexType or Property
288
+ if (currentValue.targetType) {
289
+ currentPath = combinePath(currentValue.targetType.fullyQualifiedName, pathPart);
290
+ } else {
291
+ currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
292
+ }
293
+ } else if (currentValue._type === 'Action' && currentValue.isBound) {
294
+ currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
639
295
 
640
- if (currentContext) {
641
- var _subTarget = resolveTarget(objectMap, currentContext, currentValue.path, false, true);
296
+ if (pathPart === '$Parameter') {
297
+ return currentValue.parameters;
298
+ }
642
299
 
643
- _subTarget.visitedObjects.forEach(function (visitedSubObject) {
644
- if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
645
- aVisitedObjects.push(visitedSubObject);
300
+ if (!objectMap[currentPath]) {
301
+ currentPath = combinePath(currentValue.sourceType, pathPart);
302
+ }
303
+ } else if (currentValue._type === 'ActionParameter' && currentValue.isEntitySet) {
304
+ currentPath = combinePath(currentValue.type, pathPart);
305
+ } else if (currentValue._type === 'ActionParameter' && !currentValue.isEntitySet) {
306
+ currentPath = combinePath(currentTarget.fullyQualifiedName.substring(0, currentTarget.fullyQualifiedName.lastIndexOf('/')), pathPart);
307
+
308
+ if (!objectMap[currentPath]) {
309
+ var lastIdx = currentTarget.fullyQualifiedName.lastIndexOf('/');
310
+
311
+ if (lastIdx === -1) {
312
+ lastIdx = currentTarget.fullyQualifiedName.length;
646
313
  }
647
- });
648
314
 
649
- return _subTarget.target;
650
- }
315
+ currentPath = combinePath(objectMap[currentTarget.fullyQualifiedName.substring(0, lastIdx)].sourceType, pathPart);
316
+ }
317
+ } else {
318
+ currentPath = combinePath(currentValue.fullyQualifiedName, pathPart);
651
319
 
652
- return currentValue.$target;
653
- } else if (pathPart.startsWith("$Path") && currentValue.$target) {
654
- var intermediateTarget = currentValue.$target;
655
- currentPath = combinePath(intermediateTarget.fullyQualifiedName, pathPart.substr(5));
656
- } else if (currentValue.hasOwnProperty("$Type") && !objectMap[currentPath]) {
657
- // This is now an annotation value
658
- var entityType = objectMap[currentValue.fullyQualifiedName.split("@")[0]];
320
+ if (pathPart !== 'name' && currentValue[pathPart] !== undefined) {
321
+ return currentValue[pathPart];
322
+ } else if (pathPart === '$AnnotationPath' && currentValue.$target) {
323
+ var contextToResolve = objectMap[currentValue.fullyQualifiedName.split('@')[0]];
659
324
 
660
- if (entityType) {
661
- currentPath = combinePath(entityType.fullyQualifiedName, pathPart);
662
- }
663
- }
664
- }
325
+ var subTarget = _resolveTarget(objectMap, contextToResolve, currentValue.value, false, true);
665
326
 
666
- return objectMap[currentPath];
667
- }, null);
327
+ subTarget.visitedObjects.forEach(function (visitedSubObject) {
328
+ if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
329
+ aVisitedObjects.push(visitedSubObject);
330
+ }
331
+ });
332
+ return subTarget.target;
333
+ } else if (pathPart === '$Path' && currentValue.$target) {
334
+ currentContext = aVisitedObjects.concat().reverse().find(function (obj) {
335
+ return obj._type === 'EntityType' || obj._type === 'EntitySet' || obj._type === 'NavigationProperty';
336
+ });
668
337
 
669
- if (!target) {
670
- if (annotationsTerm && annotationType) {
671
- var oErrorMsg = {
672
- message: "Unable to resolve the path expression: " + "\n" + path + "\n" + "\n" + "Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n" + "<Annotation Term = " + annotationsTerm + ">" + "\n" + "<Record Type = " + annotationType + ">" + "\n" + "<AnnotationPath = " + path + ">"
673
- };
674
- addAnnotationErrorMessage(path, oErrorMsg);
675
- } else {
676
- var oErrorMsg = {
677
- message: "Unable to resolve the path expression: " + path + "\n" + "\n" + "Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n" + "<Annotation Term = " + pathSplit[0] + ">" + "\n" + "<PropertyValue Path= " + pathSplit[1] + ">"
678
- };
679
- addAnnotationErrorMessage(path, oErrorMsg);
680
- } // console.log("Missing target " + path);
338
+ if (currentContext) {
339
+ var _subTarget = _resolveTarget(objectMap, currentContext, currentValue.path, false, true);
681
340
 
682
- }
341
+ _subTarget.visitedObjects.forEach(function (visitedSubObject) {
342
+ if (aVisitedObjects.indexOf(visitedSubObject) === -1) {
343
+ aVisitedObjects.push(visitedSubObject);
344
+ }
345
+ });
683
346
 
684
- if (pathOnly) {
685
- return currentPath;
686
- }
347
+ return _subTarget.target;
348
+ }
687
349
 
688
- if (includeVisitedObjects) {
689
- return {
690
- visitedObjects: aVisitedObjects,
691
- target: target
692
- };
693
- }
350
+ return currentValue.$target;
351
+ } else if (pathPart.startsWith('$Path') && currentValue.$target) {
352
+ var intermediateTarget = currentValue.$target;
353
+ currentPath = combinePath(intermediateTarget.fullyQualifiedName, pathPart.substring(5));
354
+ } else if (currentValue.hasOwnProperty('$Type') && !objectMap[currentPath]) {
355
+ // This is now an annotation value
356
+ var entityType = objectMap[currentValue.fullyQualifiedName.split('@')[0]];
694
357
 
695
- return target;
696
- }
358
+ if (entityType) {
359
+ currentPath = combinePath(entityType.fullyQualifiedName, pathPart);
360
+ }
361
+ }
362
+ }
697
363
 
698
- function isAnnotationPath(pathStr) {
699
- return pathStr.indexOf("@") !== -1;
700
- }
364
+ return objectMap[currentPath];
365
+ }, null);
701
366
 
702
- function parseValue(propertyValue, valueFQN, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm) {
703
- if (propertyValue === undefined) {
704
- return undefined;
705
- }
367
+ if (!target) {
368
+ if (annotationsTerm) {
369
+ var annotationType = inferTypeFromTerm(annotationsTerm, currentTarget);
370
+ oErrorMsg = {
371
+ message: 'Unable to resolve the path expression: ' + '\n' + path + '\n' + '\n' + 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' + '<Annotation Term = ' + annotationsTerm + '>' + '\n' + '<Record Type = ' + annotationType + '>' + '\n' + '<AnnotationPath = ' + path + '>'
372
+ };
373
+ addAnnotationErrorMessage(path, oErrorMsg);
374
+ } else {
375
+ oErrorMsg = {
376
+ message: 'Unable to resolve the path expression: ' + path + '\n' + '\n' + 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' + '<Annotation Term = ' + pathSplit[0] + '>' + '\n' + '<PropertyValue Path= ' + pathSplit[1] + '>'
377
+ };
378
+ addAnnotationErrorMessage(path, oErrorMsg);
379
+ }
380
+ }
381
+
382
+ if (pathOnly) {
383
+ return currentPath;
384
+ }
385
+
386
+ if (includeVisitedObjects) {
387
+ return {
388
+ visitedObjects: aVisitedObjects,
389
+ target: target
390
+ };
391
+ }
706
392
 
707
- switch (propertyValue.type) {
708
- case "String":
709
- return propertyValue.String;
393
+ return target;
394
+ }
395
+ /**
396
+ * Typeguard to check if the path contains an annotation.
397
+ *
398
+ * @param pathStr the path to evaluate
399
+ * @returns true if there is an annotation in the path.
400
+ */
710
401
 
711
- case "Int":
712
- return propertyValue.Int;
713
402
 
714
- case "Bool":
715
- return propertyValue.Bool;
403
+ function isAnnotationPath(pathStr) {
404
+ return pathStr.indexOf('@') !== -1;
405
+ }
716
406
 
717
- case "Decimal":
718
- return propertyValue.Decimal;
407
+ function parseValue(propertyValue, valueFQN, objectMap, context) {
408
+ if (propertyValue === undefined) {
409
+ return undefined;
410
+ }
719
411
 
720
- case "Date":
721
- return propertyValue.Date;
412
+ switch (propertyValue.type) {
413
+ case 'String':
414
+ return propertyValue.String;
415
+
416
+ case 'Int':
417
+ return propertyValue.Int;
418
+
419
+ case 'Bool':
420
+ return propertyValue.Bool;
421
+
422
+ case 'Decimal':
423
+ return (0, utils_1.Decimal)(propertyValue.Decimal);
424
+
425
+ case 'Date':
426
+ return propertyValue.Date;
427
+
428
+ case 'EnumMember':
429
+ return (0, utils_1.alias)(context.rawMetadata.references, propertyValue.EnumMember);
430
+
431
+ case 'PropertyPath':
432
+ return {
433
+ type: 'PropertyPath',
434
+ value: propertyValue.PropertyPath,
435
+ fullyQualifiedName: valueFQN,
436
+ $target: _resolveTarget(objectMap, context.currentTarget, propertyValue.PropertyPath, false, false, context.currentTerm)
437
+ };
438
+
439
+ case 'NavigationPropertyPath':
440
+ return {
441
+ type: 'NavigationPropertyPath',
442
+ value: propertyValue.NavigationPropertyPath,
443
+ fullyQualifiedName: valueFQN,
444
+ $target: _resolveTarget(objectMap, context.currentTarget, propertyValue.NavigationPropertyPath, false, false, context.currentTerm)
445
+ };
446
+
447
+ case 'AnnotationPath':
448
+ var annotationTarget = _resolveTarget(objectMap, context.currentTarget, (0, utils_1.unalias)(context.rawMetadata.references, propertyValue.AnnotationPath), true, false, context.currentTerm);
449
+
450
+ var annotationPath = {
451
+ type: 'AnnotationPath',
452
+ value: propertyValue.AnnotationPath,
453
+ fullyQualifiedName: valueFQN,
454
+ $target: annotationTarget,
455
+ annotationsTerm: context.currentTerm,
456
+ term: '',
457
+ path: ''
458
+ };
459
+ context.unresolvedAnnotations.push({
460
+ inline: false,
461
+ toResolve: annotationPath
462
+ });
463
+ return annotationPath;
722
464
 
723
- case "EnumMember":
724
- return alias(parserOutput.references, propertyValue.EnumMember);
465
+ case 'Path':
466
+ var $target = _resolveTarget(objectMap, context.currentTarget, propertyValue.Path, true, false, context.currentTerm);
725
467
 
726
- case "PropertyPath":
727
- return {
728
- type: "PropertyPath",
729
- value: propertyValue.PropertyPath,
730
- fullyQualifiedName: valueFQN,
731
- $target: resolveTarget(objectMap, currentTarget, propertyValue.PropertyPath, false, false, annotationType, annotationsTerm)
732
- };
468
+ var path = new Path(propertyValue, $target, context.currentTerm, '');
469
+ context.unresolvedAnnotations.push({
470
+ inline: isAnnotationPath(propertyValue.Path),
471
+ toResolve: path
472
+ });
473
+ return path;
474
+
475
+ case 'Record':
476
+ return parseRecord(propertyValue.Record, valueFQN, objectMap, context);
477
+
478
+ case 'Collection':
479
+ return parseCollection(propertyValue.Collection, valueFQN, objectMap, context);
480
+
481
+ case 'Apply':
482
+ case 'Null':
483
+ case 'Not':
484
+ case 'Eq':
485
+ case 'Ne':
486
+ case 'Gt':
487
+ case 'Ge':
488
+ case 'Lt':
489
+ case 'Le':
490
+ case 'If':
491
+ case 'And':
492
+ case 'Or':
493
+ default:
494
+ return propertyValue;
495
+ }
496
+ }
497
+ /**
498
+ * Infer the type of a term based on its type.
499
+ *
500
+ * @param annotationsTerm The annotation term
501
+ * @param annotationTarget the annotation target
502
+ * @returns the inferred type.
503
+ */
733
504
 
734
- case "NavigationPropertyPath":
735
- return {
736
- type: "NavigationPropertyPath",
737
- value: propertyValue.NavigationPropertyPath,
738
- fullyQualifiedName: valueFQN,
739
- $target: resolveTarget(objectMap, currentTarget, propertyValue.NavigationPropertyPath, false, false, annotationType, annotationsTerm)
740
- };
741
505
 
742
- case "AnnotationPath":
743
- var annotationTarget = resolveTarget(objectMap, currentTarget, unalias(parserOutput.references, propertyValue.AnnotationPath), true, false, annotationType, annotationsTerm);
744
- var annotationPath = {
745
- type: "AnnotationPath",
746
- value: propertyValue.AnnotationPath,
747
- fullyQualifiedName: valueFQN,
748
- $target: annotationTarget,
749
- annotationType: annotationType,
750
- annotationsTerm: annotationsTerm,
751
- term: "",
752
- path: ""
506
+ function inferTypeFromTerm(annotationsTerm, annotationTarget) {
507
+ var targetType = utils_1.TermToTypes[annotationsTerm];
508
+ var oErrorMsg = {
509
+ isError: false,
510
+ message: "The type of the record used within the term ".concat(annotationsTerm, " was not defined and was inferred as ").concat(targetType, ".\nHint: If possible, try to maintain the Type property for each Record.\n<Annotations Target=\"").concat(annotationTarget, "\">\n\t<Annotation Term=\"").concat(annotationsTerm, "\">\n\t\t<Record>...</Record>\n\t</Annotation>\n</Annotations>")
753
511
  };
754
- toResolve.push({
755
- inline: false,
756
- toResolve: annotationPath
757
- });
758
- return annotationPath;
759
-
760
- case "Path":
761
- var $target = resolveTarget(objectMap, currentTarget, propertyValue.Path, true, false, annotationType, annotationsTerm);
762
- var path = new Path(propertyValue, $target, annotationsTerm, annotationType, "");
763
- toResolve.push({
764
- inline: isAnnotationPath(propertyValue.Path),
765
- toResolve: path
766
- });
767
- return path;
768
-
769
- case "Record":
770
- return parseRecord(propertyValue.Record, valueFQN, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm);
771
-
772
- case "Collection":
773
- return parseCollection(propertyValue.Collection, valueFQN, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm);
774
-
775
- case "Apply":
776
- case "Null":
777
- case "Not":
778
- case "Eq":
779
- case "Ne":
780
- case "Gt":
781
- case "Ge":
782
- case "Lt":
783
- case "Le":
784
- case "If":
785
- case "And":
786
- case "Or":
787
- return propertyValue;
788
- }
789
- }
512
+ addAnnotationErrorMessage(annotationTarget + '/' + annotationsTerm, oErrorMsg);
513
+ return targetType;
514
+ }
790
515
 
791
- function inferTypeFromTerm(annotationsTerm, parserOutput, annotationTarget) {
792
- var targetType = TermToTypes[annotationsTerm];
793
- var oErrorMsg = {
794
- isError: false,
795
- message: "The type of the record used within the term ".concat(annotationsTerm, " was not defined and was inferred as ").concat(targetType, ".\nHint: If possible, try to maintain the Type property for each Record.\n<Annotations Target=\"").concat(annotationTarget, "\">\n\t<Annotation Term=\"").concat(annotationsTerm, "\">\n\t\t<Record>...</Record>\n\t</Annotation>\n</Annotations>")
796
- };
797
- addAnnotationErrorMessage(annotationTarget + "/" + annotationsTerm, oErrorMsg);
798
- return targetType;
799
- }
516
+ function isDataFieldWithForAction(annotationContent, annotationTerm) {
517
+ return annotationContent.hasOwnProperty('Action') && (annotationTerm.$Type === 'com.sap.vocabularies.UI.v1.DataFieldForAction' || annotationTerm.$Type === 'com.sap.vocabularies.UI.v1.DataFieldWithAction');
518
+ }
800
519
 
801
- function parseRecord(recordDefinition, currentFQN, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm) {
802
- var targetType;
520
+ function parseRecordType(recordDefinition, context) {
521
+ var targetType;
803
522
 
804
- if (!recordDefinition.type && annotationsTerm) {
805
- targetType = inferTypeFromTerm(annotationsTerm, parserOutput, currentTarget.fullyQualifiedName);
806
- } else {
807
- targetType = unalias(parserOutput.references, recordDefinition.type);
808
- }
809
-
810
- var annotationTerm = {
811
- $Type: targetType,
812
- fullyQualifiedName: currentFQN
813
- };
814
- var annotationContent = {};
523
+ if (!recordDefinition.type && context.currentTerm) {
524
+ targetType = inferTypeFromTerm(context.currentTerm, context.currentTarget.fullyQualifiedName);
525
+ } else {
526
+ targetType = (0, utils_1.unalias)(context.rawMetadata.references, recordDefinition.type);
527
+ }
815
528
 
816
- if (recordDefinition.annotations && Array.isArray(recordDefinition.annotations)) {
817
- var subAnnotationList = {
818
- target: currentFQN,
819
- annotations: recordDefinition.annotations,
820
- __source: annotationSource
821
- };
822
- unresolvedAnnotations.push(subAnnotationList);
823
- }
529
+ return targetType;
530
+ }
824
531
 
825
- if (recordDefinition.propertyValues) {
826
- recordDefinition.propertyValues.forEach(function (propertyValue) {
827
- annotationContent[propertyValue.name] = parseValue(propertyValue.value, "".concat(currentFQN, "/").concat(propertyValue.name), parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm);
532
+ function parseRecord(recordDefinition, currentFQN, objectMap, context) {
533
+ var targetType = parseRecordType(recordDefinition, context);
534
+ var annotationTerm = {
535
+ $Type: targetType,
536
+ fullyQualifiedName: currentFQN
537
+ };
538
+ var annotationContent = {};
828
539
 
829
- if (propertyValue.annotations && Array.isArray(propertyValue.annotations)) {
830
- var _subAnnotationList = {
831
- target: "".concat(currentFQN, "/").concat(propertyValue.name),
832
- annotations: propertyValue.annotations,
833
- __source: annotationSource
540
+ if (Array.isArray(recordDefinition.annotations)) {
541
+ var subAnnotationList = {
542
+ target: currentFQN,
543
+ annotations: recordDefinition.annotations,
544
+ __source: context.currentSource
834
545
  };
835
- unresolvedAnnotations.push(_subAnnotationList);
546
+ context.additionalAnnotations.push(subAnnotationList);
836
547
  }
837
548
 
838
- if (annotationContent.hasOwnProperty("Action") && (annotationTerm.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" || annotationTerm.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithAction")) {
839
- annotationContent.ActionTarget = currentTarget.actions && currentTarget.actions[annotationContent.Action] || objectMap[annotationContent.Action];
549
+ if (recordDefinition.propertyValues) {
550
+ recordDefinition.propertyValues.forEach(function (propertyValue) {
551
+ annotationContent[propertyValue.name] = parseValue(propertyValue.value, "".concat(currentFQN, "/").concat(propertyValue.name), objectMap, context);
552
+
553
+ if (Array.isArray(propertyValue.annotations)) {
554
+ var _subAnnotationList = {
555
+ target: "".concat(currentFQN, "/").concat(propertyValue.name),
556
+ annotations: propertyValue.annotations,
557
+ __source: context.currentSource
558
+ };
559
+ context.additionalAnnotations.push(_subAnnotationList);
560
+ }
840
561
 
841
- if (!annotationContent.ActionTarget) {
842
- // Add to diagnostics debugger;
843
- ANNOTATION_ERRORS.push({
844
- message: "Unable to resolve the action " + annotationContent.Action + " defined for " + annotationTerm.fullyQualifiedName
845
- });
846
- }
562
+ if (isDataFieldWithForAction(annotationContent, annotationTerm)) {
563
+ annotationContent.ActionTarget = context.currentTarget.actions && context.currentTarget.actions[annotationContent.Action] || objectMap[annotationContent.Action];
564
+
565
+ if (!annotationContent.ActionTarget) {
566
+ // Add to diagnostics debugger;
567
+ ANNOTATION_ERRORS.push({
568
+ message: 'Unable to resolve the action ' + annotationContent.Action + ' defined for ' + annotationTerm.fullyQualifiedName
569
+ });
570
+ }
571
+ }
572
+ });
847
573
  }
848
- });
849
- }
850
574
 
851
- return Object.assign(annotationTerm, annotationContent);
852
- }
575
+ return Object.assign(annotationTerm, annotationContent);
576
+ }
577
+ /**
578
+ * Retrieve or infer the collection type based on its content.
579
+ *
580
+ * @param collectionDefinition
581
+ * @returns the type of the collection
582
+ */
583
+
584
+
585
+ function getOrInferCollectionType(collectionDefinition) {
586
+ var type = collectionDefinition.type;
587
+
588
+ if (type === undefined && collectionDefinition.length > 0) {
589
+ var firstColItem = collectionDefinition[0];
590
+
591
+ if (firstColItem.hasOwnProperty('PropertyPath')) {
592
+ type = 'PropertyPath';
593
+ } else if (firstColItem.hasOwnProperty('Path')) {
594
+ type = 'Path';
595
+ } else if (firstColItem.hasOwnProperty('AnnotationPath')) {
596
+ type = 'AnnotationPath';
597
+ } else if (firstColItem.hasOwnProperty('NavigationPropertyPath')) {
598
+ type = 'NavigationPropertyPath';
599
+ } else if (typeof firstColItem === 'object' && (firstColItem.hasOwnProperty('type') || firstColItem.hasOwnProperty('propertyValues'))) {
600
+ type = 'Record';
601
+ } else if (typeof firstColItem === 'string') {
602
+ type = 'String';
603
+ }
604
+ } else if (type === undefined) {
605
+ type = 'EmptyCollection';
606
+ }
853
607
 
854
- function getOrInferCollectionType(collectionDefinition) {
855
- var type = collectionDefinition.type;
856
-
857
- if (type === undefined && collectionDefinition.length > 0) {
858
- var firstColItem = collectionDefinition[0];
859
-
860
- if (firstColItem.hasOwnProperty("PropertyPath")) {
861
- type = "PropertyPath";
862
- } else if (firstColItem.hasOwnProperty("Path")) {
863
- type = "Path";
864
- } else if (firstColItem.hasOwnProperty("AnnotationPath")) {
865
- type = "AnnotationPath";
866
- } else if (firstColItem.hasOwnProperty("NavigationPropertyPath")) {
867
- type = "NavigationPropertyPath";
868
- } else if (typeof firstColItem === "object" && (firstColItem.hasOwnProperty("type") || firstColItem.hasOwnProperty("propertyValues"))) {
869
- type = "Record";
870
- } else if (typeof firstColItem === "string") {
871
- type = "String";
608
+ return type;
872
609
  }
873
- } else if (type === undefined) {
874
- type = "EmptyCollection";
875
- }
876
610
 
877
- return type;
878
- }
611
+ function parseCollection(collectionDefinition, parentFQN, objectMap, context) {
612
+ var collectionDefinitionType = getOrInferCollectionType(collectionDefinition);
613
+
614
+ switch (collectionDefinitionType) {
615
+ case 'PropertyPath':
616
+ return collectionDefinition.map(function (propertyPath, propertyIdx) {
617
+ return {
618
+ type: 'PropertyPath',
619
+ value: propertyPath.PropertyPath,
620
+ fullyQualifiedName: "".concat(parentFQN, "/").concat(propertyIdx),
621
+ $target: _resolveTarget(objectMap, context.currentTarget, propertyPath.PropertyPath, false, false, context.currentTerm)
622
+ };
623
+ });
879
624
 
880
- function parseCollection(collectionDefinition, parentFQN, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm) {
881
- var collectionDefinitionType = getOrInferCollectionType(collectionDefinition);
625
+ case 'Path':
626
+ return collectionDefinition.map(function (pathValue) {
627
+ var $target = _resolveTarget(objectMap, context.currentTarget, pathValue.Path, true, false, context.currentTerm);
882
628
 
883
- switch (collectionDefinitionType) {
884
- case "PropertyPath":
885
- return collectionDefinition.map(function (propertyPath, propertyIdx) {
886
- return {
887
- type: "PropertyPath",
888
- value: propertyPath.PropertyPath,
889
- fullyQualifiedName: "".concat(parentFQN, "/").concat(propertyIdx),
890
- $target: resolveTarget(objectMap, currentTarget, propertyPath.PropertyPath, false, false, annotationType, annotationsTerm)
891
- };
892
- });
629
+ var path = new Path(pathValue, $target, context.currentTerm, '');
630
+ context.unresolvedAnnotations.push({
631
+ inline: isAnnotationPath(pathValue.Path),
632
+ toResolve: path
633
+ });
634
+ return path;
635
+ });
893
636
 
894
- case "Path":
895
- return collectionDefinition.map(function (pathValue) {
896
- var $target = resolveTarget(objectMap, currentTarget, pathValue.Path, true, false, annotationType, annotationsTerm);
897
- var path = new Path(pathValue, $target, annotationsTerm, annotationType, "");
898
- toResolve.push({
899
- inline: isAnnotationPath(pathValue.Path),
900
- toResolve: path
901
- });
902
- return path;
903
- });
637
+ case 'AnnotationPath':
638
+ return collectionDefinition.map(function (annotationPath, annotationIdx) {
639
+ var annotationTarget = _resolveTarget(objectMap, context.currentTarget, annotationPath.AnnotationPath, true, false, context.currentTerm);
640
+
641
+ var annotationCollectionElement = {
642
+ type: 'AnnotationPath',
643
+ value: annotationPath.AnnotationPath,
644
+ fullyQualifiedName: "".concat(parentFQN, "/").concat(annotationIdx),
645
+ $target: annotationTarget,
646
+ annotationsTerm: context.currentTerm,
647
+ term: '',
648
+ path: ''
649
+ };
650
+ context.unresolvedAnnotations.push({
651
+ inline: false,
652
+ toResolve: annotationCollectionElement
653
+ });
654
+ return annotationCollectionElement;
655
+ });
904
656
 
905
- case "AnnotationPath":
906
- return collectionDefinition.map(function (annotationPath, annotationIdx) {
907
- var annotationTarget = resolveTarget(objectMap, currentTarget, annotationPath.AnnotationPath, true, false, annotationType, annotationsTerm);
908
- var annotationCollectionElement = {
909
- type: "AnnotationPath",
910
- value: annotationPath.AnnotationPath,
911
- fullyQualifiedName: "".concat(parentFQN, "/").concat(annotationIdx),
912
- $target: annotationTarget,
913
- annotationType: annotationType,
914
- annotationsTerm: annotationsTerm,
915
- term: "",
916
- path: ""
917
- };
918
- toResolve.push({
919
- inline: false,
920
- toResolve: annotationCollectionElement
921
- });
922
- return annotationCollectionElement;
923
- });
657
+ case 'NavigationPropertyPath':
658
+ return collectionDefinition.map(function (navPropertyPath, navPropIdx) {
659
+ return {
660
+ type: 'NavigationPropertyPath',
661
+ value: navPropertyPath.NavigationPropertyPath,
662
+ fullyQualifiedName: "".concat(parentFQN, "/").concat(navPropIdx),
663
+ $target: _resolveTarget(objectMap, context.currentTarget, navPropertyPath.NavigationPropertyPath, false, false, context.currentTerm)
664
+ };
665
+ });
924
666
 
925
- case "NavigationPropertyPath":
926
- return collectionDefinition.map(function (navPropertyPath, navPropIdx) {
927
- return {
928
- type: "NavigationPropertyPath",
929
- value: navPropertyPath.NavigationPropertyPath,
930
- fullyQualifiedName: "".concat(parentFQN, "/").concat(navPropIdx),
931
- $target: resolveTarget(objectMap, currentTarget, navPropertyPath.NavigationPropertyPath, false, false, annotationType, annotationsTerm)
932
- };
933
- });
667
+ case 'Record':
668
+ return collectionDefinition.map(function (recordDefinition, recordIdx) {
669
+ return parseRecord(recordDefinition, "".concat(parentFQN, "/").concat(recordIdx), objectMap, context);
670
+ });
934
671
 
935
- case "Record":
936
- return collectionDefinition.map(function (recordDefinition, recordIdx) {
937
- return parseRecord(recordDefinition, "".concat(parentFQN, "/").concat(recordIdx), parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotationsTerm);
938
- });
672
+ case 'Apply':
673
+ case 'Null':
674
+ case 'If':
675
+ case 'Eq':
676
+ case 'Ne':
677
+ case 'Lt':
678
+ case 'Gt':
679
+ case 'Le':
680
+ case 'Ge':
681
+ case 'Not':
682
+ case 'And':
683
+ case 'Or':
684
+ return collectionDefinition.map(function (ifValue) {
685
+ return ifValue;
686
+ });
939
687
 
940
- case "Apply":
941
- case "Null":
942
- case "If":
943
- case "Eq":
944
- case "Ne":
945
- case "Lt":
946
- case "Gt":
947
- case "Le":
948
- case "Ge":
949
- case "Not":
950
- case "And":
951
- case "Or":
952
- return collectionDefinition.map(function (ifValue) {
953
- return ifValue;
954
- });
688
+ case 'String':
689
+ return collectionDefinition.map(function (stringValue) {
690
+ if (typeof stringValue === 'string') {
691
+ return stringValue;
692
+ } else if (stringValue === undefined) {
693
+ return stringValue;
694
+ } else {
695
+ return stringValue.String;
696
+ }
697
+ });
955
698
 
956
- case "String":
957
- return collectionDefinition.map(function (stringValue) {
958
- if (typeof stringValue === "string") {
959
- return stringValue;
960
- } else if (stringValue === undefined) {
961
- return stringValue;
962
- } else {
963
- return stringValue.String;
964
- }
965
- });
699
+ default:
700
+ if (collectionDefinition.length === 0) {
701
+ return [];
702
+ }
966
703
 
967
- default:
968
- if (collectionDefinition.length === 0) {
969
- return [];
704
+ throw new Error('Unsupported case');
970
705
  }
706
+ }
971
707
 
972
- throw new Error("Unsupported case");
973
- }
974
- }
708
+ function convertAnnotation(annotation, objectMap, context) {
709
+ if (annotation.record) {
710
+ return parseRecord(annotation.record, annotation.fullyQualifiedName, objectMap, context);
711
+ } else if (annotation.collection === undefined) {
712
+ if (annotation.value) {
713
+ return parseValue(annotation.value, annotation.fullyQualifiedName, objectMap, context);
714
+ } else {
715
+ return true;
716
+ }
717
+ } else if (annotation.collection) {
718
+ var collection = parseCollection(annotation.collection, annotation.fullyQualifiedName, objectMap, context);
719
+ collection.fullyQualifiedName = annotation.fullyQualifiedName;
720
+ return collection;
721
+ } else {
722
+ throw new Error('Unsupported case');
723
+ }
724
+ }
725
+ /**
726
+ * Creates a resolvePath function for a given entityType.
727
+ *
728
+ * @param entityType The entityType for which the function should be created
729
+ * @param objectMap The current objectMap
730
+ * @returns the resolvePath function that starts at the entityType
731
+ */
732
+
733
+
734
+ function createResolvePathFn(entityType, objectMap) {
735
+ return function (relativePath, includeVisitedObjects) {
736
+ var annotationTerm = '';
737
+ return _resolveTarget(objectMap, entityType, relativePath, false, includeVisitedObjects, annotationTerm);
738
+ };
739
+ }
975
740
 
976
- function convertAnnotation(annotation, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations) {
977
- if (annotation.record) {
978
- var annotationType = annotation.record.type ? unalias(parserOutput.references, annotation.record.type) : inferTypeFromTerm(annotation.term, parserOutput, currentTarget.fullyQualifiedName);
979
- var annotationTerm = {
980
- $Type: annotationType,
981
- fullyQualifiedName: annotation.fullyQualifiedName,
982
- qualifier: annotation.qualifier
983
- };
984
- var annotationContent = {};
985
- annotation.record.propertyValues.forEach(function (propertyValue) {
986
- annotationContent[propertyValue.name] = parseValue(propertyValue.value, "".concat(annotation.fullyQualifiedName, "/").concat(propertyValue.name), parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, annotationType, annotation.term);
741
+ function resolveV2NavigationProperty(navProp, associations, objectMap, outNavProp) {
742
+ var targetAssociation = associations.find(function (association) {
743
+ return association.fullyQualifiedName === navProp.relationship;
744
+ });
987
745
 
988
- if (annotationContent.hasOwnProperty("Action") && (!annotation.record || annotationTerm.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" || annotationTerm.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithAction")) {
989
- annotationContent.ActionTarget = currentTarget.actions && currentTarget.actions[annotationContent.Action] || objectMap[annotationContent.Action];
746
+ if (targetAssociation) {
747
+ var associationEnd = targetAssociation.associationEnd.find(function (end) {
748
+ return end.role === navProp.toRole;
749
+ });
990
750
 
991
- if (!annotationContent.ActionTarget) {
992
- ANNOTATION_ERRORS.push({
993
- message: "Unable to resolve the action " + annotationContent.Action + " defined for " + annotation.fullyQualifiedName
994
- }); // Add to diagnostics
995
- // debugger;
751
+ if (associationEnd) {
752
+ outNavProp.targetType = objectMap[associationEnd.type];
753
+ outNavProp.isCollection = associationEnd.multiplicity === '*';
996
754
  }
997
755
  }
998
- });
999
- return Object.assign(annotationTerm, annotationContent);
1000
- } else if (annotation.collection === undefined) {
1001
- if (annotation.value) {
1002
- return parseValue(annotation.value, annotation.fullyQualifiedName, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, "", annotation.term);
1003
- } else {
1004
- return true;
1005
756
  }
1006
- } else if (annotation.collection) {
1007
- var collection = parseCollection(annotation.collection, annotation.fullyQualifiedName, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations, "", annotation.term);
1008
- collection.fullyQualifiedName = annotation.fullyQualifiedName;
1009
- return collection;
1010
- } else {
1011
- throw new Error("Unsupported case");
1012
- }
1013
- }
1014
757
 
1015
- function createResolvePathFn(entityType, objectMap) {
1016
- return function (relativePath, includeVisitedObjects) {
1017
- var annotationTerm = "";
1018
- var annotationType = "";
1019
- return resolveTarget(objectMap, entityType, relativePath, false, includeVisitedObjects, annotationType, annotationTerm);
1020
- };
1021
- }
758
+ function resolveV4NavigationProperty(navProp, objectMap, outNavProp) {
759
+ outNavProp.targetType = objectMap[navProp.targetTypeName];
760
+ outNavProp.partner = navProp.partner;
761
+ outNavProp.isCollection = navProp.isCollection;
762
+ outNavProp.containsTarget = navProp.containsTarget;
763
+ outNavProp.referentialConstraint = navProp.referentialConstraint;
764
+ }
1022
765
 
1023
- function resolveNavigationProperties(entityTypes, associations, objectMap) {
1024
- entityTypes.forEach(function (entityType) {
1025
- entityType.navigationProperties = entityType.navigationProperties.map(function (navProp) {
1026
- var outNavProp = {
1027
- _type: "NavigationProperty",
1028
- name: navProp.name,
1029
- fullyQualifiedName: navProp.fullyQualifiedName,
1030
- partner: navProp.hasOwnProperty("partner") ? navProp.partner : undefined,
1031
- // targetTypeName: FullyQualifiedName;
1032
- // targetType: EntityType;
1033
- isCollection: navProp.hasOwnProperty("isCollection") ? navProp.isCollection : false,
1034
- containsTarget: navProp.hasOwnProperty("containsTarget") ? navProp.containsTarget : false,
1035
- referentialConstraint: navProp.referentialConstraint ? navProp.referentialConstraint : [],
1036
- annotations: {}
1037
- };
766
+ function isV4NavigationProperty(navProp) {
767
+ return !!navProp.targetTypeName;
768
+ }
1038
769
 
1039
- if (navProp.targetTypeName) {
1040
- outNavProp.targetType = objectMap[navProp.targetTypeName];
1041
- } else if (navProp.relationship) {
1042
- var targetAssociation = associations.find(function (association) {
1043
- return association.fullyQualifiedName === navProp.relationship;
1044
- });
770
+ function prepareNavigationProperties(navigationProperties, associations, objectMap) {
771
+ return navigationProperties.map(function (navProp) {
772
+ var outNavProp = {
773
+ _type: 'NavigationProperty',
774
+ name: navProp.name,
775
+ fullyQualifiedName: navProp.fullyQualifiedName,
776
+ isCollection: false,
777
+ containsTarget: false,
778
+ referentialConstraint: [],
779
+ annotations: {},
780
+ partner: '',
781
+ targetType: undefined,
782
+ targetTypeName: ''
783
+ };
1045
784
 
1046
- if (targetAssociation) {
1047
- var associationEnd = targetAssociation.associationEnd.find(function (end) {
1048
- return end.role === navProp.toRole;
1049
- });
785
+ if (isV4NavigationProperty(navProp)) {
786
+ resolveV4NavigationProperty(navProp, objectMap, outNavProp);
787
+ } else {
788
+ resolveV2NavigationProperty(navProp, associations, objectMap, outNavProp);
789
+ }
1050
790
 
1051
- if (associationEnd) {
1052
- outNavProp.targetType = objectMap[associationEnd.type];
1053
- outNavProp.isCollection = associationEnd.multiplicity === "*";
1054
- }
791
+ if (outNavProp.targetType) {
792
+ outNavProp.targetTypeName = outNavProp.targetType.fullyQualifiedName;
1055
793
  }
1056
- }
1057
794
 
1058
- if (outNavProp.targetType) {
1059
- outNavProp.targetTypeName = outNavProp.targetType.fullyQualifiedName;
1060
- }
795
+ objectMap[outNavProp.fullyQualifiedName] = outNavProp;
796
+ return outNavProp;
797
+ });
798
+ }
799
+ /**
800
+ * @param entityTypes
801
+ * @param associations
802
+ * @param objectMap
803
+ */
1061
804
 
1062
- var outNavPropReq = outNavProp;
1063
- objectMap[outNavPropReq.fullyQualifiedName] = outNavPropReq;
1064
- return outNavPropReq;
1065
- });
1066
- entityType.resolvePath = createResolvePathFn(entityType, objectMap);
1067
- });
1068
- }
1069
805
 
1070
- function linkActionsToEntityType(namespace, actions, objectMap) {
1071
- actions.forEach(function (action) {
1072
- if (!action.annotations) {
1073
- action.annotations = {};
806
+ function resolveNavigationProperties(entityTypes, associations, objectMap) {
807
+ entityTypes.forEach(function (entityType) {
808
+ entityType.navigationProperties = prepareNavigationProperties(entityType.navigationProperties, associations, objectMap);
809
+ entityType.resolvePath = createResolvePathFn(entityType, objectMap);
810
+ });
1074
811
  }
812
+ /**
813
+ * @param namespace
814
+ * @param actions
815
+ * @param objectMap
816
+ */
1075
817
 
1076
- if (action.isBound) {
1077
- var sourceEntityType = objectMap[action.sourceType];
1078
- action.sourceEntityType = sourceEntityType;
1079
818
 
1080
- if (sourceEntityType) {
1081
- if (!sourceEntityType.actions) {
1082
- sourceEntityType.actions = {};
819
+ function linkActionsToEntityType(namespace, actions, objectMap) {
820
+ actions.forEach(function (action) {
821
+ if (!action.annotations) {
822
+ action.annotations = {};
1083
823
  }
1084
824
 
1085
- sourceEntityType.actions[action.name] = action;
1086
- sourceEntityType.actions["".concat(namespace, ".").concat(action.name)] = action;
1087
- }
825
+ if (action.isBound) {
826
+ var sourceEntityType = objectMap[action.sourceType];
827
+ action.sourceEntityType = sourceEntityType;
1088
828
 
1089
- action.returnEntityType = objectMap[action.returnType];
1090
- }
1091
- });
1092
- }
829
+ if (sourceEntityType) {
830
+ if (!sourceEntityType.actions) {
831
+ sourceEntityType.actions = {};
832
+ }
1093
833
 
1094
- function linkEntityTypeToEntitySet(entitySets, objectMap, references) {
1095
- entitySets.forEach(function (entitySet) {
1096
- entitySet.entityType = objectMap[entitySet.entityTypeName];
834
+ sourceEntityType.actions[action.name] = action;
835
+ sourceEntityType.actions["".concat(namespace, ".").concat(action.name)] = action;
836
+ }
1097
837
 
1098
- if (!entitySet.entityType) {
1099
- entitySet.entityType = objectMap[unalias(references, entitySet.entityTypeName)];
838
+ action.returnEntityType = objectMap[action.returnType];
839
+ }
840
+ });
1100
841
  }
842
+ /**
843
+ * @param entitySets
844
+ * @param objectMap
845
+ * @param references
846
+ */
1101
847
 
1102
- if (!entitySet.annotations) {
1103
- entitySet.annotations = {};
1104
- }
1105
848
 
1106
- if (!entitySet.entityType.annotations) {
1107
- entitySet.entityType.annotations = {};
1108
- }
849
+ function linkEntityTypeToEntitySet(entitySets, objectMap, references) {
850
+ entitySets.forEach(function (entitySet) {
851
+ entitySet.entityType = objectMap[entitySet.entityTypeName];
1109
852
 
1110
- entitySet.entityType.keys.forEach(function (keyProp) {
1111
- keyProp.isKey = true;
1112
- });
1113
- });
1114
- }
853
+ if (!entitySet.entityType) {
854
+ entitySet.entityType = objectMap[(0, utils_1.unalias)(references, entitySet.entityTypeName)];
855
+ }
1115
856
 
1116
- function linkEntityTypeToSingleton() {
1117
- var singletons = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1118
- var objectMap = arguments.length > 1 ? arguments[1] : undefined;
1119
- var references = arguments.length > 2 ? arguments[2] : undefined;
1120
- singletons.forEach(function (singleton) {
1121
- singleton.type = objectMap[singleton.typeName];
857
+ if (!entitySet.annotations) {
858
+ entitySet.annotations = {};
859
+ }
1122
860
 
1123
- if (!singleton.type) {
1124
- singleton.type = objectMap[unalias(references, singleton.typeName)];
1125
- }
861
+ if (!entitySet.entityType.annotations) {
862
+ entitySet.entityType.annotations = {};
863
+ }
1126
864
 
1127
- if (!singleton.annotations) {
1128
- singleton.annotations = {};
865
+ entitySet.entityType.keys.forEach(function (keyProp) {
866
+ keyProp.isKey = true;
867
+ });
868
+ });
1129
869
  }
870
+ /**
871
+ * @param singletons
872
+ * @param objectMap
873
+ * @param references
874
+ */
1130
875
 
1131
- if (!singleton.type.annotations) {
1132
- singleton.type.annotations = {};
1133
- }
1134
876
 
1135
- singleton.type.keys.forEach(function (keyProp) {
1136
- keyProp.isKey = true;
1137
- });
1138
- singleton.entityType = singleton.type;
1139
- });
1140
- }
877
+ function linkEntityTypeToSingleton(singletons, objectMap, references) {
878
+ singletons.forEach(function (singleton) {
879
+ singleton.entityType = objectMap[singleton.entityTypeName];
1141
880
 
1142
- function linkPropertiesToComplexTypes(entityTypes, objectMap) {
1143
- function link(property) {
1144
- if (!property.annotations) {
1145
- property.annotations = {};
1146
- }
881
+ if (!singleton.entityType) {
882
+ singleton.entityType = objectMap[(0, utils_1.unalias)(references, singleton.entityTypeName)];
883
+ }
1147
884
 
1148
- try {
1149
- if (property.type.indexOf("Edm") !== 0) {
1150
- var complexType;
885
+ if (!singleton.annotations) {
886
+ singleton.annotations = {};
887
+ }
1151
888
 
1152
- if (property.type.startsWith("Collection")) {
1153
- var complexTypeName = property.type.substr(11, property.type.length - 12);
1154
- complexType = objectMap[complexTypeName];
1155
- } else {
1156
- complexType = objectMap[property.type];
889
+ if (!singleton.entityType.annotations) {
890
+ singleton.entityType.annotations = {};
891
+ }
892
+
893
+ singleton.entityType.keys.forEach(function (keyProp) {
894
+ keyProp.isKey = true;
895
+ });
896
+ });
897
+ }
898
+ /**
899
+ * @param entityTypes
900
+ * @param objectMap
901
+ */
902
+
903
+
904
+ function linkPropertiesToComplexTypes(entityTypes, objectMap) {
905
+ /**
906
+ * @param property
907
+ */
908
+ function link(property) {
909
+ if (!property.annotations) {
910
+ property.annotations = {};
1157
911
  }
1158
912
 
1159
- if (complexType) {
1160
- property.targetType = complexType;
913
+ try {
914
+ if (property.type.indexOf('Edm') !== 0) {
915
+ var complexType;
1161
916
 
1162
- if (complexType.properties) {
1163
- complexType.properties.forEach(link);
917
+ if (property.type.startsWith('Collection')) {
918
+ var complexTypeName = property.type.substring(11, property.type.length - 1);
919
+ complexType = objectMap[complexTypeName];
920
+ } else {
921
+ complexType = objectMap[property.type];
922
+ }
923
+
924
+ if (complexType) {
925
+ property.targetType = complexType;
926
+
927
+ if (complexType.properties) {
928
+ complexType.properties.forEach(link);
929
+ }
930
+ }
1164
931
  }
932
+ } catch (sError) {
933
+ throw new Error('Property Type is not defined');
1165
934
  }
1166
935
  }
1167
- } catch (sError) {
1168
- throw new Error("Property Type is not defined");
936
+
937
+ entityTypes.forEach(function (entityType) {
938
+ entityType.entityProperties.forEach(link);
939
+ });
1169
940
  }
1170
- }
941
+ /**
942
+ * @param complexTypes
943
+ * @param associations
944
+ * @param objectMap
945
+ */
946
+
947
+
948
+ function prepareComplexTypes(complexTypes, associations, objectMap) {
949
+ complexTypes.forEach(function (complexType) {
950
+ complexType.annotations = {};
951
+ complexType.properties.forEach(function (property) {
952
+ if (!property.annotations) {
953
+ property.annotations = {};
954
+ }
955
+ });
956
+ complexType.navigationProperties = prepareNavigationProperties(complexType.navigationProperties, associations, objectMap);
957
+ });
958
+ }
959
+ /**
960
+ * Split the alias from the term value.
961
+ *
962
+ * @param references the current set of references
963
+ * @param termValue the value of the term
964
+ * @returns the term alias and the actual term value
965
+ */
966
+
967
+
968
+ function splitTerm(references, termValue) {
969
+ var aliasedTerm = (0, utils_1.alias)(references, termValue);
970
+ var lastDot = aliasedTerm.lastIndexOf('.');
971
+ var termAlias = aliasedTerm.substring(0, lastDot);
972
+ var term = aliasedTerm.substring(lastDot + 1);
973
+ return [termAlias, term];
974
+ }
975
+ /**
976
+ * Creates the function that will resolve a specific path.
977
+ *
978
+ * @param convertedOutput
979
+ * @param objectMap
980
+ * @returns the function that will allow to resolve element globally.
981
+ */
1171
982
 
1172
- entityTypes.forEach(function (entityType) {
1173
- entityType.entityProperties.forEach(link);
1174
- });
1175
- }
1176
983
 
1177
- function prepareComplexTypes(complexTypes, associations, objectMap) {
1178
- complexTypes.forEach(function (complexType) {
1179
- complexType.annotations = {};
1180
- complexType.properties.forEach(function (property) {
1181
- if (!property.annotations) {
1182
- property.annotations = {};
1183
- }
1184
- });
1185
- complexType.navigationProperties = complexType.navigationProperties.map(function (navProp) {
1186
- if (!navProp.annotations) {
1187
- navProp.annotations = {};
1188
- }
984
+ function createGlobalResolve(convertedOutput, objectMap) {
985
+ return function resolvePath(sPath) {
986
+ var aPathSplit = sPath.split('/');
1189
987
 
1190
- var outNavProp = {
1191
- _type: "NavigationProperty",
1192
- name: navProp.name,
1193
- fullyQualifiedName: navProp.fullyQualifiedName,
1194
- partner: navProp.hasOwnProperty("partner") ? navProp.partner : undefined,
1195
- // targetTypeName: FullyQualifiedName;
1196
- // targetType: EntityType;
1197
- isCollection: navProp.hasOwnProperty("isCollection") ? navProp.isCollection : false,
1198
- containsTarget: navProp.hasOwnProperty("containsTarget") ? navProp.containsTarget : false,
1199
- referentialConstraint: navProp.referentialConstraint ? navProp.referentialConstraint : []
1200
- };
988
+ if (aPathSplit.shift() !== '') {
989
+ throw new Error('Cannot deal with relative path');
990
+ }
1201
991
 
1202
- if (navProp.targetTypeName) {
1203
- outNavProp.targetType = objectMap[navProp.targetTypeName];
1204
- } else if (navProp.relationship) {
1205
- var targetAssociation = associations.find(function (association) {
1206
- return association.fullyQualifiedName === navProp.relationship;
992
+ var entitySetName = aPathSplit.shift();
993
+ var entitySet = convertedOutput.entitySets.find(function (et) {
994
+ return et.name === entitySetName;
1207
995
  });
1208
996
 
1209
- if (targetAssociation) {
1210
- var associationEnd = targetAssociation.associationEnd.find(function (end) {
1211
- return end.role === navProp.toRole;
1212
- });
997
+ if (!entitySet) {
998
+ return {
999
+ target: convertedOutput.entityContainer,
1000
+ objectPath: [convertedOutput.entityContainer]
1001
+ };
1002
+ }
1003
+
1004
+ if (aPathSplit.length === 0) {
1005
+ return {
1006
+ target: entitySet,
1007
+ objectPath: [convertedOutput.entityContainer, entitySet]
1008
+ };
1009
+ } else {
1010
+ var targetResolution = _resolveTarget(objectMap, entitySet, '/' + aPathSplit.join('/'), false, true);
1213
1011
 
1214
- if (associationEnd) {
1215
- outNavProp.targetType = objectMap[associationEnd.type];
1216
- outNavProp.isCollection = associationEnd.multiplicity === "*";
1012
+ if (targetResolution.target) {
1013
+ targetResolution.visitedObjects.push(targetResolution.target);
1217
1014
  }
1015
+
1016
+ return {
1017
+ target: targetResolution.target,
1018
+ objectPath: targetResolution.visitedObjects
1019
+ };
1218
1020
  }
1021
+ };
1022
+ }
1023
+
1024
+ function ensureAnnotations(currentTarget, vocAlias) {
1025
+ if (!currentTarget.annotations) {
1026
+ currentTarget.annotations = {};
1219
1027
  }
1220
1028
 
1221
- if (outNavProp.targetType) {
1222
- outNavProp.targetTypeName = outNavProp.targetType.fullyQualifiedName;
1029
+ if (!currentTarget.annotations[vocAlias]) {
1030
+ currentTarget.annotations[vocAlias] = {};
1223
1031
  }
1224
1032
 
1225
- var outNavPropReq = outNavProp;
1226
- objectMap[outNavPropReq.fullyQualifiedName] = outNavPropReq;
1227
- return outNavPropReq;
1228
- });
1229
- });
1230
- }
1033
+ if (!currentTarget.annotations._annotations) {
1034
+ currentTarget.annotations._annotations = {};
1035
+ }
1036
+ }
1231
1037
 
1232
- function splitTerm(references, termValue) {
1233
- var aliasedTerm = alias(references, termValue);
1234
- var lastDot = aliasedTerm.lastIndexOf(".");
1235
- var termAlias = aliasedTerm.substr(0, lastDot);
1236
- var term = aliasedTerm.substr(lastDot + 1);
1237
- return [termAlias, term];
1238
- }
1239
- /**
1240
- * Resolve a specific path
1241
- * @param sPath
1242
- */
1038
+ function processAnnotations(currentContext, annotationList, objectMap, bOverrideExisting) {
1039
+ var currentTarget = currentContext.currentTarget;
1040
+ var currentTargetName = currentTarget.fullyQualifiedName;
1041
+ annotationList.annotations.forEach(function (annotation) {
1042
+ var _a, _b;
1243
1043
 
1044
+ currentContext.currentSource = annotation.__source || annotationList.__source;
1244
1045
 
1245
- function createGlobalResolve(convertedOutput, objectMap) {
1246
- return function resolvePath(sPath) {
1247
- var aPathSplit = sPath.split("/");
1046
+ var _splitTerm = splitTerm(utils_1.defaultReferences, annotation.term),
1047
+ _splitTerm2 = _slicedToArray(_splitTerm, 2),
1048
+ vocAlias = _splitTerm2[0],
1049
+ vocTerm = _splitTerm2[1];
1248
1050
 
1249
- if (aPathSplit.shift() !== "") {
1250
- throw new Error("Cannot deal with relative path");
1251
- }
1051
+ ensureAnnotations(currentTarget, vocAlias);
1052
+ var vocTermWithQualifier = "".concat(vocTerm).concat(annotation.qualifier ? '#' + annotation.qualifier : '');
1252
1053
 
1253
- var entitySetName = aPathSplit.shift();
1254
- var entitySet = convertedOutput.entitySets.find(function (et) {
1255
- return et.name === entitySetName;
1256
- });
1054
+ if (!bOverrideExisting && ((_b = (_a = currentTarget.annotations) === null || _a === void 0 ? void 0 : _a[vocAlias]) === null || _b === void 0 ? void 0 : _b[vocTermWithQualifier]) !== undefined) {
1055
+ return;
1056
+ }
1257
1057
 
1258
- if (!entitySet) {
1259
- return {
1260
- target: convertedOutput.entityContainer,
1261
- objectPath: [convertedOutput.entityContainer]
1262
- };
1263
- }
1058
+ currentContext.currentTerm = annotation.term;
1059
+ currentTarget.annotations[vocAlias][vocTermWithQualifier] = convertAnnotation(annotation, objectMap, currentContext);
1264
1060
 
1265
- if (aPathSplit.length === 0) {
1266
- return {
1267
- target: entitySet,
1268
- objectPath: [convertedOutput.entityContainer, entitySet]
1269
- };
1270
- } else {
1271
- var targetResolution = resolveTarget(objectMap, entitySet, "/" + aPathSplit.join("/"), false, true);
1061
+ switch (typeof currentTarget.annotations[vocAlias][vocTermWithQualifier]) {
1062
+ case 'string':
1063
+ // eslint-disable-next-line no-new-wrappers
1064
+ currentTarget.annotations[vocAlias][vocTermWithQualifier] = new String(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
1065
+ break;
1272
1066
 
1273
- if (targetResolution.target) {
1274
- targetResolution.visitedObjects.push(targetResolution.target);
1275
- }
1067
+ case 'boolean':
1068
+ // eslint-disable-next-line no-new-wrappers
1069
+ currentTarget.annotations[vocAlias][vocTermWithQualifier] = new Boolean(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
1070
+ break;
1276
1071
 
1277
- return {
1278
- target: targetResolution.target,
1279
- objectPath: targetResolution.visitedObjects
1280
- };
1281
- }
1282
- };
1283
- }
1072
+ default:
1073
+ // do nothing
1074
+ break;
1075
+ }
1284
1076
 
1285
- var ANNOTATION_ERRORS = [];
1286
- var ALL_ANNOTATION_ERRORS = {};
1077
+ if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null && typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === 'object') {
1078
+ currentTarget.annotations[vocAlias][vocTermWithQualifier].term = (0, utils_1.unalias)(utils_1.defaultReferences, "".concat(vocAlias, ".").concat(vocTerm));
1079
+ currentTarget.annotations[vocAlias][vocTermWithQualifier].qualifier = annotation.qualifier;
1080
+ currentTarget.annotations[vocAlias][vocTermWithQualifier].__source = currentContext.currentSource;
1081
+ }
1287
1082
 
1288
- function convertTypes(parserOutput) {
1289
- ANNOTATION_ERRORS = [];
1290
- var objectMap = buildObjectMap(parserOutput);
1291
- resolveNavigationProperties(parserOutput.schema.entityTypes, parserOutput.schema.associations, objectMap);
1083
+ var annotationTarget = "".concat(currentTargetName, "@").concat((0, utils_1.unalias)(utils_1.defaultReferences, vocAlias + '.' + vocTermWithQualifier));
1084
+
1085
+ if (Array.isArray(annotation.annotations)) {
1086
+ var subAnnotationList = {
1087
+ target: annotationTarget,
1088
+ annotations: annotation.annotations,
1089
+ __source: currentContext.currentSource
1090
+ };
1091
+ currentContext.additionalAnnotations.push(subAnnotationList);
1092
+ } else if (annotation.annotations && !currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations) {
1093
+ currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations = annotation.annotations;
1094
+ }
1292
1095
 
1293
- if (!parserOutput.schema.entityContainer.annotations) {
1294
- parserOutput.schema.entityContainer.annotations = {};
1295
- }
1096
+ currentTarget.annotations._annotations["".concat(vocAlias, ".").concat(vocTermWithQualifier)] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1097
+ objectMap[annotationTarget] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1098
+ });
1099
+ }
1100
+ /**
1101
+ * Process all the unresolved targets so far to try and see if they are resolveable in the end.
1102
+ *
1103
+ * @param unresolvedTargets
1104
+ * @param objectMap
1105
+ */
1106
+
1107
+
1108
+ function processUnresolvedTargets(unresolvedTargets, objectMap) {
1109
+ unresolvedTargets.forEach(function (resolvable) {
1110
+ var targetToResolve = resolvable.toResolve;
1111
+ var targetStr = targetToResolve.$target;
1112
+ var resolvedTarget = objectMap[targetStr];
1113
+ var annotationsTerm = targetToResolve.annotationsTerm,
1114
+ annotationType = targetToResolve.annotationType;
1115
+ delete targetToResolve.annotationType;
1116
+ delete targetToResolve.annotationsTerm;
1117
+
1118
+ if (resolvable.inline && !(resolvedTarget instanceof String)) {
1119
+ // inline the resolved target
1120
+ var keys;
1121
+
1122
+ for (keys in targetToResolve) {
1123
+ delete targetToResolve[keys];
1124
+ }
1296
1125
 
1297
- linkActionsToEntityType(parserOutput.schema.namespace, parserOutput.schema.actions, objectMap);
1298
- linkEntityTypeToEntitySet(parserOutput.schema.entitySets, objectMap, parserOutput.references);
1299
- linkEntityTypeToSingleton(parserOutput.schema.singletons, objectMap, parserOutput.references);
1300
- linkPropertiesToComplexTypes(parserOutput.schema.entityTypes, objectMap);
1301
- prepareComplexTypes(parserOutput.schema.complexTypes, parserOutput.schema.associations, objectMap);
1302
- var toResolve = [];
1303
- var unresolvedAnnotations = [];
1304
- Object.keys(parserOutput.schema.annotations).forEach(function (annotationSource) {
1305
- parserOutput.schema.annotations[annotationSource].forEach(function (annotationList) {
1306
- var currentTargetName = unalias(parserOutput.references, annotationList.target);
1307
- var objectMapElement = objectMap[currentTargetName];
1308
-
1309
- if (!objectMapElement) {
1310
- if (currentTargetName && currentTargetName.indexOf("@") !== -1) {
1311
- annotationList.__source = annotationSource;
1312
- unresolvedAnnotations.push(annotationList);
1126
+ Object.assign(targetToResolve, resolvedTarget);
1127
+ } else {
1128
+ // assign the resolved target
1129
+ targetToResolve.$target = resolvedTarget;
1313
1130
  }
1314
- } else if (typeof objectMapElement === "object") {
1315
- var allTargets = [objectMapElement];
1316
- var bOverrideExisting = true;
1317
1131
 
1318
- if (objectMapElement._type === "UnboundGenericAction") {
1319
- allTargets = objectMapElement.actions;
1320
- bOverrideExisting = false;
1132
+ if (!resolvedTarget) {
1133
+ targetToResolve.targetString = targetStr;
1134
+
1135
+ if (annotationsTerm && annotationType) {
1136
+ var oErrorMsg = {
1137
+ message: 'Unable to resolve the path expression: ' + targetStr + '\n' + '\n' + 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' + '<Annotation Term = ' + annotationsTerm + '>' + '\n' + '<Record Type = ' + annotationType + '>' + '\n' + '<AnnotationPath = ' + targetStr + '>'
1138
+ };
1139
+ addAnnotationErrorMessage(targetStr, oErrorMsg);
1140
+ } else {
1141
+ var property = targetToResolve.term;
1142
+ var path = targetToResolve.path;
1143
+ var termInfo = targetStr ? targetStr.split('/')[0] : targetStr;
1144
+ var _oErrorMsg = {
1145
+ message: 'Unable to resolve the path expression: ' + targetStr + '\n' + '\n' + 'Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n' + '<Annotation Term = ' + termInfo + '>' + '\n' + '<PropertyValue Property = ' + property + ' Path= ' + path + '>'
1146
+ };
1147
+ addAnnotationErrorMessage(targetStr, _oErrorMsg);
1148
+ }
1321
1149
  }
1150
+ });
1151
+ }
1152
+ /**
1153
+ * Merge annotation from different source together by overwriting at the term level.
1154
+ *
1155
+ * @param rawMetadata
1156
+ * @returns the resulting merged annotations
1157
+ */
1158
+
1159
+
1160
+ function mergeAnnotations(rawMetadata) {
1161
+ var annotationListPerTarget = {};
1162
+ Object.keys(rawMetadata.schema.annotations).forEach(function (annotationSource) {
1163
+ rawMetadata.schema.annotations[annotationSource].forEach(function (annotationList) {
1164
+ var currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
1165
+ annotationList.__source = annotationSource;
1322
1166
 
1323
- allTargets.forEach(function (currentTarget) {
1324
- if (currentTargetName !== currentTarget.fullyQualifiedName) {
1325
- currentTargetName = currentTarget.fullyQualifiedName;
1167
+ if (!annotationListPerTarget[currentTargetName]) {
1168
+ annotationListPerTarget[currentTargetName] = {
1169
+ annotations: annotationList.annotations.concat(),
1170
+ target: currentTargetName
1171
+ };
1172
+ annotationListPerTarget[currentTargetName].__source = annotationSource;
1173
+ } else {
1174
+ annotationList.annotations.forEach(function (annotation) {
1175
+ var findIndex = annotationListPerTarget[currentTargetName].annotations.findIndex(function (referenceAnnotation) {
1176
+ return referenceAnnotation.term === annotation.term && referenceAnnotation.qualifier === annotation.qualifier;
1177
+ });
1178
+ annotation.__source = annotationSource;
1179
+
1180
+ if (findIndex !== -1) {
1181
+ annotationListPerTarget[currentTargetName].annotations.splice(findIndex, 1, annotation);
1182
+ } else {
1183
+ annotationListPerTarget[currentTargetName].annotations.push(annotation);
1184
+ }
1185
+ });
1326
1186
  }
1187
+ });
1188
+ });
1189
+ return annotationListPerTarget;
1190
+ }
1191
+ /**
1192
+ * Convert a RawMetadata into an object representation to be used to easily navigate a metadata object and its annotation.
1193
+ *
1194
+ * @param rawMetadata
1195
+ * @returns the converted representation of the metadata.
1196
+ */
1197
+
1198
+
1199
+ function convert(rawMetadata) {
1200
+ ANNOTATION_ERRORS = [];
1201
+ var objectMap = buildObjectMap(rawMetadata);
1202
+ resolveNavigationProperties(rawMetadata.schema.entityTypes, rawMetadata.schema.associations, objectMap);
1203
+ rawMetadata.schema.entityContainer.annotations = {};
1204
+ linkActionsToEntityType(rawMetadata.schema.namespace, rawMetadata.schema.actions, objectMap);
1205
+ linkEntityTypeToEntitySet(rawMetadata.schema.entitySets, objectMap, rawMetadata.references);
1206
+ linkEntityTypeToSingleton(rawMetadata.schema.singletons, objectMap, rawMetadata.references);
1207
+ linkPropertiesToComplexTypes(rawMetadata.schema.entityTypes, objectMap);
1208
+ prepareComplexTypes(rawMetadata.schema.complexTypes, rawMetadata.schema.associations, objectMap);
1209
+ var unresolvedTargets = [];
1210
+ var unresolvedAnnotations = [];
1211
+ var annotationListPerTarget = mergeAnnotations(rawMetadata);
1212
+ Object.keys(annotationListPerTarget).forEach(function (currentTargetName) {
1213
+ var annotationList = annotationListPerTarget[currentTargetName];
1214
+ var objectMapElement = objectMap[currentTargetName];
1215
+
1216
+ if (!objectMapElement && (currentTargetName === null || currentTargetName === void 0 ? void 0 : currentTargetName.indexOf('@')) > 0) {
1217
+ unresolvedAnnotations.push(annotationList);
1218
+ } else if (objectMapElement) {
1219
+ var allTargets = [objectMapElement];
1220
+ var bOverrideExisting = true;
1327
1221
 
1328
- if (!currentTarget.annotations) {
1329
- currentTarget.annotations = {};
1222
+ if (objectMapElement._type === 'UnboundGenericAction') {
1223
+ allTargets = objectMapElement.actions;
1224
+ bOverrideExisting = false;
1330
1225
  }
1331
1226
 
1332
- annotationList.annotations.forEach(function (annotation) {
1333
- var _currentTarget$annota, _currentTarget$annota2;
1227
+ allTargets.forEach(function (currentTarget) {
1228
+ var currentContext = {
1229
+ additionalAnnotations: unresolvedAnnotations,
1230
+ currentSource: annotationList.__source,
1231
+ currentTarget: currentTarget,
1232
+ currentTerm: '',
1233
+ rawMetadata: rawMetadata,
1234
+ unresolvedAnnotations: unresolvedTargets
1235
+ };
1236
+ processAnnotations(currentContext, annotationList, objectMap, bOverrideExisting);
1237
+ });
1238
+ }
1239
+ });
1240
+ var extraUnresolvedAnnotations = [];
1241
+ unresolvedAnnotations.forEach(function (annotationList) {
1242
+ var currentTargetName = (0, utils_1.unalias)(rawMetadata.references, annotationList.target);
1243
+
1244
+ var _currentTargetName$sp = currentTargetName.split('@'),
1245
+ _currentTargetName$sp2 = _slicedToArray(_currentTargetName$sp, 2),
1246
+ baseObj = _currentTargetName$sp2[0],
1247
+ annotationPart = _currentTargetName$sp2[1];
1248
+
1249
+ var targetSplit = annotationPart.split('/');
1250
+ baseObj = baseObj + '@' + targetSplit[0];
1251
+ var currentTarget = targetSplit.slice(1).reduce(function (currentObj, path) {
1252
+ return currentObj === null || currentObj === void 0 ? void 0 : currentObj[path];
1253
+ }, objectMap[baseObj]);
1254
+
1255
+ if (!currentTarget || typeof currentTarget !== 'object') {
1256
+ ANNOTATION_ERRORS.push({
1257
+ message: 'The following annotation target was not found on the service ' + currentTargetName
1258
+ });
1259
+ } else {
1260
+ var currentContext = {
1261
+ additionalAnnotations: extraUnresolvedAnnotations,
1262
+ currentSource: annotationList.__source,
1263
+ currentTarget: currentTarget,
1264
+ currentTerm: '',
1265
+ rawMetadata: rawMetadata,
1266
+ unresolvedAnnotations: unresolvedTargets
1267
+ };
1268
+ processAnnotations(currentContext, annotationList, objectMap, false);
1269
+ }
1270
+ });
1271
+ processUnresolvedTargets(unresolvedTargets, objectMap);
1334
1272
 
1335
- var _splitTerm = splitTerm(defaultReferences, annotation.term),
1336
- _splitTerm2 = _slicedToArray(_splitTerm, 2),
1337
- vocAlias = _splitTerm2[0],
1338
- vocTerm = _splitTerm2[1];
1273
+ for (var property in ALL_ANNOTATION_ERRORS) {
1274
+ ANNOTATION_ERRORS.push(ALL_ANNOTATION_ERRORS[property][0]);
1275
+ }
1339
1276
 
1340
- if (!currentTarget.annotations[vocAlias]) {
1341
- currentTarget.annotations[vocAlias] = {};
1342
- }
1277
+ rawMetadata.entitySets = rawMetadata.schema.entitySets;
1278
+ var extraReferences = rawMetadata.references.filter(function (reference) {
1279
+ return utils_1.defaultReferences.find(function (defaultRef) {
1280
+ return defaultRef.namespace === reference.namespace;
1281
+ }) === undefined;
1282
+ });
1283
+ var convertedOutput = {
1284
+ version: rawMetadata.version,
1285
+ annotations: rawMetadata.schema.annotations,
1286
+ namespace: rawMetadata.schema.namespace,
1287
+ entityContainer: rawMetadata.schema.entityContainer,
1288
+ actions: rawMetadata.schema.actions,
1289
+ entitySets: rawMetadata.schema.entitySets,
1290
+ singletons: rawMetadata.schema.singletons,
1291
+ entityTypes: rawMetadata.schema.entityTypes,
1292
+ complexTypes: rawMetadata.schema.complexTypes,
1293
+ typeDefinitions: rawMetadata.schema.typeDefinitions,
1294
+ references: utils_1.defaultReferences.concat(extraReferences),
1295
+ diagnostics: ANNOTATION_ERRORS.concat()
1296
+ };
1297
+ convertedOutput.resolvePath = createGlobalResolve(convertedOutput, objectMap);
1298
+ return convertedOutput;
1299
+ }
1343
1300
 
1344
- if (!currentTarget.annotations._annotations) {
1345
- currentTarget.annotations._annotations = {};
1346
- }
1301
+ exports.convert = convert;
1302
+ /***/
1303
+ },
1304
+
1305
+ /***/
1306
+ 759:
1307
+ /***/
1308
+ function (__unused_webpack_module, exports, __webpack_require__) {
1309
+ var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
1310
+ if (k2 === undefined) k2 = k;
1311
+ var desc = Object.getOwnPropertyDescriptor(m, k);
1312
+
1313
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
1314
+ desc = {
1315
+ enumerable: true,
1316
+ get: function () {
1317
+ return m[k];
1318
+ }
1319
+ };
1320
+ }
1347
1321
 
1348
- var vocTermWithQualifier = "".concat(vocTerm).concat(annotation.qualifier ? "#".concat(annotation.qualifier) : "");
1322
+ Object.defineProperty(o, k2, desc);
1323
+ } : function (o, m, k, k2) {
1324
+ if (k2 === undefined) k2 = k;
1325
+ o[k2] = m[k];
1326
+ });
1349
1327
 
1350
- if (!bOverrideExisting && ((_currentTarget$annota = currentTarget.annotations) === null || _currentTarget$annota === void 0 ? void 0 : (_currentTarget$annota2 = _currentTarget$annota[vocAlias]) === null || _currentTarget$annota2 === void 0 ? void 0 : _currentTarget$annota2[vocTermWithQualifier]) !== undefined) {
1351
- return;
1352
- }
1328
+ var __exportStar = this && this.__exportStar || function (m, exports) {
1329
+ for (var p in m) {
1330
+ if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
1331
+ }
1332
+ };
1353
1333
 
1354
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = convertAnnotation(annotation, parserOutput, currentTarget, objectMap, toResolve, annotationSource, unresolvedAnnotations);
1334
+ Object.defineProperty(exports, "__esModule", {
1335
+ value: true
1336
+ });
1355
1337
 
1356
- switch (typeof currentTarget.annotations[vocAlias][vocTermWithQualifier]) {
1357
- case "string":
1358
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = new String(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
1359
- break;
1338
+ __exportStar(__webpack_require__(875), exports);
1360
1339
 
1361
- case "boolean":
1362
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = new Boolean(currentTarget.annotations[vocAlias][vocTermWithQualifier]);
1363
- break;
1364
- }
1340
+ __exportStar(__webpack_require__(426), exports);
1365
1341
 
1366
- if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null && typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === "object") {
1367
- currentTarget.annotations[vocAlias][vocTermWithQualifier].term = unalias(defaultReferences, "".concat(vocAlias, ".").concat(vocTerm));
1368
- currentTarget.annotations[vocAlias][vocTermWithQualifier].qualifier = annotation.qualifier;
1369
- currentTarget.annotations[vocAlias][vocTermWithQualifier].__source = annotationSource;
1370
- }
1342
+ __exportStar(__webpack_require__(69), exports);
1343
+ /***/
1371
1344
 
1372
- var annotationTarget = "".concat(currentTargetName, "@").concat(unalias(defaultReferences, vocAlias + "." + vocTermWithQualifier));
1373
-
1374
- if (annotation.annotations && Array.isArray(annotation.annotations)) {
1375
- var subAnnotationList = {
1376
- target: annotationTarget,
1377
- annotations: annotation.annotations,
1378
- __source: annotationSource
1379
- };
1380
- unresolvedAnnotations.push(subAnnotationList);
1381
- } else if (annotation.annotations && !currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations) {
1382
- currentTarget.annotations[vocAlias][vocTermWithQualifier].annotations = annotation.annotations;
1383
- }
1345
+ },
1384
1346
 
1385
- currentTarget.annotations._annotations["".concat(vocAlias, ".").concat(vocTermWithQualifier)] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1386
- objectMap[annotationTarget] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1387
- });
1388
- });
1389
- }
1347
+ /***/
1348
+ 69:
1349
+ /***/
1350
+ function (__unused_webpack_module, exports) {
1351
+ Object.defineProperty(exports, "__esModule", {
1352
+ value: true
1390
1353
  });
1391
- });
1392
- var extraUnresolvedAnnotations = [];
1393
- unresolvedAnnotations.forEach(function (annotationList) {
1394
- var currentTargetName = unalias(parserOutput.references, annotationList.target);
1395
-
1396
- var _currentTargetName$sp = currentTargetName.split("@"),
1397
- _currentTargetName$sp2 = _slicedToArray(_currentTargetName$sp, 2),
1398
- baseObj = _currentTargetName$sp2[0],
1399
- annotationPart = _currentTargetName$sp2[1];
1400
-
1401
- var targetSplit = annotationPart.split("/");
1402
- baseObj = baseObj + "@" + targetSplit[0];
1403
- var currentTarget = targetSplit.slice(1).reduce(function (currentObj, path) {
1404
- if (!currentObj) {
1405
- return null;
1354
+ exports.Decimal = exports.isComplexTypeDefinition = exports.TermToTypes = exports.unalias = exports.alias = exports.defaultReferences = void 0;
1355
+ exports.defaultReferences = [{
1356
+ alias: 'Capabilities',
1357
+ namespace: 'Org.OData.Capabilities.V1',
1358
+ uri: ''
1359
+ }, {
1360
+ alias: 'Aggregation',
1361
+ namespace: 'Org.OData.Aggregation.V1',
1362
+ uri: ''
1363
+ }, {
1364
+ alias: 'Validation',
1365
+ namespace: 'Org.OData.Validation.V1',
1366
+ uri: ''
1367
+ }, {
1368
+ namespace: 'Org.OData.Core.V1',
1369
+ alias: 'Core',
1370
+ uri: ''
1371
+ }, {
1372
+ namespace: 'Org.OData.Measures.V1',
1373
+ alias: 'Measures',
1374
+ uri: ''
1375
+ }, {
1376
+ namespace: 'com.sap.vocabularies.Common.v1',
1377
+ alias: 'Common',
1378
+ uri: ''
1379
+ }, {
1380
+ namespace: 'com.sap.vocabularies.UI.v1',
1381
+ alias: 'UI',
1382
+ uri: ''
1383
+ }, {
1384
+ namespace: 'com.sap.vocabularies.Session.v1',
1385
+ alias: 'Session',
1386
+ uri: ''
1387
+ }, {
1388
+ namespace: 'com.sap.vocabularies.Analytics.v1',
1389
+ alias: 'Analytics',
1390
+ uri: ''
1391
+ }, {
1392
+ namespace: 'com.sap.vocabularies.CodeList.v1',
1393
+ alias: 'CodeList',
1394
+ uri: ''
1395
+ }, {
1396
+ namespace: 'com.sap.vocabularies.PersonalData.v1',
1397
+ alias: 'PersonalData',
1398
+ uri: ''
1399
+ }, {
1400
+ namespace: 'com.sap.vocabularies.Communication.v1',
1401
+ alias: 'Communication',
1402
+ uri: ''
1403
+ }, {
1404
+ namespace: 'com.sap.vocabularies.HTML5.v1',
1405
+ alias: 'HTML5',
1406
+ uri: ''
1407
+ }];
1408
+ /**
1409
+ * Transform an unaliased string representation annotation to the aliased version.
1410
+ *
1411
+ * @param references currentReferences for the project
1412
+ * @param unaliasedValue the unaliased value
1413
+ * @returns the aliased string representing the same
1414
+ */
1415
+
1416
+ function alias(references, unaliasedValue) {
1417
+ if (!references.reverseReferenceMap) {
1418
+ references.reverseReferenceMap = references.reduce(function (map, ref) {
1419
+ map[ref.namespace] = ref;
1420
+ return map;
1421
+ }, {});
1406
1422
  }
1407
1423
 
1408
- return currentObj[path];
1409
- }, objectMap[baseObj]);
1424
+ if (!unaliasedValue) {
1425
+ return unaliasedValue;
1426
+ }
1410
1427
 
1411
- if (!currentTarget) {
1412
- ANNOTATION_ERRORS.push({
1413
- message: "The following annotation target was not found on the service " + currentTargetName
1414
- }); // console.log("Missing target again " + currentTargetName);
1415
- } else if (typeof currentTarget === "object") {
1416
- if (!currentTarget.annotations) {
1417
- currentTarget.annotations = {};
1428
+ var lastDotIndex = unaliasedValue.lastIndexOf('.');
1429
+ var namespace = unaliasedValue.substring(0, lastDotIndex);
1430
+ var value = unaliasedValue.substring(lastDotIndex + 1);
1431
+ var reference = references.reverseReferenceMap[namespace];
1432
+
1433
+ if (reference) {
1434
+ return "".concat(reference.alias, ".").concat(value);
1435
+ } else if (unaliasedValue.indexOf('@') !== -1) {
1436
+ // Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
1437
+ var _unaliasedValue$split = unaliasedValue.split('@'),
1438
+ _unaliasedValue$split2 = _toArray(_unaliasedValue$split),
1439
+ preAlias = _unaliasedValue$split2[0],
1440
+ postAlias = _unaliasedValue$split2.slice(1);
1441
+
1442
+ return "".concat(preAlias, "@").concat(alias(references, postAlias.join('@')));
1443
+ } else {
1444
+ return unaliasedValue;
1418
1445
  }
1446
+ }
1419
1447
 
1420
- annotationList.annotations.forEach(function (annotation) {
1421
- var _splitTerm3 = splitTerm(defaultReferences, annotation.term),
1422
- _splitTerm4 = _slicedToArray(_splitTerm3, 2),
1423
- vocAlias = _splitTerm4[0],
1424
- vocTerm = _splitTerm4[1];
1448
+ exports.alias = alias;
1449
+ /**
1450
+ * Transform an aliased string representation annotation to the unaliased version.
1451
+ *
1452
+ * @param references currentReferences for the project
1453
+ * @param aliasedValue the aliased value
1454
+ * @returns the unaliased string representing the same
1455
+ */
1456
+
1457
+ function unalias(references, aliasedValue) {
1458
+ if (!references.referenceMap) {
1459
+ references.referenceMap = references.reduce(function (map, ref) {
1460
+ map[ref.alias] = ref;
1461
+ return map;
1462
+ }, {});
1463
+ }
1425
1464
 
1426
- if (!currentTarget.annotations[vocAlias]) {
1427
- currentTarget.annotations[vocAlias] = {};
1428
- }
1465
+ if (!aliasedValue) {
1466
+ return aliasedValue;
1467
+ }
1429
1468
 
1430
- if (!currentTarget.annotations._annotations) {
1431
- currentTarget.annotations._annotations = {};
1432
- }
1469
+ var _aliasedValue$split = aliasedValue.split('.'),
1470
+ _aliasedValue$split2 = _toArray(_aliasedValue$split),
1471
+ vocAlias = _aliasedValue$split2[0],
1472
+ value = _aliasedValue$split2.slice(1);
1433
1473
 
1434
- var vocTermWithQualifier = "".concat(vocTerm).concat(annotation.qualifier ? "#".concat(annotation.qualifier) : "");
1435
- currentTarget.annotations[vocAlias][vocTermWithQualifier] = convertAnnotation(annotation, parserOutput, currentTarget, objectMap, toResolve, annotationList.__source, extraUnresolvedAnnotations);
1474
+ var reference = references.referenceMap[vocAlias];
1436
1475
 
1437
- if (currentTarget.annotations[vocAlias][vocTermWithQualifier] !== null && typeof currentTarget.annotations[vocAlias][vocTermWithQualifier] === "object") {
1438
- currentTarget.annotations[vocAlias][vocTermWithQualifier].term = unalias(defaultReferences, "".concat(vocAlias, ".").concat(vocTerm));
1439
- currentTarget.annotations[vocAlias][vocTermWithQualifier].qualifier = annotation.qualifier;
1440
- currentTarget.annotations[vocAlias][vocTermWithQualifier].__source = annotationList.__source;
1441
- }
1476
+ if (reference) {
1477
+ return "".concat(reference.namespace, ".").concat(value.join('.'));
1478
+ } else if (aliasedValue.indexOf('@') !== -1) {
1479
+ // Try to see if it's an annotation Path like to_SalesOrder/@UI.LineItem
1480
+ var _aliasedValue$split3 = aliasedValue.split('@'),
1481
+ _aliasedValue$split4 = _toArray(_aliasedValue$split3),
1482
+ preAlias = _aliasedValue$split4[0],
1483
+ postAlias = _aliasedValue$split4.slice(1);
1442
1484
 
1443
- currentTarget.annotations._annotations["".concat(vocAlias, ".").concat(vocTermWithQualifier)] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1444
- objectMap["".concat(currentTargetName, "@").concat(unalias(defaultReferences, vocAlias + "." + vocTermWithQualifier))] = currentTarget.annotations[vocAlias][vocTermWithQualifier];
1445
- });
1446
- }
1447
- });
1448
- toResolve.forEach(function (resolveable) {
1449
- var toResolve = resolveable.toResolve;
1450
- var targetStr = toResolve.$target;
1451
- var resolvedTarget = objectMap[targetStr];
1452
- var annotationsTerm = toResolve.annotationsTerm,
1453
- annotationType = toResolve.annotationType;
1454
- delete toResolve.annotationType;
1455
- delete toResolve.annotationsTerm;
1456
-
1457
- if (resolveable.inline && !(resolvedTarget instanceof String)) {
1458
- // inline the resolved target
1459
- var keys;
1460
-
1461
- for (keys in toResolve) {
1462
- delete toResolve[keys];
1485
+ return "".concat(preAlias, "@").concat(unalias(references, postAlias.join('@')));
1486
+ } else {
1487
+ return aliasedValue;
1463
1488
  }
1489
+ }
1464
1490
 
1465
- Object.assign(toResolve, resolvedTarget);
1466
- } else {
1467
- // assign the resolved target
1468
- toResolve.$target = resolvedTarget;
1491
+ exports.unalias = unalias;
1492
+ var TermToTypes;
1493
+
1494
+ (function (TermToTypes) {
1495
+ TermToTypes["Org.OData.Authorization.V1.SecuritySchemes"] = "Org.OData.Authorization.V1.SecurityScheme";
1496
+ TermToTypes["Org.OData.Authorization.V1.Authorizations"] = "Org.OData.Authorization.V1.Authorization";
1497
+ TermToTypes["Org.OData.Core.V1.Revisions"] = "Org.OData.Core.V1.RevisionType";
1498
+ TermToTypes["Org.OData.Core.V1.Links"] = "Org.OData.Core.V1.Link";
1499
+ TermToTypes["Org.OData.Core.V1.Example"] = "Org.OData.Core.V1.ExampleValue";
1500
+ TermToTypes["Org.OData.Core.V1.Messages"] = "Org.OData.Core.V1.MessageType";
1501
+ TermToTypes["Org.OData.Core.V1.ValueException"] = "Org.OData.Core.V1.ValueExceptionType";
1502
+ TermToTypes["Org.OData.Core.V1.ResourceException"] = "Org.OData.Core.V1.ResourceExceptionType";
1503
+ TermToTypes["Org.OData.Core.V1.DataModificationException"] = "Org.OData.Core.V1.DataModificationExceptionType";
1504
+ TermToTypes["Org.OData.Core.V1.IsLanguageDependent"] = "Org.OData.Core.V1.Tag";
1505
+ TermToTypes["Org.OData.Core.V1.DereferenceableIDs"] = "Org.OData.Core.V1.Tag";
1506
+ TermToTypes["Org.OData.Core.V1.ConventionalIDs"] = "Org.OData.Core.V1.Tag";
1507
+ TermToTypes["Org.OData.Core.V1.Permissions"] = "Org.OData.Core.V1.Permission";
1508
+ TermToTypes["Org.OData.Core.V1.DefaultNamespace"] = "Org.OData.Core.V1.Tag";
1509
+ TermToTypes["Org.OData.Core.V1.Immutable"] = "Org.OData.Core.V1.Tag";
1510
+ TermToTypes["Org.OData.Core.V1.Computed"] = "Org.OData.Core.V1.Tag";
1511
+ TermToTypes["Org.OData.Core.V1.ComputedDefaultValue"] = "Org.OData.Core.V1.Tag";
1512
+ TermToTypes["Org.OData.Core.V1.IsURL"] = "Org.OData.Core.V1.Tag";
1513
+ TermToTypes["Org.OData.Core.V1.IsMediaType"] = "Org.OData.Core.V1.Tag";
1514
+ TermToTypes["Org.OData.Core.V1.ContentDisposition"] = "Org.OData.Core.V1.ContentDispositionType";
1515
+ TermToTypes["Org.OData.Core.V1.OptimisticConcurrency"] = "Edm.PropertyPath";
1516
+ TermToTypes["Org.OData.Core.V1.AdditionalProperties"] = "Org.OData.Core.V1.Tag";
1517
+ TermToTypes["Org.OData.Core.V1.AutoExpand"] = "Org.OData.Core.V1.Tag";
1518
+ TermToTypes["Org.OData.Core.V1.AutoExpandReferences"] = "Org.OData.Core.V1.Tag";
1519
+ TermToTypes["Org.OData.Core.V1.MayImplement"] = "Org.OData.Core.V1.QualifiedTypeName";
1520
+ TermToTypes["Org.OData.Core.V1.Ordered"] = "Org.OData.Core.V1.Tag";
1521
+ TermToTypes["Org.OData.Core.V1.PositionalInsert"] = "Org.OData.Core.V1.Tag";
1522
+ TermToTypes["Org.OData.Core.V1.AlternateKeys"] = "Org.OData.Core.V1.AlternateKey";
1523
+ TermToTypes["Org.OData.Core.V1.OptionalParameter"] = "Org.OData.Core.V1.OptionalParameterType";
1524
+ TermToTypes["Org.OData.Core.V1.OperationAvailable"] = "Edm.Boolean";
1525
+ TermToTypes["Org.OData.Core.V1.SymbolicName"] = "Org.OData.Core.V1.SimpleIdentifier";
1526
+ TermToTypes["Org.OData.Capabilities.V1.ConformanceLevel"] = "Org.OData.Capabilities.V1.ConformanceLevelType";
1527
+ TermToTypes["Org.OData.Capabilities.V1.AsynchronousRequestsSupported"] = "Org.OData.Core.V1.Tag";
1528
+ TermToTypes["Org.OData.Capabilities.V1.BatchContinueOnErrorSupported"] = "Org.OData.Core.V1.Tag";
1529
+ TermToTypes["Org.OData.Capabilities.V1.IsolationSupported"] = "Org.OData.Capabilities.V1.IsolationLevel";
1530
+ TermToTypes["Org.OData.Capabilities.V1.CrossJoinSupported"] = "Org.OData.Core.V1.Tag";
1531
+ TermToTypes["Org.OData.Capabilities.V1.CallbackSupported"] = "Org.OData.Capabilities.V1.CallbackType";
1532
+ TermToTypes["Org.OData.Capabilities.V1.ChangeTracking"] = "Org.OData.Capabilities.V1.ChangeTrackingType";
1533
+ TermToTypes["Org.OData.Capabilities.V1.CountRestrictions"] = "Org.OData.Capabilities.V1.CountRestrictionsType";
1534
+ TermToTypes["Org.OData.Capabilities.V1.NavigationRestrictions"] = "Org.OData.Capabilities.V1.NavigationRestrictionsType";
1535
+ TermToTypes["Org.OData.Capabilities.V1.IndexableByKey"] = "Org.OData.Core.V1.Tag";
1536
+ TermToTypes["Org.OData.Capabilities.V1.TopSupported"] = "Org.OData.Core.V1.Tag";
1537
+ TermToTypes["Org.OData.Capabilities.V1.SkipSupported"] = "Org.OData.Core.V1.Tag";
1538
+ TermToTypes["Org.OData.Capabilities.V1.ComputeSupported"] = "Org.OData.Core.V1.Tag";
1539
+ TermToTypes["Org.OData.Capabilities.V1.SelectSupport"] = "Org.OData.Capabilities.V1.SelectSupportType";
1540
+ TermToTypes["Org.OData.Capabilities.V1.BatchSupported"] = "Org.OData.Core.V1.Tag";
1541
+ TermToTypes["Org.OData.Capabilities.V1.BatchSupport"] = "Org.OData.Capabilities.V1.BatchSupportType";
1542
+ TermToTypes["Org.OData.Capabilities.V1.FilterRestrictions"] = "Org.OData.Capabilities.V1.FilterRestrictionsType";
1543
+ TermToTypes["Org.OData.Capabilities.V1.SortRestrictions"] = "Org.OData.Capabilities.V1.SortRestrictionsType";
1544
+ TermToTypes["Org.OData.Capabilities.V1.ExpandRestrictions"] = "Org.OData.Capabilities.V1.ExpandRestrictionsType";
1545
+ TermToTypes["Org.OData.Capabilities.V1.SearchRestrictions"] = "Org.OData.Capabilities.V1.SearchRestrictionsType";
1546
+ TermToTypes["Org.OData.Capabilities.V1.KeyAsSegmentSupported"] = "Org.OData.Core.V1.Tag";
1547
+ TermToTypes["Org.OData.Capabilities.V1.QuerySegmentSupported"] = "Org.OData.Core.V1.Tag";
1548
+ TermToTypes["Org.OData.Capabilities.V1.InsertRestrictions"] = "Org.OData.Capabilities.V1.InsertRestrictionsType";
1549
+ TermToTypes["Org.OData.Capabilities.V1.DeepInsertSupport"] = "Org.OData.Capabilities.V1.DeepInsertSupportType";
1550
+ TermToTypes["Org.OData.Capabilities.V1.UpdateRestrictions"] = "Org.OData.Capabilities.V1.UpdateRestrictionsType";
1551
+ TermToTypes["Org.OData.Capabilities.V1.DeepUpdateSupport"] = "Org.OData.Capabilities.V1.DeepUpdateSupportType";
1552
+ TermToTypes["Org.OData.Capabilities.V1.DeleteRestrictions"] = "Org.OData.Capabilities.V1.DeleteRestrictionsType";
1553
+ TermToTypes["Org.OData.Capabilities.V1.CollectionPropertyRestrictions"] = "Org.OData.Capabilities.V1.CollectionPropertyRestrictionsType";
1554
+ TermToTypes["Org.OData.Capabilities.V1.OperationRestrictions"] = "Org.OData.Capabilities.V1.OperationRestrictionsType";
1555
+ TermToTypes["Org.OData.Capabilities.V1.AnnotationValuesInQuerySupported"] = "Org.OData.Core.V1.Tag";
1556
+ TermToTypes["Org.OData.Capabilities.V1.ModificationQueryOptions"] = "Org.OData.Capabilities.V1.ModificationQueryOptionsType";
1557
+ TermToTypes["Org.OData.Capabilities.V1.ReadRestrictions"] = "Org.OData.Capabilities.V1.ReadRestrictionsType";
1558
+ TermToTypes["Org.OData.Capabilities.V1.CustomHeaders"] = "Org.OData.Capabilities.V1.CustomParameter";
1559
+ TermToTypes["Org.OData.Capabilities.V1.CustomQueryOptions"] = "Org.OData.Capabilities.V1.CustomParameter";
1560
+ TermToTypes["Org.OData.Capabilities.V1.MediaLocationUpdateSupported"] = "Org.OData.Core.V1.Tag";
1561
+ TermToTypes["Org.OData.Aggregation.V1.ApplySupported"] = "Org.OData.Aggregation.V1.ApplySupportedType";
1562
+ TermToTypes["Org.OData.Aggregation.V1.Groupable"] = "Org.OData.Core.V1.Tag";
1563
+ TermToTypes["Org.OData.Aggregation.V1.Aggregatable"] = "Org.OData.Core.V1.Tag";
1564
+ TermToTypes["Org.OData.Aggregation.V1.ContextDefiningProperties"] = "Edm.PropertyPath";
1565
+ TermToTypes["Org.OData.Aggregation.V1.LeveledHierarchy"] = "Edm.PropertyPath";
1566
+ TermToTypes["Org.OData.Aggregation.V1.RecursiveHierarchy"] = "Org.OData.Aggregation.V1.RecursiveHierarchyType";
1567
+ TermToTypes["Org.OData.Aggregation.V1.AvailableOnAggregates"] = "Org.OData.Aggregation.V1.AvailableOnAggregatesType";
1568
+ TermToTypes["Org.OData.Validation.V1.Minimum"] = "Edm.PrimitiveType";
1569
+ TermToTypes["Org.OData.Validation.V1.Maximum"] = "Edm.PrimitiveType";
1570
+ TermToTypes["Org.OData.Validation.V1.Exclusive"] = "Org.OData.Core.V1.Tag";
1571
+ TermToTypes["Org.OData.Validation.V1.AllowedValues"] = "Org.OData.Validation.V1.AllowedValue";
1572
+ TermToTypes["Org.OData.Validation.V1.MultipleOf"] = "Edm.Decimal";
1573
+ TermToTypes["Org.OData.Validation.V1.Constraint"] = "Org.OData.Validation.V1.ConstraintType";
1574
+ TermToTypes["Org.OData.Validation.V1.ItemsOf"] = "Org.OData.Validation.V1.ItemsOfType";
1575
+ TermToTypes["Org.OData.Validation.V1.OpenPropertyTypeConstraint"] = "Org.OData.Core.V1.QualifiedTypeName";
1576
+ TermToTypes["Org.OData.Validation.V1.DerivedTypeConstraint"] = "Org.OData.Core.V1.QualifiedTypeName";
1577
+ TermToTypes["Org.OData.Validation.V1.AllowedTerms"] = "Org.OData.Core.V1.QualifiedTermName";
1578
+ TermToTypes["Org.OData.Validation.V1.ApplicableTerms"] = "Org.OData.Core.V1.QualifiedTermName";
1579
+ TermToTypes["Org.OData.Validation.V1.MaxItems"] = "Edm.Int64";
1580
+ TermToTypes["Org.OData.Validation.V1.MinItems"] = "Edm.Int64";
1581
+ TermToTypes["Org.OData.Measures.V1.Scale"] = "Edm.Byte";
1582
+ TermToTypes["Org.OData.Measures.V1.DurationGranularity"] = "Org.OData.Measures.V1.DurationGranularityType";
1583
+ TermToTypes["com.sap.vocabularies.Analytics.v1.Dimension"] = "Org.OData.Core.V1.Tag";
1584
+ TermToTypes["com.sap.vocabularies.Analytics.v1.Measure"] = "Org.OData.Core.V1.Tag";
1585
+ TermToTypes["com.sap.vocabularies.Analytics.v1.AccumulativeMeasure"] = "Org.OData.Core.V1.Tag";
1586
+ TermToTypes["com.sap.vocabularies.Analytics.v1.RolledUpPropertyCount"] = "Edm.Int16";
1587
+ TermToTypes["com.sap.vocabularies.Analytics.v1.PlanningAction"] = "Org.OData.Core.V1.Tag";
1588
+ TermToTypes["com.sap.vocabularies.Analytics.v1.AggregatedProperties"] = "com.sap.vocabularies.Analytics.v1.AggregatedPropertyType";
1589
+ TermToTypes["com.sap.vocabularies.Common.v1.ServiceVersion"] = "Edm.Int32";
1590
+ TermToTypes["com.sap.vocabularies.Common.v1.ServiceSchemaVersion"] = "Edm.Int32";
1591
+ TermToTypes["com.sap.vocabularies.Common.v1.TextFor"] = "Edm.PropertyPath";
1592
+ TermToTypes["com.sap.vocabularies.Common.v1.IsLanguageIdentifier"] = "Org.OData.Core.V1.Tag";
1593
+ TermToTypes["com.sap.vocabularies.Common.v1.TextFormat"] = "com.sap.vocabularies.Common.v1.TextFormatType";
1594
+ TermToTypes["com.sap.vocabularies.Common.v1.IsDigitSequence"] = "Org.OData.Core.V1.Tag";
1595
+ TermToTypes["com.sap.vocabularies.Common.v1.IsUpperCase"] = "Org.OData.Core.V1.Tag";
1596
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCurrency"] = "Org.OData.Core.V1.Tag";
1597
+ TermToTypes["com.sap.vocabularies.Common.v1.IsUnit"] = "Org.OData.Core.V1.Tag";
1598
+ TermToTypes["com.sap.vocabularies.Common.v1.UnitSpecificScale"] = "Edm.PrimitiveType";
1599
+ TermToTypes["com.sap.vocabularies.Common.v1.UnitSpecificPrecision"] = "Edm.PrimitiveType";
1600
+ TermToTypes["com.sap.vocabularies.Common.v1.SecondaryKey"] = "Edm.PropertyPath";
1601
+ TermToTypes["com.sap.vocabularies.Common.v1.MinOccurs"] = "Edm.Int64";
1602
+ TermToTypes["com.sap.vocabularies.Common.v1.MaxOccurs"] = "Edm.Int64";
1603
+ TermToTypes["com.sap.vocabularies.Common.v1.AssociationEntity"] = "Edm.NavigationPropertyPath";
1604
+ TermToTypes["com.sap.vocabularies.Common.v1.DerivedNavigation"] = "Edm.NavigationPropertyPath";
1605
+ TermToTypes["com.sap.vocabularies.Common.v1.Masked"] = "Org.OData.Core.V1.Tag";
1606
+ TermToTypes["com.sap.vocabularies.Common.v1.MaskedAlways"] = "Org.OData.Core.V1.Tag";
1607
+ TermToTypes["com.sap.vocabularies.Common.v1.SemanticObjectMapping"] = "com.sap.vocabularies.Common.v1.SemanticObjectMappingType";
1608
+ TermToTypes["com.sap.vocabularies.Common.v1.IsInstanceAnnotation"] = "Org.OData.Core.V1.Tag";
1609
+ TermToTypes["com.sap.vocabularies.Common.v1.FilterExpressionRestrictions"] = "com.sap.vocabularies.Common.v1.FilterExpressionRestrictionType";
1610
+ TermToTypes["com.sap.vocabularies.Common.v1.FieldControl"] = "com.sap.vocabularies.Common.v1.FieldControlType";
1611
+ TermToTypes["com.sap.vocabularies.Common.v1.Application"] = "com.sap.vocabularies.Common.v1.ApplicationType";
1612
+ TermToTypes["com.sap.vocabularies.Common.v1.Timestamp"] = "Edm.DateTimeOffset";
1613
+ TermToTypes["com.sap.vocabularies.Common.v1.ErrorResolution"] = "com.sap.vocabularies.Common.v1.ErrorResolutionType";
1614
+ TermToTypes["com.sap.vocabularies.Common.v1.Messages"] = "Edm.ComplexType";
1615
+ TermToTypes["com.sap.vocabularies.Common.v1.numericSeverity"] = "com.sap.vocabularies.Common.v1.NumericMessageSeverityType";
1616
+ TermToTypes["com.sap.vocabularies.Common.v1.MaximumNumericMessageSeverity"] = "com.sap.vocabularies.Common.v1.NumericMessageSeverityType";
1617
+ TermToTypes["com.sap.vocabularies.Common.v1.IsActionCritical"] = "Edm.Boolean";
1618
+ TermToTypes["com.sap.vocabularies.Common.v1.Attributes"] = "Edm.PropertyPath";
1619
+ TermToTypes["com.sap.vocabularies.Common.v1.RelatedRecursiveHierarchy"] = "Edm.AnnotationPath";
1620
+ TermToTypes["com.sap.vocabularies.Common.v1.Interval"] = "com.sap.vocabularies.Common.v1.IntervalType";
1621
+ TermToTypes["com.sap.vocabularies.Common.v1.ResultContext"] = "Org.OData.Core.V1.Tag";
1622
+ TermToTypes["com.sap.vocabularies.Common.v1.WeakReferentialConstraint"] = "com.sap.vocabularies.Common.v1.WeakReferentialConstraintType";
1623
+ TermToTypes["com.sap.vocabularies.Common.v1.IsNaturalPerson"] = "Org.OData.Core.V1.Tag";
1624
+ TermToTypes["com.sap.vocabularies.Common.v1.ValueList"] = "com.sap.vocabularies.Common.v1.ValueListType";
1625
+ TermToTypes["com.sap.vocabularies.Common.v1.ValueListRelevantQualifiers"] = "com.sap.vocabularies.Common.v1.SimpleIdentifier";
1626
+ TermToTypes["com.sap.vocabularies.Common.v1.ValueListWithFixedValues"] = "Org.OData.Core.V1.Tag";
1627
+ TermToTypes["com.sap.vocabularies.Common.v1.ValueListMapping"] = "com.sap.vocabularies.Common.v1.ValueListMappingType";
1628
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYear"] = "Org.OData.Core.V1.Tag";
1629
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarHalfyear"] = "Org.OData.Core.V1.Tag";
1630
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarQuarter"] = "Org.OData.Core.V1.Tag";
1631
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarMonth"] = "Org.OData.Core.V1.Tag";
1632
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarWeek"] = "Org.OData.Core.V1.Tag";
1633
+ TermToTypes["com.sap.vocabularies.Common.v1.IsDayOfCalendarMonth"] = "Org.OData.Core.V1.Tag";
1634
+ TermToTypes["com.sap.vocabularies.Common.v1.IsDayOfCalendarYear"] = "Org.OData.Core.V1.Tag";
1635
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearHalfyear"] = "Org.OData.Core.V1.Tag";
1636
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearQuarter"] = "Org.OData.Core.V1.Tag";
1637
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearMonth"] = "Org.OData.Core.V1.Tag";
1638
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarYearWeek"] = "Org.OData.Core.V1.Tag";
1639
+ TermToTypes["com.sap.vocabularies.Common.v1.IsCalendarDate"] = "Org.OData.Core.V1.Tag";
1640
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYear"] = "Org.OData.Core.V1.Tag";
1641
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalPeriod"] = "Org.OData.Core.V1.Tag";
1642
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearPeriod"] = "Org.OData.Core.V1.Tag";
1643
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalQuarter"] = "Org.OData.Core.V1.Tag";
1644
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearQuarter"] = "Org.OData.Core.V1.Tag";
1645
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalWeek"] = "Org.OData.Core.V1.Tag";
1646
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearWeek"] = "Org.OData.Core.V1.Tag";
1647
+ TermToTypes["com.sap.vocabularies.Common.v1.IsDayOfFiscalYear"] = "Org.OData.Core.V1.Tag";
1648
+ TermToTypes["com.sap.vocabularies.Common.v1.IsFiscalYearVariant"] = "Org.OData.Core.V1.Tag";
1649
+ TermToTypes["com.sap.vocabularies.Common.v1.MutuallyExclusiveTerm"] = "Org.OData.Core.V1.Tag";
1650
+ TermToTypes["com.sap.vocabularies.Common.v1.DraftRoot"] = "com.sap.vocabularies.Common.v1.DraftRootType";
1651
+ TermToTypes["com.sap.vocabularies.Common.v1.DraftNode"] = "com.sap.vocabularies.Common.v1.DraftNodeType";
1652
+ TermToTypes["com.sap.vocabularies.Common.v1.DraftActivationVia"] = "com.sap.vocabularies.Common.v1.SimpleIdentifier";
1653
+ TermToTypes["com.sap.vocabularies.Common.v1.EditableFieldFor"] = "Edm.PropertyPath";
1654
+ TermToTypes["com.sap.vocabularies.Common.v1.SemanticKey"] = "Edm.PropertyPath";
1655
+ TermToTypes["com.sap.vocabularies.Common.v1.SideEffects"] = "com.sap.vocabularies.Common.v1.SideEffectsType";
1656
+ TermToTypes["com.sap.vocabularies.Common.v1.DefaultValuesFunction"] = "com.sap.vocabularies.Common.v1.QualifiedName";
1657
+ TermToTypes["com.sap.vocabularies.Common.v1.FilterDefaultValue"] = "Edm.PrimitiveType";
1658
+ TermToTypes["com.sap.vocabularies.Common.v1.FilterDefaultValueHigh"] = "Edm.PrimitiveType";
1659
+ TermToTypes["com.sap.vocabularies.Common.v1.SortOrder"] = "com.sap.vocabularies.Common.v1.SortOrderType";
1660
+ TermToTypes["com.sap.vocabularies.Common.v1.RecursiveHierarchy"] = "com.sap.vocabularies.Common.v1.RecursiveHierarchyType";
1661
+ TermToTypes["com.sap.vocabularies.Common.v1.CreatedAt"] = "Edm.DateTimeOffset";
1662
+ TermToTypes["com.sap.vocabularies.Common.v1.CreatedBy"] = "com.sap.vocabularies.Common.v1.UserID";
1663
+ TermToTypes["com.sap.vocabularies.Common.v1.ChangedAt"] = "Edm.DateTimeOffset";
1664
+ TermToTypes["com.sap.vocabularies.Common.v1.ChangedBy"] = "com.sap.vocabularies.Common.v1.UserID";
1665
+ TermToTypes["com.sap.vocabularies.Common.v1.ApplyMultiUnitBehaviorForSortingAndFiltering"] = "Org.OData.Core.V1.Tag";
1666
+ TermToTypes["com.sap.vocabularies.CodeList.v1.CurrencyCodes"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
1667
+ TermToTypes["com.sap.vocabularies.CodeList.v1.UnitsOfMeasure"] = "com.sap.vocabularies.CodeList.v1.CodeListSource";
1668
+ TermToTypes["com.sap.vocabularies.CodeList.v1.StandardCode"] = "Edm.PropertyPath";
1669
+ TermToTypes["com.sap.vocabularies.CodeList.v1.ExternalCode"] = "Edm.PropertyPath";
1670
+ TermToTypes["com.sap.vocabularies.CodeList.v1.IsConfigurationDeprecationCode"] = "Edm.Boolean";
1671
+ TermToTypes["com.sap.vocabularies.Communication.v1.Contact"] = "com.sap.vocabularies.Communication.v1.ContactType";
1672
+ TermToTypes["com.sap.vocabularies.Communication.v1.Address"] = "com.sap.vocabularies.Communication.v1.AddressType";
1673
+ TermToTypes["com.sap.vocabularies.Communication.v1.IsEmailAddress"] = "Org.OData.Core.V1.Tag";
1674
+ TermToTypes["com.sap.vocabularies.Communication.v1.IsPhoneNumber"] = "Org.OData.Core.V1.Tag";
1675
+ TermToTypes["com.sap.vocabularies.Communication.v1.Event"] = "com.sap.vocabularies.Communication.v1.EventData";
1676
+ TermToTypes["com.sap.vocabularies.Communication.v1.Task"] = "com.sap.vocabularies.Communication.v1.TaskData";
1677
+ TermToTypes["com.sap.vocabularies.Communication.v1.Message"] = "com.sap.vocabularies.Communication.v1.MessageData";
1678
+ TermToTypes["com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchy"] = "com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchyType";
1679
+ TermToTypes["com.sap.vocabularies.PersonalData.v1.EntitySemantics"] = "com.sap.vocabularies.PersonalData.v1.EntitySemanticsType";
1680
+ TermToTypes["com.sap.vocabularies.PersonalData.v1.FieldSemantics"] = "com.sap.vocabularies.PersonalData.v1.FieldSemanticsType";
1681
+ TermToTypes["com.sap.vocabularies.PersonalData.v1.IsPotentiallyPersonal"] = "Org.OData.Core.V1.Tag";
1682
+ TermToTypes["com.sap.vocabularies.PersonalData.v1.IsPotentiallySensitive"] = "Org.OData.Core.V1.Tag";
1683
+ TermToTypes["com.sap.vocabularies.Session.v1.StickySessionSupported"] = "com.sap.vocabularies.Session.v1.StickySessionSupportedType";
1684
+ TermToTypes["com.sap.vocabularies.UI.v1.HeaderInfo"] = "com.sap.vocabularies.UI.v1.HeaderInfoType";
1685
+ TermToTypes["com.sap.vocabularies.UI.v1.Identification"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
1686
+ TermToTypes["com.sap.vocabularies.UI.v1.Badge"] = "com.sap.vocabularies.UI.v1.BadgeType";
1687
+ TermToTypes["com.sap.vocabularies.UI.v1.LineItem"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
1688
+ TermToTypes["com.sap.vocabularies.UI.v1.StatusInfo"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
1689
+ TermToTypes["com.sap.vocabularies.UI.v1.FieldGroup"] = "com.sap.vocabularies.UI.v1.FieldGroupType";
1690
+ TermToTypes["com.sap.vocabularies.UI.v1.ConnectedFields"] = "com.sap.vocabularies.UI.v1.ConnectedFieldsType";
1691
+ TermToTypes["com.sap.vocabularies.UI.v1.GeoLocations"] = "com.sap.vocabularies.UI.v1.GeoLocationType";
1692
+ TermToTypes["com.sap.vocabularies.UI.v1.GeoLocation"] = "com.sap.vocabularies.UI.v1.GeoLocationType";
1693
+ TermToTypes["com.sap.vocabularies.UI.v1.Contacts"] = "Edm.AnnotationPath";
1694
+ TermToTypes["com.sap.vocabularies.UI.v1.MediaResource"] = "com.sap.vocabularies.UI.v1.MediaResourceType";
1695
+ TermToTypes["com.sap.vocabularies.UI.v1.DataPoint"] = "com.sap.vocabularies.UI.v1.DataPointType";
1696
+ TermToTypes["com.sap.vocabularies.UI.v1.KPI"] = "com.sap.vocabularies.UI.v1.KPIType";
1697
+ TermToTypes["com.sap.vocabularies.UI.v1.Chart"] = "com.sap.vocabularies.UI.v1.ChartDefinitionType";
1698
+ TermToTypes["com.sap.vocabularies.UI.v1.ValueCriticality"] = "com.sap.vocabularies.UI.v1.ValueCriticalityType";
1699
+ TermToTypes["com.sap.vocabularies.UI.v1.CriticalityLabels"] = "com.sap.vocabularies.UI.v1.CriticalityLabelType";
1700
+ TermToTypes["com.sap.vocabularies.UI.v1.SelectionFields"] = "Edm.PropertyPath";
1701
+ TermToTypes["com.sap.vocabularies.UI.v1.Facets"] = "com.sap.vocabularies.UI.v1.Facet";
1702
+ TermToTypes["com.sap.vocabularies.UI.v1.HeaderFacets"] = "com.sap.vocabularies.UI.v1.Facet";
1703
+ TermToTypes["com.sap.vocabularies.UI.v1.QuickViewFacets"] = "com.sap.vocabularies.UI.v1.Facet";
1704
+ TermToTypes["com.sap.vocabularies.UI.v1.QuickCreateFacets"] = "com.sap.vocabularies.UI.v1.Facet";
1705
+ TermToTypes["com.sap.vocabularies.UI.v1.FilterFacets"] = "com.sap.vocabularies.UI.v1.ReferenceFacet";
1706
+ TermToTypes["com.sap.vocabularies.UI.v1.SelectionPresentationVariant"] = "com.sap.vocabularies.UI.v1.SelectionPresentationVariantType";
1707
+ TermToTypes["com.sap.vocabularies.UI.v1.PresentationVariant"] = "com.sap.vocabularies.UI.v1.PresentationVariantType";
1708
+ TermToTypes["com.sap.vocabularies.UI.v1.SelectionVariant"] = "com.sap.vocabularies.UI.v1.SelectionVariantType";
1709
+ TermToTypes["com.sap.vocabularies.UI.v1.ThingPerspective"] = "Org.OData.Core.V1.Tag";
1710
+ TermToTypes["com.sap.vocabularies.UI.v1.IsSummary"] = "Org.OData.Core.V1.Tag";
1711
+ TermToTypes["com.sap.vocabularies.UI.v1.PartOfPreview"] = "Org.OData.Core.V1.Tag";
1712
+ TermToTypes["com.sap.vocabularies.UI.v1.Map"] = "Org.OData.Core.V1.Tag";
1713
+ TermToTypes["com.sap.vocabularies.UI.v1.Gallery"] = "Org.OData.Core.V1.Tag";
1714
+ TermToTypes["com.sap.vocabularies.UI.v1.IsImageURL"] = "Org.OData.Core.V1.Tag";
1715
+ TermToTypes["com.sap.vocabularies.UI.v1.IsImage"] = "Org.OData.Core.V1.Tag";
1716
+ TermToTypes["com.sap.vocabularies.UI.v1.MultiLineText"] = "Org.OData.Core.V1.Tag";
1717
+ TermToTypes["com.sap.vocabularies.UI.v1.TextArrangement"] = "com.sap.vocabularies.UI.v1.TextArrangementType";
1718
+ TermToTypes["com.sap.vocabularies.UI.v1.Importance"] = "com.sap.vocabularies.UI.v1.ImportanceType";
1719
+ TermToTypes["com.sap.vocabularies.UI.v1.Hidden"] = "Org.OData.Core.V1.Tag";
1720
+ TermToTypes["com.sap.vocabularies.UI.v1.CreateHidden"] = "Org.OData.Core.V1.Tag";
1721
+ TermToTypes["com.sap.vocabularies.UI.v1.UpdateHidden"] = "Org.OData.Core.V1.Tag";
1722
+ TermToTypes["com.sap.vocabularies.UI.v1.DeleteHidden"] = "Org.OData.Core.V1.Tag";
1723
+ TermToTypes["com.sap.vocabularies.UI.v1.HiddenFilter"] = "Org.OData.Core.V1.Tag";
1724
+ TermToTypes["com.sap.vocabularies.UI.v1.DataFieldDefault"] = "com.sap.vocabularies.UI.v1.DataFieldAbstract";
1725
+ TermToTypes["com.sap.vocabularies.UI.v1.Criticality"] = "com.sap.vocabularies.UI.v1.CriticalityType";
1726
+ TermToTypes["com.sap.vocabularies.UI.v1.CriticalityCalculation"] = "com.sap.vocabularies.UI.v1.CriticalityCalculationType";
1727
+ TermToTypes["com.sap.vocabularies.UI.v1.Emphasized"] = "Org.OData.Core.V1.Tag";
1728
+ TermToTypes["com.sap.vocabularies.UI.v1.OrderBy"] = "Edm.PropertyPath";
1729
+ TermToTypes["com.sap.vocabularies.UI.v1.ParameterDefaultValue"] = "Edm.PrimitiveType";
1730
+ TermToTypes["com.sap.vocabularies.UI.v1.RecommendationState"] = "com.sap.vocabularies.UI.v1.RecommendationStateType";
1731
+ TermToTypes["com.sap.vocabularies.UI.v1.RecommendationList"] = "com.sap.vocabularies.UI.v1.RecommendationListType";
1732
+ TermToTypes["com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext"] = "Org.OData.Core.V1.Tag";
1733
+ TermToTypes["com.sap.vocabularies.HTML5.v1.CssDefaults"] = "com.sap.vocabularies.HTML5.v1.CssDefaultsType";
1734
+ })(TermToTypes = exports.TermToTypes || (exports.TermToTypes = {}));
1735
+ /**
1736
+ * Differentiate between a ComplexType and a TypeDefinition.
1737
+ * @param complexTypeDefinition
1738
+ * @returns true if the value is a complex type
1739
+ */
1740
+
1741
+
1742
+ function isComplexTypeDefinition(complexTypeDefinition) {
1743
+ return !!complexTypeDefinition && complexTypeDefinition._type === 'ComplexType' && !!complexTypeDefinition.properties;
1469
1744
  }
1470
1745
 
1471
- if (!resolvedTarget) {
1472
- toResolve.targetString = targetStr;
1746
+ exports.isComplexTypeDefinition = isComplexTypeDefinition;
1473
1747
 
1474
- if (annotationsTerm && annotationType) {
1475
- var oErrorMsg = {
1476
- message: "Unable to resolve the path expression: " + targetStr + "\n" + "\n" + "Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n" + "<Annotation Term = " + annotationsTerm + ">" + "\n" + "<Record Type = " + annotationType + ">" + "\n" + "<AnnotationPath = " + targetStr + ">"
1477
- };
1478
- addAnnotationErrorMessage(targetStr, oErrorMsg);
1479
- } else {
1480
- var _property = toResolve.term;
1481
- var path = toResolve.path;
1482
- var termInfo = targetStr ? targetStr.split("/")[0] : targetStr;
1483
- var _oErrorMsg = {
1484
- message: "Unable to resolve the path expression: " + targetStr + "\n" + "\n" + "Hint: Check and correct the path values under the following structure in the metadata (annotation.xml file or CDS annotations for the application): \n\n" + "<Annotation Term = " + termInfo + ">" + "\n" + "<PropertyValue Property = " + _property + " Path= " + path + ">"
1485
- };
1486
- addAnnotationErrorMessage(targetStr, _oErrorMsg);
1487
- }
1748
+ function Decimal(value) {
1749
+ return {
1750
+ isDecimal: function () {
1751
+ return true;
1752
+ },
1753
+ valueOf: function () {
1754
+ return value;
1755
+ },
1756
+ toString: function () {
1757
+ return value.toString();
1758
+ }
1759
+ };
1488
1760
  }
1489
- });
1490
1761
 
1491
- for (var property in ALL_ANNOTATION_ERRORS) {
1492
- ANNOTATION_ERRORS.push(ALL_ANNOTATION_ERRORS[property][0]);
1493
- }
1762
+ exports.Decimal = Decimal;
1763
+ /***/
1764
+ },
1494
1765
 
1495
- parserOutput.entitySets = parserOutput.schema.entitySets;
1496
- var extraReferences = parserOutput.references.filter(function (reference) {
1497
- return defaultReferences.find(function (defaultRef) {
1498
- return defaultRef.namespace === reference.namespace;
1499
- }) === undefined;
1500
- });
1501
- var convertedOutput = {
1502
- version: parserOutput.version,
1503
- annotations: parserOutput.schema.annotations,
1504
- namespace: parserOutput.schema.namespace,
1505
- entityContainer: parserOutput.schema.entityContainer,
1506
- actions: parserOutput.schema.actions,
1507
- entitySets: parserOutput.schema.entitySets,
1508
- singletons: parserOutput.schema.singletons,
1509
- entityTypes: parserOutput.schema.entityTypes,
1510
- complexTypes: parserOutput.schema.complexTypes,
1511
- typeDefinitions: parserOutput.schema.typeDefinitions,
1512
- references: defaultReferences.concat(extraReferences),
1513
- diagnostics: ANNOTATION_ERRORS.concat()
1514
- };
1515
- convertedOutput.resolvePath = createGlobalResolve(convertedOutput, objectMap);
1516
- return convertedOutput;
1517
- }
1766
+ /***/
1767
+ 426:
1768
+ /***/
1769
+ function (__unused_webpack_module, exports, __webpack_require__) {
1770
+ Object.defineProperty(exports, "__esModule", {
1771
+ value: true
1772
+ });
1773
+ exports.revertTermToGenericType = void 0;
1518
1774
 
1519
- _exports.convertTypes = convertTypes;
1775
+ var utils_1 = __webpack_require__(69);
1776
+ /**
1777
+ * Revert an object to its raw type equivalent.
1778
+ *
1779
+ * @param references the current reference
1780
+ * @param value the value to revert
1781
+ * @returns the raw value
1782
+ */
1520
1783
 
1521
- function revertValueToGenericType(references, value) {
1522
- var result;
1523
1784
 
1524
- if (typeof value === "string") {
1525
- var valueMatches = value.match(/(\w+)\.\w+\/.*/);
1785
+ function revertObjectToRawType(references, value) {
1786
+ var _a, _b;
1526
1787
 
1527
- if (valueMatches && references.find(function (ref) {
1528
- return ref.alias === valueMatches[1];
1529
- })) {
1530
- result = {
1531
- type: "EnumMember",
1532
- EnumMember: value
1533
- };
1534
- } else {
1535
- result = {
1536
- type: "String",
1537
- String: value
1538
- };
1539
- }
1540
- } else if (Array.isArray(value)) {
1541
- result = {
1542
- type: "Collection",
1543
- Collection: value.map(function (anno) {
1544
- return revertCollectionItemToGenericType(references, anno);
1545
- })
1546
- };
1547
- } else if (typeof value === "boolean") {
1548
- result = {
1549
- type: "Bool",
1550
- Bool: value
1551
- };
1552
- } else if (typeof value === "number") {
1553
- if (value.toString() === value.toFixed()) {
1554
- result = {
1555
- type: "Int",
1556
- Int: value
1557
- };
1558
- } else {
1559
- result = {
1560
- type: "Decimal",
1561
- Decimal: value
1562
- };
1788
+ var result;
1789
+
1790
+ if (Array.isArray(value)) {
1791
+ result = {
1792
+ type: 'Collection',
1793
+ Collection: value.map(function (anno) {
1794
+ return revertCollectionItemToRawType(references, anno);
1795
+ })
1796
+ };
1797
+ } else if ((_a = value.isDecimal) === null || _a === void 0 ? void 0 : _a.call(value)) {
1798
+ result = {
1799
+ type: 'Decimal',
1800
+ Decimal: value.valueOf()
1801
+ };
1802
+ } else if ((_b = value.isString) === null || _b === void 0 ? void 0 : _b.call(value)) {
1803
+ var valueMatches = value.split('.');
1804
+
1805
+ if (valueMatches.length > 1 && references.find(function (ref) {
1806
+ return ref.alias === valueMatches[0];
1807
+ })) {
1808
+ result = {
1809
+ type: 'EnumMember',
1810
+ EnumMember: value.valueOf()
1811
+ };
1812
+ } else {
1813
+ result = {
1814
+ type: 'String',
1815
+ String: value.valueOf()
1816
+ };
1817
+ }
1818
+ } else if (value.type === 'Path') {
1819
+ result = {
1820
+ type: 'Path',
1821
+ Path: value.path
1822
+ };
1823
+ } else if (value.type === 'AnnotationPath') {
1824
+ result = {
1825
+ type: 'AnnotationPath',
1826
+ AnnotationPath: value.value
1827
+ };
1828
+ } else if (value.type === 'Apply') {
1829
+ result = {
1830
+ type: 'Apply',
1831
+ Apply: value.Apply
1832
+ };
1833
+ } else if (value.type === 'Null') {
1834
+ result = {
1835
+ type: 'Null'
1836
+ };
1837
+ } else if (value.type === 'PropertyPath') {
1838
+ result = {
1839
+ type: 'PropertyPath',
1840
+ PropertyPath: value.value
1841
+ };
1842
+ } else if (value.type === 'NavigationPropertyPath') {
1843
+ result = {
1844
+ type: 'NavigationPropertyPath',
1845
+ NavigationPropertyPath: value.value
1846
+ };
1847
+ } else if (Object.prototype.hasOwnProperty.call(value, '$Type')) {
1848
+ result = {
1849
+ type: 'Record',
1850
+ Record: revertCollectionItemToRawType(references, value)
1851
+ };
1852
+ }
1853
+
1854
+ return result;
1563
1855
  }
1564
- } else if (typeof value === "object" && value.isDecimal && value.isDecimal()) {
1565
- result = {
1566
- type: "Decimal",
1567
- Decimal: value.valueOf()
1568
- };
1569
- } else if (value.type === "Path") {
1570
- result = {
1571
- type: "Path",
1572
- Path: value.path
1573
- };
1574
- } else if (value.type === "AnnotationPath") {
1575
- result = {
1576
- type: "AnnotationPath",
1577
- AnnotationPath: value.value
1578
- };
1579
- } else if (value.type === "Apply") {
1580
- result = {
1581
- type: "Apply",
1582
- Apply: value.Apply
1583
- };
1584
- } else if (value.type === "Null") {
1585
- result = {
1586
- type: "Null"
1587
- };
1588
- } else if (value.type === "PropertyPath") {
1589
- result = {
1590
- type: "PropertyPath",
1591
- PropertyPath: value.value
1592
- };
1593
- } else if (value.type === "NavigationPropertyPath") {
1594
- result = {
1595
- type: "NavigationPropertyPath",
1596
- NavigationPropertyPath: value.value
1597
- };
1598
- } else if (Object.prototype.hasOwnProperty.call(value, "$Type")) {
1599
- result = {
1600
- type: "Record",
1601
- Record: revertCollectionItemToGenericType(references, value)
1602
- };
1603
- }
1856
+ /**
1857
+ * Revert a value to its raw value depending on its type.
1858
+ *
1859
+ * @param references the current set of reference
1860
+ * @param value the value to revert
1861
+ * @returns the raw expression
1862
+ */
1863
+
1864
+
1865
+ function revertValueToRawType(references, value) {
1866
+ var result;
1867
+ var valueConstructor = value === null || value === void 0 ? void 0 : value.constructor.name;
1868
+
1869
+ switch (valueConstructor) {
1870
+ case 'String':
1871
+ case 'string':
1872
+ var valueMatches = value.toString().split('.');
1873
+
1874
+ if (valueMatches.length > 1 && references.find(function (ref) {
1875
+ return ref.alias === valueMatches[0];
1876
+ })) {
1877
+ result = {
1878
+ type: 'EnumMember',
1879
+ EnumMember: value.toString()
1880
+ };
1881
+ } else {
1882
+ result = {
1883
+ type: 'String',
1884
+ String: value.toString()
1885
+ };
1886
+ }
1604
1887
 
1605
- return result;
1606
- }
1888
+ break;
1889
+
1890
+ case 'Boolean':
1891
+ case 'boolean':
1892
+ result = {
1893
+ type: 'Bool',
1894
+ Bool: value.valueOf()
1895
+ };
1896
+ break;
1897
+
1898
+ case 'Number':
1899
+ case 'number':
1900
+ if (value.toString() === value.toFixed()) {
1901
+ result = {
1902
+ type: 'Int',
1903
+ Int: value.valueOf()
1904
+ };
1905
+ } else {
1906
+ result = {
1907
+ type: 'Decimal',
1908
+ Decimal: value.valueOf()
1909
+ };
1910
+ }
1607
1911
 
1608
- function revertCollectionItemToGenericType(references, collectionItem) {
1609
- if (typeof collectionItem === "string") {
1610
- return collectionItem;
1611
- } else if (typeof collectionItem === "object") {
1612
- if (collectionItem.hasOwnProperty("$Type")) {
1613
- // Annotation Record
1614
- var outItem = {
1615
- type: collectionItem.$Type,
1616
- propertyValues: []
1617
- }; // Could validate keys and type based on $Type
1618
-
1619
- Object.keys(collectionItem).forEach(function (collectionKey) {
1620
- if (collectionKey !== "$Type" && collectionKey !== "term" && collectionKey !== "__source" && collectionKey !== "qualifier" && collectionKey !== "ActionTarget" && collectionKey !== "fullyQualifiedName" && collectionKey !== "annotations") {
1621
- var value = collectionItem[collectionKey];
1622
- outItem.propertyValues.push({
1623
- name: collectionKey,
1624
- value: revertValueToGenericType(references, value)
1625
- });
1626
- } else if (collectionKey === "annotations") {
1627
- var annotations = collectionItem[collectionKey];
1628
- outItem.annotations = [];
1629
- Object.keys(annotations).filter(function (key) {
1630
- return key !== "_annotations";
1631
- }).forEach(function (key) {
1632
- Object.keys(annotations[key]).forEach(function (term) {
1633
- var _outItem$annotations;
1634
-
1635
- var parsedAnnotation = revertTermToGenericType(references, annotations[key][term]);
1636
-
1637
- if (!parsedAnnotation.term) {
1638
- var unaliasedTerm = unalias(references, "".concat(key, ".").concat(term));
1639
-
1640
- if (unaliasedTerm) {
1641
- var qualifiedSplit = unaliasedTerm.split("#");
1642
- parsedAnnotation.term = qualifiedSplit[0];
1643
-
1644
- if (qualifiedSplit.length > 1) {
1645
- parsedAnnotation.qualifier = qualifiedSplit[1];
1646
- }
1647
- }
1648
- }
1912
+ break;
1649
1913
 
1650
- (_outItem$annotations = outItem.annotations) === null || _outItem$annotations === void 0 ? void 0 : _outItem$annotations.push(parsedAnnotation);
1651
- });
1652
- });
1653
- }
1654
- });
1655
- return outItem;
1656
- } else if (collectionItem.type === "PropertyPath") {
1657
- return {
1658
- type: "PropertyPath",
1659
- PropertyPath: collectionItem.value
1660
- };
1661
- } else if (collectionItem.type === "AnnotationPath") {
1662
- return {
1663
- type: "AnnotationPath",
1664
- AnnotationPath: collectionItem.value
1665
- };
1666
- } else if (collectionItem.type === "NavigationPropertyPath") {
1667
- return {
1668
- type: "NavigationPropertyPath",
1669
- NavigationPropertyPath: collectionItem.value
1670
- };
1914
+ case 'object':
1915
+ default:
1916
+ result = revertObjectToRawType(references, value);
1917
+ break;
1918
+ }
1919
+
1920
+ return result;
1671
1921
  }
1672
- }
1673
- }
1674
1922
 
1675
- function revertTermToGenericType(references, annotation) {
1676
- var baseAnnotation = {
1677
- term: annotation.term,
1678
- qualifier: annotation.qualifier
1679
- };
1923
+ var restrictedKeys = ['$Type', 'term', '__source', 'qualifier', 'ActionTarget', 'fullyQualifiedName', 'annotations'];
1924
+ /**
1925
+ * Revert the current embedded annotations to their raw type.
1926
+ *
1927
+ * @param references the current set of reference
1928
+ * @param currentAnnotations the collection item to evaluate
1929
+ * @param targetAnnotations the place where we need to add the annotation
1930
+ */
1680
1931
 
1681
- if (Array.isArray(annotation)) {
1682
- // Collection
1683
- if (annotation.hasOwnProperty("annotations")) {
1684
- baseAnnotation.annotations = [];
1685
- var currentAnnotations = annotation.annotations;
1932
+ function revertAnnotationsToRawType(references, currentAnnotations, targetAnnotations) {
1686
1933
  Object.keys(currentAnnotations).filter(function (key) {
1687
- return key !== "_annotations";
1934
+ return key !== '_annotations';
1688
1935
  }).forEach(function (key) {
1689
1936
  Object.keys(currentAnnotations[key]).forEach(function (term) {
1690
- var _baseAnnotation$annot;
1691
-
1692
1937
  var parsedAnnotation = revertTermToGenericType(references, currentAnnotations[key][term]);
1693
1938
 
1694
1939
  if (!parsedAnnotation.term) {
1695
- var unaliasedTerm = unalias(references, "".concat(key, ".").concat(term));
1940
+ var unaliasedTerm = (0, utils_1.unalias)(references, "".concat(key, ".").concat(term));
1696
1941
 
1697
1942
  if (unaliasedTerm) {
1698
- var qualifiedSplit = unaliasedTerm.split("#");
1943
+ var qualifiedSplit = unaliasedTerm.split('#');
1699
1944
  parsedAnnotation.term = qualifiedSplit[0];
1700
1945
 
1701
1946
  if (qualifiedSplit.length > 1) {
1947
+ // Sub Annotation with a qualifier, not sure when that can happen in real scenarios
1702
1948
  parsedAnnotation.qualifier = qualifiedSplit[1];
1703
1949
  }
1704
1950
  }
1705
1951
  }
1706
1952
 
1707
- (_baseAnnotation$annot = baseAnnotation.annotations) === null || _baseAnnotation$annot === void 0 ? void 0 : _baseAnnotation$annot.push(parsedAnnotation);
1953
+ targetAnnotations.push(parsedAnnotation);
1708
1954
  });
1709
1955
  });
1710
1956
  }
1957
+ /**
1958
+ * Revert the current collection item to the corresponding raw annotation.
1959
+ *
1960
+ * @param references the current set of reference
1961
+ * @param collectionItem the collection item to evaluate
1962
+ * @returns the raw type equivalent
1963
+ */
1964
+
1965
+
1966
+ function revertCollectionItemToRawType(references, collectionItem) {
1967
+ if (typeof collectionItem === 'string') {
1968
+ return collectionItem;
1969
+ } else if (typeof collectionItem === 'object') {
1970
+ if (collectionItem.hasOwnProperty('$Type')) {
1971
+ // Annotation Record
1972
+ var outItem = {
1973
+ type: collectionItem.$Type,
1974
+ propertyValues: []
1975
+ }; // Could validate keys and type based on $Type
1976
+
1977
+ Object.keys(collectionItem).forEach(function (collectionKey) {
1978
+ if (restrictedKeys.indexOf(collectionKey) === -1) {
1979
+ var value = collectionItem[collectionKey];
1980
+ outItem.propertyValues.push({
1981
+ name: collectionKey,
1982
+ value: revertValueToRawType(references, value)
1983
+ });
1984
+ } else if (collectionKey === 'annotations') {
1985
+ outItem.annotations = [];
1986
+ revertAnnotationsToRawType(references, collectionItem[collectionKey], outItem.annotations);
1987
+ }
1988
+ });
1989
+ return outItem;
1990
+ } else if (collectionItem.type === 'PropertyPath') {
1991
+ return {
1992
+ type: 'PropertyPath',
1993
+ PropertyPath: collectionItem.value
1994
+ };
1995
+ } else if (collectionItem.type === 'AnnotationPath') {
1996
+ return {
1997
+ type: 'AnnotationPath',
1998
+ AnnotationPath: collectionItem.value
1999
+ };
2000
+ } else if (collectionItem.type === 'NavigationPropertyPath') {
2001
+ return {
2002
+ type: 'NavigationPropertyPath',
2003
+ NavigationPropertyPath: collectionItem.value
2004
+ };
2005
+ }
2006
+ }
2007
+ }
2008
+ /**
2009
+ * Revert an annotation term to it's generic or raw equivalent.
2010
+ *
2011
+ * @param references the reference of the current context
2012
+ * @param annotation the annotation term to revert
2013
+ * @returns the raw annotation
2014
+ */
2015
+
2016
+
2017
+ function revertTermToGenericType(references, annotation) {
2018
+ var baseAnnotation = {
2019
+ term: annotation.term,
2020
+ qualifier: annotation.qualifier
2021
+ };
1711
2022
 
1712
- return _objectSpread(_objectSpread({}, baseAnnotation), {}, {
1713
- collection: annotation.map(function (anno) {
1714
- return revertCollectionItemToGenericType(references, anno);
1715
- })
1716
- });
1717
- } else if (annotation.hasOwnProperty("$Type")) {
1718
- return _objectSpread(_objectSpread({}, baseAnnotation), {}, {
1719
- record: revertCollectionItemToGenericType(references, annotation)
1720
- });
1721
- } else {
1722
- return _objectSpread(_objectSpread({}, baseAnnotation), {}, {
1723
- value: revertValueToGenericType(references, annotation)
1724
- });
2023
+ if (Array.isArray(annotation)) {
2024
+ // Collection
2025
+ if (annotation.hasOwnProperty('annotations')) {
2026
+ // Annotation on a collection itself, not sure when that happens if at all
2027
+ baseAnnotation.annotations = [];
2028
+ revertAnnotationsToRawType(references, annotation.annotations, baseAnnotation.annotations);
2029
+ }
2030
+
2031
+ return Object.assign(Object.assign({}, baseAnnotation), {
2032
+ collection: annotation.map(function (anno) {
2033
+ return revertCollectionItemToRawType(references, anno);
2034
+ })
2035
+ });
2036
+ } else if (annotation.hasOwnProperty('$Type')) {
2037
+ return Object.assign(Object.assign({}, baseAnnotation), {
2038
+ record: revertCollectionItemToRawType(references, annotation)
2039
+ });
2040
+ } else {
2041
+ return Object.assign(Object.assign({}, baseAnnotation), {
2042
+ value: revertValueToRawType(references, annotation)
2043
+ });
2044
+ }
2045
+ }
2046
+
2047
+ exports.revertTermToGenericType = revertTermToGenericType;
2048
+ /***/
1725
2049
  }
2050
+ /******/
2051
+
2052
+ };
2053
+ /************************************************************************/
2054
+
2055
+ /******/
2056
+ // The module cache
2057
+
2058
+ /******/
2059
+
2060
+ var __webpack_module_cache__ = {};
2061
+ /******/
2062
+
2063
+ /******/
2064
+ // The require function
2065
+
2066
+ /******/
2067
+
2068
+ function __webpack_require__(moduleId) {
2069
+ /******/
2070
+ // Check if module is in cache
2071
+
2072
+ /******/
2073
+ var cachedModule = __webpack_module_cache__[moduleId];
2074
+ /******/
2075
+
2076
+ if (cachedModule !== undefined) {
2077
+ /******/
2078
+ return cachedModule.exports;
2079
+ /******/
2080
+ }
2081
+ /******/
2082
+ // Create a new module (and put it into the cache)
2083
+
2084
+ /******/
2085
+
2086
+
2087
+ var module = __webpack_module_cache__[moduleId] = {
2088
+ /******/
2089
+ // no module.id needed
2090
+
2091
+ /******/
2092
+ // no module.loaded needed
2093
+
2094
+ /******/
2095
+ exports: {}
2096
+ /******/
2097
+
2098
+ };
2099
+ /******/
2100
+
2101
+ /******/
2102
+ // Execute the module function
2103
+
2104
+ /******/
2105
+
2106
+ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2107
+ /******/
2108
+
2109
+ /******/
2110
+ // Return the exports of the module
2111
+
2112
+ /******/
2113
+
2114
+
2115
+ return module.exports;
2116
+ /******/
1726
2117
  }
2118
+ /******/
2119
+
2120
+ /************************************************************************/
2121
+
2122
+ /******/
2123
+
2124
+ /******/
2125
+ // startup
2126
+
2127
+ /******/
2128
+ // Load entry module and return exports
2129
+
2130
+ /******/
2131
+ // This entry module is referenced by other modules so it can't be inlined
2132
+
2133
+ /******/
2134
+
2135
+
2136
+ var __webpack_exports__ = __webpack_require__(759);
2137
+ /******/
2138
+
2139
+
2140
+ AnnotationConverter = __webpack_exports__;
2141
+ /******/
1727
2142
 
1728
- _exports.revertTermToGenericType = revertTermToGenericType;
1729
- return _exports;
1730
- });
1731
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbW1vbi9Bbm5vdGF0aW9uQ29udmVydGVyLnRzIl0sIm5hbWVzIjpbIlBhdGgiLCJwYXRoRXhwcmVzc2lvbiIsInRhcmdldE5hbWUiLCJhbm5vdGF0aW9uc1Rlcm0iLCJhbm5vdGF0aW9uVHlwZSIsInRlcm0iLCJwYXRoIiwidHlwZSIsIiR0YXJnZXQiLCJUZXJtVG9UeXBlcyIsImRlZmF1bHRSZWZlcmVuY2VzIiwiYWxpYXMiLCJuYW1lc3BhY2UiLCJ1cmkiLCJyZWZlcmVuY2VzIiwidW5hbGlhc2VkVmFsdWUiLCJyZXZlcnNlUmVmZXJlbmNlTWFwIiwicmVkdWNlIiwibWFwIiwicmVmZXJlbmNlIiwibGFzdERvdEluZGV4IiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJ2YWx1ZSIsImluZGV4T2YiLCJzcGxpdCIsInByZUFsaWFzIiwicG9zdEFsaWFzIiwiam9pbiIsInVuYWxpYXMiLCJhbGlhc2VkVmFsdWUiLCJyZWZlcmVuY2VNYXAiLCJidWlsZE9iamVjdE1hcCIsInBhcnNlck91dHB1dCIsIm9iamVjdE1hcCIsInNjaGVtYSIsImVudGl0eUNvbnRhaW5lciIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImVudGl0eVNldHMiLCJmb3JFYWNoIiwiZW50aXR5U2V0IiwiYWN0aW9ucyIsImFjdGlvbiIsImlzQm91bmQiLCJ1bkJvdW5kQWN0aW9uTmFtZSIsIl90eXBlIiwicHVzaCIsInBhcmFtZXRlcnMiLCJwYXJhbWV0ZXIiLCJjb21wbGV4VHlwZXMiLCJjb21wbGV4VHlwZSIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsInR5cGVEZWZpbml0aW9ucyIsInR5cGVEZWZpbml0aW9uIiwiZW50aXR5VHlwZXMiLCJlbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsImNvbXBsZXhUeXBlRGVmaW5pdGlvbiIsImNvbXBsZXhUeXBlUHJvcCIsImNvbXBsZXhUeXBlUHJvcFRhcmdldCIsIk9iamVjdCIsImFzc2lnbiIsIm5hbWUiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsIm5hdlByb3BlcnR5Iiwia2V5cyIsImFubm90YXRpb25zIiwiYW5ub3RhdGlvblNvdXJjZSIsImFubm90YXRpb25MaXN0IiwiY3VycmVudFRhcmdldE5hbWUiLCJ0YXJnZXQiLCJhbm5vdGF0aW9uIiwiYW5ub3RhdGlvbkZRTiIsInF1YWxpZmllciIsImNvbWJpbmVQYXRoIiwiY3VycmVudFRhcmdldCIsInN0YXJ0c1dpdGgiLCJhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlIiwib0Vycm9yTXNnIiwiQUxMX0FOTk9UQVRJT05fRVJST1JTIiwicmVzb2x2ZVRhcmdldCIsInBhdGhPbmx5IiwiaW5jbHVkZVZpc2l0ZWRPYmplY3RzIiwidW5kZWZpbmVkIiwiYVZpc2l0ZWRPYmplY3RzIiwicGF0aFNwbGl0IiwidGFyZ2V0UGF0aFNwbGl0IiwicGF0aFBhcnQiLCJhbm5vdGF0aW9uUGF0aCIsImN1cnJlbnRQYXRoIiwiY3VycmVudENvbnRleHQiLCJjdXJyZW50VmFsdWUiLCJsZW5ndGgiLCJ0YXJnZXRUeXBlIiwiZW50aXR5VHlwZU5hbWUiLCJ0YXJnZXRUeXBlTmFtZSIsInNvdXJjZVR5cGUiLCJpc0VudGl0eVNldCIsImxhc3RJZHgiLCJzdWJUYXJnZXQiLCJ2aXNpdGVkT2JqZWN0cyIsInZpc2l0ZWRTdWJPYmplY3QiLCJjb25jYXQiLCJyZXZlcnNlIiwiZmluZCIsIm9iaiIsImludGVybWVkaWF0ZVRhcmdldCIsImhhc093blByb3BlcnR5IiwibWVzc2FnZSIsImlzQW5ub3RhdGlvblBhdGgiLCJwYXRoU3RyIiwicGFyc2VWYWx1ZSIsInByb3BlcnR5VmFsdWUiLCJ2YWx1ZUZRTiIsInRvUmVzb2x2ZSIsInVucmVzb2x2ZWRBbm5vdGF0aW9ucyIsIlN0cmluZyIsIkludCIsIkJvb2wiLCJEZWNpbWFsIiwiRGF0ZSIsIkVudW1NZW1iZXIiLCJQcm9wZXJ0eVBhdGgiLCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiYW5ub3RhdGlvblRhcmdldCIsIkFubm90YXRpb25QYXRoIiwiaW5saW5lIiwicGFyc2VSZWNvcmQiLCJSZWNvcmQiLCJwYXJzZUNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwiaW5mZXJUeXBlRnJvbVRlcm0iLCJpc0Vycm9yIiwicmVjb3JkRGVmaW5pdGlvbiIsImN1cnJlbnRGUU4iLCJhbm5vdGF0aW9uVGVybSIsIiRUeXBlIiwiYW5ub3RhdGlvbkNvbnRlbnQiLCJBcnJheSIsImlzQXJyYXkiLCJzdWJBbm5vdGF0aW9uTGlzdCIsIl9fc291cmNlIiwicHJvcGVydHlWYWx1ZXMiLCJBY3Rpb25UYXJnZXQiLCJBY3Rpb24iLCJBTk5PVEFUSU9OX0VSUk9SUyIsImdldE9ySW5mZXJDb2xsZWN0aW9uVHlwZSIsImNvbGxlY3Rpb25EZWZpbml0aW9uIiwiZmlyc3RDb2xJdGVtIiwicGFyZW50RlFOIiwiY29sbGVjdGlvbkRlZmluaXRpb25UeXBlIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHlJZHgiLCJwYXRoVmFsdWUiLCJhbm5vdGF0aW9uSWR4IiwiYW5ub3RhdGlvbkNvbGxlY3Rpb25FbGVtZW50IiwibmF2UHJvcGVydHlQYXRoIiwibmF2UHJvcElkeCIsInJlY29yZElkeCIsImlmVmFsdWUiLCJzdHJpbmdWYWx1ZSIsIkVycm9yIiwiY29udmVydEFubm90YXRpb24iLCJyZWNvcmQiLCJjb2xsZWN0aW9uIiwiY3JlYXRlUmVzb2x2ZVBhdGhGbiIsInJlbGF0aXZlUGF0aCIsInJlc29sdmVOYXZpZ2F0aW9uUHJvcGVydGllcyIsImFzc29jaWF0aW9ucyIsIm5hdlByb3AiLCJvdXROYXZQcm9wIiwicGFydG5lciIsImlzQ29sbGVjdGlvbiIsImNvbnRhaW5zVGFyZ2V0IiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwicmVsYXRpb25zaGlwIiwidGFyZ2V0QXNzb2NpYXRpb24iLCJhc3NvY2lhdGlvbiIsImFzc29jaWF0aW9uRW5kIiwiZW5kIiwicm9sZSIsInRvUm9sZSIsIm11bHRpcGxpY2l0eSIsIm91dE5hdlByb3BSZXEiLCJyZXNvbHZlUGF0aCIsImxpbmtBY3Rpb25zVG9FbnRpdHlUeXBlIiwic291cmNlRW50aXR5VHlwZSIsInJldHVybkVudGl0eVR5cGUiLCJyZXR1cm5UeXBlIiwibGlua0VudGl0eVR5cGVUb0VudGl0eVNldCIsImtleVByb3AiLCJpc0tleSIsImxpbmtFbnRpdHlUeXBlVG9TaW5nbGV0b24iLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwidHlwZU5hbWUiLCJsaW5rUHJvcGVydGllc1RvQ29tcGxleFR5cGVzIiwibGluayIsImNvbXBsZXhUeXBlTmFtZSIsInNFcnJvciIsInByZXBhcmVDb21wbGV4VHlwZXMiLCJzcGxpdFRlcm0iLCJ0ZXJtVmFsdWUiLCJhbGlhc2VkVGVybSIsImxhc3REb3QiLCJ0ZXJtQWxpYXMiLCJjcmVhdGVHbG9iYWxSZXNvbHZlIiwiY29udmVydGVkT3V0cHV0Iiwic1BhdGgiLCJhUGF0aFNwbGl0Iiwic2hpZnQiLCJlbnRpdHlTZXROYW1lIiwiZXQiLCJvYmplY3RQYXRoIiwidGFyZ2V0UmVzb2x1dGlvbiIsImNvbnZlcnRUeXBlcyIsIm9iamVjdE1hcEVsZW1lbnQiLCJhbGxUYXJnZXRzIiwiYk92ZXJyaWRlRXhpc3RpbmciLCJ2b2NBbGlhcyIsInZvY1Rlcm0iLCJfYW5ub3RhdGlvbnMiLCJ2b2NUZXJtV2l0aFF1YWxpZmllciIsIkJvb2xlYW4iLCJleHRyYVVucmVzb2x2ZWRBbm5vdGF0aW9ucyIsImJhc2VPYmoiLCJhbm5vdGF0aW9uUGFydCIsInRhcmdldFNwbGl0Iiwic2xpY2UiLCJjdXJyZW50T2JqIiwicmVzb2x2ZWFibGUiLCJ0YXJnZXRTdHIiLCJyZXNvbHZlZFRhcmdldCIsInRhcmdldFN0cmluZyIsInRlcm1JbmZvIiwiZXh0cmFSZWZlcmVuY2VzIiwiZmlsdGVyIiwiZGVmYXVsdFJlZiIsInZlcnNpb24iLCJkaWFnbm9zdGljcyIsInJldmVydFZhbHVlVG9HZW5lcmljVHlwZSIsInJlc3VsdCIsInZhbHVlTWF0Y2hlcyIsIm1hdGNoIiwicmVmIiwiYW5ubyIsInJldmVydENvbGxlY3Rpb25JdGVtVG9HZW5lcmljVHlwZSIsInRvU3RyaW5nIiwidG9GaXhlZCIsImlzRGVjaW1hbCIsInZhbHVlT2YiLCJBcHBseSIsInByb3RvdHlwZSIsImNhbGwiLCJjb2xsZWN0aW9uSXRlbSIsIm91dEl0ZW0iLCJjb2xsZWN0aW9uS2V5Iiwia2V5IiwicGFyc2VkQW5ub3RhdGlvbiIsInJldmVydFRlcm1Ub0dlbmVyaWNUeXBlIiwidW5hbGlhc2VkVGVybSIsInF1YWxpZmllZFNwbGl0IiwiYmFzZUFubm90YXRpb24iLCJjdXJyZW50QW5ub3RhdGlvbnMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF3Q01BLEksNkJBUUwsY0FDQ0MsY0FERCxFQUVDQyxVQUZELEVBR0NDLGVBSEQsRUFJQ0MsY0FKRCxFQUtDQyxJQUxELEVBTUU7QUFBQTs7QUFDRCxTQUFLQyxJQUFMLEdBQVlMLGNBQWMsQ0FBQ0QsSUFBM0I7QUFDQSxTQUFLTyxJQUFMLEdBQVksTUFBWjtBQUNBLFNBQUtDLE9BQUwsR0FBZU4sVUFBZjtBQUNDLFNBQUtHLElBQUwsR0FBWUEsSUFBYixFQUFxQixLQUFLRCxjQUFMLEdBQXNCQSxjQUEzQyxFQUE2RCxLQUFLRCxlQUFMLEdBQXVCQSxlQUFwRjtBQUNBLEc7O01BR0dNLFc7O2FBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFBQSxXO0FBQUFBLElBQUFBLFc7QUFBQUEsSUFBQUEsVztBQUFBQSxJQUFB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LEtBRk0sTUFFQTtBQUNOLDZDQUFZK0wsY0FBWjtBQUE0QmhQLFFBQUFBLEtBQUssRUFBRTBOLHdCQUF3QixDQUFDbk8sVUFBRCxFQUFhMEQsVUFBYjtBQUEzRDtBQUNBO0FBQ0QiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFubm90YXRpb24gYXMgRWRtQW5ub3RhdGlvbixcblx0QW5ub3RhdGlvbkxpc3QsXG5cdEFubm90YXRpb25SZWNvcmQsXG5cdEFubm90YXRpb25UZXJtLFxuXHRDb252ZXJ0ZXJPdXRwdXQsXG5cdEV4cHJlc3Npb24sXG5cdFBhcnNlck91dHB1dCxcblx0UGF0aEV4cHJlc3Npb24sXG5cdFByb3BlcnR5UGF0aCxcblx0UHJvcGVydHlWYWx1ZSxcblx0QW5ub3RhdGlvblBhdGhFeHByZXNzaW9uLFxuXHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoRXhwcmVzc2lvbixcblx0UHJvcGVydHlQYXRoRXhwcmVzc2lvblxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7XG5cdEFzc29jaWF0aW9uLFxuXHRHZW5lcmljTmF2aWdhdGlvblByb3BlcnR5LFxuXHRSZWZlcmVuY2UsXG5cdFByb3BlcnR5IGFzIFBhcnNlclByb3BlcnR5LFxuXHRFbnRpdHlUeXBlIGFzIFBhcnNlckVudGl0eVR5cGUsXG5cdENvbXBsZXhUeXBlIGFzIFBhcnNlckNvbXBsZXhUeXBlLFxuXHRUeXBlRGVmaW5pdGlvbiBhcyBQYXJzZXJUeXBlRGVmaW5pdGlvbixcblx0VjJOYXZpZ2F0aW9uUHJvcGVydHksXG5cdFY0TmF2aWdhdGlvblByb3BlcnR5XG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L1BhcnNlclwiO1xuaW1wb3J0IHtcblx0QW5ub3RhdGlvbixcblx0RW50aXR5VHlwZSxcblx0Q29tcGxleFR5cGUsXG5cdEFjdGlvbixcblx0RW50aXR5U2V0LFxuXHRTaW5nbGV0b24sXG5cdFByb3BlcnR5LFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdEVudGl0eUNvbnRhaW5lcixcblx0U2VydmljZU9iamVjdEFuZEFubm90YXRpb24sXG5cdFJlc29sdXRpb25UYXJnZXQsXG5cdFR5cGVEZWZpbml0aW9uXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0NvbnZlcnRlclwiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwidHMtbm9kZVwiO1xuXG5jbGFzcyBQYXRoIHtcblx0cGF0aDogc3RyaW5nO1xuXHQkdGFyZ2V0OiBzdHJpbmc7XG5cdHR5cGU6IHN0cmluZztcblx0YW5ub3RhdGlvbnNUZXJtOiBzdHJpbmc7XG5cdGFubm90YXRpb25UeXBlOiBzdHJpbmc7XG5cdHRlcm06IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwYXRoRXhwcmVzc2lvbjogUGF0aEV4cHJlc3Npb24sXG5cdFx0dGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25zVGVybTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25UeXBlOiBzdHJpbmcsXG5cdFx0dGVybTogc3RyaW5nXG5cdCkge1xuXHRcdHRoaXMucGF0aCA9IHBhdGhFeHByZXNzaW9uLlBhdGg7XG5cdFx0dGhpcy50eXBlID0gXCJQYXRoXCI7XG5cdFx0dGhpcy4kdGFyZ2V0ID0gdGFyZ2V0TmFtZTtcblx0XHQodGhpcy50ZXJtID0gdGVybSksICh0aGlzLmFubm90YXRpb25UeXBlID0gYW5ub3RhdGlvblR5cGUpLCAodGhpcy5hbm5vdGF0aW9uc1Rlcm0gPSBhbm5vdGF0aW9uc1Rlcm0pO1xuXHR9XG59XG5cbmVudW0gVGVybVRvVHlwZXMge1xuXHRcIk9yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLlNlY3VyaXR5U2NoZW1lc1wiID0gXCJPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5TZWN1cml0eVNjaGVtZVwiLFxuXHRcIk9yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLkF1dGhvcml6YXRpb25zXCIgPSBcIk9yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLkF1dGhvcml6YXRpb25cIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5SZXZpc2lvbnNcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuUmV2aXNpb25UeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuTGlua3NcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuTGlua1wiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxLkV4YW1wbGVcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuRXhhbXBsZVZhbHVlXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuTWVzc2FnZXNcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuTWVzc2FnZVR5cGVcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5WYWx1ZUV4Y2VwdGlvblwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5WYWx1ZUV4Y2VwdGlvblR5cGVcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5SZXNvdXJjZUV4Y2VwdGlvblwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5SZXNvdXJjZUV4Y2VwdGlvblR5cGVcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5EYXRhTW9kaWZpY2F0aW9uRXhjZXB0aW9uXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLkRhdGFNb2RpZmljYXRpb25FeGNlcHRpb25UeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuSXNMYW5ndWFnZURlcGVuZGVudFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5EZXJlZmVyZW5jZWFibGVJRHNcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuQ29udmVudGlvbmFsSURzXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxLlBlcm1pc3Npb25zXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlBlcm1pc3Npb25cIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5EZWZhdWx0TmFtZXNwYWNlXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZERlZmF1bHRWYWx1ZVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5Jc1VSTFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5Jc01lZGlhVHlwZVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5Db250ZW50RGlzcG9zaXRpb25cIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuQ29udGVudERpc3Bvc2l0aW9uVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxLk9wdGltaXN0aWNDb25jdXJyZW5jeVwiID0gXCJFZG0uUHJvcGVydHlQYXRoXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuQWRkaXRpb25hbFByb3BlcnRpZXNcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuQXV0b0V4cGFuZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5BdXRvRXhwYW5kUmVmZXJlbmNlc1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5NYXlJbXBsZW1lbnRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuUXVhbGlmaWVkVHlwZU5hbWVcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5PcmRlcmVkXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxLlBvc2l0aW9uYWxJbnNlcnRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjEuQWx0ZXJuYXRlS2V5c1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5BbHRlcm5hdGVLZXlcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5PcHRpb25hbFBhcmFtZXRlclwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5PcHRpb25hbFBhcmFtZXRlclR5cGVcIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGVcIiA9IFwiRWRtLkJvb2xlYW5cIixcblx0XCJPcmcuT0RhdGEuQ29yZS5WMS5TeW1ib2xpY05hbWVcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuU2ltcGxlSWRlbnRpZmllclwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29uZm9ybWFuY2VMZXZlbFwiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbmZvcm1hbmNlTGV2ZWxUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Bc3luY2hyb25vdXNSZXF1ZXN0c1N1cHBvcnRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoQ29udGludWVPbkVycm9yU3VwcG9ydGVkXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSXNvbGF0aW9uU3VwcG9ydGVkXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSXNvbGF0aW9uTGV2ZWxcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNyb3NzSm9pblN1cHBvcnRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNhbGxiYWNrU3VwcG9ydGVkXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2FsbGJhY2tUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DaGFuZ2VUcmFja2luZ1wiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNoYW5nZVRyYWNraW5nVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ291bnRSZXN0cmljdGlvbnNcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db3VudFJlc3RyaWN0aW9uc1R5cGVcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnNcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5kZXhhYmxlQnlLZXlcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Ub3BTdXBwb3J0ZWRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Ta2lwU3VwcG9ydGVkXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29tcHV0ZVN1cHBvcnRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlbGVjdFN1cHBvcnRcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWxlY3RTdXBwb3J0VHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQmF0Y2hTdXBwb3J0ZWRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaFN1cHBvcnRcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaFN1cHBvcnRUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJSZXN0cmljdGlvbnNUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Tb3J0UmVzdHJpY3Rpb25zXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU29ydFJlc3RyaWN0aW9uc1R5cGVcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkV4cGFuZFJlc3RyaWN0aW9uc1wiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkV4cGFuZFJlc3RyaWN0aW9uc1R5cGVcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9uc1wiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlYXJjaFJlc3RyaWN0aW9uc1R5cGVcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLktleUFzU2VnbWVudFN1cHBvcnRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlF1ZXJ5U2VnbWVudFN1cHBvcnRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1wiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1R5cGVcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBJbnNlcnRTdXBwb3J0XCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVlcEluc2VydFN1cHBvcnRUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5VcGRhdGVSZXN0cmljdGlvbnNcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5VcGRhdGVSZXN0cmljdGlvbnNUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwVXBkYXRlU3VwcG9ydFwiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlZXBVcGRhdGVTdXBwb3J0VHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVsZXRlUmVzdHJpY3Rpb25zXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVsZXRlUmVzdHJpY3Rpb25zVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29sbGVjdGlvblByb3BlcnR5UmVzdHJpY3Rpb25zXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29sbGVjdGlvblByb3BlcnR5UmVzdHJpY3Rpb25zVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuT3BlcmF0aW9uUmVzdHJpY3Rpb25zXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuT3BlcmF0aW9uUmVzdHJpY3Rpb25zVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQW5ub3RhdGlvblZhbHVlc0luUXVlcnlTdXBwb3J0ZWRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Nb2RpZmljYXRpb25RdWVyeU9wdGlvbnNcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Nb2RpZmljYXRpb25RdWVyeU9wdGlvbnNUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5SZWFkUmVzdHJpY3Rpb25zXCIgPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuUmVhZFJlc3RyaWN0aW9uc1R5cGVcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbUhlYWRlcnNcIiA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21QYXJhbWV0ZXJcIixcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVF1ZXJ5T3B0aW9uc1wiID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVBhcmFtZXRlclwiLFxuXHRcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTWVkaWFMb2NhdGlvblVwZGF0ZVN1cHBvcnRlZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWRcIiA9IFwiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5Hcm91cGFibGVcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFnZ3JlZ2F0YWJsZVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQ29udGV4dERlZmluaW5nUHJvcGVydGllc1wiID0gXCJFZG0uUHJvcGVydHlQYXRoXCIsXG5cdFwiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkxldmVsZWRIaWVyYXJjaHlcIiA9IFwiRWRtLlByb3BlcnR5UGF0aFwiLFxuXHRcIk9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5SZWN1cnNpdmVIaWVyYXJjaHlcIiA9IFwiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLlJlY3Vyc2l2ZUhpZXJhcmNoeVR5cGVcIixcblx0XCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXZhaWxhYmxlT25BZ2dyZWdhdGVzXCIgPSBcIk9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BdmFpbGFibGVPbkFnZ3JlZ2F0ZXNUeXBlXCIsXG5cdFwiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bVwiID0gXCJFZG0uUHJpbWl0aXZlVHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW1cIiA9IFwiRWRtLlByaW1pdGl2ZVR5cGVcIixcblx0XCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5FeGNsdXNpdmVcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQWxsb3dlZFZhbHVlc1wiID0gXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVmFsdWVcIixcblx0XCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NdWx0aXBsZU9mXCIgPSBcIkVkbS5EZWNpbWFsXCIsXG5cdFwiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuQ29uc3RyYWludFwiID0gXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5Db25zdHJhaW50VHlwZVwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkl0ZW1zT2ZcIiA9IFwiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuSXRlbXNPZlR5cGVcIixcblx0XCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5PcGVuUHJvcGVydHlUeXBlQ29uc3RyYWludFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUeXBlTmFtZVwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkRlcml2ZWRUeXBlQ29uc3RyYWludFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUeXBlTmFtZVwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkFsbG93ZWRUZXJtc1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUZXJtTmFtZVwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkFwcGxpY2FibGVUZXJtc1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUZXJtTmFtZVwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heEl0ZW1zXCIgPSBcIkVkbS5JbnQ2NFwiLFxuXHRcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbkl0ZW1zXCIgPSBcIkVkbS5JbnQ2NFwiLFxuXHRcIk9yZy5PRGF0YS5NZWFzdXJlcy5WMS5TY2FsZVwiID0gXCJFZG0uQnl0ZVwiLFxuXHRcIk9yZy5PRGF0YS5NZWFzdXJlcy5WMS5EdXJhdGlvbkdyYW51bGFyaXR5XCIgPSBcIk9yZy5PRGF0YS5NZWFzdXJlcy5WMS5EdXJhdGlvbkdyYW51bGFyaXR5VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5EaW1lbnNpb25cIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFjY3VtdWxhdGl2ZU1lYXN1cmVcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLlJvbGxlZFVwUHJvcGVydHlDb3VudFwiID0gXCJFZG0uSW50MTZcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuUGxhbm5pbmdBY3Rpb25cIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0aWVzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydHlUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlcnZpY2VWZXJzaW9uXCIgPSBcIkVkbS5JbnQzMlwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZXJ2aWNlU2NoZW1hVmVyc2lvblwiID0gXCJFZG0uSW50MzJcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEZvclwiID0gXCJFZG0uUHJvcGVydHlQYXRoXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzTGFuZ3VhZ2VJZGVudGlmaWVyXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0Rm9ybWF0XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0Rm9ybWF0VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzVXBwZXJDYXNlXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0N1cnJlbmN5XCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc1VuaXRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVuaXRTcGVjaWZpY1NjYWxlXCIgPSBcIkVkbS5QcmltaXRpdmVUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVuaXRTcGVjaWZpY1ByZWNpc2lvblwiID0gXCJFZG0uUHJpbWl0aXZlVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZWNvbmRhcnlLZXlcIiA9IFwiRWRtLlByb3BlcnR5UGF0aFwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NaW5PY2N1cnNcIiA9IFwiRWRtLkludDY0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1heE9jY3Vyc1wiID0gXCJFZG0uSW50NjRcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXNzb2NpYXRpb25FbnRpdHlcIiA9IFwiRWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVyaXZlZE5hdmlnYXRpb25cIiA9IFwiRWRtLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWFza2VkXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NYXNrZWRBbHdheXNcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljT2JqZWN0TWFwcGluZ1wiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0luc3RhbmNlQW5ub3RhdGlvblwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uc1wiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbGljYXRpb25cIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGxpY2F0aW9uVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UaW1lc3RhbXBcIiA9IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkVycm9yUmVzb2x1dGlvblwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRXJyb3JSZXNvbHV0aW9uVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlc1wiID0gXCJFZG0uQ29tcGxleFR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEubnVtZXJpY1NldmVyaXR5XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5OdW1lcmljTWVzc2FnZVNldmVyaXR5VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NYXhpbXVtTnVtZXJpY01lc3NhZ2VTZXZlcml0eVwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTnVtZXJpY01lc3NhZ2VTZXZlcml0eVR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbFwiID0gXCJFZG0uQm9vbGVhblwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5BdHRyaWJ1dGVzXCIgPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVsYXRlZFJlY3Vyc2l2ZUhpZXJhcmNoeVwiID0gXCJFZG0uQW5ub3RhdGlvblBhdGhcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSW50ZXJ2YWxcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkludGVydmFsVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0XCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5XZWFrUmVmZXJlbnRpYWxDb25zdHJhaW50XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5XZWFrUmVmZXJlbnRpYWxDb25zdHJhaW50VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc05hdHVyYWxQZXJzb25cIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RSZWxldmFudFF1YWxpZmllcnNcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpbXBsZUlkZW50aWZpZXJcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RNYXBwaW5nXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RNYXBwaW5nVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhclwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhckhhbGZ5ZWFyXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyUXVhcnRlclwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhck1vbnRoXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyV2Vla1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkNhbGVuZGFyTW9udGhcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGF5T2ZDYWxlbmRhclllYXJcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFySGFsZnllYXJcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyUXVhcnRlclwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJNb250aFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJXZWVrXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyRGF0ZVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFBlcmlvZFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyUGVyaW9kXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFF1YXJ0ZXJcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclF1YXJ0ZXJcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsV2Vla1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxZZWFyV2Vla1wiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEYXlPZkZpc2NhbFllYXJcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclZhcmlhbnRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk11dHVhbGx5RXhjbHVzaXZlVGVybVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZVwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdEFjdGl2YXRpb25WaWFcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpbXBsZUlkZW50aWZpZXJcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRWRpdGFibGVGaWVsZEZvclwiID0gXCJFZG0uUHJvcGVydHlQYXRoXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljS2V5XCIgPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHNcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25cIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlF1YWxpZmllZE5hbWVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmlsdGVyRGVmYXVsdFZhbHVlXCIgPSBcIkVkbS5QcmltaXRpdmVUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckRlZmF1bHRWYWx1ZUhpZ2hcIiA9IFwiRWRtLlByaW1pdGl2ZVR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU29ydE9yZGVyXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Tb3J0T3JkZXJUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlY3Vyc2l2ZUhpZXJhcmNoeVwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DcmVhdGVkQXRcIiA9IFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNyZWF0ZWRCeVwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVXNlcklEXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNoYW5nZWRBdFwiID0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ2hhbmdlZEJ5XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vc2VySURcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbHlNdWx0aVVuaXRCZWhhdmlvckZvclNvcnRpbmdBbmRGaWx0ZXJpbmdcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuQ3VycmVuY3lDb2Rlc1wiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Db2RlTGlzdFNvdXJjZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLlVuaXRzT2ZNZWFzdXJlXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkNvZGVMaXN0U291cmNlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuU3RhbmRhcmRDb2RlXCIgPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5FeHRlcm5hbENvZGVcIiA9IFwiRWRtLlByb3BlcnR5UGF0aFwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLklzQ29uZmlndXJhdGlvbkRlcHJlY2F0aW9uQ29kZVwiID0gXCJFZG0uQm9vbGVhblwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5BZGRyZXNzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQWRkcmVzc1R5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLklzRW1haWxBZGRyZXNzXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuSXNQaG9uZU51bWJlclwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkV2ZW50XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuRXZlbnREYXRhXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5UYXNrXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuVGFza0RhdGFcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLk1lc3NhZ2VcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5NZXNzYWdlRGF0YVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkhpZXJhcmNoeS52MS5SZWN1cnNpdmVIaWVyYXJjaHlcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuSGllcmFyY2h5LnYxLlJlY3Vyc2l2ZUhpZXJhcmNoeVR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuRW50aXR5U2VtYW50aWNzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5FbnRpdHlTZW1hbnRpY3NUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkZpZWxkU2VtYW50aWNzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5GaWVsZFNlbWFudGljc1R5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVBlcnNvbmFsXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mb1wiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklkZW50aWZpY2F0aW9uXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQmFkZ2VcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQmFkZ2VUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1cIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkQWJzdHJhY3RcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TdGF0dXNJbmZvXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1wiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHNUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25zXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbnRhY3RzXCIgPSBcIkVkbS5Bbm5vdGF0aW9uUGF0aFwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1lZGlhUmVzb3VyY2VcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTWVkaWFSZXNvdXJjZVR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLktQSVwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5LUElUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlZhbHVlQ3JpdGljYWxpdHlcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVmFsdWVDcml0aWNhbGl0eVR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUxhYmVsc1wiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUxhYmVsVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvbkZpZWxkc1wiID0gXCJFZG0uUHJvcGVydHlQYXRoXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVyRmFjZXRzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUXVpY2tWaWV3RmFjZXRzXCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0XCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUXVpY2tDcmVhdGVGYWNldHNcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWx0ZXJGYWNldHNcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVmZXJlbmNlRmFjZXRcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblByZXNlbnRhdGlvblZhcmlhbnRUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QcmVzZW50YXRpb25WYXJpYW50VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlNlbGVjdGlvblZhcmlhbnRcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uVmFyaWFudFR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UaGluZ1BlcnNwZWN0aXZlXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzU3VtbWFyeVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJ0T2ZQcmV2aWV3XCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk1hcFwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HYWxsZXJ5XCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzSW1hZ2VVUkxcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSXNJbWFnZVwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5NdWx0aUxpbmVUZXh0XCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRUeXBlXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSW1wb3J0YW5jZVwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5JbXBvcnRhbmNlVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhpZGRlblwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DcmVhdGVIaWRkZW5cIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVXBkYXRlSGlkZGVuXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRlbGV0ZUhpZGRlblwiID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5GaWx0ZXJcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRGVmYXVsdFwiID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdFwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5XCIgPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb25cIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlDYWxjdWxhdGlvblR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FbXBoYXNpemVkXCIgPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9yZGVyQnlcIiA9IFwiRWRtLlByb3BlcnR5UGF0aFwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlBhcmFtZXRlckRlZmF1bHRWYWx1ZVwiID0gXCJFZG0uUHJpbWl0aXZlVHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlJlY29tbWVuZGF0aW9uU3RhdGVcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25TdGF0ZVR5cGVcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvbkxpc3RcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25MaXN0VHlwZVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIiA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEuQ3NzRGVmYXVsdHNcIiA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuSFRNTDUudjEuQ3NzRGVmYXVsdHNUeXBlXCJcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCA9IFtcblx0eyBhbGlhczogXCJDYXBhYmlsaXRpZXNcIiwgbmFtZXNwYWNlOiBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjFcIiwgdXJpOiBcIlwiIH0sXG5cdHsgYWxpYXM6IFwiQWdncmVnYXRpb25cIiwgbmFtZXNwYWNlOiBcIk9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMVwiLCB1cmk6IFwiXCIgfSxcblx0eyBhbGlhczogXCJWYWxpZGF0aW9uXCIsIG5hbWVzcGFjZTogXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMVwiLCB1cmk6IFwiXCIgfSxcblx0eyBuYW1lc3BhY2U6IFwiT3JnLk9EYXRhLkNvcmUuVjFcIiwgYWxpYXM6IFwiQ29yZVwiLCB1cmk6IFwiXCIgfSxcblx0eyBuYW1lc3BhY2U6IFwiT3JnLk9EYXRhLk1lYXN1cmVzLlYxXCIsIGFsaWFzOiBcIk1lYXN1cmVzXCIsIHVyaTogXCJcIiB9LFxuXHR7IG5hbWVzcGFjZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjFcIiwgYWxpYXM6IFwiQ29tbW9uXCIsIHVyaTogXCJcIiB9LFxuXHR7IG5hbWVzcGFjZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MVwiLCBhbGlhczogXCJVSVwiLCB1cmk6IFwiXCIgfSxcblx0eyBuYW1lc3BhY2U6IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MVwiLCBhbGlhczogXCJTZXNzaW9uXCIsIHVyaTogXCJcIiB9LFxuXHR7IG5hbWVzcGFjZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjFcIiwgYWxpYXM6IFwiQW5hbHl0aWNzXCIsIHVyaTogXCJcIiB9LFxuXHR7IG5hbWVzcGFjZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MVwiLCBhbGlhczogXCJDb2RlTGlzdFwiLCB1cmk6IFwiXCIgfSxcblx0eyBuYW1lc3BhY2U6IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxXCIsIGFsaWFzOiBcIlBlcnNvbmFsRGF0YVwiLCB1cmk6IFwiXCIgfSxcblx0eyBuYW1lc3BhY2U6IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MVwiLCBhbGlhczogXCJDb21tdW5pY2F0aW9uXCIsIHVyaTogXCJcIiB9LFxuXHR7IG5hbWVzcGFjZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5IVE1MNS52MVwiLCBhbGlhczogXCJIVE1MNVwiLCB1cmk6IFwiXCIgfVxuXTtcblxudHlwZSBSZWZlcmVuY2VzV2l0aE1hcCA9IFJlZmVyZW5jZVtdICYge1xuXHRyZWZlcmVuY2VNYXA/OiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+O1xuXHRyZXZlcnNlUmVmZXJlbmNlTWFwPzogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPjtcbn07XG5cbmZ1bmN0aW9uIGFsaWFzKHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNXaXRoTWFwLCB1bmFsaWFzZWRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKCFyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXApIHtcblx0XHRyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXAgPSByZWZlcmVuY2VzLnJlZHVjZSgobWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+LCByZWZlcmVuY2UpID0+IHtcblx0XHRcdG1hcFtyZWZlcmVuY2UubmFtZXNwYWNlXSA9IHJlZmVyZW5jZTtcblx0XHRcdHJldHVybiBtYXA7XG5cdFx0fSwge30pO1xuXHR9XG5cdGlmICghdW5hbGlhc2VkVmFsdWUpIHtcblx0XHRyZXR1cm4gdW5hbGlhc2VkVmFsdWU7XG5cdH1cblx0Y29uc3QgbGFzdERvdEluZGV4ID0gdW5hbGlhc2VkVmFsdWUubGFzdEluZGV4T2YoXCIuXCIpO1xuXHRjb25zdCBuYW1lc3BhY2UgPSB1bmFsaWFzZWRWYWx1ZS5zdWJzdHIoMCwgbGFzdERvdEluZGV4KTtcblx0Y29uc3QgdmFsdWUgPSB1bmFsaWFzZWRWYWx1ZS5zdWJzdHIobGFzdERvdEluZGV4ICsgMSk7XG5cdGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMucmV2ZXJzZVJlZmVyZW5jZU1hcFtuYW1lc3BhY2VdO1xuXHRpZiAocmVmZXJlbmNlKSB7XG5cdFx0cmV0dXJuIGAke3JlZmVyZW5jZS5hbGlhc30uJHt2YWx1ZX1gO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRyeSB0byBzZWUgaWYgaXQncyBhbiBhbm5vdGF0aW9uIFBhdGggbGlrZSB0b19TYWxlc09yZGVyL0BVSS5MaW5lSXRlbVxuXHRcdGlmICh1bmFsaWFzZWRWYWx1ZS5pbmRleE9mKFwiQFwiKSAhPT0gLTEpIHtcblx0XHRcdGNvbnN0IFtwcmVBbGlhcywgLi4ucG9zdEFsaWFzXSA9IHVuYWxpYXNlZFZhbHVlLnNwbGl0KFwiQFwiKTtcblx0XHRcdHJldHVybiBgJHtwcmVBbGlhc31AJHthbGlhcyhyZWZlcmVuY2VzLCBwb3N0QWxpYXMuam9pbihcIkBcIikpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmFsaWFzZWRWYWx1ZTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gdW5hbGlhcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcCwgYWxpYXNlZFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXJlZmVyZW5jZXMucmVmZXJlbmNlTWFwKSB7XG5cdFx0cmVmZXJlbmNlcy5yZWZlcmVuY2VNYXAgPSByZWZlcmVuY2VzLnJlZHVjZSgobWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+LCByZWZlcmVuY2UpID0+IHtcblx0XHRcdG1hcFtyZWZlcmVuY2UuYWxpYXNdID0gcmVmZXJlbmNlO1xuXHRcdFx0cmV0dXJuIG1hcDtcblx0XHR9LCB7fSk7XG5cdH1cblx0aWYgKCFhbGlhc2VkVmFsdWUpIHtcblx0XHRyZXR1cm4gYWxpYXNlZFZhbHVlO1xuXHR9XG5cdGNvbnN0IFthbGlhcywgLi4udmFsdWVdID0gYWxpYXNlZFZhbHVlLnNwbGl0KFwiLlwiKTtcblx0Y29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXBbYWxpYXNdO1xuXHRpZiAocmVmZXJlbmNlKSB7XG5cdFx0cmV0dXJuIGAke3JlZmVyZW5jZS5uYW1lc3BhY2V9LiR7dmFsdWUuam9pbihcIi5cIil9YDtcblx0fSBlbHNlIHtcblx0XHQvLyBUcnkgdG8gc2VlIGlmIGl0J3MgYW4gYW5ub3RhdGlvbiBQYXRoIGxpa2UgdG9fU2FsZXNPcmRlci9AVUkuTGluZUl0ZW1cblx0XHRpZiAoYWxpYXNlZFZhbHVlLmluZGV4T2YoXCJAXCIpICE9PSAtMSkge1xuXHRcdFx0Y29uc3QgW3ByZUFsaWFzLCAuLi5wb3N0QWxpYXNdID0gYWxpYXNlZFZhbHVlLnNwbGl0KFwiQFwiKTtcblx0XHRcdHJldHVybiBgJHtwcmVBbGlhc31AJHt1bmFsaWFzKHJlZmVyZW5jZXMsIHBvc3RBbGlhcy5qb2luKFwiQFwiKSl9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGFsaWFzZWRWYWx1ZTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRPYmplY3RNYXAocGFyc2VyT3V0cHV0OiBQYXJzZXJPdXRwdXQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcblx0Y29uc3Qgb2JqZWN0TWFwOiBhbnkgPSB7fTtcblx0aWYgKHBhcnNlck91dHB1dC5zY2hlbWEuZW50aXR5Q29udGFpbmVyICYmIHBhcnNlck91dHB1dC5zY2hlbWEuZW50aXR5Q29udGFpbmVyLmZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuXHRcdG9iamVjdE1hcFtwYXJzZXJPdXRwdXQuc2NoZW1hLmVudGl0eUNvbnRhaW5lci5mdWxseVF1YWxpZmllZE5hbWVdID0gcGFyc2VyT3V0cHV0LnNjaGVtYS5lbnRpdHlDb250YWluZXI7XG5cdH1cblx0cGFyc2VyT3V0cHV0LnNjaGVtYS5lbnRpdHlTZXRzLmZvckVhY2goZW50aXR5U2V0ID0+IHtcblx0XHRvYmplY3RNYXBbZW50aXR5U2V0LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBlbnRpdHlTZXQ7XG5cdH0pO1xuXHRwYXJzZXJPdXRwdXQuc2NoZW1hLmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuXHRcdG9iamVjdE1hcFthY3Rpb24uZnVsbHlRdWFsaWZpZWROYW1lXSA9IGFjdGlvbjtcblx0XHRpZiAoYWN0aW9uLmlzQm91bmQpIHtcblx0XHRcdGNvbnN0IHVuQm91bmRBY3Rpb25OYW1lID0gYWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIihcIilbMF07XG5cdFx0XHRpZiAoIW9iamVjdE1hcFt1bkJvdW5kQWN0aW9uTmFtZV0pIHtcblx0XHRcdFx0b2JqZWN0TWFwW3VuQm91bmRBY3Rpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRfdHlwZTogXCJVbmJvdW5kR2VuZXJpY0FjdGlvblwiLFxuXHRcdFx0XHRcdGFjdGlvbnM6IFtdXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRvYmplY3RNYXBbdW5Cb3VuZEFjdGlvbk5hbWVdLmFjdGlvbnMucHVzaChhY3Rpb24pO1xuXHRcdH1cblxuXHRcdGFjdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2gocGFyYW1ldGVyID0+IHtcblx0XHRcdG9iamVjdE1hcFtwYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHBhcmFtZXRlcjtcblx0XHR9KTtcblx0fSk7XG5cdHBhcnNlck91dHB1dC5zY2hlbWEuY29tcGxleFR5cGVzLmZvckVhY2goY29tcGxleFR5cGUgPT4ge1xuXHRcdG9iamVjdE1hcFtjb21wbGV4VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gY29tcGxleFR5cGU7XG5cdFx0Y29tcGxleFR5cGUucHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcblx0XHRcdG9iamVjdE1hcFtwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdID0gcHJvcGVydHk7XG5cdFx0fSk7XG5cdH0pO1xuXHRwYXJzZXJPdXRwdXQuc2NoZW1hLnR5cGVEZWZpbml0aW9ucy5mb3JFYWNoKHR5cGVEZWZpbml0aW9uID0+IHtcblx0XHRvYmplY3RNYXBbdHlwZURlZmluaXRpb24uZnVsbHlRdWFsaWZpZWROYW1lXSA9IHR5cGVEZWZpbml0aW9uO1xuXHR9KTtcblx0cGFyc2VyT3V0cHV0LnNjaGVtYS5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdG9iamVjdE1hcFtlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBlbnRpdHlUeXBlO1xuXHRcdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcblx0XHRcdG9iamVjdE1hcFtwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdID0gcHJvcGVydHk7XG5cdFx0XHRpZiAocHJvcGVydHkudHlwZS5pbmRleE9mKFwiRWRtXCIpICE9PSAwKSB7XG5cdFx0XHRcdC8vIEhhbmRsZSBjb21wbGV4IHR5cGVzXG5cdFx0XHRcdGNvbnN0IGNvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IG9iamVjdE1hcFtwcm9wZXJ0eS50eXBlXSBhcyBDb21wbGV4VHlwZSB8IFR5cGVEZWZpbml0aW9uO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0Y29tcGxleFR5cGVEZWZpbml0aW9uICYmXG5cdFx0XHRcdFx0Y29tcGxleFR5cGVEZWZpbml0aW9uLl90eXBlID09PSBcIkNvbXBsZXhUeXBlXCIgJiZcblx0XHRcdFx0XHRjb21wbGV4VHlwZURlZmluaXRpb24ucHJvcGVydGllc1xuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb21wbGV4VHlwZURlZmluaXRpb24ucHJvcGVydGllcy5mb3JFYWNoKGNvbXBsZXhUeXBlUHJvcCA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb21wbGV4VHlwZVByb3BUYXJnZXQ6IFBhcnNlclByb3BlcnR5ID0gT2JqZWN0LmFzc2lnbihjb21wbGV4VHlwZVByb3AsIHtcblx0XHRcdFx0XHRcdFx0X3R5cGU6IFwiUHJvcGVydHlcIixcblx0XHRcdFx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUgKyBcIi9cIiArIGNvbXBsZXhUeXBlUHJvcC5uYW1lXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9iamVjdE1hcFtjb21wbGV4VHlwZVByb3BUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IGNvbXBsZXhUeXBlUHJvcFRhcmdldDtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChuYXZQcm9wZXJ0eSA9PiB7XG5cdFx0XHRvYmplY3RNYXBbbmF2UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSA9IG5hdlByb3BlcnR5O1xuXHRcdH0pO1xuXHR9KTtcblxuXHRPYmplY3Qua2V5cyhwYXJzZXJPdXRwdXQuc2NoZW1hLmFubm90YXRpb25zKS5mb3JFYWNoKGFubm90YXRpb25Tb3VyY2UgPT4ge1xuXHRcdHBhcnNlck91dHB1dC5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaChhbm5vdGF0aW9uTGlzdCA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocGFyc2VyT3V0cHV0LnJlZmVyZW5jZXMsIGFubm90YXRpb25MaXN0LnRhcmdldCk7XG5cdFx0XHRhbm5vdGF0aW9uTGlzdC5hbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuXHRcdFx0XHRsZXQgYW5ub3RhdGlvbkZRTiA9IGAke2N1cnJlbnRUYXJnZXROYW1lfUAke3VuYWxpYXMocGFyc2VyT3V0cHV0LnJlZmVyZW5jZXMsIGFubm90YXRpb24udGVybSl9YDtcblx0XHRcdFx0aWYgKGFubm90YXRpb24ucXVhbGlmaWVyKSB7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbkZRTiArPSBgIyR7YW5ub3RhdGlvbi5xdWFsaWZpZXJ9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIGFubm90YXRpb24gIT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRkZWJ1Z2dlcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvYmplY3RNYXBbYW5ub3RhdGlvbkZRTl0gPSBhbm5vdGF0aW9uO1xuXHRcdFx0XHQoYW5ub3RhdGlvbiBhcyBBbm5vdGF0aW9uKS5mdWxseVF1YWxpZmllZE5hbWUgPSBhbm5vdGF0aW9uRlFOO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0pO1xuXHRyZXR1cm4gb2JqZWN0TWFwO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lUGF0aChjdXJyZW50VGFyZ2V0OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRUYXJnZXQgKyB1bmFsaWFzKGRlZmF1bHRSZWZlcmVuY2VzLCBwYXRoKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY3VycmVudFRhcmdldCArIFwiL1wiICsgcGF0aDtcblx0fVxufVxuXG5mdW5jdGlvbiBhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlKHBhdGg6IHN0cmluZywgb0Vycm9yTXNnOiBhbnkpIHtcblx0aWYgKCFBTExfQU5OT1RBVElPTl9FUlJPUlNbcGF0aF0pIHtcblx0XHRBTExfQU5OT1RBVElPTl9FUlJPUlNbcGF0aF0gPSBbb0Vycm9yTXNnXTtcblx0fSBlbHNlIHtcblx0XHRBTExfQU5OT1RBVElPTl9FUlJPUlNbcGF0aF0ucHVzaChvRXJyb3JNc2cpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoXG5cdG9iamVjdE1hcDogYW55LFxuXHRjdXJyZW50VGFyZ2V0OiBhbnksXG5cdHBhdGg6IHN0cmluZyxcblx0cGF0aE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcblx0aW5jbHVkZVZpc2l0ZWRPYmplY3RzOiBib29sZWFuID0gZmFsc2UsXG5cdGFubm90YXRpb25UeXBlPzogc3RyaW5nLFxuXHRhbm5vdGF0aW9uc1Rlcm0/OiBzdHJpbmdcbikge1xuXHRpZiAoIXBhdGgpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8vY29uc3QgcHJvcGVydHlQYXRoID0gcGF0aDtcblx0bGV0IGFWaXNpdGVkT2JqZWN0czogYW55W10gPSBbXTtcblx0aWYgKGN1cnJlbnRUYXJnZXQgJiYgY3VycmVudFRhcmdldC5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0Y3VycmVudFRhcmdldCA9IG9iamVjdE1hcFtjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIi9cIilbMF1dO1xuXHR9XG5cdHBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aCk7XG5cblx0Y29uc3QgcGF0aFNwbGl0ID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdGNvbnN0IHRhcmdldFBhdGhTcGxpdDogc3RyaW5nW10gPSBbXTtcblx0cGF0aFNwbGl0LmZvckVhY2gocGF0aFBhcnQgPT4ge1xuXHRcdC8vIFNlcGFyYXRlIG91dCB0aGUgYW5ub3RhdGlvblxuXHRcdGlmIChwYXRoUGFydC5pbmRleE9mKFwiQFwiKSAhPT0gLTEpIHtcblx0XHRcdGNvbnN0IFtwYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSBwYXRoUGFydC5zcGxpdChcIkBcIik7XG5cdFx0XHR0YXJnZXRQYXRoU3BsaXQucHVzaChwYXRoKTtcblx0XHRcdHRhcmdldFBhdGhTcGxpdC5wdXNoKGBAJHthbm5vdGF0aW9uUGF0aH1gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0UGF0aFNwbGl0LnB1c2gocGF0aFBhcnQpO1xuXHRcdH1cblx0fSk7XG5cdGxldCBjdXJyZW50UGF0aCA9IHBhdGg7XG5cdGxldCBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRUYXJnZXQ7XG5cdGNvbnN0IHRhcmdldCA9IHRhcmdldFBhdGhTcGxpdC5yZWR1Y2UoKGN1cnJlbnRWYWx1ZTogYW55LCBwYXRoUGFydCkgPT4ge1xuXHRcdGlmIChwYXRoUGFydCA9PT0gXCIkVHlwZVwiICYmIGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gXCJFbnRpdHlUeXBlXCIpIHtcblx0XHRcdHJldHVybiBjdXJyZW50VmFsdWU7XG5cdFx0fVxuXHRcdGlmIChwYXRoUGFydC5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIEVtcHR5IFBhdGggYWZ0ZXIgYW4gZW50aXR5U2V0IG1lYW5zIGVudGl0eVR5cGVcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLl90eXBlID09PSBcIkVudGl0eVNldFwiICYmIGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcblx0XHRcdFx0XHRhVmlzaXRlZE9iamVjdHMucHVzaChjdXJyZW50VmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgY3VycmVudFZhbHVlLnRhcmdldFR5cGUpIHtcblx0XHRcdFx0aWYgKGluY2x1ZGVWaXNpdGVkT2JqZWN0cykge1xuXHRcdFx0XHRcdGFWaXNpdGVkT2JqZWN0cy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRhcmdldFR5cGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudFZhbHVlO1xuXHRcdH1cblx0XHRpZiAoaW5jbHVkZVZpc2l0ZWRPYmplY3RzICYmIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJiBjdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YVZpc2l0ZWRPYmplY3RzLnB1c2goY3VycmVudFZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKCFjdXJyZW50VmFsdWUpIHtcblx0XHRcdGN1cnJlbnRQYXRoID0gcGF0aFBhcnQ7XG5cdFx0fSBlbHNlIGlmIChjdXJyZW50VmFsdWUuX3R5cGUgPT09IFwiRW50aXR5U2V0XCIgJiYgcGF0aFBhcnQgPT09IFwiJFR5cGVcIikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRhcmdldFR5cGU7XG5cdFx0XHRyZXR1cm4gY3VycmVudFZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSBcIkVudGl0eVNldFwiICYmIGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlKSB7XG5cdFx0XHRjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlTmFtZSwgcGF0aFBhcnQpO1xuXHRcdH0gZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmIGN1cnJlbnRWYWx1ZS50YXJnZXRUeXBlTmFtZSkge1xuXHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUudGFyZ2V0VHlwZU5hbWUsIHBhdGhQYXJ0KTtcblx0XHR9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBjdXJyZW50VmFsdWUudGFyZ2V0VHlwZSkge1xuXHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUudGFyZ2V0VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcblx0XHR9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0XHQvLyBDb21wbGV4VHlwZSBvciBQcm9wZXJ0eVxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZS50YXJnZXRUeXBlKSB7XG5cdFx0XHRcdGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLnRhcmdldFR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoUGFydCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gXCJBY3Rpb25cIiAmJiBjdXJyZW50VmFsdWUuaXNCb3VuZCkge1xuXHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoUGFydCk7XG5cdFx0XHRpZiAoIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcblx0XHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUuc291cmNlVHlwZSwgcGF0aFBhcnQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSBcIkFjdGlvblBhcmFtZXRlclwiICYmIGN1cnJlbnRWYWx1ZS5pc0VudGl0eVNldCkge1xuXHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUudHlwZSwgcGF0aFBhcnQpO1xuXHRcdH0gZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSBcIkFjdGlvblBhcmFtZXRlclwiICYmICFjdXJyZW50VmFsdWUuaXNFbnRpdHlTZXQpIHtcblx0XHRcdGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoXG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLnN1YnN0cigwLCBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZihcIi9cIikpLFxuXHRcdFx0XHRwYXRoUGFydFxuXHRcdFx0KTtcblx0XHRcdGlmICghb2JqZWN0TWFwW2N1cnJlbnRQYXRoXSkge1xuXHRcdFx0XHRsZXQgbGFzdElkeCA9IGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0aWYgKGxhc3RJZHggPT09IC0xKSB7XG5cdFx0XHRcdFx0bGFzdElkeCA9IGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLmxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKFxuXHRcdFx0XHRcdChvYmplY3RNYXBbY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUuc3Vic3RyKDAsIGxhc3RJZHgpXSBhcyBBY3Rpb24pLnNvdXJjZVR5cGUsXG5cdFx0XHRcdFx0cGF0aFBhcnRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoUGFydCk7XG5cdFx0XHRpZiAocGF0aFBhcnQgIT09IFwibmFtZVwiICYmIGN1cnJlbnRWYWx1ZVtwYXRoUGFydF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudFZhbHVlW3BhdGhQYXJ0XTtcblx0XHRcdH0gZWxzZSBpZiAocGF0aFBhcnQgPT09IFwiJEFubm90YXRpb25QYXRoXCIgJiYgY3VycmVudFZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudENvbnRleHQgPSBvYmplY3RNYXBbY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIkBcIilbMF1dO1xuXHRcdFx0XHRjb25zdCBzdWJUYXJnZXQ6IGFueSA9IHJlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjdXJyZW50Q29udGV4dCwgY3VycmVudFZhbHVlLnZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdHN1YlRhcmdldC52aXNpdGVkT2JqZWN0cy5mb3JFYWNoKCh2aXNpdGVkU3ViT2JqZWN0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRpZiAoYVZpc2l0ZWRPYmplY3RzLmluZGV4T2YodmlzaXRlZFN1Yk9iamVjdCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRhVmlzaXRlZE9iamVjdHMucHVzaCh2aXNpdGVkU3ViT2JqZWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gc3ViVGFyZ2V0LnRhcmdldDtcblx0XHRcdH0gZWxzZSBpZiAocGF0aFBhcnQgPT09IFwiJFBhdGhcIiAmJiBjdXJyZW50VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IGFWaXNpdGVkT2JqZWN0c1xuXHRcdFx0XHRcdC5jb25jYXQoKVxuXHRcdFx0XHRcdC5yZXZlcnNlKClcblx0XHRcdFx0XHQuZmluZChcblx0XHRcdFx0XHRcdG9iaiA9PlxuXHRcdFx0XHRcdFx0XHRvYmouX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiIHx8XG5cdFx0XHRcdFx0XHRcdG9iai5fdHlwZSA9PT0gXCJFbnRpdHlTZXRcIiB8fFxuXHRcdFx0XHRcdFx0XHRvYmouX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoY3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBzdWJUYXJnZXQ6IGFueSA9IHJlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjdXJyZW50Q29udGV4dCwgY3VycmVudFZhbHVlLnBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0XHRzdWJUYXJnZXQudmlzaXRlZE9iamVjdHMuZm9yRWFjaCgodmlzaXRlZFN1Yk9iamVjdDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoYVZpc2l0ZWRPYmplY3RzLmluZGV4T2YodmlzaXRlZFN1Yk9iamVjdCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGFWaXNpdGVkT2JqZWN0cy5wdXNoKHZpc2l0ZWRTdWJPYmplY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBzdWJUYXJnZXQudGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50VmFsdWUuJHRhcmdldDtcblx0XHRcdH0gZWxzZSBpZiAocGF0aFBhcnQuc3RhcnRzV2l0aChcIiRQYXRoXCIpICYmIGN1cnJlbnRWYWx1ZS4kdGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IGludGVybWVkaWF0ZVRhcmdldCA9IGN1cnJlbnRWYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGludGVybWVkaWF0ZVRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0LnN1YnN0cig1KSk7XG5cdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmICFvYmplY3RNYXBbY3VycmVudFBhdGhdKSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgbm93IGFuIGFubm90YXRpb24gdmFsdWVcblx0XHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IG9iamVjdE1hcFtjdXJyZW50VmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiQFwiKVswXV07XG5cdFx0XHRcdGlmIChlbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0Y3VycmVudFBhdGggPSBjb21iaW5lUGF0aChlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvYmplY3RNYXBbY3VycmVudFBhdGhdO1xuXHR9LCBudWxsKTtcblx0aWYgKCF0YXJnZXQpIHtcblx0XHRpZiAoYW5ub3RhdGlvbnNUZXJtICYmIGFubm90YXRpb25UeXBlKSB7XG5cdFx0XHR2YXIgb0Vycm9yTXNnID0ge1xuXHRcdFx0XHRtZXNzYWdlOlxuXHRcdFx0XHRcdFwiVW5hYmxlIHRvIHJlc29sdmUgdGhlIHBhdGggZXhwcmVzc2lvbjogXCIgK1xuXHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdHBhdGggK1xuXHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdFwiSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcblwiICtcblx0XHRcdFx0XHRcIjxBbm5vdGF0aW9uIFRlcm0gPSBcIiArXG5cdFx0XHRcdFx0YW5ub3RhdGlvbnNUZXJtICtcblx0XHRcdFx0XHRcIj5cIiArXG5cdFx0XHRcdFx0XCJcXG5cIiArXG5cdFx0XHRcdFx0XCI8UmVjb3JkIFR5cGUgPSBcIiArXG5cdFx0XHRcdFx0YW5ub3RhdGlvblR5cGUgK1xuXHRcdFx0XHRcdFwiPlwiICtcblx0XHRcdFx0XHRcIlxcblwiICtcblx0XHRcdFx0XHRcIjxBbm5vdGF0aW9uUGF0aCA9IFwiICtcblx0XHRcdFx0XHRwYXRoICtcblx0XHRcdFx0XHRcIj5cIlxuXHRcdFx0fTtcblx0XHRcdGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UocGF0aCwgb0Vycm9yTXNnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG9FcnJvck1zZyA9IHtcblx0XHRcdFx0bWVzc2FnZTpcblx0XHRcdFx0XHRcIlVuYWJsZSB0byByZXNvbHZlIHRoZSBwYXRoIGV4cHJlc3Npb246IFwiICtcblx0XHRcdFx0XHRwYXRoICtcblx0XHRcdFx0XHRcIlxcblwiICtcblx0XHRcdFx0XHRcIlxcblwiICtcblx0XHRcdFx0XHRcIkhpbnQ6IENoZWNrIGFuZCBjb3JyZWN0IHRoZSBwYXRoIHZhbHVlcyB1bmRlciB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgbWV0YWRhdGEgKGFubm90YXRpb24ueG1sIGZpbGUgb3IgQ0RTIGFubm90YXRpb25zIGZvciB0aGUgYXBwbGljYXRpb24pOiBcXG5cXG5cIiArXG5cdFx0XHRcdFx0XCI8QW5ub3RhdGlvbiBUZXJtID0gXCIgK1xuXHRcdFx0XHRcdHBhdGhTcGxpdFswXSArXG5cdFx0XHRcdFx0XCI+XCIgK1xuXHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdFwiPFByb3BlcnR5VmFsdWUgIFBhdGg9IFwiICtcblx0XHRcdFx0XHRwYXRoU3BsaXRbMV0gK1xuXHRcdFx0XHRcdFwiPlwiXG5cdFx0XHR9O1xuXHRcdFx0YWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoLCBvRXJyb3JNc2cpO1xuXHRcdH1cblx0XHQvLyBjb25zb2xlLmxvZyhcIk1pc3NpbmcgdGFyZ2V0IFwiICsgcGF0aCk7XG5cdH1cblx0aWYgKHBhdGhPbmx5KSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRQYXRoO1xuXHR9XG5cdGlmIChpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dmlzaXRlZE9iamVjdHM6IGFWaXNpdGVkT2JqZWN0cyxcblx0XHRcdHRhcmdldDogdGFyZ2V0XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBpc0Fubm90YXRpb25QYXRoKHBhdGhTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcGF0aFN0ci5pbmRleE9mKFwiQFwiKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoXG5cdHByb3BlcnR5VmFsdWU6IEV4cHJlc3Npb24sXG5cdHZhbHVlRlFOOiBzdHJpbmcsXG5cdHBhcnNlck91dHB1dDogUGFyc2VyT3V0cHV0LFxuXHRjdXJyZW50VGFyZ2V0OiBhbnksXG5cdG9iamVjdE1hcDogYW55LFxuXHR0b1Jlc29sdmU6IFJlc29sdmVhYmxlW10sXG5cdGFubm90YXRpb25Tb3VyY2U6IHN0cmluZyxcblx0dW5yZXNvbHZlZEFubm90YXRpb25zOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRhbm5vdGF0aW9uVHlwZTogc3RyaW5nLFxuXHRhbm5vdGF0aW9uc1Rlcm06IHN0cmluZ1xuKSB7XG5cdGlmIChwcm9wZXJ0eVZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHN3aXRjaCAocHJvcGVydHlWYWx1ZS50eXBlKSB7XG5cdFx0Y2FzZSBcIlN0cmluZ1wiOlxuXHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWUuU3RyaW5nO1xuXHRcdGNhc2UgXCJJbnRcIjpcblx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlLkludDtcblx0XHRjYXNlIFwiQm9vbFwiOlxuXHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWUuQm9vbDtcblx0XHRjYXNlIFwiRGVjaW1hbFwiOlxuXHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWUuRGVjaW1hbDtcblx0XHRjYXNlIFwiRGF0ZVwiOlxuXHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWUuRGF0ZTtcblx0XHRjYXNlIFwiRW51bU1lbWJlclwiOlxuXHRcdFx0cmV0dXJuIGFsaWFzKHBhcnNlck91dHB1dC5yZWZlcmVuY2VzLCBwcm9wZXJ0eVZhbHVlLkVudW1NZW1iZXIpO1xuXHRcdGNhc2UgXCJQcm9wZXJ0eVBhdGhcIjpcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFwiUHJvcGVydHlQYXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLlByb3BlcnR5UGF0aCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiB2YWx1ZUZRTixcblx0XHRcdFx0JHRhcmdldDogcmVzb2x2ZVRhcmdldChcblx0XHRcdFx0XHRvYmplY3RNYXAsXG5cdFx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlLlByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uVHlwZSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uc1Rlcm1cblx0XHRcdFx0KVxuXHRcdFx0fTtcblx0XHRjYXNlIFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiOlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG5cdFx0XHRcdCR0YXJnZXQ6IHJlc29sdmVUYXJnZXQoXG5cdFx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQsXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGFubm90YXRpb25UeXBlLFxuXHRcdFx0XHRcdGFubm90YXRpb25zVGVybVxuXHRcdFx0XHQpXG5cdFx0XHR9O1xuXHRcdGNhc2UgXCJBbm5vdGF0aW9uUGF0aFwiOlxuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG5cdFx0XHRcdG9iamVjdE1hcCxcblx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0dW5hbGlhcyhwYXJzZXJPdXRwdXQucmVmZXJlbmNlcywgcHJvcGVydHlWYWx1ZS5Bbm5vdGF0aW9uUGF0aCkgYXMgc3RyaW5nLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdGFubm90YXRpb25zVGVybVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IGFubm90YXRpb25QYXRoID0ge1xuXHRcdFx0XHR0eXBlOiBcIkFubm90YXRpb25QYXRoXCIsXG5cdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHZhbHVlRlFOLFxuXHRcdFx0XHQkdGFyZ2V0OiBhbm5vdGF0aW9uVGFyZ2V0LFxuXHRcdFx0XHRhbm5vdGF0aW9uVHlwZTogYW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdGFubm90YXRpb25zVGVybTogYW5ub3RhdGlvbnNUZXJtLFxuXHRcdFx0XHR0ZXJtOiBcIlwiLFxuXHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHR9O1xuXHRcdFx0dG9SZXNvbHZlLnB1c2goeyBpbmxpbmU6IGZhbHNlLCB0b1Jlc29sdmU6IGFubm90YXRpb25QYXRoIH0pO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25QYXRoO1xuXHRcdGNhc2UgXCJQYXRoXCI6XG5cdFx0XHRjb25zdCAkdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChcblx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LFxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlLlBhdGgsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhbm5vdGF0aW9uVHlwZSxcblx0XHRcdFx0YW5ub3RhdGlvbnNUZXJtXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcGF0aCA9IG5ldyBQYXRoKHByb3BlcnR5VmFsdWUsICR0YXJnZXQsIGFubm90YXRpb25zVGVybSwgYW5ub3RhdGlvblR5cGUsIFwiXCIpO1xuXHRcdFx0dG9SZXNvbHZlLnB1c2goe1xuXHRcdFx0XHRpbmxpbmU6IGlzQW5ub3RhdGlvblBhdGgocHJvcGVydHlWYWx1ZS5QYXRoKSxcblx0XHRcdFx0dG9SZXNvbHZlOiBwYXRoXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBwYXRoO1xuXG5cdFx0Y2FzZSBcIlJlY29yZFwiOlxuXHRcdFx0cmV0dXJuIHBhcnNlUmVjb3JkKFxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlLlJlY29yZCxcblx0XHRcdFx0dmFsdWVGUU4sXG5cdFx0XHRcdHBhcnNlck91dHB1dCxcblx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHR0b1Jlc29sdmUsXG5cdFx0XHRcdGFubm90YXRpb25Tb3VyY2UsXG5cdFx0XHRcdHVucmVzb2x2ZWRBbm5vdGF0aW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdGFubm90YXRpb25zVGVybVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiQ29sbGVjdGlvblwiOlxuXHRcdFx0cmV0dXJuIHBhcnNlQ29sbGVjdGlvbihcblx0XHRcdFx0cHJvcGVydHlWYWx1ZS5Db2xsZWN0aW9uLFxuXHRcdFx0XHR2YWx1ZUZRTixcblx0XHRcdFx0cGFyc2VyT3V0cHV0LFxuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LFxuXHRcdFx0XHRvYmplY3RNYXAsXG5cdFx0XHRcdHRvUmVzb2x2ZSxcblx0XHRcdFx0YW5ub3RhdGlvblNvdXJjZSxcblx0XHRcdFx0dW5yZXNvbHZlZEFubm90YXRpb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uVHlwZSxcblx0XHRcdFx0YW5ub3RhdGlvbnNUZXJtXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJBcHBseVwiOlxuXHRcdGNhc2UgXCJOdWxsXCI6XG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdGNhc2UgXCJFcVwiOlxuXHRcdGNhc2UgXCJOZVwiOlxuXHRcdGNhc2UgXCJHdFwiOlxuXHRcdGNhc2UgXCJHZVwiOlxuXHRcdGNhc2UgXCJMdFwiOlxuXHRcdGNhc2UgXCJMZVwiOlxuXHRcdGNhc2UgXCJJZlwiOlxuXHRcdGNhc2UgXCJBbmRcIjpcblx0XHRjYXNlIFwiT3JcIjpcblx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGluZmVyVHlwZUZyb21UZXJtKGFubm90YXRpb25zVGVybTogc3RyaW5nLCBwYXJzZXJPdXRwdXQ6IFBhcnNlck91dHB1dCwgYW5ub3RhdGlvblRhcmdldDogc3RyaW5nKSB7XG5cdGNvbnN0IHRhcmdldFR5cGUgPSAoVGVybVRvVHlwZXMgYXMgYW55KVthbm5vdGF0aW9uc1Rlcm1dO1xuXHR2YXIgb0Vycm9yTXNnID0ge1xuXHRcdGlzRXJyb3I6IGZhbHNlLFxuXHRcdG1lc3NhZ2U6IGBUaGUgdHlwZSBvZiB0aGUgcmVjb3JkIHVzZWQgd2l0aGluIHRoZSB0ZXJtICR7YW5ub3RhdGlvbnNUZXJtfSB3YXMgbm90IGRlZmluZWQgYW5kIHdhcyBpbmZlcnJlZCBhcyAke3RhcmdldFR5cGV9LlxuSGludDogSWYgcG9zc2libGUsIHRyeSB0byBtYWludGFpbiB0aGUgVHlwZSBwcm9wZXJ0eSBmb3IgZWFjaCBSZWNvcmQuXG48QW5ub3RhdGlvbnMgVGFyZ2V0PVwiJHthbm5vdGF0aW9uVGFyZ2V0fVwiPlxuXHQ8QW5ub3RhdGlvbiBUZXJtPVwiJHthbm5vdGF0aW9uc1Rlcm19XCI+XG5cdFx0PFJlY29yZD4uLi48L1JlY29yZD5cblx0PC9Bbm5vdGF0aW9uPlxuPC9Bbm5vdGF0aW9ucz5gXG5cdH07XG5cdGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UoYW5ub3RhdGlvblRhcmdldCArIFwiL1wiICsgYW5ub3RhdGlvbnNUZXJtLCBvRXJyb3JNc2cpO1xuXHRyZXR1cm4gdGFyZ2V0VHlwZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoXG5cdHJlY29yZERlZmluaXRpb246IEFubm90YXRpb25SZWNvcmQsXG5cdGN1cnJlbnRGUU46IHN0cmluZyxcblx0cGFyc2VyT3V0cHV0OiBQYXJzZXJPdXRwdXQsXG5cdGN1cnJlbnRUYXJnZXQ6IGFueSxcblx0b2JqZWN0TWFwOiBhbnksXG5cdHRvUmVzb2x2ZTogUmVzb2x2ZWFibGVbXSxcblx0YW5ub3RhdGlvblNvdXJjZTogc3RyaW5nLFxuXHR1bnJlc29sdmVkQW5ub3RhdGlvbnM6IEFubm90YXRpb25MaXN0W10sXG5cdGFubm90YXRpb25UeXBlOiBzdHJpbmcsXG5cdGFubm90YXRpb25zVGVybTogc3RyaW5nXG4pIHtcblx0bGV0IHRhcmdldFR5cGU7XG5cdGlmICghcmVjb3JkRGVmaW5pdGlvbi50eXBlICYmIGFubm90YXRpb25zVGVybSkge1xuXHRcdHRhcmdldFR5cGUgPSBpbmZlclR5cGVGcm9tVGVybShhbm5vdGF0aW9uc1Rlcm0sIHBhcnNlck91dHB1dCwgY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldFR5cGUgPSB1bmFsaWFzKHBhcnNlck91dHB1dC5yZWZlcmVuY2VzLCByZWNvcmREZWZpbml0aW9uLnR5cGUpO1xuXHR9XG5cdGNvbnN0IGFubm90YXRpb25UZXJtOiBhbnkgPSB7XG5cdFx0JFR5cGU6IHRhcmdldFR5cGUsXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBjdXJyZW50RlFOXG5cdH07XG5cdGNvbnN0IGFubm90YXRpb25Db250ZW50OiBhbnkgPSB7fTtcblx0aWYgKHJlY29yZERlZmluaXRpb24uYW5ub3RhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShyZWNvcmREZWZpbml0aW9uLmFubm90YXRpb25zKSkge1xuXHRcdGNvbnN0IHN1YkFubm90YXRpb25MaXN0ID0ge1xuXHRcdFx0dGFyZ2V0OiBjdXJyZW50RlFOLFxuXHRcdFx0YW5ub3RhdGlvbnM6IHJlY29yZERlZmluaXRpb24uYW5ub3RhdGlvbnMsXG5cdFx0XHRfX3NvdXJjZTogYW5ub3RhdGlvblNvdXJjZVxuXHRcdH07XG5cdFx0dW5yZXNvbHZlZEFubm90YXRpb25zLnB1c2goc3ViQW5ub3RhdGlvbkxpc3QpO1xuXHR9XG5cdGlmIChyZWNvcmREZWZpbml0aW9uLnByb3BlcnR5VmFsdWVzKSB7XG5cdFx0cmVjb3JkRGVmaW5pdGlvbi5wcm9wZXJ0eVZhbHVlcy5mb3JFYWNoKChwcm9wZXJ0eVZhbHVlOiBQcm9wZXJ0eVZhbHVlKSA9PiB7XG5cdFx0XHRhbm5vdGF0aW9uQ29udGVudFtwcm9wZXJ0eVZhbHVlLm5hbWVdID0gcGFyc2VWYWx1ZShcblx0XHRcdFx0cHJvcGVydHlWYWx1ZS52YWx1ZSxcblx0XHRcdFx0YCR7Y3VycmVudEZRTn0vJHtwcm9wZXJ0eVZhbHVlLm5hbWV9YCxcblx0XHRcdFx0cGFyc2VyT3V0cHV0LFxuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LFxuXHRcdFx0XHRvYmplY3RNYXAsXG5cdFx0XHRcdHRvUmVzb2x2ZSxcblx0XHRcdFx0YW5ub3RhdGlvblNvdXJjZSxcblx0XHRcdFx0dW5yZXNvbHZlZEFubm90YXRpb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uVHlwZSxcblx0XHRcdFx0YW5ub3RhdGlvbnNUZXJtXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zKSkge1xuXHRcdFx0XHRjb25zdCBzdWJBbm5vdGF0aW9uTGlzdCA9IHtcblx0XHRcdFx0XHR0YXJnZXQ6IGAke2N1cnJlbnRGUU59LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWAsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbnM6IHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnMsXG5cdFx0XHRcdFx0X19zb3VyY2U6IGFubm90YXRpb25Tb3VyY2Vcblx0XHRcdFx0fTtcblx0XHRcdFx0dW5yZXNvbHZlZEFubm90YXRpb25zLnB1c2goc3ViQW5ub3RhdGlvbkxpc3QpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhbm5vdGF0aW9uQ29udGVudC5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKSAmJlxuXHRcdFx0XHQoYW5ub3RhdGlvblRlcm0uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCIgfHxcblx0XHRcdFx0XHRhbm5vdGF0aW9uVGVybS4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRXaXRoQWN0aW9uXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0ID1cblx0XHRcdFx0XHQoY3VycmVudFRhcmdldC5hY3Rpb25zICYmIGN1cnJlbnRUYXJnZXQuYWN0aW9uc1thbm5vdGF0aW9uQ29udGVudC5BY3Rpb25dKSB8fFxuXHRcdFx0XHRcdG9iamVjdE1hcFthbm5vdGF0aW9uQ29udGVudC5BY3Rpb25dO1xuXHRcdFx0XHRpZiAoIWFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCkge1xuXHRcdFx0XHRcdC8vIEFkZCB0byBkaWFnbm9zdGljcyBkZWJ1Z2dlcjtcblx0XHRcdFx0XHRBTk5PVEFUSU9OX0VSUk9SUy5wdXNoKHtcblx0XHRcdFx0XHRcdG1lc3NhZ2U6XG5cdFx0XHRcdFx0XHRcdFwiVW5hYmxlIHRvIHJlc29sdmUgdGhlIGFjdGlvbiBcIiArXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25Db250ZW50LkFjdGlvbiArXG5cdFx0XHRcdFx0XHRcdFwiIGRlZmluZWQgZm9yIFwiICtcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblRlcm0uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihhbm5vdGF0aW9uVGVybSwgYW5ub3RhdGlvbkNvbnRlbnQpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uVHlwZSA9XG5cdHwgXCJQcm9wZXJ0eVBhdGhcIlxuXHR8IFwiUGF0aFwiXG5cdHwgXCJJZlwiXG5cdHwgXCJBcHBseVwiXG5cdHwgXCJOdWxsXCJcblx0fCBcIkFuZFwiXG5cdHwgXCJFcVwiXG5cdHwgXCJOZVwiXG5cdHwgXCJOb3RcIlxuXHR8IFwiR3RcIlxuXHR8IFwiR2VcIlxuXHR8IFwiTHRcIlxuXHR8IFwiTGVcIlxuXHR8IFwiT3JcIlxuXHR8IFwiQW5ub3RhdGlvblBhdGhcIlxuXHR8IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiXG5cdHwgXCJSZWNvcmRcIlxuXHR8IFwiU3RyaW5nXCJcblx0fCBcIkVtcHR5Q29sbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBnZXRPckluZmVyQ29sbGVjdGlvblR5cGUoY29sbGVjdGlvbkRlZmluaXRpb246IGFueVtdKTogQ29sbGVjdGlvblR5cGUge1xuXHRsZXQgdHlwZTogQ29sbGVjdGlvblR5cGUgPSAoY29sbGVjdGlvbkRlZmluaXRpb24gYXMgYW55KS50eXBlO1xuXHRpZiAodHlwZSA9PT0gdW5kZWZpbmVkICYmIGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBmaXJzdENvbEl0ZW0gPSBjb2xsZWN0aW9uRGVmaW5pdGlvblswXTtcblx0XHRpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KFwiUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHR0eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHR9IGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eShcIlBhdGhcIikpIHtcblx0XHRcdHR5cGUgPSBcIlBhdGhcIjtcblx0XHR9IGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eShcIkFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHR0eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdH0gZWxzZSBpZiAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0dHlwZSA9IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHR0eXBlb2YgZmlyc3RDb2xJdGVtID09PSBcIm9iamVjdFwiICYmXG5cdFx0XHQoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KFwidHlwZVwiKSB8fCBmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoXCJwcm9wZXJ0eVZhbHVlc1wiKSlcblx0XHQpIHtcblx0XHRcdHR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0Q29sSXRlbSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0dHlwZSA9IFwiU3RyaW5nXCI7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHR5cGUgPSBcIkVtcHR5Q29sbGVjdGlvblwiO1xuXHR9XG5cdHJldHVybiB0eXBlO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvbGxlY3Rpb24oXG5cdGNvbGxlY3Rpb25EZWZpbml0aW9uOiBhbnlbXSxcblx0cGFyZW50RlFOOiBzdHJpbmcsXG5cdHBhcnNlck91dHB1dDogUGFyc2VyT3V0cHV0LFxuXHRjdXJyZW50VGFyZ2V0OiBhbnksXG5cdG9iamVjdE1hcDogYW55LFxuXHR0b1Jlc29sdmU6IFJlc29sdmVhYmxlW10sXG5cdGFubm90YXRpb25Tb3VyY2U6IHN0cmluZyxcblx0dW5yZXNvbHZlZEFubm90YXRpb25zOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRhbm5vdGF0aW9uVHlwZTogc3RyaW5nLFxuXHRhbm5vdGF0aW9uc1Rlcm06IHN0cmluZ1xuKSB7XG5cdGNvbnN0IGNvbGxlY3Rpb25EZWZpbml0aW9uVHlwZSA9IGdldE9ySW5mZXJDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uRGVmaW5pdGlvbik7XG5cdHN3aXRjaCAoY29sbGVjdGlvbkRlZmluaXRpb25UeXBlKSB7XG5cdFx0Y2FzZSBcIlByb3BlcnR5UGF0aFwiOlxuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocHJvcGVydHlQYXRoLCBwcm9wZXJ0eUlkeCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHR5cGU6IFwiUHJvcGVydHlQYXRoXCIsXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7cHJvcGVydHlJZHh9YCxcblx0XHRcdFx0XHQkdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KFxuXHRcdFx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uc1Rlcm1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRjYXNlIFwiUGF0aFwiOlxuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcChwYXRoVmFsdWUgPT4ge1xuXHRcdFx0XHRjb25zdCAkdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChcblx0XHRcdFx0XHRvYmplY3RNYXAsXG5cdFx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0XHRwYXRoVmFsdWUuUGF0aCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGFubm90YXRpb25UeXBlLFxuXHRcdFx0XHRcdGFubm90YXRpb25zVGVybVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBwYXRoID0gbmV3IFBhdGgocGF0aFZhbHVlLCAkdGFyZ2V0LCBhbm5vdGF0aW9uc1Rlcm0sIGFubm90YXRpb25UeXBlLCBcIlwiKTtcblx0XHRcdFx0dG9SZXNvbHZlLnB1c2goe1xuXHRcdFx0XHRcdGlubGluZTogaXNBbm5vdGF0aW9uUGF0aChwYXRoVmFsdWUuUGF0aCksXG5cdFx0XHRcdFx0dG9SZXNvbHZlOiBwYXRoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gcGF0aDtcblx0XHRcdH0pO1xuXHRcdGNhc2UgXCJBbm5vdGF0aW9uUGF0aFwiOlxuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoYW5ub3RhdGlvblBhdGgsIGFubm90YXRpb25JZHgpID0+IHtcblx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvblRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG5cdFx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQsXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uVHlwZSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uc1Rlcm1cblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbGxlY3Rpb25FbGVtZW50ID0ge1xuXHRcdFx0XHRcdHR5cGU6IFwiQW5ub3RhdGlvblBhdGhcIixcblx0XHRcdFx0XHR2YWx1ZTogYW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7YW5ub3RhdGlvbklkeH1gLFxuXHRcdFx0XHRcdCR0YXJnZXQ6IGFubm90YXRpb25UYXJnZXQsXG5cdFx0XHRcdFx0YW5ub3RhdGlvblR5cGU6IGFubm90YXRpb25UeXBlLFxuXHRcdFx0XHRcdGFubm90YXRpb25zVGVybTogYW5ub3RhdGlvbnNUZXJtLFxuXHRcdFx0XHRcdHRlcm06IFwiXCIsXG5cdFx0XHRcdFx0cGF0aDogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0XHR0b1Jlc29sdmUucHVzaCh7XG5cdFx0XHRcdFx0aW5saW5lOiBmYWxzZSxcblx0XHRcdFx0XHR0b1Jlc29sdmU6IGFubm90YXRpb25Db2xsZWN0aW9uRWxlbWVudFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2xsZWN0aW9uRWxlbWVudDtcblx0XHRcdH0pO1xuXHRcdGNhc2UgXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChuYXZQcm9wZXJ0eVBhdGgsIG5hdlByb3BJZHgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIixcblx0XHRcdFx0XHR2YWx1ZTogbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7bmF2UHJvcElkeH1gLFxuXHRcdFx0XHRcdCR0YXJnZXQ6IHJlc29sdmVUYXJnZXQoXG5cdFx0XHRcdFx0XHRvYmplY3RNYXAsXG5cdFx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0LFxuXHRcdFx0XHRcdFx0bmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uc1Rlcm1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRjYXNlIFwiUmVjb3JkXCI6XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChyZWNvcmREZWZpbml0aW9uLCByZWNvcmRJZHgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlUmVjb3JkKFxuXHRcdFx0XHRcdHJlY29yZERlZmluaXRpb24sXG5cdFx0XHRcdFx0YCR7cGFyZW50RlFOfS8ke3JlY29yZElkeH1gLFxuXHRcdFx0XHRcdHBhcnNlck91dHB1dCxcblx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0LFxuXHRcdFx0XHRcdG9iamVjdE1hcCxcblx0XHRcdFx0XHR0b1Jlc29sdmUsXG5cdFx0XHRcdFx0YW5ub3RhdGlvblNvdXJjZSxcblx0XHRcdFx0XHR1bnJlc29sdmVkQW5ub3RhdGlvbnMsXG5cdFx0XHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbnNUZXJtXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHRjYXNlIFwiQXBwbHlcIjpcblx0XHRjYXNlIFwiTnVsbFwiOlxuXHRcdGNhc2UgXCJJZlwiOlxuXHRcdGNhc2UgXCJFcVwiOlxuXHRcdGNhc2UgXCJOZVwiOlxuXHRcdGNhc2UgXCJMdFwiOlxuXHRcdGNhc2UgXCJHdFwiOlxuXHRcdGNhc2UgXCJMZVwiOlxuXHRcdGNhc2UgXCJHZVwiOlxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRjYXNlIFwiQW5kXCI6XG5cdFx0Y2FzZSBcIk9yXCI6XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKGlmVmFsdWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gaWZWYWx1ZTtcblx0XHRcdH0pO1xuXHRcdGNhc2UgXCJTdHJpbmdcIjpcblx0XHRcdHJldHVybiBjb2xsZWN0aW9uRGVmaW5pdGlvbi5tYXAoc3RyaW5nVmFsdWUgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIHN0cmluZ1ZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0cmluZ1ZhbHVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN0cmluZ1ZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RyaW5nVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0cmluZ1ZhbHVlLlN0cmluZztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlmIChjb2xsZWN0aW9uRGVmaW5pdGlvbi5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgY2FzZVwiKTtcblx0fVxufVxuXG50eXBlIFJlc29sdmVhYmxlID0ge1xuXHRpbmxpbmU6IGJvb2xlYW47XG5cdHRvUmVzb2x2ZToge1xuXHRcdCR0YXJnZXQ6IHN0cmluZztcblx0XHR0YXJnZXRTdHJpbmc/OiBzdHJpbmc7XG5cdFx0YW5ub3RhdGlvbnNUZXJtOiBzdHJpbmc7XG5cdFx0YW5ub3RhdGlvblR5cGU6IHN0cmluZztcblx0XHR0ZXJtOiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHR9O1xufTtcblxuZnVuY3Rpb24gY29udmVydEFubm90YXRpb24oXG5cdGFubm90YXRpb246IEFubm90YXRpb24sXG5cdHBhcnNlck91dHB1dDogUGFyc2VyT3V0cHV0LFxuXHRjdXJyZW50VGFyZ2V0OiBhbnksXG5cdG9iamVjdE1hcDogYW55LFxuXHR0b1Jlc29sdmU6IFJlc29sdmVhYmxlW10sXG5cdGFubm90YXRpb25Tb3VyY2U6IHN0cmluZyxcblx0dW5yZXNvbHZlZEFubm90YXRpb25zOiBBbm5vdGF0aW9uTGlzdFtdXG4pOiBhbnkge1xuXHRpZiAoYW5ub3RhdGlvbi5yZWNvcmQpIHtcblx0XHRjb25zdCBhbm5vdGF0aW9uVHlwZSA9IGFubm90YXRpb24ucmVjb3JkLnR5cGVcblx0XHRcdD8gdW5hbGlhcyhwYXJzZXJPdXRwdXQucmVmZXJlbmNlcywgYW5ub3RhdGlvbi5yZWNvcmQudHlwZSlcblx0XHRcdDogaW5mZXJUeXBlRnJvbVRlcm0oYW5ub3RhdGlvbi50ZXJtLCBwYXJzZXJPdXRwdXQsIGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRjb25zdCBhbm5vdGF0aW9uVGVybTogYW55ID0ge1xuXHRcdFx0JFR5cGU6IGFubm90YXRpb25UeXBlLFxuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdHF1YWxpZmllcjogYW5ub3RhdGlvbi5xdWFsaWZpZXJcblx0XHR9O1xuXHRcdGNvbnN0IGFubm90YXRpb25Db250ZW50OiBhbnkgPSB7fTtcblx0XHRhbm5vdGF0aW9uLnJlY29yZC5wcm9wZXJ0eVZhbHVlcy5mb3JFYWNoKChwcm9wZXJ0eVZhbHVlOiBQcm9wZXJ0eVZhbHVlKSA9PiB7XG5cdFx0XHRhbm5vdGF0aW9uQ29udGVudFtwcm9wZXJ0eVZhbHVlLm5hbWVdID0gcGFyc2VWYWx1ZShcblx0XHRcdFx0cHJvcGVydHlWYWx1ZS52YWx1ZSxcblx0XHRcdFx0YCR7YW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWV9LyR7cHJvcGVydHlWYWx1ZS5uYW1lfWAsXG5cdFx0XHRcdHBhcnNlck91dHB1dCxcblx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHR0b1Jlc29sdmUsXG5cdFx0XHRcdGFubm90YXRpb25Tb3VyY2UsXG5cdFx0XHRcdHVucmVzb2x2ZWRBbm5vdGF0aW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRcdGFubm90YXRpb24udGVybVxuXHRcdFx0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0YW5ub3RhdGlvbkNvbnRlbnQuaGFzT3duUHJvcGVydHkoXCJBY3Rpb25cIikgJiZcblx0XHRcdFx0KCFhbm5vdGF0aW9uLnJlY29yZCB8fFxuXHRcdFx0XHRcdGFubm90YXRpb25UZXJtLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiIHx8XG5cdFx0XHRcdFx0YW5ub3RhdGlvblRlcm0uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aEFjdGlvblwiKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCA9XG5cdFx0XHRcdFx0KGN1cnJlbnRUYXJnZXQuYWN0aW9ucyAmJiBjdXJyZW50VGFyZ2V0LmFjdGlvbnNbYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uXSkgfHxcblx0XHRcdFx0XHRvYmplY3RNYXBbYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uXTtcblx0XHRcdFx0aWYgKCFhbm5vdGF0aW9uQ29udGVudC5BY3Rpb25UYXJnZXQpIHtcblx0XHRcdFx0XHRBTk5PVEFUSU9OX0VSUk9SUy5wdXNoKHtcblx0XHRcdFx0XHRcdG1lc3NhZ2U6XG5cdFx0XHRcdFx0XHRcdFwiVW5hYmxlIHRvIHJlc29sdmUgdGhlIGFjdGlvbiBcIiArXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25Db250ZW50LkFjdGlvbiArXG5cdFx0XHRcdFx0XHRcdFwiIGRlZmluZWQgZm9yIFwiICtcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQvLyBBZGQgdG8gZGlhZ25vc3RpY3Ncblx0XHRcdFx0XHQvLyBkZWJ1Z2dlcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKGFubm90YXRpb25UZXJtLCBhbm5vdGF0aW9uQ29udGVudCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbi5jb2xsZWN0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoYW5ub3RhdGlvbi52YWx1ZSkge1xuXHRcdFx0cmV0dXJuIHBhcnNlVmFsdWUoXG5cdFx0XHRcdGFubm90YXRpb24udmFsdWUsXG5cdFx0XHRcdGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRwYXJzZXJPdXRwdXQsXG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQsXG5cdFx0XHRcdG9iamVjdE1hcCxcblx0XHRcdFx0dG9SZXNvbHZlLFxuXHRcdFx0XHRhbm5vdGF0aW9uU291cmNlLFxuXHRcdFx0XHR1bnJlc29sdmVkQW5ub3RhdGlvbnMsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRcdGFubm90YXRpb24udGVybVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGFubm90YXRpb24uY29sbGVjdGlvbikge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb246IGFueSA9IHBhcnNlQ29sbGVjdGlvbihcblx0XHRcdGFubm90YXRpb24uY29sbGVjdGlvbixcblx0XHRcdGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0cGFyc2VyT3V0cHV0LFxuXHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdG9iamVjdE1hcCxcblx0XHRcdHRvUmVzb2x2ZSxcblx0XHRcdGFubm90YXRpb25Tb3VyY2UsXG5cdFx0XHR1bnJlc29sdmVkQW5ub3RhdGlvbnMsXG5cdFx0XHRcIlwiLFxuXHRcdFx0YW5ub3RhdGlvbi50ZXJtXG5cdFx0KTtcblx0XHRjb2xsZWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdHJldHVybiBjb2xsZWN0aW9uO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGNhc2VcIik7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVzb2x2ZVBhdGhGbihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBpbmNsdWRlVmlzaXRlZE9iamVjdHM6IGJvb2xlYW4pOiBhbnkge1xuXHRcdGNvbnN0IGFubm90YXRpb25UZXJtOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGNvbnN0IGFubm90YXRpb25UeXBlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdHJldHVybiByZXNvbHZlVGFyZ2V0KFxuXHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdHJlbGF0aXZlUGF0aCxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aW5jbHVkZVZpc2l0ZWRPYmplY3RzLFxuXHRcdFx0YW5ub3RhdGlvblR5cGUsXG5cdFx0XHRhbm5vdGF0aW9uVGVybVxuXHRcdCk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOYXZpZ2F0aW9uUHJvcGVydGllcyhcblx0ZW50aXR5VHlwZXM6IFBhcnNlckVudGl0eVR5cGVbXSxcblx0YXNzb2NpYXRpb25zOiBBc3NvY2lhdGlvbltdLFxuXHRvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IHZvaWQge1xuXHRlbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcChuYXZQcm9wID0+IHtcblx0XHRcdGNvbnN0IG91dE5hdlByb3A6IFBhcnRpYWw8TmF2aWdhdGlvblByb3BlcnR5PiA9IHtcblx0XHRcdFx0X3R5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5XCIsXG5cdFx0XHRcdG5hbWU6IG5hdlByb3AubmFtZSxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBuYXZQcm9wLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0cGFydG5lcjogKG5hdlByb3AgYXMgYW55KS5oYXNPd25Qcm9wZXJ0eShcInBhcnRuZXJcIikgPyAobmF2UHJvcCBhcyBhbnkpLnBhcnRuZXIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdC8vIHRhcmdldFR5cGVOYW1lOiBGdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0XHRcdC8vIHRhcmdldFR5cGU6IEVudGl0eVR5cGU7XG5cdFx0XHRcdGlzQ29sbGVjdGlvbjogKG5hdlByb3AgYXMgYW55KS5oYXNPd25Qcm9wZXJ0eShcImlzQ29sbGVjdGlvblwiKSA/IChuYXZQcm9wIGFzIGFueSkuaXNDb2xsZWN0aW9uIDogZmFsc2UsXG5cdFx0XHRcdGNvbnRhaW5zVGFyZ2V0OiAobmF2UHJvcCBhcyBhbnkpLmhhc093blByb3BlcnR5KFwiY29udGFpbnNUYXJnZXRcIilcblx0XHRcdFx0XHQ/IChuYXZQcm9wIGFzIGFueSkuY29udGFpbnNUYXJnZXRcblx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRyZWZlcmVudGlhbENvbnN0cmFpbnQ6IChuYXZQcm9wIGFzIGFueSkucmVmZXJlbnRpYWxDb25zdHJhaW50XG5cdFx0XHRcdFx0PyAobmF2UHJvcCBhcyBhbnkpLnJlZmVyZW50aWFsQ29uc3RyYWludFxuXHRcdFx0XHRcdDogW10sXG5cdFx0XHRcdGFubm90YXRpb25zOiB7fVxuXHRcdFx0fTtcblx0XHRcdGlmICgobmF2UHJvcCBhcyBHZW5lcmljTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlTmFtZSkge1xuXHRcdFx0XHRvdXROYXZQcm9wLnRhcmdldFR5cGUgPSBvYmplY3RNYXBbKG5hdlByb3AgYXMgVjROYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGVOYW1lXTtcblx0XHRcdH0gZWxzZSBpZiAoKG5hdlByb3AgYXMgVjJOYXZpZ2F0aW9uUHJvcGVydHkpLnJlbGF0aW9uc2hpcCkge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRBc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9ucy5maW5kKFxuXHRcdFx0XHRcdGFzc29jaWF0aW9uID0+IGFzc29jaWF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gKG5hdlByb3AgYXMgVjJOYXZpZ2F0aW9uUHJvcGVydHkpLnJlbGF0aW9uc2hpcFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAodGFyZ2V0QXNzb2NpYXRpb24pIHtcblx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGlvbkVuZCA9IHRhcmdldEFzc29jaWF0aW9uLmFzc29jaWF0aW9uRW5kLmZpbmQoXG5cdFx0XHRcdFx0XHRlbmQgPT4gZW5kLnJvbGUgPT09IChuYXZQcm9wIGFzIFYyTmF2aWdhdGlvblByb3BlcnR5KS50b1JvbGVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChhc3NvY2lhdGlvbkVuZCkge1xuXHRcdFx0XHRcdFx0b3V0TmF2UHJvcC50YXJnZXRUeXBlID0gb2JqZWN0TWFwW2Fzc29jaWF0aW9uRW5kLnR5cGVdO1xuXHRcdFx0XHRcdFx0b3V0TmF2UHJvcC5pc0NvbGxlY3Rpb24gPSBhc3NvY2lhdGlvbkVuZC5tdWx0aXBsaWNpdHkgPT09IFwiKlwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG91dE5hdlByb3AudGFyZ2V0VHlwZSkge1xuXHRcdFx0XHRvdXROYXZQcm9wLnRhcmdldFR5cGVOYW1lID0gb3V0TmF2UHJvcC50YXJnZXRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG91dE5hdlByb3BSZXEgPSBvdXROYXZQcm9wIGFzIE5hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHRcdG9iamVjdE1hcFtvdXROYXZQcm9wUmVxLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvdXROYXZQcm9wUmVxO1xuXHRcdFx0cmV0dXJuIG91dE5hdlByb3BSZXE7XG5cdFx0fSk7XG5cdFx0KGVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSkucmVzb2x2ZVBhdGggPSBjcmVhdGVSZXNvbHZlUGF0aEZuKGVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSwgb2JqZWN0TWFwKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGxpbmtBY3Rpb25zVG9FbnRpdHlUeXBlKG5hbWVzcGFjZTogc3RyaW5nLCBhY3Rpb25zOiBBY3Rpb25bXSwgb2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuXHRcdGlmICghYWN0aW9uLmFubm90YXRpb25zKSB7XG5cdFx0XHRhY3Rpb24uYW5ub3RhdGlvbnMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKGFjdGlvbi5pc0JvdW5kKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VFbnRpdHlUeXBlID0gb2JqZWN0TWFwW2FjdGlvbi5zb3VyY2VUeXBlXTtcblx0XHRcdGFjdGlvbi5zb3VyY2VFbnRpdHlUeXBlID0gc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChzb3VyY2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGlmICghc291cmNlRW50aXR5VHlwZS5hY3Rpb25zKSB7XG5cdFx0XHRcdFx0c291cmNlRW50aXR5VHlwZS5hY3Rpb25zID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0c291cmNlRW50aXR5VHlwZS5hY3Rpb25zW2FjdGlvbi5uYW1lXSA9IGFjdGlvbjtcblx0XHRcdFx0c291cmNlRW50aXR5VHlwZS5hY3Rpb25zW2Ake25hbWVzcGFjZX0uJHthY3Rpb24ubmFtZX1gXSA9IGFjdGlvbjtcblx0XHRcdH1cblx0XHRcdGFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlID0gb2JqZWN0TWFwW2FjdGlvbi5yZXR1cm5UeXBlXTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBsaW5rRW50aXR5VHlwZVRvRW50aXR5U2V0KFxuXHRlbnRpdHlTZXRzOiBFbnRpdHlTZXRbXSxcblx0b2JqZWN0TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRyZWZlcmVuY2VzOiBSZWZlcmVuY2VzV2l0aE1hcFxuKTogdm9pZCB7XG5cdGVudGl0eVNldHMuZm9yRWFjaChlbnRpdHlTZXQgPT4ge1xuXHRcdGVudGl0eVNldC5lbnRpdHlUeXBlID0gb2JqZWN0TWFwW2VudGl0eVNldC5lbnRpdHlUeXBlTmFtZV07XG5cdFx0aWYgKCFlbnRpdHlTZXQuZW50aXR5VHlwZSkge1xuXHRcdFx0ZW50aXR5U2V0LmVudGl0eVR5cGUgPSBvYmplY3RNYXBbdW5hbGlhcyhyZWZlcmVuY2VzLCBlbnRpdHlTZXQuZW50aXR5VHlwZU5hbWUpIGFzIHN0cmluZ107XG5cdFx0fVxuXHRcdGlmICghZW50aXR5U2V0LmFubm90YXRpb25zKSB7XG5cdFx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCFlbnRpdHlTZXQuZW50aXR5VHlwZS5hbm5vdGF0aW9ucykge1xuXHRcdFx0ZW50aXR5U2V0LmVudGl0eVR5cGUuYW5ub3RhdGlvbnMgPSB7fTtcblx0XHR9XG5cdFx0ZW50aXR5U2V0LmVudGl0eVR5cGUua2V5cy5mb3JFYWNoKChrZXlQcm9wOiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0a2V5UHJvcC5pc0tleSA9IHRydWU7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBsaW5rRW50aXR5VHlwZVRvU2luZ2xldG9uKFxuXHRzaW5nbGV0b25zOiBTaW5nbGV0b25bXSA9IFtdLFxuXHRvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cdHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNXaXRoTWFwXG4pOiB2b2lkIHtcblx0c2luZ2xldG9ucy5mb3JFYWNoKHNpbmdsZXRvbiA9PiB7XG5cdFx0c2luZ2xldG9uLnR5cGUgPSBvYmplY3RNYXBbc2luZ2xldG9uLnR5cGVOYW1lXTtcblx0XHRpZiAoIXNpbmdsZXRvbi50eXBlKSB7XG5cdFx0XHRzaW5nbGV0b24udHlwZSA9IG9iamVjdE1hcFt1bmFsaWFzKHJlZmVyZW5jZXMsIHNpbmdsZXRvbi50eXBlTmFtZSkgYXMgc3RyaW5nXTtcblx0XHR9XG5cdFx0aWYgKCFzaW5nbGV0b24uYW5ub3RhdGlvbnMpIHtcblx0XHRcdHNpbmdsZXRvbi5hbm5vdGF0aW9ucyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoIXNpbmdsZXRvbi50eXBlLmFubm90YXRpb25zKSB7XG5cdFx0XHRzaW5nbGV0b24udHlwZS5hbm5vdGF0aW9ucyA9IHt9O1xuXHRcdH1cblx0XHRzaW5nbGV0b24udHlwZS5rZXlzLmZvckVhY2goKGtleVByb3A6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRrZXlQcm9wLmlzS2V5ID0gdHJ1ZTtcblx0XHR9KTtcblx0XHRzaW5nbGV0b24uZW50aXR5VHlwZSA9IHNpbmdsZXRvbi50eXBlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gbGlua1Byb3BlcnRpZXNUb0NvbXBsZXhUeXBlcyhlbnRpdHlUeXBlczogRW50aXR5VHlwZVtdLCBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0ZnVuY3Rpb24gbGluayhwcm9wZXJ0eTogUHJvcGVydHkpIHtcblx0XHRpZiAoIXByb3BlcnR5LmFubm90YXRpb25zKSB7XG5cdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucyA9IHt9O1xuXHRcdH1cblxuXHRcdHRyeSB7XG4gICAgICBpZiAocHJvcGVydHkudHlwZS5pbmRleE9mKFwiRWRtXCIpICE9PSAwKSB7XG4gICAgICAgIGxldCBjb21wbGV4VHlwZTogQ29tcGxleFR5cGUgfCBUeXBlRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUuc3RhcnRzV2l0aChcIkNvbGxlY3Rpb25cIikpIHtcbiAgICAgICAgICBjb25zdCBjb21wbGV4VHlwZU5hbWUgPSBwcm9wZXJ0eS50eXBlLnN1YnN0cigxMSwgcHJvcGVydHkudHlwZS5sZW5ndGggLSAxMik7XG4gICAgICAgICAgY29tcGxleFR5cGUgPSBvYmplY3RNYXBbY29tcGxleFR5cGVOYW1lXSBhcyBDb21wbGV4VHlwZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV4VHlwZSA9IG9iamVjdE1hcFtwcm9wZXJ0eS50eXBlXSBhcyBDb21wbGV4VHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGxleFR5cGUpIHtcbiAgICAgICAgICBwcm9wZXJ0eS50YXJnZXRUeXBlID0gY29tcGxleFR5cGU7XG4gICAgICAgICAgaWYgKGNvbXBsZXhUeXBlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbXBsZXhUeXBlLnByb3BlcnRpZXMuZm9yRWFjaChsaW5rKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblx0XHR9IGNhdGNoIChzRXJyb3Ipe1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvcGVydHkgVHlwZSBpcyBub3QgZGVmaW5lZFwiKTtcblx0XHR9XG5cdFx0XG5cdH1cblxuXHRlbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKGxpbmspO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUNvbXBsZXhUeXBlcyhcblx0Y29tcGxleFR5cGVzOiBQYXJzZXJDb21wbGV4VHlwZVtdLFxuXHRhc3NvY2lhdGlvbnM6IEFzc29jaWF0aW9uW10sXG5cdG9iamVjdE1hcDogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG5cdGNvbXBsZXhUeXBlcy5mb3JFYWNoKGNvbXBsZXhUeXBlID0+IHtcblx0XHQoY29tcGxleFR5cGUgYXMgQ29tcGxleFR5cGUpLmFubm90YXRpb25zID0ge307XG5cdFx0Y29tcGxleFR5cGUucHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcblx0XHRcdGlmICghKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucykge1xuXHRcdFx0XHQocHJvcGVydHkgYXMgUHJvcGVydHkpLmFubm90YXRpb25zID0ge307XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBjb21wbGV4VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5tYXAobmF2UHJvcCA9PiB7XG5cdFx0XHRpZiAoIShuYXZQcm9wIGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkuYW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0KG5hdlByb3AgYXMgTmF2aWdhdGlvblByb3BlcnR5KS5hbm5vdGF0aW9ucyA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3V0TmF2UHJvcDogUGFydGlhbDxOYXZpZ2F0aW9uUHJvcGVydHk+ID0ge1xuXHRcdFx0XHRfdHlwZTogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIixcblx0XHRcdFx0bmFtZTogbmF2UHJvcC5uYW1lLFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IG5hdlByb3AuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRwYXJ0bmVyOiAobmF2UHJvcCBhcyBhbnkpLmhhc093blByb3BlcnR5KFwicGFydG5lclwiKSA/IChuYXZQcm9wIGFzIGFueSkucGFydG5lciA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Ly8gdGFyZ2V0VHlwZU5hbWU6IEZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdFx0Ly8gdGFyZ2V0VHlwZTogRW50aXR5VHlwZTtcblx0XHRcdFx0aXNDb2xsZWN0aW9uOiAobmF2UHJvcCBhcyBhbnkpLmhhc093blByb3BlcnR5KFwiaXNDb2xsZWN0aW9uXCIpID8gKG5hdlByb3AgYXMgYW55KS5pc0NvbGxlY3Rpb24gOiBmYWxzZSxcblx0XHRcdFx0Y29udGFpbnNUYXJnZXQ6IChuYXZQcm9wIGFzIGFueSkuaGFzT3duUHJvcGVydHkoXCJjb250YWluc1RhcmdldFwiKVxuXHRcdFx0XHRcdD8gKG5hdlByb3AgYXMgYW55KS5jb250YWluc1RhcmdldFxuXHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdHJlZmVyZW50aWFsQ29uc3RyYWludDogKG5hdlByb3AgYXMgYW55KS5yZWZlcmVudGlhbENvbnN0cmFpbnRcblx0XHRcdFx0XHQ/IChuYXZQcm9wIGFzIGFueSkucmVmZXJlbnRpYWxDb25zdHJhaW50XG5cdFx0XHRcdFx0OiBbXVxuXHRcdFx0fTtcblx0XHRcdGlmICgobmF2UHJvcCBhcyBHZW5lcmljTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlTmFtZSkge1xuXHRcdFx0XHRvdXROYXZQcm9wLnRhcmdldFR5cGUgPSBvYmplY3RNYXBbKG5hdlByb3AgYXMgVjROYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGVOYW1lXTtcblx0XHRcdH0gZWxzZSBpZiAoKG5hdlByb3AgYXMgVjJOYXZpZ2F0aW9uUHJvcGVydHkpLnJlbGF0aW9uc2hpcCkge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRBc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9ucy5maW5kKFxuXHRcdFx0XHRcdGFzc29jaWF0aW9uID0+IGFzc29jaWF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gKG5hdlByb3AgYXMgVjJOYXZpZ2F0aW9uUHJvcGVydHkpLnJlbGF0aW9uc2hpcFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAodGFyZ2V0QXNzb2NpYXRpb24pIHtcblx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGlvbkVuZCA9IHRhcmdldEFzc29jaWF0aW9uLmFzc29jaWF0aW9uRW5kLmZpbmQoXG5cdFx0XHRcdFx0XHRlbmQgPT4gZW5kLnJvbGUgPT09IChuYXZQcm9wIGFzIFYyTmF2aWdhdGlvblByb3BlcnR5KS50b1JvbGVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChhc3NvY2lhdGlvbkVuZCkge1xuXHRcdFx0XHRcdFx0b3V0TmF2UHJvcC50YXJnZXRUeXBlID0gb2JqZWN0TWFwW2Fzc29jaWF0aW9uRW5kLnR5cGVdO1xuXHRcdFx0XHRcdFx0b3V0TmF2UHJvcC5pc0NvbGxlY3Rpb24gPSBhc3NvY2lhdGlvbkVuZC5tdWx0aXBsaWNpdHkgPT09IFwiKlwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG91dE5hdlByb3AudGFyZ2V0VHlwZSkge1xuXHRcdFx0XHRvdXROYXZQcm9wLnRhcmdldFR5cGVOYW1lID0gb3V0TmF2UHJvcC50YXJnZXRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG91dE5hdlByb3BSZXEgPSBvdXROYXZQcm9wIGFzIE5hdmlnYXRpb25Qcm9wZXJ0eTtcblx0XHRcdG9iamVjdE1hcFtvdXROYXZQcm9wUmVxLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvdXROYXZQcm9wUmVxO1xuXHRcdFx0cmV0dXJuIG91dE5hdlByb3BSZXE7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzcGxpdFRlcm0ocmVmZXJlbmNlczogUmVmZXJlbmNlc1dpdGhNYXAsIHRlcm1WYWx1ZTogc3RyaW5nKSB7XG5cdGNvbnN0IGFsaWFzZWRUZXJtID0gYWxpYXMocmVmZXJlbmNlcywgdGVybVZhbHVlKTtcblx0Y29uc3QgbGFzdERvdCA9IGFsaWFzZWRUZXJtLmxhc3RJbmRleE9mKFwiLlwiKTtcblx0bGV0IHRlcm1BbGlhcyA9IGFsaWFzZWRUZXJtLnN1YnN0cigwLCBsYXN0RG90KTtcblx0bGV0IHRlcm0gPSBhbGlhc2VkVGVybS5zdWJzdHIobGFzdERvdCArIDEpO1xuXHRyZXR1cm4gW3Rlcm1BbGlhcywgdGVybV07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHNwZWNpZmljIHBhdGhcbiAqIEBwYXJhbSBzUGF0aFxuICovXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dDogQ29udmVydGVyT3V0cHV0LCBvYmplY3RNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIHJlc29sdmVQYXRoPFQgZXh0ZW5kcyBTZXJ2aWNlT2JqZWN0QW5kQW5ub3RhdGlvbj4oc1BhdGg6IHN0cmluZyk6IFJlc29sdXRpb25UYXJnZXQ8VD4ge1xuXHRcdGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0aWYgKGFQYXRoU3BsaXQuc2hpZnQoKSAhPT0gXCJcIikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGRlYWwgd2l0aCByZWxhdGl2ZSBwYXRoXCIpO1xuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gYVBhdGhTcGxpdC5zaGlmdCgpO1xuXHRcdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlZE91dHB1dC5lbnRpdHlTZXRzLmZpbmQoZXQgPT4gZXQubmFtZSA9PT0gZW50aXR5U2V0TmFtZSk7XG5cdFx0aWYgKCFlbnRpdHlTZXQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldDogY29udmVydGVkT3V0cHV0LmVudGl0eUNvbnRhaW5lcixcblx0XHRcdFx0b2JqZWN0UGF0aDogW2NvbnZlcnRlZE91dHB1dC5lbnRpdHlDb250YWluZXJdXG5cdFx0XHR9IGFzIFJlc29sdXRpb25UYXJnZXQ8VD47XG5cdFx0fVxuXHRcdGlmIChhUGF0aFNwbGl0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0OiBlbnRpdHlTZXQsXG5cdFx0XHRcdG9iamVjdFBhdGg6IFtjb252ZXJ0ZWRPdXRwdXQuZW50aXR5Q29udGFpbmVyLCBlbnRpdHlTZXRdXG5cdFx0XHR9IGFzIFJlc29sdXRpb25UYXJnZXQ8VD47XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldFJlc29sdXRpb246IGFueSA9IHJlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBlbnRpdHlTZXQsIFwiL1wiICsgYVBhdGhTcGxpdC5qb2luKFwiL1wiKSwgZmFsc2UsIHRydWUpO1xuXHRcdFx0aWYgKHRhcmdldFJlc29sdXRpb24udGFyZ2V0KSB7XG5cdFx0XHRcdHRhcmdldFJlc29sdXRpb24udmlzaXRlZE9iamVjdHMucHVzaCh0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXQ6IHRhcmdldFJlc29sdXRpb24udGFyZ2V0LFxuXHRcdFx0XHRvYmplY3RQYXRoOiB0YXJnZXRSZXNvbHV0aW9uLnZpc2l0ZWRPYmplY3RzXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcbn1cblxubGV0IEFOTk9UQVRJT05fRVJST1JTOiB7IG1lc3NhZ2U6IHN0cmluZyB9W10gPSBbXTtcbmxldCBBTExfQU5OT1RBVElPTl9FUlJPUlM6IGFueSA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFR5cGVzKHBhcnNlck91dHB1dDogUGFyc2VyT3V0cHV0KTogQ29udmVydGVyT3V0cHV0IHtcblx0QU5OT1RBVElPTl9FUlJPUlMgPSBbXTtcblx0Y29uc3Qgb2JqZWN0TWFwID0gYnVpbGRPYmplY3RNYXAocGFyc2VyT3V0cHV0KTtcblx0cmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKFxuXHRcdHBhcnNlck91dHB1dC5zY2hlbWEuZW50aXR5VHlwZXMgYXMgRW50aXR5VHlwZVtdLFxuXHRcdHBhcnNlck91dHB1dC5zY2hlbWEuYXNzb2NpYXRpb25zLFxuXHRcdG9iamVjdE1hcFxuXHQpO1xuXHRpZiAoIShwYXJzZXJPdXRwdXQuc2NoZW1hLmVudGl0eUNvbnRhaW5lciBhcyBFbnRpdHlDb250YWluZXIpLmFubm90YXRpb25zKSB7XG5cdFx0KHBhcnNlck91dHB1dC5zY2hlbWEuZW50aXR5Q29udGFpbmVyIGFzIEVudGl0eUNvbnRhaW5lcikuYW5ub3RhdGlvbnMgPSB7fTtcblx0fVxuXHRsaW5rQWN0aW9uc1RvRW50aXR5VHlwZShwYXJzZXJPdXRwdXQuc2NoZW1hLm5hbWVzcGFjZSwgcGFyc2VyT3V0cHV0LnNjaGVtYS5hY3Rpb25zIGFzIEFjdGlvbltdLCBvYmplY3RNYXApO1xuXHRsaW5rRW50aXR5VHlwZVRvRW50aXR5U2V0KHBhcnNlck91dHB1dC5zY2hlbWEuZW50aXR5U2V0cyBhcyBFbnRpdHlTZXRbXSwgb2JqZWN0TWFwLCBwYXJzZXJPdXRwdXQucmVmZXJlbmNlcyk7XG5cdGxpbmtFbnRpdHlUeXBlVG9TaW5nbGV0b24ocGFyc2VyT3V0cHV0LnNjaGVtYS5zaW5nbGV0b25zIGFzIFNpbmdsZXRvbltdLCBvYmplY3RNYXAsIHBhcnNlck91dHB1dC5yZWZlcmVuY2VzKTtcblx0bGlua1Byb3BlcnRpZXNUb0NvbXBsZXhUeXBlcyhwYXJzZXJPdXRwdXQuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSwgb2JqZWN0TWFwKTtcblx0cHJlcGFyZUNvbXBsZXhUeXBlcyhwYXJzZXJPdXRwdXQuc2NoZW1hLmNvbXBsZXhUeXBlcyBhcyBDb21wbGV4VHlwZVtdLCBwYXJzZXJPdXRwdXQuc2NoZW1hLmFzc29jaWF0aW9ucywgb2JqZWN0TWFwKTtcblx0Y29uc3QgdG9SZXNvbHZlOiBSZXNvbHZlYWJsZVtdID0gW107XG5cdGNvbnN0IHVucmVzb2x2ZWRBbm5vdGF0aW9uczogQW5ub3RhdGlvbkxpc3RbXSA9IFtdO1xuXG5cdE9iamVjdC5rZXlzKHBhcnNlck91dHB1dC5zY2hlbWEuYW5ub3RhdGlvbnMpLmZvckVhY2goYW5ub3RhdGlvblNvdXJjZSA9PiB7XG5cdFx0cGFyc2VyT3V0cHV0LnNjaGVtYS5hbm5vdGF0aW9uc1thbm5vdGF0aW9uU291cmNlXS5mb3JFYWNoKGFubm90YXRpb25MaXN0ID0+IHtcblx0XHRcdGxldCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocGFyc2VyT3V0cHV0LnJlZmVyZW5jZXMsIGFubm90YXRpb25MaXN0LnRhcmdldCkgYXMgc3RyaW5nO1xuXHRcdFx0Y29uc3Qgb2JqZWN0TWFwRWxlbWVudCA9IG9iamVjdE1hcFtjdXJyZW50VGFyZ2V0TmFtZV07XG5cdFx0XHRpZiAoIW9iamVjdE1hcEVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKGN1cnJlbnRUYXJnZXROYW1lICYmIGN1cnJlbnRUYXJnZXROYW1lLmluZGV4T2YoXCJAXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdChhbm5vdGF0aW9uTGlzdCBhcyBhbnkpLl9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcblx0XHRcdFx0XHR1bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uTGlzdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG9iamVjdE1hcEVsZW1lbnQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0bGV0IGFsbFRhcmdldHMgPSBbb2JqZWN0TWFwRWxlbWVudF07XG5cdFx0XHRcdGxldCBiT3ZlcnJpZGVFeGlzdGluZyA9IHRydWU7XG5cdFx0XHRcdGlmIChvYmplY3RNYXBFbGVtZW50Ll90eXBlID09PSBcIlVuYm91bmRHZW5lcmljQWN0aW9uXCIpIHtcblx0XHRcdFx0XHRhbGxUYXJnZXRzID0gb2JqZWN0TWFwRWxlbWVudC5hY3Rpb25zO1xuXHRcdFx0XHRcdGJPdmVycmlkZUV4aXN0aW5nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWxsVGFyZ2V0cy5mb3JFYWNoKGN1cnJlbnRUYXJnZXQgPT4ge1xuXHRcdFx0XHRcdGlmIChjdXJyZW50VGFyZ2V0TmFtZSAhPT0gY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUpIHtcblx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXROYW1lID0gY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghY3VycmVudFRhcmdldC5hbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9ucyA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhbm5vdGF0aW9uTGlzdC5hbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IHNwbGl0VGVybShkZWZhdWx0UmVmZXJlbmNlcywgYW5ub3RhdGlvbi50ZXJtKTtcblx0XHRcdFx0XHRcdGlmICghY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc10pIHtcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc10gPSB7fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICghY3VycmVudFRhcmdldC5hbm5vdGF0aW9ucy5fYW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9ucy5fYW5ub3RhdGlvbnMgPSB7fTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3Qgdm9jVGVybVdpdGhRdWFsaWZpZXIgPSBgJHt2b2NUZXJtfSR7XG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb24ucXVhbGlmaWVyID8gYCMke2Fubm90YXRpb24ucXVhbGlmaWVyfWAgOiBcIlwiXG5cdFx0XHRcdFx0XHR9YDtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0IWJPdmVycmlkZUV4aXN0aW5nICYmXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnM/Llt2b2NBbGlhc10/Llt2b2NUZXJtV2l0aFF1YWxpZmllcl0gIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9IGNvbnZlcnRBbm5vdGF0aW9uKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uIGFzIEFubm90YXRpb24sXG5cdFx0XHRcdFx0XHRcdHBhcnNlck91dHB1dCxcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHRcdFx0XHR0b1Jlc29sdmUsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25Tb3VyY2UsXG5cdFx0XHRcdFx0XHRcdHVucmVzb2x2ZWRBbm5vdGF0aW9uc1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHN3aXRjaCAodHlwZW9mIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdID0gbmV3IFN0cmluZyhcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdID0gbmV3IEJvb2xlYW4oXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gIT09IG51bGwgJiZcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS50ZXJtID0gdW5hbGlhcyhcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0UmVmZXJlbmNlcyxcblx0XHRcdFx0XHRcdFx0XHRgJHt2b2NBbGlhc30uJHt2b2NUZXJtfWBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLnF1YWxpZmllciA9IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0uX19zb3VyY2UgPSBhbm5vdGF0aW9uU291cmNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvblRhcmdldCA9IGAke2N1cnJlbnRUYXJnZXROYW1lfUAke3VuYWxpYXMoXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRSZWZlcmVuY2VzLFxuXHRcdFx0XHRcdFx0XHR2b2NBbGlhcyArIFwiLlwiICsgdm9jVGVybVdpdGhRdWFsaWZpZXJcblx0XHRcdFx0XHRcdCl9YDtcblx0XHRcdFx0XHRcdGlmIChhbm5vdGF0aW9uLmFubm90YXRpb25zICYmIEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbi5hbm5vdGF0aW9ucykpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3ViQW5ub3RhdGlvbkxpc3QgPSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBhbm5vdGF0aW9uVGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25zOiBhbm5vdGF0aW9uLmFubm90YXRpb25zLFxuXHRcdFx0XHRcdFx0XHRcdF9fc291cmNlOiBhbm5vdGF0aW9uU291cmNlXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdHVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKHN1YkFubm90YXRpb25MaXN0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb24uYW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0IWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9uc1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9ucyA9XG5cdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbi5hbm5vdGF0aW9ucztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zW2Ake3ZvY0FsaWFzfS4ke3ZvY1Rlcm1XaXRoUXVhbGlmaWVyfWBdID1cblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdO1xuXHRcdFx0XHRcdFx0b2JqZWN0TWFwW2Fubm90YXRpb25UYXJnZXRdID0gY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cdGNvbnN0IGV4dHJhVW5yZXNvbHZlZEFubm90YXRpb25zOiBBbm5vdGF0aW9uTGlzdFtdID0gW107XG5cdHVucmVzb2x2ZWRBbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb25MaXN0ID0+IHtcblx0XHRjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IHVuYWxpYXMocGFyc2VyT3V0cHV0LnJlZmVyZW5jZXMsIGFubm90YXRpb25MaXN0LnRhcmdldCkgYXMgc3RyaW5nO1xuXHRcdGxldCBbYmFzZU9iaiwgYW5ub3RhdGlvblBhcnRdID0gY3VycmVudFRhcmdldE5hbWUuc3BsaXQoXCJAXCIpO1xuXHRcdGNvbnN0IHRhcmdldFNwbGl0ID0gYW5ub3RhdGlvblBhcnQuc3BsaXQoXCIvXCIpO1xuXHRcdGJhc2VPYmogPSBiYXNlT2JqICsgXCJAXCIgKyB0YXJnZXRTcGxpdFswXTtcblx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0U3BsaXQuc2xpY2UoMSkucmVkdWNlKChjdXJyZW50T2JqLCBwYXRoKSA9PiB7XG5cdFx0XHRpZiAoIWN1cnJlbnRPYmopIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudE9ialtwYXRoXTtcblx0XHR9LCBvYmplY3RNYXBbYmFzZU9ial0pO1xuXHRcdGlmICghY3VycmVudFRhcmdldCkge1xuXHRcdFx0QU5OT1RBVElPTl9FUlJPUlMucHVzaCh7XG5cdFx0XHRcdG1lc3NhZ2U6IFwiVGhlIGZvbGxvd2luZyBhbm5vdGF0aW9uIHRhcmdldCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2aWNlIFwiICsgY3VycmVudFRhcmdldE5hbWVcblx0XHRcdH0pO1xuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJNaXNzaW5nIHRhcmdldCBhZ2FpbiBcIiArIGN1cnJlbnRUYXJnZXROYW1lKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50VGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9ucyA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuZm9yRWFjaChhbm5vdGF0aW9uID0+IHtcblx0XHRcdFx0Y29uc3QgW3ZvY0FsaWFzLCB2b2NUZXJtXSA9IHNwbGl0VGVybShkZWZhdWx0UmVmZXJlbmNlcywgYW5ub3RhdGlvbi50ZXJtKTtcblx0XHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXSkge1xuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdID0ge307XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zLl9hbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnMuX2Fubm90YXRpb25zID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB2b2NUZXJtV2l0aFF1YWxpZmllciA9IGAke3ZvY1Rlcm19JHthbm5vdGF0aW9uLnF1YWxpZmllciA/IGAjJHthbm5vdGF0aW9uLnF1YWxpZmllcn1gIDogXCJcIn1gO1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBjb252ZXJ0QW5ub3RhdGlvbihcblx0XHRcdFx0XHRhbm5vdGF0aW9uIGFzIEFubm90YXRpb24sXG5cdFx0XHRcdFx0cGFyc2VyT3V0cHV0LFxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQsXG5cdFx0XHRcdFx0b2JqZWN0TWFwLFxuXHRcdFx0XHRcdHRvUmVzb2x2ZSxcblx0XHRcdFx0XHQoYW5ub3RhdGlvbkxpc3QgYXMgYW55KS5fX3NvdXJjZSxcblx0XHRcdFx0XHRleHRyYVVucmVzb2x2ZWRBbm5vdGF0aW9uc1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdICE9PSBudWxsICYmXG5cdFx0XHRcdFx0dHlwZW9mIGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0udGVybSA9IHVuYWxpYXMoXG5cdFx0XHRcdFx0XHRkZWZhdWx0UmVmZXJlbmNlcyxcblx0XHRcdFx0XHRcdGAke3ZvY0FsaWFzfS4ke3ZvY1Rlcm19YFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLnF1YWxpZmllciA9IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW1xuXHRcdFx0XHRcdFx0dm9jVGVybVdpdGhRdWFsaWZpZXJcblx0XHRcdFx0XHRdLl9fc291cmNlID0gKGFubm90YXRpb25MaXN0IGFzIGFueSkuX19zb3VyY2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VycmVudFRhcmdldC5hbm5vdGF0aW9ucy5fYW5ub3RhdGlvbnNbYCR7dm9jQWxpYXN9LiR7dm9jVGVybVdpdGhRdWFsaWZpZXJ9YF0gPVxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXTtcblx0XHRcdFx0b2JqZWN0TWFwW2Ake2N1cnJlbnRUYXJnZXROYW1lfUAke3VuYWxpYXMoZGVmYXVsdFJlZmVyZW5jZXMsIHZvY0FsaWFzICsgXCIuXCIgKyB2b2NUZXJtV2l0aFF1YWxpZmllcil9YF0gPVxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG5cdHRvUmVzb2x2ZS5mb3JFYWNoKHJlc29sdmVhYmxlID0+IHtcblx0XHRjb25zdCB0b1Jlc29sdmUgPSByZXNvbHZlYWJsZS50b1Jlc29sdmU7XG5cdFx0Y29uc3QgdGFyZ2V0U3RyID0gdG9SZXNvbHZlLiR0YXJnZXQ7XG5cdFx0Y29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBvYmplY3RNYXBbdGFyZ2V0U3RyXTtcblx0XHRjb25zdCB7IGFubm90YXRpb25zVGVybSwgYW5ub3RhdGlvblR5cGUgfSA9IHRvUmVzb2x2ZTtcblx0XHRkZWxldGUgdG9SZXNvbHZlLmFubm90YXRpb25UeXBlO1xuXHRcdGRlbGV0ZSB0b1Jlc29sdmUuYW5ub3RhdGlvbnNUZXJtO1xuXG5cdFx0aWYgKHJlc29sdmVhYmxlLmlubGluZSAmJiAhKHJlc29sdmVkVGFyZ2V0IGluc3RhbmNlb2YgU3RyaW5nKSkge1xuXHRcdFx0Ly8gaW5saW5lIHRoZSByZXNvbHZlZCB0YXJnZXRcblx0XHRcdGxldCBrZXlzOiBrZXlvZiB0eXBlb2YgdG9SZXNvbHZlO1xuXHRcdFx0Zm9yIChrZXlzIGluIHRvUmVzb2x2ZSkgZGVsZXRlIHRvUmVzb2x2ZVtrZXlzXTtcblxuXHRcdFx0T2JqZWN0LmFzc2lnbih0b1Jlc29sdmUsIHJlc29sdmVkVGFyZ2V0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYXNzaWduIHRoZSByZXNvbHZlZCB0YXJnZXRcblx0XHRcdHRvUmVzb2x2ZS4kdGFyZ2V0ID0gcmVzb2x2ZWRUYXJnZXQ7XG5cdFx0fVxuXG5cdFx0aWYgKCFyZXNvbHZlZFRhcmdldCkge1xuXHRcdFx0dG9SZXNvbHZlLnRhcmdldFN0cmluZyA9IHRhcmdldFN0cjtcblx0XHRcdGlmIChhbm5vdGF0aW9uc1Rlcm0gJiYgYW5ub3RhdGlvblR5cGUpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yTXNnID0ge1xuXHRcdFx0XHRcdG1lc3NhZ2U6XG5cdFx0XHRcdFx0XHRcIlVuYWJsZSB0byByZXNvbHZlIHRoZSBwYXRoIGV4cHJlc3Npb246IFwiICtcblx0XHRcdFx0XHRcdHRhcmdldFN0ciArXG5cdFx0XHRcdFx0XHRcIlxcblwiICtcblx0XHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdFx0XCJIaW50OiBDaGVjayBhbmQgY29ycmVjdCB0aGUgcGF0aCB2YWx1ZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIG1ldGFkYXRhIChhbm5vdGF0aW9uLnhtbCBmaWxlIG9yIENEUyBhbm5vdGF0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uKTogXFxuXFxuXCIgK1xuXHRcdFx0XHRcdFx0XCI8QW5ub3RhdGlvbiBUZXJtID0gXCIgK1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbnNUZXJtICtcblx0XHRcdFx0XHRcdFwiPlwiICtcblx0XHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdFx0XCI8UmVjb3JkIFR5cGUgPSBcIiArXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uVHlwZSArXG5cdFx0XHRcdFx0XHRcIj5cIiArXG5cdFx0XHRcdFx0XHRcIlxcblwiICtcblx0XHRcdFx0XHRcdFwiPEFubm90YXRpb25QYXRoID0gXCIgK1xuXHRcdFx0XHRcdFx0dGFyZ2V0U3RyICtcblx0XHRcdFx0XHRcdFwiPlwiXG5cdFx0XHRcdH07XG5cdFx0XHRcdGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0U3RyLCBvRXJyb3JNc2cpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSB0b1Jlc29sdmUudGVybTtcblx0XHRcdFx0Y29uc3QgcGF0aCA9IHRvUmVzb2x2ZS5wYXRoO1xuXHRcdFx0XHRjb25zdCB0ZXJtSW5mbyA9IHRhcmdldFN0ciA/IHRhcmdldFN0ci5zcGxpdChcIi9cIilbMF0gOiB0YXJnZXRTdHI7XG5cdFx0XHRcdGNvbnN0IG9FcnJvck1zZyA9IHtcblx0XHRcdFx0XHRtZXNzYWdlOlxuXHRcdFx0XHRcdFx0XCJVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiBcIiArXG5cdFx0XHRcdFx0XHR0YXJnZXRTdHIgK1xuXHRcdFx0XHRcdFx0XCJcXG5cIiArXG5cdFx0XHRcdFx0XHRcIlxcblwiICtcblx0XHRcdFx0XHRcdFwiSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcblwiICtcblx0XHRcdFx0XHRcdFwiPEFubm90YXRpb24gVGVybSA9IFwiICtcblx0XHRcdFx0XHRcdHRlcm1JbmZvICtcblx0XHRcdFx0XHRcdFwiPlwiICtcblx0XHRcdFx0XHRcdFwiXFxuXCIgK1xuXHRcdFx0XHRcdFx0XCI8UHJvcGVydHlWYWx1ZSBQcm9wZXJ0eSA9IFwiICtcblx0XHRcdFx0XHRcdHByb3BlcnR5ICtcblx0XHRcdFx0XHRcdFwiICAgICAgICBQYXRoPSBcIiArXG5cdFx0XHRcdFx0XHRwYXRoICtcblx0XHRcdFx0XHRcdFwiPlwiXG5cdFx0XHRcdH07XG5cdFx0XHRcdGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0U3RyLCBvRXJyb3JNc2cpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGZvciAodmFyIHByb3BlcnR5IGluIEFMTF9BTk5PVEFUSU9OX0VSUk9SUykge1xuXHRcdEFOTk9UQVRJT05fRVJST1JTLnB1c2goQUxMX0FOTk9UQVRJT05fRVJST1JTW3Byb3BlcnR5XVswXSk7XG5cdH1cblx0KHBhcnNlck91dHB1dCBhcyBhbnkpLmVudGl0eVNldHMgPSBwYXJzZXJPdXRwdXQuc2NoZW1hLmVudGl0eVNldHM7XG5cdGNvbnN0IGV4dHJhUmVmZXJlbmNlcyA9IHBhcnNlck91dHB1dC5yZWZlcmVuY2VzLmZpbHRlcihyZWZlcmVuY2UgPT4ge1xuXHRcdHJldHVybiBkZWZhdWx0UmVmZXJlbmNlcy5maW5kKGRlZmF1bHRSZWYgPT4gZGVmYXVsdFJlZi5uYW1lc3BhY2UgPT09IHJlZmVyZW5jZS5uYW1lc3BhY2UpID09PSB1bmRlZmluZWQ7XG5cdH0pO1xuXHRjb25zdCBjb252ZXJ0ZWRPdXRwdXQ6IFBhcnRpYWw8Q29udmVydGVyT3V0cHV0PiA9IHtcblx0XHR2ZXJzaW9uOiBwYXJzZXJPdXRwdXQudmVyc2lvbixcblx0XHRhbm5vdGF0aW9uczogcGFyc2VyT3V0cHV0LnNjaGVtYS5hbm5vdGF0aW9ucyxcblx0XHRuYW1lc3BhY2U6IHBhcnNlck91dHB1dC5zY2hlbWEubmFtZXNwYWNlLFxuXHRcdGVudGl0eUNvbnRhaW5lcjogcGFyc2VyT3V0cHV0LnNjaGVtYS5lbnRpdHlDb250YWluZXIgYXMgRW50aXR5Q29udGFpbmVyLFxuXHRcdGFjdGlvbnM6IHBhcnNlck91dHB1dC5zY2hlbWEuYWN0aW9ucyBhcyBBY3Rpb25bXSxcblx0XHRlbnRpdHlTZXRzOiBwYXJzZXJPdXRwdXQuc2NoZW1hLmVudGl0eVNldHMgYXMgRW50aXR5U2V0W10sXG5cdFx0c2luZ2xldG9uczogcGFyc2VyT3V0cHV0LnNjaGVtYS5zaW5nbGV0b25zIGFzIFNpbmdsZXRvbltdLFxuXHRcdGVudGl0eVR5cGVzOiBwYXJzZXJPdXRwdXQuc2NoZW1hLmVudGl0eVR5cGVzIGFzIEVudGl0eVR5cGVbXSxcblx0XHRjb21wbGV4VHlwZXM6IHBhcnNlck91dHB1dC5zY2hlbWEuY29tcGxleFR5cGVzIGFzIENvbXBsZXhUeXBlW10sXG5cdFx0dHlwZURlZmluaXRpb25zOiBwYXJzZXJPdXRwdXQuc2NoZW1hLnR5cGVEZWZpbml0aW9ucyBhcyBUeXBlRGVmaW5pdGlvbltdLFxuXHRcdHJlZmVyZW5jZXM6IGRlZmF1bHRSZWZlcmVuY2VzLmNvbmNhdChleHRyYVJlZmVyZW5jZXMpLFxuXHRcdGRpYWdub3N0aWNzOiBBTk5PVEFUSU9OX0VSUk9SUy5jb25jYXQoKVxuXHR9O1xuXHRjb252ZXJ0ZWRPdXRwdXQucmVzb2x2ZVBhdGggPSBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dCBhcyBDb252ZXJ0ZXJPdXRwdXQsIG9iamVjdE1hcCk7XG5cdHJldHVybiBjb252ZXJ0ZWRPdXRwdXQgYXMgQ29udmVydGVyT3V0cHV0O1xufVxuXG5mdW5jdGlvbiByZXZlcnRWYWx1ZVRvR2VuZXJpY1R5cGUocmVmZXJlbmNlczogUmVmZXJlbmNlW10sIHZhbHVlOiBhbnkpOiBFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0bGV0IHJlc3VsdDogRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGNvbnN0IHZhbHVlTWF0Y2hlcyA9IHZhbHVlLm1hdGNoKC8oXFx3KylcXC5cXHcrXFwvLiovKTtcblx0XHRpZiAodmFsdWVNYXRjaGVzICYmIHJlZmVyZW5jZXMuZmluZChyZWYgPT4gcmVmLmFsaWFzID09PSB2YWx1ZU1hdGNoZXNbMV0pKSB7XG5cdFx0XHRyZXN1bHQgPSB7XG5cdFx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0XHRFbnVtTWVtYmVyOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0ge1xuXHRcdFx0XHR0eXBlOiBcIlN0cmluZ1wiLFxuXHRcdFx0XHRTdHJpbmc6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdHJlc3VsdCA9IHtcblx0XHRcdHR5cGU6IFwiQ29sbGVjdGlvblwiLFxuXHRcdFx0Q29sbGVjdGlvbjogdmFsdWUubWFwKGFubm8gPT4gcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXMsIGFubm8pKSBhcyBhbnlbXVxuXHRcdH07XG5cdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuXHRcdHJlc3VsdCA9IHtcblx0XHRcdHR5cGU6IFwiQm9vbFwiLFxuXHRcdFx0Qm9vbDogdmFsdWVcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuXHRcdGlmICh2YWx1ZS50b1N0cmluZygpID09PSB2YWx1ZS50b0ZpeGVkKCkpIHtcblx0XHRcdHJlc3VsdCA9IHtcblx0XHRcdFx0dHlwZTogXCJJbnRcIixcblx0XHRcdFx0SW50OiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0ge1xuXHRcdFx0XHR0eXBlOiBcIkRlY2ltYWxcIixcblx0XHRcdFx0RGVjaW1hbDogdmFsdWVcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZS5pc0RlY2ltYWwgJiYgdmFsdWUuaXNEZWNpbWFsKCkpIHtcblx0XHRyZXN1bHQgPSB7XG5cdFx0XHR0eXBlOiBcIkRlY2ltYWxcIixcblx0XHRcdERlY2ltYWw6IHZhbHVlLnZhbHVlT2YoKVxuXHRcdH07XG5cdH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gXCJQYXRoXCIpIHtcblx0XHRyZXN1bHQgPSB7XG5cdFx0XHR0eXBlOiBcIlBhdGhcIixcblx0XHRcdFBhdGg6IHZhbHVlLnBhdGhcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09IFwiQW5ub3RhdGlvblBhdGhcIikge1xuXHRcdHJlc3VsdCA9IHtcblx0XHRcdHR5cGU6IFwiQW5ub3RhdGlvblBhdGhcIixcblx0XHRcdEFubm90YXRpb25QYXRoOiB2YWx1ZS52YWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gXCJBcHBseVwiKSB7XG5cdFx0cmVzdWx0ID0ge1xuXHRcdFx0dHlwZTogXCJBcHBseVwiLFxuXHRcdFx0QXBwbHk6IHZhbHVlLkFwcGx5XG5cdFx0fTtcblx0fSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSBcIk51bGxcIikge1xuXHRcdHJlc3VsdCA9IHtcblx0XHRcdHR5cGU6IFwiTnVsbFwiXG5cdFx0fTtcblx0fSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiKSB7XG5cdFx0cmVzdWx0ID0ge1xuXHRcdFx0dHlwZTogXCJQcm9wZXJ0eVBhdGhcIixcblx0XHRcdFByb3BlcnR5UGF0aDogdmFsdWUudmFsdWVcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSB7XG5cdFx0cmVzdWx0ID0ge1xuXHRcdFx0dHlwZTogXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIsXG5cdFx0XHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiB2YWx1ZS52YWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBcIiRUeXBlXCIpKSB7XG5cdFx0cmVzdWx0ID0ge1xuXHRcdFx0dHlwZTogXCJSZWNvcmRcIixcblx0XHRcdFJlY29yZDogcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXMsIHZhbHVlKSBhcyBBbm5vdGF0aW9uUmVjb3JkXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXZlcnRDb2xsZWN0aW9uSXRlbVRvR2VuZXJpY1R5cGUoXG5cdHJlZmVyZW5jZXM6IFJlZmVyZW5jZVtdLFxuXHRjb2xsZWN0aW9uSXRlbTogYW55XG4pOlxuXHR8IEFubm90YXRpb25SZWNvcmRcblx0fCBzdHJpbmdcblx0fCBQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG5cdHwgUGF0aEV4cHJlc3Npb25cblx0fCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoRXhwcmVzc2lvblxuXHR8IEFubm90YXRpb25QYXRoRXhwcmVzc2lvblxuXHR8IHVuZGVmaW5lZCB7XG5cdGlmICh0eXBlb2YgY29sbGVjdGlvbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbkl0ZW07XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNvbGxlY3Rpb25JdGVtID09PSBcIm9iamVjdFwiKSB7XG5cdFx0aWYgKGNvbGxlY3Rpb25JdGVtLmhhc093blByb3BlcnR5KFwiJFR5cGVcIikpIHtcblx0XHRcdC8vIEFubm90YXRpb24gUmVjb3JkXG5cdFx0XHRjb25zdCBvdXRJdGVtOiBBbm5vdGF0aW9uUmVjb3JkID0ge1xuXHRcdFx0XHR0eXBlOiBjb2xsZWN0aW9uSXRlbS4kVHlwZSxcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXM6IFtdIGFzIGFueVtdXG5cdFx0XHR9O1xuXHRcdFx0Ly8gQ291bGQgdmFsaWRhdGUga2V5cyBhbmQgdHlwZSBiYXNlZCBvbiAkVHlwZVxuXHRcdFx0T2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW0pLmZvckVhY2goY29sbGVjdGlvbktleSA9PiB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRjb2xsZWN0aW9uS2V5ICE9PSBcIiRUeXBlXCIgJiZcblx0XHRcdFx0XHRjb2xsZWN0aW9uS2V5ICE9PSBcInRlcm1cIiAmJlxuXHRcdFx0XHRcdGNvbGxlY3Rpb25LZXkgIT09IFwiX19zb3VyY2VcIiAmJlxuXHRcdFx0XHRcdGNvbGxlY3Rpb25LZXkgIT09IFwicXVhbGlmaWVyXCIgJiZcblx0XHRcdFx0XHRjb2xsZWN0aW9uS2V5ICE9PSBcIkFjdGlvblRhcmdldFwiICYmXG5cdFx0XHRcdFx0Y29sbGVjdGlvbktleSAhPT0gXCJmdWxseVF1YWxpZmllZE5hbWVcIiAmJlxuXHRcdFx0XHRcdGNvbGxlY3Rpb25LZXkgIT09IFwiYW5ub3RhdGlvbnNcIlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IGNvbGxlY3Rpb25JdGVtW2NvbGxlY3Rpb25LZXldO1xuXHRcdFx0XHRcdG91dEl0ZW0ucHJvcGVydHlWYWx1ZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBjb2xsZWN0aW9uS2V5LFxuXHRcdFx0XHRcdFx0dmFsdWU6IHJldmVydFZhbHVlVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCB2YWx1ZSkgYXMgRXhwcmVzc2lvblxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbGxlY3Rpb25LZXkgPT09IFwiYW5ub3RhdGlvbnNcIikge1xuXHRcdFx0XHRcdGNvbnN0IGFubm90YXRpb25zID0gY29sbGVjdGlvbkl0ZW1bY29sbGVjdGlvbktleV07XG5cdFx0XHRcdFx0b3V0SXRlbS5hbm5vdGF0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdE9iamVjdC5rZXlzKGFubm90YXRpb25zKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihrZXkgPT4ga2V5ICE9PSBcIl9hbm5vdGF0aW9uc1wiKVxuXHRcdFx0XHRcdFx0LmZvckVhY2goa2V5ID0+IHtcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMoYW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCh0ZXJtID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJzZWRBbm5vdGF0aW9uID0gcmV2ZXJ0VGVybVRvR2VuZXJpY1R5cGUocmVmZXJlbmNlcywgYW5ub3RhdGlvbnNba2V5XVt0ZXJtXSk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFwYXJzZWRBbm5vdGF0aW9uLnRlcm0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHVuYWxpYXNlZFRlcm0gPSB1bmFsaWFzKHJlZmVyZW5jZXMsIGAke2tleX0uJHt0ZXJtfWApO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHVuYWxpYXNlZFRlcm0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgcXVhbGlmaWVkU3BsaXQgPSB1bmFsaWFzZWRUZXJtLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbi50ZXJtID0gcXVhbGlmaWVkU3BsaXRbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChxdWFsaWZpZWRTcGxpdC5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbi5xdWFsaWZpZXIgPSBxdWFsaWZpZWRTcGxpdFsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRvdXRJdGVtLmFubm90YXRpb25zPy5wdXNoKHBhcnNlZEFubm90YXRpb24pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBvdXRJdGVtO1xuXHRcdH0gZWxzZSBpZiAoY29sbGVjdGlvbkl0ZW0udHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogXCJQcm9wZXJ0eVBhdGhcIixcblx0XHRcdFx0UHJvcGVydHlQYXRoOiBjb2xsZWN0aW9uSXRlbS52YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGNvbGxlY3Rpb25JdGVtLnR5cGUgPT09IFwiQW5ub3RhdGlvblBhdGhcIikge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLFxuXHRcdFx0XHRBbm5vdGF0aW9uUGF0aDogY29sbGVjdGlvbkl0ZW0udmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChjb2xsZWN0aW9uSXRlbS50eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogXCJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIsXG5cdFx0XHRcdE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGNvbGxlY3Rpb25JdGVtLnZhbHVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJ0VGVybVRvR2VuZXJpY1R5cGUocmVmZXJlbmNlczogUmVmZXJlbmNlW10sIGFubm90YXRpb246IEFubm90YXRpb25UZXJtPGFueT4pOiBFZG1Bbm5vdGF0aW9uIHtcblx0Y29uc3QgYmFzZUFubm90YXRpb246IEVkbUFubm90YXRpb24gPSB7XG5cdFx0dGVybTogYW5ub3RhdGlvbi50ZXJtLFxuXHRcdHF1YWxpZmllcjogYW5ub3RhdGlvbi5xdWFsaWZpZXJcblx0fTtcblx0aWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbikpIHtcblx0XHQvLyBDb2xsZWN0aW9uXG5cdFx0aWYgKGFubm90YXRpb24uaGFzT3duUHJvcGVydHkoXCJhbm5vdGF0aW9uc1wiKSkge1xuXHRcdFx0YmFzZUFubm90YXRpb24uYW5ub3RhdGlvbnMgPSBbXTtcblx0XHRcdGNvbnN0IGN1cnJlbnRBbm5vdGF0aW9ucyA9IChhbm5vdGF0aW9uIGFzIGFueSkuYW5ub3RhdGlvbnM7XG5cdFx0XHRPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnMpXG5cdFx0XHRcdC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gXCJfYW5ub3RhdGlvbnNcIilcblx0XHRcdFx0LmZvckVhY2goa2V5ID0+IHtcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCh0ZXJtID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcnNlZEFubm90YXRpb24gPSByZXZlcnRUZXJtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBjdXJyZW50QW5ub3RhdGlvbnNba2V5XVt0ZXJtXSk7XG5cdFx0XHRcdFx0XHRpZiAoIXBhcnNlZEFubm90YXRpb24udGVybSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB1bmFsaWFzZWRUZXJtID0gdW5hbGlhcyhyZWZlcmVuY2VzLCBgJHtrZXl9LiR7dGVybX1gKTtcblx0XHRcdFx0XHRcdFx0aWYgKHVuYWxpYXNlZFRlcm0pIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBxdWFsaWZpZWRTcGxpdCA9IHVuYWxpYXNlZFRlcm0uc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdFx0XHRcdHBhcnNlZEFubm90YXRpb24udGVybSA9IHF1YWxpZmllZFNwbGl0WzBdO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChxdWFsaWZpZWRTcGxpdC5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uLnF1YWxpZmllciA9IHF1YWxpZmllZFNwbGl0WzFdO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YmFzZUFubm90YXRpb24uYW5ub3RhdGlvbnM/LnB1c2gocGFyc2VkQW5ub3RhdGlvbik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4uYmFzZUFubm90YXRpb24sXG5cdFx0XHRjb2xsZWN0aW9uOiBhbm5vdGF0aW9uLm1hcChhbm5vID0+IHJldmVydENvbGxlY3Rpb25JdGVtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBhbm5vKSkgYXMgYW55W11cblx0XHR9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb24uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdHJldHVybiB7IC4uLmJhc2VBbm5vdGF0aW9uLCByZWNvcmQ6IHJldmVydENvbGxlY3Rpb25JdGVtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBhbm5vdGF0aW9uKSBhcyBhbnkgfTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4geyAuLi5iYXNlQW5ub3RhdGlvbiwgdmFsdWU6IHJldmVydFZhbHVlVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBhbm5vdGF0aW9uKSB9O1xuXHR9XG59XG4iXX0=
2143
+ /******/
2144
+ })();
2145
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2Rpc3QvQW5ub3RhdGlvbkNvbnZlcnRlci5qcyJdLCJuYW1lcyI6WyJBbm5vdGF0aW9uQ29udmVydGVyIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIl9fdW51c2VkX3dlYnBhY2tfbW9kdWxlIiwiZXhwb3J0cyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiY29udmVydCIsInV0aWxzXzEiLCJQYXRoIiwicGF0aEV4cHJlc3Npb24iLCJ0YXJnZXROYW1lIiwiYW5ub3RhdGlvbnNUZXJtIiwidGVybSIsInBhdGgiLCJ0eXBlIiwiJHRhcmdldCIsImJ1aWxkT2JqZWN0TWFwIiwicmF3TWV0YWRhdGEiLCJfYSIsIm9iamVjdE1hcCIsInNjaGVtYSIsImVudGl0eUNvbnRhaW5lciIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImVudGl0eVNldHMiLCJmb3JFYWNoIiwiZW50aXR5U2V0IiwiYWN0aW9ucyIsImFjdGlvbiIsImlzQm91bmQiLCJ1bkJvdW5kQWN0aW9uTmFtZSIsInNwbGl0IiwiX3R5cGUiLCJwdXNoIiwiYWN0aW9uU3BsaXQiLCJwYXJhbWV0ZXJzIiwicGFyYW1ldGVyIiwiY29tcGxleFR5cGVzIiwiY29tcGxleFR5cGUiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJ0eXBlRGVmaW5pdGlvbnMiLCJ0eXBlRGVmaW5pdGlvbiIsImVudGl0eVR5cGVzIiwiZW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiZW50aXR5UHJvcGVydGllcyIsImNvbXBsZXhUeXBlRGVmaW5pdGlvbiIsImlzQ29tcGxleFR5cGVEZWZpbml0aW9uIiwiY29tcGxleFR5cGVQcm9wIiwiY29tcGxleFR5cGVQcm9wVGFyZ2V0IiwiYXNzaWduIiwibmFtZSIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwibmF2UHJvcGVydHkiLCJrZXlzIiwiYW5ub3RhdGlvblNvdXJjZSIsImFubm90YXRpb25MaXN0IiwiY3VycmVudFRhcmdldE5hbWUiLCJ1bmFsaWFzIiwicmVmZXJlbmNlcyIsInRhcmdldCIsImFubm90YXRpb24iLCJhbm5vdGF0aW9uRlFOIiwicXVhbGlmaWVyIiwiY29tYmluZVBhdGgiLCJjdXJyZW50VGFyZ2V0Iiwic3RhcnRzV2l0aCIsImRlZmF1bHRSZWZlcmVuY2VzIiwiQUxMX0FOTk9UQVRJT05fRVJST1JTIiwiQU5OT1RBVElPTl9FUlJPUlMiLCJhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlIiwib0Vycm9yTXNnIiwiX3Jlc29sdmVUYXJnZXQiLCJwYXRoT25seSIsImluY2x1ZGVWaXNpdGVkT2JqZWN0cyIsInVuZGVmaW5lZCIsImFWaXNpdGVkT2JqZWN0cyIsInBhdGhTcGxpdCIsInRhcmdldFBhdGhTcGxpdCIsInBhdGhQYXJ0IiwiaW5kZXhPZiIsInNwbGl0dGVkUGF0aCIsImFubm90YXRpb25QYXRoIiwiY3VycmVudFBhdGgiLCJjdXJyZW50Q29udGV4dCIsInJlZHVjZSIsImN1cnJlbnRWYWx1ZSIsImxlbmd0aCIsInRhcmdldFR5cGUiLCJlbnRpdHlUeXBlTmFtZSIsInRhcmdldFR5cGVOYW1lIiwic291cmNlVHlwZSIsImlzRW50aXR5U2V0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJsYXN0SWR4IiwiY29udGV4dFRvUmVzb2x2ZSIsInN1YlRhcmdldCIsInZpc2l0ZWRPYmplY3RzIiwidmlzaXRlZFN1Yk9iamVjdCIsImNvbmNhdCIsInJldmVyc2UiLCJmaW5kIiwib2JqIiwiaW50ZXJtZWRpYXRlVGFyZ2V0IiwiaGFzT3duUHJvcGVydHkiLCJhbm5vdGF0aW9uVHlwZSIsImluZmVyVHlwZUZyb21UZXJtIiwibWVzc2FnZSIsImlzQW5ub3RhdGlvblBhdGgiLCJwYXRoU3RyIiwicGFyc2VWYWx1ZSIsInByb3BlcnR5VmFsdWUiLCJ2YWx1ZUZRTiIsImNvbnRleHQiLCJTdHJpbmciLCJJbnQiLCJCb29sIiwiRGVjaW1hbCIsIkRhdGUiLCJhbGlhcyIsIkVudW1NZW1iZXIiLCJQcm9wZXJ0eVBhdGgiLCJjdXJyZW50VGVybSIsIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhbm5vdGF0aW9uVGFyZ2V0IiwiQW5ub3RhdGlvblBhdGgiLCJ1bnJlc29sdmVkQW5ub3RhdGlvbnMiLCJpbmxpbmUiLCJ0b1Jlc29sdmUiLCJwYXJzZVJlY29yZCIsIlJlY29yZCIsInBhcnNlQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJUZXJtVG9UeXBlcyIsImlzRXJyb3IiLCJpc0RhdGFGaWVsZFdpdGhGb3JBY3Rpb24iLCJhbm5vdGF0aW9uQ29udGVudCIsImFubm90YXRpb25UZXJtIiwiJFR5cGUiLCJwYXJzZVJlY29yZFR5cGUiLCJyZWNvcmREZWZpbml0aW9uIiwiY3VycmVudEZRTiIsIkFycmF5IiwiaXNBcnJheSIsInN1YkFubm90YXRpb25MaXN0IiwiX19zb3VyY2UiLCJjdXJyZW50U291cmNlIiwiYWRkaXRpb25hbEFubm90YXRpb25zIiwicHJvcGVydHlWYWx1ZXMiLCJBY3Rpb25UYXJnZXQiLCJBY3Rpb24iLCJnZXRPckluZmVyQ29sbGVjdGlvblR5cGUiLCJjb2xsZWN0aW9uRGVmaW5pdGlvbiIsImZpcnN0Q29sSXRlbSIsInBhcmVudEZRTiIsImNvbGxlY3Rpb25EZWZpbml0aW9uVHlwZSIsIm1hcCIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5SWR4IiwicGF0aFZhbHVlIiwiYW5ub3RhdGlvbklkeCIsImFubm90YXRpb25Db2xsZWN0aW9uRWxlbWVudCIsIm5hdlByb3BlcnR5UGF0aCIsIm5hdlByb3BJZHgiLCJyZWNvcmRJZHgiLCJpZlZhbHVlIiwic3RyaW5nVmFsdWUiLCJFcnJvciIsImNvbnZlcnRBbm5vdGF0aW9uIiwicmVjb3JkIiwiY29sbGVjdGlvbiIsImNyZWF0ZVJlc29sdmVQYXRoRm4iLCJyZWxhdGl2ZVBhdGgiLCJyZXNvbHZlVjJOYXZpZ2F0aW9uUHJvcGVydHkiLCJuYXZQcm9wIiwiYXNzb2NpYXRpb25zIiwib3V0TmF2UHJvcCIsInRhcmdldEFzc29jaWF0aW9uIiwiYXNzb2NpYXRpb24iLCJyZWxhdGlvbnNoaXAiLCJhc3NvY2lhdGlvbkVuZCIsImVuZCIsInJvbGUiLCJ0b1JvbGUiLCJpc0NvbGxlY3Rpb24iLCJtdWx0aXBsaWNpdHkiLCJyZXNvbHZlVjROYXZpZ2F0aW9uUHJvcGVydHkiLCJwYXJ0bmVyIiwiY29udGFpbnNUYXJnZXQiLCJyZWZlcmVudGlhbENvbnN0cmFpbnQiLCJpc1Y0TmF2aWdhdGlvblByb3BlcnR5IiwicHJlcGFyZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicmVzb2x2ZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicmVzb2x2ZVBhdGgiLCJsaW5rQWN0aW9uc1RvRW50aXR5VHlwZSIsIm5hbWVzcGFjZSIsInNvdXJjZUVudGl0eVR5cGUiLCJyZXR1cm5FbnRpdHlUeXBlIiwicmV0dXJuVHlwZSIsImxpbmtFbnRpdHlUeXBlVG9FbnRpdHlTZXQiLCJrZXlQcm9wIiwiaXNLZXkiLCJsaW5rRW50aXR5VHlwZVRvU2luZ2xldG9uIiwic2luZ2xldG9ucyIsInNpbmdsZXRvbiIsImxpbmtQcm9wZXJ0aWVzVG9Db21wbGV4VHlwZXMiLCJsaW5rIiwiY29tcGxleFR5cGVOYW1lIiwic0Vycm9yIiwicHJlcGFyZUNvbXBsZXhUeXBlcyIsInNwbGl0VGVybSIsInRlcm1WYWx1ZSIsImFsaWFzZWRUZXJtIiwibGFzdERvdCIsInRlcm1BbGlhcyIsImNyZWF0ZUdsb2JhbFJlc29sdmUiLCJjb252ZXJ0ZWRPdXRwdXQiLCJzUGF0aCIsImFQYXRoU3BsaXQiLCJzaGlmdCIsImVudGl0eVNldE5hbWUiLCJldCIsIm9iamVjdFBhdGgiLCJ0YXJnZXRSZXNvbHV0aW9uIiwiam9pbiIsImVuc3VyZUFubm90YXRpb25zIiwidm9jQWxpYXMiLCJfYW5ub3RhdGlvbnMiLCJwcm9jZXNzQW5ub3RhdGlvbnMiLCJiT3ZlcnJpZGVFeGlzdGluZyIsIl9iIiwidm9jVGVybSIsInZvY1Rlcm1XaXRoUXVhbGlmaWVyIiwiQm9vbGVhbiIsInByb2Nlc3NVbnJlc29sdmVkVGFyZ2V0cyIsInVucmVzb2x2ZWRUYXJnZXRzIiwicmVzb2x2YWJsZSIsInRhcmdldFRvUmVzb2x2ZSIsInRhcmdldFN0ciIsInJlc29sdmVkVGFyZ2V0IiwidGFyZ2V0U3RyaW5nIiwidGVybUluZm8iLCJtZXJnZUFubm90YXRpb25zIiwiYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXQiLCJmaW5kSW5kZXgiLCJyZWZlcmVuY2VBbm5vdGF0aW9uIiwic3BsaWNlIiwib2JqZWN0TWFwRWxlbWVudCIsImFsbFRhcmdldHMiLCJleHRyYVVucmVzb2x2ZWRBbm5vdGF0aW9ucyIsImJhc2VPYmoiLCJhbm5vdGF0aW9uUGFydCIsInRhcmdldFNwbGl0Iiwic2xpY2UiLCJjdXJyZW50T2JqIiwiZXh0cmFSZWZlcmVuY2VzIiwiZmlsdGVyIiwicmVmZXJlbmNlIiwiZGVmYXVsdFJlZiIsInZlcnNpb24iLCJkaWFnbm9zdGljcyIsIl9fY3JlYXRlQmluZGluZyIsImNyZWF0ZSIsIm8iLCJtIiwiayIsImsyIiwiZGVzYyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9fZXNNb2R1bGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJfX2V4cG9ydFN0YXIiLCJwIiwicHJvdG90eXBlIiwiY2FsbCIsInVyaSIsInVuYWxpYXNlZFZhbHVlIiwicmV2ZXJzZVJlZmVyZW5jZU1hcCIsInJlZiIsImxhc3REb3RJbmRleCIsInByZUFsaWFzIiwicG9zdEFsaWFzIiwiYWxpYXNlZFZhbHVlIiwicmVmZXJlbmNlTWFwIiwiaXNEZWNpbWFsIiwidmFsdWVPZiIsInRvU3RyaW5nIiwicmV2ZXJ0VGVybVRvR2VuZXJpY1R5cGUiLCJyZXZlcnRPYmplY3RUb1Jhd1R5cGUiLCJyZXN1bHQiLCJhbm5vIiwicmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUiLCJpc1N0cmluZyIsInZhbHVlTWF0Y2hlcyIsIkFwcGx5IiwicmV2ZXJ0VmFsdWVUb1Jhd1R5cGUiLCJ2YWx1ZUNvbnN0cnVjdG9yIiwiY29uc3RydWN0b3IiLCJ0b0ZpeGVkIiwicmVzdHJpY3RlZEtleXMiLCJyZXZlcnRBbm5vdGF0aW9uc1RvUmF3VHlwZSIsImN1cnJlbnRBbm5vdGF0aW9ucyIsInRhcmdldEFubm90YXRpb25zIiwia2V5IiwicGFyc2VkQW5ub3RhdGlvbiIsInVuYWxpYXNlZFRlcm0iLCJxdWFsaWZpZWRTcGxpdCIsImNvbGxlY3Rpb25JdGVtIiwib3V0SXRlbSIsImNvbGxlY3Rpb25LZXkiLCJiYXNlQW5ub3RhdGlvbiIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwibW9kdWxlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZBLElBQUlBLG1CQUFKO0FBQ0E7O0FBQVMsQ0FBQyxZQUFXO0FBQUU7O0FBQ3ZCO0FBQVU7QUFDVjs7QUFBVSxNQUFJQyxtQkFBbUIsR0FBSTtBQUVyQztBQUFNO0FBQ047QUFBTyxjQUFTQyx1QkFBVCxFQUFrQ0MsT0FBbEMsRUFBMkNDLG1CQUEzQyxFQUFnRTtBQUd2RUMsTUFBQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCSCxPQUF0QixFQUErQixZQUEvQixFQUE4QztBQUFFSSxRQUFBQSxLQUFLLEVBQUU7QUFBVCxPQUE5QztBQUNBSixNQUFBQSxPQUFPLENBQUNLLE9BQVIsR0FBa0IsS0FBSyxDQUF2Qjs7QUFDQSxVQUFNQyxPQUFPLEdBQUdMLG1CQUFtQixDQUFDLEVBQUQsQ0FBbkM7QUFDQTtBQUNBO0FBQ0E7OztBQVJ1RSxVQVNqRU0sSUFUaUU7QUFVbkU7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0ksb0JBQVlDLGNBQVosRUFBNEJDLFVBQTVCLEVBQXdDQyxlQUF4QyxFQUF5REMsSUFBekQsRUFBK0Q7QUFDM0QsYUFBS0MsSUFBTCxHQUFZSixjQUFjLENBQUNELElBQTNCO0FBQ0EsYUFBS00sSUFBTCxHQUFZLE1BQVo7QUFDQSxhQUFLQyxPQUFMLEdBQWVM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QVUsTUFBSXdCLHdCQUF3QixHQUFHLEVBQS9CO0FBQ1Y7O0FBQ0E7QUFBVTs7QUFDVjs7QUFBVSxXQUFTelQsbUJBQVQsQ0FBNkIwVCxRQUE3QixFQUF1QztBQUNqRDtBQUFXOztBQUNYO0FBQVcsUUFBSUMsWUFBWSxHQUFHRix3QkFBd0IsQ0FBQ0MsUUFBRCxDQUEzQztBQUNYOztBQUFXLFFBQUlDLFlBQVksS0FBS2xQLFNBQXJCLEVBQWdDO0FBQzNDO0FBQVksYUFBT2tQLFlBQVksQ0FBQzVULE9BQXBCO0FBQ1o7QUFBWTtBQUNaO0FBQVc7O0FBQ1g7OztBQUFXLFFBQUk2VCxNQUFNLEdBQUdILHdCQUF3QixDQUFDQyxRQUFELENBQXhCLEdBQXFDO0FBQzdEO0FBQVk7O0FBQ1o7QUFBWTs7QUFDWjtBQUFZM1QsTUFBQUEsT0FBTyxFQUFFO0FBQ3JCOztBQUo2RCxLQUFsRDtBQUtYOztBQUNBO0FBQVc7O0FBQ1g7O0FBQVdGLElBQUFBLG1CQUFtQixDQUFDNlQsUUFBRCxDQUFuQixDQUE4QnRDLElBQTlCLENBQW1Dd0MsTUFBTSxDQUFDN1QsT0FBMUMsRUFBbUQ2VCxNQUFuRCxFQUEyREEsTUFBTSxDQUFDN1QsT0FBbEUsRUFBMkVDLG1CQUEzRTtBQUNYOztBQUNBO0FBQVc7O0FBQ1g7OztBQUFXLFdBQU80VCxNQUFNLENBQUM3VCxPQUFkO0FBQ1g7QUFBVztBQUNYOztBQUNBOztBQUNBOztBQUNBO0FBQVU7O0FBQ1Y7QUFBVTs7QUFDVjtBQUFVOztBQUNWOzs7QUFBVSxNQUFJOFQsbUJBQW1CLEdBQUc3VCxtQkFBbUIsQ0FBQyxHQUFELENBQTdDO0FBQ1Y7OztBQUFVSixFQUFBQSxtQkFBbUIsR0FBR2lVLG1CQUF0QjtBQUNWOztBQUNBO0FBQVUsQ0F0ekREIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgQW5ub3RhdGlvbkNvbnZlcnRlcjtcbi8qKioqKiovIChmdW5jdGlvbigpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHRcInVzZSBzdHJpY3RcIjtcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA4NzU6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmV4cG9ydHMuY29udmVydCA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5KTtcbi8qKlxuICpcbiAqL1xuY2xhc3MgUGF0aCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHBhdGhFeHByZXNzaW9uXG4gICAgICogQHBhcmFtIHRhcmdldE5hbWVcbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnNUZXJtXG4gICAgICogQHBhcmFtIHRlcm1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXRoRXhwcmVzc2lvbiwgdGFyZ2V0TmFtZSwgYW5ub3RhdGlvbnNUZXJtLCB0ZXJtKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGhFeHByZXNzaW9uLlBhdGg7XG4gICAgICAgIHRoaXMudHlwZSA9ICdQYXRoJztcbiAgICAgICAgdGhpcy4kdGFyZ2V0ID0gdGFyZ2V0TmFtZTtcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1Rlcm0gPSBhbm5vdGF0aW9uc1Rlcm07XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGEgTWFwIGJhc2VkIG9uIHRoZSBmdWxseVF1YWxpZmllZE5hbWUgb2YgZWFjaCBvYmplY3QgcGFydCBvZiB0aGUgbWV0YWRhdGEuXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhIHRoZSByYXdNZXRhZGF0YSB3ZSdyZSB3b3JraW5nIGFnYWluc3RcbiAqIEByZXR1cm5zIHRoZSBvYmplY3RtYXAgZm9yIGVhc3kgYWNjZXNzIHRvIHRoZSBkaWZmZXJlbnQgb2JqZWN0IG9mIHRoZSBtZXRhZGF0YVxuICovXG5mdW5jdGlvbiBidWlsZE9iamVjdE1hcChyYXdNZXRhZGF0YSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvYmplY3RNYXAgPSB7fTtcbiAgICBpZiAoKF9hID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgICAgICBvYmplY3RNYXBbcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lci5mdWxseVF1YWxpZmllZE5hbWVdID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lcjtcbiAgICB9XG4gICAgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMuZm9yRWFjaCgoZW50aXR5U2V0KSA9PiB7XG4gICAgICAgIG9iamVjdE1hcFtlbnRpdHlTZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IGVudGl0eVNldDtcbiAgICB9KTtcbiAgICByYXdNZXRhZGF0YS5zY2hlbWEuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgb2JqZWN0TWFwW2FjdGlvbi5mdWxseVF1YWxpZmllZE5hbWVdID0gYWN0aW9uO1xuICAgICAgICBpZiAoYWN0aW9uLmlzQm91bmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuQm91bmRBY3Rpb25OYW1lID0gYWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdCgnKCcpWzBdO1xuICAgICAgICAgICAgaWYgKCFvYmplY3RNYXBbdW5Cb3VuZEFjdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TWFwW3VuQm91bmRBY3Rpb25OYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgX3R5cGU6ICdVbmJvdW5kR2VuZXJpY0FjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iamVjdE1hcFt1bkJvdW5kQWN0aW9uTmFtZV0uYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25TcGxpdCA9IGFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJygnKTtcbiAgICAgICAgICAgIG9iamVjdE1hcFtgJHthY3Rpb25TcGxpdFsxXS5zcGxpdCgnKScpWzBdfS8ke2FjdGlvblNwbGl0WzBdfWBdID0gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlcikgPT4ge1xuICAgICAgICAgICAgb2JqZWN0TWFwW3BhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWVdID0gcGFyYW1ldGVyO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByYXdNZXRhZGF0YS5zY2hlbWEuY29tcGxleFR5cGVzLmZvckVhY2goKGNvbXBsZXhUeXBlKSA9PiB7XG4gICAgICAgIG9iamVjdE1hcFtjb21wbGV4VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gY29tcGxleFR5cGU7XG4gICAgICAgIGNvbXBsZXhUeXBlLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIG9iamVjdE1hcFtwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdID0gcHJvcGVydHk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJhd01ldGFkYXRhLnNjaGVtYS50eXBlRGVmaW5pdGlvbnMuZm9yRWFjaCgodHlwZURlZmluaXRpb24pID0+IHtcbiAgICAgICAgb2JqZWN0TWFwW3R5cGVEZWZpbml0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0eXBlRGVmaW5pdGlvbjtcbiAgICB9KTtcbiAgICByYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5VHlwZXMuZm9yRWFjaCgoZW50aXR5VHlwZSkgPT4ge1xuICAgICAgICBlbnRpdHlUeXBlLmFubm90YXRpb25zID0ge307IC8vICdhbm5vdGF0aW9ucycgcHJvcGVydHkgaXMgbWFuZGF0b3J5XG4gICAgICAgIG9iamVjdE1hcFtlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBlbnRpdHlUeXBlO1xuICAgICAgICBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIG9iamVjdE1hcFtwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdID0gcHJvcGVydHk7XG4gICAgICAgICAgICAvLyBIYW5kbGUgY29tcGxleCB0eXBlc1xuICAgICAgICAgICAgY29uc3QgY29tcGxleFR5cGVEZWZpbml0aW9uID0gb2JqZWN0TWFwW3Byb3BlcnR5LnR5cGVdO1xuICAgICAgICAgICAgaWYgKCgwLCB1dGlsc18xLmlzQ29tcGxleFR5cGVEZWZpbml0aW9uKShjb21wbGV4VHlwZURlZmluaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29tcGxleFR5cGVEZWZpbml0aW9uLnByb3BlcnRpZXMuZm9yRWFjaCgoY29tcGxleFR5cGVQcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhUeXBlUHJvcFRhcmdldCA9IE9iamVjdC5hc3NpZ24oY29tcGxleFR5cGVQcm9wLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ1Byb3BlcnR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogcHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lICsgJy8nICsgY29tcGxleFR5cGVQcm9wLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcFtjb21wbGV4VHlwZVByb3BUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IGNvbXBsZXhUeXBlUHJvcFRhcmdldDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIG9iamVjdE1hcFtuYXZQcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdID0gbmF2UHJvcGVydHk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykuZm9yRWFjaCgoYW5ub3RhdGlvblNvdXJjZSkgPT4ge1xuICAgICAgICByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gKDAsIHV0aWxzXzEudW5hbGlhcykocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KTtcbiAgICAgICAgICAgIGFubm90YXRpb25MaXN0LmFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYW5ub3RhdGlvbkZRTiA9IGAke2N1cnJlbnRUYXJnZXROYW1lfUAkeygwLCB1dGlsc18xLnVuYWxpYXMpKHJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIGFubm90YXRpb24udGVybSl9YDtcbiAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5xdWFsaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkZRTiArPSBgIyR7YW5ub3RhdGlvbi5xdWFsaWZpZXJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqZWN0TWFwW2Fubm90YXRpb25GUU5dID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGFubm90YXRpb25GUU47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iamVjdE1hcDtcbn1cbi8qKlxuICogQ29tYmluZSB0d28gc3RyaW5ncyByZXByZXNlbnRpbmcgcGF0aCBpbiB0aGUgbWV0YW1vZGVsIHdoaWxlIGVuc3VyaW5nIHRoZWlyIHNwZWNpZmljaXRpZXMgKGFubm90YXRpb24uLi4pIGFyZSByZXNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRUYXJnZXQgdGhlIGN1cnJlbnQgcGF0aFxuICogQHBhcmFtIHBhdGggdGhlIHBhcnQgd2Ugd2FudCB0byBhcHBlbmRcbiAqIEByZXR1cm5zIHRoZSBjb21wbGV0ZSBwYXRoIGluY2x1ZGluZyB0aGUgZXh0ZW5zaW9uLlxuICovXG5mdW5jdGlvbiBjb21iaW5lUGF0aChjdXJyZW50VGFyZ2V0LCBwYXRoKSB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50VGFyZ2V0ICsgKDAsIHV0aWxzXzEudW5hbGlhcykodXRpbHNfMS5kZWZhdWx0UmVmZXJlbmNlcywgcGF0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gY3VycmVudFRhcmdldCArICcvJyArIHBhdGg7XG4gICAgfVxufVxuY29uc3QgQUxMX0FOTk9UQVRJT05fRVJST1JTID0ge307XG5sZXQgQU5OT1RBVElPTl9FUlJPUlMgPSBbXTtcbi8qKlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBvRXJyb3JNc2dcbiAqL1xuZnVuY3Rpb24gYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoLCBvRXJyb3JNc2cpIHtcbiAgICBpZiAoIUFMTF9BTk5PVEFUSU9OX0VSUk9SU1twYXRoXSkge1xuICAgICAgICBBTExfQU5OT1RBVElPTl9FUlJPUlNbcGF0aF0gPSBbb0Vycm9yTXNnXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIEFMTF9BTk5PVEFUSU9OX0VSUk9SU1twYXRoXS5wdXNoKG9FcnJvck1zZyk7XG4gICAgfVxufVxuLyoqXG4gKiBSZXNvbHZlcyBhIHNwZWNpZmljIHBhdGggYmFzZWQgb24gdGhlIG9iamVjdE1hcC5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKiBAcGFyYW0gY3VycmVudFRhcmdldFxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBwYXRoT25seVxuICogQHBhcmFtIGluY2x1ZGVWaXNpdGVkT2JqZWN0c1xuICogQHBhcmFtIGFubm90YXRpb25zVGVybVxuICogQHJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdFxuICovXG5mdW5jdGlvbiBfcmVzb2x2ZVRhcmdldChvYmplY3RNYXAsIGN1cnJlbnRUYXJnZXQsIHBhdGgsIHBhdGhPbmx5ID0gZmFsc2UsIGluY2x1ZGVWaXNpdGVkT2JqZWN0cyA9IGZhbHNlLCBhbm5vdGF0aW9uc1Rlcm0pIHtcbiAgICBsZXQgb0Vycm9yTXNnO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBhVmlzaXRlZE9iamVjdHMgPSBbXTtcbiAgICBpZiAoY3VycmVudFRhcmdldCAmJiBjdXJyZW50VGFyZ2V0Ll90eXBlID09PSAnUHJvcGVydHknKSB7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQgPSBvYmplY3RNYXBbY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJy8nKVswXV07XG4gICAgfVxuICAgIHBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aCk7XG4gICAgY29uc3QgcGF0aFNwbGl0ID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHRhcmdldFBhdGhTcGxpdCA9IFtdO1xuICAgIHBhdGhTcGxpdC5mb3JFYWNoKChwYXRoUGFydCkgPT4ge1xuICAgICAgICAvLyBTZXBhcmF0ZSBvdXQgdGhlIGFubm90YXRpb25cbiAgICAgICAgaWYgKHBhdGhQYXJ0LmluZGV4T2YoJ0AnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzcGxpdHRlZFBhdGgsIGFubm90YXRpb25QYXRoXSA9IHBhdGhQYXJ0LnNwbGl0KCdAJyk7XG4gICAgICAgICAgICB0YXJnZXRQYXRoU3BsaXQucHVzaChzcGxpdHRlZFBhdGgpO1xuICAgICAgICAgICAgdGFyZ2V0UGF0aFNwbGl0LnB1c2goYEAke2Fubm90YXRpb25QYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0UGF0aFNwbGl0LnB1c2gocGF0aFBhcnQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gcGF0aDtcbiAgICBsZXQgY3VycmVudENvbnRleHQgPSBjdXJyZW50VGFyZ2V0O1xuICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldFBhdGhTcGxpdC5yZWR1Y2UoKGN1cnJlbnRWYWx1ZSwgcGF0aFBhcnQpID0+IHtcbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSAnJFR5cGUnICYmIGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ0VudGl0eVR5cGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGF0aFBhcnQgPT09ICdAJHVpNS5vdmVybG9hZCcgfHwgcGF0aFBhcnQgPT09ICcwJykgJiYgY3VycmVudFZhbHVlLl90eXBlID09PSAnQWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbXB0eSBQYXRoIGFmdGVyIGFuIGVudGl0eVNldCBtZWFucyBlbnRpdHlUeXBlXG4gICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ0VudGl0eVNldCcgJiYgY3VycmVudFZhbHVlLmVudGl0eVR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFWaXNpdGVkT2JqZWN0cy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5lbnRpdHlUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdOYXZpZ2F0aW9uUHJvcGVydHknICYmIGN1cnJlbnRWYWx1ZS50YXJnZXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVWaXNpdGVkT2JqZWN0cykge1xuICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUudGFyZ2V0VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVWaXNpdGVkT2JqZWN0cyAmJiBjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFWaXNpdGVkT2JqZWN0cy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSAnRW50aXR5U2V0JyAmJiBwYXRoUGFydCA9PT0gJyRUeXBlJykge1xuICAgICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRhcmdldFR5cGU7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ0VudGl0eVNldCcgJiYgY3VycmVudFZhbHVlLmVudGl0eVR5cGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLmVudGl0eVR5cGVOYW1lLCBwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5Jykge1xuICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoUGFydCk7XG4gICAgICAgICAgICBpZiAoIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayBsb2cgZXJyb3JcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS50YXJnZXRUeXBlTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ1Byb3BlcnR5Jykge1xuICAgICAgICAgICAgLy8gQ29tcGxleFR5cGUgb3IgUHJvcGVydHlcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUudGFyZ2V0VHlwZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLnRhcmdldFR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBwYXRoUGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXJyZW50VmFsdWUuX3R5cGUgPT09ICdBY3Rpb24nICYmIGN1cnJlbnRWYWx1ZS5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gJyRQYXJhbWV0ZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZS5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvYmplY3RNYXBbY3VycmVudFBhdGhdKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjb21iaW5lUGF0aChjdXJyZW50VmFsdWUuc291cmNlVHlwZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5fdHlwZSA9PT0gJ0FjdGlvblBhcmFtZXRlcicgJiYgY3VycmVudFZhbHVlLmlzRW50aXR5U2V0KSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRWYWx1ZS50eXBlLCBwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFZhbHVlLl90eXBlID09PSAnQWN0aW9uUGFyYW1ldGVyJyAmJiAhY3VycmVudFZhbHVlLmlzRW50aXR5U2V0KSB7XG4gICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZignLycpKSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgaWYgKCFvYmplY3RNYXBbY3VycmVudFBhdGhdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RJZHggPSBjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZignLycpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0SWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0SWR4ID0gY3VycmVudFRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKG9iamVjdE1hcFtjdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgbGFzdElkeCldLnNvdXJjZVR5cGUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoY3VycmVudFZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgcGF0aFBhcnQpO1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ICE9PSAnbmFtZScgJiYgY3VycmVudFZhbHVlW3BhdGhQYXJ0XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZVtwYXRoUGFydF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXRoUGFydCA9PT0gJyRBbm5vdGF0aW9uUGF0aCcgJiYgY3VycmVudFZhbHVlLiR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0VG9SZXNvbHZlID0gb2JqZWN0TWFwW2N1cnJlbnRWYWx1ZS5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJ0AnKVswXV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVGFyZ2V0ID0gX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjb250ZXh0VG9SZXNvbHZlLCBjdXJyZW50VmFsdWUudmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBzdWJUYXJnZXQudmlzaXRlZE9iamVjdHMuZm9yRWFjaCgodmlzaXRlZFN1Yk9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYVZpc2l0ZWRPYmplY3RzLmluZGV4T2YodmlzaXRlZFN1Yk9iamVjdCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhVmlzaXRlZE9iamVjdHMucHVzaCh2aXNpdGVkU3ViT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJUYXJnZXQudGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGF0aFBhcnQgPT09ICckUGF0aCcgJiYgY3VycmVudFZhbHVlLiR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IGFWaXNpdGVkT2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICAuY29uY2F0KClcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgICAgICAuZmluZCgob2JqKSA9PiBvYmouX3R5cGUgPT09ICdFbnRpdHlUeXBlJyB8fFxuICAgICAgICAgICAgICAgICAgICBvYmouX3R5cGUgPT09ICdFbnRpdHlTZXQnIHx8XG4gICAgICAgICAgICAgICAgICAgIG9iai5fdHlwZSA9PT0gJ05hdmlnYXRpb25Qcm9wZXJ0eScpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJUYXJnZXQgPSBfcmVzb2x2ZVRhcmdldChvYmplY3RNYXAsIGN1cnJlbnRDb250ZXh0LCBjdXJyZW50VmFsdWUucGF0aCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBzdWJUYXJnZXQudmlzaXRlZE9iamVjdHMuZm9yRWFjaCgodmlzaXRlZFN1Yk9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFWaXNpdGVkT2JqZWN0cy5pbmRleE9mKHZpc2l0ZWRTdWJPYmplY3QpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFWaXNpdGVkT2JqZWN0cy5wdXNoKHZpc2l0ZWRTdWJPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YlRhcmdldC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWUuJHRhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhdGhQYXJ0LnN0YXJ0c1dpdGgoJyRQYXRoJykgJiYgY3VycmVudFZhbHVlLiR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm1lZGlhdGVUYXJnZXQgPSBjdXJyZW50VmFsdWUuJHRhcmdldDtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGNvbWJpbmVQYXRoKGludGVybWVkaWF0ZVRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0LnN1YnN0cmluZyg1KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50VmFsdWUuaGFzT3duUHJvcGVydHkoJyRUeXBlJykgJiYgIW9iamVjdE1hcFtjdXJyZW50UGF0aF0pIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdyBhbiBhbm5vdGF0aW9uIHZhbHVlXG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5VHlwZSA9IG9iamVjdE1hcFtjdXJyZW50VmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KCdAJylbMF1dO1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY29tYmluZVBhdGgoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIHBhdGhQYXJ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdE1hcFtjdXJyZW50UGF0aF07XG4gICAgfSwgbnVsbCk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgaWYgKGFubm90YXRpb25zVGVybSkge1xuICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblR5cGUgPSBpbmZlclR5cGVGcm9tVGVybShhbm5vdGF0aW9uc1Rlcm0sIGN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgb0Vycm9yTXNnID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdIaW50OiBDaGVjayBhbmQgY29ycmVjdCB0aGUgcGF0aCB2YWx1ZXMgdW5kZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIG1ldGFkYXRhIChhbm5vdGF0aW9uLnhtbCBmaWxlIG9yIENEUyBhbm5vdGF0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uKTogXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zVGVybSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxSZWNvcmQgVHlwZSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxBbm5vdGF0aW9uUGF0aCA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoICtcbiAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShwYXRoLCBvRXJyb3JNc2cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb0Vycm9yTXNnID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gcmVzb2x2ZSB0aGUgcGF0aCBleHByZXNzaW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCArXG4gICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAnSGludDogQ2hlY2sgYW5kIGNvcnJlY3QgdGhlIHBhdGggdmFsdWVzIHVuZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBtZXRhZGF0YSAoYW5ub3RhdGlvbi54bWwgZmlsZSBvciBDRFMgYW5ub3RhdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbik6IFxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnPEFubm90YXRpb24gVGVybSA9ICcgK1xuICAgICAgICAgICAgICAgICAgICBwYXRoU3BsaXRbMF0gK1xuICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICc8UHJvcGVydHlWYWx1ZSAgUGF0aD0gJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTcGxpdFsxXSArXG4gICAgICAgICAgICAgICAgICAgICc+J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFkZEFubm90YXRpb25FcnJvck1lc3NhZ2UocGF0aCwgb0Vycm9yTXNnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aE9ubHkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXRoO1xuICAgIH1cbiAgICBpZiAoaW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2aXNpdGVkT2JqZWN0czogYVZpc2l0ZWRPYmplY3RzLFxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbi8qKlxuICogVHlwZWd1YXJkIHRvIGNoZWNrIGlmIHRoZSBwYXRoIGNvbnRhaW5zIGFuIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHBhdGhTdHIgdGhlIHBhdGggdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW4gYW5ub3RhdGlvbiBpbiB0aGUgcGF0aC5cbiAqL1xuZnVuY3Rpb24gaXNBbm5vdGF0aW9uUGF0aChwYXRoU3RyKSB7XG4gICAgcmV0dXJuIHBhdGhTdHIuaW5kZXhPZignQCcpICE9PSAtMTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWUocHJvcGVydHlWYWx1ZSwgdmFsdWVGUU4sIG9iamVjdE1hcCwgY29udGV4dCkge1xuICAgIGlmIChwcm9wZXJ0eVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoIChwcm9wZXJ0eVZhbHVlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLlN0cmluZztcbiAgICAgICAgY2FzZSAnSW50JzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLkludDtcbiAgICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5Cb29sO1xuICAgICAgICBjYXNlICdEZWNpbWFsJzpcbiAgICAgICAgICAgIHJldHVybiAoMCwgdXRpbHNfMS5EZWNpbWFsKShwcm9wZXJ0eVZhbHVlLkRlY2ltYWwpO1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlLkRhdGU7XG4gICAgICAgIGNhc2UgJ0VudW1NZW1iZXInOlxuICAgICAgICAgICAgcmV0dXJuICgwLCB1dGlsc18xLmFsaWFzKShjb250ZXh0LnJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIHByb3BlcnR5VmFsdWUuRW51bU1lbWJlcik7XG4gICAgICAgIGNhc2UgJ1Byb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdQcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlLlByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZE5hbWU6IHZhbHVlRlFOLFxuICAgICAgICAgICAgICAgICR0YXJnZXQ6IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY29udGV4dC5jdXJyZW50VGFyZ2V0LCBwcm9wZXJ0eVZhbHVlLlByb3BlcnR5UGF0aCwgZmFsc2UsIGZhbHNlLCBjb250ZXh0LmN1cnJlbnRUZXJtKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZS5OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjb250ZXh0LmN1cnJlbnRUYXJnZXQsIHByb3BlcnR5VmFsdWUuTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgZmFsc2UsIGZhbHNlLCBjb250ZXh0LmN1cnJlbnRUZXJtKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnQW5ub3RhdGlvblBhdGgnOlxuICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY29udGV4dC5jdXJyZW50VGFyZ2V0LCAoMCwgdXRpbHNfMS51bmFsaWFzKShjb250ZXh0LnJhd01ldGFkYXRhLnJlZmVyZW5jZXMsIHByb3BlcnR5VmFsdWUuQW5ub3RhdGlvblBhdGgpLCB0cnVlLCBmYWxzZSwgY29udGV4dC5jdXJyZW50VGVybSk7XG4gICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uUGF0aCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlLkFubm90YXRpb25QYXRoLFxuICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogdmFsdWVGUU4sXG4gICAgICAgICAgICAgICAgJHRhcmdldDogYW5ub3RhdGlvblRhcmdldCxcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1Rlcm06IGNvbnRleHQuY3VycmVudFRlcm0sXG4gICAgICAgICAgICAgICAgdGVybTogJycsXG4gICAgICAgICAgICAgICAgcGF0aDogJydcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb250ZXh0LnVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKHsgaW5saW5lOiBmYWxzZSwgdG9SZXNvbHZlOiBhbm5vdGF0aW9uUGF0aCB9KTtcbiAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uUGF0aDtcbiAgICAgICAgY2FzZSAnUGF0aCc6XG4gICAgICAgICAgICBjb25zdCAkdGFyZ2V0ID0gX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjb250ZXh0LmN1cnJlbnRUYXJnZXQsIHByb3BlcnR5VmFsdWUuUGF0aCwgdHJ1ZSwgZmFsc2UsIGNvbnRleHQuY3VycmVudFRlcm0pO1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IG5ldyBQYXRoKHByb3BlcnR5VmFsdWUsICR0YXJnZXQsIGNvbnRleHQuY3VycmVudFRlcm0sICcnKTtcbiAgICAgICAgICAgIGNvbnRleHQudW5yZXNvbHZlZEFubm90YXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlubGluZTogaXNBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eVZhbHVlLlBhdGgpLFxuICAgICAgICAgICAgICAgIHRvUmVzb2x2ZTogcGF0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgY2FzZSAnUmVjb3JkJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJlY29yZChwcm9wZXJ0eVZhbHVlLlJlY29yZCwgdmFsdWVGUU4sIG9iamVjdE1hcCwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29sbGVjdGlvbihwcm9wZXJ0eVZhbHVlLkNvbGxlY3Rpb24sIHZhbHVlRlFOLCBvYmplY3RNYXAsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdBcHBseSc6XG4gICAgICAgIGNhc2UgJ051bGwnOlxuICAgICAgICBjYXNlICdOb3QnOlxuICAgICAgICBjYXNlICdFcSc6XG4gICAgICAgIGNhc2UgJ05lJzpcbiAgICAgICAgY2FzZSAnR3QnOlxuICAgICAgICBjYXNlICdHZSc6XG4gICAgICAgIGNhc2UgJ0x0JzpcbiAgICAgICAgY2FzZSAnTGUnOlxuICAgICAgICBjYXNlICdJZic6XG4gICAgICAgIGNhc2UgJ0FuZCc6XG4gICAgICAgIGNhc2UgJ09yJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlO1xuICAgIH1cbn1cbi8qKlxuICogSW5mZXIgdGhlIHR5cGUgb2YgYSB0ZXJtIGJhc2VkIG9uIGl0cyB0eXBlLlxuICpcbiAqIEBwYXJhbSBhbm5vdGF0aW9uc1Rlcm0gVGhlIGFubm90YXRpb24gdGVybVxuICogQHBhcmFtIGFubm90YXRpb25UYXJnZXQgdGhlIGFubm90YXRpb24gdGFyZ2V0XG4gKiBAcmV0dXJucyB0aGUgaW5mZXJyZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJUeXBlRnJvbVRlcm0oYW5ub3RhdGlvbnNUZXJtLCBhbm5vdGF0aW9uVGFyZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0VHlwZSA9IHV0aWxzXzEuVGVybVRvVHlwZXNbYW5ub3RhdGlvbnNUZXJtXTtcbiAgICBjb25zdCBvRXJyb3JNc2cgPSB7XG4gICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgVGhlIHR5cGUgb2YgdGhlIHJlY29yZCB1c2VkIHdpdGhpbiB0aGUgdGVybSAke2Fubm90YXRpb25zVGVybX0gd2FzIG5vdCBkZWZpbmVkIGFuZCB3YXMgaW5mZXJyZWQgYXMgJHt0YXJnZXRUeXBlfS5cbkhpbnQ6IElmIHBvc3NpYmxlLCB0cnkgdG8gbWFpbnRhaW4gdGhlIFR5cGUgcHJvcGVydHkgZm9yIGVhY2ggUmVjb3JkLlxuPEFubm90YXRpb25zIFRhcmdldD1cIiR7YW5ub3RhdGlvblRhcmdldH1cIj5cblx0PEFubm90YXRpb24gVGVybT1cIiR7YW5ub3RhdGlvbnNUZXJtfVwiPlxuXHRcdDxSZWNvcmQ+Li4uPC9SZWNvcmQ+XG5cdDwvQW5ub3RhdGlvbj5cbjwvQW5ub3RhdGlvbnM+YFxuICAgIH07XG4gICAgYWRkQW5ub3RhdGlvbkVycm9yTWVzc2FnZShhbm5vdGF0aW9uVGFyZ2V0ICsgJy8nICsgYW5ub3RhdGlvbnNUZXJtLCBvRXJyb3JNc2cpO1xuICAgIHJldHVybiB0YXJnZXRUeXBlO1xufVxuZnVuY3Rpb24gaXNEYXRhRmllbGRXaXRoRm9yQWN0aW9uKGFubm90YXRpb25Db250ZW50LCBhbm5vdGF0aW9uVGVybSkge1xuICAgIHJldHVybiAoYW5ub3RhdGlvbkNvbnRlbnQuaGFzT3duUHJvcGVydHkoJ0FjdGlvbicpICYmXG4gICAgICAgIChhbm5vdGF0aW9uVGVybS4kVHlwZSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvbicgfHxcbiAgICAgICAgICAgIGFubm90YXRpb25UZXJtLiRUeXBlID09PSAnY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkV2l0aEFjdGlvbicpKTtcbn1cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkVHlwZShyZWNvcmREZWZpbml0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IHRhcmdldFR5cGU7XG4gICAgaWYgKCFyZWNvcmREZWZpbml0aW9uLnR5cGUgJiYgY29udGV4dC5jdXJyZW50VGVybSkge1xuICAgICAgICB0YXJnZXRUeXBlID0gaW5mZXJUeXBlRnJvbVRlcm0oY29udGV4dC5jdXJyZW50VGVybSwgY29udGV4dC5jdXJyZW50VGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXRUeXBlID0gKDAsIHV0aWxzXzEudW5hbGlhcykoY29udGV4dC5yYXdNZXRhZGF0YS5yZWZlcmVuY2VzLCByZWNvcmREZWZpbml0aW9uLnR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0VHlwZTtcbn1cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKHJlY29yZERlZmluaXRpb24sIGN1cnJlbnRGUU4sIG9iamVjdE1hcCwgY29udGV4dCkge1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBwYXJzZVJlY29yZFR5cGUocmVjb3JkRGVmaW5pdGlvbiwgY29udGV4dCk7XG4gICAgY29uc3QgYW5ub3RhdGlvblRlcm0gPSB7XG4gICAgICAgICRUeXBlOiB0YXJnZXRUeXBlLFxuICAgICAgICBmdWxseVF1YWxpZmllZE5hbWU6IGN1cnJlbnRGUU5cbiAgICB9O1xuICAgIGNvbnN0IGFubm90YXRpb25Db250ZW50ID0ge307XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjb3JkRGVmaW5pdGlvbi5hbm5vdGF0aW9ucykpIHtcbiAgICAgICAgY29uc3Qgc3ViQW5ub3RhdGlvbkxpc3QgPSB7XG4gICAgICAgICAgICB0YXJnZXQ6IGN1cnJlbnRGUU4sXG4gICAgICAgICAgICBhbm5vdGF0aW9uczogcmVjb3JkRGVmaW5pdGlvbi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIF9fc291cmNlOiBjb250ZXh0LmN1cnJlbnRTb3VyY2VcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5hZGRpdGlvbmFsQW5ub3RhdGlvbnMucHVzaChzdWJBbm5vdGF0aW9uTGlzdCk7XG4gICAgfVxuICAgIGlmIChyZWNvcmREZWZpbml0aW9uLnByb3BlcnR5VmFsdWVzKSB7XG4gICAgICAgIHJlY29yZERlZmluaXRpb24ucHJvcGVydHlWYWx1ZXMuZm9yRWFjaCgocHJvcGVydHlWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnRbcHJvcGVydHlWYWx1ZS5uYW1lXSA9IHBhcnNlVmFsdWUocHJvcGVydHlWYWx1ZS52YWx1ZSwgYCR7Y3VycmVudEZRTn0vJHtwcm9wZXJ0eVZhbHVlLm5hbWV9YCwgb2JqZWN0TWFwLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQW5ub3RhdGlvbkxpc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogYCR7Y3VycmVudEZRTn0vJHtwcm9wZXJ0eVZhbHVlLm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHByb3BlcnR5VmFsdWUuYW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIF9fc291cmNlOiBjb250ZXh0LmN1cnJlbnRTb3VyY2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkaXRpb25hbEFubm90YXRpb25zLnB1c2goc3ViQW5ub3RhdGlvbkxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRGF0YUZpZWxkV2l0aEZvckFjdGlvbihhbm5vdGF0aW9uQ29udGVudCwgYW5ub3RhdGlvblRlcm0pKSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uVGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQuY3VycmVudFRhcmdldC5hY3Rpb25zICYmIGNvbnRleHQuY3VycmVudFRhcmdldC5hY3Rpb25zW2Fubm90YXRpb25Db250ZW50LkFjdGlvbl0pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RNYXBbYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uXTtcbiAgICAgICAgICAgICAgICBpZiAoIWFubm90YXRpb25Db250ZW50LkFjdGlvblRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gZGlhZ25vc3RpY3MgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIEFOTk9UQVRJT05fRVJST1JTLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byByZXNvbHZlIHRoZSBhY3Rpb24gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNvbnRlbnQuQWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRlZmluZWQgZm9yICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UZXJtLmZ1bGx5UXVhbGlmaWVkTmFtZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhbm5vdGF0aW9uVGVybSwgYW5ub3RhdGlvbkNvbnRlbnQpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSBvciBpbmZlciB0aGUgY29sbGVjdGlvbiB0eXBlIGJhc2VkIG9uIGl0cyBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBjb2xsZWN0aW9uRGVmaW5pdGlvblxuICogQHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3JJbmZlckNvbGxlY3Rpb25UeXBlKGNvbGxlY3Rpb25EZWZpbml0aW9uKSB7XG4gICAgbGV0IHR5cGUgPSBjb2xsZWN0aW9uRGVmaW5pdGlvbi50eXBlO1xuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgJiYgY29sbGVjdGlvbkRlZmluaXRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdENvbEl0ZW0gPSBjb2xsZWN0aW9uRGVmaW5pdGlvblswXTtcbiAgICAgICAgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgnUHJvcGVydHlQYXRoJykpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnUHJvcGVydHlQYXRoJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoJ1BhdGgnKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdQYXRoJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaXJzdENvbEl0ZW0uaGFzT3duUHJvcGVydHkoJ0Fubm90YXRpb25QYXRoJykpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnQW5ub3RhdGlvblBhdGgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpcnN0Q29sSXRlbS5oYXNPd25Qcm9wZXJ0eSgnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcpKSB7XG4gICAgICAgICAgICB0eXBlID0gJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBmaXJzdENvbEl0ZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCd0eXBlJykgfHwgZmlyc3RDb2xJdGVtLmhhc093blByb3BlcnR5KCdwcm9wZXJ0eVZhbHVlcycpKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdSZWNvcmQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBmaXJzdENvbEl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0eXBlID0gJ1N0cmluZyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHR5cGUgPSAnRW1wdHlDb2xsZWN0aW9uJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG59XG5mdW5jdGlvbiBwYXJzZUNvbGxlY3Rpb24oY29sbGVjdGlvbkRlZmluaXRpb24sIHBhcmVudEZRTiwgb2JqZWN0TWFwLCBjb250ZXh0KSB7XG4gICAgY29uc3QgY29sbGVjdGlvbkRlZmluaXRpb25UeXBlID0gZ2V0T3JJbmZlckNvbGxlY3Rpb25UeXBlKGNvbGxlY3Rpb25EZWZpbml0aW9uKTtcbiAgICBzd2l0Y2ggKGNvbGxlY3Rpb25EZWZpbml0aW9uVHlwZSkge1xuICAgICAgICBjYXNlICdQcm9wZXJ0eVBhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocHJvcGVydHlQYXRoLCBwcm9wZXJ0eUlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlQYXRoLlByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7cHJvcGVydHlJZHh9YCxcbiAgICAgICAgICAgICAgICAgICAgJHRhcmdldDogX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjb250ZXh0LmN1cnJlbnRUYXJnZXQsIHByb3BlcnR5UGF0aC5Qcm9wZXJ0eVBhdGgsIGZhbHNlLCBmYWxzZSwgY29udGV4dC5jdXJyZW50VGVybSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgocGF0aFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9IF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgY29udGV4dC5jdXJyZW50VGFyZ2V0LCBwYXRoVmFsdWUuUGF0aCwgdHJ1ZSwgZmFsc2UsIGNvbnRleHQuY3VycmVudFRlcm0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBuZXcgUGF0aChwYXRoVmFsdWUsICR0YXJnZXQsIGNvbnRleHQuY3VycmVudFRlcm0sICcnKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnVucmVzb2x2ZWRBbm5vdGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiBpc0Fubm90YXRpb25QYXRoKHBhdGhWYWx1ZS5QYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgdG9SZXNvbHZlOiBwYXRoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnQW5ub3RhdGlvblBhdGgnOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoYW5ub3RhdGlvblBhdGgsIGFubm90YXRpb25JZHgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uVGFyZ2V0ID0gX3Jlc29sdmVUYXJnZXQob2JqZWN0TWFwLCBjb250ZXh0LmN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25QYXRoLkFubm90YXRpb25QYXRoLCB0cnVlLCBmYWxzZSwgY29udGV4dC5jdXJyZW50VGVybSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkNvbGxlY3Rpb25FbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW5ub3RhdGlvblBhdGguQW5ub3RhdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7cGFyZW50RlFOfS8ke2Fubm90YXRpb25JZHh9YCxcbiAgICAgICAgICAgICAgICAgICAgJHRhcmdldDogYW5ub3RhdGlvblRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNUZXJtOiBjb250ZXh0LmN1cnJlbnRUZXJtLFxuICAgICAgICAgICAgICAgICAgICB0ZXJtOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRleHQudW5yZXNvbHZlZEFubm90YXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0b1Jlc29sdmU6IGFubm90YXRpb25Db2xsZWN0aW9uRWxlbWVudFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ29sbGVjdGlvbkVsZW1lbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc6XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChuYXZQcm9wZXJ0eVBhdGgsIG5hdlByb3BJZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuYXZQcm9wZXJ0eVBhdGguTmF2aWdhdGlvblByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtwYXJlbnRGUU59LyR7bmF2UHJvcElkeH1gLFxuICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0OiBfcmVzb2x2ZVRhcmdldChvYmplY3RNYXAsIGNvbnRleHQuY3VycmVudFRhcmdldCwgbmF2UHJvcGVydHlQYXRoLk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsIGZhbHNlLCBmYWxzZSwgY29udGV4dC5jdXJyZW50VGVybSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ1JlY29yZCc6XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChyZWNvcmREZWZpbml0aW9uLCByZWNvcmRJZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmQocmVjb3JkRGVmaW5pdGlvbiwgYCR7cGFyZW50RlFOfS8ke3JlY29yZElkeH1gLCBvYmplY3RNYXAsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ0FwcGx5JzpcbiAgICAgICAgY2FzZSAnTnVsbCc6XG4gICAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgY2FzZSAnRXEnOlxuICAgICAgICBjYXNlICdOZSc6XG4gICAgICAgIGNhc2UgJ0x0JzpcbiAgICAgICAgY2FzZSAnR3QnOlxuICAgICAgICBjYXNlICdMZSc6XG4gICAgICAgIGNhc2UgJ0dlJzpcbiAgICAgICAgY2FzZSAnTm90JzpcbiAgICAgICAgY2FzZSAnQW5kJzpcbiAgICAgICAgY2FzZSAnT3InOlxuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25EZWZpbml0aW9uLm1hcCgoaWZWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZlZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbkRlZmluaXRpb24ubWFwKChzdHJpbmdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RyaW5nVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUuU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25EZWZpbml0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnZlcnRBbm5vdGF0aW9uKGFubm90YXRpb24sIG9iamVjdE1hcCwgY29udGV4dCkge1xuICAgIGlmIChhbm5vdGF0aW9uLnJlY29yZCkge1xuICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmQoYW5ub3RhdGlvbi5yZWNvcmQsIGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lLCBvYmplY3RNYXAsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmNvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWUoYW5ub3RhdGlvbi52YWx1ZSwgYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUsIG9iamVjdE1hcCwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHBhcnNlQ29sbGVjdGlvbihhbm5vdGF0aW9uLmNvbGxlY3Rpb24sIGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lLCBvYmplY3RNYXAsIGNvbnRleHQpO1xuICAgICAgICBjb2xsZWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY2FzZScpO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIHJlc29sdmVQYXRoIGZ1bmN0aW9uIGZvciBhIGdpdmVuIGVudGl0eVR5cGUuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY3JlYXRlZFxuICogQHBhcmFtIG9iamVjdE1hcCBUaGUgY3VycmVudCBvYmplY3RNYXBcbiAqIEByZXR1cm5zIHRoZSByZXNvbHZlUGF0aCBmdW5jdGlvbiB0aGF0IHN0YXJ0cyBhdCB0aGUgZW50aXR5VHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVSZXNvbHZlUGF0aEZuKGVudGl0eVR5cGUsIG9iamVjdE1hcCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBpbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblRlcm0gPSAnJztcbiAgICAgICAgcmV0dXJuIF9yZXNvbHZlVGFyZ2V0KG9iamVjdE1hcCwgZW50aXR5VHlwZSwgcmVsYXRpdmVQYXRoLCBmYWxzZSwgaW5jbHVkZVZpc2l0ZWRPYmplY3RzLCBhbm5vdGF0aW9uVGVybSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVWMk5hdmlnYXRpb25Qcm9wZXJ0eShuYXZQcm9wLCBhc3NvY2lhdGlvbnMsIG9iamVjdE1hcCwgb3V0TmF2UHJvcCkge1xuICAgIGNvbnN0IHRhcmdldEFzc29jaWF0aW9uID0gYXNzb2NpYXRpb25zLmZpbmQoKGFzc29jaWF0aW9uKSA9PiBhc3NvY2lhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUgPT09IG5hdlByb3AucmVsYXRpb25zaGlwKTtcbiAgICBpZiAodGFyZ2V0QXNzb2NpYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25FbmQgPSB0YXJnZXRBc3NvY2lhdGlvbi5hc3NvY2lhdGlvbkVuZC5maW5kKChlbmQpID0+IGVuZC5yb2xlID09PSBuYXZQcm9wLnRvUm9sZSk7XG4gICAgICAgIGlmIChhc3NvY2lhdGlvbkVuZCkge1xuICAgICAgICAgICAgb3V0TmF2UHJvcC50YXJnZXRUeXBlID0gb2JqZWN0TWFwW2Fzc29jaWF0aW9uRW5kLnR5cGVdO1xuICAgICAgICAgICAgb3V0TmF2UHJvcC5pc0NvbGxlY3Rpb24gPSBhc3NvY2lhdGlvbkVuZC5tdWx0aXBsaWNpdHkgPT09ICcqJztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVWNE5hdmlnYXRpb25Qcm9wZXJ0eShuYXZQcm9wLCBvYmplY3RNYXAsIG91dE5hdlByb3ApIHtcbiAgICBvdXROYXZQcm9wLnRhcmdldFR5cGUgPSBvYmplY3RNYXBbbmF2UHJvcC50YXJnZXRUeXBlTmFtZV07XG4gICAgb3V0TmF2UHJvcC5wYXJ0bmVyID0gbmF2UHJvcC5wYXJ0bmVyO1xuICAgIG91dE5hdlByb3AuaXNDb2xsZWN0aW9uID0gbmF2UHJvcC5pc0NvbGxlY3Rpb247XG4gICAgb3V0TmF2UHJvcC5jb250YWluc1RhcmdldCA9IG5hdlByb3AuY29udGFpbnNUYXJnZXQ7XG4gICAgb3V0TmF2UHJvcC5yZWZlcmVudGlhbENvbnN0cmFpbnQgPSBuYXZQcm9wLnJlZmVyZW50aWFsQ29uc3RyYWludDtcbn1cbmZ1bmN0aW9uIGlzVjROYXZpZ2F0aW9uUHJvcGVydHkobmF2UHJvcCkge1xuICAgIHJldHVybiAhIW5hdlByb3AudGFyZ2V0VHlwZU5hbWU7XG59XG5mdW5jdGlvbiBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMobmF2aWdhdGlvblByb3BlcnRpZXMsIGFzc29jaWF0aW9ucywgb2JqZWN0TWFwKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0aWVzLm1hcCgobmF2UHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBvdXROYXZQcm9wID0ge1xuICAgICAgICAgICAgX3R5cGU6ICdOYXZpZ2F0aW9uUHJvcGVydHknLFxuICAgICAgICAgICAgbmFtZTogbmF2UHJvcC5uYW1lLFxuICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lOiBuYXZQcm9wLmZ1bGx5UXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgIGlzQ29sbGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBjb250YWluc1RhcmdldDogZmFsc2UsXG4gICAgICAgICAgICByZWZlcmVudGlhbENvbnN0cmFpbnQ6IFtdLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHt9LFxuICAgICAgICAgICAgcGFydG5lcjogJycsXG4gICAgICAgICAgICB0YXJnZXRUeXBlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0YXJnZXRUeXBlTmFtZTogJydcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlzVjROYXZpZ2F0aW9uUHJvcGVydHkobmF2UHJvcCkpIHtcbiAgICAgICAgICAgIHJlc29sdmVWNE5hdmlnYXRpb25Qcm9wZXJ0eShuYXZQcm9wLCBvYmplY3RNYXAsIG91dE5hdlByb3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZVYyTmF2aWdhdGlvblByb3BlcnR5KG5hdlByb3AsIGFzc29jaWF0aW9ucywgb2JqZWN0TWFwLCBvdXROYXZQcm9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0TmF2UHJvcC50YXJnZXRUeXBlKSB7XG4gICAgICAgICAgICBvdXROYXZQcm9wLnRhcmdldFR5cGVOYW1lID0gb3V0TmF2UHJvcC50YXJnZXRUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3RNYXBbb3V0TmF2UHJvcC5mdWxseVF1YWxpZmllZE5hbWVdID0gb3V0TmF2UHJvcDtcbiAgICAgICAgcmV0dXJuIG91dE5hdlByb3A7XG4gICAgfSk7XG59XG4vKipcbiAqIEBwYXJhbSBlbnRpdHlUeXBlc1xuICogQHBhcmFtIGFzc29jaWF0aW9uc1xuICogQHBhcmFtIG9iamVjdE1hcFxuICovXG5mdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvblByb3BlcnRpZXMoZW50aXR5VHlwZXMsIGFzc29jaWF0aW9ucywgb2JqZWN0TWFwKSB7XG4gICAgZW50aXR5VHlwZXMuZm9yRWFjaCgoZW50aXR5VHlwZSkgPT4ge1xuICAgICAgICBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gcHJlcGFyZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMsIGFzc29jaWF0aW9ucywgb2JqZWN0TWFwKTtcbiAgICAgICAgZW50aXR5VHlwZS5yZXNvbHZlUGF0aCA9IGNyZWF0ZVJlc29sdmVQYXRoRm4oZW50aXR5VHlwZSwgb2JqZWN0TWFwKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQHBhcmFtIG5hbWVzcGFjZVxuICogQHBhcmFtIGFjdGlvbnNcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqL1xuZnVuY3Rpb24gbGlua0FjdGlvbnNUb0VudGl0eVR5cGUobmFtZXNwYWNlLCBhY3Rpb25zLCBvYmplY3RNYXApIHtcbiAgICBhY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICBpZiAoIWFjdGlvbi5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgYWN0aW9uLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbi5pc0JvdW5kKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VFbnRpdHlUeXBlID0gb2JqZWN0TWFwW2FjdGlvbi5zb3VyY2VUeXBlXTtcbiAgICAgICAgICAgIGFjdGlvbi5zb3VyY2VFbnRpdHlUeXBlID0gc291cmNlRW50aXR5VHlwZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VFbnRpdHlUeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VFbnRpdHlUeXBlLmFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRW50aXR5VHlwZS5hY3Rpb25zID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvdXJjZUVudGl0eVR5cGUuYWN0aW9uc1thY3Rpb24ubmFtZV0gPSBhY3Rpb247XG4gICAgICAgICAgICAgICAgc291cmNlRW50aXR5VHlwZS5hY3Rpb25zW2Ake25hbWVzcGFjZX0uJHthY3Rpb24ubmFtZX1gXSA9IGFjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlID0gb2JqZWN0TWFwW2FjdGlvbi5yZXR1cm5UeXBlXTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBAcGFyYW0gZW50aXR5U2V0c1xuICogQHBhcmFtIG9iamVjdE1hcFxuICogQHBhcmFtIHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gbGlua0VudGl0eVR5cGVUb0VudGl0eVNldChlbnRpdHlTZXRzLCBvYmplY3RNYXAsIHJlZmVyZW5jZXMpIHtcbiAgICBlbnRpdHlTZXRzLmZvckVhY2goKGVudGl0eVNldCkgPT4ge1xuICAgICAgICBlbnRpdHlTZXQuZW50aXR5VHlwZSA9IG9iamVjdE1hcFtlbnRpdHlTZXQuZW50aXR5VHlwZU5hbWVdO1xuICAgICAgICBpZiAoIWVudGl0eVNldC5lbnRpdHlUeXBlKSB7XG4gICAgICAgICAgICBlbnRpdHlTZXQuZW50aXR5VHlwZSA9IG9iamVjdE1hcFsoMCwgdXRpbHNfMS51bmFsaWFzKShyZWZlcmVuY2VzLCBlbnRpdHlTZXQuZW50aXR5VHlwZU5hbWUpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudGl0eVNldC5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgZW50aXR5U2V0LmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRpdHlTZXQuZW50aXR5VHlwZS5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgZW50aXR5U2V0LmVudGl0eVR5cGUuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbnRpdHlTZXQuZW50aXR5VHlwZS5rZXlzLmZvckVhY2goKGtleVByb3ApID0+IHtcbiAgICAgICAgICAgIGtleVByb3AuaXNLZXkgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8qKlxuICogQHBhcmFtIHNpbmdsZXRvbnNcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqIEBwYXJhbSByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGxpbmtFbnRpdHlUeXBlVG9TaW5nbGV0b24oc2luZ2xldG9ucywgb2JqZWN0TWFwLCByZWZlcmVuY2VzKSB7XG4gICAgc2luZ2xldG9ucy5mb3JFYWNoKChzaW5nbGV0b24pID0+IHtcbiAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUgPSBvYmplY3RNYXBbc2luZ2xldG9uLmVudGl0eVR5cGVOYW1lXTtcbiAgICAgICAgaWYgKCFzaW5nbGV0b24uZW50aXR5VHlwZSkge1xuICAgICAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUgPSBvYmplY3RNYXBbKDAsIHV0aWxzXzEudW5hbGlhcykocmVmZXJlbmNlcywgc2luZ2xldG9uLmVudGl0eVR5cGVOYW1lKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaW5nbGV0b24uYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHNpbmdsZXRvbi5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2luZ2xldG9uLmVudGl0eVR5cGUuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHNpbmdsZXRvbi5lbnRpdHlUeXBlLmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgc2luZ2xldG9uLmVudGl0eVR5cGUua2V5cy5mb3JFYWNoKChrZXlQcm9wKSA9PiB7XG4gICAgICAgICAgICBrZXlQcm9wLmlzS2V5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIEBwYXJhbSBlbnRpdHlUeXBlc1xuICogQHBhcmFtIG9iamVjdE1hcFxuICovXG5mdW5jdGlvbiBsaW5rUHJvcGVydGllc1RvQ29tcGxleFR5cGVzKGVudGl0eVR5cGVzLCBvYmplY3RNYXApIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaW5rKHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghcHJvcGVydHkuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5LmFubm90YXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS50eXBlLmluZGV4T2YoJ0VkbScpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS50eXBlLnN0YXJ0c1dpdGgoJ0NvbGxlY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4VHlwZU5hbWUgPSBwcm9wZXJ0eS50eXBlLnN1YnN0cmluZygxMSwgcHJvcGVydHkudHlwZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGUgPSBvYmplY3RNYXBbY29tcGxleFR5cGVOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlID0gb2JqZWN0TWFwW3Byb3BlcnR5LnR5cGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkudGFyZ2V0VHlwZSA9IGNvbXBsZXhUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGUucHJvcGVydGllcy5mb3JFYWNoKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChzRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvcGVydHkgVHlwZSBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVudGl0eVR5cGVzLmZvckVhY2goKGVudGl0eVR5cGUpID0+IHtcbiAgICAgICAgZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZvckVhY2gobGluayk7XG4gICAgfSk7XG59XG4vKipcbiAqIEBwYXJhbSBjb21wbGV4VHlwZXNcbiAqIEBwYXJhbSBhc3NvY2lhdGlvbnNcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUNvbXBsZXhUeXBlcyhjb21wbGV4VHlwZXMsIGFzc29jaWF0aW9ucywgb2JqZWN0TWFwKSB7XG4gICAgY29tcGxleFR5cGVzLmZvckVhY2goKGNvbXBsZXhUeXBlKSA9PiB7XG4gICAgICAgIGNvbXBsZXhUeXBlLmFubm90YXRpb25zID0ge307XG4gICAgICAgIGNvbXBsZXhUeXBlLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5hbm5vdGF0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMgPSBwcmVwYXJlTmF2aWdhdGlvblByb3BlcnRpZXMoY29tcGxleFR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMsIGFzc29jaWF0aW9ucywgb2JqZWN0TWFwKTtcbiAgICB9KTtcbn1cbi8qKlxuICogU3BsaXQgdGhlIGFsaWFzIGZyb20gdGhlIHRlcm0gdmFsdWUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZXNcbiAqIEBwYXJhbSB0ZXJtVmFsdWUgdGhlIHZhbHVlIG9mIHRoZSB0ZXJtXG4gKiBAcmV0dXJucyB0aGUgdGVybSBhbGlhcyBhbmQgdGhlIGFjdHVhbCB0ZXJtIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHNwbGl0VGVybShyZWZlcmVuY2VzLCB0ZXJtVmFsdWUpIHtcbiAgICBjb25zdCBhbGlhc2VkVGVybSA9ICgwLCB1dGlsc18xLmFsaWFzKShyZWZlcmVuY2VzLCB0ZXJtVmFsdWUpO1xuICAgIGNvbnN0IGxhc3REb3QgPSBhbGlhc2VkVGVybS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IHRlcm1BbGlhcyA9IGFsaWFzZWRUZXJtLnN1YnN0cmluZygwLCBsYXN0RG90KTtcbiAgICBjb25zdCB0ZXJtID0gYWxpYXNlZFRlcm0uc3Vic3RyaW5nKGxhc3REb3QgKyAxKTtcbiAgICByZXR1cm4gW3Rlcm1BbGlhcywgdGVybV07XG59XG4vKipcbiAqIENyZWF0ZXMgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCByZXNvbHZlIGEgc3BlY2lmaWMgcGF0aC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVkT3V0cHV0XG4gKiBAcGFyYW0gb2JqZWN0TWFwXG4gKiBAcmV0dXJucyB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGFsbG93IHRvIHJlc29sdmUgZWxlbWVudCBnbG9iYWxseS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlR2xvYmFsUmVzb2x2ZShjb252ZXJ0ZWRPdXRwdXQsIG9iamVjdE1hcCkge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXNvbHZlUGF0aChzUGF0aCkge1xuICAgICAgICBjb25zdCBhUGF0aFNwbGl0ID0gc1BhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGFQYXRoU3BsaXQuc2hpZnQoKSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRlYWwgd2l0aCByZWxhdGl2ZSBwYXRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50aXR5U2V0TmFtZSA9IGFQYXRoU3BsaXQuc2hpZnQoKTtcbiAgICAgICAgY29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkT3V0cHV0LmVudGl0eVNldHMuZmluZCgoZXQpID0+IGV0Lm5hbWUgPT09IGVudGl0eVNldE5hbWUpO1xuICAgICAgICBpZiAoIWVudGl0eVNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGNvbnZlcnRlZE91dHB1dC5lbnRpdHlDb250YWluZXIsXG4gICAgICAgICAgICAgICAgb2JqZWN0UGF0aDogW2NvbnZlcnRlZE91dHB1dC5lbnRpdHlDb250YWluZXJdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChhUGF0aFNwbGl0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eVNldCxcbiAgICAgICAgICAgICAgICBvYmplY3RQYXRoOiBbY29udmVydGVkT3V0cHV0LmVudGl0eUNvbnRhaW5lciwgZW50aXR5U2V0XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFJlc29sdXRpb24gPSBfcmVzb2x2ZVRhcmdldChvYmplY3RNYXAsIGVudGl0eVNldCwgJy8nICsgYVBhdGhTcGxpdC5qb2luKCcvJyksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFJlc29sdXRpb24udmlzaXRlZE9iamVjdHMucHVzaCh0YXJnZXRSZXNvbHV0aW9uLnRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0UmVzb2x1dGlvbi50YXJnZXQsXG4gICAgICAgICAgICAgICAgb2JqZWN0UGF0aDogdGFyZ2V0UmVzb2x1dGlvbi52aXNpdGVkT2JqZWN0c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBlbnN1cmVBbm5vdGF0aW9ucyhjdXJyZW50VGFyZ2V0LCB2b2NBbGlhcykge1xuICAgIGlmICghY3VycmVudFRhcmdldC5hbm5vdGF0aW9ucykge1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zID0ge307XG4gICAgfVxuICAgIGlmICghY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc10pIHtcbiAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc10gPSB7fTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zLl9hbm5vdGF0aW9ucykge1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zLl9hbm5vdGF0aW9ucyA9IHt9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHByb2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q29udGV4dCwgYW5ub3RhdGlvbkxpc3QsIG9iamVjdE1hcCwgYk92ZXJyaWRlRXhpc3RpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnRleHQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0TmFtZSA9IGN1cnJlbnRUYXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lO1xuICAgIGFubm90YXRpb25MaXN0LmFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY3VycmVudENvbnRleHQuY3VycmVudFNvdXJjZSA9IGFubm90YXRpb24uX19zb3VyY2UgfHwgYW5ub3RhdGlvbkxpc3QuX19zb3VyY2U7XG4gICAgICAgIGNvbnN0IFt2b2NBbGlhcywgdm9jVGVybV0gPSBzcGxpdFRlcm0odXRpbHNfMS5kZWZhdWx0UmVmZXJlbmNlcywgYW5ub3RhdGlvbi50ZXJtKTtcbiAgICAgICAgZW5zdXJlQW5ub3RhdGlvbnMoY3VycmVudFRhcmdldCwgdm9jQWxpYXMpO1xuICAgICAgICBjb25zdCB2b2NUZXJtV2l0aFF1YWxpZmllciA9IGAke3ZvY1Rlcm19JHthbm5vdGF0aW9uLnF1YWxpZmllciA/ICcjJyArIGFubm90YXRpb24ucXVhbGlmaWVyIDogJyd9YDtcbiAgICAgICAgaWYgKCFiT3ZlcnJpZGVFeGlzdGluZyAmJiAoKF9iID0gKF9hID0gY3VycmVudFRhcmdldC5hbm5vdGF0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW3ZvY0FsaWFzXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDb250ZXh0LmN1cnJlbnRUZXJtID0gYW5ub3RhdGlvbi50ZXJtO1xuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBjb252ZXJ0QW5ub3RhdGlvbihhbm5vdGF0aW9uLCBvYmplY3RNYXAsIGN1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctd3JhcHBlcnNcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPSBuZXcgU3RyaW5nKGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LXdyYXBwZXJzXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdID0gbmV3IEJvb2xlYW4oY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0udGVybSA9ICgwLCB1dGlsc18xLnVuYWxpYXMpKHV0aWxzXzEuZGVmYXVsdFJlZmVyZW5jZXMsIGAke3ZvY0FsaWFzfS4ke3ZvY1Rlcm19YCk7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0ucXVhbGlmaWVyID0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl0uX19zb3VyY2UgPSBjdXJyZW50Q29udGV4dC5jdXJyZW50U291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UYXJnZXQgPSBgJHtjdXJyZW50VGFyZ2V0TmFtZX1AJHsoMCwgdXRpbHNfMS51bmFsaWFzKSh1dGlsc18xLmRlZmF1bHRSZWZlcmVuY2VzLCB2b2NBbGlhcyArICcuJyArIHZvY1Rlcm1XaXRoUXVhbGlmaWVyKX1gO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uLmFubm90YXRpb25zKSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViQW5ub3RhdGlvbkxpc3QgPSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBhbm5vdGF0aW9uVGFyZ2V0LFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiBhbm5vdGF0aW9uLmFubm90YXRpb25zLFxuICAgICAgICAgICAgICAgIF9fc291cmNlOiBjdXJyZW50Q29udGV4dC5jdXJyZW50U291cmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuYWRkaXRpb25hbEFubm90YXRpb25zLnB1c2goc3ViQW5ub3RhdGlvbkxpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24uYW5ub3RhdGlvbnMgJiYgIWN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXS5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgY3VycmVudFRhcmdldC5hbm5vdGF0aW9uc1t2b2NBbGlhc11bdm9jVGVybVdpdGhRdWFsaWZpZXJdLmFubm90YXRpb25zID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zLl9hbm5vdGF0aW9uc1tgJHt2b2NBbGlhc30uJHt2b2NUZXJtV2l0aFF1YWxpZmllcn1gXSA9XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0LmFubm90YXRpb25zW3ZvY0FsaWFzXVt2b2NUZXJtV2l0aFF1YWxpZmllcl07XG4gICAgICAgIG9iamVjdE1hcFthbm5vdGF0aW9uVGFyZ2V0XSA9IGN1cnJlbnRUYXJnZXQuYW5ub3RhdGlvbnNbdm9jQWxpYXNdW3ZvY1Rlcm1XaXRoUXVhbGlmaWVyXTtcbiAgICB9KTtcbn1cbi8qKlxuICogUHJvY2VzcyBhbGwgdGhlIHVucmVzb2x2ZWQgdGFyZ2V0cyBzbyBmYXIgdG8gdHJ5IGFuZCBzZWUgaWYgdGhleSBhcmUgcmVzb2x2ZWFibGUgaW4gdGhlIGVuZC5cbiAqXG4gKiBAcGFyYW0gdW5yZXNvbHZlZFRhcmdldHNcbiAqIEBwYXJhbSBvYmplY3RNYXBcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1VucmVzb2x2ZWRUYXJnZXRzKHVucmVzb2x2ZWRUYXJnZXRzLCBvYmplY3RNYXApIHtcbiAgICB1bnJlc29sdmVkVGFyZ2V0cy5mb3JFYWNoKChyZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFRvUmVzb2x2ZSA9IHJlc29sdmFibGUudG9SZXNvbHZlO1xuICAgICAgICBjb25zdCB0YXJnZXRTdHIgPSB0YXJnZXRUb1Jlc29sdmUuJHRhcmdldDtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBvYmplY3RNYXBbdGFyZ2V0U3RyXTtcbiAgICAgICAgY29uc3QgeyBhbm5vdGF0aW9uc1Rlcm0sIGFubm90YXRpb25UeXBlIH0gPSB0YXJnZXRUb1Jlc29sdmU7XG4gICAgICAgIGRlbGV0ZSB0YXJnZXRUb1Jlc29sdmUuYW5ub3RhdGlvblR5cGU7XG4gICAgICAgIGRlbGV0ZSB0YXJnZXRUb1Jlc29sdmUuYW5ub3RhdGlvbnNUZXJtO1xuICAgICAgICBpZiAocmVzb2x2YWJsZS5pbmxpbmUgJiYgIShyZXNvbHZlZFRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgICAgICAgIC8vIGlubGluZSB0aGUgcmVzb2x2ZWQgdGFyZ2V0XG4gICAgICAgICAgICBsZXQga2V5cztcbiAgICAgICAgICAgIGZvciAoa2V5cyBpbiB0YXJnZXRUb1Jlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0VG9SZXNvbHZlW2tleXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXRUb1Jlc29sdmUsIHJlc29sdmVkVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFzc2lnbiB0aGUgcmVzb2x2ZWQgdGFyZ2V0XG4gICAgICAgICAgICB0YXJnZXRUb1Jlc29sdmUuJHRhcmdldCA9IHJlc29sdmVkVGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzb2x2ZWRUYXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldFRvUmVzb2x2ZS50YXJnZXRTdHJpbmcgPSB0YXJnZXRTdHI7XG4gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnNUZXJtICYmIGFubm90YXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb0Vycm9yTXNnID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIHJlc29sdmUgdGhlIHBhdGggZXhwcmVzc2lvbjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTdHIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0hpbnQ6IENoZWNrIGFuZCBjb3JyZWN0IHRoZSBwYXRoIHZhbHVlcyB1bmRlciB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgbWV0YWRhdGEgKGFubm90YXRpb24ueG1sIGZpbGUgb3IgQ0RTIGFubm90YXRpb25zIGZvciB0aGUgYXBwbGljYXRpb24pOiBcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1Rlcm0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8UmVjb3JkIFR5cGUgPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UeXBlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPEFubm90YXRpb25QYXRoID0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTdHIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlKHRhcmdldFN0ciwgb0Vycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGFyZ2V0VG9SZXNvbHZlLnRlcm07XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHRhcmdldFRvUmVzb2x2ZS5wYXRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1JbmZvID0gdGFyZ2V0U3RyID8gdGFyZ2V0U3RyLnNwbGl0KCcvJylbMF0gOiB0YXJnZXRTdHI7XG4gICAgICAgICAgICAgICAgY29uc3Qgb0Vycm9yTXNnID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIHJlc29sdmUgdGhlIHBhdGggZXhwcmVzc2lvbjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTdHIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0hpbnQ6IENoZWNrIGFuZCBjb3JyZWN0IHRoZSBwYXRoIHZhbHVlcyB1bmRlciB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgbWV0YWRhdGEgKGFubm90YXRpb24ueG1sIGZpbGUgb3IgQ0RTIGFubm90YXRpb25zIGZvciB0aGUgYXBwbGljYXRpb24pOiBcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8QW5ub3RhdGlvbiBUZXJtID0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtSW5mbyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxQcm9wZXJ0eVZhbHVlIFByb3BlcnR5ID0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICBQYXRoPSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgJz4nXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhZGRBbm5vdGF0aW9uRXJyb3JNZXNzYWdlKHRhcmdldFN0ciwgb0Vycm9yTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBNZXJnZSBhbm5vdGF0aW9uIGZyb20gZGlmZmVyZW50IHNvdXJjZSB0b2dldGhlciBieSBvdmVyd3JpdGluZyBhdCB0aGUgdGVybSBsZXZlbC5cbiAqXG4gKiBAcGFyYW0gcmF3TWV0YWRhdGFcbiAqIEByZXR1cm5zIHRoZSByZXN1bHRpbmcgbWVyZ2VkIGFubm90YXRpb25zXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQW5ub3RhdGlvbnMocmF3TWV0YWRhdGEpIHtcbiAgICBjb25zdCBhbm5vdGF0aW9uTGlzdFBlclRhcmdldCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJhd01ldGFkYXRhLnNjaGVtYS5hbm5vdGF0aW9ucykuZm9yRWFjaCgoYW5ub3RhdGlvblNvdXJjZSkgPT4ge1xuICAgICAgICByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnNbYW5ub3RhdGlvblNvdXJjZV0uZm9yRWFjaCgoYW5ub3RhdGlvbkxpc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gKDAsIHV0aWxzXzEudW5hbGlhcykocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KTtcbiAgICAgICAgICAgIGFubm90YXRpb25MaXN0Ll9fc291cmNlID0gYW5ub3RhdGlvblNvdXJjZTtcbiAgICAgICAgICAgIGlmICghYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXRbY3VycmVudFRhcmdldE5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczogYW5ub3RhdGlvbkxpc3QuYW5ub3RhdGlvbnMuY29uY2F0KCksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogY3VycmVudFRhcmdldE5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5fX3NvdXJjZSA9IGFubm90YXRpb25Tb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTGlzdC5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXS5hbm5vdGF0aW9ucy5maW5kSW5kZXgoKHJlZmVyZW5jZUFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmVmZXJlbmNlQW5ub3RhdGlvbi50ZXJtID09PSBhbm5vdGF0aW9uLnRlcm0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VBbm5vdGF0aW9uLnF1YWxpZmllciA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5fX3NvdXJjZSA9IGFubm90YXRpb25Tb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTGlzdFBlclRhcmdldFtjdXJyZW50VGFyZ2V0TmFtZV0uYW5ub3RhdGlvbnMuc3BsaWNlKGZpbmRJbmRleCwgMSwgYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTGlzdFBlclRhcmdldFtjdXJyZW50VGFyZ2V0TmFtZV0uYW5ub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYW5ub3RhdGlvbkxpc3RQZXJUYXJnZXQ7XG59XG4vKipcbiAqIENvbnZlcnQgYSBSYXdNZXRhZGF0YSBpbnRvIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiB0byBiZSB1c2VkIHRvIGVhc2lseSBuYXZpZ2F0ZSBhIG1ldGFkYXRhIG9iamVjdCBhbmQgaXRzIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHJhd01ldGFkYXRhXG4gKiBAcmV0dXJucyB0aGUgY29udmVydGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gY29udmVydChyYXdNZXRhZGF0YSkge1xuICAgIEFOTk9UQVRJT05fRVJST1JTID0gW107XG4gICAgY29uc3Qgb2JqZWN0TWFwID0gYnVpbGRPYmplY3RNYXAocmF3TWV0YWRhdGEpO1xuICAgIHJlc29sdmVOYXZpZ2F0aW9uUHJvcGVydGllcyhyYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5VHlwZXMsIHJhd01ldGFkYXRhLnNjaGVtYS5hc3NvY2lhdGlvbnMsIG9iamVjdE1hcCk7XG4gICAgcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eUNvbnRhaW5lci5hbm5vdGF0aW9ucyA9IHt9O1xuICAgIGxpbmtBY3Rpb25zVG9FbnRpdHlUeXBlKHJhd01ldGFkYXRhLnNjaGVtYS5uYW1lc3BhY2UsIHJhd01ldGFkYXRhLnNjaGVtYS5hY3Rpb25zLCBvYmplY3RNYXApO1xuICAgIGxpbmtFbnRpdHlUeXBlVG9FbnRpdHlTZXQocmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMsIG9iamVjdE1hcCwgcmF3TWV0YWRhdGEucmVmZXJlbmNlcyk7XG4gICAgbGlua0VudGl0eVR5cGVUb1NpbmdsZXRvbihyYXdNZXRhZGF0YS5zY2hlbWEuc2luZ2xldG9ucywgb2JqZWN0TWFwLCByYXdNZXRhZGF0YS5yZWZlcmVuY2VzKTtcbiAgICBsaW5rUHJvcGVydGllc1RvQ29tcGxleFR5cGVzKHJhd01ldGFkYXRhLnNjaGVtYS5lbnRpdHlUeXBlcywgb2JqZWN0TWFwKTtcbiAgICBwcmVwYXJlQ29tcGxleFR5cGVzKHJhd01ldGFkYXRhLnNjaGVtYS5jb21wbGV4VHlwZXMsIHJhd01ldGFkYXRhLnNjaGVtYS5hc3NvY2lhdGlvbnMsIG9iamVjdE1hcCk7XG4gICAgY29uc3QgdW5yZXNvbHZlZFRhcmdldHMgPSBbXTtcbiAgICBjb25zdCB1bnJlc29sdmVkQW5ub3RhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBhbm5vdGF0aW9uTGlzdFBlclRhcmdldCA9IG1lcmdlQW5ub3RhdGlvbnMocmF3TWV0YWRhdGEpO1xuICAgIE9iamVjdC5rZXlzKGFubm90YXRpb25MaXN0UGVyVGFyZ2V0KS5mb3JFYWNoKChjdXJyZW50VGFyZ2V0TmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uTGlzdCA9IGFubm90YXRpb25MaXN0UGVyVGFyZ2V0W2N1cnJlbnRUYXJnZXROYW1lXTtcbiAgICAgICAgY29uc3Qgb2JqZWN0TWFwRWxlbWVudCA9IG9iamVjdE1hcFtjdXJyZW50VGFyZ2V0TmFtZV07XG4gICAgICAgIGlmICghb2JqZWN0TWFwRWxlbWVudCAmJiAoY3VycmVudFRhcmdldE5hbWUgPT09IG51bGwgfHwgY3VycmVudFRhcmdldE5hbWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1cnJlbnRUYXJnZXROYW1lLmluZGV4T2YoJ0AnKSkgPiAwKSB7XG4gICAgICAgICAgICB1bnJlc29sdmVkQW5ub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uTGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0TWFwRWxlbWVudCkge1xuICAgICAgICAgICAgbGV0IGFsbFRhcmdldHMgPSBbb2JqZWN0TWFwRWxlbWVudF07XG4gICAgICAgICAgICBsZXQgYk92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG9iamVjdE1hcEVsZW1lbnQuX3R5cGUgPT09ICdVbmJvdW5kR2VuZXJpY0FjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBhbGxUYXJnZXRzID0gb2JqZWN0TWFwRWxlbWVudC5hY3Rpb25zO1xuICAgICAgICAgICAgICAgIGJPdmVycmlkZUV4aXN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGxUYXJnZXRzLmZvckVhY2goKGN1cnJlbnRUYXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFubm90YXRpb25zOiB1bnJlc29sdmVkQW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2U6IGFubm90YXRpb25MaXN0Ll9fc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGVybTogJycsXG4gICAgICAgICAgICAgICAgICAgIHJhd01ldGFkYXRhOiByYXdNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZEFubm90YXRpb25zOiB1bnJlc29sdmVkVGFyZ2V0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDb250ZXh0LCBhbm5vdGF0aW9uTGlzdCwgb2JqZWN0TWFwLCBiT3ZlcnJpZGVFeGlzdGluZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4dHJhVW5yZXNvbHZlZEFubm90YXRpb25zID0gW107XG4gICAgdW5yZXNvbHZlZEFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb25MaXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXROYW1lID0gKDAsIHV0aWxzXzEudW5hbGlhcykocmF3TWV0YWRhdGEucmVmZXJlbmNlcywgYW5ub3RhdGlvbkxpc3QudGFyZ2V0KTtcbiAgICAgICAgbGV0IFtiYXNlT2JqLCBhbm5vdGF0aW9uUGFydF0gPSBjdXJyZW50VGFyZ2V0TmFtZS5zcGxpdCgnQCcpO1xuICAgICAgICBjb25zdCB0YXJnZXRTcGxpdCA9IGFubm90YXRpb25QYXJ0LnNwbGl0KCcvJyk7XG4gICAgICAgIGJhc2VPYmogPSBiYXNlT2JqICsgJ0AnICsgdGFyZ2V0U3BsaXRbMF07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSB0YXJnZXRTcGxpdC5zbGljZSgxKS5yZWR1Y2UoKGN1cnJlbnRPYmosIHBhdGgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50T2JqID09PSBudWxsIHx8IGN1cnJlbnRPYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1cnJlbnRPYmpbcGF0aF07XG4gICAgICAgIH0sIG9iamVjdE1hcFtiYXNlT2JqXSk7XG4gICAgICAgIGlmICghY3VycmVudFRhcmdldCB8fCB0eXBlb2YgY3VycmVudFRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIEFOTk9UQVRJT05fRVJST1JTLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgZm9sbG93aW5nIGFubm90YXRpb24gdGFyZ2V0IHdhcyBub3QgZm91bmQgb24gdGhlIHNlcnZpY2UgJyArIGN1cnJlbnRUYXJnZXROYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxBbm5vdGF0aW9uczogZXh0cmFVbnJlc29sdmVkQW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZTogYW5ub3RhdGlvbkxpc3QuX19zb3VyY2UsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGVybTogJycsXG4gICAgICAgICAgICAgICAgcmF3TWV0YWRhdGE6IHJhd01ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRBbm5vdGF0aW9uczogdW5yZXNvbHZlZFRhcmdldHNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwcm9jZXNzQW5ub3RhdGlvbnMoY3VycmVudENvbnRleHQsIGFubm90YXRpb25MaXN0LCBvYmplY3RNYXAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Nlc3NVbnJlc29sdmVkVGFyZ2V0cyh1bnJlc29sdmVkVGFyZ2V0cywgb2JqZWN0TWFwKTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIEFMTF9BTk5PVEFUSU9OX0VSUk9SUykge1xuICAgICAgICBBTk5PVEFUSU9OX0VSUk9SUy5wdXNoKEFMTF9BTk5PVEFUSU9OX0VSUk9SU1twcm9wZXJ0eV1bMF0pO1xuICAgIH1cbiAgICByYXdNZXRhZGF0YS5lbnRpdHlTZXRzID0gcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHM7XG4gICAgY29uc3QgZXh0cmFSZWZlcmVuY2VzID0gcmF3TWV0YWRhdGEucmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICByZXR1cm4gdXRpbHNfMS5kZWZhdWx0UmVmZXJlbmNlcy5maW5kKChkZWZhdWx0UmVmKSA9PiBkZWZhdWx0UmVmLm5hbWVzcGFjZSA9PT0gcmVmZXJlbmNlLm5hbWVzcGFjZSkgPT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICBjb25zdCBjb252ZXJ0ZWRPdXRwdXQgPSB7XG4gICAgICAgIHZlcnNpb246IHJhd01ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGFubm90YXRpb25zOiByYXdNZXRhZGF0YS5zY2hlbWEuYW5ub3RhdGlvbnMsXG4gICAgICAgIG5hbWVzcGFjZTogcmF3TWV0YWRhdGEuc2NoZW1hLm5hbWVzcGFjZSxcbiAgICAgICAgZW50aXR5Q29udGFpbmVyOiByYXdNZXRhZGF0YS5zY2hlbWEuZW50aXR5Q29udGFpbmVyLFxuICAgICAgICBhY3Rpb25zOiByYXdNZXRhZGF0YS5zY2hlbWEuYWN0aW9ucyxcbiAgICAgICAgZW50aXR5U2V0czogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVNldHMsXG4gICAgICAgIHNpbmdsZXRvbnM6IHJhd01ldGFkYXRhLnNjaGVtYS5zaW5nbGV0b25zLFxuICAgICAgICBlbnRpdHlUeXBlczogcmF3TWV0YWRhdGEuc2NoZW1hLmVudGl0eVR5cGVzLFxuICAgICAgICBjb21wbGV4VHlwZXM6IHJhd01ldGFkYXRhLnNjaGVtYS5jb21wbGV4VHlwZXMsXG4gICAgICAgIHR5cGVEZWZpbml0aW9uczogcmF3TWV0YWRhdGEuc2NoZW1hLnR5cGVEZWZpbml0aW9ucyxcbiAgICAgICAgcmVmZXJlbmNlczogdXRpbHNfMS5kZWZhdWx0UmVmZXJlbmNlcy5jb25jYXQoZXh0cmFSZWZlcmVuY2VzKSxcbiAgICAgICAgZGlhZ25vc3RpY3M6IEFOTk9UQVRJT05fRVJST1JTLmNvbmNhdCgpXG4gICAgfTtcbiAgICBjb252ZXJ0ZWRPdXRwdXQucmVzb2x2ZVBhdGggPSBjcmVhdGVHbG9iYWxSZXNvbHZlKGNvbnZlcnRlZE91dHB1dCwgb2JqZWN0TWFwKTtcbiAgICByZXR1cm4gY29udmVydGVkT3V0cHV0O1xufVxuZXhwb3J0cy5jb252ZXJ0ID0gY29udmVydDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnZlcnRlci5qcy5tYXBcblxuLyoqKi8gfSksXG5cbi8qKiovIDc1OTpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5fX2V4cG9ydFN0YXIoX193ZWJwYWNrX3JlcXVpcmVfXyg4NzUpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihfX3dlYnBhY2tfcmVxdWlyZV9fKDQyNiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKF9fd2VicGFja19yZXF1aXJlX18oNjkpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuXG4vKioqLyB9KSxcblxuLyoqKi8gNjk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmV4cG9ydHMuRGVjaW1hbCA9IGV4cG9ydHMuaXNDb21wbGV4VHlwZURlZmluaXRpb24gPSBleHBvcnRzLlRlcm1Ub1R5cGVzID0gZXhwb3J0cy51bmFsaWFzID0gZXhwb3J0cy5hbGlhcyA9IGV4cG9ydHMuZGVmYXVsdFJlZmVyZW5jZXMgPSB2b2lkIDA7XG5leHBvcnRzLmRlZmF1bHRSZWZlcmVuY2VzID0gW1xuICAgIHsgYWxpYXM6ICdDYXBhYmlsaXRpZXMnLCBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxJywgdXJpOiAnJyB9LFxuICAgIHsgYWxpYXM6ICdBZ2dyZWdhdGlvbicsIG5hbWVzcGFjZTogJ09yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMScsIHVyaTogJycgfSxcbiAgICB7IGFsaWFzOiAnVmFsaWRhdGlvbicsIG5hbWVzcGFjZTogJ09yZy5PRGF0YS5WYWxpZGF0aW9uLlYxJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnT3JnLk9EYXRhLkNvcmUuVjEnLCBhbGlhczogJ0NvcmUnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdPcmcuT0RhdGEuTWVhc3VyZXMuVjEnLCBhbGlhczogJ01lYXN1cmVzJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxJywgYWxpYXM6ICdDb21tb24nLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MScsIGFsaWFzOiAnVUknLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxJywgYWxpYXM6ICdTZXNzaW9uJywgdXJpOiAnJyB9LFxuICAgIHsgbmFtZXNwYWNlOiAnY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxJywgYWxpYXM6ICdBbmFseXRpY3MnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MScsIGFsaWFzOiAnQ29kZUxpc3QnLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEnLCBhbGlhczogJ1BlcnNvbmFsRGF0YScsIHVyaTogJycgfSxcbiAgICB7IG5hbWVzcGFjZTogJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEnLCBhbGlhczogJ0NvbW11bmljYXRpb24nLCB1cmk6ICcnIH0sXG4gICAgeyBuYW1lc3BhY2U6ICdjb20uc2FwLnZvY2FidWxhcmllcy5IVE1MNS52MScsIGFsaWFzOiAnSFRNTDUnLCB1cmk6ICcnIH1cbl07XG4vKipcbiAqIFRyYW5zZm9ybSBhbiB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFubm90YXRpb24gdG8gdGhlIGFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSB1bmFsaWFzZWRWYWx1ZSB0aGUgdW5hbGlhc2VkIHZhbHVlXG4gKiBAcmV0dXJucyB0aGUgYWxpYXNlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzYW1lXG4gKi9cbmZ1bmN0aW9uIGFsaWFzKHJlZmVyZW5jZXMsIHVuYWxpYXNlZFZhbHVlKSB7XG4gICAgaWYgKCFyZWZlcmVuY2VzLnJldmVyc2VSZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZXZlcnNlUmVmZXJlbmNlTWFwID0gcmVmZXJlbmNlcy5yZWR1Y2UoKG1hcCwgcmVmKSA9PiB7XG4gICAgICAgICAgICBtYXBbcmVmLm5hbWVzcGFjZV0gPSByZWY7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGlmICghdW5hbGlhc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHVuYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0RG90SW5kZXggPSB1bmFsaWFzZWRWYWx1ZS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHVuYWxpYXNlZFZhbHVlLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gdW5hbGlhc2VkVmFsdWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpO1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMucmV2ZXJzZVJlZmVyZW5jZU1hcFtuYW1lc3BhY2VdO1xuICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGAke3JlZmVyZW5jZS5hbGlhc30uJHt2YWx1ZX1gO1xuICAgIH1cbiAgICBlbHNlIGlmICh1bmFsaWFzZWRWYWx1ZS5pbmRleE9mKCdAJykgIT09IC0xKSB7XG4gICAgICAgIC8vIFRyeSB0byBzZWUgaWYgaXQncyBhbiBhbm5vdGF0aW9uIFBhdGggbGlrZSB0b19TYWxlc09yZGVyL0BVSS5MaW5lSXRlbVxuICAgICAgICBjb25zdCBbcHJlQWxpYXMsIC4uLnBvc3RBbGlhc10gPSB1bmFsaWFzZWRWYWx1ZS5zcGxpdCgnQCcpO1xuICAgICAgICByZXR1cm4gYCR7cHJlQWxpYXN9QCR7YWxpYXMocmVmZXJlbmNlcywgcG9zdEFsaWFzLmpvaW4oJ0AnKSl9YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmFsaWFzZWRWYWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmFsaWFzID0gYWxpYXM7XG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhbGlhc2VkIHN0cmluZyByZXByZXNlbnRhdGlvbiBhbm5vdGF0aW9uIHRvIHRoZSB1bmFsaWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyBjdXJyZW50UmVmZXJlbmNlcyBmb3IgdGhlIHByb2plY3RcbiAqIEBwYXJhbSBhbGlhc2VkVmFsdWUgdGhlIGFsaWFzZWQgdmFsdWVcbiAqIEByZXR1cm5zIHRoZSB1bmFsaWFzZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiB1bmFsaWFzKHJlZmVyZW5jZXMsIGFsaWFzZWRWYWx1ZSkge1xuICAgIGlmICghcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXApIHtcbiAgICAgICAgcmVmZXJlbmNlcy5yZWZlcmVuY2VNYXAgPSByZWZlcmVuY2VzLnJlZHVjZSgobWFwLCByZWYpID0+IHtcbiAgICAgICAgICAgIG1hcFtyZWYuYWxpYXNdID0gcmVmO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBpZiAoIWFsaWFzZWRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gYWxpYXNlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbdm9jQWxpYXMsIC4uLnZhbHVlXSA9IGFsaWFzZWRWYWx1ZS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXMucmVmZXJlbmNlTWFwW3ZvY0FsaWFzXTtcbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBgJHtyZWZlcmVuY2UubmFtZXNwYWNlfS4ke3ZhbHVlLmpvaW4oJy4nKX1gO1xuICAgIH1cbiAgICBlbHNlIGlmIChhbGlhc2VkVmFsdWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAvLyBUcnkgdG8gc2VlIGlmIGl0J3MgYW4gYW5ub3RhdGlvbiBQYXRoIGxpa2UgdG9fU2FsZXNPcmRlci9AVUkuTGluZUl0ZW1cbiAgICAgICAgY29uc3QgW3ByZUFsaWFzLCAuLi5wb3N0QWxpYXNdID0gYWxpYXNlZFZhbHVlLnNwbGl0KCdAJyk7XG4gICAgICAgIHJldHVybiBgJHtwcmVBbGlhc31AJHt1bmFsaWFzKHJlZmVyZW5jZXMsIHBvc3RBbGlhcy5qb2luKCdAJykpfWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxpYXNlZFZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMudW5hbGlhcyA9IHVuYWxpYXM7XG52YXIgVGVybVRvVHlwZXM7XG4oZnVuY3Rpb24gKFRlcm1Ub1R5cGVzKSB7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5TZWN1cml0eVNjaGVtZXNcIl0gPSBcIk9yZy5PRGF0YS5BdXRob3JpemF0aW9uLlYxLlNlY3VyaXR5U2NoZW1lXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQXV0aG9yaXphdGlvbi5WMS5BdXRob3JpemF0aW9uc1wiXSA9IFwiT3JnLk9EYXRhLkF1dGhvcml6YXRpb24uVjEuQXV0aG9yaXphdGlvblwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuUmV2aXNpb25zXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5SZXZpc2lvblR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLkxpbmtzXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5MaW5rXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ29yZS5WMS5FeGFtcGxlXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5FeGFtcGxlVmFsdWVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLk1lc3NhZ2VzXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5NZXNzYWdlVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuVmFsdWVFeGNlcHRpb25cIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlZhbHVlRXhjZXB0aW9uVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuUmVzb3VyY2VFeGNlcHRpb25cIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlJlc291cmNlRXhjZXB0aW9uVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuRGF0YU1vZGlmaWNhdGlvbkV4Y2VwdGlvblwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuRGF0YU1vZGlmaWNhdGlvbkV4Y2VwdGlvblR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLklzTGFuZ3VhZ2VEZXBlbmRlbnRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuRGVyZWZlcmVuY2VhYmxlSURzXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLkNvbnZlbnRpb25hbElEc1wiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ29yZS5WMS5QZXJtaXNzaW9uc1wiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuUGVybWlzc2lvblwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuRGVmYXVsdE5hbWVzcGFjZVwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWREZWZhdWx0VmFsdWVcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuSXNVUkxcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuSXNNZWRpYVR5cGVcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuQ29udGVudERpc3Bvc2l0aW9uXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5Db250ZW50RGlzcG9zaXRpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ29yZS5WMS5PcHRpbWlzdGljQ29uY3VycmVuY3lcIl0gPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLkFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLkF1dG9FeHBhbmRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuQXV0b0V4cGFuZFJlZmVyZW5jZXNcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuTWF5SW1wbGVtZW50XCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5RdWFsaWZpZWRUeXBlTmFtZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuT3JkZXJlZFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ29yZS5WMS5Qb3NpdGlvbmFsSW5zZXJ0XCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5Db3JlLlYxLkFsdGVybmF0ZUtleXNcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLkFsdGVybmF0ZUtleVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuT3B0aW9uYWxQYXJhbWV0ZXJcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLk9wdGlvbmFsUGFyYW1ldGVyVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlXCJdID0gXCJFZG0uQm9vbGVhblwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNvcmUuVjEuU3ltYm9saWNOYW1lXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5TaW1wbGVJZGVudGlmaWVyXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbmZvcm1hbmNlTGV2ZWxcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ29uZm9ybWFuY2VMZXZlbFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQXN5bmNocm9ub3VzUmVxdWVzdHNTdXBwb3J0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5CYXRjaENvbnRpbnVlT25FcnJvclN1cHBvcnRlZFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLklzb2xhdGlvblN1cHBvcnRlZFwiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Jc29sYXRpb25MZXZlbFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Dcm9zc0pvaW5TdXBwb3J0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DYWxsYmFja1N1cHBvcnRlZFwiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DYWxsYmFja1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2hhbmdlVHJhY2tpbmdcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ2hhbmdlVHJhY2tpbmdUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvdW50UmVzdHJpY3Rpb25zXCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvdW50UmVzdHJpY3Rpb25zVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zXCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk5hdmlnYXRpb25SZXN0cmljdGlvbnNUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluZGV4YWJsZUJ5S2V5XCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVG9wU3VwcG9ydGVkXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2tpcFN1cHBvcnRlZFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbXB1dGVTdXBwb3J0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWxlY3RTdXBwb3J0XCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlNlbGVjdFN1cHBvcnRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydGVkXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQmF0Y2hTdXBwb3J0XCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkJhdGNoU3VwcG9ydFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyUmVzdHJpY3Rpb25zXCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlclJlc3RyaWN0aW9uc1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU29ydFJlc3RyaWN0aW9uc1wiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Tb3J0UmVzdHJpY3Rpb25zVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5FeHBhbmRSZXN0cmljdGlvbnNcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRXhwYW5kUmVzdHJpY3Rpb25zVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5TZWFyY2hSZXN0cmljdGlvbnNcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuU2VhcmNoUmVzdHJpY3Rpb25zVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5LZXlBc1NlZ21lbnRTdXBwb3J0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5RdWVyeVNlZ21lbnRTdXBwb3J0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5zZXJ0UmVzdHJpY3Rpb25zVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwSW5zZXJ0U3VwcG9ydFwiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWVwSW5zZXJ0U3VwcG9ydFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuVXBkYXRlUmVzdHJpY3Rpb25zXCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLlVwZGF0ZVJlc3RyaWN0aW9uc1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVlcFVwZGF0ZVN1cHBvcnRcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRGVlcFVwZGF0ZVN1cHBvcnRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkRlbGV0ZVJlc3RyaWN0aW9uc1wiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5EZWxldGVSZXN0cmljdGlvbnNUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkNvbGxlY3Rpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uc1wiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5Db2xsZWN0aW9uUHJvcGVydHlSZXN0cmljdGlvbnNUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk9wZXJhdGlvblJlc3RyaWN0aW9uc1wiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5PcGVyYXRpb25SZXN0cmljdGlvbnNUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkFubm90YXRpb25WYWx1ZXNJblF1ZXJ5U3VwcG9ydGVkXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuTW9kaWZpY2F0aW9uUXVlcnlPcHRpb25zXCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk1vZGlmaWNhdGlvblF1ZXJ5T3B0aW9uc1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuUmVhZFJlc3RyaWN0aW9uc1wiXSA9IFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5SZWFkUmVzdHJpY3Rpb25zVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21IZWFkZXJzXCJdID0gXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkN1c3RvbVBhcmFtZXRlclwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5DdXN0b21RdWVyeU9wdGlvbnNcIl0gPSBcIk9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuQ3VzdG9tUGFyYW1ldGVyXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLk1lZGlhTG9jYXRpb25VcGRhdGVTdXBwb3J0ZWRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkFwcGx5U3VwcG9ydGVkXCJdID0gXCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuQXBwbHlTdXBwb3J0ZWRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuR3JvdXBhYmxlXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5BZ2dyZWdhdGFibGVcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNcIl0gPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5BZ2dyZWdhdGlvbi5WMS5MZXZlbGVkSGllcmFyY2h5XCJdID0gXCJFZG0uUHJvcGVydHlQYXRoXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuUmVjdXJzaXZlSGllcmFyY2h5XCJdID0gXCJPcmcuT0RhdGEuQWdncmVnYXRpb24uVjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkF2YWlsYWJsZU9uQWdncmVnYXRlc1wiXSA9IFwiT3JnLk9EYXRhLkFnZ3JlZ2F0aW9uLlYxLkF2YWlsYWJsZU9uQWdncmVnYXRlc1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW1cIl0gPSBcIkVkbS5QcmltaXRpdmVUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtXCJdID0gXCJFZG0uUHJpbWl0aXZlVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuRXhjbHVzaXZlXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkFsbG93ZWRWYWx1ZXNcIl0gPSBcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkFsbG93ZWRWYWx1ZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTXVsdGlwbGVPZlwiXSA9IFwiRWRtLkRlY2ltYWxcIjtcbiAgICBUZXJtVG9UeXBlc1tcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkNvbnN0cmFpbnRcIl0gPSBcIk9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLkNvbnN0cmFpbnRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5JdGVtc09mXCJdID0gXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5JdGVtc09mVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuT3BlblByb3BlcnR5VHlwZUNvbnN0cmFpbnRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFR5cGVOYW1lXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5EZXJpdmVkVHlwZUNvbnN0cmFpbnRcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFR5cGVOYW1lXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BbGxvd2VkVGVybXNcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFRlcm1OYW1lXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5BcHBsaWNhYmxlVGVybXNcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlF1YWxpZmllZFRlcm1OYW1lXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhJdGVtc1wiXSA9IFwiRWRtLkludDY0XCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5JdGVtc1wiXSA9IFwiRWRtLkludDY0XCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuTWVhc3VyZXMuVjEuU2NhbGVcIl0gPSBcIkVkbS5CeXRlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJPcmcuT0RhdGEuTWVhc3VyZXMuVjEuRHVyYXRpb25HcmFudWxhcml0eVwiXSA9IFwiT3JnLk9EYXRhLk1lYXN1cmVzLlYxLkR1cmF0aW9uR3JhbnVsYXJpdHlUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuRGltZW5zaW9uXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BY2N1bXVsYXRpdmVNZWFzdXJlXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5Sb2xsZWRVcFByb3BlcnR5Q291bnRcIl0gPSBcIkVkbS5JbnQxNlwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLlBsYW5uaW5nQWN0aW9uXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5BZ2dyZWdhdGVkUHJvcGVydGllc1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLkFnZ3JlZ2F0ZWRQcm9wZXJ0eVR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZXJ2aWNlVmVyc2lvblwiXSA9IFwiRWRtLkludDMyXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VydmljZVNjaGVtYVZlcnNpb25cIl0gPSBcIkVkbS5JbnQzMlwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRGb3JcIl0gPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0xhbmd1YWdlSWRlbnRpZmllclwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dEZvcm1hdFwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRGb3JtYXRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc1VwcGVyQ2FzZVwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDdXJyZW5jeVwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNVbml0XCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vbml0U3BlY2lmaWNTY2FsZVwiXSA9IFwiRWRtLlByaW1pdGl2ZVR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vbml0U3BlY2lmaWNQcmVjaXNpb25cIl0gPSBcIkVkbS5QcmltaXRpdmVUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2Vjb25kYXJ5S2V5XCJdID0gXCJFZG0uUHJvcGVydHlQYXRoXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWluT2NjdXJzXCJdID0gXCJFZG0uSW50NjRcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NYXhPY2N1cnNcIl0gPSBcIkVkbS5JbnQ2NFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFzc29jaWF0aW9uRW50aXR5XCJdID0gXCJFZG0uTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlcml2ZWROYXZpZ2F0aW9uXCJdID0gXCJFZG0uTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1hc2tlZFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWFza2VkQWx3YXlzXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdE1hcHBpbmdcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNJbnN0YW5jZUFubm90YXRpb25cIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnNcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGxpY2F0aW9uXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXBwbGljYXRpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGltZXN0YW1wXCJdID0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FcnJvclJlc29sdXRpb25cIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FcnJvclJlc29sdXRpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXNcIl0gPSBcIkVkbS5Db21wbGV4VHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLm51bWVyaWNTZXZlcml0eVwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk51bWVyaWNNZXNzYWdlU2V2ZXJpdHlUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWF4aW11bU51bWVyaWNNZXNzYWdlU2V2ZXJpdHlcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5OdW1lcmljTWVzc2FnZVNldmVyaXR5VHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQWN0aW9uQ3JpdGljYWxcIl0gPSBcIkVkbS5Cb29sZWFuXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQXR0cmlidXRlc1wiXSA9IFwiRWRtLlByb3BlcnR5UGF0aFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlbGF0ZWRSZWN1cnNpdmVIaWVyYXJjaHlcIl0gPSBcIkVkbS5Bbm5vdGF0aW9uUGF0aFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkludGVydmFsXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSW50ZXJ2YWxUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuV2Vha1JlZmVyZW50aWFsQ29uc3RyYWludFwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLldlYWtSZWZlcmVudGlhbENvbnN0cmFpbnRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNOYXR1cmFsUGVyc29uXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0UmVsZXZhbnRRdWFsaWZpZXJzXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2ltcGxlSWRlbnRpZmllclwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlc1wiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0TWFwcGluZ1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdE1hcHBpbmdUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclllYXJcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJIYWxmeWVhclwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhclF1YXJ0ZXJcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJNb250aFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhcldlZWtcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGF5T2ZDYWxlbmRhck1vbnRoXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RheU9mQ2FsZW5kYXJZZWFyXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhckhhbGZ5ZWFyXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0NhbGVuZGFyWWVhclF1YXJ0ZXJcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyTW9udGhcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzQ2FsZW5kYXJZZWFyV2Vla1wiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNDYWxlbmRhckRhdGVcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxQZXJpb2RcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhclBlcmlvZFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNGaXNjYWxRdWFydGVyXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXJRdWFydGVyXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFdlZWtcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRmlzY2FsWWVhcldlZWtcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGF5T2ZGaXNjYWxZZWFyXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0Zpc2NhbFllYXJWYXJpYW50XCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NdXR1YWxseUV4Y2x1c2l2ZVRlcm1cIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRBY3RpdmF0aW9uVmlhXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2ltcGxlSWRlbnRpZmllclwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkVkaXRhYmxlRmllbGRGb3JcIl0gPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY0tleVwiXSA9IFwiRWRtLlByb3BlcnR5UGF0aFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHNUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUXVhbGlmaWVkTmFtZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpbHRlckRlZmF1bHRWYWx1ZVwiXSA9IFwiRWRtLlByaW1pdGl2ZVR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWx0ZXJEZWZhdWx0VmFsdWVIaWdoXCJdID0gXCJFZG0uUHJpbWl0aXZlVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNvcnRPcmRlclwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNvcnRPcmRlclR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWN1cnNpdmVIaWVyYXJjaHlcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZWN1cnNpdmVIaWVyYXJjaHlUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuQ3JlYXRlZEF0XCJdID0gXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DcmVhdGVkQnlcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Vc2VySURcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5DaGFuZ2VkQXRcIl0gPSBcIkVkbS5EYXRlVGltZU9mZnNldFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkNoYW5nZWRCeVwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlVzZXJJRFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkFwcGx5TXVsdGlVbml0QmVoYXZpb3JGb3JTb3J0aW5nQW5kRmlsdGVyaW5nXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkN1cnJlbmN5Q29kZXNcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLkNvZGVMaXN0U291cmNlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Vbml0c09mTWVhc3VyZVwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuQ29kZUxpc3RTb3VyY2VcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvZGVMaXN0LnYxLlN0YW5kYXJkQ29kZVwiXSA9IFwiRWRtLlByb3BlcnR5UGF0aFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29kZUxpc3QudjEuRXh0ZXJuYWxDb2RlXCJdID0gXCJFZG0uUHJvcGVydHlQYXRoXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db2RlTGlzdC52MS5Jc0NvbmZpZ3VyYXRpb25EZXByZWNhdGlvbkNvZGVcIl0gPSBcIkVkbS5Cb29sZWFuXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQ29udGFjdFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuQWRkcmVzc1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5BZGRyZXNzVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5Jc0VtYWlsQWRkcmVzc1wiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLklzUGhvbmVOdW1iZXJcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5FdmVudFwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5FdmVudERhdGFcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW11bmljYXRpb24udjEuVGFza1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5UYXNrRGF0YVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5NZXNzYWdlXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLk1lc3NhZ2VEYXRhXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5IaWVyYXJjaHkudjEuUmVjdXJzaXZlSGllcmFyY2h5XCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5IaWVyYXJjaHkudjEuUmVjdXJzaXZlSGllcmFyY2h5VHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkVudGl0eVNlbWFudGljc1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkVudGl0eVNlbWFudGljc1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5GaWVsZFNlbWFudGljc1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLkZpZWxkU2VtYW50aWNzVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlQZXJzb25hbFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm9cIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm9UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5JZGVudGlmaWNhdGlvblwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkQWJzdHJhY3RcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkJhZGdlXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5CYWRnZVR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRBYnN0cmFjdFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU3RhdHVzSW5mb1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkQWJzdHJhY3RcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXBcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpZWxkR3JvdXBUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db25uZWN0ZWRGaWVsZHNcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNvbm5lY3RlZEZpZWxkc1R5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkdlb0xvY2F0aW9uc1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5HZW9Mb2NhdGlvblwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2VvTG9jYXRpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Db250YWN0c1wiXSA9IFwiRWRtLkFubm90YXRpb25QYXRoXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5NZWRpYVJlc291cmNlXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5NZWRpYVJlc291cmNlVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YVBvaW50XCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5LUElcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLktQSVR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydERlZmluaXRpb25UeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5WYWx1ZUNyaXRpY2FsaXR5XCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5WYWx1ZUNyaXRpY2FsaXR5VHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlMYWJlbHNcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5TGFiZWxUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25GaWVsZHNcIl0gPSBcIkVkbS5Qcm9wZXJ0eVBhdGhcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZhY2V0c1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckZhY2V0c1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlF1aWNrVmlld0ZhY2V0c1wiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmFjZXRcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlF1aWNrQ3JlYXRlRmFjZXRzXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GYWNldFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmlsdGVyRmFjZXRzXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWZlcmVuY2VGYWNldFwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25WYXJpYW50XCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5TZWxlY3Rpb25WYXJpYW50VHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGhpbmdQZXJzcGVjdGl2ZVwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc1N1bW1hcnlcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUGFydE9mUHJldmlld1wiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5NYXBcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuR2FsbGVyeVwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklzSW1hZ2VcIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTXVsdGlMaW5lVGV4dFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnRcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlRleHRBcnJhbmdlbWVudFR5cGVcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkltcG9ydGFuY2VcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkltcG9ydGFuY2VUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IaWRkZW5cIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JlYXRlSGlkZGVuXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlVwZGF0ZUhpZGRlblwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EZWxldGVIaWRkZW5cIl0gPSBcIk9yZy5PRGF0YS5Db3JlLlYxLlRhZ1wiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuRmlsdGVyXCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZERlZmF1bHRcIl0gPSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEFic3RyYWN0XCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVwiXSA9IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ3JpdGljYWxpdHlUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRW1waGFzaXplZFwiXSA9IFwiT3JnLk9EYXRhLkNvcmUuVjEuVGFnXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcmRlckJ5XCJdID0gXCJFZG0uUHJvcGVydHlQYXRoXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcIl0gPSBcIkVkbS5QcmltaXRpdmVUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvblN0YXRlXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvblN0YXRlVHlwZVwiO1xuICAgIFRlcm1Ub1R5cGVzW1wiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUmVjb21tZW5kYXRpb25MaXN0XCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5SZWNvbW1lbmRhdGlvbkxpc3RUeXBlXCI7XG4gICAgVGVybVRvVHlwZXNbXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCJdID0gXCJPcmcuT0RhdGEuQ29yZS5WMS5UYWdcIjtcbiAgICBUZXJtVG9UeXBlc1tcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkhUTUw1LnYxLkNzc0RlZmF1bHRzXCJdID0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5IVE1MNS52MS5Dc3NEZWZhdWx0c1R5cGVcIjtcbn0pKFRlcm1Ub1R5cGVzID0gZXhwb3J0cy5UZXJtVG9UeXBlcyB8fCAoZXhwb3J0cy5UZXJtVG9UeXBlcyA9IHt9KSk7XG4vKipcbiAqIERpZmZlcmVudGlhdGUgYmV0d2VlbiBhIENvbXBsZXhUeXBlIGFuZCBhIFR5cGVEZWZpbml0aW9uLlxuICogQHBhcmFtIGNvbXBsZXhUeXBlRGVmaW5pdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBjb21wbGV4IHR5cGVcbiAqL1xuZnVuY3Rpb24gaXNDb21wbGV4VHlwZURlZmluaXRpb24oY29tcGxleFR5cGVEZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuICghIWNvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjb21wbGV4VHlwZURlZmluaXRpb24uX3R5cGUgPT09ICdDb21wbGV4VHlwZScgJiYgISFjb21wbGV4VHlwZURlZmluaXRpb24ucHJvcGVydGllcyk7XG59XG5leHBvcnRzLmlzQ29tcGxleFR5cGVEZWZpbml0aW9uID0gaXNDb21wbGV4VHlwZURlZmluaXRpb247XG5mdW5jdGlvbiBEZWNpbWFsKHZhbHVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaXNEZWNpbWFsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlT2YoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5EZWNpbWFsID0gRGVjaW1hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcFxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDI2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLnJldmVydFRlcm1Ub0dlbmVyaWNUeXBlID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNjkpO1xuLyoqXG4gKiBSZXZlcnQgYW4gb2JqZWN0IHRvIGl0cyByYXcgdHlwZSBlcXVpdmFsZW50LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHJlZmVyZW5jZVxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byByZXZlcnRcbiAqIEByZXR1cm5zIHRoZSByYXcgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmV2ZXJ0T2JqZWN0VG9SYXdUeXBlKHJlZmVyZW5jZXMsIHZhbHVlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnQ29sbGVjdGlvbicsXG4gICAgICAgICAgICBDb2xsZWN0aW9uOiB2YWx1ZS5tYXAoKGFubm8pID0+IHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGFubm8pKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICgoX2EgPSB2YWx1ZS5pc0RlY2ltYWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHZhbHVlKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVjaW1hbCcsXG4gICAgICAgICAgICBEZWNpbWFsOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKF9iID0gdmFsdWUuaXNTdHJpbmcpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKHZhbHVlKSkge1xuICAgICAgICBjb25zdCB2YWx1ZU1hdGNoZXMgPSB2YWx1ZS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmFsdWVNYXRjaGVzLmxlbmd0aCA+IDEgJiYgcmVmZXJlbmNlcy5maW5kKChyZWYpID0+IHJlZi5hbGlhcyA9PT0gdmFsdWVNYXRjaGVzWzBdKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtTWVtYmVyJyxcbiAgICAgICAgICAgICAgICBFbnVtTWVtYmVyOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgU3RyaW5nOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ1BhdGgnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdQYXRoJyxcbiAgICAgICAgICAgIFBhdGg6IHZhbHVlLnBhdGhcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ0Fubm90YXRpb25QYXRoJykge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnQW5ub3RhdGlvblBhdGgnLFxuICAgICAgICAgICAgQW5ub3RhdGlvblBhdGg6IHZhbHVlLnZhbHVlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdBcHBseScpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ0FwcGx5JyxcbiAgICAgICAgICAgIEFwcGx5OiB2YWx1ZS5BcHBseVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnTnVsbCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ051bGwnXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdQcm9wZXJ0eVBhdGgnKSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdQcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgUHJvcGVydHlQYXRoOiB2YWx1ZS52YWx1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZS50eXBlID09PSAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdHlwZTogJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnLFxuICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdmFsdWUudmFsdWVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnJFR5cGUnKSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnUmVjb3JkJyxcbiAgICAgICAgICAgIFJlY29yZDogcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJldmVydCBhIHZhbHVlIHRvIGl0cyByYXcgdmFsdWUgZGVwZW5kaW5nIG9uIGl0cyB0eXBlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSBjdXJyZW50IHNldCBvZiByZWZlcmVuY2VcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcmV2ZXJ0XG4gKiBAcmV0dXJucyB0aGUgcmF3IGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IHZhbHVlQ29uc3RydWN0b3IgPSB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgICBzd2l0Y2ggKHZhbHVlQ29uc3RydWN0b3IpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTWF0Y2hlcyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZU1hdGNoZXMubGVuZ3RoID4gMSAmJiByZWZlcmVuY2VzLmZpbmQoKHJlZikgPT4gcmVmLmFsaWFzID09PSB2YWx1ZU1hdGNoZXNbMF0pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRW51bU1lbWJlcicsXG4gICAgICAgICAgICAgICAgICAgIEVudW1NZW1iZXI6IHZhbHVlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nOiB2YWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCb29sZWFuJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0Jvb2wnLFxuICAgICAgICAgICAgICAgIEJvb2w6IHZhbHVlLnZhbHVlT2YoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkgPT09IHZhbHVlLnRvRml4ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgICAgICAgICAgIEludDogdmFsdWUudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0RlY2ltYWwnLFxuICAgICAgICAgICAgICAgICAgICBEZWNpbWFsOiB2YWx1ZS52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXN1bHQgPSByZXZlcnRPYmplY3RUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCByZXN0cmljdGVkS2V5cyA9IFsnJFR5cGUnLCAndGVybScsICdfX3NvdXJjZScsICdxdWFsaWZpZXInLCAnQWN0aW9uVGFyZ2V0JywgJ2Z1bGx5UXVhbGlmaWVkTmFtZScsICdhbm5vdGF0aW9ucyddO1xuLyoqXG4gKiBSZXZlcnQgdGhlIGN1cnJlbnQgZW1iZWRkZWQgYW5ub3RhdGlvbnMgdG8gdGhlaXIgcmF3IHR5cGUuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIGN1cnJlbnRBbm5vdGF0aW9ucyB0aGUgY29sbGVjdGlvbiBpdGVtIHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gdGFyZ2V0QW5ub3RhdGlvbnMgdGhlIHBsYWNlIHdoZXJlIHdlIG5lZWQgdG8gYWRkIHRoZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVydEFubm90YXRpb25zVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGN1cnJlbnRBbm5vdGF0aW9ucywgdGFyZ2V0QW5ub3RhdGlvbnMpIHtcbiAgICBPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnMpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnX2Fubm90YXRpb25zJylcbiAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50QW5ub3RhdGlvbnNba2V5XSkuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQW5ub3RhdGlvbiA9IHJldmVydFRlcm1Ub0dlbmVyaWNUeXBlKHJlZmVyZW5jZXMsIGN1cnJlbnRBbm5vdGF0aW9uc1trZXldW3Rlcm1dKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkQW5ub3RhdGlvbi50ZXJtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5hbGlhc2VkVGVybSA9ICgwLCB1dGlsc18xLnVuYWxpYXMpKHJlZmVyZW5jZXMsIGAke2tleX0uJHt0ZXJtfWApO1xuICAgICAgICAgICAgICAgIGlmICh1bmFsaWFzZWRUZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1YWxpZmllZFNwbGl0ID0gdW5hbGlhc2VkVGVybS5zcGxpdCgnIycpO1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRBbm5vdGF0aW9uLnRlcm0gPSBxdWFsaWZpZWRTcGxpdFswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZFNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiBBbm5vdGF0aW9uIHdpdGggYSBxdWFsaWZpZXIsIG5vdCBzdXJlIHdoZW4gdGhhdCBjYW4gaGFwcGVuIGluIHJlYWwgc2NlbmFyaW9zXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRBbm5vdGF0aW9uLnF1YWxpZmllciA9IHF1YWxpZmllZFNwbGl0WzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0QW5ub3RhdGlvbnMucHVzaChwYXJzZWRBbm5vdGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIFJldmVydCB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGl0ZW0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmF3IGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJlZmVyZW5jZVxuICogQHBhcmFtIGNvbGxlY3Rpb25JdGVtIHRoZSBjb2xsZWN0aW9uIGl0ZW0gdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHRoZSByYXcgdHlwZSBlcXVpdmFsZW50XG4gKi9cbmZ1bmN0aW9uIHJldmVydENvbGxlY3Rpb25JdGVtVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGNvbGxlY3Rpb25JdGVtKSB7XG4gICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25JdGVtO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgY29sbGVjdGlvbkl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uSXRlbS5oYXNPd25Qcm9wZXJ0eSgnJFR5cGUnKSkge1xuICAgICAgICAgICAgLy8gQW5ub3RhdGlvbiBSZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IG91dEl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogY29sbGVjdGlvbkl0ZW0uJFR5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZXM6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ291bGQgdmFsaWRhdGUga2V5cyBhbmQgdHlwZSBiYXNlZCBvbiAkVHlwZVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW0pLmZvckVhY2goKGNvbGxlY3Rpb25LZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZEtleXMuaW5kZXhPZihjb2xsZWN0aW9uS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2xsZWN0aW9uSXRlbVtjb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SXRlbS5wcm9wZXJ0eVZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbGxlY3Rpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmV2ZXJ0VmFsdWVUb1Jhd1R5cGUocmVmZXJlbmNlcywgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xsZWN0aW9uS2V5ID09PSAnYW5ub3RhdGlvbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dEl0ZW0uYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0QW5ub3RhdGlvbnNUb1Jhd1R5cGUocmVmZXJlbmNlcywgY29sbGVjdGlvbkl0ZW1bY29sbGVjdGlvbktleV0sIG91dEl0ZW0uYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG91dEl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sbGVjdGlvbkl0ZW0udHlwZSA9PT0gJ1Byb3BlcnR5UGF0aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1Byb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgUHJvcGVydHlQYXRoOiBjb2xsZWN0aW9uSXRlbS52YWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2xsZWN0aW9uSXRlbS50eXBlID09PSAnQW5ub3RhdGlvblBhdGgnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBbm5vdGF0aW9uUGF0aCcsXG4gICAgICAgICAgICAgICAgQW5ub3RhdGlvblBhdGg6IGNvbGxlY3Rpb25JdGVtLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbGxlY3Rpb25JdGVtLnR5cGUgPT09ICdOYXZpZ2F0aW9uUHJvcGVydHlQYXRoJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCcsXG4gICAgICAgICAgICAgICAgTmF2aWdhdGlvblByb3BlcnR5UGF0aDogY29sbGVjdGlvbkl0ZW0udmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJldmVydCBhbiBhbm5vdGF0aW9uIHRlcm0gdG8gaXQncyBnZW5lcmljIG9yIHJhdyBlcXVpdmFsZW50LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIHRoZSByZWZlcmVuY2Ugb2YgdGhlIGN1cnJlbnQgY29udGV4dFxuICogQHBhcmFtIGFubm90YXRpb24gdGhlIGFubm90YXRpb24gdGVybSB0byByZXZlcnRcbiAqIEByZXR1cm5zIHRoZSByYXcgYW5ub3RhdGlvblxuICovXG5mdW5jdGlvbiByZXZlcnRUZXJtVG9HZW5lcmljVHlwZShyZWZlcmVuY2VzLCBhbm5vdGF0aW9uKSB7XG4gICAgY29uc3QgYmFzZUFubm90YXRpb24gPSB7XG4gICAgICAgIHRlcm06IGFubm90YXRpb24udGVybSxcbiAgICAgICAgcXVhbGlmaWVyOiBhbm5vdGF0aW9uLnF1YWxpZmllclxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvblxuICAgICAgICBpZiAoYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbnMnKSkge1xuICAgICAgICAgICAgLy8gQW5ub3RhdGlvbiBvbiBhIGNvbGxlY3Rpb24gaXRzZWxmLCBub3Qgc3VyZSB3aGVuIHRoYXQgaGFwcGVucyBpZiBhdCBhbGxcbiAgICAgICAgICAgIGJhc2VBbm5vdGF0aW9uLmFubm90YXRpb25zID0gW107XG4gICAgICAgICAgICByZXZlcnRBbm5vdGF0aW9uc1RvUmF3VHlwZShyZWZlcmVuY2VzLCBhbm5vdGF0aW9uLmFubm90YXRpb25zLCBiYXNlQW5ub3RhdGlvbi5hbm5vdGF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUFubm90YXRpb24pLCB7IGNvbGxlY3Rpb246IGFubm90YXRpb24ubWFwKChhbm5vKSA9PiByZXZlcnRDb2xsZWN0aW9uSXRlbVRvUmF3VHlwZShyZWZlcmVuY2VzLCBhbm5vKSkgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFubm90YXRpb24uaGFzT3duUHJvcGVydHkoJyRUeXBlJykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUFubm90YXRpb24pLCB7IHJlY29yZDogcmV2ZXJ0Q29sbGVjdGlvbkl0ZW1Ub1Jhd1R5cGUocmVmZXJlbmNlcywgYW5ub3RhdGlvbikgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQW5ub3RhdGlvbiksIHsgdmFsdWU6IHJldmVydFZhbHVlVG9SYXdUeXBlKHJlZmVyZW5jZXMsIGFubm90YXRpb24pIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMucmV2ZXJ0VGVybVRvR2VuZXJpY1R5cGUgPSByZXZlcnRUZXJtVG9HZW5lcmljVHlwZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdyaXRlYmFjay5qcy5tYXBcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTkpO1xuLyoqKioqKi8gXHRBbm5vdGF0aW9uQ29udmVydGVyID0gX193ZWJwYWNrX2V4cG9ydHNfXztcbi8qKioqKiovIFx0XG4vKioqKioqLyB9KSgpXG47Il19
2146
+ return AnnotationConverter;
2147
+ },true);