@envive-ai/react-hooks 0.1.6 → 0.1.8

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 (686) hide show
  1. package/dist/NewOrgConfig-BU6uJT74.js +15 -0
  2. package/dist/NewOrgConfig-DmidHiyj.cjs +20 -0
  3. package/dist/SystemSettingsContext-BbobkM82.cjs +20 -0
  4. package/dist/SystemSettingsContext-gtrccL_q.js +13 -0
  5. package/dist/TrackComponentVisibleEvent-CqjMiZCS.cjs +59 -0
  6. package/dist/TrackComponentVisibleEvent-D9kpqKM4.js +52 -0
  7. package/dist/amplitudeContext-B73xamNe.d.cts +52 -0
  8. package/dist/amplitudeContext-BhhYPJSL.d.ts +52 -0
  9. package/dist/amplitudeContext-Dr1jHI13.cjs +309 -0
  10. package/dist/amplitudeContext-YRS1QOO3.js +287 -0
  11. package/dist/api-DYjHj_hR.cjs +239 -0
  12. package/dist/api-d5uWvb3-.js +166 -0
  13. package/dist/{app-CjsQ2_n-.js → app-B9r0MF9n.js} +7 -7
  14. package/dist/{app-CnKRZ9RW.cjs → app-Bgr-mAvr.cjs} +10 -10
  15. package/dist/application/models/graphql/index.cjs +2 -1
  16. package/dist/application/models/graphql/index.d.ts +1 -1
  17. package/dist/application/models/graphql/index.js +2 -1
  18. package/dist/application/models/guards/api/index.cjs +3 -1
  19. package/dist/application/models/guards/api/index.d.ts +2 -2
  20. package/dist/application/models/guards/api/index.js +3 -1
  21. package/dist/application/models/guards/utils.cjs +3 -0
  22. package/dist/application/models/guards/utils.d.cts +2 -0
  23. package/dist/application/models/guards/utils.d.ts +2 -0
  24. package/dist/application/models/guards/utils.js +3 -0
  25. package/dist/application/models/index.cjs +13 -10
  26. package/dist/application/models/index.d.cts +9 -4
  27. package/dist/application/models/index.d.ts +12 -7
  28. package/dist/application/models/index.js +11 -7
  29. package/dist/application/models/utilityTypes/index.cjs +1 -1
  30. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  31. package/dist/application/models/utilityTypes/index.js +1 -1
  32. package/dist/application/models/variantInfo/index.cjs +1 -1
  33. package/dist/application/models/variantInfo/index.d.cts +1 -1
  34. package/dist/application/models/variantInfo/index.d.ts +1 -1
  35. package/dist/application/models/variantInfo/index.js +1 -1
  36. package/dist/application/utils/index.cjs +47 -40
  37. package/dist/application/utils/index.d.cts +13 -8
  38. package/dist/application/utils/index.d.ts +15 -10
  39. package/dist/application/utils/index.js +20 -13
  40. package/dist/{atomStore-D8pjE1vL.js → atomStore-BuopbV9k.js} +1 -1
  41. package/dist/{atomStore-B4jIaDPd.cjs → atomStore-CZKe3itM.cjs} +1 -1
  42. package/dist/atoms/app/index.cjs +14 -9
  43. package/dist/atoms/app/index.d.cts +16 -11
  44. package/dist/atoms/app/index.d.ts +19 -14
  45. package/dist/atoms/app/index.js +14 -9
  46. package/dist/atoms/atomStore/index.cjs +2 -2
  47. package/dist/atoms/atomStore/index.d.cts +1 -1
  48. package/dist/atoms/atomStore/index.js +2 -2
  49. package/dist/atoms/chat/index.cjs +35 -28
  50. package/dist/atoms/chat/index.d.cts +36 -31
  51. package/dist/atoms/chat/index.d.ts +39 -34
  52. package/dist/atoms/chat/index.js +21 -14
  53. package/dist/atoms/globalSearch/index.cjs +1 -1
  54. package/dist/atoms/globalSearch/index.d.cts +5 -5
  55. package/dist/atoms/globalSearch/index.d.ts +6 -6
  56. package/dist/atoms/globalSearch/index.js +1 -1
  57. package/dist/atoms/org/index.cjs +6 -14
  58. package/dist/atoms/org/index.d.cts +28 -32
  59. package/dist/atoms/org/index.d.ts +31 -35
  60. package/dist/atoms/org/index.js +5 -11
  61. package/dist/atoms/search/index.cjs +46 -34
  62. package/dist/atoms/search/index.d.cts +10 -4
  63. package/dist/atoms/search/index.d.ts +13 -7
  64. package/dist/atoms/search/index.js +28 -16
  65. package/dist/atoms/search/types.cjs +5 -0
  66. package/dist/atoms/search/types.d.cts +2 -0
  67. package/dist/atoms/search/types.d.ts +2 -0
  68. package/dist/atoms/search/types.js +3 -0
  69. package/dist/atoms/search/utils.cjs +3 -0
  70. package/dist/atoms/search/utils.d.cts +5 -0
  71. package/dist/atoms/search/utils.d.ts +5 -0
  72. package/dist/atoms/search/utils.js +3 -0
  73. package/dist/cdnContext-CVgXkdV2.cjs +53 -0
  74. package/dist/cdnContext-DdE6VPIF.js +38 -0
  75. package/dist/chat-BNDYKsqF.js +258 -0
  76. package/dist/{chat-BubCW1as.cjs → chat-BkjIKhc5.cjs} +1 -1
  77. package/dist/chat-Br5FhtRs.cjs +394 -0
  78. package/dist/{chat-CV6MXeID.js → chat-CgLypC3w.js} +1 -1
  79. package/dist/chatElementDisplayLocation-BwiXrkN7.d.ts +25 -0
  80. package/dist/chatElementDisplayLocation-DWmfNX_u.d.cts +25 -0
  81. package/dist/chatSearch-BiF2__V0.js +295 -0
  82. package/dist/chatSearch-BrzfJOto.cjs +418 -0
  83. package/dist/chatState-BDsqKE-B.cjs +120 -0
  84. package/dist/chatState-ie771Hwy.js +34 -0
  85. package/dist/commerce-api-Dz1jxPOJ.js +311 -0
  86. package/dist/commerce-api-KoiUki51.cjs +318 -0
  87. package/dist/{components-Cw9WjA6g.cjs → components-Cby-Cma3.cjs} +1 -1
  88. package/dist/{components-B4T3Uzth.js → components-D1mg1-Br.js} +1 -1
  89. package/dist/config/locators/components/chat/index.cjs +1 -1
  90. package/dist/config/locators/components/chat/index.d.cts +1 -1
  91. package/dist/config/locators/components/chat/index.d.ts +1 -1
  92. package/dist/config/locators/components/chat/index.js +1 -1
  93. package/dist/config/locators/components/chat/variants/index.d.cts +1 -1
  94. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  95. package/dist/config/locators/components/index.cjs +1 -1
  96. package/dist/config/locators/components/index.d.cts +1 -1
  97. package/dist/config/locators/components/index.d.ts +1 -1
  98. package/dist/config/locators/components/index.js +1 -1
  99. package/dist/config/locators/components/search/index.d.cts +1 -1
  100. package/dist/config/locators/index.cjs +42 -22
  101. package/dist/config/locators/index.d.cts +2 -2
  102. package/dist/config/locators/index.d.ts +3 -3
  103. package/dist/config/locators/index.js +25 -5
  104. package/dist/contexts/amplitudeContext/index.cjs +22 -0
  105. package/dist/contexts/amplitudeContext/index.d.cts +2 -0
  106. package/dist/contexts/amplitudeContext/index.d.ts +2 -0
  107. package/dist/contexts/amplitudeContext/index.js +20 -0
  108. package/dist/contexts/cdnContext/index.cjs +7 -0
  109. package/dist/contexts/cdnContext/index.d.cts +15 -0
  110. package/dist/contexts/cdnContext/index.d.ts +15 -0
  111. package/dist/contexts/cdnContext/index.js +6 -0
  112. package/dist/contexts/chatContext/index.cjs +331 -0
  113. package/dist/contexts/chatContext/index.d.cts +15 -0
  114. package/dist/contexts/chatContext/index.d.ts +15 -0
  115. package/dist/contexts/chatContext/index.js +324 -0
  116. package/dist/contexts/enviveConfigContext/index.cjs +7 -0
  117. package/dist/contexts/enviveConfigContext/index.d.cts +30 -0
  118. package/dist/contexts/enviveConfigContext/index.d.ts +30 -0
  119. package/dist/contexts/enviveConfigContext/index.js +6 -0
  120. package/dist/contexts/enviveCssContext/index.cjs +66 -0
  121. package/dist/contexts/enviveCssContext/index.d.cts +10 -0
  122. package/dist/contexts/enviveCssContext/index.d.ts +10 -0
  123. package/dist/contexts/enviveCssContext/index.js +63 -0
  124. package/dist/contexts/featureFlagContext/index.cjs +107 -0
  125. package/dist/contexts/featureFlagContext/index.d.cts +20 -0
  126. package/dist/contexts/featureFlagContext/index.d.ts +20 -0
  127. package/dist/contexts/featureFlagContext/index.js +103 -0
  128. package/dist/contexts/featureFlagServiceContext/index.cjs +6 -0
  129. package/dist/contexts/featureFlagServiceContext/index.d.cts +5 -0
  130. package/dist/contexts/featureFlagServiceContext/index.d.ts +5 -0
  131. package/dist/contexts/featureFlagServiceContext/index.js +5 -0
  132. package/dist/contexts/graphqlContext/index.cjs +16 -0
  133. package/dist/contexts/graphqlContext/index.d.cts +13 -0
  134. package/dist/contexts/graphqlContext/index.d.ts +13 -0
  135. package/dist/contexts/graphqlContext/index.js +15 -0
  136. package/dist/contexts/localStorageContext/index.cjs +6 -0
  137. package/dist/contexts/localStorageContext/index.d.cts +30 -0
  138. package/dist/contexts/localStorageContext/index.d.ts +30 -0
  139. package/dist/contexts/localStorageContext/index.js +4 -0
  140. package/dist/contexts/newOrgConfigContext/index.cjs +20 -0
  141. package/dist/contexts/newOrgConfigContext/index.d.cts +31 -0
  142. package/dist/contexts/newOrgConfigContext/index.d.ts +31 -0
  143. package/dist/contexts/newOrgConfigContext/index.js +19 -0
  144. package/dist/contexts/searchContext/index.cjs +24 -0
  145. package/dist/contexts/searchContext/index.d.cts +16 -0
  146. package/dist/contexts/searchContext/index.d.ts +16 -0
  147. package/dist/contexts/searchContext/index.js +23 -0
  148. package/dist/contexts/sessionStorageContext/index.cjs +5 -0
  149. package/dist/contexts/sessionStorageContext/index.d.cts +15 -0
  150. package/dist/contexts/sessionStorageContext/index.d.ts +15 -0
  151. package/dist/contexts/sessionStorageContext/index.js +4 -0
  152. package/dist/contexts/shopifyUrlContext/index.cjs +5 -0
  153. package/dist/contexts/shopifyUrlContext/index.d.cts +20 -0
  154. package/dist/contexts/shopifyUrlContext/index.d.ts +20 -0
  155. package/dist/contexts/shopifyUrlContext/index.js +4 -0
  156. package/dist/contexts/systemSettingsContext/index.cjs +8 -0
  157. package/dist/contexts/systemSettingsContext/index.d.cts +37 -0
  158. package/dist/contexts/systemSettingsContext/index.d.ts +37 -0
  159. package/dist/contexts/systemSettingsContext/index.js +6 -0
  160. package/dist/contexts/types.cjs +7 -0
  161. package/dist/contexts/types.d.cts +4 -0
  162. package/dist/contexts/types.d.ts +4 -0
  163. package/dist/contexts/types.js +3 -0
  164. package/dist/contexts/userIdentityContext/index.cjs +27 -0
  165. package/dist/contexts/userIdentityContext/index.d.cts +2 -0
  166. package/dist/contexts/userIdentityContext/index.d.ts +2 -0
  167. package/dist/contexts/userIdentityContext/index.js +26 -0
  168. package/dist/domObserver-B19-69gW.js +285 -0
  169. package/dist/domObserver-CwieVNgj.cjs +304 -0
  170. package/dist/enviveConfig-BQB14yuH.js +62 -0
  171. package/dist/enviveConfig-DAA9sozZ.cjs +130 -0
  172. package/dist/enviveConfigContext-BCpBKqsz.js +45 -0
  173. package/dist/enviveConfigContext-Btg5JUMG.cjs +60 -0
  174. package/dist/events/index.cjs +1 -1
  175. package/dist/events/index.d.ts +1 -1
  176. package/dist/events/index.js +1 -1
  177. package/dist/{events-BrLpaNxh.js → events-BHJJjPDN.js} +1 -1
  178. package/dist/{events-DwT6cEwI.cjs → events-B_fJZf9E.cjs} +1 -1
  179. package/dist/featureFlagServiceContext-Bcx5yh4S.cjs +56 -0
  180. package/dist/featureFlagServiceContext-Cpw8omUr.d.ts +23 -0
  181. package/dist/featureFlagServiceContext-Cvn6fcdB.d.cts +23 -0
  182. package/dist/featureFlagServiceContext-_tXX5iro.js +42 -0
  183. package/dist/featureGates-2Zea2D2S.js +27 -0
  184. package/dist/featureGates-BY2Zy7x_.cjs +33 -0
  185. package/dist/frontendConfig-DnMZfvcA.d.cts +857 -0
  186. package/dist/frontendConfig-Dqxbqo8G.d.ts +857 -0
  187. package/dist/{globalSearch-BFvEg53C.cjs → globalSearch-C94-vEVh.cjs} +1 -1
  188. package/dist/{globalSearch-B6THR7Jx.js → globalSearch-Dlbnfasm.js} +1 -1
  189. package/dist/graphql-DRLWdYEk.js +36 -0
  190. package/dist/graphql-xPDT7ZkK.cjs +53 -0
  191. package/dist/graphqlConfig-B4ddz1vH.cjs +39 -0
  192. package/dist/graphqlConfig-BnjOdeX7.js +14 -0
  193. package/dist/graphqlContext-B-9g2vOb.js +96 -0
  194. package/dist/graphqlContext-B7PEKDJs.cjs +111 -0
  195. package/dist/hooks/AmplitudeOperations/index.cjs +22 -0
  196. package/dist/hooks/AmplitudeOperations/index.d.cts +12 -0
  197. package/dist/hooks/AmplitudeOperations/index.d.ts +12 -0
  198. package/dist/hooks/AmplitudeOperations/index.js +22 -0
  199. package/dist/hooks/AppDetails/index.cjs +19 -0
  200. package/dist/hooks/AppDetails/index.d.cts +27 -0
  201. package/dist/hooks/AppDetails/index.d.ts +27 -0
  202. package/dist/hooks/AppDetails/index.js +19 -0
  203. package/dist/hooks/BlockBackButton/index.cjs +29 -0
  204. package/dist/hooks/BlockBackButton/index.d.cts +5 -0
  205. package/dist/hooks/BlockBackButton/index.d.ts +5 -0
  206. package/dist/hooks/BlockBackButton/index.js +27 -0
  207. package/dist/hooks/CdnOperations/index.cjs +24 -0
  208. package/dist/hooks/CdnOperations/index.d.cts +7 -0
  209. package/dist/hooks/CdnOperations/index.d.ts +7 -0
  210. package/dist/hooks/CdnOperations/index.js +22 -0
  211. package/dist/hooks/ChatToggle/index.cjs +64 -0
  212. package/dist/hooks/ChatToggle/index.d.cts +12 -0
  213. package/dist/hooks/ChatToggle/index.d.ts +12 -0
  214. package/dist/hooks/ChatToggle/index.js +62 -0
  215. package/dist/hooks/ChatToggleAnalytics/index.cjs +38 -0
  216. package/dist/hooks/ChatToggleAnalytics/index.d.cts +9 -0
  217. package/dist/hooks/ChatToggleAnalytics/index.d.ts +9 -0
  218. package/dist/hooks/ChatToggleAnalytics/index.js +36 -0
  219. package/dist/hooks/CustomerSupportHandoff/index.cjs +36 -0
  220. package/dist/hooks/CustomerSupportHandoff/index.d.cts +16 -0
  221. package/dist/hooks/CustomerSupportHandoff/index.d.ts +16 -0
  222. package/dist/hooks/CustomerSupportHandoff/index.js +34 -0
  223. package/dist/hooks/Debounce/index.cjs +3 -0
  224. package/dist/hooks/Debounce/index.d.cts +5 -0
  225. package/dist/hooks/Debounce/index.d.ts +5 -0
  226. package/dist/hooks/Debounce/index.js +3 -0
  227. package/dist/hooks/ElementObserver/index.cjs +179 -0
  228. package/dist/hooks/ElementObserver/index.d.cts +29 -0
  229. package/dist/hooks/ElementObserver/index.d.ts +29 -0
  230. package/dist/hooks/ElementObserver/index.js +177 -0
  231. package/dist/hooks/GrabAndScroll/index.cjs +99 -0
  232. package/dist/hooks/GrabAndScroll/index.d.cts +14 -0
  233. package/dist/hooks/GrabAndScroll/index.d.ts +14 -0
  234. package/dist/hooks/GrabAndScroll/index.js +97 -0
  235. package/dist/hooks/GraphQLConfig/index.cjs +17 -0
  236. package/dist/hooks/GraphQLConfig/index.d.cts +15 -0
  237. package/dist/hooks/GraphQLConfig/index.d.ts +15 -0
  238. package/dist/hooks/GraphQLConfig/index.js +16 -0
  239. package/dist/hooks/IdentifyUser/index.cjs +60 -0
  240. package/dist/hooks/IdentifyUser/index.d.cts +10 -0
  241. package/dist/hooks/IdentifyUser/index.d.ts +10 -0
  242. package/dist/hooks/IdentifyUser/index.js +58 -0
  243. package/dist/hooks/ImageResolver/index.cjs +55 -0
  244. package/dist/hooks/ImageResolver/index.d.cts +7 -0
  245. package/dist/hooks/ImageResolver/index.d.ts +7 -0
  246. package/dist/hooks/ImageResolver/index.js +53 -0
  247. package/dist/hooks/Intersection/index.cjs +3 -0
  248. package/dist/hooks/Intersection/index.d.cts +7 -0
  249. package/dist/hooks/Intersection/index.d.ts +7 -0
  250. package/dist/hooks/Intersection/index.js +3 -0
  251. package/dist/hooks/IsSmallScreen/index.cjs +22 -0
  252. package/dist/hooks/IsSmallScreen/index.d.cts +5 -0
  253. package/dist/hooks/IsSmallScreen/index.d.ts +5 -0
  254. package/dist/hooks/IsSmallScreen/index.js +20 -0
  255. package/dist/hooks/LocalStorageOperations/index.cjs +79 -0
  256. package/dist/hooks/LocalStorageOperations/index.d.cts +17 -0
  257. package/dist/hooks/LocalStorageOperations/index.d.ts +17 -0
  258. package/dist/hooks/LocalStorageOperations/index.js +74 -0
  259. package/dist/hooks/MessageFilter/index.cjs +54 -0
  260. package/dist/hooks/MessageFilter/index.d.cts +30 -0
  261. package/dist/hooks/MessageFilter/index.d.ts +30 -0
  262. package/dist/hooks/MessageFilter/index.js +54 -0
  263. package/dist/hooks/MessageScrollObserver/index.cjs +36 -0
  264. package/dist/hooks/MessageScrollObserver/index.d.cts +5 -0
  265. package/dist/hooks/MessageScrollObserver/index.d.ts +5 -0
  266. package/dist/hooks/MessageScrollObserver/index.js +34 -0
  267. package/dist/hooks/NewOrgConfig/index.cjs +20 -0
  268. package/dist/hooks/NewOrgConfig/index.d.cts +23 -0
  269. package/dist/hooks/NewOrgConfig/index.d.ts +23 -0
  270. package/dist/hooks/NewOrgConfig/index.js +20 -0
  271. package/dist/hooks/Search/index.cjs +326 -0
  272. package/dist/hooks/Search/index.d.cts +61 -0
  273. package/dist/hooks/Search/index.d.ts +61 -0
  274. package/dist/hooks/Search/index.js +323 -0
  275. package/dist/hooks/SearchOperations/index.cjs +102 -0
  276. package/dist/hooks/SearchOperations/index.d.cts +22 -0
  277. package/dist/hooks/SearchOperations/index.d.ts +22 -0
  278. package/dist/hooks/SearchOperations/index.js +99 -0
  279. package/dist/hooks/SessionStorageOperations/index.cjs +30 -0
  280. package/dist/hooks/SessionStorageOperations/index.d.cts +8 -0
  281. package/dist/hooks/SessionStorageOperations/index.d.ts +8 -0
  282. package/dist/hooks/SessionStorageOperations/index.js +28 -0
  283. package/dist/hooks/ShopifyUrlOperations/index.cjs +53 -0
  284. package/dist/hooks/ShopifyUrlOperations/index.d.cts +23 -0
  285. package/dist/hooks/ShopifyUrlOperations/index.d.ts +23 -0
  286. package/dist/hooks/ShopifyUrlOperations/index.js +49 -0
  287. package/dist/hooks/SnapCalculator/index.cjs +29 -0
  288. package/dist/hooks/SnapCalculator/index.d.cts +12 -0
  289. package/dist/hooks/SnapCalculator/index.d.ts +12 -0
  290. package/dist/hooks/SnapCalculator/index.js +27 -0
  291. package/dist/hooks/SystemSettingsContext/index.cjs +7 -0
  292. package/dist/hooks/SystemSettingsContext/index.d.cts +23 -0
  293. package/dist/hooks/SystemSettingsContext/index.d.ts +23 -0
  294. package/dist/hooks/SystemSettingsContext/index.js +7 -0
  295. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +22 -0
  296. package/dist/hooks/TrackComponentVisibleEvent/index.d.cts +18 -0
  297. package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +18 -0
  298. package/dist/hooks/TrackComponentVisibleEvent/index.js +22 -0
  299. package/dist/hooks/UpdateAnalyticsProps/index.cjs +62 -0
  300. package/dist/hooks/UpdateAnalyticsProps/index.d.cts +9 -0
  301. package/dist/hooks/UpdateAnalyticsProps/index.d.ts +9 -0
  302. package/dist/hooks/UpdateAnalyticsProps/index.js +59 -0
  303. package/dist/hooks/utils.cjs +8 -0
  304. package/dist/hooks/utils.d.cts +13 -0
  305. package/dist/hooks/utils.d.ts +13 -0
  306. package/dist/hooks/utils.js +3 -0
  307. package/dist/index-B9HUPS_i.d.cts +186 -0
  308. package/dist/{index-CcIG01PJ.d.ts → index-BN-3ctk_.d.ts} +2 -2
  309. package/dist/index-BNiYL8h0.d.cts +28 -0
  310. package/dist/{index-BDPWBU3h.d.cts → index-BW6pHibZ.d.cts} +1 -1
  311. package/dist/index-BirtCYN3.d.ts +186 -0
  312. package/dist/index-Bmub8e38.d.cts +1 -1
  313. package/dist/{index-Cqg6ltII.d.ts → index-BoYC9XLW.d.ts} +1 -1
  314. package/dist/index-C9zXP5bg.d.ts +28 -0
  315. package/dist/index-CESxqFso.d.cts +1 -1
  316. package/dist/index-CK_J3QMY.d.ts +676 -0
  317. package/dist/index-C_MIfxF0.d.cts +676 -0
  318. package/dist/index-CiWEYzXl.d.cts +1 -1
  319. package/dist/{index-C6KdON7d.d.ts → index-Da0UzyI9.d.ts} +1 -1
  320. package/dist/{index-ylUiJvnr.d.ts → index-Dr_c2DDq.d.ts} +1 -1
  321. package/dist/{index-PGF8BvxQ.d.ts → index-DsiilEj-.d.ts} +1 -1
  322. package/dist/{index-Byb45OPg.d.cts → index-MOOZ2oxZ.d.cts} +1 -1
  323. package/dist/{index-DOii3C6b.d.ts → index-ghzD_356.d.ts} +1 -1
  324. package/dist/{index-B0NW9KTj.d.cts → index-hdbCEjYy.d.cts} +1 -1
  325. package/dist/interceptors/index.cjs +2 -1
  326. package/dist/interceptors/index.d.cts +10 -10
  327. package/dist/interceptors/index.d.ts +13 -13
  328. package/dist/interceptors/index.js +2 -1
  329. package/dist/interceptors/types.cjs +1 -0
  330. package/dist/interceptors/types.d.cts +13 -0
  331. package/dist/interceptors/types.d.ts +13 -0
  332. package/dist/interceptors/types.js +3 -0
  333. package/dist/localStorageContext-DiTziaPa.js +95 -0
  334. package/dist/localStorageContext-S38L0OSP.cjs +115 -0
  335. package/dist/logger-CkhQayOW.js +20 -0
  336. package/dist/logger-DQ0WfCcD.cjs +26 -0
  337. package/dist/{models-BkXg5eIP.cjs → models-C48U9q70.js} +220 -458
  338. package/dist/models-Ctn-pmug.cjs +1537 -0
  339. package/dist/newOrgConfigAtom-D6R-7HCk.cjs +15 -0
  340. package/dist/newOrgConfigAtom-bn1lnljf.js +8 -0
  341. package/dist/newOrgConfigContext-D3WoaBVU.cjs +68 -0
  342. package/dist/newOrgConfigContext-rWOYz0E8.js +53 -0
  343. package/dist/{nodeSelector-Dm4S-10n.d.cts → nodeSelector-B3bPtEjX.d.cts} +1 -1
  344. package/dist/{nodeSelector-BxrS2S_k.d.ts → nodeSelector-D5gjDWZ3.d.ts} +1 -1
  345. package/dist/org-CIhjzxWr.cjs +43 -0
  346. package/dist/org-CeWXnpwF.js +12 -0
  347. package/dist/{orgAnalyticsConfig-ClrFy2qH.js → orgAnalyticsConfig-BC4_sEmn.js} +1 -1
  348. package/dist/{orgAnalyticsConfig-BJ2A1RZ-.cjs → orgAnalyticsConfig-DsGbyFhO.cjs} +1 -1
  349. package/dist/search--NZPZkK3.cjs +205 -0
  350. package/dist/search-BLShhjvR.d.ts +20 -0
  351. package/dist/search-CxZl7iQF.js +126 -0
  352. package/dist/{search-filter-types-fZf91Pdw.d.ts → search-filter-types-DPgeG8FS.d.ts} +1 -1
  353. package/dist/{search-filter-types-DosbseF3.d.cts → search-filter-types-_mprCnBi.d.cts} +1 -1
  354. package/dist/search-y-ioX5Mz.d.cts +20 -0
  355. package/dist/searchContext-C4Glr8Nv.cjs +145 -0
  356. package/dist/searchContext-VnjhV7Lk.js +129 -0
  357. package/dist/searchServiceAdapter-DEv1tTn0.cjs +34 -0
  358. package/dist/searchServiceAdapter-WyCU55NV.js +16 -0
  359. package/dist/sessionStorageContext-BJ05_j7l.cjs +66 -0
  360. package/dist/sessionStorageContext-Dp_bhXQP.js +52 -0
  361. package/dist/shopifyUrlContext-CGqpJl1o.js +61 -0
  362. package/dist/shopifyUrlContext-Cob4L7Dt.cjs +75 -0
  363. package/dist/spiffyWidgets-BuS00VaQ.d.cts +20 -0
  364. package/dist/spiffyWidgets-GILaqHv6.d.ts +20 -0
  365. package/dist/systemSettingsContext-BDKWrrco.cjs +60 -0
  366. package/dist/systemSettingsContext-Dqng3YSZ.js +39 -0
  367. package/dist/{test-types-C9b_OdfO.d.ts → test-types-EzMFw_U3.d.ts} +1 -1
  368. package/dist/{test-types-CgVJtwUr.d.cts → test-types-ThQiO_cc.d.cts} +1 -1
  369. package/dist/types/index.cjs +33 -5
  370. package/dist/types/index.d.cts +2 -2
  371. package/dist/types/index.d.ts +2 -2
  372. package/dist/types/index.js +30 -3
  373. package/dist/types-BUeRbZUk.d.cts +10 -0
  374. package/dist/types-BwNrLPSZ.cjs +106 -0
  375. package/dist/types-CMuTSKrW.d.ts +10 -0
  376. package/dist/types-CS0Hrzja.js +30 -0
  377. package/dist/types-CxObxLKs.cjs +48 -0
  378. package/dist/types-D3uOF0Oy.js +76 -0
  379. package/dist/types-fsXBIQwO.d.ts +51 -0
  380. package/dist/types-zuWLkBJ3.d.cts +51 -0
  381. package/dist/types.d.cts +15 -0
  382. package/dist/types.d.ts +15 -0
  383. package/dist/unsupportedProductExceptions-CKiri_vO.cjs +32 -0
  384. package/dist/unsupportedProductExceptions-ClxlJ6cU.js +20 -0
  385. package/dist/urlsParser-D1nsJgQG.cjs +78 -0
  386. package/dist/urlsParser-DzEetiey.js +42 -0
  387. package/dist/useAmplitudeOperations-BSsyvkQ2.cjs +41 -0
  388. package/dist/useAmplitudeOperations-BottjwT9.js +34 -0
  389. package/dist/useAppDetails-BpiBxS_5.cjs +38 -0
  390. package/dist/useAppDetails-DDNIsM46.js +30 -0
  391. package/dist/useDebounce-BaIp-A1W.cjs +26 -0
  392. package/dist/useDebounce-CxPj9WmE.js +19 -0
  393. package/dist/useGraphQLConfig-DZ0ZannB.js +63 -0
  394. package/dist/useGraphQLConfig-Dw8dDh3T.cjs +76 -0
  395. package/dist/useIntersection-B4J9UhaG.js +21 -0
  396. package/dist/useIntersection-DKWc5MY6.cjs +28 -0
  397. package/dist/{useMessageInterceptor-B87e3yu3.cjs → useMessageInterceptor-CstX10ih.cjs} +3 -3
  398. package/dist/{useMessageInterceptor-Bb7YRaWk.js → useMessageInterceptor-D5oAekXn.js} +2 -2
  399. package/dist/userIdentityContext-D2oFVFzo.d.cts +20 -0
  400. package/dist/userIdentityContext-DPFkCSCu.cjs +125 -0
  401. package/dist/userIdentityContext-Z65zM-Ae.js +109 -0
  402. package/dist/userIdentityContext-wYRpgkaJ.d.ts +20 -0
  403. package/dist/utilityTypes-DynzxjK3.js +1 -0
  404. package/dist/utilityTypes-xb8SjKSV.cjs +0 -0
  405. package/dist/utils-2SWrJ12w.cjs +29 -0
  406. package/dist/utils-B1xLx9S8.d.ts +15 -0
  407. package/dist/utils-B3x_9JTY.d.cts +15 -0
  408. package/dist/utils-BZtSmwgh.d.cts +22 -0
  409. package/dist/utils-Bcz5kAgP.js +92 -0
  410. package/dist/utils-CEKzBcN2.js +27 -0
  411. package/dist/utils-CMqFfqZx.cjs +130 -0
  412. package/dist/utils-CVovRwlw.js +606 -0
  413. package/dist/utils-CqBxIpEV.js +23 -0
  414. package/dist/utils-CsMbZmRw.cjs +33 -0
  415. package/dist/utils-DzPSXtmD.cjs +715 -0
  416. package/dist/utils-bxOCg2i9.d.ts +22 -0
  417. package/dist/variantInfo-B7IwRpCg.cjs +0 -0
  418. package/dist/variantInfo-BtOYUGWa.js +1 -0
  419. package/package.json +191 -7
  420. package/src/application/models/index.ts +0 -1
  421. package/src/application/utils/analyticsUtils.ts +1 -1
  422. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +1 -1
  423. package/src/atoms/app/index.ts +1 -1
  424. package/src/atoms/chat/chatState.ts +1 -1
  425. package/src/atoms/chat/replies.ts +1 -1
  426. package/src/atoms/org/graphqlConfig.ts +1 -39
  427. package/src/atoms/org/index.ts +0 -1
  428. package/src/atoms/org/newOrgConfigAtom.ts +2 -6
  429. package/src/contexts/{amplitudeContext.tsx → amplitudeContext/amplitudeContext.tsx} +1 -2
  430. package/src/contexts/amplitudeContext/index.ts +1 -0
  431. package/src/contexts/{cdnContext.tsx → cdnContext/cdnContext.tsx} +1 -1
  432. package/src/contexts/cdnContext/index.ts +1 -0
  433. package/src/contexts/{chatContext.tsx → chatContext/chatContext.tsx} +3 -3
  434. package/src/contexts/chatContext/index.ts +1 -0
  435. package/src/contexts/{enviveConfigContext.tsx → enviveConfigContext/enviveConfigContext.tsx} +1 -1
  436. package/src/contexts/enviveConfigContext/index.ts +1 -0
  437. package/src/contexts/{enviveCssContext.tsx → enviveCssContext/enviveCssContext.tsx} +1 -1
  438. package/src/contexts/enviveCssContext/index.ts +1 -0
  439. package/src/contexts/{featureFlagContext.tsx → featureFlagContext/featureFlagContext.tsx} +1 -1
  440. package/src/contexts/featureFlagContext/index.ts +1 -0
  441. package/src/contexts/featureFlagServiceContext/index.ts +1 -0
  442. package/src/contexts/graphqlContext/index.ts +1 -0
  443. package/src/contexts/localStorageContext/index.ts +1 -0
  444. package/src/contexts/{localStorageContext.tsx → localStorageContext/localStorageContext.tsx} +2 -2
  445. package/src/contexts/newOrgConfigContext/index.ts +1 -0
  446. package/src/contexts/newOrgConfigContext/newOrgConfigContext.tsx +70 -0
  447. package/src/contexts/searchContext/index.ts +1 -0
  448. package/src/contexts/{searchContext.tsx → searchContext/searchContext.tsx} +5 -5
  449. package/src/contexts/sessionStorageContext/index.ts +1 -0
  450. package/src/contexts/{sessionStorageContext.tsx → sessionStorageContext/sessionStorageContext.tsx} +1 -1
  451. package/src/contexts/shopifyUrlContext/index.ts +1 -0
  452. package/src/contexts/systemSettingsContext/index.ts +1 -0
  453. package/src/contexts/userIdentityContext/index.ts +1 -0
  454. package/src/events/registerAnalyticsListeners.ts +2 -2
  455. package/src/favicon.ico +0 -0
  456. package/src/hooks/AmplitudeOperations/index.ts +1 -0
  457. package/src/hooks/{useAmplitudeOperations.ts → AmplitudeOperations/useAmplitudeOperations.ts} +1 -1
  458. package/src/hooks/AppDetails/index.ts +1 -0
  459. package/src/hooks/{useAppDetails.ts → AppDetails/useAppDetails.ts} +1 -3
  460. package/src/hooks/BlockBackButton/index.ts +1 -0
  461. package/src/hooks/CdnOperations/index.ts +1 -0
  462. package/src/hooks/{useCdnOperations.ts → CdnOperations/useCdnOperations.ts} +1 -1
  463. package/src/hooks/ChatToggle/index.ts +1 -0
  464. package/src/hooks/{useChatToggle.ts → ChatToggle/useChatToggle.ts} +1 -1
  465. package/src/hooks/ChatToggleAnalytics/index.ts +1 -0
  466. package/src/hooks/{useChatToggleAnalytics.ts → ChatToggleAnalytics/useChatToggleAnalytics.ts} +1 -1
  467. package/src/hooks/CustomerSupportHandoff/index.ts +1 -0
  468. package/src/hooks/Debounce/index.ts +1 -0
  469. package/src/hooks/ElementObserver/index.ts +1 -0
  470. package/src/hooks/GrabAndScroll/index.ts +1 -0
  471. package/src/hooks/GraphQLConfig/index.ts +1 -0
  472. package/src/hooks/{useGraphQLConfig.ts → GraphQLConfig/useGraphQLConfig.ts} +1 -1
  473. package/src/hooks/IdentifyUser/index.ts +1 -0
  474. package/src/hooks/{useIdentifyUser.ts → IdentifyUser/useIdentifyUser.ts} +1 -1
  475. package/src/hooks/ImageResolver/index.ts +1 -0
  476. package/src/hooks/Intersection/index.ts +1 -0
  477. package/src/hooks/IsSmallScreen/index.ts +1 -0
  478. package/src/hooks/LocalStorageOperations/index.ts +1 -0
  479. package/src/hooks/{useLocalStorageOperations.ts → LocalStorageOperations/useLocalStorageOperations.ts} +2 -2
  480. package/src/hooks/MessageFilter/index.ts +1 -0
  481. package/src/hooks/MessageScrollObserver/index.ts +1 -0
  482. package/src/hooks/NewOrgConfig/index.ts +1 -0
  483. package/src/hooks/{useNewOrgConfig.ts → NewOrgConfig/useNewOrgConfig.ts} +1 -1
  484. package/src/hooks/Search/index.ts +1 -0
  485. package/src/hooks/{useSearch.tsx → Search/useSearch.tsx} +5 -4
  486. package/src/hooks/SearchOperations/index.ts +1 -0
  487. package/src/hooks/SessionStorageOperations/index.ts +1 -0
  488. package/src/hooks/{useSessionStorageOperations.ts → SessionStorageOperations/useSessionStorageOperations.ts} +1 -1
  489. package/src/hooks/ShopifyUrlOperations/index.ts +1 -0
  490. package/src/hooks/{useShopifyUrlOperations.ts → ShopifyUrlOperations/useShopifyUrlOperations.ts} +1 -1
  491. package/src/hooks/SnapCalculator/index.ts +1 -0
  492. package/src/hooks/SystemSettingsContext/index.ts +1 -0
  493. package/src/hooks/SystemSettingsContext/useSystemSettingsContext.ts +14 -0
  494. package/src/hooks/TrackComponentVisibleEvent/index.ts +1 -0
  495. package/src/hooks/{useTrackComponentVisibleEvent.ts → TrackComponentVisibleEvent/useTrackComponentVisibleEvent.ts} +2 -2
  496. package/src/hooks/UpdateAnalyticsProps/index.ts +1 -0
  497. package/src/hooks/{useUpdateAnalyticsProps.ts → UpdateAnalyticsProps/useUpdateAnalyticsProps.ts} +1 -1
  498. package/dist/amplitudeContext-CHzas7Cf.d.cts +0 -52
  499. package/dist/amplitudeContext-D-7fmVh1.cjs +0 -356
  500. package/dist/amplitudeContext-hY3caPC6.js +0 -322
  501. package/dist/amplitudeContext-tJ4y-SzX.d.ts +0 -52
  502. package/dist/api-DjeZXxl_.js +0 -207
  503. package/dist/api-_JaUnIUj.cjs +0 -292
  504. package/dist/bandolier-DYEz4-8C.js +0 -1229
  505. package/dist/bandolier-o_-xrbOV.cjs +0 -1229
  506. package/dist/carpe-CsG5jCcl.cjs +0 -607
  507. package/dist/carpe-DONk00bZ.js +0 -605
  508. package/dist/cdnUtils-32v8bDX9.cjs +0 -16
  509. package/dist/cdnUtils-E4tLBt2g.js +0 -11
  510. package/dist/chat-CO7cRkaq.cjs +0 -506
  511. package/dist/chat-hcRc4RRd.js +0 -285
  512. package/dist/contexts/index.cjs +0 -57
  513. package/dist/contexts/index.d.cts +0 -10
  514. package/dist/contexts/index.d.ts +0 -10
  515. package/dist/contexts/index.js +0 -23
  516. package/dist/contexts-B4ihTBsV.cjs +0 -2980
  517. package/dist/contexts-DGlr7M1o.js +0 -2596
  518. package/dist/coterie-CKB93qfz.cjs +0 -239
  519. package/dist/coterie-DHcj2fRE.js +0 -239
  520. package/dist/custservice-types-Dy0kc9TW.cjs +0 -35
  521. package/dist/custservice-types-mnIunabv.js +0 -23
  522. package/dist/default-BnB4p0Se.cjs +0 -234
  523. package/dist/default-D6f5Dyt7.js +0 -199
  524. package/dist/default-ZKkE5zT4.cjs +0 -4
  525. package/dist/default-legGZJwI.js +0 -4
  526. package/dist/divIds-2dJlU3z8.cjs +0 -117
  527. package/dist/divIds-BUrN2vY-.js +0 -21
  528. package/dist/dreamlandBaby-BiRYYFav.js +0 -346
  529. package/dist/dreamlandBaby-zuvmfzfD.cjs +0 -346
  530. package/dist/embedded-BJLWIriJ.js +0 -23
  531. package/dist/embedded-Dl79TJLC.cjs +0 -131
  532. package/dist/entrypoints-Bs3pn6EV.js +0 -7
  533. package/dist/entrypoints-Dqi5pzWH.cjs +0 -19
  534. package/dist/enviveConfig-BccuzS2a.cjs +0 -240
  535. package/dist/enviveConfig-CzhTz8Aa.js +0 -152
  536. package/dist/fiveCbd-DwTTwC2j.cjs +0 -613
  537. package/dist/fiveCbd-Dz2NouOF.js +0 -613
  538. package/dist/forLoveAndLemons-DqSdyD6S.js +0 -665
  539. package/dist/forLoveAndLemons-Ud6mPrV3.cjs +0 -667
  540. package/dist/graphql-BNW60InJ.cjs +0 -128
  541. package/dist/graphql-CjB8wHzm.js +0 -74
  542. package/dist/graphqlConfig-CYt6tWII.js +0 -30
  543. package/dist/graphqlConfig-DicykC-o.cjs +0 -61
  544. package/dist/greenpan-B_EbPkSP.js +0 -397
  545. package/dist/greenpan-kPE4fJgd.cjs +0 -397
  546. package/dist/grooveLife-Ckuir319.js +0 -342
  547. package/dist/grooveLife-DKSEQp1F.cjs +0 -342
  548. package/dist/homegrownCannabis-BVPa2pqe.js +0 -410
  549. package/dist/homegrownCannabis-BwIAkxuA.cjs +0 -410
  550. package/dist/hooks/index.cjs +0 -63
  551. package/dist/hooks/index.d.cts +0 -314
  552. package/dist/hooks/index.d.ts +0 -314
  553. package/dist/hooks/index.js +0 -23
  554. package/dist/index-BMPtlgac.d.ts +0 -191
  555. package/dist/index-C7pGDl1A.d.ts +0 -1609
  556. package/dist/index-C9lgsCWp.d.cts +0 -203
  557. package/dist/index-Cc-wBCn6.d.ts +0 -203
  558. package/dist/index-DTu2X-YS.d.cts +0 -1609
  559. package/dist/index-OEifcBsm.d.cts +0 -191
  560. package/dist/jackArcher-B39OEIj6.cjs +0 -727
  561. package/dist/jackArcher-BwkWGybC.js +0 -727
  562. package/dist/jordanCraig-CxRH_jLi.js +0 -1786
  563. package/dist/jordanCraig-RwmWw-jM.cjs +0 -1786
  564. package/dist/kindredBravely-D78VwL20.cjs +0 -490
  565. package/dist/kindredBravely-DQDpAzdl.js +0 -490
  566. package/dist/kutFromTheKloth-TcXQkIti.js +0 -369
  567. package/dist/kutFromTheKloth-dXRrNti0.cjs +0 -369
  568. package/dist/larryAndSerges-Bh5XEXsZ.js +0 -262
  569. package/dist/larryAndSerges-COdBzOzu.cjs +0 -262
  570. package/dist/leapsAndRebounds-BbXnqkl5.cjs +0 -360
  571. package/dist/leapsAndRebounds-mjCaH1k-.js +0 -360
  572. package/dist/longevityrx-DdV3v26F.cjs +0 -320
  573. package/dist/longevityrx-DfPDfvAt.js +0 -320
  574. package/dist/lookOptic-DgXFGBPP.cjs +0 -282
  575. package/dist/lookOptic-FgVW1afF.js +0 -282
  576. package/dist/mantraBrand-C5gVm3rk.cjs +0 -750
  577. package/dist/mantraBrand-uV8HCDR8.js +0 -750
  578. package/dist/medterra-BtDpr1Hw.cjs +0 -583
  579. package/dist/medterra-DgzE7-mj.js +0 -583
  580. package/dist/modells-CJjsxOIR.js +0 -484
  581. package/dist/modells-Ck5KbRFj.cjs +0 -484
  582. package/dist/models-UZ6HszfZ.js +0 -1281
  583. package/dist/org-C2RrBVQR.cjs +0 -81
  584. package/dist/org-xMytX--e.js +0 -38
  585. package/dist/pressedFloral-Bteoboms.js +0 -661
  586. package/dist/pressedFloral-CexgV-xy.cjs +0 -661
  587. package/dist/search-BMOAmrmY.js +0 -459
  588. package/dist/search-Df0Ifneg.cjs +0 -672
  589. package/dist/skinPerfection-BGzq9lq-.cjs +0 -334
  590. package/dist/skinPerfection-BlvcEcUE.js +0 -334
  591. package/dist/snapSupplements-CbbGzAgO.cjs +0 -285
  592. package/dist/snapSupplements-kcsPAOm9.js +0 -285
  593. package/dist/socialProofClasses-Db8gzsfi.cjs +0 -40
  594. package/dist/socialProofClasses-kwDvwLOZ.js +0 -10
  595. package/dist/spanx-B4WFA_rI.js +0 -661
  596. package/dist/spanx-BWoE4F8b.cjs +0 -663
  597. package/dist/spanxStaging-BOrOjhXn.js +0 -845
  598. package/dist/spanxStaging-BfdfIug4.cjs +0 -848
  599. package/dist/suggestionBarV2-types-IMMOmCir.js +0 -10
  600. package/dist/suggestionBarV2-types-nnGNgFvR.cjs +0 -16
  601. package/dist/supergoop-22dd5_BS.js +0 -323
  602. package/dist/supergoop-B-a4cku2.cjs +0 -323
  603. package/dist/types--pr1GQQx.js +0 -154
  604. package/dist/types-BVSyY3Hk.cjs +0 -196
  605. package/dist/uniqueVintage-CJXiNNe7.js +0 -1211
  606. package/dist/uniqueVintage-D0jzJWlo.cjs +0 -1213
  607. package/dist/userIdentityContext-BPqvVIg0.d.cts +0 -20
  608. package/dist/userIdentityContext-wbCRmlzp.d.ts +0 -20
  609. package/dist/utils-C9ZSCx12.js +0 -888
  610. package/dist/utils-D5HO61hG.cjs +0 -1016
  611. package/dist/venaCbd-Bhhu_qUf.cjs +0 -365
  612. package/dist/venaCbd-CanovPS_.js +0 -365
  613. package/dist/westonJonBoucher-BC0x1ktI.cjs +0 -422
  614. package/dist/westonJonBoucher-BUu1_wP1.js +0 -422
  615. package/dist/wineEnthusiast-BlCryfil.cjs +0 -940
  616. package/dist/wineEnthusiast-Ck1x5iJq.js +0 -940
  617. package/dist/wolfMattress-D9Mjq-HP.js +0 -372
  618. package/dist/wolfMattress-JssghhC-.cjs +0 -372
  619. package/dist/wolfTactical-C6exYhL7.cjs +0 -349
  620. package/dist/wolfTactical-CnV3KQdI.js +0 -349
  621. package/src/application/models/supportedOrgs.ts +0 -161
  622. package/src/atoms/org/orgPageConfig.ts +0 -42
  623. package/src/contexts/index.ts +0 -16
  624. package/src/contexts/newOrgConfigContext.tsx +0 -104
  625. package/src/contexts/orgConfigContext.tsx +0 -106
  626. package/src/hooks/index.ts +0 -27
  627. package/src/hooks/useSystemSettingsContext.ts +0 -12
  628. package/src/merchants/bandolier/bandolier.ts +0 -1371
  629. package/src/merchants/carpe/carpe.ts +0 -653
  630. package/src/merchants/coterie/coterie.ts +0 -277
  631. package/src/merchants/default.ts +0 -196
  632. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +0 -381
  633. package/src/merchants/fiveCbd/fiveCbd.ts +0 -691
  634. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +0 -751
  635. package/src/merchants/greenpan/greenpan.ts +0 -434
  636. package/src/merchants/grooveLife/grooveLife.ts +0 -392
  637. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +0 -474
  638. package/src/merchants/init-merchant.sh +0 -53
  639. package/src/merchants/jackArcher/jackArcher.ts +0 -989
  640. package/src/merchants/jordanCraig/jordanCraig.ts +0 -1927
  641. package/src/merchants/kindredBravely/kindredBravely.ts +0 -538
  642. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +0 -421
  643. package/src/merchants/larryAndSerges/larryAndSerges.ts +0 -318
  644. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +0 -424
  645. package/src/merchants/longevityrx/longevityrx.ts +0 -374
  646. package/src/merchants/lookOptic/lookOptic.ts +0 -323
  647. package/src/merchants/mantraBrand/mantraBrand.ts +0 -844
  648. package/src/merchants/medterra/medterra.ts +0 -673
  649. package/src/merchants/modells/modells.ts +0 -543
  650. package/src/merchants/pressedFloral/pressedFloral.ts +0 -728
  651. package/src/merchants/skinPerfection/skinPerfection.ts +0 -385
  652. package/src/merchants/snapSupplements/snapSupplements.ts +0 -328
  653. package/src/merchants/spanx/spanx.ts +0 -810
  654. package/src/merchants/spanx/spanxStaging.ts +0 -936
  655. package/src/merchants/supergoop/supergoop.ts +0 -375
  656. package/src/merchants/uniqueVintage/uniqueVintage.ts +0 -1314
  657. package/src/merchants/venaCbd/venaCbd.ts +0 -407
  658. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +0 -473
  659. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +0 -990
  660. package/src/merchants/wolfMattress/wolfMattress.ts +0 -411
  661. package/src/merchants/wolfTactical/wolfTactical.ts +0 -383
  662. /package/dist/{atomStore-KSoFS3Jj.cjs → AmplitudeOperations-CNyxbBY6.cjs} +0 -0
  663. /package/dist/{atomStore-CZnUUsrr.js → AmplitudeOperations-Oa2efWtF.js} +0 -0
  664. /package/dist/{locators-fBXS_pxP.js → atomStore-BS6qtYZF.js} +0 -0
  665. /package/dist/{locators-0YYZu9n4.cjs → atomStore-BjRyLFEx.cjs} +0 -0
  666. /package/dist/{utilityTypes-8sETsYPk.js → types-DtTnp0o0.js} +0 -0
  667. /package/dist/{utilityTypes-COShxVir.cjs → types-a8gm_IaQ.cjs} +0 -0
  668. /package/dist/{variantInfo-orXoPBCU.cjs → types.cjs} +0 -0
  669. /package/dist/{variantInfo-DbVxA1yE.js → types.js} +0 -0
  670. /package/src/contexts/{featureFlagServiceContext.tsx → featureFlagServiceContext/featureFlagServiceContext.tsx} +0 -0
  671. /package/src/contexts/{graphqlContext.tsx → graphqlContext/graphqlContext.tsx} +0 -0
  672. /package/src/contexts/{shopifyUrlContext.tsx → shopifyUrlContext/shopifyUrlContext.tsx} +0 -0
  673. /package/src/contexts/{systemSettingsContext.tsx → systemSettingsContext/systemSettingsContext.tsx} +0 -0
  674. /package/src/contexts/{userIdentityContext.tsx → userIdentityContext/userIdentityContext.tsx} +0 -0
  675. /package/src/hooks/{useBlockBackButton.ts → BlockBackButton/useBlockBackButton.ts} +0 -0
  676. /package/src/hooks/{useCustomerSupportHandoff.ts → CustomerSupportHandoff/useCustomerSupportHandoff.ts} +0 -0
  677. /package/src/hooks/{useDebounce.ts → Debounce/useDebounce.ts} +0 -0
  678. /package/src/hooks/{useElementObserver.ts → ElementObserver/useElementObserver.ts} +0 -0
  679. /package/src/hooks/{useGrabAndScroll.ts → GrabAndScroll/useGrabAndScroll.ts} +0 -0
  680. /package/src/hooks/{useImageResolver.ts → ImageResolver/useImageResolver.ts} +0 -0
  681. /package/src/hooks/{useIntersection.ts → Intersection/useIntersection.ts} +0 -0
  682. /package/src/hooks/{useIsSmallScreen.ts → IsSmallScreen/useIsSmallScreen.ts} +0 -0
  683. /package/src/hooks/{useMessageFilter.ts → MessageFilter/useMessageFilter.ts} +0 -0
  684. /package/src/hooks/{useMessageScrollObserver.ts → MessageScrollObserver/useMessageScrollObserver.ts} +0 -0
  685. /package/src/hooks/{useSearchOperations.ts → SearchOperations/useSearchOperations.ts} +0 -0
  686. /package/src/hooks/{useSnapCalculator.ts → SnapCalculator/useSnapCalculator.ts} +0 -0
@@ -1,1281 +0,0 @@
1
- import { PageVariantTestType } from "./types--pr1GQQx.js";
2
- import { hasPropertyOfType, isApiPDPAttributes, isApiProductResponseAttributes, isApiProductSearchResponseAttributes, isApiQueryTypedAttributes, isApiResponse, isApiReviewResponseAttributes, isApiSearchAttributes, isApiSuggestionClickedAttributes, isApiTextResponseAttributes, isApiUserEvent, isSuggestion, logger_default } from "./api-DjeZXxl_.js";
3
- import { FormType, FulfillmentDisplayStatus, OrganizationStatusEnum, PLPAttributeCategory, PageVisitCategory, ResponseCategory, UserEventCategory } from "@spiffy-ai/commerce-api-client";
4
-
5
- //#region src/application/models/featureGates.ts
6
- let FeatureGates = /* @__PURE__ */ function(FeatureGates$1) {
7
- FeatureGates$1["IsClientSessionEnabled"] = "is_client_session_enabled";
8
- FeatureGates$1["IsNewFeatureEnabled"] = "is_new_feature_enabled";
9
- FeatureGates$1["IsFineTunedModel8b"] = "is_fine_tuned_model_8b";
10
- FeatureGates$1["IsIntegratedCXEnabled"] = "is_integrated_cx_enabled";
11
- FeatureGates$1["IsNonShapewearEnabled"] = "is_non_shapewear_enabled";
12
- FeatureGates$1["IsImageBannerEnabled"] = "is_image_banner_enabled";
13
- FeatureGates$1["IsOrderLookupEnabled"] = "is_order_lookup_enabled";
14
- FeatureGates$1["IsSummarizeReviewsEnabled"] = "is_summarize_reviews_enabled";
15
- FeatureGates$1["IsGlobalSearchEnabled"] = "is_global_search_enabled";
16
- FeatureGates$1["IsImagePromptEnabled"] = "is_image_prompt_enabled";
17
- FeatureGates$1["IsWatermarkEnabled"] = "is_watermark_enabled";
18
- FeatureGates$1["IsInferenceRegion0"] = "is_inference_region_0";
19
- FeatureGates$1["IsGraphQLUIConfigsEnabled"] = "is_graphql_ui_configs_enabled";
20
- FeatureGates$1["IsGraphQLPageConfigsEnabled"] = "is_graphql_page_configs_enabled";
21
- FeatureGates$1["IsGraphQLComponentConfigsEnabled"] = "is_graphql_component_configs_enabled";
22
- FeatureGates$1["IsChatVariantEnabled"] = "is_chat_variant_enabled";
23
- FeatureGates$1["IsChatVariantAEnabled"] = "is_chat_variant_a_enabled";
24
- FeatureGates$1["IsChatVariantBEnabled"] = "is_chat_variant_b_enabled";
25
- FeatureGates$1["IsUserQueryAlwaysEnabled"] = "is_user_query_always_enabled";
26
- return FeatureGates$1;
27
- }({});
28
-
29
- //#endregion
30
- //#region src/application/models/chatElementDisplayLocation.ts
31
- let ChatElementDisplayLocation = /* @__PURE__ */ function(ChatElementDisplayLocation$1) {
32
- ChatElementDisplayLocation$1["IN_CHAT"] = "in_chat";
33
- ChatElementDisplayLocation$1["CHAT_PREVIEW"] = "chat_preview";
34
- ChatElementDisplayLocation$1["FLOATING_BUTTON"] = "floating_button";
35
- ChatElementDisplayLocation$1["HELP_ME_CHOOSE"] = "help_me_choose";
36
- ChatElementDisplayLocation$1["PLP_IMAGE_BANNER"] = "plp_image_banner";
37
- ChatElementDisplayLocation$1["TOP_REVIEWS_SNIPPET"] = "top_reviews_snippet";
38
- ChatElementDisplayLocation$1["BOTTOM_REVIEWS_SNIPPET"] = "bottom_reviews_snippet";
39
- ChatElementDisplayLocation$1["BLOCK_BACK_BUTTON"] = "block_back_button";
40
- ChatElementDisplayLocation$1["SWITCH_TO_AGENT"] = "switch_to_agent";
41
- ChatElementDisplayLocation$1["CONVERSATIONAL_SEARCH"] = "conversational_search";
42
- ChatElementDisplayLocation$1["GLOBAL_SEARCH_ENTRYPOINT"] = "global_search_entrypoint";
43
- ChatElementDisplayLocation$1["SEARCH_NAV_ENTRYPOINT"] = "search_nav_entrypoint";
44
- ChatElementDisplayLocation$1["SEARCH_PROMPT"] = "search_prompt";
45
- ChatElementDisplayLocation$1["SEARCH_PROMPT_BUTTON"] = "search_prompt_button";
46
- ChatElementDisplayLocation$1["PRODUCT_GRID"] = "product_grid";
47
- ChatElementDisplayLocation$1["UNSPECIFIED"] = "unspecified";
48
- ChatElementDisplayLocation$1["FILTER_MODAL"] = "filter_modal";
49
- ChatElementDisplayLocation$1["PROMPT_CARD"] = "prompt_card";
50
- ChatElementDisplayLocation$1["WINDOW_API_CALL"] = "window_api_call";
51
- return ChatElementDisplayLocation$1;
52
- }({});
53
-
54
- //#endregion
55
- //#region src/application/models/events.ts
56
- let SpiffyEventName = /* @__PURE__ */ function(SpiffyEventName$1) {
57
- SpiffyEventName$1["WidgetOpen"] = "spiffy:widgetopen";
58
- SpiffyEventName$1["WidgetClose"] = "spiffy:widgetclose";
59
- return SpiffyEventName$1;
60
- }({});
61
-
62
- //#endregion
63
- //#region src/application/models/googleAnalyticsEvents.ts
64
- var GoogleAnalyticsEvents = /* @__PURE__ */ function(GoogleAnalyticsEvents$1) {
65
- GoogleAnalyticsEvents$1["ADD_TO_CART_v1"] = "add_to_cart";
66
- GoogleAnalyticsEvents$1["ADD_TO_CART_v2"] = "addToCart";
67
- return GoogleAnalyticsEvents$1;
68
- }(GoogleAnalyticsEvents || {});
69
-
70
- //#endregion
71
- //#region src/application/models/message.ts
72
- let MessageRole = /* @__PURE__ */ function(MessageRole$1) {
73
- MessageRole$1["User"] = "user";
74
- MessageRole$1["Assistant"] = "assistant";
75
- return MessageRole$1;
76
- }({});
77
- let MessageType = /* @__PURE__ */ function(MessageType$1) {
78
- MessageType$1["Text"] = "text";
79
- MessageType$1["SuggestionClicked"] = "suggestion_clicked";
80
- MessageType$1["Product"] = "product";
81
- MessageType$1["ProductSearch"] = "product_search";
82
- MessageType$1["Review"] = "review";
83
- MessageType$1["QueryTyped"] = "query_typed";
84
- MessageType$1["Separator"] = "separator";
85
- MessageType$1["Page"] = "page";
86
- MessageType$1["Search"] = "search";
87
- MessageType$1["Attachment"] = "attachment";
88
- MessageType$1["CXAgentResponse"] = "cx_agent_response";
89
- MessageType$1["Form"] = "form";
90
- MessageType$1["Order"] = "order";
91
- MessageType$1["ProductSearchFilter"] = "product_search_filter";
92
- return MessageType$1;
93
- }({});
94
-
95
- //#endregion
96
- //#region src/application/models/productExperiment.ts
97
- let ProductExperiment = /* @__PURE__ */ function(ProductExperiment$1) {
98
- ProductExperiment$1["Default"] = "default";
99
- return ProductExperiment$1;
100
- }({});
101
-
102
- //#endregion
103
- //#region src/application/models/spiffyWidgets.ts
104
- /**
105
- * Enum of all widget names. These are widgets that are rendered and integrated into
106
- * a merchant's website.
107
- */
108
- let SpiffyWidgets = /* @__PURE__ */ function(SpiffyWidgets$1) {
109
- SpiffyWidgets$1["ImageBanner"] = "image_banner";
110
- SpiffyWidgets$1["ImagePromptCard"] = "image_prompt_card";
111
- SpiffyWidgets$1["SingleImagePrompt"] = "single_image_prompt";
112
- SpiffyWidgets$1["EmbeddedWidget"] = "embedded_widget";
113
- SpiffyWidgets$1["FloatingButton"] = "floating_button";
114
- SpiffyWidgets$1["SuggestionBar"] = "suggestion_bar";
115
- SpiffyWidgets$1["SearchPrompt"] = "search_prompt";
116
- SpiffyWidgets$1["GlobalSearch"] = "global_search";
117
- SpiffyWidgets$1["SearchResults"] = "search_results";
118
- SpiffyWidgets$1["GlobalSearchEntryPoint"] = "global_search_entry_point";
119
- return SpiffyWidgets$1;
120
- }({});
121
-
122
- //#endregion
123
- //#region src/application/models/graphql/queries/getMerchantOrgIdQuery.ts
124
- const getMerchantOrgIdQuery = `
125
- query {
126
- me {
127
- org {
128
- id
129
- }
130
- }
131
- }
132
- `;
133
-
134
- //#endregion
135
- //#region src/application/models/guards/isBaseEcommerceEvent.ts
136
- /**
137
- * Checks if an event is a base Google Analytics ecommerce event.
138
- *
139
- * @param data The event to check.
140
- *
141
- * @returns True if the event is a base ecommerce event, false otherwise.
142
- */
143
- const isBaseEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "event" in data && typeof data.event === "string";
144
-
145
- //#endregion
146
- //#region src/application/models/guards/isGA4EcommerceEvent.ts
147
- /**
148
- * Checks if an event is a Google Analytics 4 ecommerce event.
149
- *
150
- * @param data The event to check.
151
- *
152
- * @returns True if the event is a GA4 ecommerce event, false otherwise.
153
- */
154
- const isGA4EcommerceEvent = (data) => typeof data === "object" && data != null && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "items" in data.ecommerce && Array.isArray(data.ecommerce.items);
155
-
156
- //#endregion
157
- //#region src/application/models/guards/isLegacyUAEcommerceEvent.ts
158
- /**
159
- * Checks if an event is a legacy Universal Analytics ecommerce event.
160
- *
161
- * @param data The event to check.
162
- *
163
- * @returns True if the event is a legacy UA ecommerce event, false otherwise.
164
- */
165
- const isLegacyUAEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "add" in data.ecommerce && typeof data.ecommerce.add === "object";
166
-
167
- //#endregion
168
- //#region src/application/models/guards/isMobilePLPChatPlacementParameter.ts
169
- const isMobilePLPChatPlacementParameter = (value) => value != null && typeof value === "object" && "row_index" in value && typeof value.row_index === "number";
170
-
171
- //#endregion
172
- //#region src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts
173
- const isSpanxTakeAQuizCtaParameter = (value) => value != null && typeof value === "object" && "text" in value && typeof value.text === "string";
174
-
175
- //#endregion
176
- //#region src/application/models/guards/isVariantInfo.ts
177
- const isPDPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "pdp" && "productId" in variantInfo && typeof variantInfo.productId === "string";
178
- const isPLPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "plp" && "plpId" in variantInfo && typeof variantInfo.plpId === "string";
179
- const isPageVisitVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "page_visit" && "url" in variantInfo && typeof variantInfo.url === "string" && "pageVisitCategory" in variantInfo && Object.values(PageVisitCategory).includes(variantInfo.pageVisitCategory);
180
- /**
181
- * Type guard to check if an object is a valid VariantInfo.
182
- *
183
- * @param variantInfo - The unknown object to check.
184
- *
185
- * @returns True if the data is a valid VariantInfo object, false otherwise.
186
- */
187
- const isVariantInfo = (variantInfo) => variantInfo != null && typeof variantInfo === "object" && "variantId" in variantInfo && (isPDPVariantInfo(variantInfo) || isPLPVariantInfo(variantInfo) || isPageVisitVariantInfo(variantInfo));
188
-
189
- //#endregion
190
- //#region src/application/models/guards/api/isApiFormResponse.ts
191
- /**
192
- * Type guard to check if the provided data has the all of the properties (with the correct types) of
193
- * a FormResponseAttribute
194
- *
195
- * @param data - The data to check
196
- *
197
- * @returns true if the data has the correct properties, false otherwise
198
- */
199
- const isApiFormResponseAttributes = (data) => {
200
- if (data == null || typeof data !== "object") {
201
- logger_default.logError("isApiFormResponseAttributes: data is null or not an object", void 0, { data });
202
- return false;
203
- }
204
- if ("form_category" in data && typeof data.form_category !== "object") {
205
- logger_default.logError("isApiFormResponseAttributes: form_category is not an object", void 0, { data });
206
- return false;
207
- }
208
- if ("form_category" in data && typeof data.form_category === "object") {
209
- if (!hasPropertyOfType(data.form_category, "form_type", "string") || !Object.values(FormType).includes(data.form_category.form_type)) {
210
- logger_default.logError("isApiFormResponseAttributes: form_type is missing or not a valid form type", void 0, { data });
211
- return false;
212
- }
213
- }
214
- if (!hasPropertyOfType(data, "schema", "object")) {
215
- logger_default.logError("isApiFormResponseAttributes: schema is missing or not an object", void 0, { data });
216
- return false;
217
- }
218
- if (!hasPropertyOfType(data.schema, "properties", "object")) {
219
- logger_default.logError("isApiFormResponseAttributes: schema.properties is missing or not an object", void 0, { data });
220
- return false;
221
- }
222
- if (!hasPropertyOfType(data.schema, "required", "array")) {
223
- logger_default.logError("isApiFormResponseAttributes: schema.required is missing or not an array", void 0, { data });
224
- return false;
225
- }
226
- if (!data.schema.required.every((key) => typeof key === "string" && key in data.schema.properties)) {
227
- logger_default.logError("isApiFormResponseAttributes: schema.required contains invalid property keys", void 0, { data });
228
- return false;
229
- }
230
- return true;
231
- };
232
-
233
- //#endregion
234
- //#region src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts
235
- const isApiFormSubmittedResponseAttributes = (data) => {
236
- if (data == null || typeof data !== "object") {
237
- logger_default.logError("isApiFormSubmittedResponseAttributes", "data is null or not an object", data);
238
- return false;
239
- }
240
- if (!hasPropertyOfType(data, "filled_schema", "object")) {
241
- logger_default.logError("isApiFormSubmittedResponseAttributes", "filled_schema is not an object", data);
242
- return false;
243
- }
244
- if (!hasPropertyOfType(data, "form_response_id", "string")) {
245
- logger_default.logError("isApiFormSubmittedResponseAttributes", "form_response_id is not a string", data);
246
- return false;
247
- }
248
- if (!("form_type" in data) || !Object.values(FormType).includes(data.form_type)) {
249
- logger_default.logError("isApiFormSubmittedResponseAttributes", "form_type is not a valid form type enum", data);
250
- return false;
251
- }
252
- return true;
253
- };
254
-
255
- //#endregion
256
- //#region src/application/models/guards/api/isApiOrderResponseAttributes.ts
257
- const isApiOrderItemInfo = (data) => {
258
- if (data == null || typeof data !== "object") {
259
- logger_default.logError("OrderItemInfo must be an object", void 0, { data });
260
- return false;
261
- }
262
- if (!hasPropertyOfType(data, "order_item_id", "string")) {
263
- logger_default.logError("OrderItemInfo must have an order_item_id property", void 0, { data });
264
- return false;
265
- }
266
- if (!hasPropertyOfType(data, "item_title", "string")) {
267
- logger_default.logError("OrderItemInfo must have an item_title property", void 0, { data });
268
- return false;
269
- }
270
- if (!hasPropertyOfType(data, "item_price", "number")) {
271
- logger_default.logError("OrderItemInfo must have an item_price property", void 0, { data });
272
- return false;
273
- }
274
- if (!hasPropertyOfType(data, "item_quantity", "number")) {
275
- logger_default.logError("OrderItemInfo must have an item_quantity property", void 0, { data });
276
- return false;
277
- }
278
- if (!hasPropertyOfType(data, "image", "string", true)) {
279
- logger_default.logError("OrderItemInfo.image must be a string or null", void 0, { data });
280
- return false;
281
- }
282
- if (!hasPropertyOfType(data, "fulfillment_display_status", "string", true)) {
283
- logger_default.logError("OrderItemInfo.fulfillment_display_status must be a string or null", void 0, { data });
284
- return false;
285
- }
286
- if (!hasPropertyOfType(data, "tracking_url", "string", true)) {
287
- logger_default.logError("OrderItemInfo.tracking_url must be a string or null", void 0, { data });
288
- return false;
289
- }
290
- if (!hasPropertyOfType(data, "delivered_at", "string", true)) {
291
- logger_default.logError("OrderItemInfo.delivered_at must be a string or null", void 0, { data });
292
- return false;
293
- }
294
- if (!hasPropertyOfType(data, "estimated_delivery_at", "string", true)) {
295
- logger_default.logError("OrderItemInfo.estimated_delivery_at must be a string or null", void 0, { data });
296
- return false;
297
- }
298
- if (!hasPropertyOfType(data, "in_transit_at", "string", true)) {
299
- logger_default.logError("OrderItemInfo.in_transit_at must be a string or null", void 0, { data });
300
- return false;
301
- }
302
- return true;
303
- };
304
- const isApiOrderResponseAttributes = (data) => {
305
- if (data == null || typeof data !== "object") {
306
- logger_default.logError("Order response attributes must be an object", void 0, { data });
307
- return false;
308
- }
309
- if (!hasPropertyOfType(data, "created_at", "string")) {
310
- logger_default.logError("Order response attributes must have a created_at property and have type string", void 0, { data });
311
- return false;
312
- }
313
- if (!hasPropertyOfType(data, "latest_event_date", "string")) {
314
- logger_default.logError("Order response attributes must have a latest_event_date property and have type string", void 0, { data });
315
- return false;
316
- }
317
- if (!hasPropertyOfType(data, "line_items", "array") || !data.line_items.every((item) => isApiOrderItemInfo(item))) {
318
- logger_default.logError("Order response attributes must have a line_items property with at least one order item", void 0, { data });
319
- return false;
320
- }
321
- if (!hasPropertyOfType(data, "order_id", "string")) {
322
- logger_default.logError("Order response attributes must have an order_id property and have type string", void 0, { data });
323
- return false;
324
- }
325
- if (!hasPropertyOfType(data, "order_number", "string")) {
326
- logger_default.logError("Order response attributes must have an order_number property and have type string", void 0, { data });
327
- return false;
328
- }
329
- return true;
330
- };
331
-
332
- //#endregion
333
- //#region src/application/models/guards/api/isApiOrganizationConfig.ts
334
- const isApiOrgAnalyticsConfigAmplitude = (data) => {
335
- if (data == null || typeof data !== "object") {
336
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: data is not an object", data);
337
- return false;
338
- }
339
- if (!("session_replay_enabled" in data) || typeof data.session_replay_enabled !== "boolean") {
340
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_enabled is not a boolean", data);
341
- return false;
342
- }
343
- if (!("session_replay_sample_rate" in data) || typeof data.session_replay_sample_rate !== "number") {
344
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_sample_rate is not a number", data);
345
- return false;
346
- }
347
- if (!("tracking_enabled" in data) || typeof data.tracking_enabled !== "boolean") {
348
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: tracking_enabled is not a boolean", data);
349
- return false;
350
- }
351
- return true;
352
- };
353
- const isApiOrgAnalyticsConfigCustomerService = (data) => {
354
- if (data == null || typeof data !== "object") {
355
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: data is not an object", data);
356
- return false;
357
- }
358
- if (!("provider" in data) || typeof data.provider !== "string") {
359
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: provider is not a string", data);
360
- return false;
361
- }
362
- return true;
363
- };
364
- const isApiOrgAnalyticsConfigGoogleAnalytics = (data) => {
365
- if (data == null || typeof data !== "object") {
366
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: data is not an object", data);
367
- return false;
368
- }
369
- if (!("measurement_id" in data) || typeof data.measurement_id !== "string") {
370
- logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: measurement_id is not a string", data);
371
- return false;
372
- }
373
- return true;
374
- };
375
- /**
376
- *
377
- * @param data
378
- * @returns
379
- */
380
- const isApiOrgAnalyticsConfig = (data) => {
381
- if (data == null || typeof data !== "object") {
382
- logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: data is not an object", data);
383
- return false;
384
- }
385
- if ("amplitude" in data && !isApiOrgAnalyticsConfigAmplitude(data.amplitude)) {
386
- logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: amplitude is not an object", data);
387
- return false;
388
- }
389
- if ("customer_service" in data && !isApiOrgAnalyticsConfigCustomerService(data.customer_service)) {
390
- logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: customer_service is not an object", data);
391
- return false;
392
- }
393
- if ("google_analytics" in data && !isApiOrgAnalyticsConfigGoogleAnalytics(data.google_analytics)) {
394
- logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: google_analytics is not an object", data);
395
- return false;
396
- }
397
- return true;
398
- };
399
- /**
400
- *
401
- * @param data
402
- * @returns
403
- */
404
- const isApiOrganizationConfig = (data) => {
405
- if (data == null || typeof data !== "object") {
406
- logger_default.logDebug("[spiffy-ai] isOrgConfig: data is not an object", data);
407
- return false;
408
- }
409
- if (!("created_at" in data)) {
410
- logger_default.logDebug("[spiffy-ai] isOrgConfig: created_at is not defined", data);
411
- return false;
412
- }
413
- if (!("namespace" in data) || typeof data.namespace !== "string") {
414
- logger_default.logDebug("[spiffy-ai] isOrgConfig: namespace is not a string", data);
415
- return false;
416
- }
417
- if (!("is_latest" in data) || typeof data.is_latest !== "boolean") {
418
- logger_default.logDebug("[spiffy-ai] isOrgConfig: is_latest is not a boolean", data);
419
- return false;
420
- }
421
- if (!("version" in data) || typeof data.version !== "string") {
422
- logger_default.logDebug("[spiffy-ai] isOrgConfig: version is not a string", data);
423
- return false;
424
- }
425
- if (!("updated_at" in data)) {
426
- logger_default.logDebug("[spiffy-ai] isOrgConfig: updated_at is not defined", data);
427
- return false;
428
- }
429
- if (!("config" in data) || typeof data.config !== "object" || !isApiOrgAnalyticsConfig(data.config)) {
430
- logger_default.logDebug("[spiffy-ai] isOrgConfig: config is not an object", data);
431
- return false;
432
- }
433
- if ("organization_id" in data && typeof data.organization_id !== "string") {
434
- logger_default.logDebug("[spiffy-ai] isOrgConfig: organization_id is not a string", data);
435
- return false;
436
- }
437
- if ("id" in data && typeof data.id !== "string") {
438
- logger_default.logDebug("[spiffy-ai] isOrgConfig: id is not a string", data);
439
- return false;
440
- }
441
- return true;
442
- };
443
-
444
- //#endregion
445
- //#region src/application/models/guards/api/isApiOrgConfigResults.ts
446
- const isApiOrgConfigExperiment = (data) => {
447
- if (data == null || typeof data !== "object") {
448
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: data is not an object", void 0, { data });
449
- return false;
450
- }
451
- if ("group" in data && typeof data.group !== "string" && data.group !== void 0) {
452
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group is not a string or undefined", void 0, { data });
453
- return false;
454
- }
455
- if ("group_name" in data && typeof data.group_name !== "string" && data.group_name !== void 0) {
456
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group_name is not a string", void 0, { data });
457
- return false;
458
- }
459
- if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
460
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: name is not a string", void 0, { data });
461
- return false;
462
- }
463
- if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
464
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: rule_id is not a string", void 0, { data });
465
- return false;
466
- }
467
- if ("value" in data && typeof data.value !== "object" && data.value !== void 0) {
468
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: value is not an object", void 0, { data });
469
- return false;
470
- }
471
- return true;
472
- };
473
- const isApiOrgConfigFeatureGate = (data) => {
474
- if (data == null || typeof data !== "object") {
475
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: data is not an object", void 0, { data });
476
- return false;
477
- }
478
- if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
479
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: name is not a string", void 0, { data });
480
- return false;
481
- }
482
- if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
483
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: rule_id is not a string", void 0, { data });
484
- return false;
485
- }
486
- if ("value" in data && typeof data.value !== "boolean" && data.value !== void 0) {
487
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: value is not a boolean", void 0, { data });
488
- return false;
489
- }
490
- return true;
491
- };
492
- const isApiOrganization = (data) => {
493
- if (data == null || typeof data !== "object") {
494
- logger_default.logDebug("[spiffy-ai] isApiOrganization: data is not an object", void 0, { data });
495
- return false;
496
- }
497
- if (!("id" in data) || typeof data.id !== "string") {
498
- logger_default.logDebug("[spiffy-ai] isApiOrganization: id is not a string", void 0, { data });
499
- return false;
500
- }
501
- if (!("display_name" in data) || typeof data.display_name !== "string") {
502
- logger_default.logDebug("[spiffy-ai] isApiOrganization: display_name is not a string", void 0, { data });
503
- return false;
504
- }
505
- if (!("domain" in data) || typeof data.domain !== "string") {
506
- logger_default.logDebug("[spiffy-ai] isApiOrganization: domain is not a string", void 0, { data });
507
- return false;
508
- }
509
- if (!("short_name" in data) || typeof data.short_name !== "string") {
510
- logger_default.logDebug("[spiffy-ai] isApiOrganization: short_name is not a string", void 0, { data });
511
- return false;
512
- }
513
- if (!("status" in data) || !Object.values(OrganizationStatusEnum).includes(data.status)) {
514
- logger_default.logDebug("[spiffy-ai] isApiOrganization: status is not a valid OrganizationStatusEnum value", void 0, { data });
515
- return false;
516
- }
517
- if ("created_at" in data && !(data.created_at instanceof Date) && typeof data.created_at !== "string" && data.created_at !== void 0) {
518
- logger_default.logDebug("[spiffy-ai] isApiOrganization: created_at is not a Date", void 0, { data });
519
- return false;
520
- }
521
- if ("updated_at" in data && !(data.updated_at instanceof Date) && typeof data.updated_at !== "string" && data.updated_at !== void 0) {
522
- logger_default.logDebug("[spiffy-ai] isApiOrganization: updated_at is not a Date", void 0, { data });
523
- return false;
524
- }
525
- return true;
526
- };
527
- const isApiOrgConfigOrganizationSettings = (data) => {
528
- if (data == null || typeof data !== "object") {
529
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: data is not an object", void 0, { data });
530
- return false;
531
- }
532
- if (!("org" in data) || !isApiOrganization(data.org)) {
533
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: org is not an object", void 0, { data });
534
- return false;
535
- }
536
- return true;
537
- };
538
- /**
539
- *
540
- * @param data
541
- * @returns
542
- */
543
- const isApiOrgConfigResults = (data) => {
544
- if (data == null || typeof data !== "object") {
545
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: data is not an object", void 0, { data });
546
- return false;
547
- }
548
- if (!("configs" in data) || !Array.isArray(data.configs) || !data.configs.every((config) => isApiOrganizationConfig(config))) {
549
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: configs is not an array", void 0, { data });
550
- return false;
551
- }
552
- if ("experiments" in data && data.experiments !== void 0 && (!Array.isArray(data.experiments) || !data.experiments.every((exp) => isApiOrgConfigExperiment(exp)))) {
553
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: experiments is not an array or contains invalid items", void 0, { data });
554
- return false;
555
- }
556
- if (!("gates" in data) || !Array.isArray(data.gates) || !data.gates.every((gate) => isApiOrgConfigFeatureGate(gate))) {
557
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: gates is not an array or contains invalid items", void 0, { data });
558
- return false;
559
- }
560
- if (!("org" in data) || !isApiOrgConfigOrganizationSettings(data.org)) {
561
- logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: org is not an object or has invalid fields", void 0, { data });
562
- return false;
563
- }
564
- return true;
565
- };
566
-
567
- //#endregion
568
- //#region src/application/models/guards/api/isApiPageResponseAttributes.ts
569
- const isApiPageResponseAttributes = (obj) => {
570
- if (obj == null || typeof obj !== "object") return false;
571
- if ("title" in obj && obj.title != null && typeof obj.title !== "string") return false;
572
- if ("description" in obj && typeof obj.description !== "string") return false;
573
- if ("url" in obj && typeof obj.url !== "string") return false;
574
- return true;
575
- };
576
-
577
- //#endregion
578
- //#region src/application/models/guards/api/isApiPLPEventAttributes.ts
579
- const isApiPLPIdAttribute = (data) => {
580
- if (data == null || typeof data !== "object") return false;
581
- if (!("id" in data) || typeof data.id !== "string") return false;
582
- return true;
583
- };
584
- const isApiPLPEventAttributes = (data) => {
585
- if (data == null || typeof data !== "object") return false;
586
- if (!("category" in data) || typeof data.category !== "string" || !Object.values(PLPAttributeCategory).includes(data.category)) return false;
587
- if (!("attributes" in data) || typeof data.attributes !== "object" || !isApiPLPIdAttribute(data.attributes)) return false;
588
- return true;
589
- };
590
-
591
- //#endregion
592
- //#region src/application/models/guards/api/isApiProductSearchFilterAttributes.ts
593
- const isApiProductSearchFilterResponseAttributes = (attributes) => {
594
- if (attributes == null || typeof attributes !== "object") return false;
595
- if ("filter_name" in attributes && typeof attributes.filter_name !== "string") return false;
596
- return true;
597
- };
598
-
599
- //#endregion
600
- //#region src/application/models/guards/graphQL/isGraphQLColorsConfig.ts
601
- const REQUIRED_COLOR_FIELDS = [
602
- "accent_primary",
603
- "accent_secondary",
604
- "background_dark",
605
- "background_light",
606
- "background_primary",
607
- "background_saturated",
608
- "background_secondary",
609
- "background_secondary_dark",
610
- "background_tertiary",
611
- "border_dark",
612
- "border_light",
613
- "border_medium",
614
- "border_outline",
615
- "text_accent",
616
- "text_light",
617
- "text_link",
618
- "text_primary",
619
- "text_secondary"
620
- ];
621
- const isGraphQLColorsConfig = (data) => {
622
- if (typeof data !== "object" || data === null) {
623
- logger_default.logError("Invalid graphql response for colors config", void 0, { data });
624
- return false;
625
- }
626
- const missingFields = REQUIRED_COLOR_FIELDS.filter((field) => !(field in data) || typeof data[field] !== "string");
627
- if (missingFields.length === REQUIRED_COLOR_FIELDS.length) {
628
- logger_default.logError("All color fields are missing or null", void 0);
629
- return false;
630
- }
631
- if (missingFields.length > 0) {
632
- logger_default.logError("Missing or invalid color fields", void 0, {
633
- data,
634
- missingFields
635
- });
636
- return false;
637
- }
638
- return true;
639
- };
640
-
641
- //#endregion
642
- //#region src/application/models/utils/snakeToCamelTransformer.ts
643
- /**
644
- * Generic utility to transform snake_case object keys to camelCase at runtime.
645
- * This is the runtime equivalent of the CamelCasedPropertiesDeep type utility.
646
- */
647
- const PRESERVED_ACRONYMS = [
648
- "PLP",
649
- "PDP",
650
- "SVG"
651
- ];
652
- /**
653
- * Converts a snake_case string to camelCase
654
- * Handles specific acronyms like PLP and PDP correctly
655
- */
656
- const toCamelCase = (str) => {
657
- let processedStr = str;
658
- for (const acronym of PRESERVED_ACRONYMS) {
659
- const regex = new RegExp(`_${acronym}_?`, "gi");
660
- if (processedStr.match(regex)) processedStr = processedStr.replace(regex, (v) => v.endsWith("_") ? `${acronym}_` : `${acronym}`);
661
- }
662
- return processedStr.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
663
- };
664
- /**
665
- * Converts a camelCase string to snake_case
666
- * Handles consecutive capital letters correctly (e.g., "PDP" -> "pdp", not "p_d_p")
667
- * Preserves specific acronyms like PLP and PDP as lowercase in snake_case
668
- */
669
- const toSnakeCase = (str) => str.replace(/([A-Z])(?=[a-z])/g, "_$1").replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/^_/, "");
670
- /**
671
- * Recursively transforms all object keys from snake_case to camelCase
672
- */
673
- const transformSnakeToCamel = (obj) => {
674
- if (obj === null || obj === void 0) return obj;
675
- if (Array.isArray(obj)) return obj.map((val) => transformSnakeToCamel(val));
676
- if (typeof obj === "object") {
677
- const result = {};
678
- for (const [key, value] of Object.entries(obj)) {
679
- const camelKey = toCamelCase(key);
680
- result[camelKey] = transformSnakeToCamel(value);
681
- }
682
- return result;
683
- }
684
- return obj;
685
- };
686
- /**
687
- * Recursively transforms all object keys from camelCase to snake_case
688
- */
689
- const transformCamelToSnake = (obj) => {
690
- if (obj === null || obj === void 0) return obj;
691
- if (Array.isArray(obj)) return obj.map(transformCamelToSnake);
692
- if (typeof obj === "object") {
693
- const result = {};
694
- for (const [key, value] of Object.entries(obj)) {
695
- const snakeKey = toSnakeCase(key);
696
- result[snakeKey] = transformCamelToSnake(value);
697
- }
698
- return result;
699
- }
700
- return obj;
701
- };
702
-
703
- //#endregion
704
- //#region src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts
705
- /**
706
- * Converts a string to a FulfillmentDisplayStatus enum value.
707
- *
708
- * @param status - The string to convert.
709
- *
710
- * @returns The FulfillmentDisplayStatus enum value or undefined if the string
711
- * does not map to a valid enum
712
- */
713
- const stringToFulfillmentDisplayStatusEnumValue = (status) => {
714
- switch (status) {
715
- case "ATTEMPTED_DELIVERY": return FulfillmentDisplayStatus.ATTEMPTED_DELIVERY;
716
- case "CANCELED": return FulfillmentDisplayStatus.CANCELED;
717
- case "CONFIRMED": return FulfillmentDisplayStatus.CONFIRMED;
718
- case "DELIVERED": return FulfillmentDisplayStatus.DELIVERED;
719
- case "FAILURE": return FulfillmentDisplayStatus.FAILURE;
720
- case "FULFILLED": return FulfillmentDisplayStatus.FULFILLED;
721
- case "IN_TRANSIT": return FulfillmentDisplayStatus.IN_TRANSIT;
722
- case "LABEL_PRINTED": return FulfillmentDisplayStatus.LABEL_PRINTED;
723
- case "LABEL_PURCHASED": return FulfillmentDisplayStatus.LABEL_PURCHASED;
724
- case "LABEL_VOIDED": return FulfillmentDisplayStatus.LABEL_VOIDED;
725
- case "MARKED_AS_FULFILLED": return FulfillmentDisplayStatus.MARKED_AS_FULFILLED;
726
- case "NOT_DELIVERED": return FulfillmentDisplayStatus.NOT_DELIVERED;
727
- case "OUT_FOR_DELIVERY": return FulfillmentDisplayStatus.OUT_FOR_DELIVERY;
728
- case "PICKED_UP": return FulfillmentDisplayStatus.PICKED_UP;
729
- case "READY_FOR_PICKUP": return FulfillmentDisplayStatus.READY_FOR_PICKUP;
730
- case "SUBMITTED": return FulfillmentDisplayStatus.SUBMITTED;
731
- case "IN_PROGRESS": return FulfillmentDisplayStatus.IN_PROGRESS;
732
- case "ON_HOLD": return FulfillmentDisplayStatus.ON_HOLD;
733
- case "OPEN": return FulfillmentDisplayStatus.OPEN;
734
- case "PARTIALLY_FULFILLED": return FulfillmentDisplayStatus.PARTIALLY_FULFILLED;
735
- case "PENDING_FULFILLMENT": return FulfillmentDisplayStatus.PENDING_FULFILLMENT;
736
- case "REQUEST_DECLINED": return FulfillmentDisplayStatus.REQUEST_DECLINED;
737
- case "RESTOCKED": return FulfillmentDisplayStatus.RESTOCKED;
738
- case "SCHEDULED": return FulfillmentDisplayStatus.SCHEDULED;
739
- case "UNFULFILLED": return FulfillmentDisplayStatus.UNFULFILLED;
740
- default: return;
741
- }
742
- };
743
-
744
- //#endregion
745
- //#region src/application/models/validators/validateGraphQLColorsConfig.ts
746
- const validateGraphQLColorsConfig = (data) => {
747
- if (!isGraphQLColorsConfig(data)) return;
748
- };
749
-
750
- //#endregion
751
- //#region src/merchants/domInsertion.ts
752
- var DOMInsertionType = /* @__PURE__ */ function(DOMInsertionType$1) {
753
- DOMInsertionType$1["AFTER"] = "after";
754
- DOMInsertionType$1["BEFORE"] = "before";
755
- DOMInsertionType$1["ADJACENT_AFTER_BEGIN"] = "adjacent-after-begin";
756
- DOMInsertionType$1["ADJACENT_BEFORE_BEGIN"] = "adjacent-before-begin";
757
- DOMInsertionType$1["ADJACENT_AFTER_END"] = "adjacent-after-end";
758
- DOMInsertionType$1["ADJACENT_BEFORE_END"] = "adjacent-before-end";
759
- DOMInsertionType$1["APPEND_CHILD"] = "append-child";
760
- DOMInsertionType$1["NONE"] = "none";
761
- return DOMInsertionType$1;
762
- }(DOMInsertionType || {});
763
-
764
- //#endregion
765
- //#region src/merchants/gridInsertion.ts
766
- var GridInsertionType = /* @__PURE__ */ function(GridInsertionType$1) {
767
- GridInsertionType$1["FIXED_1"] = "fixed-1";
768
- GridInsertionType$1["FIXED_2"] = "fixed-2";
769
- GridInsertionType$1["FIXED_3"] = "fixed-3";
770
- GridInsertionType$1["FIXED_4"] = "fixed-4";
771
- GridInsertionType$1["FIXED_5"] = "fixed-5";
772
- GridInsertionType$1["FIXED_6"] = "fixed-6";
773
- GridInsertionType$1["FIXED_7"] = "fixed-7";
774
- GridInsertionType$1["FIXED_8"] = "fixed-8";
775
- GridInsertionType$1["FIXED_9"] = "fixed-9";
776
- GridInsertionType$1["FIXED_12"] = "fixed-12";
777
- GridInsertionType$1["FIXED_13"] = "fixed-13";
778
- GridInsertionType$1["ROW_1"] = "row-1";
779
- GridInsertionType$1["ROW_2"] = "row-2";
780
- GridInsertionType$1["ROW_3"] = "row-3";
781
- GridInsertionType$1["ROW_4"] = "row-4";
782
- return GridInsertionType$1;
783
- }(GridInsertionType || {});
784
-
785
- //#endregion
786
- //#region src/application/models/validators/validateGraphQLFrontendConfig.ts
787
- const validateAndTransformPageVariants = (config) => {
788
- const { variantChecks, widgetMounting,...rest } = transformSnakeToCamel(config);
789
- const variantTests = Array.isArray(variantChecks) ? variantChecks.map(({ checkType,...restCheck }) => ({
790
- ...restCheck,
791
- testType: checkType
792
- })) : [];
793
- const normalizedWidgetMounting = Array.isArray(widgetMounting) ? widgetMounting.map(({ mountingPointWidgets,...restMounting }) => ({
794
- ...restMounting,
795
- ...Array.isArray(mountingPointWidgets) ? { mountingPointWidgets: mountingPointWidgets.map(({ checks,...restWidget }) => ({
796
- ...restWidget,
797
- tests: Array.isArray(checks) ? checks.map(({ checkType,...restCheck }) => ({
798
- ...restCheck,
799
- testType: checkType
800
- })) : []
801
- })) } : {}
802
- })) : [];
803
- const normalizedConfig = {
804
- ...rest,
805
- ...variantTests ? { variantTests } : {},
806
- ...normalizedWidgetMounting ? { widgetMounting: normalizedWidgetMounting } : {}
807
- };
808
- const variantId = normalizedConfig.variantId;
809
- const variantType = normalizedConfig.variantType;
810
- if (typeof variantId !== "string" || !variantId) throw new Error(`Missing or invalid variantId for pageVariant`);
811
- if (typeof variantType !== "string" || !variantType) throw new Error(`Missing or invalid variantType for pageVariant '${variantId}'`);
812
- if (!Array.isArray(variantTests)) throw new Error(`Missing or invalid variantTests for pageVariant '${variantId}'. Must be an array`);
813
- for (const test of variantTests) {
814
- if (!test.testType || typeof test.testType !== "string") throw new Error(`Invalid variantTest.testType for pageVariant '${variantId}'`);
815
- if (!Object.values(PageVariantTestType).includes(test.testType)) throw new Error(`Invalid testType '${test.testType}' for pageVariant '${variantId}'. Valid types: ${Object.values(PageVariantTestType).join(", ")}`);
816
- }
817
- if (!Array.isArray(normalizedWidgetMounting)) throw new Error(`Missing or invalid widgetMounting for pageVariant '${variantId}'. Must be an array`);
818
- for (const mounting of normalizedWidgetMounting) {
819
- if (typeof mounting.mountingConfigId !== "string" || !mounting.mountingConfigId) throw new Error(`Invalid mountingConfigId in widgetMounting for pageVariant '${variantId}'`);
820
- if (mounting.widgetConfigId && typeof mounting.widgetConfigId !== "string") throw new Error(`Invalid widgetConfigId in widgetMounting for pageVariant '${variantId}'`);
821
- if (mounting.mountingPointWidgets) for (const widget of mounting.mountingPointWidgets) {
822
- if (typeof widget.widgetConfigId !== "string" || !widget.widgetConfigId) throw new Error(`Invalid widgetConfigId in mountingPointWidgets for pageVariant '${variantId}'`);
823
- if (!Array.isArray(widget.tests)) throw new Error(`Invalid or missing tests in mountingPointWidgets for pageVariant '${variantId}'`);
824
- }
825
- }
826
- if (variantType === "plp") {
827
- if (typeof normalizedConfig.plpIdExtractor !== "string" || !normalizedConfig.plpIdExtractor) throw new Error(`Missing or invalid plpIdExtractor for PLP pageVariant '${variantId}'`);
828
- }
829
- if (variantType === "pdp") {
830
- if (typeof normalizedConfig.productIdExtractor !== "string" || !normalizedConfig.productIdExtractor) throw new Error(`Missing or invalid productIdExtractor for PDP pageVariant '${variantId}'`);
831
- if (normalizedConfig.parentProductIdExtractor && typeof normalizedConfig.parentProductIdExtractor !== "string") throw new Error(`Invalid parentProductIdExtractor for PDP pageVariant '${variantId}'. Must be string if provided`);
832
- }
833
- return normalizedConfig;
834
- };
835
- const validateAndTransformMountingConfig = (config, configKey) => {
836
- const normalizedConfig = { ...config };
837
- if (normalizedConfig.checkId && !normalizedConfig.testId) {
838
- normalizedConfig.testId = normalizedConfig.checkId;
839
- delete normalizedConfig.checkId;
840
- }
841
- if (typeof normalizedConfig.mountingConfigId !== "string" || !normalizedConfig.mountingConfigId) throw new Error(`Missing or invalid mountingConfigId for config '${configKey}'`);
842
- if (typeof normalizedConfig.containerId !== "string" || !normalizedConfig.containerId) throw new Error(`Missing or invalid containerId for config '${configKey}'`);
843
- if (typeof normalizedConfig.testId !== "string" || !normalizedConfig.testId) throw new Error(`Missing or invalid testId for config '${configKey}'`);
844
- if (!normalizedConfig.insertionPoint || typeof normalizedConfig.insertionPoint !== "object" || Array.isArray(normalizedConfig.insertionPoint)) throw new Error(`Missing or invalid insertionPoint for config '${configKey}'`);
845
- const insertionPoint = normalizedConfig.insertionPoint;
846
- if (typeof insertionPoint.selector !== "string" || !insertionPoint.selector) throw new Error(`Missing or invalid insertionPoint.selector for config '${configKey}'`);
847
- if (typeof insertionPoint.insertionType !== "string" || !insertionPoint.insertionType) throw new Error(`Missing or invalid insertionPoint.insertionType for config '${configKey}'`);
848
- if (!Object.values(DOMInsertionType).includes(insertionPoint.insertionType)) throw new Error(`Invalid insertionPoint.insertionType '${insertionPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
849
- if (insertionPoint.selectionIndex != null && typeof insertionPoint.selectionIndex !== "number") throw new Error(`Invalid insertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
850
- let parentInsertionPoint;
851
- if (normalizedConfig.parentInsertionPoint) {
852
- if (typeof normalizedConfig.parentInsertionPoint !== "object" || Array.isArray(normalizedConfig.parentInsertionPoint)) throw new Error(`Invalid parentInsertionPoint for config '${configKey}'. Must be an object`);
853
- const parentPoint = normalizedConfig.parentInsertionPoint;
854
- if (typeof parentPoint.selector !== "string" || !parentPoint.selector) throw new Error(`Missing or invalid parentInsertionPoint.selector for config '${configKey}'`);
855
- if (typeof parentPoint.insertionType !== "string" || !parentPoint.insertionType) throw new Error(`Missing or invalid parentInsertionPoint.insertionType for config '${configKey}'`);
856
- if (!Object.values(DOMInsertionType).includes(parentPoint.insertionType)) throw new Error(`Invalid parentInsertionPoint.insertionType '${parentPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
857
- if (parentPoint.selectionIndex != null && typeof parentPoint.selectionIndex !== "number") throw new Error(`Invalid parentInsertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
858
- parentInsertionPoint = {
859
- selector: parentPoint.selector,
860
- insertionType: parentPoint.insertionType,
861
- selectionIndex: parentPoint.selectionIndex
862
- };
863
- }
864
- let wrappingElement;
865
- if (normalizedConfig.wrappingElement) {
866
- if (typeof normalizedConfig.wrappingElement !== "object" || Array.isArray(normalizedConfig.wrappingElement)) throw new Error(`Invalid wrappingElement for config '${configKey}'. Must be an object`);
867
- const wrapping = normalizedConfig.wrappingElement;
868
- if (typeof wrapping.className !== "string" || !wrapping.className) throw new Error(`Missing or invalid wrappingElement.className for config '${configKey}'`);
869
- if (typeof wrapping.element !== "string" || !wrapping.element) throw new Error(`Missing or invalid wrappingElement.element for config '${configKey}'`);
870
- if (typeof wrapping.insertionType !== "string" || !wrapping.insertionType) throw new Error(`Missing or invalid wrappingElement.insertionType for config '${configKey}'`);
871
- if (!Object.values(DOMInsertionType).includes(wrapping.insertionType)) throw new Error(`Invalid wrappingElement.insertionType '${wrapping.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
872
- wrappingElement = {
873
- className: wrapping.className,
874
- element: wrapping.element,
875
- insertionType: wrapping.insertionType
876
- };
877
- }
878
- if (normalizedConfig.divCheckSelector != null && typeof normalizedConfig.divCheckSelector !== "string") throw new Error(`Invalid divCheckSelector for config '${configKey}'. Must be a string or null/undefined`);
879
- if (normalizedConfig.className != null && typeof normalizedConfig.className !== "string") throw new Error(`Invalid className for config '${configKey}'. Must be a string or null/undefined`);
880
- if (normalizedConfig.suppressionSelector != null && typeof normalizedConfig.suppressionSelector !== "string") throw new Error(`Invalid suppressionSelector for config '${configKey}'. Must be a string or null/undefined`);
881
- if (normalizedConfig.dataAttributes != null && (typeof normalizedConfig.dataAttributes !== "object" || Array.isArray(normalizedConfig.dataAttributes))) throw new Error(`Invalid dataAttributes for config '${configKey}'. Must be an object or null/undefined`);
882
- if (normalizedConfig.style != null && (typeof normalizedConfig.style !== "object" || Array.isArray(normalizedConfig.style))) throw new Error(`Invalid style for config '${configKey}'. Must be an object or null/undefined`);
883
- let gridInsertionType;
884
- if (normalizedConfig.gridInsertionType) {
885
- if (typeof normalizedConfig.gridInsertionType !== "string" || !normalizedConfig.gridInsertionType) throw new Error(`Invalid gridInsertionType for config '${configKey}'. Must be a string`);
886
- if (!Object.values(GridInsertionType).includes(normalizedConfig.gridInsertionType)) throw new Error(`Invalid gridInsertionType '${normalizedConfig.gridInsertionType}' for config '${configKey}'. Valid types: ${Object.values(GridInsertionType).join(", ")}`);
887
- gridInsertionType = normalizedConfig.gridInsertionType;
888
- }
889
- const result = {
890
- mountingConfigId: normalizedConfig.mountingConfigId,
891
- containerId: normalizedConfig.containerId,
892
- testId: normalizedConfig.testId,
893
- insertionPoint: {
894
- selector: insertionPoint.selector,
895
- insertionType: insertionPoint.insertionType,
896
- ...insertionPoint.selectionIndex != null && { selectionIndex: insertionPoint.selectionIndex }
897
- }
898
- };
899
- if (parentInsertionPoint) result.parentInsertionPoint = parentInsertionPoint;
900
- if (gridInsertionType) result.gridInsertionType = gridInsertionType;
901
- if (wrappingElement) result.wrappingElement = wrappingElement;
902
- if (normalizedConfig.divCheckSelector) result.divCheckSelector = normalizedConfig.divCheckSelector;
903
- if (normalizedConfig.className) result.className = normalizedConfig.className;
904
- if (normalizedConfig.suppressionSelector) result.suppressionSelector = normalizedConfig.suppressionSelector;
905
- if (normalizedConfig.dataAttributes) result.dataAttributes = normalizedConfig.dataAttributes;
906
- if (normalizedConfig.style) result.style = normalizedConfig.style;
907
- return result;
908
- };
909
- const validateAndTransformWidgetConfig = (config, configKey) => {
910
- const normalizedConfig = transformSnakeToCamel(config);
911
- if (typeof normalizedConfig.widgetConfigId !== "string" || !normalizedConfig.widgetConfigId) throw new Error(`Missing or invalid widgetConfigId for widget config '${configKey}'`);
912
- if (typeof normalizedConfig.type !== "string" || !normalizedConfig.type) throw new Error(`Missing or invalid type for widget config '${configKey}'`);
913
- if (normalizedConfig.contentId != null && typeof normalizedConfig.contentId !== "string") throw new Error(`Invalid contentId for widget config '${configKey}'. Must be a string or null/undefined`);
914
- return normalizedConfig;
915
- };
916
- const validateGraphQLFrontendConfig = (data) => {
917
- if (data === null || data === void 0) return;
918
- if (typeof data !== "object" || Array.isArray(data)) {
919
- logger_default.logWarn("Invalid GraphQL frontend config data: not an object", void 0, { data });
920
- return;
921
- }
922
- const obj = data;
923
- if ("merchant_override_css" in obj && typeof obj.merchant_override_css !== "string" && obj.merchant_override_css !== null) {
924
- logger_default.logWarn("Invalid GraphQL frontend config data: merchant_override_css must be a string or null", void 0, { data });
925
- return;
926
- }
927
- if ("page_variants" in obj) {
928
- if (obj.page_variants !== void 0 && obj.page_variants !== null && !Array.isArray(obj.page_variants)) {
929
- logger_default.logWarn("Invalid GraphQL frontend config data: page_variants must be an array or null/undefined", void 0, { data });
930
- return;
931
- }
932
- }
933
- if ("mounting_configs" in obj) {
934
- if (obj.mounting_configs !== void 0 && obj.mounting_configs !== null && !Array.isArray(obj.mounting_configs)) {
935
- logger_default.logWarn("Invalid GraphQL frontend config data: mounting_configs must be an array or null/undefined", void 0, { data });
936
- return;
937
- }
938
- }
939
- if ("widget_configs" in obj) {
940
- if (obj.widget_configs !== void 0 && obj.widget_configs !== null && !Array.isArray(obj.widget_configs)) {
941
- logger_default.logWarn("Invalid GraphQL frontend config data: widget_configs must be an array or null/undefined", void 0, { data });
942
- return;
943
- }
944
- }
945
- if ("ui_configs" in obj && typeof obj.ui_configs !== "object" && obj.ui_configs !== null) {
946
- logger_default.logWarn("Invalid GraphQL frontend config data: ui_configs must be an object or null/undefined", void 0, { data });
947
- return;
948
- }
949
- try {
950
- const transformedData = transformSnakeToCamel(obj);
951
- if (transformedData.pageVariants && Array.isArray(transformedData.pageVariants)) {
952
- const pageVariantsArray = transformedData.pageVariants;
953
- const validatedPageVariants = [];
954
- for (const variant of pageVariantsArray) if (variant && typeof variant === "object" && typeof variant.variantId === "string") try {
955
- const validatedVariant = validateAndTransformPageVariants(variant);
956
- validatedPageVariants.push(validatedVariant);
957
- } catch (error) {
958
- logger_default.logWarn("Invalid page variant, skipping", error, {
959
- variantId: variant.variantId,
960
- variant
961
- });
962
- }
963
- else logger_default.logWarn("Invalid page variant structure, skipping", void 0, { variant });
964
- transformedData.pageVariants = validatedPageVariants;
965
- }
966
- if (transformedData.mountingConfigs && Array.isArray(transformedData.mountingConfigs)) {
967
- const mountingConfigsArray = transformedData.mountingConfigs;
968
- const mountingConfigsRecord = {};
969
- for (const item of mountingConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
970
- const config = item.config;
971
- const validatedConfig = validateAndTransformMountingConfig(config, item.key);
972
- mountingConfigsRecord[item.key] = validatedConfig;
973
- } catch (error) {
974
- logger_default.logWarn("Invalid mounting config, skipping", error, {
975
- configKey: item.key,
976
- config: item.config
977
- });
978
- }
979
- else logger_default.logWarn("Invalid mounting config item structure, skipping", void 0, { item });
980
- transformedData.mountingConfigs = mountingConfigsRecord;
981
- }
982
- if (transformedData.widgetConfigs && Array.isArray(transformedData.widgetConfigs)) {
983
- const widgetConfigsArray = transformedData.widgetConfigs;
984
- const widgetConfigsRecord = {};
985
- for (const item of widgetConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
986
- const config = item.config;
987
- const validatedConfig = validateAndTransformWidgetConfig(config, item.key);
988
- widgetConfigsRecord[item.key] = validatedConfig;
989
- } catch (error) {
990
- logger_default.logWarn("Invalid widget config, skipping", error, {
991
- configKey: item.key,
992
- config: item.config
993
- });
994
- }
995
- else logger_default.logWarn("Invalid widget config item structure, skipping", void 0, { item });
996
- transformedData.widgetConfigs = widgetConfigsRecord;
997
- }
998
- return transformedData;
999
- } catch (error) {
1000
- logger_default.logWarn("Failed to validate and transform GraphQL frontend config data", error, { data });
1001
- return;
1002
- }
1003
- };
1004
-
1005
- //#endregion
1006
- //#region src/application/models/validators/validateGraphQLOrgId.ts
1007
- const validateGraphQLOrgId = (data) => {
1008
- if (typeof data !== "string" || data === "") return;
1009
- return data;
1010
- };
1011
-
1012
- //#endregion
1013
- //#region src/application/models/validators/validateMobilePLPChatPlacementParameter.ts
1014
- const validateMobilePLPChatPlacementParameter = (value) => {
1015
- if (!isMobilePLPChatPlacementParameter(value)) return;
1016
- return { rowIndex: value.row_index };
1017
- };
1018
-
1019
- //#endregion
1020
- //#region src/application/models/validators/validateOrganizationConfig.ts
1021
- const validateOrganizationConfig = (data) => {
1022
- if (!isApiOrganizationConfig(data)) return;
1023
- return {
1024
- id: data.id,
1025
- createdAt: data.created_at.toISOString(),
1026
- namespace: data.namespace,
1027
- organizationId: data.organization_id,
1028
- isLatest: data.is_latest,
1029
- version: data.version,
1030
- updatedAt: data.updated_at.toISOString(),
1031
- config: {
1032
- amplitude: data.config.amplitude ? {
1033
- sessionReplayEnabled: data.config.amplitude.session_replay_enabled,
1034
- sessionReplaySampleRate: data.config.amplitude.session_replay_sample_rate,
1035
- trackingEnabled: data.config.amplitude.tracking_enabled
1036
- } : void 0,
1037
- customerService: data.config.customer_service ? { provider: data.config.customer_service.provider } : void 0,
1038
- googleAnalytics: data.config.google_analytics ? { measurementId: data.config.google_analytics.measurement_id } : void 0
1039
- }
1040
- };
1041
- };
1042
-
1043
- //#endregion
1044
- //#region src/application/models/validators/validateOrgConfigResults.ts
1045
- /**
1046
- *
1047
- * @param data
1048
- * @returns
1049
- */
1050
- const validateOrgConfigResults = (data) => {
1051
- if (!isApiOrgConfigResults(data)) return;
1052
- return {
1053
- configs: data.configs.map((config) => validateOrganizationConfig(config)).filter((config) => config != null),
1054
- experiments: data.experiments.map((experiment) => ({
1055
- group: experiment.group,
1056
- groupName: experiment.group_name,
1057
- name: experiment.name,
1058
- ruleId: experiment.rule_id,
1059
- value: experiment.value
1060
- })),
1061
- gates: data.gates.map((gate) => ({
1062
- groupName: gate.group_name,
1063
- name: gate.name,
1064
- ruleId: gate.rule_id,
1065
- value: gate.value
1066
- })),
1067
- org: {
1068
- org: {
1069
- id: data.org.org.id,
1070
- displayName: data.org.org.display_name,
1071
- domain: data.org.org.domain,
1072
- shortName: data.org.org.short_name,
1073
- status: data.org.org.status,
1074
- createdAt: data.org.org.created_at?.toISOString(),
1075
- updatedAt: data.org.org.updated_at?.toISOString()
1076
- },
1077
- settings: {}
1078
- }
1079
- };
1080
- };
1081
-
1082
- //#endregion
1083
- //#region src/application/models/validators/validateResponse.ts
1084
- const richInformationFromCommerceRichInformation = (data) => ({
1085
- cons: data.cons,
1086
- pros: data.pros,
1087
- reviewDate: data.review_date,
1088
- reviewerTitle: data.reviewer_title,
1089
- productFamiliarity: data.product_familiarity
1090
- });
1091
- const validateResponse = (data) => {
1092
- if (!isApiResponse(data)) return;
1093
- if (data.category === ResponseCategory.Text && isApiTextResponseAttributes(data.attributes)) return {
1094
- id: data.id,
1095
- createdAt: data.created_at,
1096
- category: ResponseCategory.Text,
1097
- attributes: { content: data.attributes.content }
1098
- };
1099
- if (data.category === ResponseCategory.Product && isApiProductResponseAttributes(data.attributes)) return {
1100
- id: data.id,
1101
- createdAt: data.created_at,
1102
- category: ResponseCategory.Product,
1103
- attributes: {
1104
- id: data.attributes.id,
1105
- description: data.attributes.description,
1106
- imageUrl: data.attributes.image_url,
1107
- imageUrls: data.attributes.image_urls,
1108
- title: data.attributes.title,
1109
- url: data.attributes.url,
1110
- originalPrice: data.attributes.original_price,
1111
- salePrice: data.attributes.sale_price,
1112
- averageRating: data.attributes.average_rating,
1113
- numberReviews: data.attributes.number_reviews,
1114
- metadata: data.attributes.metadata,
1115
- isForGrid: data.attributes.is_for_grid,
1116
- colors: data.attributes.colors,
1117
- sizes: data.attributes.sizes,
1118
- filters: data.attributes.filters
1119
- }
1120
- };
1121
- if (data.category === ResponseCategory.Review && isApiReviewResponseAttributes(data.attributes)) return {
1122
- id: data.id,
1123
- createdAt: data.created_at,
1124
- category: ResponseCategory.Review,
1125
- attributes: {
1126
- id: data.attributes.id,
1127
- productId: data.attributes.product_id,
1128
- title: data.attributes.title,
1129
- reviewer: data.attributes.reviewer,
1130
- review: data.attributes.review,
1131
- stars: data.attributes.stars,
1132
- richInformation: data.attributes.rich_information ? richInformationFromCommerceRichInformation(data.attributes.rich_information) : void 0
1133
- }
1134
- };
1135
- if (data.category === ResponseCategory.Separator) return {
1136
- id: data.id,
1137
- createdAt: data.created_at,
1138
- category: ResponseCategory.Separator
1139
- };
1140
- if (data.category === ResponseCategory.Page && isApiPageResponseAttributes(data.attributes)) return {
1141
- id: data.id,
1142
- createdAt: data.created_at,
1143
- category: ResponseCategory.Page,
1144
- attributes: {
1145
- id: data.attributes.id,
1146
- title: data.attributes.title,
1147
- description: data.attributes.description,
1148
- url: data.attributes.url
1149
- }
1150
- };
1151
- if (data.category === ResponseCategory.Form && isApiFormResponseAttributes(data.attributes)) return {
1152
- id: data.id,
1153
- createdAt: data.created_at,
1154
- category: ResponseCategory.Form,
1155
- attributes: {
1156
- formCategory: data.attributes.form_category ? { formType: data.attributes.form_category.form_type } : void 0,
1157
- schema: {
1158
- properties: data.attributes.schema.properties,
1159
- required: data.attributes.schema.required.map(String)
1160
- }
1161
- }
1162
- };
1163
- if (data.category === ResponseCategory.ProductSearch && isApiProductSearchResponseAttributes(data.attributes)) return {
1164
- id: data.id,
1165
- createdAt: data.created_at,
1166
- category: ResponseCategory.ProductSearch,
1167
- attributes: {
1168
- generatedQuery: data.attributes.generated_query,
1169
- productCount: data.attributes.product_count
1170
- }
1171
- };
1172
- if (data.category === ResponseCategory.ProductSearchFilter && isApiProductSearchFilterResponseAttributes(data.attributes)) return {
1173
- id: data.id,
1174
- createdAt: data.created_at,
1175
- category: ResponseCategory.ProductSearchFilter,
1176
- attributes: { filterName: data.attributes.filter_name }
1177
- };
1178
- if (data.category === ResponseCategory.Order && isApiOrderResponseAttributes(data.attributes)) return {
1179
- id: data.id,
1180
- createdAt: data.created_at,
1181
- category: ResponseCategory.Order,
1182
- attributes: {
1183
- orderId: data.attributes.order_id,
1184
- orderNumber: data.attributes.order_number,
1185
- createdAt: data.attributes.created_at,
1186
- latestEventDate: data.attributes.latest_event_date,
1187
- lineItems: data.attributes.line_items.map((item) => ({
1188
- itemTitle: item.item_title,
1189
- itemPrice: item.item_price,
1190
- itemQuantity: item.item_quantity,
1191
- orderItemId: item.order_item_id,
1192
- image: item.image ?? void 0,
1193
- inTransitAt: item.in_transit_at ?? void 0,
1194
- deliveredAt: item.delivered_at ?? void 0,
1195
- estimatedDeliveryAt: item.estimated_delivery_at ?? void 0,
1196
- fulfillmentDisplayStatus: item.fulfillment_display_status ? stringToFulfillmentDisplayStatusEnumValue(item.fulfillment_display_status) : void 0,
1197
- trackingUrl: item.tracking_url ?? void 0
1198
- }))
1199
- }
1200
- };
1201
- };
1202
-
1203
- //#endregion
1204
- //#region src/application/models/validators/validateSuggestion.ts
1205
- const validateSuggestion = (data) => {
1206
- if (!isSuggestion(data)) return;
1207
- return {
1208
- id: data.id,
1209
- category: data.category,
1210
- content: data.content,
1211
- createdAt: data.created_at,
1212
- isAnswer: data.is_answer
1213
- };
1214
- };
1215
-
1216
- //#endregion
1217
- //#region src/application/models/validators/validateUserEvent.ts
1218
- const validateUserEvent = (data) => {
1219
- if (!isApiUserEvent(data)) return;
1220
- if (data.category === UserEventCategory.PdpVisit && isApiPDPAttributes(data.attributes)) return {
1221
- eventId: data.event_id,
1222
- createdAt: data.created_at,
1223
- category: UserEventCategory.PdpVisit,
1224
- attributes: {
1225
- productId: data.attributes.product_id,
1226
- parentProductId: data.attributes.parent_product_id,
1227
- url: data.attributes.url
1228
- }
1229
- };
1230
- if (data.category === UserEventCategory.QueryTyped && isApiQueryTypedAttributes(data.attributes)) return {
1231
- eventId: data.event_id,
1232
- createdAt: data.created_at,
1233
- category: UserEventCategory.QueryTyped,
1234
- attributes: { query: data.attributes.query }
1235
- };
1236
- if (data.category === UserEventCategory.Search && isApiSearchAttributes(data.attributes)) return {
1237
- eventId: data.event_id,
1238
- createdAt: data.created_at,
1239
- category: UserEventCategory.Search,
1240
- attributes: {
1241
- searchTerm: data.attributes.search_term,
1242
- selectedFilters: data.attributes.selected_filters
1243
- }
1244
- };
1245
- if (data.category === UserEventCategory.SuggestionClicked && isApiSuggestionClickedAttributes(data.attributes)) return {
1246
- eventId: data.event_id,
1247
- createdAt: data.created_at,
1248
- category: UserEventCategory.SuggestionClicked,
1249
- attributes: { suggestionId: data.attributes.suggestion_id }
1250
- };
1251
- if (data.category === UserEventCategory.PlpVisit && isApiPLPEventAttributes(data.attributes)) {
1252
- if (isApiPLPIdAttribute(data.attributes)) return {
1253
- eventId: data.event_id,
1254
- createdAt: data.created_at,
1255
- category: UserEventCategory.PlpVisit,
1256
- attributes: {
1257
- category: data.attributes.category,
1258
- attributes: { id: data.attributes.id }
1259
- }
1260
- };
1261
- }
1262
- if (data.category === UserEventCategory.FormSubmitted && isApiFormSubmittedResponseAttributes(data.attributes)) return {
1263
- eventId: data.event_id,
1264
- createdAt: data.created_at,
1265
- category: UserEventCategory.FormSubmitted,
1266
- attributes: {
1267
- filledSchema: { ...data.attributes.filled_schema },
1268
- formResponseId: data.attributes.form_response_id,
1269
- formType: data.attributes.form_type
1270
- }
1271
- };
1272
- return {
1273
- eventId: data.event_id,
1274
- createdAt: data.created_at,
1275
- category: UserEventCategory.AppLoaded
1276
- };
1277
- };
1278
-
1279
- //#endregion
1280
- export { ChatElementDisplayLocation, DOMInsertionType, FeatureGates, GoogleAnalyticsEvents, GridInsertionType, MessageRole, MessageType, ProductExperiment, SpiffyEventName, SpiffyWidgets, getMerchantOrgIdQuery, isApiFormResponseAttributes, isApiFormSubmittedResponseAttributes, isApiOrderResponseAttributes, isApiOrgConfigResults, isApiOrganizationConfig, isApiPLPEventAttributes, isApiPLPIdAttribute, isApiPageResponseAttributes, isApiProductSearchFilterResponseAttributes, isBaseEcommerceEvent, isGA4EcommerceEvent, isGraphQLColorsConfig, isLegacyUAEcommerceEvent, isMobilePLPChatPlacementParameter, isSpanxTakeAQuizCtaParameter, isVariantInfo, stringToFulfillmentDisplayStatusEnumValue, transformCamelToSnake, transformSnakeToCamel, validateAndTransformMountingConfig, validateAndTransformPageVariants, validateAndTransformWidgetConfig, validateGraphQLColorsConfig, validateGraphQLFrontendConfig, validateGraphQLOrgId, validateMobilePLPChatPlacementParameter, validateOrgConfigResults, validateOrganizationConfig, validateResponse, validateSuggestion, validateUserEvent };
1281
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLVVaNkhzemZaLmpzIiwibmFtZXMiOlsicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIm5vcm1hbGl6ZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwicmVzdWx0OiBXaWRnZXRNb3VudGluZ0NvbmZpZyIsInZhbGlkYXRlZFBhZ2VWYXJpYW50czogUGFnZVZhcmlhbnRDb25maWdbXSIsIm1vdW50aW5nQ29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgV2lkZ2V0TW91bnRpbmdDb25maWc+Iiwid2lkZ2V0Q29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2hhdEVsZW1lbnREaXNwbGF5TG9jYXRpb24udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2V2ZW50cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ29vZ2xlQW5hbHl0aWNzRXZlbnRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9tZXNzYWdlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9wcm9kdWN0RXhwZXJpbWVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvc3BpZmZ5V2lkZ2V0cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3JhcGhxbC9xdWVyaWVzL2dldE1lcmNoYW50T3JnSWRRdWVyeS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzQmFzZUVjb21tZXJjZUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNHQTRFY29tbWVyY2VFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzTGVnYWN5VUFFY29tbWVyY2VFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzU3BhbnhUYWtlQVF1aXpDdGFQYXJhbWV0ZXIudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9pc1ZhcmlhbnRJbmZvLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnYW5pemF0aW9uQ29uZmlnLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnQ29uZmlnUmVzdWx0cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyQXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2dyYXBoUUwvaXNHcmFwaFFMQ29sb3JzQ29uZmlnLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zbmFrZVRvQ2FtZWxUcmFuc2Zvcm1lci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdXRpbHMvc3RyaW5nVG9GdWxmaWxsbWVudERpc3BsYXlTdGF0dXNFbnVtVmFsdWUudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVHcmFwaFFMQ29sb3JzQ29uZmlnLnRzIiwiLi4vc3JjL21lcmNoYW50cy9kb21JbnNlcnRpb24udHMiLCIuLi9zcmMvbWVyY2hhbnRzL2dyaWRJbnNlcnRpb24udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVHcmFwaFFMRnJvbnRlbmRDb25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVHcmFwaFFMT3JnSWQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlU3VnZ2VzdGlvbi50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBGZWF0dXJlR2F0ZXMge1xuICBJc0NsaWVudFNlc3Npb25FbmFibGVkID0gXCJpc19jbGllbnRfc2Vzc2lvbl9lbmFibGVkXCIsXG4gIElzTmV3RmVhdHVyZUVuYWJsZWQgPSBcImlzX25ld19mZWF0dXJlX2VuYWJsZWRcIixcbiAgLy8gSXNGaW5lVHVuZWRNb2RlbDhiIGlzIGRlZmluZWQgaGVyZSBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjb3JyZWxhdGluZyBldmVudHMgdG8gYSBzcGVjaWZpYyBtb2RlbCBpbiBBbXBsaXR1ZGVcbiAgSXNGaW5lVHVuZWRNb2RlbDhiID0gXCJpc19maW5lX3R1bmVkX21vZGVsXzhiXCIsXG4gIElzSW50ZWdyYXRlZENYRW5hYmxlZCA9IFwiaXNfaW50ZWdyYXRlZF9jeF9lbmFibGVkXCIsXG4gIC8vIFRPRE86IHJlbW92ZSB0aGlzIG9uY2Ugd2UndmUgZnVsbHkgcm9sbGVkIG91dCBvbiBub24tc2hhcGV3ZWFyIHBhZ2VzXG4gIElzTm9uU2hhcGV3ZWFyRW5hYmxlZCA9IFwiaXNfbm9uX3NoYXBld2Vhcl9lbmFibGVkXCIsXG4gIElzSW1hZ2VCYW5uZXJFbmFibGVkID0gXCJpc19pbWFnZV9iYW5uZXJfZW5hYmxlZFwiLFxuICBJc09yZGVyTG9va3VwRW5hYmxlZCA9IFwiaXNfb3JkZXJfbG9va3VwX2VuYWJsZWRcIixcbiAgSXNTdW1tYXJpemVSZXZpZXdzRW5hYmxlZCA9IFwiaXNfc3VtbWFyaXplX3Jldmlld3NfZW5hYmxlZFwiLFxuICBJc0dsb2JhbFNlYXJjaEVuYWJsZWQgPSBcImlzX2dsb2JhbF9zZWFyY2hfZW5hYmxlZFwiLFxuICBJc0ltYWdlUHJvbXB0RW5hYmxlZCA9IFwiaXNfaW1hZ2VfcHJvbXB0X2VuYWJsZWRcIixcbiAgSXNXYXRlcm1hcmtFbmFibGVkID0gXCJpc193YXRlcm1hcmtfZW5hYmxlZFwiLFxuICBJc0luZmVyZW5jZVJlZ2lvbjAgPSBcImlzX2luZmVyZW5jZV9yZWdpb25fMFwiLFxuICBJc0dyYXBoUUxVSUNvbmZpZ3NFbmFibGVkID0gXCJpc19ncmFwaHFsX3VpX2NvbmZpZ3NfZW5hYmxlZFwiLFxuICBJc0dyYXBoUUxQYWdlQ29uZmlnc0VuYWJsZWQgPSBcImlzX2dyYXBocWxfcGFnZV9jb25maWdzX2VuYWJsZWRcIixcbiAgSXNHcmFwaFFMQ29tcG9uZW50Q29uZmlnc0VuYWJsZWQgPSBcImlzX2dyYXBocWxfY29tcG9uZW50X2NvbmZpZ3NfZW5hYmxlZFwiLFxuICBJc0NoYXRWYXJpYW50RW5hYmxlZCA9IFwiaXNfY2hhdF92YXJpYW50X2VuYWJsZWRcIixcbiAgSXNDaGF0VmFyaWFudEFFbmFibGVkID0gXCJpc19jaGF0X3ZhcmlhbnRfYV9lbmFibGVkXCIsXG4gIElzQ2hhdFZhcmlhbnRCRW5hYmxlZCA9IFwiaXNfY2hhdF92YXJpYW50X2JfZW5hYmxlZFwiLFxuICBJc1VzZXJRdWVyeUFsd2F5c0VuYWJsZWQgPSBcImlzX3VzZXJfcXVlcnlfYWx3YXlzX2VuYWJsZWRcIixcbn1cbiIsIi8vIENoYXQgZWxlbWVudCBkaXNwbGF5IGxvY2F0aW9uIGVudW1cbmV4cG9ydCBlbnVtIENoYXRFbGVtZW50RGlzcGxheUxvY2F0aW9uIHtcbiAgSU5fQ0hBVCA9ICdpbl9jaGF0JyxcbiAgQ0hBVF9QUkVWSUVXID0gJ2NoYXRfcHJldmlldycsXG4gIEZMT0FUSU5HX0JVVFRPTiA9ICdmbG9hdGluZ19idXR0b24nLFxuICBIRUxQX01FX0NIT09TRSA9ICdoZWxwX21lX2Nob29zZScsXG4gIFBMUF9JTUFHRV9CQU5ORVIgPSAncGxwX2ltYWdlX2Jhbm5lcicsXG4gIFRPUF9SRVZJRVdTX1NOSVBQRVQgPSAndG9wX3Jldmlld3Nfc25pcHBldCcsXG4gIEJPVFRPTV9SRVZJRVdTX1NOSVBQRVQgPSAnYm90dG9tX3Jldmlld3Nfc25pcHBldCcsXG4gIEJMT0NLX0JBQ0tfQlVUVE9OID0gJ2Jsb2NrX2JhY2tfYnV0dG9uJyxcbiAgU1dJVENIX1RPX0FHRU5UID0gJ3N3aXRjaF90b19hZ2VudCcsXG4gIENPTlZFUlNBVElPTkFMX1NFQVJDSCA9ICdjb252ZXJzYXRpb25hbF9zZWFyY2gnLFxuICBHTE9CQUxfU0VBUkNIX0VOVFJZUE9JTlQgPSAnZ2xvYmFsX3NlYXJjaF9lbnRyeXBvaW50JyxcbiAgU0VBUkNIX05BVl9FTlRSWVBPSU5UID0gJ3NlYXJjaF9uYXZfZW50cnlwb2ludCcsXG4gIFNFQVJDSF9QUk9NUFQgPSAnc2VhcmNoX3Byb21wdCcsXG4gIFNFQVJDSF9QUk9NUFRfQlVUVE9OID0gJ3NlYXJjaF9wcm9tcHRfYnV0dG9uJyxcbiAgUFJPRFVDVF9HUklEID0gJ3Byb2R1Y3RfZ3JpZCcsXG4gIFVOU1BFQ0lGSUVEID0gJ3Vuc3BlY2lmaWVkJyxcbiAgRklMVEVSX01PREFMID0gJ2ZpbHRlcl9tb2RhbCcsXG4gIFBST01QVF9DQVJEID0gJ3Byb21wdF9jYXJkJyxcbiAgV0lORE9XX0FQSV9DQUxMID0gJ3dpbmRvd19hcGlfY2FsbCcsXG59XG4iLCIvLyBuYW1lcyBvZiBTcGlmZnkgc3BlY2lmaWMgSFRNTCBldmVudHNcbmV4cG9ydCBlbnVtIFNwaWZmeUV2ZW50TmFtZSB7XG4gIFdpZGdldE9wZW4gPSAnc3BpZmZ5OndpZGdldG9wZW4nLFxuICBXaWRnZXRDbG9zZSA9ICdzcGlmZnk6d2lkZ2V0Y2xvc2UnLFxufVxuIiwiZW51bSBHb29nbGVBbmFseXRpY3NFdmVudHMge1xuICBBRERfVE9fQ0FSVF92MSA9ICdhZGRfdG9fY2FydCcsXG4gIEFERF9UT19DQVJUX3YyID0gJ2FkZFRvQ2FydCcsXG59XG5cbmV4cG9ydCB7XG4gIEdvb2dsZUFuYWx5dGljc0V2ZW50c1xufSIsImltcG9ydCB7IEN1c3RTZXJ2aWNlQXR0YWNobWVudCwgRm9ybVR5cGUgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFJldmlld1Jlc3BvbnNlQXR0cmlidXRlcyxcbiAgUGFnZVJlc3BvbnNlQXR0cmlidXRlcyxcbiAgVGV4dFJlc3BvbnNlQXR0cmlidXRlcyxcbiAgU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBTZWFyY2hQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZSxcbiAgU2VhcmNoUHJvZHVjdEZpbHRlckF0dHJpYnV0ZXMsXG59IGZyb20gJy4vYXBpL3Jlc3BvbnNlJztcblxuZXhwb3J0IGVudW0gTWVzc2FnZVJvbGUge1xuICBVc2VyID0gJ3VzZXInLFxuICBBc3Npc3RhbnQgPSAnYXNzaXN0YW50Jyxcbn1cblxuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBUZXh0ID0gJ3RleHQnLFxuICBTdWdnZXN0aW9uQ2xpY2tlZCA9ICdzdWdnZXN0aW9uX2NsaWNrZWQnLFxuICBQcm9kdWN0ID0gJ3Byb2R1Y3QnLFxuICBQcm9kdWN0U2VhcmNoID0gJ3Byb2R1Y3Rfc2VhcmNoJyxcbiAgUmV2aWV3ID0gJ3JldmlldycsXG4gIFF1ZXJ5VHlwZWQgPSAncXVlcnlfdHlwZWQnLFxuICBTZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbiAgUGFnZSA9ICdwYWdlJyxcbiAgU2VhcmNoID0gJ3NlYXJjaCcsXG4gIEF0dGFjaG1lbnQgPSAnYXR0YWNobWVudCcsXG4gIENYQWdlbnRSZXNwb25zZSA9ICdjeF9hZ2VudF9yZXNwb25zZScsXG4gIEZvcm0gPSAnZm9ybScsXG4gIE9yZGVyID0gJ29yZGVyJyxcbiAgUHJvZHVjdFNlYXJjaEZpbHRlciA9ICdwcm9kdWN0X3NlYXJjaF9maWx0ZXInLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBpZDogc3RyaW5nO1xuICByb2xlOiBNZXNzYWdlUm9sZTtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59ICYgKFxuICB8IFRleHRNZXNzYWdlTWV0YWRhdGFcbiAgfCBRdWVyeVR5cGVkTWV0YWRhdGFcbiAgfCBTdWdnZXN0aW9uTWVzc2FnZU1ldGFkYXRhXG4gIHwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YVxuICB8IFByb2R1Y3RTZWFyY2hNZXNzYWdlTWV0YWRhdGFcbiAgfCBSZXZpZXdNZXNzYWdlTWV0YWRhdGFcbiAgfCBTZXBhcmF0b3JNZXNzYWdlTWV0YWRhdGFcbiAgfCBQYWdlTWVzc2FnZU1ldGFkYXRhXG4gIHwgU2VhcmNoTWVzc2FnZU1ldGFkYXRhXG4gIHwgQXR0YWNobWVudE1ldGFkYXRhXG4gIHwgQ1hBZ2VudFJlc3BvbnNlTWV0YWRhdGFcbiAgfCBGb3JtTWVzc2FnZU1ldGFkYXRhXG4gIHwgT3JkZXJNZXNzYWdlTWV0YWRhdGFcbiAgfCBQcm9kdWN0U2VhcmNoRmlsdGVyTWV0YWRhdGFcbik7XG5cbnR5cGUgQXR0YWNobWVudE1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5BdHRhY2htZW50O1xuICBtZXRhZGF0YToge1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgYXR0YWNobWVudDogQ3VzdFNlcnZpY2VBdHRhY2htZW50W107XG4gIH07XG59O1xuXG50eXBlIENYQWdlbnRSZXNwb25zZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5DWEFnZW50UmVzcG9uc2U7XG4gIG1ldGFkYXRhOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICB9O1xufTtcblxudHlwZSBUZXh0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0O1xuICBtZXRhZGF0YTogVGV4dFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxudHlwZSBRdWVyeVR5cGVkTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlF1ZXJ5VHlwZWQ7XG4gIG1ldGFkYXRhOiBUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFN1Z2dlc3Rpb25NZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkO1xuICBtZXRhZGF0YToge1xuICAgIHN1Z2dlc3Rpb25JZDogc3RyaW5nO1xuICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0O1xuICBtZXRhZGF0YTogUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZHVjdFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaDtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgUmV2aWV3TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXc7XG4gIG1ldGFkYXRhOiBSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgU2VwYXJhdG9yTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5TZXBhcmF0b3I7XG59O1xuXG50eXBlIFBhZ2VNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlBhZ2U7XG4gIG1ldGFkYXRhOiBQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoO1xuICBtZXRhZGF0YTogU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFByb2R1Y3RTZWFyY2hGaWx0ZXJNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaEZpbHRlcjtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RGaWx0ZXJBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG5leHBvcnQgdHlwZSBGb3JtRmllbGQgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8vIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0IHdlIGN1cnJlbnRseSBzdXBwb3J0XG4gIGZvcm1hdD86ICdlbWFpbCc7XG4gIHZhbHVlPzogc3RyaW5nO1xufTtcblxudHlwZSBGb3JtTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtO1xuICBtZXRhZGF0YToge1xuICAgIGZvcm1UeXBlPzogRm9ybVR5cGU7XG4gICAgZmllbGRzOiBGb3JtRmllbGRbXTtcbiAgfTtcbn07XG5cbnR5cGUgT3JkZXJNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyO1xuICBtZXRhZGF0YTogT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG4iLCJleHBvcnQgZW51bSBQcm9kdWN0RXhwZXJpbWVudCB7XG4gIC8vIERlZmF1bHQgaXMgb25seSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBlbnVtIGlzIG5vbi1lbXB0eSwgb3RoZXJ3aXNlXG4gIC8vIGNhbGxlcnMgdGhhdCB0cnkgdG8gdXNlIHRoaXMgZW51bSB3aWxsIGdlbmVyYXRlIGEgdHlwZXNjcmlwdCBlcnJvclxuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxufVxuIiwiLyoqXG4gKiBFbnVtIG9mIGFsbCB3aWRnZXQgbmFtZXMuIFRoZXNlIGFyZSB3aWRnZXRzIHRoYXQgYXJlIHJlbmRlcmVkIGFuZCBpbnRlZ3JhdGVkIGludG9cbiAqIGEgbWVyY2hhbnQncyB3ZWJzaXRlLlxuICovXG5leHBvcnQgZW51bSBTcGlmZnlXaWRnZXRzIHtcbiAgSW1hZ2VCYW5uZXIgPSAnaW1hZ2VfYmFubmVyJyxcbiAgSW1hZ2VQcm9tcHRDYXJkID0gJ2ltYWdlX3Byb21wdF9jYXJkJyxcbiAgU2luZ2xlSW1hZ2VQcm9tcHQgPSAnc2luZ2xlX2ltYWdlX3Byb21wdCcsXG4gIEVtYmVkZGVkV2lkZ2V0ID0gJ2VtYmVkZGVkX3dpZGdldCcsXG4gIEZsb2F0aW5nQnV0dG9uID0gJ2Zsb2F0aW5nX2J1dHRvbicsXG4gIFN1Z2dlc3Rpb25CYXIgPSAnc3VnZ2VzdGlvbl9iYXInLFxuICBTZWFyY2hQcm9tcHQgPSAnc2VhcmNoX3Byb21wdCcsXG4gIEdsb2JhbFNlYXJjaCA9ICdnbG9iYWxfc2VhcmNoJyxcbiAgU2VhcmNoUmVzdWx0cyA9ICdzZWFyY2hfcmVzdWx0cycsXG4gIEdsb2JhbFNlYXJjaEVudHJ5UG9pbnQgPSAnZ2xvYmFsX3NlYXJjaF9lbnRyeV9wb2ludCcsXG59XG4iLCJjb25zdCBnZXRNZXJjaGFudE9yZ0lkUXVlcnkgPSBgXG4gIHF1ZXJ5IHtcbiAgICBtZSB7XG4gICAgICBvcmcge1xuICAgICAgICBpZFxuICAgICAgfVxuICAgIH1cbiAgfVxuYDtcblxuZXhwb3J0IHsgZ2V0TWVyY2hhbnRPcmdJZFF1ZXJ5IH07XG4iLCJpbXBvcnQgdHlwZSB7IEJhc2VFY29tbWVyY2VFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBhIGJhc2UgR29vZ2xlIEFuYWx5dGljcyBlY29tbWVyY2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGEgYmFzZSBlY29tbWVyY2UgZXZlbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQmFzZUVjb21tZXJjZUV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEJhc2VFY29tbWVyY2VFdmVudCA9PlxuICBkYXRhICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICdlY29tbWVyY2UnIGluIGRhdGEgJiZcbiAgZGF0YS5lY29tbWVyY2UgIT0gbnVsbCAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UgPT09ICdvYmplY3QnICYmXG4gICdldmVudCcgaW4gZGF0YSAmJlxuICB0eXBlb2YgZGF0YS5ldmVudCA9PT0gJ3N0cmluZyc7XG4iLCJpbXBvcnQgdHlwZSB7IEdBNEVjb21tZXJjZUV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIGEgR29vZ2xlIEFuYWx5dGljcyA0IGVjb21tZXJjZSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZXZlbnQgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYSBHQTQgZWNvbW1lcmNlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0dBNEVjb21tZXJjZUV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEdBNEVjb21tZXJjZUV2ZW50ID0+XG4gIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICBkYXRhICE9IG51bGwgJiZcbiAgJ2Vjb21tZXJjZScgaW4gZGF0YSAmJlxuICBkYXRhLmVjb21tZXJjZSAhPSBudWxsICYmXG4gIHR5cGVvZiBkYXRhLmVjb21tZXJjZSA9PT0gJ29iamVjdCcgJiZcbiAgJ2l0ZW1zJyBpbiBkYXRhLmVjb21tZXJjZSAmJlxuICBBcnJheS5pc0FycmF5KGRhdGEuZWNvbW1lcmNlLml0ZW1zKTtcbiIsImltcG9ydCB0eXBlIHsgVUFFY29tbWVyY2VFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBhIGxlZ2FjeSBVbml2ZXJzYWwgQW5hbHl0aWNzIGVjb21tZXJjZSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZXZlbnQgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYSBsZWdhY3kgVUEgZWNvbW1lcmNlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgVUFFY29tbWVyY2VFdmVudCA9PlxuICBkYXRhICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICdlY29tbWVyY2UnIGluIGRhdGEgJiZcbiAgZGF0YS5lY29tbWVyY2UgIT0gbnVsbCAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UgPT09ICdvYmplY3QnICYmXG4gICdhZGQnIGluIGRhdGEuZWNvbW1lcmNlICYmXG4gIHR5cGVvZiBkYXRhLmVjb21tZXJjZS5hZGQgPT09ICdvYmplY3QnO1xuIiwiaW50ZXJmYWNlIE1vYmlsZVBscENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIge1xuICByb3dfaW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyBNb2JpbGVQbHBDaGF0UGxhY2VtZW50UGFyYW1ldGVyID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAncm93X2luZGV4JyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgdmFsdWUucm93X2luZGV4ID09PSAnbnVtYmVyJztcbiIsImltcG9ydCB7IFNwYW54VGFrZUFRdWl6Q3RhUGFyYW1ldGVyIH0gZnJvbSAnLi4vc3BhbnhUYWtlQVF1aXpDdGFQYXJhbWV0ZXInO1xuXG5leHBvcnQgY29uc3QgaXNTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNwYW54VGFrZUFRdWl6Q3RhUGFyYW1ldGVyID0+XG4gIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndGV4dCcgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRleHQgPT09ICdzdHJpbmcnOyIsImltcG9ydCB7IFBhZ2VWaXNpdENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFBEUFZhcmlhbnRJbmZvLCBQTFBWYXJpYW50SW5mbywgUGFnZVZpc2l0VmFyaWFudEluZm8sIFZhcmlhbnRJbmZvIH0gZnJvbSAnLi4vdmFyaWFudEluZm8nO1xuXG5jb25zdCBpc1BEUFZhcmlhbnRJbmZvID0gKHZhcmlhbnRJbmZvOiBvYmplY3QpOiB2YXJpYW50SW5mbyBpcyBQRFBWYXJpYW50SW5mbyA9PlxuICAndmFyaWFudCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BkcCcgJiZcbiAgJ3Byb2R1Y3RJZCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdHlwZW9mIHZhcmlhbnRJbmZvLnByb2R1Y3RJZCA9PT0gJ3N0cmluZyc7XG5cbmNvbnN0IGlzUExQVmFyaWFudEluZm8gPSAodmFyaWFudEluZm86IG9iamVjdCk6IHZhcmlhbnRJbmZvIGlzIFBMUFZhcmlhbnRJbmZvID0+XG4gICd2YXJpYW50JyBpbiB2YXJpYW50SW5mbyAmJlxuICB2YXJpYW50SW5mby52YXJpYW50ID09PSAncGxwJyAmJlxuICAncGxwSWQnIGluIHZhcmlhbnRJbmZvICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mby5wbHBJZCA9PT0gJ3N0cmluZyc7XG5cbmNvbnN0IGlzUGFnZVZpc2l0VmFyaWFudEluZm8gPSAodmFyaWFudEluZm86IG9iamVjdCk6IHZhcmlhbnRJbmZvIGlzIFBhZ2VWaXNpdFZhcmlhbnRJbmZvID0+XG4gICd2YXJpYW50JyBpbiB2YXJpYW50SW5mbyAmJlxuICB2YXJpYW50SW5mby52YXJpYW50ID09PSAncGFnZV92aXNpdCcgJiZcbiAgJ3VybCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdHlwZW9mIHZhcmlhbnRJbmZvLnVybCA9PT0gJ3N0cmluZycgJiZcbiAgJ3BhZ2VWaXNpdENhdGVnb3J5JyBpbiB2YXJpYW50SW5mbyAmJlxuICBPYmplY3QudmFsdWVzKFBhZ2VWaXNpdENhdGVnb3J5KS5pbmNsdWRlcyh2YXJpYW50SW5mby5wYWdlVmlzaXRDYXRlZ29yeSBhcyBQYWdlVmlzaXRDYXRlZ29yeSk7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSB2YWxpZCBWYXJpYW50SW5mby5cbiAqXG4gKiBAcGFyYW0gdmFyaWFudEluZm8gLSBUaGUgdW5rbm93biBvYmplY3QgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YSBpcyBhIHZhbGlkIFZhcmlhbnRJbmZvIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNWYXJpYW50SW5mbyA9ICh2YXJpYW50SW5mbzogdW5rbm93bik6IHZhcmlhbnRJbmZvIGlzIFZhcmlhbnRJbmZvID0+XG4gIHZhcmlhbnRJbmZvICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhcmlhbnRJbmZvID09PSAnb2JqZWN0JyAmJlxuICAndmFyaWFudElkJyBpbiB2YXJpYW50SW5mbyAmJlxuICAoaXNQRFBWYXJpYW50SW5mbyh2YXJpYW50SW5mbykgfHxcbiAgICBpc1BMUFZhcmlhbnRJbmZvKHZhcmlhbnRJbmZvKSB8fFxuICAgIGlzUGFnZVZpc2l0VmFyaWFudEluZm8odmFyaWFudEluZm8pKTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEZvcm1UeXBlIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IEFwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9yZXNwb25zZUdlbmVyaWNzJztcbmltcG9ydCB7IGhhc1Byb3BlcnR5T2ZUeXBlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvdXRpbHMnO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgdGhlIHByb3ZpZGVkIGRhdGEgaGFzIHRoZSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgKHdpdGggdGhlIGNvcnJlY3QgdHlwZXMpIG9mXG4gKiBhIEZvcm1SZXNwb25zZUF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIGhhcyB0aGUgY29ycmVjdCBwcm9wZXJ0aWVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlcyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogZGF0YSBpcyBudWxsIG9yIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdmb3JtX2NhdGVnb3J5JyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmZvcm1fY2F0ZWdvcnkgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IGZvcm1fY2F0ZWdvcnkgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2Zvcm1fY2F0ZWdvcnknIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuZm9ybV9jYXRlZ29yeSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoXG4gICAgICAhaGFzUHJvcGVydHlPZlR5cGUoZGF0YS5mb3JtX2NhdGVnb3J5LCAnZm9ybV90eXBlJywgJ3N0cmluZycpIHx8XG4gICAgICAhT2JqZWN0LnZhbHVlcyhGb3JtVHlwZSkuaW5jbHVkZXMoZGF0YS5mb3JtX2NhdGVnb3J5LmZvcm1fdHlwZSBhcyBGb3JtVHlwZSlcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogZm9ybV90eXBlIGlzIG1pc3Npbmcgb3Igbm90IGEgdmFsaWQgZm9ybSB0eXBlJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnc2NoZW1hJywgJ29iamVjdCcpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IHNjaGVtYSBpcyBtaXNzaW5nIG9yIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVE9ETzogYWxzbyB3YW5uYSB2YWxpZGF0ZSB0aGUgZmllbGRzIG9mIGRhdGEuc2NoZW1hLnByb3BlcnRpZXMgYnV0IG1pZ2h0IHdhbm5hIGNoYW5nZSB0aGUgc2NoZW1hXG4gIC8vIHRvIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIGEga2V5IGluIHRoZSBvYmplY3RcbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLnNjaGVtYSwgJ3Byb3BlcnRpZXMnLCAnb2JqZWN0JykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBzY2hlbWEucHJvcGVydGllcyBpcyBtaXNzaW5nIG9yIG5vdCBhbiBvYmplY3QnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YS5zY2hlbWEsICdyZXF1aXJlZCcsICdhcnJheScpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogc2NoZW1hLnJlcXVpcmVkIGlzIG1pc3Npbmcgb3Igbm90IGFuIGFycmF5JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICFkYXRhLnNjaGVtYS5yZXF1aXJlZC5ldmVyeShcbiAgICAgIChrZXk6IHVua25vd24pID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleSBpbiBkYXRhLnNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgIClcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogc2NoZW1hLnJlcXVpcmVkIGNvbnRhaW5zIGludmFsaWQgcHJvcGVydHkga2V5cycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHsgRm9ybVN1Ym1pdHRlZEF0dHJpYnV0ZXMsIEZvcm1UeXBlIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IGhhc1Byb3BlcnR5T2ZUeXBlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzID0gKFxuICBkYXRhOiB1bmtub3duLFxuKTogZGF0YSBpcyBGb3JtU3VibWl0dGVkQXR0cmlidXRlcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLCAnZGF0YSBpcyBudWxsIG9yIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdmaWxsZWRfc2NoZW1hJywgJ29iamVjdCcpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLCAnZmlsbGVkX3NjaGVtYSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnZm9ybV9yZXNwb25zZV9pZCcsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLFxuICAgICAgJ2Zvcm1fcmVzcG9uc2VfaWQgaXMgbm90IGEgc3RyaW5nJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnZm9ybV90eXBlJyBpbiBkYXRhKSB8fCAhT2JqZWN0LnZhbHVlcyhGb3JtVHlwZSkuaW5jbHVkZXMoZGF0YS5mb3JtX3R5cGUgYXMgRm9ybVR5cGUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcycsXG4gICAgICAnZm9ybV90eXBlIGlzIG5vdCBhIHZhbGlkIGZvcm0gdHlwZSBlbnVtJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBPcmRlckl0ZW1JbmZvLCBPcmRlclJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eU9mVHlwZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL3V0aWxzJztcblxuLy8gdGhlIGNsaWVudCBTREsgZ2VuZXJhdGVzIGRhdGUtdGltZSBmb3JtYXQgdHlwZXMgYXMgYERhdGVgIGJ1dCB0aGUgb3BlbmFwaSB0eXBlc2NyaXB0IGdlbmVyYXRvclxuLy8gZG9lcyBub3QgY29ycmVjdGx5IGRlc2VyaWFsaXplIGRhdGUtdGltZSB2YWx1ZXMgc28gdGhleSBhcmUgYWx3YXlzIGBzdHJpbmdgIGF0IHJ1bnRpbWUgaW5zdGVhZCBvZlxuLy8gYERhdGVgIG9iamVjdHMuIFRoZXNlIGludGVyZmFjZXMgb3ZlcnJpZGUgdGhlIFNESyB0eXBlcyBzbyB0aGF0IHdlIGNhbiB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBhY3R1YWxcbi8vIGBzdHJpbmdgIHZhbHVlcy4gaHR0cHM6Ly9naXRodWIuY29tL09wZW5BUElUb29scy9vcGVuYXBpLWdlbmVyYXRvci9pc3N1ZXMvOTI2XG5leHBvcnQgaW50ZXJmYWNlIEFwaU9yZGVySXRlbUluZm9cbiAgZXh0ZW5kcyBPbWl0PE9yZGVySXRlbUluZm8sICdkZWxpdmVyZWRfYXQnIHwgJ2VzdGltYXRlZF9kZWxpdmVyeV9hdCcgfCAnaW5fdHJhbnNpdF9hdCc+IHtcbiAgZGVsaXZlcmVkX2F0Pzogc3RyaW5nO1xuICBlc3RpbWF0ZWRfZGVsaXZlcnlfYXQ/OiBzdHJpbmc7XG4gIGluX3RyYW5zaXRfYXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXNcbiAgZXh0ZW5kcyBPbWl0PE9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzLCAnY3JlYXRlZF9hdCcgfCAnbGF0ZXN0X2V2ZW50X2RhdGUnIHwgJ2xpbmVfaXRlbXMnPiB7XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgbGF0ZXN0X2V2ZW50X2RhdGU6IHN0cmluZztcbiAgbGluZV9pdGVtczogQXBpT3JkZXJJdGVtSW5mb1tdO1xufVxuXG5jb25zdCBpc0FwaU9yZGVySXRlbUluZm8gPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JkZXJJdGVtSW5mbyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvIG11c3QgYmUgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnb3JkZXJfaXRlbV9pZCcsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGhhdmUgYW4gb3JkZXJfaXRlbV9pZCBwcm9wZXJ0eScsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2l0ZW1fdGl0bGUnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8gbXVzdCBoYXZlIGFuIGl0ZW1fdGl0bGUgcHJvcGVydHknLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdpdGVtX3ByaWNlJywgJ251bWJlcicpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvIG11c3QgaGF2ZSBhbiBpdGVtX3ByaWNlIHByb3BlcnR5JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnaXRlbV9xdWFudGl0eScsICdudW1iZXInKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGhhdmUgYW4gaXRlbV9xdWFudGl0eSBwcm9wZXJ0eScsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2ltYWdlJywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvLmltYWdlIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2Z1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzJywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ09yZGVySXRlbUluZm8uZnVsZmlsbG1lbnRfZGlzcGxheV9zdGF0dXMgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICd0cmFja2luZ191cmwnLCAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8udHJhY2tpbmdfdXJsIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2RlbGl2ZXJlZF9hdCcsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5kZWxpdmVyZWRfYXQgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnZXN0aW1hdGVkX2RlbGl2ZXJ5X2F0JywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvLmVzdGltYXRlZF9kZWxpdmVyeV9hdCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnaW5fdHJhbnNpdF9hdCcsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5pbl90cmFuc2l0X2F0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGJlIGFuIG9iamVjdCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2NyZWF0ZWRfYXQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBjcmVhdGVkX2F0IHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdsYXRlc3RfZXZlbnRfZGF0ZScsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlciByZXNwb25zZSBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGxhdGVzdF9ldmVudF9kYXRlIHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdsaW5lX2l0ZW1zJywgJ2FycmF5JykgfHxcbiAgICAhZGF0YS5saW5lX2l0ZW1zLmV2ZXJ5KChpdGVtOiB1bmtub3duKSA9PiBpc0FwaU9yZGVySXRlbUluZm8oaXRlbSkpXG4gICkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlciByZXNwb25zZSBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGxpbmVfaXRlbXMgcHJvcGVydHkgd2l0aCBhdCBsZWFzdCBvbmUgb3JkZXIgaXRlbScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnb3JkZXJfaWQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYW4gb3JkZXJfaWQgcHJvcGVydHkgYW5kIGhhdmUgdHlwZSBzdHJpbmcnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ29yZGVyX251bWJlcicsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlciByZXNwb25zZSBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhbiBvcmRlcl9udW1iZXIgcHJvcGVydHkgYW5kIGhhdmUgdHlwZSBzdHJpbmcnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkNvbmZpZyB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbi8vIHRoZSBcImNvbmZpZ1wiIHByb3BlcnR5IGlzIGEgZ2VuZXJpYyBvYmplY3QgaW4gdGhlIGNvbW1lcmNlIGFwaSBzcGVjLCB0aGVzZSBpbnRlcmZhY2VzXG4vLyBhcmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc3RydWN0dXJlIG9mIHRoYXQgb2JqZWN0IGFuZCB0byB0cmFuc2Zvcm0gdGhlIGFwaSByZXNwb25zZVxuLy8gaW50byBhIHR5cGVkIG9iamVjdCBmb3IgdGhlIGZyb250ZW5kLiBEbyBub3QgdXNlIHRoZXNlIGludGVyZmFjZXMgZm9yIGFueXRoaW5nIGVsc2UuXG5pbnRlcmZhY2UgQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlIHtcbiAgc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZDogYm9vbGVhbjtcbiAgc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGU6IG51bWJlcjtcbiAgdHJhY2tpbmdfZW5hYmxlZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZSB7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3Mge1xuICBtZWFzdXJlbWVudF9pZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBpT3JnQW5hbHl0aWNzQ29uZmlnIHtcbiAgYW1wbGl0dWRlPzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlO1xuICBjdXN0b21lcl9zZXJ2aWNlPzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlO1xuICBnb29nbGVfYW5hbHl0aWNzPzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaU9yZ2FuaXphdGlvbkNvbmZpZyBleHRlbmRzIE9yZ2FuaXphdGlvbkNvbmZpZyB7XG4gIGNvbmZpZzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnO1xufVxuXG5jb25zdCBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZSA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiBzZXNzaW9uX3JlcGxheV9lbmFibGVkIGlzIG5vdCBhIGJvb2xlYW4nLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdzZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZScgaW4gZGF0YSkgfHxcbiAgICB0eXBlb2YgZGF0YS5zZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZSAhPT0gJ251bWJlcidcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiBzZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZSBpcyBub3QgYSBudW1iZXInLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCd0cmFja2luZ19lbmFibGVkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS50cmFja2luZ19lbmFibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdBbXBsaXR1ZGU6IHRyYWNraW5nX2VuYWJsZWQgaXMgbm90IGEgYm9vbGVhbicsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZSA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2U6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3Byb3ZpZGVyJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5wcm92aWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2U6IHByb3ZpZGVyIGlzIG5vdCBhIHN0cmluZycsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0dvb2dsZUFuYWx5dGljcyA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3M6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ21lYXN1cmVtZW50X2lkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5tZWFzdXJlbWVudF9pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3M6IG1lYXN1cmVtZW50X2lkIGlzIG5vdCBhIHN0cmluZycsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWcgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQW5hbHl0aWNzQ29uZmlnOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2FtcGxpdHVkZScgaW4gZGF0YSAmJlxuICAgICFpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZShkYXRhLmFtcGxpdHVkZSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogYW1wbGl0dWRlIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2N1c3RvbWVyX3NlcnZpY2UnIGluIGRhdGEgJiZcbiAgICAhaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2UoZGF0YS5jdXN0b21lcl9zZXJ2aWNlKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQW5hbHl0aWNzQ29uZmlnOiBjdXN0b21lcl9zZXJ2aWNlIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2dvb2dsZV9hbmFseXRpY3MnIGluIGRhdGEgJiZcbiAgICAhaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3MoZGF0YS5nb29nbGVfYW5hbHl0aWNzKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQW5hbHl0aWNzQ29uZmlnOiBnb29nbGVfYW5hbHl0aWNzIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNBcGlPcmdhbml6YXRpb25Db25maWcgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnYW5pemF0aW9uQ29uZmlnID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnY3JlYXRlZF9hdCcgaW4gZGF0YSkpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBjcmVhdGVkX2F0IGlzIG5vdCBkZWZpbmVkJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ25hbWVzcGFjZScgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEubmFtZXNwYWNlICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdDb25maWc6IG5hbWVzcGFjZSBpcyBub3QgYSBzdHJpbmcnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnaXNfbGF0ZXN0JyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5pc19sYXRlc3QgIT09ICdib29sZWFuJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdDb25maWc6IGlzX2xhdGVzdCBpcyBub3QgYSBib29sZWFuJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3ZlcnNpb24nIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLnZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogdmVyc2lvbiBpcyBub3QgYSBzdHJpbmcnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgndXBkYXRlZF9hdCcgaW4gZGF0YSkpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiB1cGRhdGVkX2F0IGlzIG5vdCBkZWZpbmVkJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2NvbmZpZycgaW4gZGF0YSkgfHxcbiAgICB0eXBlb2YgZGF0YS5jb25maWcgIT09ICdvYmplY3QnIHx8XG4gICAgIWlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnKGRhdGEuY29uZmlnKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBjb25maWcgaXMgbm90IGFuIG9iamVjdCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnb3JnYW5pemF0aW9uX2lkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLm9yZ2FuaXphdGlvbl9pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBvcmdhbml6YXRpb25faWQgaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdpZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBpZCBpcyBub3QgYSBzdHJpbmcnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQge1xuICBTdGF0c2lnRXhwZXJpbWVudCBhcyBBcGlPcmdDb25maWdFeHBlcmltZW50LFxuICBTdGF0c2lnRmVhdHVyZUdhdGUgYXMgQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUsXG4gIE9yZ2FuaXphdGlvblNldHRpbmdzIGFzIEFwaU9yZ0NvbmZpZ09yZ2FuaXphdGlvblNldHRpbmdzLFxuICBPcmdhbml6YXRpb24gYXMgQXBpT3JnYW5pemF0aW9uLFxuICBPcmdhbml6YXRpb25TdGF0dXNFbnVtLFxufSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgQXBpT3JnYW5pemF0aW9uQ29uZmlnLCBpc0FwaU9yZ2FuaXphdGlvbkNvbmZpZyB9IGZyb20gJy4vaXNBcGlPcmdhbml6YXRpb25Db25maWcnO1xuXG5pbnRlcmZhY2UgQXBpT3JnQ29uZmlnUmVzdWx0cyB7XG4gIGNvbmZpZ3M6IEFwaU9yZ2FuaXphdGlvbkNvbmZpZ1tdO1xuICBleHBlcmltZW50czogQXBpT3JnQ29uZmlnRXhwZXJpbWVudFtdO1xuICBnYXRlczogQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGVbXTtcbiAgb3JnOiBBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncztcbn1cblxuY29uc3QgaXNBcGlPcmdDb25maWdFeHBlcmltZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdFeHBlcmltZW50OiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdncm91cCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5ncm91cCAhPT0gJ3N0cmluZycgJiYgZGF0YS5ncm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogZ3JvdXAgaXMgbm90IGEgc3RyaW5nIG9yIHVuZGVmaW5lZCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdncm91cF9uYW1lJyBpbiBkYXRhICYmXG4gICAgdHlwZW9mIGRhdGEuZ3JvdXBfbmFtZSAhPT0gJ3N0cmluZycgJiZcbiAgICBkYXRhLmdyb3VwX25hbWUgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogZ3JvdXBfbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCduYW1lJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLm5hbWUgIT09ICdzdHJpbmcnICYmIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IG5hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgncnVsZV9pZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5ydWxlX2lkICE9PSAnc3RyaW5nJyAmJiBkYXRhLnJ1bGVfaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdFeHBlcmltZW50OiBydWxlX2lkIGlzIG5vdCBhIHN0cmluZycsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnZhbHVlICE9PSAnb2JqZWN0JyAmJiBkYXRhLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogdmFsdWUgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnbmFtZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5uYW1lICE9PSAnc3RyaW5nJyAmJiBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdydWxlX2lkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnJ1bGVfaWQgIT09ICdzdHJpbmcnICYmIGRhdGEucnVsZV9pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlOiBydWxlX2lkIGlzIG5vdCBhIHN0cmluZycsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnZhbHVlICE9PSAnYm9vbGVhbicgJiYgZGF0YS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlOiB2YWx1ZSBpcyBub3QgYSBib29sZWFuJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdhbml6YXRpb24gPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnYW5pemF0aW9uID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2lkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBpZCBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2Rpc3BsYXlfbmFtZScgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuZGlzcGxheV9uYW1lICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IGRpc3BsYXlfbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2RvbWFpbicgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuZG9tYWluICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IGRvbWFpbiBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3Nob3J0X25hbWUnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLnNob3J0X25hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogc2hvcnRfbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ3N0YXR1cycgaW4gZGF0YSkgfHxcbiAgICAhT2JqZWN0LnZhbHVlcyhPcmdhbml6YXRpb25TdGF0dXNFbnVtKS5pbmNsdWRlcyhkYXRhLnN0YXR1cyBhcyBPcmdhbml6YXRpb25TdGF0dXNFbnVtKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IHN0YXR1cyBpcyBub3QgYSB2YWxpZCBPcmdhbml6YXRpb25TdGF0dXNFbnVtIHZhbHVlJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2NyZWF0ZWRfYXQnIGluIGRhdGEgJiZcbiAgICAhKGRhdGEuY3JlYXRlZF9hdCBpbnN0YW5jZW9mIERhdGUpICYmXG4gICAgdHlwZW9mIGRhdGEuY3JlYXRlZF9hdCAhPT0gJ3N0cmluZycgJiZcbiAgICBkYXRhLmNyZWF0ZWRfYXQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBjcmVhdGVkX2F0IGlzIG5vdCBhIERhdGUnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICd1cGRhdGVkX2F0JyBpbiBkYXRhICYmXG4gICAgIShkYXRhLnVwZGF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgIHR5cGVvZiBkYXRhLnVwZGF0ZWRfYXQgIT09ICdzdHJpbmcnICYmXG4gICAgZGF0YS51cGRhdGVkX2F0ICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogdXBkYXRlZF9hdCBpcyBub3QgYSBEYXRlJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncyA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3MgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ09yZ2FuaXphdGlvblNldHRpbmdzOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdvcmcnIGluIGRhdGEpIHx8ICFpc0FwaU9yZ2FuaXphdGlvbihkYXRhLm9yZykpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5nczogb3JnIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHNraXAgdmFsaWRhdGlvbiBmb3IgJ3NldHRpbmdzJyBmb3Igbm93XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXBpT3JnQ29uZmlnUmVzdWx0cyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBSZXF1aXJlZDxBcGlPcmdDb25maWdSZXN1bHRzPiA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHM6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgISgnY29uZmlncycgaW4gZGF0YSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbmZpZ3MpIHx8XG4gICAgIWRhdGEuY29uZmlncy5ldmVyeSgoY29uZmlnKSA9PiBpc0FwaU9yZ2FuaXphdGlvbkNvbmZpZyhjb25maWcpKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnUmVzdWx0czogY29uZmlncyBpcyBub3QgYW4gYXJyYXknLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdleHBlcmltZW50cycgaW4gZGF0YSAmJlxuICAgIGRhdGEuZXhwZXJpbWVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaW1lbnRzKSB8fFxuICAgICAgIWRhdGEuZXhwZXJpbWVudHMuZXZlcnkoKGV4cCkgPT4gaXNBcGlPcmdDb25maWdFeHBlcmltZW50KGV4cCkpKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBleHBlcmltZW50cyBpcyBub3QgYW4gYXJyYXkgb3IgY29udGFpbnMgaW52YWxpZCBpdGVtcycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2dhdGVzJyBpbiBkYXRhKSB8fFxuICAgICFBcnJheS5pc0FycmF5KGRhdGEuZ2F0ZXMpIHx8XG4gICAgIWRhdGEuZ2F0ZXMuZXZlcnkoKGdhdGUpID0+IGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUoZ2F0ZSkpXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHM6IGdhdGVzIGlzIG5vdCBhbiBhcnJheSBvciBjb250YWlucyBpbnZhbGlkIGl0ZW1zJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnb3JnJyBpbiBkYXRhKSB8fCAhaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncyhkYXRhLm9yZykpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBvcmcgaXMgbm90IGFuIG9iamVjdCBvciBoYXMgaW52YWxpZCBmaWVsZHMnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgeyBkYXRhIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCB7IEFwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9yZXNwb25zZUdlbmVyaWNzJztcblxuZXhwb3J0IGNvbnN0IGlzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyA9IChvYmo6IHVua25vd24pOiBvYmogaXMgQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyA9PiB7XG4gIGlmIChvYmogPT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgndGl0bGUnIGluIG9iaiAmJiBvYmoudGl0bGUgIT0gbnVsbCAmJiB0eXBlb2Ygb2JqLnRpdGxlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnZGVzY3JpcHRpb24nIGluIG9iaiAmJiB0eXBlb2Ygb2JqLmRlc2NyaXB0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgndXJsJyBpbiBvYmogJiYgdHlwZW9mIG9iai51cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IHtcbiAgUExQQXR0cmlidXRlQ2F0ZWdvcnksXG4gIFBMUEF0dHJpYnV0ZXMsXG4gIFBMUElkQXR0cmlidXRlcyxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGlzQXBpUExQSWRBdHRyaWJ1dGUgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgUExQSWRBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnaWQnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLmlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQXBpUExQRXZlbnRBdHRyaWJ1dGVzID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFBMUEF0dHJpYnV0ZXMgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdjYXRlZ29yeScgaW4gZGF0YSkgfHxcbiAgICB0eXBlb2YgZGF0YS5jYXRlZ29yeSAhPT0gJ3N0cmluZycgfHxcbiAgICAhT2JqZWN0LnZhbHVlcyhQTFBBdHRyaWJ1dGVDYXRlZ29yeSkuaW5jbHVkZXMoZGF0YS5jYXRlZ29yeSBhcyBQTFBBdHRyaWJ1dGVDYXRlZ29yeSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2F0dHJpYnV0ZXMnIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuYXR0cmlidXRlcyAhPT0gJ29iamVjdCcgfHxcbiAgICAhaXNBcGlQTFBJZEF0dHJpYnV0ZShkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCB7IFByb2R1Y3RTZWFyY2hGaWx0ZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0gKFxuICBhdHRyaWJ1dGVzOiB1bmtub3duLFxuKTogYXR0cmlidXRlcyBpcyBQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCB8fCB0eXBlb2YgYXR0cmlidXRlcyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2ZpbHRlcl9uYW1lJyBpbiBhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzLmZpbHRlcl9uYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEdldE1lcmNoYW50Q29sb3JzUXVlcnlEYXRhIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsJztcblxuY29uc3QgUkVRVUlSRURfQ09MT1JfRklFTERTID0gW1xuICAnYWNjZW50X3ByaW1hcnknLFxuICAnYWNjZW50X3NlY29uZGFyeScsXG4gICdiYWNrZ3JvdW5kX2RhcmsnLFxuICAnYmFja2dyb3VuZF9saWdodCcsXG4gICdiYWNrZ3JvdW5kX3ByaW1hcnknLFxuICAnYmFja2dyb3VuZF9zYXR1cmF0ZWQnLFxuICAnYmFja2dyb3VuZF9zZWNvbmRhcnknLFxuICAnYmFja2dyb3VuZF9zZWNvbmRhcnlfZGFyaycsXG4gICdiYWNrZ3JvdW5kX3RlcnRpYXJ5JyxcbiAgJ2JvcmRlcl9kYXJrJyxcbiAgJ2JvcmRlcl9saWdodCcsXG4gICdib3JkZXJfbWVkaXVtJyxcbiAgJ2JvcmRlcl9vdXRsaW5lJyxcbiAgJ3RleHRfYWNjZW50JyxcbiAgJ3RleHRfbGlnaHQnLFxuICAndGV4dF9saW5rJyxcbiAgJ3RleHRfcHJpbWFyeScsXG4gICd0ZXh0X3NlY29uZGFyeScsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgaXNHcmFwaFFMQ29sb3JzQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEdldE1lcmNoYW50Q29sb3JzUXVlcnlEYXRhID0+IHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdJbnZhbGlkIGdyYXBocWwgcmVzcG9uc2UgZm9yIGNvbG9ycyBjb25maWcnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBlYWNoIHJlcXVpcmVkIGZpZWxkXG4gIGNvbnN0IG1pc3NpbmdGaWVsZHMgPSBSRVFVSVJFRF9DT0xPUl9GSUVMRFMuZmlsdGVyKFxuICAgIChmaWVsZCkgPT4gIShmaWVsZCBpbiBkYXRhKSB8fCB0eXBlb2YgKGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXSAhPT0gJ3N0cmluZycsXG4gICk7XG5cbiAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoID09PSBSRVFVSVJFRF9DT0xPUl9GSUVMRFMubGVuZ3RoKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdBbGwgY29sb3IgZmllbGRzIGFyZSBtaXNzaW5nIG9yIG51bGwnLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBjb2xvciBmaWVsZHMnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgICBtaXNzaW5nRmllbGRzLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8qKlxuICogR2VuZXJpYyB1dGlsaXR5IHRvIHRyYW5zZm9ybSBzbmFrZV9jYXNlIG9iamVjdCBrZXlzIHRvIGNhbWVsQ2FzZSBhdCBydW50aW1lLlxuICogVGhpcyBpcyB0aGUgcnVudGltZSBlcXVpdmFsZW50IG9mIHRoZSBDYW1lbENhc2VkUHJvcGVydGllc0RlZXAgdHlwZSB1dGlsaXR5LlxuICovXG5cbi8vIExpc3Qgb2YgYWNyb255bXMgdGhhdCBzaG91bGQgYmUgcHJlc2VydmVkIGFzIHVwcGVyY2FzZSBpbiBjYW1lbENhc2UgYW5kIGxvd2VyY2FzZSBpbiBzbmFrZV9jYXNlXG5jb25zdCBQUkVTRVJWRURfQUNST05ZTVMgPSBbXCJQTFBcIiwgXCJQRFBcIiwgXCJTVkdcIl07XG5cbi8qKlxuICogQ29udmVydHMgYSBzbmFrZV9jYXNlIHN0cmluZyB0byBjYW1lbENhc2VcbiAqIEhhbmRsZXMgc3BlY2lmaWMgYWNyb255bXMgbGlrZSBQTFAgYW5kIFBEUCBjb3JyZWN0bHlcbiAqL1xuY29uc3QgdG9DYW1lbENhc2UgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBQcmUtcHJvY2VzczogY29udmVydCBhbGwgd29yZHMgdGhhdCBtYXRjaCB0aGUgUFJFU0VSVkVEX0FDUk9OWU1TIHJlZ2V4IHRvIHVwcGVyY2FzZVxuICBsZXQgcHJvY2Vzc2VkU3RyID0gc3RyO1xuICBmb3IgKGNvbnN0IGFjcm9ueW0gb2YgUFJFU0VSVkVEX0FDUk9OWU1TKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBfJHthY3JvbnltfV8/YCwgXCJnaVwiKTtcblxuICAgIGlmIChwcm9jZXNzZWRTdHIubWF0Y2gocmVnZXgpKSB7XG4gICAgICBwcm9jZXNzZWRTdHIgPSBwcm9jZXNzZWRTdHIucmVwbGFjZShyZWdleCwgKHYpID0+XG4gICAgICAgIHYuZW5kc1dpdGgoXCJfXCIpID8gYCR7YWNyb255bX1fYCA6IGAke2Fjcm9ueW19YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3NlZFN0ci5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgbGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgY2FtZWxDYXNlIHN0cmluZyB0byBzbmFrZV9jYXNlXG4gKiBIYW5kbGVzIGNvbnNlY3V0aXZlIGNhcGl0YWwgbGV0dGVycyBjb3JyZWN0bHkgKGUuZy4sIFwiUERQXCIgLT4gXCJwZHBcIiwgbm90IFwicF9kX3BcIilcbiAqIFByZXNlcnZlcyBzcGVjaWZpYyBhY3JvbnltcyBsaWtlIFBMUCBhbmQgUERQIGFzIGxvd2VyY2FzZSBpbiBzbmFrZV9jYXNlXG4gKi9cbmNvbnN0IHRvU25ha2VDYXNlID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHJcbiAgICAucmVwbGFjZSgvKFtBLVpdKSg/PVthLXpdKS9nLCBcIl8kMVwiKVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXl8vLCBcIlwiKTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmFuc2Zvcm1zIGFsbCBvYmplY3Qga2V5cyBmcm9tIHNuYWtlX2Nhc2UgdG8gY2FtZWxDYXNlXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwgPSAob2JqOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKCh2YWwpID0+IHRyYW5zZm9ybVNuYWtlVG9DYW1lbCh2YWwpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgY29uc3QgY2FtZWxLZXkgPSB0b0NhbWVsQ2FzZShrZXkpO1xuICAgICAgcmVzdWx0W2NhbWVsS2V5XSA9IHRyYW5zZm9ybVNuYWtlVG9DYW1lbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybXMgYWxsIG9iamVjdCBrZXlzIGZyb20gY2FtZWxDYXNlIHRvIHNuYWtlX2Nhc2VcbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNhbWVsVG9TbmFrZSA9IChvYmo6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAodHJhbnNmb3JtQ2FtZWxUb1NuYWtlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgY29uc3Qgc25ha2VLZXkgPSB0b1NuYWtlQ2FzZShrZXkpO1xuICAgICAgcmVzdWx0W3NuYWtlS2V5XSA9IHRyYW5zZm9ybUNhbWVsVG9TbmFrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuIiwiaW1wb3J0IHsgRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cyBlbnVtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybnMgVGhlIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cyBlbnVtIHZhbHVlIG9yIHVuZGVmaW5lZCBpZiB0aGUgc3RyaW5nXG4gKiBkb2VzIG5vdCBtYXAgdG8gYSB2YWxpZCBlbnVtXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZSA9IChcbiAgc3RhdHVzOiBzdHJpbmcsXG4pOiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMgfCB1bmRlZmluZWQgPT4ge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgJ0FUVEVNUFRFRF9ERUxJVkVSWSc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkFUVEVNUFRFRF9ERUxJVkVSWTtcbiAgICBjYXNlICdDQU5DRUxFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkNBTkNFTEVEO1xuICAgIGNhc2UgJ0NPTkZJUk1FRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkNPTkZJUk1FRDtcbiAgICBjYXNlICdERUxJVkVSRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5ERUxJVkVSRUQ7XG4gICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkZBSUxVUkU7XG4gICAgY2FzZSAnRlVMRklMTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuRlVMRklMTEVEO1xuICAgIGNhc2UgJ0lOX1RSQU5TSVQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5JTl9UUkFOU0lUO1xuICAgIGNhc2UgJ0xBQkVMX1BSSU5URUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5MQUJFTF9QUklOVEVEO1xuICAgIGNhc2UgJ0xBQkVMX1BVUkNIQVNFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkxBQkVMX1BVUkNIQVNFRDtcbiAgICBjYXNlICdMQUJFTF9WT0lERUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5MQUJFTF9WT0lERUQ7XG4gICAgY2FzZSAnTUFSS0VEX0FTX0ZVTEZJTExFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLk1BUktFRF9BU19GVUxGSUxMRUQ7XG4gICAgY2FzZSAnTk9UX0RFTElWRVJFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLk5PVF9ERUxJVkVSRUQ7XG4gICAgY2FzZSAnT1VUX0ZPUl9ERUxJVkVSWSc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLk9VVF9GT1JfREVMSVZFUlk7XG4gICAgY2FzZSAnUElDS0VEX1VQJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUElDS0VEX1VQO1xuICAgIGNhc2UgJ1JFQURZX0ZPUl9QSUNLVVAnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5SRUFEWV9GT1JfUElDS1VQO1xuICAgIGNhc2UgJ1NVQk1JVFRFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLlNVQk1JVFRFRDtcbiAgICBjYXNlICdJTl9QUk9HUkVTUyc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLklOX1BST0dSRVNTO1xuICAgIGNhc2UgJ09OX0hPTEQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5PTl9IT0xEO1xuICAgIGNhc2UgJ09QRU4nOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5PUEVOO1xuICAgIGNhc2UgJ1BBUlRJQUxMWV9GVUxGSUxMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5QQVJUSUFMTFlfRlVMRklMTEVEO1xuICAgIGNhc2UgJ1BFTkRJTkdfRlVMRklMTE1FTlQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5QRU5ESU5HX0ZVTEZJTExNRU5UO1xuICAgIGNhc2UgJ1JFUVVFU1RfREVDTElORUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5SRVFVRVNUX0RFQ0xJTkVEO1xuICAgIGNhc2UgJ1JFU1RPQ0tFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLlJFU1RPQ0tFRDtcbiAgICBjYXNlICdTQ0hFRFVMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5TQ0hFRFVMRUQ7XG4gICAgY2FzZSAnVU5GVUxGSUxMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5VTkZVTEZJTExFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcbiIsImltcG9ydCB7IENvbG9yTWFwcGluZywgQ29sb3JOYW1lcyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2NvbG9yc0NvbmZpZ1wiO1xuaW1wb3J0IHsgaXNHcmFwaFFMQ29sb3JzQ29uZmlnIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2dyYXBoUUwvaXNHcmFwaFFMQ29sb3JzQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUdyYXBoUUxDb2xvcnNDb25maWcgPSAoXG4gIGRhdGE6IHVua25vd25cbik6IENvbG9yTWFwcGluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNHcmFwaFFMQ29sb3JzQ29uZmlnKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcbiIsImVudW0gRE9NSW5zZXJ0aW9uVHlwZSB7XG4gIEFGVEVSID0gXCJhZnRlclwiLFxuICBCRUZPUkUgPSBcImJlZm9yZVwiLFxuICBBREpBQ0VOVF9BRlRFUl9CRUdJTiA9IFwiYWRqYWNlbnQtYWZ0ZXItYmVnaW5cIixcbiAgQURKQUNFTlRfQkVGT1JFX0JFR0lOID0gXCJhZGphY2VudC1iZWZvcmUtYmVnaW5cIixcbiAgQURKQUNFTlRfQUZURVJfRU5EID0gXCJhZGphY2VudC1hZnRlci1lbmRcIixcbiAgQURKQUNFTlRfQkVGT1JFX0VORCA9IFwiYWRqYWNlbnQtYmVmb3JlLWVuZFwiLFxuICBBUFBFTkRfQ0hJTEQgPSBcImFwcGVuZC1jaGlsZFwiLFxuICBOT05FID0gXCJub25lXCIsXG59XG5cbmV4cG9ydCBjb25zdCBET01JbnNlcnRpb25UeXBlVG9JbnNlcnRQb3NpdGlvbiA9IChcbiAgdHlwZTogRE9NSW5zZXJ0aW9uVHlwZVxuKTogSW5zZXJ0UG9zaXRpb24gPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQUZURVJfQkVHSU46XG4gICAgICByZXR1cm4gXCJhZnRlcmJlZ2luXCI7XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkJFRk9SRTpcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQkVGT1JFX0JFR0lOOlxuICAgICAgcmV0dXJuIFwiYmVmb3JlYmVnaW5cIjtcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQkVGT1JFX0VORDpcbiAgICAgIHJldHVybiBcImJlZm9yZWVuZFwiO1xuICAgIGNhc2UgRE9NSW5zZXJ0aW9uVHlwZS5BRlRFUjpcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQUZURVJfRU5EOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJhZnRlcmVuZFwiO1xuICB9XG59O1xuXG5leHBvcnQgeyBET01JbnNlcnRpb25UeXBlIH07XG4iLCJlbnVtIEdyaWRJbnNlcnRpb25UeXBlIHtcbiAgRklYRURfMSA9IFwiZml4ZWQtMVwiLFxuICBGSVhFRF8yID0gXCJmaXhlZC0yXCIsXG4gIEZJWEVEXzMgPSBcImZpeGVkLTNcIixcbiAgRklYRURfNCA9IFwiZml4ZWQtNFwiLFxuICBGSVhFRF81ID0gXCJmaXhlZC01XCIsXG4gIEZJWEVEXzYgPSBcImZpeGVkLTZcIixcbiAgRklYRURfNyA9IFwiZml4ZWQtN1wiLFxuICBGSVhFRF84ID0gXCJmaXhlZC04XCIsXG4gIEZJWEVEXzkgPSBcImZpeGVkLTlcIixcbiAgRklYRURfMTIgPSBcImZpeGVkLTEyXCIsXG4gIEZJWEVEXzEzID0gXCJmaXhlZC0xM1wiLFxuICBST1dfMSA9IFwicm93LTFcIixcbiAgUk9XXzIgPSBcInJvdy0yXCIsXG4gIFJPV18zID0gXCJyb3ctM1wiLFxuICBST1dfNCA9IFwicm93LTRcIixcbn1cblxuZXhwb3J0IHsgR3JpZEluc2VydGlvblR5cGUgfTtcbiIsImltcG9ydCB7IEZyb250ZW5kQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9mcm9udGVuZENvbmZpZyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL3V0aWxzL3NuYWtlVG9DYW1lbFRyYW5zZm9ybWVyJztcbmltcG9ydCB7XG4gIFdpZGdldENvbmZpZyxcbiAgUGFnZVZhcmlhbnRDb25maWcsXG4gIFBhZ2VWYXJpYW50VGVzdFR5cGUsXG4gIFdpZGdldE1vdW50aW5nQ29uZmlnLFxufSBmcm9tICdzcmMvY29udGV4dHMvdHlwZXMnO1xuaW1wb3J0IHsgRE9NSW5zZXJ0aW9uVHlwZSB9IGZyb20gJ3NyYy9tZXJjaGFudHMvZG9tSW5zZXJ0aW9uJztcbmltcG9ydCB7IEdyaWRJbnNlcnRpb25UeXBlIH0gZnJvbSAnc3JjL21lcmNoYW50cy9ncmlkSW5zZXJ0aW9uJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gUGFnZVZhcmlhbnRRdWVyeURhdGEgdG8gUGFnZVZhcmlhbnRDb25maWdcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUFuZFRyYW5zZm9ybVBhZ2VWYXJpYW50cyA9IChcbiAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFBhZ2VWYXJpYW50Q29uZmlnID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwoY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb25zdCB7IHZhcmlhbnRDaGVja3MsIHdpZGdldE1vdW50aW5nLCAuLi5yZXN0IH0gPSB0cmFuc2Zvcm1lZDtcblxuICAvLyBDb252ZXJ0IHZhcmlhbnRDaGVja3MgdG8gdmFyaWFudFRlc3RzIHdpdGggdGVzdFR5cGUgbm9ybWFsaXphdGlvblxuICBjb25zdCB2YXJpYW50VGVzdHMgPSBBcnJheS5pc0FycmF5KHZhcmlhbnRDaGVja3MpXG4gICAgPyB2YXJpYW50Q2hlY2tzLm1hcCgoeyBjaGVja1R5cGUsIC4uLnJlc3RDaGVjayB9KSA9PiAoe1xuICAgICAgICAuLi5yZXN0Q2hlY2ssXG4gICAgICAgIHRlc3RUeXBlOiBjaGVja1R5cGUsXG4gICAgICB9KSlcbiAgICA6IFtdO1xuXG4gIC8vIE5vcm1hbGl6ZSB3aWRnZXRNb3VudGluZzogY2hlY2tzIC0+IHRlc3RzLCBjaGVja1R5cGUgLT4gdGVzdFR5cGVcbiAgY29uc3Qgbm9ybWFsaXplZFdpZGdldE1vdW50aW5nID0gQXJyYXkuaXNBcnJheSh3aWRnZXRNb3VudGluZylcbiAgICA/IHdpZGdldE1vdW50aW5nLm1hcCgoeyBtb3VudGluZ1BvaW50V2lkZ2V0cywgLi4ucmVzdE1vdW50aW5nIH0pID0+ICh7XG4gICAgICAgIC4uLnJlc3RNb3VudGluZyxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkobW91bnRpbmdQb2ludFdpZGdldHMpXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIG1vdW50aW5nUG9pbnRXaWRnZXRzOiBtb3VudGluZ1BvaW50V2lkZ2V0cy5tYXAoKHsgY2hlY2tzLCAuLi5yZXN0V2lkZ2V0IH0pID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ucmVzdFdpZGdldCxcbiAgICAgICAgICAgICAgICB0ZXN0czogQXJyYXkuaXNBcnJheShjaGVja3MpXG4gICAgICAgICAgICAgICAgICA/IGNoZWNrcy5tYXAoKHsgY2hlY2tUeXBlLCAuLi5yZXN0Q2hlY2sgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5yZXN0Q2hlY2ssXG4gICAgICAgICAgICAgICAgICAgICAgdGVzdFR5cGU6IGNoZWNrVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KSlcbiAgICA6IFtdO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIC4uLnJlc3QsXG4gICAgLi4uKHZhcmlhbnRUZXN0cyA/IHsgdmFyaWFudFRlc3RzIH0gOiB7fSksXG4gICAgLi4uKG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZyA/IHsgd2lkZ2V0TW91bnRpbmc6IG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZyB9IDoge30pLFxuICB9O1xuXG4gIGNvbnN0IHZhcmlhbnRJZCA9IG5vcm1hbGl6ZWRDb25maWcudmFyaWFudElkIGFzIHN0cmluZztcbiAgY29uc3QgdmFyaWFudFR5cGUgPSBub3JtYWxpemVkQ29uZmlnLnZhcmlhbnRUeXBlIGFzIHN0cmluZztcblxuICBpZiAodHlwZW9mIHZhcmlhbnRJZCAhPT0gJ3N0cmluZycgfHwgIXZhcmlhbnRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHZhcmlhbnRJZCBmb3IgcGFnZVZhcmlhbnRgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFyaWFudFR5cGUgIT09ICdzdHJpbmcnIHx8ICF2YXJpYW50VHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHZhcmlhbnRUeXBlIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhcmlhbnRUZXN0cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyBvciBpbnZhbGlkIHZhcmlhbnRUZXN0cyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfScuIE11c3QgYmUgYW4gYXJyYXlgLFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHRlc3Qgb2YgdmFyaWFudFRlc3RzKSB7XG4gICAgaWYgKCF0ZXN0LnRlc3RUeXBlIHx8IHR5cGVvZiB0ZXN0LnRlc3RUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhcmlhbnRUZXN0LnRlc3RUeXBlIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoUGFnZVZhcmlhbnRUZXN0VHlwZSkuaW5jbHVkZXModGVzdC50ZXN0VHlwZSBhcyBQYWdlVmFyaWFudFRlc3RUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCB0ZXN0VHlwZSAnJHt0ZXN0LnRlc3RUeXBlfScgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKFxuICAgICAgICAgIFBhZ2VWYXJpYW50VGVzdFR5cGUsXG4gICAgICAgICkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFdpZGdldE1vdW50aW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nIG9yIGludmFsaWQgd2lkZ2V0TW91bnRpbmcgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nLiBNdXN0IGJlIGFuIGFycmF5YCxcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBtb3VudGluZyBvZiBub3JtYWxpemVkV2lkZ2V0TW91bnRpbmcpIHtcbiAgICBpZiAodHlwZW9mIG1vdW50aW5nLm1vdW50aW5nQ29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICFtb3VudGluZy5tb3VudGluZ0NvbmZpZ0lkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW91bnRpbmdDb25maWdJZCBpbiB3aWRnZXRNb3VudGluZyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG5cbiAgICBpZiAobW91bnRpbmcud2lkZ2V0Q29uZmlnSWQgJiYgdHlwZW9mIG1vdW50aW5nLndpZGdldENvbmZpZ0lkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdpZGdldENvbmZpZ0lkIGluIHdpZGdldE1vdW50aW5nIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICAgIH1cblxuICAgIGlmIChtb3VudGluZy5tb3VudGluZ1BvaW50V2lkZ2V0cykge1xuICAgICAgZm9yIChjb25zdCB3aWRnZXQgb2YgbW91bnRpbmcubW91bnRpbmdQb2ludFdpZGdldHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aWRnZXQud2lkZ2V0Q29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICF3aWRnZXQud2lkZ2V0Q29uZmlnSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCB3aWRnZXRDb25maWdJZCBpbiBtb3VudGluZ1BvaW50V2lkZ2V0cyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkod2lkZ2V0LnRlc3RzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIG9yIG1pc3NpbmcgdGVzdHMgaW4gbW91bnRpbmdQb2ludFdpZGdldHMgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhcmlhbnRUeXBlID09PSAncGxwJykge1xuICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5wbHBJZEV4dHJhY3RvciAhPT0gJ3N0cmluZycgfHwgIW5vcm1hbGl6ZWRDb25maWcucGxwSWRFeHRyYWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHBscElkRXh0cmFjdG9yIGZvciBQTFAgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFyaWFudFR5cGUgPT09ICdwZHAnKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcucHJvZHVjdElkRXh0cmFjdG9yICE9PSAnc3RyaW5nJyB8fFxuICAgICAgIW5vcm1hbGl6ZWRDb25maWcucHJvZHVjdElkRXh0cmFjdG9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBwcm9kdWN0SWRFeHRyYWN0b3IgZm9yIFBEUCBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBub3JtYWxpemVkQ29uZmlnLnBhcmVudFByb2R1Y3RJZEV4dHJhY3RvciAmJlxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcucGFyZW50UHJvZHVjdElkRXh0cmFjdG9yICE9PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwYXJlbnRQcm9kdWN0SWRFeHRyYWN0b3IgZm9yIFBEUCBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9Jy4gTXVzdCBiZSBzdHJpbmcgaWYgcHJvdmlkZWRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZENvbmZpZyBhcyBQYWdlVmFyaWFudENvbmZpZztcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhbmQgdHJhbnNmb3JtIE1vdW50aW5nQ29uZmlnUXVlcnlEYXRhIHRvIFdpZGdldE1vdW50aW5nQ29uZmlnXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRUcmFuc2Zvcm1Nb3VudGluZ0NvbmZpZyA9IChcbiAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29uZmlnS2V5OiBzdHJpbmcsXG4pOiBXaWRnZXRNb3VudGluZ0NvbmZpZyA9PiB7XG4gIC8vIFJFTkFNSU5HIExPR0lDOiBDb252ZXJ0IGJhY2tlbmQgXCJDaGVja1wiIHRlcm1pbm9sb2d5IHRvIGZyb250ZW5kIFwiVGVzdFwiIHRlcm1pbm9sb2d5XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuXG4gIC8vIENvbnZlcnQgY2hlY2tJZCB0byB0ZXN0SWQgZm9yIGZyb250ZW5kIGNvbXBhdGliaWxpdHkgKGRhdGEgaXMgYWxyZWFkeSBjYW1lbENhc2UpXG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmNoZWNrSWQgJiYgIW5vcm1hbGl6ZWRDb25maWcudGVzdElkKSB7XG4gICAgbm9ybWFsaXplZENvbmZpZy50ZXN0SWQgPSBub3JtYWxpemVkQ29uZmlnLmNoZWNrSWQ7XG4gICAgZGVsZXRlIG5vcm1hbGl6ZWRDb25maWcuY2hlY2tJZDtcbiAgfVxuXG4gIC8vIFJlcXVpcmVkIGZpZWxkcyAtIHRoZXNlIG11c3QgYmUgcHJlc2VudCBhbmQgdmFsaWRcbiAgaWYgKHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLm1vdW50aW5nQ29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLm1vdW50aW5nQ29uZmlnSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBtb3VudGluZ0NvbmZpZ0lkIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuY29udGFpbmVySWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLmNvbnRhaW5lcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgY29udGFpbmVySWQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy50ZXN0SWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLnRlc3RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHRlc3RJZCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cblxuICAvLyBSZXF1aXJlZCBpbnNlcnRpb25Qb2ludFxuICBpZiAoXG4gICAgIW5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQgfHxcbiAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5pbnNlcnRpb25Qb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIGluc2VydGlvblBvaW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuXG4gIGNvbnN0IGluc2VydGlvblBvaW50ID0gbm9ybWFsaXplZENvbmZpZy5pbnNlcnRpb25Qb2ludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBWYWxpZGF0ZSBpbnNlcnRpb25Qb2ludCByZXF1aXJlZCBmaWVsZHNcbiAgaWYgKHR5cGVvZiBpbnNlcnRpb25Qb2ludC5zZWxlY3RvciAhPT0gJ3N0cmluZycgfHwgIWluc2VydGlvblBvaW50LnNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG4gIGlmICh0eXBlb2YgaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSAhPT0gJ3N0cmluZycgfHwgIWluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGluc2VydGlvblR5cGUgaXMgYSB2YWxpZCBET01JbnNlcnRpb25UeXBlXG4gIGlmICghT2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5pbmNsdWRlcyhpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSAnJHtpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlfScgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIGluc2VydGlvblBvaW50IGZpZWxkc1xuICBpZiAoaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggIT0gbnVsbCAmJiB0eXBlb2YgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIG51bWJlciBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmVudEluc2VydGlvblBvaW50IGlmIHByZXNlbnRcbiAgbGV0IHBhcmVudEluc2VydGlvblBvaW50O1xuICBpZiAobm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnBhcmVudEluc2VydGlvblBvaW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLnBhcmVudEluc2VydGlvblBvaW50KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50UG9pbnQgPSBub3JtYWxpemVkQ29uZmlnLnBhcmVudEluc2VydGlvblBvaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmICh0eXBlb2YgcGFyZW50UG9pbnQuc2VsZWN0b3IgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnRQb2ludC5zZWxlY3Rvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmVudFBvaW50Lmluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaXNzaW5nIG9yIGludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKERPTUluc2VydGlvblR5cGUpLmluY2x1ZGVzKHBhcmVudFBvaW50Lmluc2VydGlvblR5cGUgYXMgRE9NSW5zZXJ0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSAnJHtwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlfScgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnRQb2ludC5zZWxlY3Rpb25JbmRleCAhPSBudWxsICYmIHR5cGVvZiBwYXJlbnRQb2ludC5zZWxlY3Rpb25JbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIG51bWJlciBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcmVudEluc2VydGlvblBvaW50ID0ge1xuICAgICAgc2VsZWN0b3I6IHBhcmVudFBvaW50LnNlbGVjdG9yLFxuICAgICAgaW5zZXJ0aW9uVHlwZTogcGFyZW50UG9pbnQuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlLFxuICAgICAgc2VsZWN0aW9uSW5kZXg6IHBhcmVudFBvaW50LnNlbGVjdGlvbkluZGV4IGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgb3B0aW9uYWwgd3JhcHBpbmdFbGVtZW50IGlmIHByZXNlbnRcbiAgbGV0IHdyYXBwaW5nRWxlbWVudDtcbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcud3JhcHBpbmdFbGVtZW50KSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcud3JhcHBpbmdFbGVtZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3cmFwcGluZ0VsZW1lbnQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGluZyA9IG5vcm1hbGl6ZWRDb25maWcud3JhcHBpbmdFbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmICh0eXBlb2Ygd3JhcHBpbmcuY2xhc3NOYW1lICE9PSAnc3RyaW5nJyB8fCAhd3JhcHBpbmcuY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB3cmFwcGluZ0VsZW1lbnQuY2xhc3NOYW1lIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3cmFwcGluZy5lbGVtZW50ICE9PSAnc3RyaW5nJyB8fCAhd3JhcHBpbmcuZWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd3JhcHBpbmdFbGVtZW50LmVsZW1lbnQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdyYXBwaW5nLmluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8ICF3cmFwcGluZy5pbnNlcnRpb25UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB3cmFwcGluZ0VsZW1lbnQuaW5zZXJ0aW9uVHlwZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKERPTUluc2VydGlvblR5cGUpLmluY2x1ZGVzKHdyYXBwaW5nLmluc2VydGlvblR5cGUgYXMgRE9NSW5zZXJ0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgd3JhcHBpbmdFbGVtZW50Lmluc2VydGlvblR5cGUgJyR7d3JhcHBpbmcuaW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3cmFwcGluZ0VsZW1lbnQgPSB7XG4gICAgICBjbGFzc05hbWU6IHdyYXBwaW5nLmNsYXNzTmFtZSxcbiAgICAgIGVsZW1lbnQ6IHdyYXBwaW5nLmVsZW1lbnQsXG4gICAgICBpbnNlcnRpb25UeXBlOiB3cmFwcGluZy5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIGZpZWxkc1xuICBpZiAoXG4gICAgbm9ybWFsaXplZENvbmZpZy5kaXZDaGVja1NlbGVjdG9yICE9IG51bGwgJiZcbiAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5kaXZDaGVja1NlbGVjdG9yICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBkaXZDaGVja1NlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lICE9IG51bGwgJiYgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNsYXNzTmFtZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkYCxcbiAgICApO1xuICB9XG4gIGlmIChcbiAgICBub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3IgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3IgIT09ICdzdHJpbmcnXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHN1cHByZXNzaW9uU2VsZWN0b3IgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuICBpZiAoXG4gICAgbm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcyAhPSBudWxsICYmXG4gICAgKHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmRhdGFBdHRyaWJ1dGVzICE9PSAnb2JqZWN0JyB8fFxuICAgICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLmRhdGFBdHRyaWJ1dGVzKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZGF0YUF0dHJpYnV0ZXMgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhbiBvYmplY3Qgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWRDb25maWcuc3R5bGUgIT0gbnVsbCAmJlxuICAgICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5zdHlsZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLnN0eWxlKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN0eWxlIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0IG9yIG51bGwvdW5kZWZpbmVkYCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBncmlkSW5zZXJ0aW9uVHlwZSBpZiBwcmVzZW50XG4gIGxldCBncmlkSW5zZXJ0aW9uVHlwZTtcbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICFub3JtYWxpemVkQ29uZmlnLmdyaWRJbnNlcnRpb25UeXBlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3JpZEluc2VydGlvblR5cGUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFPYmplY3QudmFsdWVzKEdyaWRJbnNlcnRpb25UeXBlKS5pbmNsdWRlcyhcbiAgICAgICAgbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZSBhcyBHcmlkSW5zZXJ0aW9uVHlwZSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZ3JpZEluc2VydGlvblR5cGUgJyR7bm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoR3JpZEluc2VydGlvblR5cGUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGdyaWRJbnNlcnRpb25UeXBlID0gbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZSBhcyBHcmlkSW5zZXJ0aW9uVHlwZTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSByZXR1cm4gb2JqZWN0LCBvbmx5IGluY2x1ZGluZyBvcHRpb25hbCBmaWVsZHMgaWYgdGhleSBoYXZlIHZhbHVlc1xuICBjb25zdCByZXN1bHQ6IFdpZGdldE1vdW50aW5nQ29uZmlnID0ge1xuICAgIG1vdW50aW5nQ29uZmlnSWQ6IG5vcm1hbGl6ZWRDb25maWcubW91bnRpbmdDb25maWdJZCxcbiAgICBjb250YWluZXJJZDogbm9ybWFsaXplZENvbmZpZy5jb250YWluZXJJZCxcbiAgICB0ZXN0SWQ6IG5vcm1hbGl6ZWRDb25maWcudGVzdElkLFxuICAgIGluc2VydGlvblBvaW50OiB7XG4gICAgICBzZWxlY3RvcjogaW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IsXG4gICAgICBpbnNlcnRpb25UeXBlOiBpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUsXG4gICAgICAuLi4oaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggIT0gbnVsbCAmJiB7XG4gICAgICAgIHNlbGVjdGlvbkluZGV4OiBpbnNlcnRpb25Qb2ludC5zZWxlY3Rpb25JbmRleCxcbiAgICAgIH0pLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gT25seSBhZGQgb3B0aW9uYWwgZmllbGRzIGlmIHRoZXkgaGF2ZSB2YWx1ZXNcbiAgaWYgKHBhcmVudEluc2VydGlvblBvaW50KSB7XG4gICAgcmVzdWx0LnBhcmVudEluc2VydGlvblBvaW50ID0gcGFyZW50SW5zZXJ0aW9uUG9pbnQ7XG4gIH1cbiAgaWYgKGdyaWRJbnNlcnRpb25UeXBlKSB7XG4gICAgcmVzdWx0LmdyaWRJbnNlcnRpb25UeXBlID0gZ3JpZEluc2VydGlvblR5cGU7XG4gIH1cbiAgaWYgKHdyYXBwaW5nRWxlbWVudCkge1xuICAgIHJlc3VsdC53cmFwcGluZ0VsZW1lbnQgPSB3cmFwcGluZ0VsZW1lbnQ7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3Rvcikge1xuICAgIHJlc3VsdC5kaXZDaGVja1NlbGVjdG9yID0gbm9ybWFsaXplZENvbmZpZy5kaXZDaGVja1NlbGVjdG9yIGFzIHN0cmluZztcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5jbGFzc05hbWUpIHtcbiAgICByZXN1bHQuY2xhc3NOYW1lID0gbm9ybWFsaXplZENvbmZpZy5jbGFzc05hbWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3IpIHtcbiAgICByZXN1bHQuc3VwcHJlc3Npb25TZWxlY3RvciA9IG5vcm1hbGl6ZWRDb25maWcuc3VwcHJlc3Npb25TZWxlY3RvcjtcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcykge1xuICAgIHJlc3VsdC5kYXRhQXR0cmlidXRlcyA9IG5vcm1hbGl6ZWRDb25maWcuZGF0YUF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5zdHlsZSkge1xuICAgIHJlc3VsdC5zdHlsZSA9IG5vcm1hbGl6ZWRDb25maWcuc3R5bGUgYXMgUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYW5kIHRyYW5zZm9ybSBXaWRnZXRDb25maWdRdWVyeURhdGEgdG8gV2lkZ2V0Q29uZmlnXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRUcmFuc2Zvcm1XaWRnZXRDb25maWcgPSAoXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZ0tleTogc3RyaW5nLFxuKTogV2lkZ2V0Q29uZmlnID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZENvbmZpZyA9IHRyYW5zZm9ybVNuYWtlVG9DYW1lbChjb25maWcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy53aWRnZXRDb25maWdJZCAhPT0gJ3N0cmluZycgfHwgIW5vcm1hbGl6ZWRDb25maWcud2lkZ2V0Q29uZmlnSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB3aWRnZXRDb25maWdJZCBmb3Igd2lkZ2V0IGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy50eXBlICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy50eXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgdHlwZSBmb3Igd2lkZ2V0IGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY29udGVudElkICE9IG51bGwgJiYgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuY29udGVudElkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbnRlbnRJZCBmb3Igd2lkZ2V0IGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIE5vdGU6IFdpZGdldCBjb25maWdzIGFyZSBjb21wbGV4IHVuaW9ucyB3aXRoIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllcy5cblxuICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgY29uZmlnIGFzIFdpZGdldENvbmZpZ1xuICAvLyBVc2UgaW50ZXJtZWRpYXRlICd1bmtub3duJyBjYXN0IGZvciBjb21wbGV4IHVuaW9uIHR5cGVzXG4gIHJldHVybiBub3JtYWxpemVkQ29uZmlnIGFzIHVua25vd24gYXMgV2lkZ2V0Q29uZmlnO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlR3JhcGhRTEZyb250ZW5kQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBGcm9udGVuZENvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gVmFsaWRhdGUgbWVyY2hhbnRfb3ZlcnJpZGVfY3NzIGlmIHByZXNlbnRcbiAgaWYgKFxuICAgICdtZXJjaGFudF9vdmVycmlkZV9jc3MnIGluIG9iaiAmJlxuICAgIHR5cGVvZiBvYmoubWVyY2hhbnRfb3ZlcnJpZGVfY3NzICE9PSAnc3RyaW5nJyAmJlxuICAgIG9iai5tZXJjaGFudF9vdmVycmlkZV9jc3MgIT09IG51bGxcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBtZXJjaGFudF9vdmVycmlkZV9jc3MgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHBhZ2VfdmFyaWFudHMgaWYgcHJlc2VudFxuICBpZiAoJ3BhZ2VfdmFyaWFudHMnIGluIG9iaikge1xuICAgIGlmIChcbiAgICAgIG9iai5wYWdlX3ZhcmlhbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9iai5wYWdlX3ZhcmlhbnRzICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShvYmoucGFnZV92YXJpYW50cylcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBwYWdlX3ZhcmlhbnRzIG11c3QgYmUgYW4gYXJyYXkgb3IgbnVsbC91bmRlZmluZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgZGF0YSB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgbW91bnRpbmdfY29uZmlncyBpZiBwcmVzZW50XG4gIGlmICgnbW91bnRpbmdfY29uZmlncycgaW4gb2JqKSB7XG4gICAgaWYgKFxuICAgICAgb2JqLm1vdW50aW5nX2NvbmZpZ3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb2JqLm1vdW50aW5nX2NvbmZpZ3MgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KG9iai5tb3VudGluZ19jb25maWdzKVxuICAgICkge1xuICAgICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAgICdJbnZhbGlkIEdyYXBoUUwgZnJvbnRlbmQgY29uZmlnIGRhdGE6IG1vdW50aW5nX2NvbmZpZ3MgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsL3VuZGVmaW5lZCcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgeyBkYXRhIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB3aWRnZXRfY29uZmlncyBpZiBwcmVzZW50XG4gIGlmICgnd2lkZ2V0X2NvbmZpZ3MnIGluIG9iaikge1xuICAgIGlmIChcbiAgICAgIG9iai53aWRnZXRfY29uZmlncyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvYmoud2lkZ2V0X2NvbmZpZ3MgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KG9iai53aWRnZXRfY29uZmlncylcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiB3aWRnZXRfY29uZmlncyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwvdW5kZWZpbmVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IGRhdGEgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHVpX2NvbmZpZ3MgaWYgcHJlc2VudFxuICBpZiAoJ3VpX2NvbmZpZ3MnIGluIG9iaiAmJiB0eXBlb2Ygb2JqLnVpX2NvbmZpZ3MgIT09ICdvYmplY3QnICYmIG9iai51aV9jb25maWdzICE9PSBudWxsKSB7XG4gICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiB1aV9jb25maWdzIG11c3QgYmUgYW4gb2JqZWN0IG9yIG51bGwvdW5kZWZpbmVkJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVHJhbnNmb3JtIHRoZSBkYXRhIHRvIGNhbWVsQ2FzZVxuICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRyYW5zZm9ybVNuYWtlVG9DYW1lbChvYmopIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQ29udmVydCBwYWdlX3ZhcmlhbnRzIGZyb20gYXJyYXkgdG8gdmFsaWRhdGVkIGFycmF5IGlmIHByZXNlbnRcbiAgICBpZiAodHJhbnNmb3JtZWREYXRhLnBhZ2VWYXJpYW50cyAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHMpKSB7XG4gICAgICBjb25zdCBwYWdlVmFyaWFudHNBcnJheSA9IHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHM7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRQYWdlVmFyaWFudHM6IFBhZ2VWYXJpYW50Q29uZmlnW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIHBhZ2VWYXJpYW50c0FycmF5KSB7XG4gICAgICAgIGlmICh2YXJpYW50ICYmIHR5cGVvZiB2YXJpYW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFyaWFudC52YXJpYW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFZhcmlhbnQgPSB2YWxpZGF0ZUFuZFRyYW5zZm9ybVBhZ2VWYXJpYW50cyh2YXJpYW50KTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBhZ2VWYXJpYW50cy5wdXNoKHZhbGlkYXRlZFZhcmlhbnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBwYWdlIHZhcmlhbnQsIHNraXBwaW5nJywgZXJyb3IsIHtcbiAgICAgICAgICAgICAgdmFyaWFudElkOiB2YXJpYW50LnZhcmlhbnRJZCxcbiAgICAgICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgcHJvY2Vzc2luZyBvdGhlciB2YXJpYW50c1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBwYWdlIHZhcmlhbnQgc3RydWN0dXJlLCBza2lwcGluZycsIHVuZGVmaW5lZCwgeyB2YXJpYW50IH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHMgPSB2YWxpZGF0ZWRQYWdlVmFyaWFudHM7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBtb3VudGluZ19jb25maWdzIGZyb20gYXJyYXkgdG8gUmVjb3JkIGlmIHByZXNlbnRcbiAgICBpZiAodHJhbnNmb3JtZWREYXRhLm1vdW50aW5nQ29uZmlncyAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVkRGF0YS5tb3VudGluZ0NvbmZpZ3MpKSB7XG4gICAgICBjb25zdCBtb3VudGluZ0NvbmZpZ3NBcnJheSA9IHRyYW5zZm9ybWVkRGF0YS5tb3VudGluZ0NvbmZpZ3MgYXMgQXJyYXk8e1xuICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgY29uZmlnOiB1bmtub3duO1xuICAgICAgfT47XG4gICAgICBjb25zdCBtb3VudGluZ0NvbmZpZ3NSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFdpZGdldE1vdW50aW5nQ29uZmlnPiA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW91bnRpbmdDb25maWdzQXJyYXkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW0gJiZcbiAgICAgICAgICB0eXBlb2YgaXRlbS5rZXkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgaXRlbS5jb25maWcgJiZcbiAgICAgICAgICB0eXBlb2YgaXRlbS5jb25maWcgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdHJhbnNmb3JtIHRoZSBjb25maWcgc3RydWN0dXJlXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBpdGVtLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZENvbmZpZyA9IHZhbGlkYXRlQW5kVHJhbnNmb3JtTW91bnRpbmdDb25maWcoY29uZmlnLCBpdGVtLmtleSk7XG4gICAgICAgICAgICBtb3VudGluZ0NvbmZpZ3NSZWNvcmRbaXRlbS5rZXldID0gdmFsaWRhdGVkQ29uZmlnO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBtb3VudGluZyBjb25maWcsIHNraXBwaW5nJywgZXJyb3IsIHtcbiAgICAgICAgICAgICAgY29uZmlnS2V5OiBpdGVtLmtleSxcbiAgICAgICAgICAgICAgY29uZmlnOiBpdGVtLmNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgcHJvY2Vzc2luZyBvdGhlciBjb25maWdzXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIExvZ2dlci5sb2dXYXJuKCdJbnZhbGlkIG1vdW50aW5nIGNvbmZpZyBpdGVtIHN0cnVjdHVyZSwgc2tpcHBpbmcnLCB1bmRlZmluZWQsIHsgaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lZERhdGEubW91bnRpbmdDb25maWdzID0gbW91bnRpbmdDb25maWdzUmVjb3JkO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgd2lkZ2V0X2NvbmZpZ3MgZnJvbSBhcnJheSB0byBSZWNvcmQgaWYgcHJlc2VudFxuICAgIGlmICh0cmFuc2Zvcm1lZERhdGEud2lkZ2V0Q29uZmlncyAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVkRGF0YS53aWRnZXRDb25maWdzKSkge1xuICAgICAgY29uc3Qgd2lkZ2V0Q29uZmlnc0FycmF5ID0gdHJhbnNmb3JtZWREYXRhLndpZGdldENvbmZpZ3MgYXMgQXJyYXk8e1xuICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgY29uZmlnOiB1bmtub3duO1xuICAgICAgfT47XG4gICAgICBjb25zdCB3aWRnZXRDb25maWdzUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygd2lkZ2V0Q29uZmlnc0FycmF5KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpdGVtICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0ua2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGl0ZW0uY29uZmlnICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0uY29uZmlnID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHRyYW5zZm9ybSB3aWRnZXQgY29uZmlnIHVzaW5nIHRoZSBkZWRpY2F0ZWQgdmFsaWRhdGlvbiBmdW5jdGlvblxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gaXRlbS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRDb25maWcgPSB2YWxpZGF0ZUFuZFRyYW5zZm9ybVdpZGdldENvbmZpZyhjb25maWcsIGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIHdpZGdldENvbmZpZ3NSZWNvcmRbaXRlbS5rZXldID0gdmFsaWRhdGVkQ29uZmlnO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCB3aWRnZXQgY29uZmlnLCBza2lwcGluZycsIGVycm9yLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ0tleTogaXRlbS5rZXksXG4gICAgICAgICAgICAgIGNvbmZpZzogaXRlbS5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgY29uZmlnc1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCB3aWRnZXQgY29uZmlnIGl0ZW0gc3RydWN0dXJlLCBza2lwcGluZycsIHVuZGVmaW5lZCwgeyBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybWVkRGF0YS53aWRnZXRDb25maWdzID0gd2lkZ2V0Q29uZmlnc1JlY29yZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtZWREYXRhIGFzIEZyb250ZW5kQ29uZmlnO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIExvZ2dlci5sb2dXYXJuKCdGYWlsZWQgdG8gdmFsaWRhdGUgYW5kIHRyYW5zZm9ybSBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhJywgZXJyb3IsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcbiIsImV4cG9ydCBjb25zdCB2YWxpZGF0ZUdyYXBoUUxPcmdJZCA9IChkYXRhOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyB8fCBkYXRhID09PSAnJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn07XG4iLCJpbXBvcnQgeyBpc01vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgfSBmcm9tICcuLi9ndWFyZHMvaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyJztcbmltcG9ydCB7IE1vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgfSBmcm9tICcuLi9tb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4pOiBNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc01vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93SW5kZXg6IHZhbHVlLnJvd19pbmRleCxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9vcmdhbml6YXRpb25Db25maWcnO1xuaW1wb3J0IHsgaXNBcGlPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdhbml6YXRpb25Db25maWcnO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcgPSAoZGF0YTogdW5rbm93bik6IE9yZ2FuaXphdGlvbkNvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNBcGlPcmdhbml6YXRpb25Db25maWcoZGF0YSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogZGF0YS5pZCxcbiAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdC50b0lTT1N0cmluZygpLFxuICAgIG5hbWVzcGFjZTogZGF0YS5uYW1lc3BhY2UsXG4gICAgb3JnYW5pemF0aW9uSWQ6IGRhdGEub3JnYW5pemF0aW9uX2lkLFxuICAgIGlzTGF0ZXN0OiBkYXRhLmlzX2xhdGVzdCxcbiAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgdXBkYXRlZEF0OiBkYXRhLnVwZGF0ZWRfYXQudG9JU09TdHJpbmcoKSxcbiAgICBjb25maWc6IHtcbiAgICAgIGFtcGxpdHVkZTogZGF0YS5jb25maWcuYW1wbGl0dWRlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc2Vzc2lvblJlcGxheUVuYWJsZWQ6IGRhdGEuY29uZmlnLmFtcGxpdHVkZS5zZXNzaW9uX3JlcGxheV9lbmFibGVkLFxuICAgICAgICAgICAgc2Vzc2lvblJlcGxheVNhbXBsZVJhdGU6IGRhdGEuY29uZmlnLmFtcGxpdHVkZS5zZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZSxcbiAgICAgICAgICAgIHRyYWNraW5nRW5hYmxlZDogZGF0YS5jb25maWcuYW1wbGl0dWRlLnRyYWNraW5nX2VuYWJsZWQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGN1c3RvbWVyU2VydmljZTogZGF0YS5jb25maWcuY3VzdG9tZXJfc2VydmljZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBkYXRhLmNvbmZpZy5jdXN0b21lcl9zZXJ2aWNlLnByb3ZpZGVyLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBnb29nbGVBbmFseXRpY3M6IGRhdGEuY29uZmlnLmdvb2dsZV9hbmFseXRpY3NcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiBkYXRhLmNvbmZpZy5nb29nbGVfYW5hbHl0aWNzLm1lYXN1cmVtZW50X2lkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdDb25maWdSZXN1bHRzJztcbmltcG9ydCB7IE9yZ0NvbmZpZyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL29yZ0NvbmZpZ1Jlc3VsdHMnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnYW5pemF0aW9uQ29uZmlnJztcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU9yZ0NvbmZpZ1Jlc3VsdHMgPSAoZGF0YTogdW5rbm93bik6IE9yZ0NvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNBcGlPcmdDb25maWdSZXN1bHRzKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29uZmlnczogZGF0YS5jb25maWdzXG4gICAgICAubWFwKChjb25maWcpID0+IHZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnKGNvbmZpZykpXG4gICAgICAuZmlsdGVyKChjb25maWcpOiBjb25maWcgaXMgT3JnYW5pemF0aW9uQ29uZmlnID0+IGNvbmZpZyAhPSBudWxsKSxcbiAgICBleHBlcmltZW50czogZGF0YS5leHBlcmltZW50cy5tYXAoKGV4cGVyaW1lbnQpID0+ICh7XG4gICAgICBncm91cDogZXhwZXJpbWVudC5ncm91cCxcbiAgICAgIGdyb3VwTmFtZTogZXhwZXJpbWVudC5ncm91cF9uYW1lLFxuICAgICAgbmFtZTogZXhwZXJpbWVudC5uYW1lLFxuICAgICAgcnVsZUlkOiBleHBlcmltZW50LnJ1bGVfaWQsXG4gICAgICAvLyBUT0RPIHRoaXMgbmVlZHMgdG8gYmUgc3Ryb25nbHkgdHlwZWQgYnV0IHdlJ3JlIG5vdCBydW5uaW5nIGFueSBleHBlcmltZW50cyBhdCB0aGUgbW9tZW50XG4gICAgICB2YWx1ZTogZXhwZXJpbWVudC52YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICB9KSksXG4gICAgZ2F0ZXM6IGRhdGEuZ2F0ZXMubWFwKChnYXRlKSA9PiAoe1xuICAgICAgZ3JvdXBOYW1lOiBnYXRlLmdyb3VwX25hbWUsXG4gICAgICBuYW1lOiBnYXRlLm5hbWUsXG4gICAgICBydWxlSWQ6IGdhdGUucnVsZV9pZCxcbiAgICAgIHZhbHVlOiBnYXRlLnZhbHVlLFxuICAgIH0pKSxcbiAgICBvcmc6IHtcbiAgICAgIG9yZzoge1xuICAgICAgICBpZDogZGF0YS5vcmcub3JnLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogZGF0YS5vcmcub3JnLmRpc3BsYXlfbmFtZSxcbiAgICAgICAgZG9tYWluOiBkYXRhLm9yZy5vcmcuZG9tYWluLFxuICAgICAgICBzaG9ydE5hbWU6IGRhdGEub3JnLm9yZy5zaG9ydF9uYW1lLFxuICAgICAgICBzdGF0dXM6IGRhdGEub3JnLm9yZy5zdGF0dXMsXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0YS5vcmcub3JnLmNyZWF0ZWRfYXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRBdDogZGF0YS5vcmcub3JnLnVwZGF0ZWRfYXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgc2V0dGluZ3M6IHt9LFxuICAgIH0sXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgUmVzcG9uc2VDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBSZXNwb25zZSwgUmV2aWV3UmljaEluZm9ybWF0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBBcGlSZXZpZXdSaWNoSW5mb3JtYXRpb24gfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9yZXNwb25zZUdlbmVyaWNzJztcbmltcG9ydCB7IGlzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaVJlc3BvbnNlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUmVzcG9uc2UnO1xuaW1wb3J0IHsgaXNBcGlSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpVGV4dFJlc3BvbnNlQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaVByb2R1Y3RTZWFyY2hSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQcm9kdWN0U2VhcmNoQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtUmVzcG9uc2UnO1xuaW1wb3J0IHsgaXNBcGlPcmRlclJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzJztcbmltcG9ydCB7IHN0cmluZ1RvRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzRW51bVZhbHVlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZSc7XG5pbXBvcnQgeyBpc0FwaVByb2R1Y3RTZWFyY2hGaWx0ZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyQXR0cmlidXRlcyc7XG5cbmNvbnN0IHJpY2hJbmZvcm1hdGlvbkZyb21Db21tZXJjZVJpY2hJbmZvcm1hdGlvbiA9IChcbiAgZGF0YTogQXBpUmV2aWV3UmljaEluZm9ybWF0aW9uLFxuKTogUmV2aWV3UmljaEluZm9ybWF0aW9uID0+ICh7XG4gIGNvbnM6IGRhdGEuY29ucyxcbiAgcHJvczogZGF0YS5wcm9zLFxuICByZXZpZXdEYXRlOiBkYXRhLnJldmlld19kYXRlLFxuICByZXZpZXdlclRpdGxlOiBkYXRhLnJldmlld2VyX3RpdGxlLFxuICBwcm9kdWN0RmFtaWxpYXJpdHk6IGRhdGEucHJvZHVjdF9mYW1pbGlhcml0eSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVSZXNwb25zZSA9IChkYXRhOiB1bmtub3duKTogUmVzcG9uc2UgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpUmVzcG9uc2UoZGF0YSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuVGV4dCAmJiBpc0FwaVRleHRSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuVGV4dCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY29udGVudDogZGF0YS5hdHRyaWJ1dGVzLmNvbnRlbnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0ICYmXG4gICAgaXNBcGlQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBpZDogZGF0YS5hdHRyaWJ1dGVzLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5hdHRyaWJ1dGVzLmRlc2NyaXB0aW9uLFxuICAgICAgICBpbWFnZVVybDogZGF0YS5hdHRyaWJ1dGVzLmltYWdlX3VybCxcbiAgICAgICAgaW1hZ2VVcmxzOiBkYXRhLmF0dHJpYnV0ZXMuaW1hZ2VfdXJscyxcbiAgICAgICAgdGl0bGU6IGRhdGEuYXR0cmlidXRlcy50aXRsZSxcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgICBvcmlnaW5hbFByaWNlOiBkYXRhLmF0dHJpYnV0ZXMub3JpZ2luYWxfcHJpY2UsXG4gICAgICAgIHNhbGVQcmljZTogZGF0YS5hdHRyaWJ1dGVzLnNhbGVfcHJpY2UsXG4gICAgICAgIGF2ZXJhZ2VSYXRpbmc6IGRhdGEuYXR0cmlidXRlcy5hdmVyYWdlX3JhdGluZyxcbiAgICAgICAgbnVtYmVyUmV2aWV3czogZGF0YS5hdHRyaWJ1dGVzLm51bWJlcl9yZXZpZXdzLFxuICAgICAgICBtZXRhZGF0YTogZGF0YS5hdHRyaWJ1dGVzLm1ldGFkYXRhLFxuICAgICAgICBpc0ZvckdyaWQ6IGRhdGEuYXR0cmlidXRlcy5pc19mb3JfZ3JpZCxcbiAgICAgICAgY29sb3JzOiBkYXRhLmF0dHJpYnV0ZXMuY29sb3JzLFxuICAgICAgICBzaXplczogZGF0YS5hdHRyaWJ1dGVzLnNpemVzLFxuICAgICAgICBmaWx0ZXJzOiBkYXRhLmF0dHJpYnV0ZXMuZmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlJldmlldyAmJiBpc0FwaVJldmlld1Jlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGlkOiBkYXRhLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgIHByb2R1Y3RJZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RfaWQsXG4gICAgICAgIHRpdGxlOiBkYXRhLmF0dHJpYnV0ZXMudGl0bGUsXG4gICAgICAgIHJldmlld2VyOiBkYXRhLmF0dHJpYnV0ZXMucmV2aWV3ZXIsXG4gICAgICAgIHJldmlldzogZGF0YS5hdHRyaWJ1dGVzLnJldmlldyxcbiAgICAgICAgc3RhcnM6IGRhdGEuYXR0cmlidXRlcy5zdGFycyxcbiAgICAgICAgcmljaEluZm9ybWF0aW9uOiBkYXRhLmF0dHJpYnV0ZXMucmljaF9pbmZvcm1hdGlvblxuICAgICAgICAgID8gcmljaEluZm9ybWF0aW9uRnJvbUNvbW1lcmNlUmljaEluZm9ybWF0aW9uKGRhdGEuYXR0cmlidXRlcy5yaWNoX2luZm9ybWF0aW9uKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuU2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5TZXBhcmF0b3IsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlBhZ2UgJiYgaXNBcGlQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LlBhZ2UsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGlkOiBkYXRhLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgIHRpdGxlOiBkYXRhLmF0dHJpYnV0ZXMudGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLmF0dHJpYnV0ZXMuZGVzY3JpcHRpb24sXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0gJiYgaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LkZvcm0sXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZvcm1DYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLmZvcm1fY2F0ZWdvcnlcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZm9ybVR5cGU6IGRhdGEuYXR0cmlidXRlcy5mb3JtX2NhdGVnb3J5LmZvcm1fdHlwZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgcHJvcGVydGllczogZGF0YS5hdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIHJlcXVpcmVkOiBkYXRhLmF0dHJpYnV0ZXMuc2NoZW1hLnJlcXVpcmVkLm1hcChTdHJpbmcpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaCAmJlxuICAgIGlzQXBpUHJvZHVjdFNlYXJjaFJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZ2VuZXJhdGVkUXVlcnk6IGRhdGEuYXR0cmlidXRlcy5nZW5lcmF0ZWRfcXVlcnksXG4gICAgICAgIHByb2R1Y3RDb3VudDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RfY291bnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoRmlsdGVyICYmXG4gICAgaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoRmlsdGVyLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBmaWx0ZXJOYW1lOiBkYXRhLmF0dHJpYnV0ZXMuZmlsdGVyX25hbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5PcmRlciAmJiBpc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5Lk9yZGVyLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBvcmRlcklkOiBkYXRhLmF0dHJpYnV0ZXMub3JkZXJfaWQsXG4gICAgICAgIG9yZGVyTnVtYmVyOiBkYXRhLmF0dHJpYnV0ZXMub3JkZXJfbnVtYmVyLFxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGEuYXR0cmlidXRlcy5jcmVhdGVkX2F0LFxuICAgICAgICBsYXRlc3RFdmVudERhdGU6IGRhdGEuYXR0cmlidXRlcy5sYXRlc3RfZXZlbnRfZGF0ZSxcbiAgICAgICAgbGluZUl0ZW1zOiBkYXRhLmF0dHJpYnV0ZXMubGluZV9pdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgaXRlbVRpdGxlOiBpdGVtLml0ZW1fdGl0bGUsXG4gICAgICAgICAgaXRlbVByaWNlOiBpdGVtLml0ZW1fcHJpY2UsXG4gICAgICAgICAgaXRlbVF1YW50aXR5OiBpdGVtLml0ZW1fcXVhbnRpdHksXG4gICAgICAgICAgb3JkZXJJdGVtSWQ6IGl0ZW0ub3JkZXJfaXRlbV9pZCxcbiAgICAgICAgICBpbWFnZTogaXRlbS5pbWFnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgaW5UcmFuc2l0QXQ6IGl0ZW0uaW5fdHJhbnNpdF9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZGVsaXZlcmVkQXQ6IGl0ZW0uZGVsaXZlcmVkX2F0ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBlc3RpbWF0ZWREZWxpdmVyeUF0OiBpdGVtLmVzdGltYXRlZF9kZWxpdmVyeV9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzOiBpdGVtLmZ1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzXG4gICAgICAgICAgICA/IHN0cmluZ1RvRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzRW51bVZhbHVlKGl0ZW0uZnVsZmlsbG1lbnRfZGlzcGxheV9zdGF0dXMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFja2luZ1VybDogaXRlbS50cmFja2luZ191cmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IGlzU3VnZ2VzdGlvbiB9IGZyb20gJy4uL2d1YXJkcy9hcGkvaXNBcGlTdWdnZXN0aW9uJztcbmltcG9ydCB7IFN1Z2dlc3Rpb24gfSBmcm9tICcuLi9hcGkvc3VnZ2VzdGlvbic7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN1Z2dlc3Rpb24gPSAoZGF0YTogdW5rbm93bik6IFN1Z2dlc3Rpb24gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzU3VnZ2VzdGlvbihkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkOiBkYXRhLmlkLFxuICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICBpc0Fuc3dlcjogZGF0YS5pc19hbnN3ZXIsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgaXNBcGlVc2VyRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlVc2VyRXZlbnQnO1xuaW1wb3J0IHsgVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBpc0FwaVBEUEF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQRFBFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlRdWVyeVR5cGVkQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVF1ZXJ5VHlwZWRFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlTZWFyY2hBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpU2VhcmNoRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpU3VnZ2VzdGlvbkNsaWNrZWRBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpU3VnZ2VzdGlvbkNsaWNrZWRFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHtcbiAgaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMsXG4gIGlzQXBpUExQSWRBdHRyaWJ1dGUsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBMUEV2ZW50QXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlckV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBVc2VyRXZlbnQgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpVXNlckV2ZW50KGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QZHBWaXNpdCAmJiBpc0FwaVBEUEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuUGRwVmlzaXQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHByb2R1Y3RJZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RfaWQsXG4gICAgICAgIHBhcmVudFByb2R1Y3RJZDogZGF0YS5hdHRyaWJ1dGVzLnBhcmVudF9wcm9kdWN0X2lkLFxuICAgICAgICB1cmw6IGRhdGEuYXR0cmlidXRlcy51cmwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCAmJlxuICAgIGlzQXBpUXVlcnlUeXBlZEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHF1ZXJ5OiBkYXRhLmF0dHJpYnV0ZXMucXVlcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoICYmIGlzQXBpU2VhcmNoQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaFRlcm06IGRhdGEuYXR0cmlidXRlcy5zZWFyY2hfdGVybSxcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXJzOiBkYXRhLmF0dHJpYnV0ZXMuc2VsZWN0ZWRfZmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCAmJlxuICAgIGlzQXBpU3VnZ2VzdGlvbkNsaWNrZWRBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc3VnZ2VzdGlvbklkOiBkYXRhLmF0dHJpYnV0ZXMuc3VnZ2VzdGlvbl9pZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCAmJiBpc0FwaVBMUEV2ZW50QXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgaWYgKGlzQXBpUExQSWRBdHRyaWJ1dGUoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIGNhdGVnb3J5OiBkYXRhLmF0dHJpYnV0ZXMuY2F0ZWdvcnksXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgaWQ6IGRhdGEuYXR0cmlidXRlcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCAmJlxuICAgIGlzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsbGVkU2NoZW1hOiB7IC4uLmRhdGEuYXR0cmlidXRlcy5maWxsZWRfc2NoZW1hIH0sXG4gICAgICAgIGZvcm1SZXNwb25zZUlkOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybV9yZXNwb25zZV9pZCxcbiAgICAgICAgZm9ybVR5cGU6IGRhdGEuYXR0cmlidXRlcy5mb3JtX3R5cGUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyB3ZSdyZSBub3QgdXNpbmcgYXBwX3VubG9hZGVkIGF0IHRoZSBtb21lbnQgc28gcmV0dXJuIHRoZSBhcHBfbG9hZGVkIGV2ZW50IGFzIGRlZmF1bHRcbiAgcmV0dXJuIHtcbiAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5BcHBMb2FkZWQsXG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQVksd0RBQUw7QUFDTDtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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