@nlabs/metropolisjs 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.github/copilot-instructions.md +167 -0
  2. package/AGENTS.md +13 -0
  3. package/CHANGELOG.md +112 -0
  4. package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
  5. package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
  6. package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
  7. package/README.md +1123 -112
  8. package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
  9. package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
  10. package/docs/ACTIONS.md +63 -0
  11. package/docs/COLLECTIONS.md +1038 -0
  12. package/docs/CONNECTIONS.md +1367 -0
  13. package/docs/CRUD_INTEGRATION.md +702 -0
  14. package/examples/connections-usage.tsx +909 -0
  15. package/examples/content-actions-usage.ts +144 -0
  16. package/examples/crud-usage.tsx +847 -0
  17. package/examples/extensibility-usage.tsx +889 -0
  18. package/examples/i18n-import-examples.ts +86 -0
  19. package/examples/i18n-namespace-usage.ts +118 -0
  20. package/examples/i18next-singleton-demo.ts +187 -0
  21. package/examples/permission-system-usage.tsx +415 -0
  22. package/examples/project-details.tsx +397 -0
  23. package/examples/shared-i18n-usage.tsx +203 -0
  24. package/examples/signup-error-handling.ts +100 -0
  25. package/examples/translation-types.ts +86 -0
  26. package/examples/translation-usage.tsx +336 -0
  27. package/index.js +1 -0
  28. package/jest.config.mjs +28 -0
  29. package/lex.config.mjs +11 -2
  30. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
  31. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
  32. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
  33. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
  34. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
  35. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
  36. package/lib/actions/appActions/appActions.d.ts +29 -0
  37. package/lib/actions/appActions/appActions.d.ts.map +1 -0
  38. package/lib/actions/appActions/appActions.js +159 -0
  39. package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
  40. package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
  41. package/lib/actions/connectionActions/connectionActions.js +131 -0
  42. package/lib/actions/contentActions/contentActions.d.ts +34 -0
  43. package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
  44. package/lib/actions/contentActions/contentActions.js +314 -0
  45. package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
  46. package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
  47. package/lib/actions/conversationActions/conversationActions.js +225 -0
  48. package/lib/actions/eventActions/eventActions.d.ts +27 -7
  49. package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
  50. package/lib/actions/eventActions/eventActions.js +436 -2
  51. package/lib/actions/groupActions/groupActions.d.ts +30 -0
  52. package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
  53. package/lib/actions/groupActions/groupActions.js +229 -0
  54. package/lib/actions/imageActions/imageActions.d.ts +16 -10
  55. package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
  56. package/lib/actions/imageActions/imageActions.js +593 -2
  57. package/lib/actions/index.d.ts +21 -9
  58. package/lib/actions/index.d.ts.map +1 -0
  59. package/lib/actions/index.js +22 -2
  60. package/lib/actions/locationActions/locationActions.d.ts +11 -9
  61. package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
  62. package/lib/actions/locationActions/locationActions.js +388 -2
  63. package/lib/actions/messageActions/messageActions.d.ts +16 -32
  64. package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
  65. package/lib/actions/messageActions/messageActions.js +235 -2
  66. package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
  67. package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
  68. package/lib/actions/permissionActions/permissionActions.js +330 -0
  69. package/lib/actions/personaActions/personaActions.d.ts +65 -0
  70. package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
  71. package/lib/actions/personaActions/personaActions.js +572 -0
  72. package/lib/actions/postActions/postActions.d.ts +12 -32
  73. package/lib/actions/postActions/postActions.d.ts.map +1 -0
  74. package/lib/actions/postActions/postActions.js +447 -2
  75. package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
  76. package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
  77. package/lib/actions/reactionActions/reactionActions.js +413 -2
  78. package/lib/actions/sseActions/sseActions.d.ts +1 -0
  79. package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
  80. package/lib/actions/sseActions/sseActions.js +148 -2
  81. package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
  82. package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
  83. package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
  84. package/lib/actions/tagActions/tagActions.d.ts +13 -31
  85. package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
  86. package/lib/actions/tagActions/tagActions.js +347 -2
  87. package/lib/actions/translationActions/translationActions.d.ts +38 -0
  88. package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
  89. package/lib/actions/translationActions/translationActions.js +189 -0
  90. package/lib/actions/userActions/userActions.d.ts +42 -95
  91. package/lib/actions/userActions/userActions.d.ts.map +1 -0
  92. package/lib/actions/userActions/userActions.js +844 -2
  93. package/lib/actions/videoActions/videoActions.d.ts +41 -0
  94. package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
  95. package/lib/actions/videoActions/videoActions.js +532 -0
  96. package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
  97. package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
  98. package/lib/actions/websocketActions/websocketActions.js +377 -2
  99. package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
  100. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
  101. package/lib/adapters/appAdapter/appAdapter.js +90 -0
  102. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
  103. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
  104. package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
  105. package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
  106. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
  107. package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
  108. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
  109. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
  110. package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
  111. package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
  112. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
  113. package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
  114. package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
  115. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
  116. package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
  117. package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
  118. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
  119. package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
  120. package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
  121. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
  122. package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
  123. package/lib/adapters/index.d.ts +34 -16
  124. package/lib/adapters/index.d.ts.map +1 -0
  125. package/lib/adapters/index.js +19 -2
  126. package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
  127. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
  128. package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
  129. package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
  130. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
  131. package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
  132. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
  133. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
  134. package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
  135. package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
  136. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
  137. package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
  138. package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
  139. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
  140. package/lib/adapters/postAdapter/postAdapter.js +115 -2
  141. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
  142. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
  143. package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
  144. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
  145. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
  146. package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
  147. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
  148. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
  149. package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
  150. package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
  151. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
  152. package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
  153. package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
  154. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
  155. package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
  156. package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
  157. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
  158. package/lib/adapters/userAdapter/userAdapter.js +302 -2
  159. package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
  160. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
  161. package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
  162. package/lib/config/index.d.ts +19 -6
  163. package/lib/config/index.d.ts.map +1 -0
  164. package/lib/config/index.js +97 -2
  165. package/lib/constants/Collections.d.ts +44 -0
  166. package/lib/constants/Collections.d.ts.map +1 -0
  167. package/lib/constants/Collections.js +40 -0
  168. package/lib/constants/MetropolisConstants.d.ts +1 -0
  169. package/lib/constants/MetropolisConstants.d.ts.map +1 -0
  170. package/lib/constants/MetropolisConstants.js +15 -2
  171. package/lib/graphql/message.d.ts +1 -0
  172. package/lib/graphql/message.d.ts.map +1 -0
  173. package/lib/graphql/message.js +6 -4
  174. package/lib/graphql/notification.d.ts +1 -0
  175. package/lib/graphql/notification.d.ts.map +1 -0
  176. package/lib/graphql/notification.js +6 -4
  177. package/lib/graphql/session.d.ts +1 -0
  178. package/lib/graphql/session.d.ts.map +1 -0
  179. package/lib/graphql/session.js +4 -3
  180. package/lib/index.d.ts +45 -22
  181. package/lib/index.d.ts.map +1 -0
  182. package/lib/index.js +248 -2
  183. package/lib/stores/appStore.d.ts +1 -0
  184. package/lib/stores/appStore.d.ts.map +1 -0
  185. package/lib/stores/appStore.js +23 -2
  186. package/lib/stores/contentStore.d.ts +36 -0
  187. package/lib/stores/contentStore.d.ts.map +1 -0
  188. package/lib/stores/contentStore.js +139 -0
  189. package/lib/stores/conversationStore.d.ts +38 -0
  190. package/lib/stores/conversationStore.d.ts.map +1 -0
  191. package/lib/stores/conversationStore.js +117 -0
  192. package/lib/stores/eventStore.d.ts +4 -1
  193. package/lib/stores/eventStore.d.ts.map +1 -0
  194. package/lib/stores/eventStore.js +47 -2
  195. package/lib/stores/groupStore.d.ts +37 -0
  196. package/lib/stores/groupStore.d.ts.map +1 -0
  197. package/lib/stores/groupStore.js +68 -0
  198. package/lib/stores/imageStore.d.ts +6 -1
  199. package/lib/stores/imageStore.d.ts.map +1 -0
  200. package/lib/stores/imageStore.js +53 -2
  201. package/lib/stores/index.d.ts +20 -11
  202. package/lib/stores/index.d.ts.map +1 -0
  203. package/lib/stores/index.js +24 -2
  204. package/lib/stores/locationStore.d.ts +2 -1
  205. package/lib/stores/locationStore.d.ts.map +1 -0
  206. package/lib/stores/locationStore.js +42 -2
  207. package/lib/stores/messageStore.d.ts +19 -4
  208. package/lib/stores/messageStore.d.ts.map +1 -0
  209. package/lib/stores/messageStore.js +137 -2
  210. package/lib/stores/notificationStore.d.ts +33 -0
  211. package/lib/stores/notificationStore.d.ts.map +1 -0
  212. package/lib/stores/notificationStore.js +55 -0
  213. package/lib/stores/permissionStore.d.ts +37 -0
  214. package/lib/stores/permissionStore.d.ts.map +1 -0
  215. package/lib/stores/permissionStore.js +117 -0
  216. package/lib/stores/personaStore.d.ts +26 -0
  217. package/lib/stores/personaStore.d.ts.map +1 -0
  218. package/lib/stores/personaStore.js +118 -0
  219. package/lib/stores/postStore.d.ts +2 -1
  220. package/lib/stores/postStore.d.ts.map +1 -0
  221. package/lib/stores/postStore.js +53 -2
  222. package/lib/stores/reactionStore.d.ts +1 -0
  223. package/lib/stores/reactionStore.d.ts.map +1 -0
  224. package/lib/stores/reactionStore.js +28 -2
  225. package/lib/stores/subscriptionStore.d.ts +41 -0
  226. package/lib/stores/subscriptionStore.d.ts.map +1 -0
  227. package/lib/stores/subscriptionStore.js +85 -0
  228. package/lib/stores/tagStore.d.ts +8 -5
  229. package/lib/stores/tagStore.d.ts.map +1 -0
  230. package/lib/stores/tagStore.js +87 -2
  231. package/lib/stores/translationStore.d.ts +42 -0
  232. package/lib/stores/translationStore.d.ts.map +1 -0
  233. package/lib/stores/translationStore.js +122 -0
  234. package/lib/stores/userStore.d.ts +5 -4
  235. package/lib/stores/userStore.d.ts.map +1 -0
  236. package/lib/stores/userStore.js +319 -2
  237. package/lib/stores/videoStore.d.ts +39 -0
  238. package/lib/stores/videoStore.d.ts.map +1 -0
  239. package/lib/stores/videoStore.js +132 -0
  240. package/lib/stores/websocketStore.d.ts +1 -0
  241. package/lib/stores/websocketStore.d.ts.map +1 -0
  242. package/lib/stores/websocketStore.js +51 -2
  243. package/lib/types/apps.types.d.ts +17 -0
  244. package/lib/types/apps.types.d.ts.map +1 -0
  245. package/lib/types/apps.types.js +6 -0
  246. package/lib/types/common.types.d.ts +31 -0
  247. package/lib/types/common.types.d.ts.map +1 -0
  248. package/lib/types/common.types.js +6 -0
  249. package/lib/types/conversations.types.d.ts +17 -0
  250. package/lib/types/conversations.types.d.ts.map +1 -0
  251. package/lib/types/conversations.types.js +6 -0
  252. package/lib/types/edges.types.d.ts +38 -0
  253. package/lib/types/edges.types.d.ts.map +1 -0
  254. package/lib/types/edges.types.js +6 -0
  255. package/lib/types/groups.types.d.ts +19 -0
  256. package/lib/types/groups.types.d.ts.map +1 -0
  257. package/lib/types/groups.types.js +6 -0
  258. package/lib/types/index.d.ts +12 -0
  259. package/lib/types/index.d.ts.map +1 -0
  260. package/lib/types/index.js +12 -0
  261. package/lib/types/subscriptions.types.d.ts +32 -0
  262. package/lib/types/subscriptions.types.d.ts.map +1 -0
  263. package/lib/types/subscriptions.types.js +6 -0
  264. package/lib/types/videos.types.d.ts +61 -0
  265. package/lib/types/videos.types.d.ts.map +1 -0
  266. package/lib/types/videos.types.js +6 -0
  267. package/lib/utils/MetropolisProvider.d.ts +39 -15
  268. package/lib/utils/MetropolisProvider.d.ts.map +1 -0
  269. package/lib/utils/MetropolisProvider.js +31 -2
  270. package/lib/utils/actionFactory.d.ts +21 -19
  271. package/lib/utils/actionFactory.d.ts.map +1 -0
  272. package/lib/utils/actionFactory.js +95 -2
  273. package/lib/utils/api.d.ts +5 -4
  274. package/lib/utils/api.d.ts.map +1 -0
  275. package/lib/utils/api.js +252 -6
  276. package/lib/utils/app.d.ts +1 -0
  277. package/lib/utils/app.d.ts.map +1 -0
  278. package/lib/utils/app.js +15 -2
  279. package/lib/utils/baseActionFactory.d.ts +5 -23
  280. package/lib/utils/baseActionFactory.d.ts.map +1 -0
  281. package/lib/utils/baseActionFactory.js +72 -2
  282. package/lib/utils/configUtils.d.ts +11 -0
  283. package/lib/utils/configUtils.d.ts.map +1 -0
  284. package/lib/utils/configUtils.js +20 -0
  285. package/lib/utils/dateUtils.d.ts +1 -0
  286. package/lib/utils/dateUtils.d.ts.map +1 -0
  287. package/lib/utils/dateUtils.js +11 -2
  288. package/lib/utils/file.d.ts +3 -1
  289. package/lib/utils/file.d.ts.map +1 -0
  290. package/lib/utils/file.js +156 -2
  291. package/lib/utils/i18n.d.ts +7 -0
  292. package/lib/utils/i18n.d.ts.map +1 -0
  293. package/lib/utils/i18n.js +96 -0
  294. package/lib/utils/index.d.ts +20 -0
  295. package/lib/utils/index.d.ts.map +1 -0
  296. package/lib/utils/index.js +26 -0
  297. package/lib/utils/location.d.ts +4 -3
  298. package/lib/utils/location.d.ts.map +1 -0
  299. package/lib/utils/location.js +82 -2
  300. package/lib/utils/permissionUtils.d.ts +22 -0
  301. package/lib/utils/permissionUtils.d.ts.map +1 -0
  302. package/lib/utils/permissionUtils.js +72 -0
  303. package/lib/utils/requestCache.d.ts +8 -0
  304. package/lib/utils/requestCache.d.ts.map +1 -0
  305. package/lib/utils/requestCache.js +53 -0
  306. package/lib/utils/session.d.ts +14 -0
  307. package/lib/utils/session.d.ts.map +1 -0
  308. package/lib/utils/session.js +107 -0
  309. package/lib/utils/useConversationTyping.d.ts +26 -0
  310. package/lib/utils/useConversationTyping.d.ts.map +1 -0
  311. package/lib/utils/useConversationTyping.js +117 -0
  312. package/lib/utils/useMetropolis.d.ts +67 -12
  313. package/lib/utils/useMetropolis.d.ts.map +1 -0
  314. package/lib/utils/useMetropolis.js +311 -2
  315. package/lib/utils/useTranslations.d.ts +16 -0
  316. package/lib/utils/useTranslations.d.ts.map +1 -0
  317. package/lib/utils/useTranslations.js +105 -0
  318. package/lib/utils/validatorFactory.d.ts +3 -2
  319. package/lib/utils/validatorFactory.d.ts.map +1 -0
  320. package/lib/utils/validatorFactory.js +95 -2
  321. package/package.json +58 -17
  322. package/temp_signin.ts +73 -0
  323. package/lib/actions/profileActions/profileActions.d.ts +0 -50
  324. package/lib/actions/profileActions/profileActions.js +0 -2
  325. package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
  326. package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
  327. package/lib/stores/profileStore.d.ts +0 -24
  328. package/lib/stores/profileStore.js +0 -2
  329. /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
@@ -1,2 +1,844 @@
1
- import{DateTime as y}from"luxon";import{validatePersonaInput as A}from"../../adapters/personaAdapter/personaAdapter";import{validateUserInput as b}from"../../adapters/userAdapter/userAdapter";import{USER_CONSTANTS as d}from"../../stores/userStore";import{appMutation as P,publicMutation as l,refreshSession as S}from"../../utils/api";import{createBaseActions as g}from"../../utils/baseActionFactory";const m="users",f=(r,p)=>{const i=b(r);if(p?.strict&&!i.username)throw new Error("Username is required in strict mode");return i},I=(r,p)=>A(r),Q=(r,p)=>{const i=g(r,f,{adapter:p?.userAdapter,adapterOptions:p?.userAdapterOptions}),c=g(r,I,{adapter:p?.personaAdapter,adapterOptions:p?.personaAdapterOptions});return{add:async(e,s=[])=>{const t={user:{type:"UserInput",value:i.validator(e)}},n=o=>{const{users:{add:u={}}}=o;return r.dispatch({user:u,type:d.ADD_ITEM_SUCCESS})},{users:{add:a={}}}=await l(r,"add",m,t,s||["added","address","dob","city","country","gender","imageUrl","latitude","longitude","mailingList","modified","state","tags {id, name, tagId}","thumbUrl","userAccess","userId","username"],{onSuccess:n});return r.dispatch({user:a,type:d.ADD_ITEM_SUCCESS}),a},confirmCode:async(e,s)=>!0,remove:async e=>({}),session:async(e=[])=>({}),itemById:async(e,s=[])=>({}),listByLatest:async(e="",s=0,t=10,n=[])=>[],listByConnection:async(e,s=0,t=10,n=[])=>[],listByReactions:async(e,s,t=0,n=10,a=[])=>[],listByTags:async(e,s,t=0,n=10,a=[])=>[],isLoggedIn:()=>{const e=r.getState("user.session.expires");if(!e)return!1;const s=y.fromMillis(e);return Math.round(s.diff(y.local(),"minutes").toObject().minutes)>0},refreshSession:async(e,s=15)=>(await S(r,e,s))?.refreshSession||{},signIn:async(e,s,t=15)=>{const n={expires:{type:"Int",value:t},password:{type:"String!",value:s},username:{type:"String!",value:e}},a=(o={})=>{const U=o?.users?.signIn||{};return r.dispatch({session:U,type:d.SIGN_IN_SUCCESS})};try{return await l(r,"signIn",m,n,["expires","issued","token","userId","username"],{onSuccess:a}),r.getState("user.session")||{}}catch(o){throw r.dispatch({error:o,type:d.SIGN_IN_ERROR}),o}},signOut:async()=>!0,confirmSignUp:async(e,s)=>!0,forgotPassword:async e=>!0,resetPassword:async(e,s,t,n)=>!0,updatePassword:async(e,s)=>!0,updateUser:async(e,s=[])=>{const t={user:{type:"UserUpdateInput!",value:i.validator(e)}},n=(o={})=>{const{users:{update:u={}}}=o;return r.dispatch({user:u,type:d.UPDATE_ITEM_SUCCESS})},{user:a}=await P(r,"update",m,t,["added","address","birthdate","city","country","gender","imageCount","imageUrl","latitude","longitude","mailingList","modified","state","tags {id, name, tagId}","thumbUrl","userAccess","userId","username",...s],{onSuccess:n});return a},updatePersona:async e=>{const s={persona:{type:"PersonaUpdateInput!",value:c.validator(e)}},t=(a={})=>{const{users:{updatePersona:o={}}}=a;return r.dispatch({persona:o,type:d.UPDATE_PERSONA_SUCCESS})},{persona:n}=await P(r,"updatePersona",m,s,[],{onSuccess:t});return n},signUp:async(e,s=[])=>{const t={user:{type:"UserInput!",value:i.validator(e)}},n=o=>{const{users:{signUp:u={}}}=o;return r.dispatch({user:u,type:d.SIGN_UP_SUCCESS})},{users:{signUp:a={}}}=await l(r,"signUp",m,t,["added","city","country","dob","firstName","gender","imageCount","imageUrl","latitude","lastName","longitude","mailingList","modified","name","state","tags {id, name, tagId}","thumbUrl","userAccess","userId","username",...s],{onSuccess:n});return a},updateUserAdapter:i.updateAdapter,updatePersonaAdapter:c.updateAdapter,updateUserAdapterOptions:i.updateOptions,updatePersonaAdapterOptions:c.updateOptions}};export{Q as createUserActions};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FjdGlvbnMvdXNlckFjdGlvbnMvdXNlckFjdGlvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5cbmltcG9ydCB7dmFsaWRhdGVQZXJzb25hSW5wdXR9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL3BlcnNvbmFBZGFwdGVyL3BlcnNvbmFBZGFwdGVyJztcbmltcG9ydCB7dmFsaWRhdGVVc2VySW5wdXR9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL3VzZXJBZGFwdGVyL3VzZXJBZGFwdGVyJztcbmltcG9ydCB7VVNFUl9DT05TVEFOVFN9IGZyb20gJy4uLy4uL3N0b3Jlcy91c2VyU3RvcmUnO1xuaW1wb3J0IHthcHBNdXRhdGlvbiwgcHVibGljTXV0YXRpb24sIHJlZnJlc2hTZXNzaW9ufSBmcm9tICcuLi8uLi91dGlscy9hcGknO1xuaW1wb3J0IHtjcmVhdGVCYXNlQWN0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGlvbkZhY3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEFjdGlvbiwgRmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtQZXJzb25hVHlwZX0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvcGVyc29uYUFkYXB0ZXIvcGVyc29uYUFkYXB0ZXInO1xuaW1wb3J0IHR5cGUge1VzZXJ9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL3VzZXJBZGFwdGVyL3VzZXJBZGFwdGVyJztcbmltcG9ydCB0eXBlIHtBcGlSZXN1bHRzVHlwZSwgUmVha3RvckRiQ29sbGVjdGlvbiwgU2Vzc2lvblR5cGV9IGZyb20gJy4uLy4uL3V0aWxzL2FwaSc7XG5pbXBvcnQgdHlwZSB7QmFzZUFkYXB0ZXJPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JGYWN0b3J5JztcblxuY29uc3QgREFUQV9UWVBFOiBSZWFrdG9yRGJDb2xsZWN0aW9uID0gJ3VzZXJzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWRhcHRlck9wdGlvbnMgZXh0ZW5kcyBCYXNlQWRhcHRlck9wdGlvbnMge1xuICAvLyBVc2VyLXNwZWNpZmljIG9wdGlvbnMgY2FuIGJlIGFkZGVkIGhlcmVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzb25hQWRhcHRlck9wdGlvbnMgZXh0ZW5kcyBCYXNlQWRhcHRlck9wdGlvbnMge1xuICAvLyBQZXJzb25hLXNwZWNpZmljIG9wdGlvbnMgY2FuIGJlIGFkZGVkIGhlcmVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSB1c2VyQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSBwZXJzb25hQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFBlcnNvbmFBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSB1c2VyQWRhcHRlck9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnM7XG4gIHJlYWRvbmx5IHBlcnNvbmFBZGFwdGVyT3B0aW9ucz86IFBlcnNvbmFBZGFwdGVyT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQXBpUmVzdWx0c1R5cGUge1xuICByZWFkb25seSB1c2Vyczoge1xuICAgIHJlYWRvbmx5IGFjdGl2ZUNvdW50PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGFkZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgY29uZmlybUNvZGU/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGRlYWN0aXZhdGU/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGZvcmdvdFBhc3N3b3JkPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBpdGVtQnlJZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VG9rZW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGl0ZW1CeVVzZXJuYW1lPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBsaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeUNvbm5lY3Rpb24/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5TGF0ZXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9ucz86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlUYWdzPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHJlZnJlc2hTZXNzaW9uPzogU2Vzc2lvblR5cGU7XG4gICAgcmVhZG9ubHkgcmVtb3ZlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSByZXNldFBhc3N3b3JkPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzaWduSW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25VcD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSB1cGRhdGVQYXNzd29yZD86IFBhcnRpYWw8Ym9vbGVhbj47XG4gICAgcmVhZG9ubHkgdXBkYXRlUGVyc29uYT86IFBhcnRpYWw8UGVyc29uYVR5cGU+O1xuICB9O1xufVxuXG4vLyBEZWZhdWx0IHZhbGlkYXRpb24gZnVuY3Rpb25zXG5jb25zdCBkZWZhdWx0VXNlclZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVVzZXJJbnB1dChpbnB1dCk7XG5cbiAgaWYob3B0aW9ucz8uc3RyaWN0ICYmICF2YWxpZGF0ZWQudXNlcm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lIGlzIHJlcXVpcmVkIGluIHN0cmljdCBtb2RlJyk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuY29uc3QgZGVmYXVsdFBlcnNvbmFWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBQZXJzb25hQWRhcHRlck9wdGlvbnMpID0+IHZhbGlkYXRlUGVyc29uYUlucHV0KGlucHV0KTtcblxuZXhwb3J0IGludGVyZmFjZSB1c2VyQWN0aW9ucyB7XG4gIGFkZDogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcj47XG4gIGNvbmZpcm1Db2RlOiAodHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIGNvZGU6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgcmVtb3ZlOiAodXNlcklkOiBzdHJpbmcpID0+IFByb21pc2U8VXNlcj47XG4gIHNlc3Npb246ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxVc2VyPjtcbiAgaXRlbUJ5SWQ6ICh1c2VySWQ6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3RCeUxhdGVzdDogKHVzZXJuYW1lPzogc3RyaW5nLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5Q29ubmVjdGlvbjogKHVzZXJJZDogc3RyaW5nLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5UmVhY3Rpb25zOiAodXNlcm5hbWU6IHN0cmluZywgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBwcm9maWxlUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlUYWdzOiAodXNlcm5hbWU6IHN0cmluZywgdGFnTmFtZXM6IHN0cmluZ1tdLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgcHJvZmlsZVByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcltdPjtcbiAgaXNMb2dnZWRJbjogKCkgPT4gYm9vbGVhbjtcbiAgcmVmcmVzaFNlc3Npb246ICh0b2tlbj86IHN0cmluZywgZXhwaXJlcz86IG51bWJlcikgPT4gUHJvbWlzZTxTZXNzaW9uVHlwZT47XG4gIHNpZ25JbjogKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGV4cGlyZXM/OiBudW1iZXIpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICBzaWduT3V0OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBjb25maXJtU2lnblVwOiAoY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgZm9yZ290UGFzc3dvcmQ6ICh1c2VybmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICByZXNldFBhc3N3b3JkOiAodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgdXBkYXRlUGFzc3dvcmQ6IChwYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICB1cGRhdGVVc2VyOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxVc2VyPjtcbiAgdXBkYXRlUGVyc29uYTogKHBlcnNvbmFJbnB1dDogUGFydGlhbDxQZXJzb25hVHlwZT4pID0+IFByb21pc2U8UGVyc29uYVR5cGU+O1xuICBzaWduVXA6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVVc2VyQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVQZXJzb25hQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFBlcnNvbmFBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IChvcHRpb25zOiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG4gIHVwZGF0ZVBlcnNvbmFBZGFwdGVyT3B0aW9uczogKG9wdGlvbnM6IFBlcnNvbmFBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSB1c2VyQWN0aW9ucyB3aXRoIGVuaGFuY2VkIGFkYXB0ZXIgaW5qZWN0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEN1c3RvbSBhZGFwdGVycyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBiZWhhdmlvciwgYWxsb3dpbmcgcGFydGlhbCBvdmVycmlkZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCBhZGFwdGVyc1xuICogY29uc3QgdXNlckFjdGlvbnMgPSBjcmVhdGVVc2VyQWN0aW9ucyhmbHV4KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3VzdG9tIGFkYXB0ZXIgdGhhdCBleHRlbmRzIGRlZmF1bHQgYmVoYXZpb3JcbiAqIGNvbnN0IGN1c3RvbVVzZXJBZGFwdGVyID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zKSA9PiB7XG4gKiAgIC8vIGlucHV0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGJ5IGRlZmF1bHQgYWRhcHRlclxuICogICBpZiAoaW5wdXQuZW1haWwgJiYgIWlucHV0LmVtYWlsLmluY2x1ZGVzKCdAY29tcGFueS5jb20nKSkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignT25seSBjb21wYW55IGVtYWlscyBhbGxvd2VkJyk7XG4gKiAgIH1cbiAqICAgcmV0dXJuIGlucHV0O1xuICogfTtcbiAqXG4gKiBjb25zdCB1c2VyQWN0aW9ucyA9IGNyZWF0ZVVzZXJBY3Rpb25zKGZsdXgsIHtcbiAqICAgdXNlckFkYXB0ZXI6IGN1c3RvbVVzZXJBZGFwdGVyXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29uZmlndXJhdGlvbi1iYXNlZCBhZGFwdGVyc1xuICogY29uc3QgdXNlckFjdGlvbnMgPSBjcmVhdGVVc2VyQWN0aW9ucyhmbHV4LCB7XG4gKiAgIHVzZXJBZGFwdGVyT3B0aW9uczoge1xuICogICAgIHN0cmljdDogdHJ1ZSxcbiAqICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSdW50aW1lIGFkYXB0ZXIgdXBkYXRlc1xuICogdXNlckFjdGlvbnMudXBkYXRlVXNlckFkYXB0ZXIoY3VzdG9tVXNlckFkYXB0ZXIpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb21wbGV4IGFkYXB0ZXIgd2l0aCBidXNpbmVzcyBsb2dpY1xuICogY29uc3QgYnVzaW5lc3NVc2VyQWRhcHRlciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4ge1xuICogICAvLyBpbnB1dCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSBkZWZhdWx0IGFkYXB0ZXJcbiAqICAgY29uc3QgdXNlciA9IGlucHV0IGFzIGFueTtcbiAqXG4gKiAgIC8vIEFkZCBidXNpbmVzcy1zcGVjaWZpYyB2YWxpZGF0aW9uXG4gKiAgIGlmICh1c2VyLnVzZXJBY2Nlc3MgPiA1KSB7XG4gKiAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIGFjY2VzcyBsZXZlbCB0b28gaGlnaCcpO1xuICogICB9XG4gKlxuICogICAvLyBBZGQgY29tcHV0ZWQgZmllbGRzXG4gKiAgIHJldHVybiB7XG4gKiAgICAgLi4udXNlcixcbiAqICAgICBmdWxsTmFtZTogYCR7dXNlci5maXJzdCB8fCAnJ30gJHt1c2VyLmxhc3QgfHwgJyd9YC50cmltKCksXG4gKiAgICAgaXNBZG1pbjogdXNlci51c2VyQWNjZXNzID49IDNcbiAqICAgfTtcbiAqIH07XG4gKlxuICogY29uc3QgdXNlckFjdGlvbnMgPSBjcmVhdGVVc2VyQWN0aW9ucyhmbHV4LCB7XG4gKiAgIHVzZXJBZGFwdGVyOiBidXNpbmVzc1VzZXJBZGFwdGVyLFxuICogICB1c2VyQWRhcHRlck9wdGlvbnM6IHtcbiAqICAgICBzdHJpY3Q6IHRydWUsXG4gKiAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJ1xuICogICB9XG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJBY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogVXNlckFjdGlvbnNPcHRpb25zXG4pOiB1c2VyQWN0aW9ucyA9PiB7XG4gIC8vIENyZWF0ZSBiYXNlIGFjdGlvbnMgZm9yIHVzZXIgdmFsaWRhdGlvblxuICBjb25zdCB1c2VyQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRVc2VyVmFsaWRhdG9yLCB7XG4gICAgYWRhcHRlcjogb3B0aW9ucz8udXNlckFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LnVzZXJBZGFwdGVyT3B0aW9uc1xuICB9KTtcblxuICAvLyBDcmVhdGUgYmFzZSBhY3Rpb25zIGZvciBwZXJzb25hIHZhbGlkYXRpb25cbiAgY29uc3QgcGVyc29uYUJhc2UgPSBjcmVhdGVCYXNlQWN0aW9ucyhmbHV4LCBkZWZhdWx0UGVyc29uYVZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LnBlcnNvbmFBZGFwdGVyLFxuICAgIGFkYXB0ZXJPcHRpb25zOiBvcHRpb25zPy5wZXJzb25hQWRhcHRlck9wdGlvbnNcbiAgfSk7XG5cbiAgLy8gQWN0aW9uIGltcGxlbWVudGF0aW9ucyB1c2luZyB0aGUgYmFzZSB1dGlsaXRpZXNcbiAgY29uc3QgYWRkID0gYXN5bmMgKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQnLFxuICAgICAgICB2YWx1ZTogdXNlckJhc2UudmFsaWRhdG9yKHVzZXJJbnB1dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3Qge3VzZXJzOiB7YWRkID0ge319fSA9IGRhdGE7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHVzZXI6IGFkZCxcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTU1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHt1c2Vyczoge2FkZDogdXNlciA9IHt9fX0gPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdhZGQnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICB1c2VyUHJvcHMgfHwgW1xuICAgICAgICAnYWRkZWQnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICAgICdkb2InLFxuICAgICAgICAnY2l0eScsXG4gICAgICAgICdjb3VudHJ5JyxcbiAgICAgICAgJ2dlbmRlcicsXG4gICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICdsYXRpdHVkZScsXG4gICAgICAgICdsb25naXR1ZGUnLFxuICAgICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAndGFncyB7aWQsIG5hbWUsIHRhZ0lkfScsXG4gICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICd1c2VybmFtZSdcbiAgICAgIF0sXG4gICAgICB7b25TdWNjZXNzfVxuICAgICk7XG5cbiAgICBmbHV4LmRpc3BhdGNoKHt1c2VyLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTfSk7XG4gICAgcmV0dXJuIHVzZXIgYXMgVXNlcjtcbiAgfTtcblxuICBjb25zdCBzaWduVXAgPSBhc3luYyAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogdXNlckJhc2UudmFsaWRhdG9yKHVzZXJJbnB1dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3Qge3VzZXJzOiB7c2lnblVwID0ge319fSA9IGRhdGE7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHVzZXI6IHNpZ25VcCxcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9TVUNDRVNTXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qge3VzZXJzOiB7c2lnblVwOiB1c2VyID0ge319fSA9IGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICBmbHV4LFxuICAgICAgJ3NpZ25VcCcsXG4gICAgICBEQVRBX1RZUEUsXG4gICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgIFtcbiAgICAgICAgJ2FkZGVkJyxcbiAgICAgICAgJ2NpdHknLFxuICAgICAgICAnY291bnRyeScsXG4gICAgICAgICdkb2InLFxuICAgICAgICAnZmlyc3ROYW1lJyxcbiAgICAgICAgJ2dlbmRlcicsXG4gICAgICAgICdpbWFnZUNvdW50JyxcbiAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICAgJ2xvbmdpdHVkZScsXG4gICAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAgICdtb2RpZmllZCcsXG4gICAgICAgICduYW1lJyxcbiAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgJ3RhZ3Mge2lkLCBuYW1lLCB0YWdJZH0nLFxuICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAndXNlckFjY2VzcycsXG4gICAgICAgICd1c2VySWQnLFxuICAgICAgICAndXNlcm5hbWUnLFxuICAgICAgICAuLi51c2VyUHJvcHNcbiAgICAgIF0sXG4gICAgICB7b25TdWNjZXNzfVxuICAgICk7XG4gICAgcmV0dXJuIHVzZXIgYXMgVXNlcjtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VyVXBkYXRlSW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJCYXNlLnZhbGlkYXRvcih1c2VySW5wdXQpXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7dXNlcnM6IHt1cGRhdGUgPSB7fX19ID0gZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdXNlcjogdXBkYXRlLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qge3VzZXJ9ID0gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICBmbHV4LFxuICAgICAgJ3VwZGF0ZScsXG4gICAgICBEQVRBX1RZUEUsXG4gICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgIFtcbiAgICAgICAgJ2FkZGVkJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICAnYmlydGhkYXRlJyxcbiAgICAgICAgJ2NpdHknLFxuICAgICAgICAnY291bnRyeScsXG4gICAgICAgICdnZW5kZXInLFxuICAgICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICdsYXRpdHVkZScsXG4gICAgICAgICdsb25naXR1ZGUnLFxuICAgICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAndGFncyB7aWQsIG5hbWUsIHRhZ0lkfScsXG4gICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICd1c2VybmFtZScsXG4gICAgICAgIC4uLnVzZXJQcm9wc1xuICAgICAgXSxcbiAgICAgIHtvblN1Y2Nlc3N9XG4gICAgKTtcbiAgICByZXR1cm4gdXNlciBhcyBVc2VyO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVBlcnNvbmEgPSBhc3luYyAocGVyc29uYUlucHV0OiBQYXJ0aWFsPFBlcnNvbmFUeXBlPik6IFByb21pc2U8UGVyc29uYVR5cGU+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHBlcnNvbmE6IHtcbiAgICAgICAgdHlwZTogJ1BlcnNvbmFVcGRhdGVJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogcGVyc29uYUJhc2UudmFsaWRhdG9yKHBlcnNvbmFJbnB1dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHt1c2Vyczoge3VwZGF0ZVBlcnNvbmEgPSB7fX19ID0gZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtwZXJzb25hOiB1cGRhdGVQZXJzb25hLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfUEVSU09OQV9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHtwZXJzb25hfSA9IGF3YWl0IGFwcE11dGF0aW9uKGZsdXgsICd1cGRhdGVQZXJzb25hJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgW10sIHtvblN1Y2Nlc3N9KTtcbiAgICByZXR1cm4gcGVyc29uYSBhcyBQZXJzb25hVHlwZTtcbiAgfTtcblxuICAvLyBQbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbnMgZm9yIG90aGVyIG1ldGhvZHMgKHlvdSBjYW4gYWRkIHRoZSBmdWxsIGltcGxlbWVudGF0aW9ucylcbiAgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAodHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIGNvZGU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgdHJ1ZVxuICA7XG5cbiAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAoe30gYXMgVXNlcilcbiAgO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhc3luYyAodXNlclByb3BzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTxVc2VyPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAoe30gYXMgVXNlcilcbiAgO1xuXG4gIGNvbnN0IGl0ZW1CeUlkID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10pOiBQcm9taXNlPFVzZXI+ID0+XG4gICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICh7fSBhcyBVc2VyKVxuICA7XG5cbiAgY29uc3QgbGlzdEJ5TGF0ZXN0ID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW11cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIFtdXG4gIDtcblxuICBjb25zdCBsaXN0QnlDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHJlYWN0aW9uTmFtZXM6IHN0cmluZ1tdLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHByb2ZpbGVQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcHJvZmlsZVByb3BzOiBzdHJpbmdbXSA9IFtdXG4gICk6IFByb21pc2U8VXNlcltdPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICBbXVxuICA7XG5cbiAgY29uc3QgaXNMb2dnZWRJbiA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBleHBpcmVzOiBudW1iZXIgPSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24uZXhwaXJlcycpIGFzIG51bWJlcjtcblxuICAgIGlmKCFleHBpcmVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwaXJlRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZXhwaXJlcyk7XG4gICAgY29uc3QgZXhwaXJlZERpZmY6IG51bWJlciA9IE1hdGgucm91bmQoZXhwaXJlRGF0ZS5kaWZmKERhdGVUaW1lLmxvY2FsKCksICdtaW51dGVzJykudG9PYmplY3QoKS5taW51dGVzKTtcblxuICAgIHJldHVybiBleHBpcmVkRGlmZiA+IDA7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaFNlc3Npb25BY3Rpb24gPSBhc3luYyAodG9rZW4/OiBzdHJpbmcsIGV4cGlyZXM6IG51bWJlciA9IDE1KTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZnJlc2hTZXNzaW9uKGZsdXgsIHRva2VuLCBleHBpcmVzKTtcbiAgICByZXR1cm4gKHJlc3VsdD8ucmVmcmVzaFNlc3Npb24gfHwge30pIGFzIFNlc3Npb25UeXBlO1xuICB9O1xuXG4gIGNvbnN0IHNpZ25JbiA9IGFzeW5jICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBleHBpcmVzOiBudW1iZXIgPSAxNSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGV4cGlyZXM6IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiBleHBpcmVzXG4gICAgICB9LFxuICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogcGFzc3dvcmRcbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiB1c2VybmFtZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgLy8gUm9idXN0bHkgZXh0cmFjdCB1c2VycyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgdXNlcnMgPSAoZGF0YSBhcyBhbnkpPy51c2VycztcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gdXNlcnM/LnNpZ25JbiB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbkRhdGEsXG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fU1VDQ0VTU1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBwdWJsaWNNdXRhdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2Ygb25TdWNjZXNzIGNhbGxiYWNrLCB3aGljaCBpcyBhIEZsdXhBY3Rpb25cbiAgICAgIGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdzaWduSW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2V4cGlyZXMnLCAnaXNzdWVkJywgJ3Rva2VuJywgJ3VzZXJJZCcsICd1c2VybmFtZSddLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzZXNzaW9uIGRhdGEgZnJvbSB0aGUgZmx1eCBzdGF0ZSBzaW5jZSBvblN1Y2Nlc3MgYWxyZWFkeSBwcm9jZXNzZWQgaXRcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJykgfHwge307XG4gICAgICByZXR1cm4gc2Vzc2lvbkRhdGEgYXMgU2Vzc2lvblR5cGU7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzaWduT3V0ID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgdHJ1ZVxuICA7XG5cbiAgY29uc3QgY29uZmlybVNpZ25VcCA9IGFzeW5jIChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICBjb25zdCBmb3Jnb3RQYXNzd29yZCA9IGFzeW5jICh1c2VybmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICBjb25zdCByZXNldFBhc3N3b3JkID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZSdcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IGFzeW5jIChwYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICAvLyBSZXR1cm4gdGhlIGFjdGlvbnMgb2JqZWN0IHdpdGggdXBkYXRlIGZ1bmN0aW9ucyBmcm9tIGJhc2UgYWN0aW9uc1xuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBjb25maXJtQ29kZSxcbiAgICByZW1vdmUsXG4gICAgc2Vzc2lvbixcbiAgICBpdGVtQnlJZCxcbiAgICBsaXN0QnlMYXRlc3QsXG4gICAgbGlzdEJ5Q29ubmVjdGlvbixcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgbGlzdEJ5VGFncyxcbiAgICBpc0xvZ2dlZEluLFxuICAgIHJlZnJlc2hTZXNzaW9uOiByZWZyZXNoU2Vzc2lvbkFjdGlvbixcbiAgICBzaWduSW4sXG4gICAgc2lnbk91dCxcbiAgICBjb25maXJtU2lnblVwLFxuICAgIGZvcmdvdFBhc3N3b3JkLFxuICAgIHJlc2V0UGFzc3dvcmQsXG4gICAgdXBkYXRlUGFzc3dvcmQsXG4gICAgdXBkYXRlVXNlcixcbiAgICB1cGRhdGVQZXJzb25hLFxuICAgIHNpZ25VcCxcbiAgICB1cGRhdGVVc2VyQWRhcHRlcjogdXNlckJhc2UudXBkYXRlQWRhcHRlcixcbiAgICB1cGRhdGVQZXJzb25hQWRhcHRlcjogcGVyc29uYUJhc2UudXBkYXRlQWRhcHRlcixcbiAgICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IHVzZXJCYXNlLnVwZGF0ZU9wdGlvbnMsXG4gICAgdXBkYXRlUGVyc29uYUFkYXB0ZXJPcHRpb25zOiBwZXJzb25hQmFzZS51cGRhdGVPcHRpb25zXG4gIH07XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBUSxZQUFBQSxNQUFlLFFBRXZCLE9BQVEsd0JBQUFDLE1BQTJCLCtDQUNuQyxPQUFRLHFCQUFBQyxNQUF3Qix5Q0FDaEMsT0FBUSxrQkFBQUMsTUFBcUIseUJBQzdCLE9BQVEsZUFBQUMsRUFBYSxrQkFBQUMsRUFBZ0Isa0JBQUFDLE1BQXFCLGtCQUMxRCxPQUFRLHFCQUFBQyxNQUF3QixnQ0FRaEMsTUFBTUMsRUFBaUMsUUE4Q2pDQyxFQUF1QixDQUFDQyxFQUFnQkMsSUFBaUMsQ0FDN0UsTUFBTUMsRUFBWVYsRUFBa0JRLENBQUssRUFFekMsR0FBR0MsR0FBUyxRQUFVLENBQUNDLEVBQVUsU0FDL0IsTUFBTSxJQUFJLE1BQU0scUNBQXFDLEVBR3ZELE9BQU9BLENBQ1QsRUFFTUMsRUFBMEIsQ0FBQ0gsRUFBZ0JDLElBQW9DVixFQUFxQlMsQ0FBSyxFQTJGbEdJLEVBQW9CLENBQy9CQyxFQUNBSixJQUNnQixDQUVoQixNQUFNSyxFQUFXVCxFQUFrQlEsRUFBTU4sRUFBc0IsQ0FDN0QsUUFBU0UsR0FBUyxZQUNsQixlQUFnQkEsR0FBUyxrQkFDM0IsQ0FBQyxFQUdLTSxFQUFjVixFQUFrQlEsRUFBTUYsRUFBeUIsQ0FDbkUsUUFBU0YsR0FBUyxlQUNsQixlQUFnQkEsR0FBUyxxQkFDM0IsQ0FBQyxFQWlVRCxNQUFPLENBQ0wsSUEvVFUsTUFBT08sRUFBMEJDLEVBQXNCLENBQUMsSUFBcUIsQ0FDdkYsTUFBTUMsRUFBaUIsQ0FDckIsS0FBTSxDQUNKLEtBQU0sWUFDTixNQUFPSixFQUFTLFVBQVVFLENBQVMsQ0FDckMsQ0FDRixFQUVNRyxFQUFhQyxHQUFrRCxDQUNuRSxLQUFNLENBQUMsTUFBTyxDQUFDLElBQUFDLEVBQU0sQ0FBQyxDQUFDLENBQUMsRUFBSUQsRUFDNUIs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c0IsQ0FBQyxJQUFxQixDQUMxRixNQUFNQyxFQUFpQixDQUNyQixLQUFNLENBQ0osS0FBTSxhQUNOLE1BQU9KLEVBQVMsVUFBVUUsQ0FBUyxDQUNyQyxDQUNGLEVBRU1HLEVBQWFDLEdBQWtELENBQ25FLEtBQU0sQ0FBQyxNQUFPLENBQUMsT0FBQXVCLEVBQVMsQ0FBQyxDQUFDLENBQUMsRUFBSXZCLEVBQy9CLE9BQU9QLEVBQUssU0FBUyxDQUNuQixLQUFNOEIsRUFDTixLQUFNMUMsRUFBZSxlQUN2QixDQUFDLENBQ0gsRUFFTSxDQUFDLE1BQU8sQ0FBQyxPQUFRcUIsRUFBTyxDQUFDLENBQUMsQ0FBQyxFQUFJLE1BQU1uQixFQUN6Q1UsRUFDQSxTQUNBUCxFQUNBWSxFQUNBLENBQ0UsUUFDQSxPQUNBLFVBQ0EsTUFDQSxZQUNBLFNBQ0EsYUFDQSxXQUNBLFdBQ0EsV0FDQSxZQUNBLGNBQ0EsV0FDQSxPQUNBLFFBQ0EseUJBQ0EsV0FDQSxhQUNBLFNBQ0EsV0FDQSxHQUFHRCxDQUNMLEVBQ0EsQ0FBQyxVQUFBRSxDQUFTLENBQ1osRUFDQSxPQUFPRyxDQUNULEVBcVBFLGtCQUFtQlIsRUFBUyxjQUM1QixxQkFBc0JDLEVBQVksY0FDbEMseUJBQTBCRCxFQUFTLGNBQ25DLDRCQUE2QkMsRUFBWSxhQUMzQyxDQUNGIiwKICAibmFtZXMiOiBbIkRhdGVUaW1lIiwgInZhbGlkYXRlUGVyc29uYUlucHV0IiwgInZhbGlkYXRlVXNlcklucHV0IiwgIlVTRVJfQ09OU1RBTlRTIiwgImFwcE11dGF0aW9uIiwgInB1YmxpY011dGF0aW9uIiwgInJlZnJlc2hTZXNzaW9uIiwgImNyZWF0ZUJhc2VBY3Rpb25zIiwgIkRBVEFfVFlQRSIsICJkZWZhdWx0VXNlclZhbGlkYXRvciIsICJpbnB1dCIsICJvcHRpb25zIiwgInZhbGlkYXRlZCIsICJkZWZhdWx0UGVyc29uYVZhbGlkYXRvciIsICJjcmVhdGVVc2VyQWN0aW9ucyIsICJmbHV4IiwgInVzZXJCYXNlIiwgInBlcnNvbmFCYXNlIiwgInVzZXJJbnB1dCIsICJ1c2VyUHJvcHMiLCAicXVlcnlWYXJpYWJsZXMiLCAib25TdWNjZXNzIiwgImRhdGEiLCAiYWRkIiwgInVzZXIiLCAidHlwZSIsICJjb2RlIiwgInVzZXJJZCIsICJ1c2VybmFtZSIsICJmcm9tIiwgInRvIiwgInJlYWN0aW9uTmFtZXMiLCAicHJvZmlsZVByb3BzIiwgInRhZ05hbWVzIiwgImV4cGlyZXMiLCAiZXhwaXJlRGF0ZSIsICJ0b2tlbiIsICJwYXNzd29yZCIsICJzZXNzaW9uRGF0YSIsICJlcnJvciIsICJuZXdQYXNzd29yZCIsICJ1cGRhdGUiLCAicGVyc29uYUlucHV0IiwgInVwZGF0ZVBlcnNvbmEiLCAicGVyc29uYSIsICJzaWduVXAiXQp9Cg==
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { validateUserInput } from '../../adapters/userAdapter/userAdapter.js';
5
+ import { USER_CONSTANTS } from '../../stores/userStore.js';
6
+ import { appMutation, appQuery, publicMutation, refreshSession } from '../../utils/api.js';
7
+ import { createBaseActions } from '../../utils/baseActionFactory.js';
8
+ import { clearPersistedSession, hydrateSessionFromStorage, isLoggedIn as isLoggedInWithStorage, normalizeSession, storeSession } from '../../utils/session.js';
9
+ import { getConfigFromFlux } from '../../utils/configUtils.js';
10
+ import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
11
+ import { syncPersonaTagsToSession } from '../personaActions/personaActions.js';
12
+ const DATA_TYPE = 'users';
13
+ const DEFAULT_USER_QUERY_FIELDS = [
14
+ 'userId',
15
+ 'username'
16
+ ];
17
+ const SENSITIVE_USER_FIELDS = new Set([
18
+ 'password',
19
+ 'salt',
20
+ 'token',
21
+ 'refreshToken',
22
+ 'verifiedEmailCode',
23
+ 'verifiedSmsCode'
24
+ ]);
25
+ const INVALID_FIELD_REGEX = /Cannot query field "([^"]+)"/g;
26
+ const hasSessionIdentity = (user)=>!!(user && (user._id || user.userId || user.username || user.email));
27
+ const sanitizeUpdateUserInput = (userInput = {}, currentSession = {})=>{
28
+ const nextUser = Object.entries(userInput).reduce((user, [field, value])=>{
29
+ if (value === undefined || value === null) {
30
+ return user;
31
+ }
32
+ if (field === 'password') {
33
+ const password = String(value || '').trim();
34
+ if (password) {
35
+ user.password = password;
36
+ }
37
+ return user;
38
+ }
39
+ if (field === 'userId') {
40
+ user.userId = value;
41
+ return user;
42
+ }
43
+ const currentValue = currentSession[field];
44
+ if (String(value) !== String(currentValue ?? '')) {
45
+ user[field] = value;
46
+ }
47
+ return user;
48
+ }, {});
49
+ return nextUser;
50
+ };
51
+ const syncStoredSession = async (flux, sessionPatch = {})=>{
52
+ const currentSession = flux.getState('user.session', {}) || {};
53
+ return storeSession(flux, {
54
+ ...currentSession,
55
+ ...sessionPatch
56
+ });
57
+ };
58
+ const getSessionPayload = (payload)=>{
59
+ if (payload && typeof payload === 'object' && 'session' in payload) {
60
+ return payload.session || {};
61
+ }
62
+ return payload && typeof payload === 'object' ? payload : {};
63
+ };
64
+ const getFieldRoot = (field)=>{
65
+ const trimmed = field.trim();
66
+ const match = trimmed.match(/^[A-Za-z_][A-Za-z0-9_]*/);
67
+ return match ? match[0] : '';
68
+ };
69
+ const sanitizeUserProps = (props = [], fallbackProps = DEFAULT_USER_QUERY_FIELDS)=>{
70
+ const seen = new Set();
71
+ const sanitized = props.reduce((list, field)=>{
72
+ const root = getFieldRoot(field);
73
+ if (!root || SENSITIVE_USER_FIELDS.has(root) || seen.has(field)) {
74
+ return list;
75
+ }
76
+ seen.add(field);
77
+ list.push(field);
78
+ return list;
79
+ }, []);
80
+ if (sanitized.length > 0) {
81
+ return sanitized;
82
+ }
83
+ return fallbackProps.reduce((list, field)=>{
84
+ const root = getFieldRoot(field);
85
+ if (!root || SENSITIVE_USER_FIELDS.has(root) || seen.has(field)) {
86
+ return list;
87
+ }
88
+ seen.add(field);
89
+ list.push(field);
90
+ return list;
91
+ }, []);
92
+ };
93
+ const getInvalidFields = (error)=>{
94
+ const errors = error?.errors || error?.source?.errors || [];
95
+ const invalidFields = new Set();
96
+ errors.forEach((item)=>{
97
+ const message = typeof item === 'string' ? item : item?.message || '';
98
+ let match = INVALID_FIELD_REGEX.exec(message);
99
+ while(match){
100
+ invalidFields.add(match[1]);
101
+ match = INVALID_FIELD_REGEX.exec(message);
102
+ }
103
+ INVALID_FIELD_REGEX.lastIndex = 0;
104
+ });
105
+ return invalidFields;
106
+ };
107
+ const withInvalidFieldRetry = async (requestWithProps, props, fallbackProps = DEFAULT_USER_QUERY_FIELDS)=>{
108
+ const safeProps = sanitizeUserProps(props, fallbackProps);
109
+ try {
110
+ return await requestWithProps(safeProps);
111
+ } catch (error) {
112
+ const invalidFields = getInvalidFields(error);
113
+ if (invalidFields.size === 0) {
114
+ throw error;
115
+ }
116
+ const retryProps = safeProps.filter((field)=>!invalidFields.has(getFieldRoot(field)));
117
+ if (retryProps.length === 0 || retryProps.length === safeProps.length) {
118
+ throw error;
119
+ }
120
+ return requestWithProps(retryProps);
121
+ }
122
+ };
123
+ const defaultUserValidator = (input, options)=>{
124
+ const validated = validateUserInput(input);
125
+ if (options?.strict && !validated.username) {
126
+ throw new Error('Username is required in strict mode');
127
+ }
128
+ return validated;
129
+ };
130
+ export const createUserActions = (flux, options)=>{
131
+ const userBase = createBaseActions(flux, defaultUserValidator, {
132
+ adapter: options?.userAdapter,
133
+ adapterOptions: options?.userAdapterOptions
134
+ });
135
+ const clearUserRequestCaches = async (userId = '')=>{
136
+ await clearCachedRequest(flux, 'user.list');
137
+ await clearCachedRequest(flux, 'user.listByLatest');
138
+ await clearCachedRequest(flux, 'user.listByTags');
139
+ await clearCachedRequest(flux, 'user.search');
140
+ if (userId) {
141
+ await clearCachedRequest(flux, `user.itemById:${userId}`);
142
+ }
143
+ };
144
+ const addUser = async (userInput, userProps = [], requestOptions = {})=>{
145
+ const { username, email, password } = userInput;
146
+ const queryVariables = {
147
+ user: {
148
+ type: 'UserInput!',
149
+ value: {
150
+ email,
151
+ password,
152
+ username
153
+ }
154
+ }
155
+ };
156
+ const onSuccess = (data)=>{
157
+ const user = data?.users?.addUser || {};
158
+ return flux.dispatch({
159
+ type: USER_CONSTANTS.ADD_ITEM_SUCCESS,
160
+ user
161
+ });
162
+ };
163
+ const returnProps = sanitizeUserProps(userProps, [
164
+ 'added',
165
+ 'address',
166
+ 'dob',
167
+ 'city',
168
+ 'country',
169
+ 'gender',
170
+ 'imageUrl',
171
+ 'latitude',
172
+ 'longitude',
173
+ 'mailingList',
174
+ 'modified',
175
+ 'state',
176
+ 'thumbUrl',
177
+ 'userAccess',
178
+ 'userId',
179
+ 'username'
180
+ ]);
181
+ try {
182
+ return await publicMutation(flux, 'addUser', DATA_TYPE, queryVariables, returnProps, {
183
+ onSuccess
184
+ });
185
+ } finally{
186
+ await clearUserRequestCaches();
187
+ }
188
+ };
189
+ const signUp = async (userInput, userProps = [], requestOptions = {})=>{
190
+ const { username, email, password } = userInput;
191
+ const queryVariables = {
192
+ expires: {
193
+ type: 'Int',
194
+ value: 15
195
+ },
196
+ user: {
197
+ type: 'UserInput!',
198
+ value: {
199
+ email,
200
+ password,
201
+ username
202
+ }
203
+ }
204
+ };
205
+ const onSuccess = (data)=>{
206
+ const user = data?.users?.signUp || {};
207
+ return flux.dispatch({
208
+ type: USER_CONSTANTS.SIGN_UP_SUCCESS,
209
+ user
210
+ });
211
+ };
212
+ const returnProps = sanitizeUserProps([
213
+ 'added',
214
+ 'modified',
215
+ 'userId',
216
+ 'username',
217
+ ...userProps
218
+ ]);
219
+ try {
220
+ return await publicMutation(flux, 'signUp', DATA_TYPE, queryVariables, returnProps, {
221
+ onSuccess
222
+ });
223
+ } catch (error) {
224
+ flux.dispatch({
225
+ error,
226
+ type: USER_CONSTANTS.SIGN_UP_ERROR
227
+ });
228
+ throw error;
229
+ } finally{
230
+ await clearUserRequestCaches();
231
+ }
232
+ };
233
+ const updateUser = async (userInput, userProps = [], requestOptions = {})=>{
234
+ const updateInput = sanitizeUpdateUserInput(userInput, flux.getState('user.session', {}) || {});
235
+ const { birthdate, dob, email, firstName, gender, lastName, mailingList, password, phone, userId, username } = updateInput;
236
+ const queryVariables = {
237
+ user: {
238
+ type: 'UserInput!',
239
+ value: {
240
+ birthdate: birthdate ?? dob,
241
+ email,
242
+ firstName,
243
+ gender,
244
+ lastName,
245
+ mailingList,
246
+ password,
247
+ phone,
248
+ userId,
249
+ username
250
+ }
251
+ }
252
+ };
253
+ const onSuccess = (data = {})=>{
254
+ const users = data?.users;
255
+ const legacyUser = users?.update || {};
256
+ const updatedUser = users?.updateUser || {};
257
+ const user = hasSessionIdentity(updatedUser) ? updatedUser : legacyUser;
258
+ if (user?.userId && user.userId === flux.getState('user.session.userId')) {
259
+ syncStoredSession(flux, user);
260
+ }
261
+ return flux.dispatch({
262
+ type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
263
+ user
264
+ });
265
+ };
266
+ const returnProps = sanitizeUserProps([
267
+ 'added',
268
+ 'birthdate',
269
+ 'city',
270
+ 'country',
271
+ 'email',
272
+ 'firstName',
273
+ 'gender',
274
+ 'imageCount',
275
+ 'imageUrl',
276
+ 'lastName',
277
+ 'latitude',
278
+ 'longitude',
279
+ 'mailingList',
280
+ 'modified',
281
+ 'phone',
282
+ 'state',
283
+ 'thumbUrl',
284
+ 'userAccess',
285
+ 'userId',
286
+ 'username',
287
+ ...userProps
288
+ ]);
289
+ try {
290
+ return await appMutation(flux, 'updateUser', DATA_TYPE, queryVariables, returnProps, {
291
+ onSuccess
292
+ });
293
+ } finally{
294
+ await clearUserRequestCaches(String(userId || ''));
295
+ }
296
+ };
297
+ const confirmCode = async (code, { type, value }, requestOptions = {})=>{
298
+ const queryVariables = {
299
+ code: {
300
+ type: 'Int!',
301
+ value: code
302
+ },
303
+ type: {
304
+ type: 'String!',
305
+ value: type
306
+ },
307
+ value: {
308
+ type: 'String!',
309
+ value
310
+ }
311
+ };
312
+ const data = await publicMutation(flux, 'confirmCode', DATA_TYPE, queryVariables, []);
313
+ const confirmed = !!data?.users?.confirmCode;
314
+ await flux.dispatch({
315
+ confirmed,
316
+ type: USER_CONSTANTS.CONFIRM_SIGN_UP_SUCCESS
317
+ });
318
+ return confirmed;
319
+ };
320
+ const remove = async (userId, requestOptions = {})=>{
321
+ const queryVariables = {
322
+ userId: {
323
+ type: 'ID!',
324
+ value: userId
325
+ }
326
+ };
327
+ const onSuccess = (data = {})=>{
328
+ const user = data?.users?.remove || {};
329
+ return flux.dispatch({
330
+ type: USER_CONSTANTS.REMOVE_ITEM_SUCCESS,
331
+ user
332
+ });
333
+ };
334
+ try {
335
+ return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [], {
336
+ onSuccess
337
+ });
338
+ } finally{
339
+ await clearUserRequestCaches(userId);
340
+ }
341
+ };
342
+ const session = async (userProps = [], requestOptions = {})=>withInvalidFieldRetry(async (sessionProps)=>{
343
+ const data = await appQuery(flux, 'getUserBySession', DATA_TYPE, {}, sessionProps);
344
+ const sessionData = data?.users?.getUserBySession || {};
345
+ if (!hasSessionIdentity(sessionData)) {
346
+ await clearPersistedSession(flux);
347
+ await flux.dispatch({
348
+ type: USER_CONSTANTS.GET_SESSION_ERROR
349
+ });
350
+ throw new Error('invalid_session');
351
+ }
352
+ const nextSession = await syncStoredSession(flux, sessionData);
353
+ await flux.dispatch({
354
+ session: nextSession,
355
+ type: USER_CONSTANTS.GET_SESSION_SUCCESS
356
+ });
357
+ await syncPersonaTagsToSession(flux, String(nextSession?.personaId || ''));
358
+ return await syncStoredSession(flux, flux.getState('user.session', nextSession) || nextSession);
359
+ }, userProps, DEFAULT_USER_QUERY_FIELDS);
360
+ const itemById = async (userId, userProps = [], requestOptions = {})=>{
361
+ const cachedResult = getCachedRequest(flux, `user.itemById:${userId}`, {
362
+ userId,
363
+ userProps
364
+ }, requestOptions);
365
+ if (cachedResult !== undefined) {
366
+ return cachedResult;
367
+ }
368
+ const queryVariables = {
369
+ userId: {
370
+ type: 'ID!',
371
+ value: userId
372
+ }
373
+ };
374
+ const onSuccess = (data = {})=>{
375
+ const getUserById = data?.users?.getUserById || {};
376
+ if (userId === flux.getState('user.session.userId')) {
377
+ syncStoredSession(flux, getUserById);
378
+ }
379
+ return flux.dispatch({
380
+ type: USER_CONSTANTS.GET_ITEM_SUCCESS,
381
+ user: getUserById
382
+ });
383
+ };
384
+ const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'getUserById', DATA_TYPE, queryVariables, safeUserProps, {
385
+ onSuccess
386
+ }), userProps, DEFAULT_USER_QUERY_FIELDS);
387
+ return setCachedRequest(flux, `user.itemById:${userId}`, {
388
+ userId,
389
+ userProps
390
+ }, result, requestOptions);
391
+ };
392
+ const saveBillingCard = async (card, userProps = [], requestOptions = {})=>{
393
+ const queryVariables = {
394
+ card: {
395
+ type: 'CreditCardInput!',
396
+ value: card
397
+ }
398
+ };
399
+ const onSuccess = (data = {})=>{
400
+ const user = data?.users?.saveBillingCard || {};
401
+ if (user?.userId && user.userId === flux.getState('user.session.userId')) {
402
+ syncStoredSession(flux, user);
403
+ }
404
+ return flux.dispatch({
405
+ type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
406
+ user
407
+ });
408
+ };
409
+ const returnProps = sanitizeUserProps([
410
+ 'modified',
411
+ 'stripeCardBrand',
412
+ 'stripeCardId',
413
+ 'stripeCardLast4',
414
+ 'userId',
415
+ 'username',
416
+ ...userProps
417
+ ]);
418
+ const sessionUserId = String(flux.getState('user.session.userId') || '');
419
+ try {
420
+ return await appMutation(flux, 'saveBillingCard', DATA_TYPE, queryVariables, returnProps, {
421
+ onSuccess
422
+ });
423
+ } finally{
424
+ await clearUserRequestCaches(sessionUserId);
425
+ }
426
+ };
427
+ const deleteBillingCard = async (userProps = [], requestOptions = {})=>{
428
+ const onSuccess = (data = {})=>{
429
+ const user = data?.users?.deleteBillingCard || {};
430
+ if (user?.userId && user.userId === flux.getState('user.session.userId')) {
431
+ syncStoredSession(flux, user);
432
+ }
433
+ return flux.dispatch({
434
+ type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
435
+ user
436
+ });
437
+ };
438
+ const returnProps = sanitizeUserProps([
439
+ 'modified',
440
+ 'stripeCardBrand',
441
+ 'stripeCardId',
442
+ 'stripeCardLast4',
443
+ 'userId',
444
+ 'username',
445
+ ...userProps
446
+ ]);
447
+ const sessionUserId = String(flux.getState('user.session.userId') || '');
448
+ try {
449
+ return await appMutation(flux, 'deleteBillingCard', DATA_TYPE, {}, returnProps, {
450
+ onSuccess
451
+ });
452
+ } finally{
453
+ await clearUserRequestCaches(sessionUserId);
454
+ }
455
+ };
456
+ const updatePlan = async (planId, userProps = [], requestOptions = {})=>{
457
+ const nextPlanId = String(planId || '').trim();
458
+ if (!nextPlanId) {
459
+ throw new Error('A subscription planId is required to update a user plan');
460
+ }
461
+ const queryVariables = {
462
+ planId: {
463
+ type: 'ID!',
464
+ value: nextPlanId
465
+ }
466
+ };
467
+ const onSuccess = (data = {})=>{
468
+ const user = data?.users?.updatePlan || {};
469
+ if (user?.userId && user.userId === flux.getState('user.session.userId')) {
470
+ syncStoredSession(flux, user);
471
+ }
472
+ return flux.dispatch({
473
+ type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
474
+ user
475
+ });
476
+ };
477
+ const returnProps = sanitizeUserProps([
478
+ 'modified',
479
+ 'planExpires',
480
+ 'planId',
481
+ 'planStatus',
482
+ 'planSubscriptionId',
483
+ 'stripeCardBrand',
484
+ 'stripeCardId',
485
+ 'stripeCardLast4',
486
+ 'userAccess',
487
+ 'userId',
488
+ 'username',
489
+ ...userProps
490
+ ]);
491
+ const sessionUserId = String(flux.getState('user.session.userId') || '');
492
+ try {
493
+ return await appMutation(flux, 'updatePlan', DATA_TYPE, queryVariables, returnProps, {
494
+ onSuccess
495
+ });
496
+ } finally{
497
+ await clearUserRequestCaches(sessionUserId);
498
+ }
499
+ };
500
+ const list = async (userProps = [], requestOptions = {})=>{
501
+ const cachedResult = getCachedRequest(flux, 'user.list', {
502
+ userProps
503
+ }, requestOptions);
504
+ if (cachedResult !== undefined) {
505
+ return cachedResult;
506
+ }
507
+ const onSuccess = (data = {})=>{
508
+ const list = data?.users?.getUserList || [];
509
+ return flux.dispatch({
510
+ list,
511
+ type: USER_CONSTANTS.GET_LIST_SUCCESS
512
+ });
513
+ };
514
+ const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'getUserList', DATA_TYPE, {}, safeUserProps, {
515
+ onSuccess
516
+ }), userProps, DEFAULT_USER_QUERY_FIELDS);
517
+ return setCachedRequest(flux, 'user.list', {
518
+ userProps
519
+ }, result, requestOptions);
520
+ };
521
+ const listByLatest = async (username = '', from = 0, to = 10, userProps = [], requestOptions = {})=>{
522
+ const cachedResult = getCachedRequest(flux, 'user.listByLatest', {
523
+ username,
524
+ from,
525
+ to,
526
+ userProps
527
+ }, requestOptions);
528
+ if (cachedResult !== undefined) {
529
+ return cachedResult;
530
+ }
531
+ const queryVariables = {
532
+ from: {
533
+ type: 'Int',
534
+ value: from
535
+ },
536
+ to: {
537
+ type: 'Int',
538
+ value: to
539
+ },
540
+ username: {
541
+ type: 'String',
542
+ value: username
543
+ }
544
+ };
545
+ const onSuccess = (data = {})=>{
546
+ const list = data?.users?.listByLatest || [];
547
+ return flux.dispatch({
548
+ list,
549
+ type: USER_CONSTANTS.GET_LIST_SUCCESS
550
+ });
551
+ };
552
+ const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByLatest', DATA_TYPE, queryVariables, safeUserProps, {
553
+ onSuccess
554
+ }), userProps, DEFAULT_USER_QUERY_FIELDS);
555
+ return setCachedRequest(flux, 'user.listByLatest', {
556
+ username,
557
+ from,
558
+ to,
559
+ userProps
560
+ }, result, requestOptions);
561
+ };
562
+ const listByConnection = async (userId, from = 0, to = 10, userProps = [], requestOptions = {})=>[];
563
+ const listByReactions = async (username, reactionNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>[];
564
+ const listByTags = async (username, tagNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>{
565
+ const cachedResult = getCachedRequest(flux, 'user.listByTags', {
566
+ username,
567
+ tagNames,
568
+ from,
569
+ to,
570
+ personaProps
571
+ }, requestOptions);
572
+ if (cachedResult !== undefined) {
573
+ return cachedResult;
574
+ }
575
+ const queryVariables = {
576
+ from: {
577
+ type: 'Int',
578
+ value: from
579
+ },
580
+ tags: {
581
+ type: '[String!]',
582
+ value: tagNames
583
+ },
584
+ to: {
585
+ type: 'Int',
586
+ value: to
587
+ },
588
+ username: {
589
+ type: 'String',
590
+ value: username
591
+ }
592
+ };
593
+ const onSuccess = (data = {})=>{
594
+ const list = data?.users?.listByTags || [];
595
+ return flux.dispatch({
596
+ list,
597
+ type: USER_CONSTANTS.GET_LIST_SUCCESS
598
+ });
599
+ };
600
+ const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByTags', DATA_TYPE, queryVariables, safeUserProps, {
601
+ onSuccess
602
+ }), personaProps, DEFAULT_USER_QUERY_FIELDS);
603
+ return setCachedRequest(flux, 'user.listByTags', {
604
+ username,
605
+ tagNames,
606
+ from,
607
+ to,
608
+ personaProps
609
+ }, result, requestOptions);
610
+ };
611
+ const search = async (query, userProps = [], requestOptions = {})=>{
612
+ const cachedResult = getCachedRequest(flux, 'user.search', {
613
+ query,
614
+ userProps
615
+ }, requestOptions);
616
+ if (cachedResult !== undefined) {
617
+ return cachedResult;
618
+ }
619
+ const queryVariables = {
620
+ query: {
621
+ type: 'String!',
622
+ value: query
623
+ }
624
+ };
625
+ const onSuccess = (data = {})=>{
626
+ const list = data?.users?.search || [];
627
+ return flux.dispatch({
628
+ list,
629
+ type: USER_CONSTANTS.GET_LIST_SUCCESS
630
+ });
631
+ };
632
+ const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'search', DATA_TYPE, queryVariables, safeUserProps, {
633
+ onSuccess
634
+ }), userProps, DEFAULT_USER_QUERY_FIELDS);
635
+ return setCachedRequest(flux, 'user.search', {
636
+ query,
637
+ userProps
638
+ }, result, requestOptions);
639
+ };
640
+ const isLoggedIn = ()=>isLoggedInWithStorage(flux);
641
+ const currentAuthenticatedUser = async (requestOptions = {})=>{
642
+ const session = await hydrateSessionFromStorage(flux);
643
+ return session || {};
644
+ };
645
+ const currentUser = async (requestOptions = {})=>currentAuthenticatedUser(requestOptions);
646
+ const refreshSessionAction = async (token, expires, requestOptions = {})=>{
647
+ const result = await refreshSession(flux, token, expires);
648
+ return result?.refreshSession || {};
649
+ };
650
+ const signIn = async (user, expires, requestOptions = {})=>{
651
+ const { email, phone, username, password } = user;
652
+ let userInput;
653
+ let legacyVariables;
654
+ if (username && password) {
655
+ userInput = {
656
+ password,
657
+ username
658
+ };
659
+ } else if (email && password) {
660
+ userInput = {
661
+ email,
662
+ password
663
+ };
664
+ } else if (phone && password) {
665
+ userInput = {
666
+ password,
667
+ phone
668
+ };
669
+ } else {
670
+ throw new Error('Username, email, or phone number and password are required to sign in');
671
+ }
672
+ const config = getConfigFromFlux(flux);
673
+ const requestedExpires = Math.max(1, Number(expires || config.app?.session?.maxMinutes || 15));
674
+ const queryVariablesWithUserInput = {
675
+ expires: {
676
+ type: 'Int',
677
+ value: requestedExpires
678
+ },
679
+ user: {
680
+ type: 'UserInput!',
681
+ value: userInput
682
+ }
683
+ };
684
+ const onSuccess = async (data = {})=>{
685
+ const users = data?.users;
686
+ const sessionData = normalizeSession(users?.signIn || {});
687
+ const storedSession = await syncStoredSession(flux, sessionData);
688
+ return {
689
+ session: storedSession,
690
+ type: USER_CONSTANTS.SIGN_IN_SUCCESS
691
+ };
692
+ };
693
+ const performSignIn = async (queryVariables)=>{
694
+ const sessionResult = await publicMutation(flux, 'signIn', DATA_TYPE, queryVariables, [
695
+ 'expires',
696
+ 'issued',
697
+ 'token',
698
+ 'userId',
699
+ 'username'
700
+ ], {
701
+ onSuccess
702
+ });
703
+ const baseSession = await syncStoredSession(flux, getSessionPayload(sessionResult));
704
+ try {
705
+ const hydratedSession = await session([
706
+ 'userId',
707
+ 'personaId',
708
+ 'userAccess',
709
+ 'username'
710
+ ], requestOptions);
711
+ await syncPersonaTagsToSession(flux, String(hydratedSession?.personaId || ''));
712
+ } catch (error) {
713
+ const fallbackSession = await syncStoredSession(flux, baseSession);
714
+ await flux.dispatch({
715
+ session: fallbackSession,
716
+ type: USER_CONSTANTS.SIGN_IN_SUCCESS
717
+ });
718
+ return fallbackSession;
719
+ }
720
+ const finalSession = await syncStoredSession(flux, flux.getState('user.session', baseSession) || baseSession);
721
+ await flux.dispatch({
722
+ session: finalSession,
723
+ type: USER_CONSTANTS.SIGN_IN_SUCCESS
724
+ });
725
+ return finalSession;
726
+ };
727
+ try {
728
+ return await performSignIn(queryVariablesWithUserInput);
729
+ } catch (error) {
730
+ flux.dispatch({
731
+ error,
732
+ type: USER_CONSTANTS.SIGN_IN_ERROR
733
+ });
734
+ throw error;
735
+ } finally{
736
+ await clearUserRequestCaches(String(user?.userId || ''));
737
+ }
738
+ };
739
+ const signOut = async (requestOptions = {})=>{
740
+ await clearPersistedSession(flux);
741
+ await flux.dispatch({
742
+ session: {},
743
+ type: USER_CONSTANTS.SIGN_OUT_SUCCESS
744
+ });
745
+ await clearUserRequestCaches();
746
+ return true;
747
+ };
748
+ const confirmSignUp = async (code, type, requestOptions = {})=>true;
749
+ const forgotPassword = async (username, requestOptions = {})=>{
750
+ const queryVariables = {
751
+ user: {
752
+ type: 'UserInput!',
753
+ value: {
754
+ email: username,
755
+ phone: username,
756
+ username
757
+ }
758
+ }
759
+ };
760
+ const onSuccess = (data)=>{
761
+ const success = !!data?.users?.forgotPassword;
762
+ return flux.dispatch({
763
+ type: success ? USER_CONSTANTS.FORGOT_PASSWORD_SUCCESS : USER_CONSTANTS.FORGOT_PASSWORD_ERROR
764
+ });
765
+ };
766
+ return publicMutation(flux, 'forgotPassword', DATA_TYPE, queryVariables, [], {
767
+ onSuccess
768
+ }).then((data)=>{
769
+ const success = !!data?.users?.forgotPassword;
770
+ if (!success) {
771
+ throw new Error('forgot_password_failed');
772
+ }
773
+ return true;
774
+ });
775
+ };
776
+ const resetPassword = async (username, password, code, type, requestOptions = {})=>{
777
+ const queryVariables = {
778
+ code: {
779
+ type: 'String!',
780
+ value: code
781
+ },
782
+ user: {
783
+ type: 'UserInput!',
784
+ value: {
785
+ ...type === 'email' ? {
786
+ email: username
787
+ } : {
788
+ phone: username
789
+ },
790
+ password,
791
+ username
792
+ }
793
+ }
794
+ };
795
+ const onSuccess = (data)=>{
796
+ const success = !!data?.users?.resetPassword;
797
+ return flux.dispatch({
798
+ type: success ? USER_CONSTANTS.RESET_PASSWORD_SUCCESS : USER_CONSTANTS.RESET_PASSWORD_ERROR
799
+ });
800
+ };
801
+ return publicMutation(flux, 'resetPassword', DATA_TYPE, queryVariables, [], {
802
+ onSuccess
803
+ }).then((data)=>{
804
+ const success = !!data?.users?.resetPassword;
805
+ if (!success) {
806
+ throw new Error('reset_password_failed');
807
+ }
808
+ return true;
809
+ });
810
+ };
811
+ const updatePassword = async (password, newPassword, requestOptions = {})=>true;
812
+ return {
813
+ addUser,
814
+ confirmCode,
815
+ confirmSignUp,
816
+ currentAuthenticatedUser,
817
+ currentUser,
818
+ deleteBillingCard,
819
+ list,
820
+ forgotPassword,
821
+ isLoggedIn,
822
+ itemById,
823
+ listByConnection,
824
+ listByLatest,
825
+ listByReactions,
826
+ listByTags,
827
+ refreshSession: refreshSessionAction,
828
+ remove,
829
+ resetPassword,
830
+ saveBillingCard,
831
+ search,
832
+ session,
833
+ signIn,
834
+ signOut,
835
+ signUp,
836
+ updatePassword,
837
+ updateUser,
838
+ updatePlan,
839
+ updateUserAdapter: userBase.updateAdapter,
840
+ updateUserAdapterOptions: userBase.updateOptions
841
+ };
842
+ };
843
+
844
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy91c2VyQWN0aW9ucy91c2VyQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVVzZXJJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtVU0VSX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZXJTdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeSwgcHVibGljTXV0YXRpb24sIHJlZnJlc2hTZXNzaW9ufSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHtjcmVhdGVCYXNlQWN0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGlvbkZhY3RvcnkuanMnO1xuaW1wb3J0IHtcbiAgY2xlYXJQZXJzaXN0ZWRTZXNzaW9uLFxuICBoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlLFxuICBpc0xvZ2dlZEluIGFzIGlzTG9nZ2VkSW5XaXRoU3RvcmFnZSxcbiAgbm9ybWFsaXplU2Vzc2lvbixcbiAgc3RvcmVTZXNzaW9uXG59IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb24uanMnO1xuaW1wb3J0IHtnZXRDb25maWdGcm9tRmx1eH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZmlnVXRpbHMuanMnO1xuaW1wb3J0IHtjbGVhckNhY2hlZFJlcXVlc3QsIGdldENhY2hlZFJlcXVlc3QsIHNldENhY2hlZFJlcXVlc3R9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5pbXBvcnQge3N5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbn0gZnJvbSAnLi4vcGVyc29uYUFjdGlvbnMvcGVyc29uYUFjdGlvbnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEFjdGlvbiwgRmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtVc2VyfSBmcm9tICcuLi8uLi9hZGFwdGVycy91c2VyQWRhcHRlci91c2VyQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpUmVzdWx0c1R5cGUsIFNlc3Npb25UeXBlfSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHR5cGUge0Jhc2VBZGFwdGVyT3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICd1c2Vycyc7XG5jb25zdCBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTID0gWyd1c2VySWQnLCAndXNlcm5hbWUnXTtcbmNvbnN0IFNFTlNJVElWRV9VU0VSX0ZJRUxEUyA9IG5ldyBTZXQoW1xuICAncGFzc3dvcmQnLFxuICAnc2FsdCcsXG4gICd0b2tlbicsXG4gICdyZWZyZXNoVG9rZW4nLFxuICAndmVyaWZpZWRFbWFpbENvZGUnLFxuICAndmVyaWZpZWRTbXNDb2RlJ1xuXSk7XG5jb25zdCBJTlZBTElEX0ZJRUxEX1JFR0VYID0gL0Nhbm5vdCBxdWVyeSBmaWVsZCBcIihbXlwiXSspXCIvZztcbmNvbnN0IGhhc1Nlc3Npb25JZGVudGl0eSA9ICh1c2VyPzogUGFydGlhbDxVc2VyPiB8IG51bGwpOiBib29sZWFuID0+XG4gICEhKHVzZXIgJiYgKCh1c2VyIGFzIGFueSkuX2lkIHx8ICh1c2VyIGFzIGFueSkudXNlcklkIHx8ICh1c2VyIGFzIGFueSkudXNlcm5hbWUgfHwgKHVzZXIgYXMgYW55KS5lbWFpbCkpO1xuXG5jb25zdCBzYW5pdGl6ZVVwZGF0ZVVzZXJJbnB1dCA9ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4gPSB7fSwgY3VycmVudFNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQYXJ0aWFsPFVzZXI+ID0+IHtcbiAgY29uc3QgbmV4dFVzZXIgPSBPYmplY3QuZW50cmllcyh1c2VySW5wdXQpLnJlZHVjZSgodXNlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFtmaWVsZCwgdmFsdWVdKSA9PiB7XG4gICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYoZmllbGQgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICAgIGlmKHBhc3N3b3JkKSB7XG4gICAgICAgIHVzZXIucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYoZmllbGQgPT09ICd1c2VySWQnKSB7XG4gICAgICB1c2VyLnVzZXJJZCA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudFNlc3Npb25bZmllbGRdO1xuXG4gICAgaWYoU3RyaW5nKHZhbHVlKSAhPT0gU3RyaW5nKGN1cnJlbnRWYWx1ZSA/PyAnJykpIHtcbiAgICAgIHVzZXJbZmllbGRdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXI7XG4gIH0sIHt9KTtcblxuICByZXR1cm4gbmV4dFVzZXIgYXMgUGFydGlhbDxVc2VyPjtcbn07XG5cbmNvbnN0IHN5bmNTdG9yZWRTZXNzaW9uID0gYXN5bmMgKGZsdXg6IEZsdXhGcmFtZXdvcmssIHNlc3Npb25QYXRjaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgY29uc3QgY3VycmVudFNlc3Npb24gPSAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHN0b3JlU2Vzc2lvbihmbHV4LCB7Li4uY3VycmVudFNlc3Npb24sIC4uLnNlc3Npb25QYXRjaH0pO1xufTtcblxuY29uc3QgZ2V0U2Vzc2lvblBheWxvYWQgPSAocGF5bG9hZDogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgaWYocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgJ3Nlc3Npb24nIGluIChwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIHJldHVybiAoKChwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zZXNzaW9uKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gKHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnID8gcGF5bG9hZCA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmNvbnN0IGdldEZpZWxkUm9vdCA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IGZpZWxkLnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKi8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXSA6ICcnO1xufTtcblxuY29uc3Qgc2FuaXRpemVVc2VyUHJvcHMgPSAocHJvcHM6IHN0cmluZ1tdID0gW10sIGZhbGxiYWNrUHJvcHM6IHN0cmluZ1tdID0gREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzYW5pdGl6ZWQgPSBwcm9wcy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldEZpZWxkUm9vdChmaWVsZCk7XG5cbiAgICBpZighcm9vdCB8fCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMuaGFzKHJvb3QpIHx8IHNlZW4uaGFzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgc2Vlbi5hZGQoZmllbGQpO1xuICAgIGxpc3QucHVzaChmaWVsZCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcblxuICBpZihzYW5pdGl6ZWQubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tQcm9wcy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldEZpZWxkUm9vdChmaWVsZCk7XG5cbiAgICBpZighcm9vdCB8fCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMuaGFzKHJvb3QpIHx8IHNlZW4uaGFzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgc2Vlbi5hZGQoZmllbGQpO1xuICAgIGxpc3QucHVzaChmaWVsZCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbn07XG5cbmNvbnN0IGdldEludmFsaWRGaWVsZHMgPSAoZXJyb3I6IHVua25vd24pOiBTZXQ8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGVycm9ycyA9IChlcnJvciBhcyBhbnkpPy5lcnJvcnMgfHwgKGVycm9yIGFzIGFueSk/LnNvdXJjZT8uZXJyb3JzIHx8IFtdO1xuICBjb25zdCBpbnZhbGlkRmllbGRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZXJyb3JzLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogaXRlbT8ubWVzc2FnZSB8fCAnJztcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBJTlZBTElEX0ZJRUxEX1JFR0VYLmV4ZWMobWVzc2FnZSk7XG5cbiAgICB3aGlsZShtYXRjaCkge1xuICAgICAgaW52YWxpZEZpZWxkcy5hZGQobWF0Y2hbMV0pO1xuICAgICAgbWF0Y2ggPSBJTlZBTElEX0ZJRUxEX1JFR0VYLmV4ZWMobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgSU5WQUxJRF9GSUVMRF9SRUdFWC5sYXN0SW5kZXggPSAwO1xuICB9KTtcblxuICByZXR1cm4gaW52YWxpZEZpZWxkcztcbn07XG5cbmNvbnN0IHdpdGhJbnZhbGlkRmllbGRSZXRyeSA9IGFzeW5jIDxUPihcbiAgcmVxdWVzdFdpdGhQcm9wczogKHByb3BzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxUPixcbiAgcHJvcHM6IHN0cmluZ1tdLFxuICBmYWxsYmFja1Byb3BzOiBzdHJpbmdbXSA9IERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbik6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBzYWZlUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdFdpdGhQcm9wcyhzYWZlUHJvcHMpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgY29uc3QgaW52YWxpZEZpZWxkcyA9IGdldEludmFsaWRGaWVsZHMoZXJyb3IpO1xuXG4gICAgaWYoaW52YWxpZEZpZWxkcy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVByb3BzID0gc2FmZVByb3BzLmZpbHRlcigoZmllbGQpID0+ICFpbnZhbGlkRmllbGRzLmhhcyhnZXRGaWVsZFJvb3QoZmllbGQpKSk7XG5cbiAgICBpZihyZXRyeVByb3BzLmxlbmd0aCA9PT0gMCB8fCByZXRyeVByb3BzLmxlbmd0aCA9PT0gc2FmZVByb3BzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoUHJvcHMocmV0cnlQcm9wcyk7XG4gIH1cbn07XG5cbmV4cG9ydCB0eXBlIFVzZXJBZGFwdGVyT3B0aW9ucyA9IEJhc2VBZGFwdGVyT3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSB1c2VyQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSB1c2VyQWRhcHRlck9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFwaVJlc3VsdHNUeXBlIHtcbiAgcmVhZG9ubHkgdXNlcnM6IHtcbiAgICByZWFkb25seSBhY3RpdmVDb3VudD86IG51bWJlcjtcbiAgICByZWFkb25seSBhZGRVc2VyPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBjb25maXJtQ29kZT86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZGVhY3RpdmF0ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZm9yZ290UGFzc3dvcmQ/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGl0ZW1CeUlkPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBnZXRVc2VyQnlTZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBpdGVtQnlTZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBpdGVtQnlUb2tlbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VXNlcm5hbWU/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGdldFVzZXJMaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3Q/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5Q29ubmVjdGlvbj86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlMYXRlc3Q/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5UmVhY3Rpb25zPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVRhZ3M/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgc2VhcmNoPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHJlZnJlc2hTZXNzaW9uPzogU2Vzc2lvblR5cGU7XG4gICAgcmVhZG9ubHkgcmVtb3ZlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSByZXNldFBhc3N3b3JkPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzYXZlQmlsbGluZ0NhcmQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNlc3Npb24/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25Jbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgc2lnblVwPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBkZWxldGVCaWxsaW5nQ2FyZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSB1cGRhdGVVc2VyPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSB1cGRhdGVQYXNzd29yZD86IFBhcnRpYWw8Ym9vbGVhbj47XG4gICAgcmVhZG9ubHkgdXBkYXRlUGxhbj86IFBhcnRpYWw8VXNlcj47XG4gIH07XG59XG5cbmNvbnN0IGRlZmF1bHRVc2VyVmFsaWRhdG9yID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlVXNlcklucHV0KGlucHV0KTtcblxuICBpZihvcHRpb25zPy5zdHJpY3QgJiYgIXZhbGlkYXRlZC51c2VybmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVXNlcm5hbWUgaXMgcmVxdWlyZWQgaW4gc3RyaWN0IG1vZGUnKTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIHVzZXJBY3Rpb25zIHtcbiAgYWRkVXNlcjogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGNvbmZpcm1Db2RlOiAoY29kZTogbnVtYmVyLCB7dHlwZSwgdmFsdWV9OiB7dHlwZTogJ2VtYWlsJyB8ICdwaG9uZSc7IHZhbHVlOiBzdHJpbmd9LCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBjb25maXJtU2lnblVwOiAoY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyOiAocmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgY3VycmVudFVzZXI6IChyZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBsaXN0OiAodXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5Q29ubmVjdGlvbjogKHVzZXJJZDogc3RyaW5nLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgaXRlbUJ5SWQ6ICh1c2VySWQ6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGRlbGV0ZUJpbGxpbmdDYXJkOiAodXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3RCeUxhdGVzdDogKHVzZXJuYW1lPzogc3RyaW5nLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5UmVhY3Rpb25zOiAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZWFjdGlvbk5hbWVzOiBzdHJpbmdbXSxcbiAgICBmcm9tPzogbnVtYmVyLFxuICAgIHRvPzogbnVtYmVyLFxuICAgIHBlcnNvbmFQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXJbXT47XG4gIGxpc3RCeVRhZ3M6IChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHRhZ05hbWVzOiBzdHJpbmdbXSxcbiAgICBmcm9tPzogbnVtYmVyLFxuICAgIHRvPzogbnVtYmVyLFxuICAgIHBlcnNvbmFQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXJbXT47XG4gIGZvcmdvdFBhc3N3b3JkOiAodXNlcm5hbWU6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgaXNMb2dnZWRJbjogKCkgPT4gYm9vbGVhbjtcbiAgcmVmcmVzaFNlc3Npb246ICh0b2tlbj86IHN0cmluZywgZXhwaXJlcz86IG51bWJlciwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxTZXNzaW9uVHlwZT47XG4gIHJlbW92ZTogKHVzZXJJZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICByZXNldFBhc3N3b3JkOiAodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgc2Vzc2lvbjogKHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBzYXZlQmlsbGluZ0NhcmQ6IChjYXJkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHNpZ25JbjogKHVzZXI6IFBhcnRpYWw8VXNlcj4sIGV4cGlyZXM/OiBudW1iZXIsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICBzaWduT3V0OiAocmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgc2lnblVwOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgdXBkYXRlUGFzc3dvcmQ6IChwYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICB1cGRhdGVVc2VyOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgdXBkYXRlUGxhbjogKHBsYW5JZDogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgdXBkYXRlVXNlckFkYXB0ZXI6IChhZGFwdGVyOiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IGFueSkgPT4gdm9pZDtcbiAgdXBkYXRlVXNlckFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogVXNlckFkYXB0ZXJPcHRpb25zKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlVXNlckFjdGlvbnMgPSAoXG4gIGZsdXg6IEZsdXhGcmFtZXdvcmssXG4gIG9wdGlvbnM/OiBVc2VyQWN0aW9uc09wdGlvbnNcbik6IHVzZXJBY3Rpb25zID0+IHtcbiAgY29uc3QgdXNlckJhc2UgPSBjcmVhdGVCYXNlQWN0aW9ucyhmbHV4LCBkZWZhdWx0VXNlclZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LnVzZXJBZGFwdGVyLFxuICAgIGFkYXB0ZXJPcHRpb25zOiBvcHRpb25zPy51c2VyQWRhcHRlck9wdGlvbnNcbiAgfSk7XG4gIGNvbnN0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMgPSBhc3luYyAodXNlcklkID0gJycpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3VzZXIubGlzdCcpO1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0QnlMYXRlc3QnKTtcbiAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3VzZXIubGlzdEJ5VGFncycpO1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5zZWFyY2gnKTtcbiAgICBpZih1c2VySWQpIHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdXNlci5pdGVtQnlJZDoke3VzZXJJZH1gKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYWRkVXNlciA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHt1c2VybmFtZSwgZW1haWwsIHBhc3N3b3JkfSA9IHVzZXJJbnB1dDtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3QgdXNlciA9IGRhdGE/LnVzZXJzPy5hZGRVc2VyIHx8IHt9O1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyh1c2VyUHJvcHMsIFtcbiAgICAgICdhZGRlZCcsXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnZG9iJyxcbiAgICAgICdjaXR5JyxcbiAgICAgICdjb3VudHJ5JyxcbiAgICAgICdnZW5kZXInLFxuICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICdsYXRpdHVkZScsXG4gICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3N0YXRlJyxcbiAgICAgICd0aHVtYlVybCcsXG4gICAgICAndXNlckFjY2VzcycsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZSdcbiAgICBdKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2FkZFVzZXInLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2lnblVwID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBlbWFpbCwgcGFzc3dvcmR9ID0gdXNlcklucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgZXhwaXJlczoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IDE1XG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVXNlckFwaVJlc3VsdHNUeXBlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gZGF0YT8udXNlcnM/LnNpZ25VcCB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnYWRkZWQnLFxuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2lnblVwJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX1VQX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgdXBkYXRlSW5wdXQgPSBzYW5pdGl6ZVVwZGF0ZVVzZXJJbnB1dCh1c2VySW5wdXQsIChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCB7fSkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBjb25zdCB7XG4gICAgICBiaXJ0aGRhdGUsXG4gICAgICBkb2IsXG4gICAgICBlbWFpbCxcbiAgICAgIGZpcnN0TmFtZSxcbiAgICAgIGdlbmRlcixcbiAgICAgIGxhc3ROYW1lLFxuICAgICAgbWFpbGluZ0xpc3QsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHBob25lLFxuICAgICAgdXNlcklkLFxuICAgICAgdXNlcm5hbWVcbiAgICB9ID0gdXBkYXRlSW5wdXQ7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBiaXJ0aGRhdGU6IGJpcnRoZGF0ZSA/PyBkb2IsXG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgZmlyc3ROYW1lLFxuICAgICAgICAgIGdlbmRlcixcbiAgICAgICAgICBsYXN0TmFtZSxcbiAgICAgICAgICBtYWlsaW5nTGlzdCxcbiAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlcnMgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzO1xuICAgICAgY29uc3QgbGVnYWN5VXNlciA9IHVzZXJzPy51cGRhdGUgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVXNlciA9IHVzZXJzPy51cGRhdGVVc2VyIHx8IHt9O1xuICAgICAgY29uc3QgdXNlciA9IGhhc1Nlc3Npb25JZGVudGl0eSh1cGRhdGVkVXNlcikgPyB1cGRhdGVkVXNlciA6IGxlZ2FjeVVzZXI7XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdhZGRlZCcsXG4gICAgICAnYmlydGhkYXRlJyxcbiAgICAgICdjaXR5JyxcbiAgICAgICdjb3VudHJ5JyxcbiAgICAgICdlbWFpbCcsXG4gICAgICAnZmlyc3ROYW1lJyxcbiAgICAgICdnZW5kZXInLFxuICAgICAgJ2ltYWdlQ291bnQnLFxuICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICdsYXN0TmFtZScsXG4gICAgICAnbGF0aXR1ZGUnLFxuICAgICAgJ2xvbmdpdHVkZScsXG4gICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdwaG9uZScsXG4gICAgICAnc3RhdGUnLFxuICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZVVzZXInLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoU3RyaW5nKHVzZXJJZCB8fCAnJykpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjb25maXJtQ29kZSA9IGFzeW5jIChcbiAgICBjb2RlOiBudW1iZXIsXG4gICAge3R5cGUsIHZhbHVlfToge3R5cGU6ICdlbWFpbCcgfCAncGhvbmUnOyB2YWx1ZTogc3RyaW5nfSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGNvZGU6IHtcbiAgICAgICAgdHlwZTogJ0ludCEnLFxuICAgICAgICB2YWx1ZTogY29kZVxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oZmx1eCwgJ2NvbmZpcm1Db2RlJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgW10pO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9ICEhZGF0YT8udXNlcnM/LmNvbmZpcm1Db2RlO1xuXG4gICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7Y29uZmlybWVkLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5DT05GSVJNX1NJR05fVVBfU1VDQ0VTU30pO1xuXG4gICAgcmV0dXJuIGNvbmZpcm1lZDtcbiAgfTtcblxuICBjb25zdCByZW1vdmUgPSBhc3luYyAodXNlcklkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VySWQ6IHtcbiAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgIHZhbHVlOiB1c2VySWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5yZW1vdmUgfHwge307XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuUkVNT1ZFX0lURU1fU1VDQ0VTUywgdXNlcn0pO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKGZsdXgsICdyZW1vdmUnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbXSwge29uU3VjY2Vzc30pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHVzZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhc3luYyAodXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcj4gPT4gd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgIGFzeW5jIChzZXNzaW9uUHJvcHMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcHBRdWVyeShcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFVzZXJCeVNlc3Npb24nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHt9LFxuICAgICAgICBzZXNzaW9uUHJvcHNcbiAgICAgICkgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeVNlc3Npb24/OiBQYXJ0aWFsPFVzZXI+fTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IGRhdGE/LnVzZXJzPy5nZXRVc2VyQnlTZXNzaW9uIHx8IHt9O1xuXG4gICAgICBpZighaGFzU2Vzc2lvbklkZW50aXR5KHNlc3Npb25EYXRhKSkge1xuICAgICAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9TRVNTSU9OX0VSUk9SfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZF9zZXNzaW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgc2Vzc2lvbkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjogbmV4dFNlc3Npb24sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9TRVNTSU9OX1NVQ0NFU1N9KTtcbiAgICAgIGF3YWl0IHN5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbihmbHV4LCBTdHJpbmcoKG5leHRTZXNzaW9uIGFzIGFueSk/LnBlcnNvbmFJZCB8fCAnJykpO1xuICAgICAgcmV0dXJuIGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCBuZXh0U2Vzc2lvbikgfHwgbmV4dFNlc3Npb24pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSBhcyBVc2VyO1xuICAgIH0sXG4gICAgdXNlclByb3BzLFxuICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgKTtcblxuICBjb25zdCBpdGVtQnlJZCA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcj4oZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCwge3VzZXJJZCwgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VySWQ6IHtcbiAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgIHZhbHVlOiB1c2VySWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGdldFVzZXJCeUlkID0gKChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlICYge1xuICAgICAgICB1c2Vycz86IHtnZXRVc2VyQnlJZD86IFBhcnRpYWw8VXNlcj59O1xuICAgICAgfSk/LnVzZXJzPy5nZXRVc2VyQnlJZCkgfHwge307XG5cbiAgICAgIGlmKHVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIGdldFVzZXJCeUlkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe3R5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9JVEVNX1NVQ0NFU1MsIHVzZXI6IGdldFVzZXJCeUlkfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnZ2V0VXNlckJ5SWQnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXI+KGZsdXgsIGB1c2VyLml0ZW1CeUlkOiR7dXNlcklkfWAsIHt1c2VySWQsIHVzZXJQcm9wc30sIHJlc3VsdCBhcyBVc2VyLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3Qgc2F2ZUJpbGxpbmdDYXJkID0gYXN5bmMgKFxuICAgIGNhcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGNhcmQ6IHtcbiAgICAgICAgdHlwZTogJ0NyZWRpdENhcmRJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogY2FyZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5zYXZlQmlsbGluZ0NhcmQpIHx8IHt9O1xuXG4gICAgICBpZigodXNlciBhcyBhbnkpPy51c2VySWQgJiYgKHVzZXIgYXMgYW55KS51c2VySWQgPT09IGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSkge1xuICAgICAgICBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCB1c2VyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3NhdmVCaWxsaW5nQ2FyZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhzZXNzaW9uVXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlQmlsbGluZ0NhcmQgPSBhc3luYyAoXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gKChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LmRlbGV0ZUJpbGxpbmdDYXJkKSB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdzdHJpcGVDYXJkQnJhbmQnLFxuICAgICAgJ3N0cmlwZUNhcmRJZCcsXG4gICAgICAnc3RyaXBlQ2FyZExhc3Q0JyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBTdHJpbmcoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpIHx8ICcnKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdkZWxldGVCaWxsaW5nQ2FyZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAge30sXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhzZXNzaW9uVXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlUGxhbiA9IGFzeW5jIChcbiAgICBwbGFuSWQ6IHN0cmluZyxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgbmV4dFBsYW5JZCA9IFN0cmluZyhwbGFuSWQgfHwgJycpLnRyaW0oKTtcblxuICAgIGlmKCFuZXh0UGxhbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egc3Vic2NyaXB0aW9uIHBsYW5JZCBpcyByZXF1aXJlZCB0byB1cGRhdGUgYSB1c2VyIHBsYW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHBsYW5JZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IG5leHRQbGFuSWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8udXBkYXRlUGxhbikgfHwge307XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAncGxhbkV4cGlyZXMnLFxuICAgICAgJ3BsYW5JZCcsXG4gICAgICAncGxhblN0YXR1cycsXG4gICAgICAncGxhblN1YnNjcmlwdGlvbklkJyxcbiAgICAgICdzdHJpcGVDYXJkQnJhbmQnLFxuICAgICAgJ3N0cmlwZUNhcmRJZCcsXG4gICAgICAnc3RyaXBlQ2FyZExhc3Q0JyxcbiAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBTdHJpbmcoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpIHx8ICcnKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICd1cGRhdGVQbGFuJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0ID0gYXN5bmMgKHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSwgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0Jywge3VzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8uZ2V0VXNlckxpc3QgfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ2dldFVzZXJMaXN0JywgREFUQV9UWVBFLCB7fSwgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3QnLCB7dXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUxhdGVzdCA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nID0gJycsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeUxhdGVzdCcsIHt1c2VybmFtZSwgZnJvbSwgdG8sIHVzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgZnJvbToge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IGZyb21cbiAgICAgIH0sXG4gICAgICB0bzoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IHRvXG4gICAgICB9LFxuICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgIHZhbHVlOiB1c2VybmFtZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgbGlzdCA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/Lmxpc3RCeUxhdGVzdCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnbGlzdEJ5TGF0ZXN0JywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeUxhdGVzdCcsIHt1c2VybmFtZSwgZnJvbSwgdG8sIHVzZXJQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBsaXN0QnlDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT5cbiAgICBbXVxuICA7XG5cbiAgY29uc3QgbGlzdEJ5UmVhY3Rpb25zID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcGVyc29uYVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PlxuICAgIFtdXG4gIDtcblxuICBjb25zdCBsaXN0QnlUYWdzID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgdGFnTmFtZXM6IHN0cmluZ1tdLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHBlcnNvbmFQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0QnlUYWdzJywge3VzZXJuYW1lLCB0YWdOYW1lcywgZnJvbSwgdG8sIHBlcnNvbmFQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgZnJvbToge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IGZyb21cbiAgICAgIH0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIHR5cGU6ICdbU3RyaW5nIV0nLFxuICAgICAgICB2YWx1ZTogdGFnTmFtZXNcbiAgICAgIH0sXG4gICAgICB0bzoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IHRvXG4gICAgICB9LFxuICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgIHZhbHVlOiB1c2VybmFtZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgbGlzdCA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/Lmxpc3RCeVRhZ3MgfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ2xpc3RCeVRhZ3MnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICBwZXJzb25hUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5VGFncycsIHt1c2VybmFtZSwgdGFnTmFtZXMsIGZyb20sIHRvLCBwZXJzb25hUHJvcHN9LCByZXN1bHQgYXMgVXNlcltdLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3Qgc2VhcmNoID0gYXN5bmMgKHF1ZXJ5OiBzdHJpbmcsIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSwgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5zZWFyY2gnLCB7cXVlcnksIHVzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogcXVlcnlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5zZWFyY2ggfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ3NlYXJjaCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5zZWFyY2gnLCB7cXVlcnksIHVzZXJQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBpc0xvZ2dlZEluID0gKCk6IGJvb2xlYW4gPT4gaXNMb2dnZWRJbldpdGhTdG9yYWdlKGZsdXgpO1xuXG4gIGNvbnN0IGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlciA9IGFzeW5jIChyZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlKGZsdXgpO1xuICAgIHJldHVybiAoc2Vzc2lvbiB8fCB7fSkgYXMgVXNlcjtcbiAgfTtcblxuICBjb25zdCBjdXJyZW50VXNlciA9IGFzeW5jIChyZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcj4gPT4gY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyKHJlcXVlc3RPcHRpb25zKTtcblxuICBjb25zdCByZWZyZXNoU2Vzc2lvbkFjdGlvbiA9IGFzeW5jICh0b2tlbj86IHN0cmluZywgZXhwaXJlcz86IG51bWJlciwgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFNlc3Npb25UeXBlPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVmcmVzaFNlc3Npb24oZmx1eCwgdG9rZW4sIGV4cGlyZXMpO1xuICAgIHJldHVybiAocmVzdWx0Py5yZWZyZXNoU2Vzc2lvbiB8fCB7fSkgYXMgU2Vzc2lvblR5cGU7XG4gIH07XG5cbiAgY29uc3Qgc2lnbkluID0gYXN5bmMgKFxuICAgIHVzZXI6IFBhcnRpYWw8VXNlcj4sXG4gICAgZXhwaXJlcz86IG51bWJlcixcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFNlc3Npb25UeXBlPiA9PiB7XG4gICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWUsIHBhc3N3b3JkfSA9IHVzZXI7XG4gICAgbGV0IHVzZXJJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGxlZ2FjeVZhcmlhYmxlczogUmVjb3JkPHN0cmluZywge3R5cGU6IHN0cmluZzsgdmFsdWU6IHVua25vd259PiB8IHVuZGVmaW5lZDtcblxuICAgIGlmKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICB1c2VySW5wdXQgPSB7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYoZW1haWwgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXJJbnB1dCA9IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIHBhc3N3b3JkXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZihwaG9uZSAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlcklucHV0ID0ge1xuICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgcGhvbmVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlcm5hbWUsIGVtYWlsLCBvciBwaG9uZSBudW1iZXIgYW5kIHBhc3N3b3JkIGFyZSByZXF1aXJlZCB0byBzaWduIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbUZsdXgoZmx1eCk7XG4gICAgY29uc3QgcmVxdWVzdGVkRXhwaXJlcyA9IE1hdGgubWF4KDEsIE51bWJlcihleHBpcmVzIHx8IGNvbmZpZy5hcHA/LnNlc3Npb24/Lm1heE1pbnV0ZXMgfHwgMTUpKTtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQgPSB7XG4gICAgICBleHBpcmVzOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogcmVxdWVzdGVkRXhwaXJlc1xuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogdXNlcklucHV0XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VycyA9IChkYXRhIGFzIGFueSk/LnVzZXJzO1xuICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBub3JtYWxpemVTZXNzaW9uKHVzZXJzPy5zaWduSW4gfHwge30pO1xuICAgICAgY29uc3Qgc3RvcmVkU2Vzc2lvbiA9IGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHNlc3Npb25EYXRhKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlc3Npb246IHN0b3JlZFNlc3Npb24sXG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fU1VDQ0VTU1xuICAgICAgfSBhcyBGbHV4QWN0aW9uO1xuICAgIH07XG5cbiAgICBjb25zdCBwZXJmb3JtU2lnbkluID0gYXN5bmMgKHF1ZXJ5VmFyaWFibGVzOiBhbnkpOiBQcm9taXNlPFNlc3Npb25UeXBlPiA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uUmVzdWx0ID0gYXdhaXQgcHVibGljTXV0YXRpb248U2Vzc2lvblR5cGUgJiBVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2lnbkluJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWydleHBpcmVzJywgJ2lzc3VlZCcsICd0b2tlbicsICd1c2VySWQnLCAndXNlcm5hbWUnXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgICBjb25zdCBiYXNlU2Vzc2lvbiA9IGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIGdldFNlc3Npb25QYXlsb2FkKHNlc3Npb25SZXN1bHQpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWRTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbihbJ3VzZXJJZCcsICdwZXJzb25hSWQnLCAndXNlckFjY2VzcycsICd1c2VybmFtZSddLCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgICAgIGF3YWl0IHN5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbihmbHV4LCBTdHJpbmcoKGh5ZHJhdGVkU2Vzc2lvbiBhcyBhbnkpPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgYmFzZVNlc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBzZXNzaW9uOiBmYWxsYmFja1Nlc3Npb24sXG4gICAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tTZXNzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaW5hbFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIGJhc2VTZXNzaW9uKSB8fCBiYXNlU2Vzc2lvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICk7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgc2Vzc2lvbjogZmluYWxTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpbmFsU2Vzc2lvbjtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwZXJmb3JtU2lnbkluKHF1ZXJ5VmFyaWFibGVzV2l0aFVzZXJJbnB1dCk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKFN0cmluZygodXNlciBhcyBhbnkpPy51c2VySWQgfHwgJycpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2lnbk91dCA9IGFzeW5jIChyZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGF3YWl0IGNsZWFyUGVyc2lzdGVkU2Vzc2lvbihmbHV4KTtcbiAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtzZXNzaW9uOiB7fSwgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9PVVRfU1VDQ0VTU30pO1xuICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBjb25maXJtU2lnblVwID0gYXN5bmMgKGNvZGU6IHN0cmluZywgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHRydWU7XG5cbiAgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAodXNlcm5hbWU6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsOiB1c2VybmFtZSxcbiAgICAgICAgICBwaG9uZTogdXNlcm5hbWUsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YT86IFVzZXJBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LmZvcmdvdFBhc3N3b3JkO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBzdWNjZXNzID8gVVNFUl9DT05TVEFOVFMuRk9SR09UX1BBU1NXT1JEX1NVQ0NFU1MgOiBVU0VSX0NPTlNUQU5UUy5GT1JHT1RfUEFTU1dPUkRfRVJST1JcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAnZm9yZ290UGFzc3dvcmQnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbXSwge29uU3VjY2Vzc30pLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5mb3Jnb3RQYXNzd29yZDtcbiAgICAgIGlmKCFzdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yZ290X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVzZXRQYXNzd29yZCA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY29kZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiBjb2RlXG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgLi4uKHR5cGUgPT09ICdlbWFpbCcgPyB7ZW1haWw6IHVzZXJuYW1lfSA6IHtwaG9uZTogdXNlcm5hbWV9KSxcbiAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhPzogVXNlckFwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gISFkYXRhPy51c2Vycz8ucmVzZXRQYXNzd29yZDtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogc3VjY2VzcyA/IFVTRVJfQ09OU1RBTlRTLlJFU0VUX1BBU1NXT1JEX1NVQ0NFU1MgOiBVU0VSX0NPTlNUQU5UUy5SRVNFVF9QQVNTV09SRF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KGZsdXgsICdyZXNldFBhc3N3b3JkJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgW10sIHtvblN1Y2Nlc3N9KS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gISFkYXRhPy51c2Vycz8ucmVzZXRQYXNzd29yZDtcbiAgICAgIGlmKCFzdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVzZXRfcGFzc3dvcmRfZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IGFzeW5jIChwYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICB0cnVlXG4gIDtcblxuICByZXR1cm4ge1xuICAgIGFkZFVzZXIsXG4gICAgY29uZmlybUNvZGUsXG4gICAgY29uZmlybVNpZ25VcCxcbiAgICBjdXJyZW50QXV0aGVudGljYXRlZFVzZXIsXG4gICAgY3VycmVudFVzZXIsXG4gICAgZGVsZXRlQmlsbGluZ0NhcmQsXG4gICAgbGlzdCxcbiAgICBmb3Jnb3RQYXNzd29yZCxcbiAgICBpc0xvZ2dlZEluLFxuICAgIGl0ZW1CeUlkLFxuICAgIGxpc3RCeUNvbm5lY3Rpb24sXG4gICAgbGlzdEJ5TGF0ZXN0LFxuICAgIGxpc3RCeVJlYWN0aW9ucyxcbiAgICBsaXN0QnlUYWdzLFxuICAgIHJlZnJlc2hTZXNzaW9uOiByZWZyZXNoU2Vzc2lvbkFjdGlvbixcbiAgICByZW1vdmUsXG4gICAgcmVzZXRQYXNzd29yZCxcbiAgICBzYXZlQmlsbGluZ0NhcmQsXG4gICAgc2VhcmNoLFxuICAgIHNlc3Npb24sXG4gICAgc2lnbkluLFxuICAgIHNpZ25PdXQsXG4gICAgc2lnblVwLFxuICAgIHVwZGF0ZVBhc3N3b3JkLFxuICAgIHVwZGF0ZVVzZXIsXG4gICAgdXBkYXRlUGxhbixcbiAgICB1cGRhdGVVc2VyQWRhcHRlcjogdXNlckJhc2UudXBkYXRlQWRhcHRlcixcbiAgICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IHVzZXJCYXNlLnVwZGF0ZU9wdGlvbnNcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsidmFsaWRhdGVVc2VySW5wdXQiLCJVU0VSX0NPTlNUQU5UUyIsImFwcE11dGF0aW9uIiwiYXBwUXVlcnkiLCJwdWJsaWNNdXRhdGlvbiIsInJlZnJlc2hTZXNzaW9uIiwiY3JlYXRlQmFzZUFjdGlvbnMiLCJjbGVhclBlcnNpc3RlZFNlc3Npb24iLCJoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlIiwiaXNMb2dnZWRJbiIsImlzTG9nZ2VkSW5XaXRoU3RvcmFnZSIsIm5vcm1hbGl6ZVNlc3Npb24iLCJzdG9yZVNlc3Npb24iLCJnZXRDb25maWdGcm9tRmx1eCIsImNsZWFyQ2FjaGVkUmVxdWVzdCIsImdldENhY2hlZFJlcXVlc3QiLCJzZXRDYWNoZWRSZXF1ZXN0Iiwic3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uIiwiREFUQV9UWVBFIiwiREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyIsIlNFTlNJVElWRV9VU0VSX0ZJRUxEUyIsIlNldCIsIklOVkFMSURfRklFTERfUkVHRVgiLCJoYXNTZXNzaW9uSWRlbnRpdHkiLCJ1c2VyIiwiX2lkIiwidXNlcklkIiwidXNlcm5hbWUiLCJlbWFpbCIsInNhbml0aXplVXBkYXRlVXNlcklucHV0IiwidXNlcklucHV0IiwiY3VycmVudFNlc3Npb24iLCJuZXh0VXNlciIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJmaWVsZCIsInZhbHVlIiwidW5kZWZpbmVkIiwicGFzc3dvcmQiLCJTdHJpbmciLCJ0cmltIiwiY3VycmVudFZhbHVlIiwic3luY1N0b3JlZFNlc3Npb24iLCJmbHV4Iiwic2Vzc2lvblBhdGNoIiwiZ2V0U3RhdGUiLCJnZXRTZXNzaW9uUGF5bG9hZCIsInBheWxvYWQiLCJzZXNzaW9uIiwiZ2V0RmllbGRSb290IiwidHJpbW1lZCIsIm1hdGNoIiwic2FuaXRpemVVc2VyUHJvcHMiLCJwcm9wcyIsImZhbGxiYWNrUHJvcHMiLCJzZWVuIiwic2FuaXRpemVkIiwibGlzdCIsInJvb3QiLCJoYXMiLCJhZGQiLCJwdXNoIiwibGVuZ3RoIiwiZ2V0SW52YWxpZEZpZWxkcyIsImVycm9yIiwiZXJyb3JzIiwic291cmNlIiwiaW52YWxpZEZpZWxkcyIsImZvckVhY2giLCJpdGVtIiwibWVzc2FnZSIsImV4ZWMiLCJsYXN0SW5kZXgiLCJ3aXRoSW52YWxpZEZpZWxkUmV0cnkiLCJyZXF1ZXN0V2l0aFByb3BzIiwic2FmZVByb3BzIiwic2l6ZSIsInJldHJ5UHJvcHMiLCJmaWx0ZXIiLCJkZWZhdWx0VXNlclZhbGlkYXRvciIsImlucHV0Iiwib3B0aW9ucyIsInZhbGlkYXRlZCIsInN0cmljdCIsIkVycm9yIiwiY3JlYXRlVXNlckFjdGlvbnMiLCJ1c2VyQmFzZSIsImFkYXB0ZXIiLCJ1c2VyQWRhcHRlciIsImFkYXB0ZXJPcHRpb25zIiwidXNlckFkYXB0ZXJPcHRpb25zIiwiY2xlYXJVc2VyUmVxdWVzdENhY2hlcyIsImFkZFVzZXIiLCJ1c2VyUHJvcHMiLCJyZXF1ZXN0T3B0aW9ucyIsInF1ZXJ5VmFyaWFibGVzIiwidHlwZSIsIm9uU3VjY2VzcyIsImRhdGEiLCJ1c2VycyIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsInJldHVyblByb3BzIiwic2lnblVwIiwiZXhwaXJlcyIsIlNJR05fVVBfU1VDQ0VTUyIsIlNJR05fVVBfRVJST1IiLCJ1cGRhdGVVc2VyIiwidXBkYXRlSW5wdXQiLCJiaXJ0aGRhdGUiLCJkb2IiLCJmaXJzdE5hbWUiLCJnZW5kZXIiLCJsYXN0TmFtZSIsIm1haWxpbmdMaXN0IiwicGhvbmUiLCJsZWdhY3lVc2VyIiwidXBkYXRlIiwidXBkYXRlZFVzZXIiLCJVUERBVEVfSVRFTV9TVUNDRVNTIiwiY29uZmlybUNvZGUiLCJjb2RlIiwiY29uZmlybWVkIiwiQ09ORklSTV9TSUdOX1VQX1NVQ0NFU1MiLCJyZW1vdmUiLCJSRU1PVkVfSVRFTV9TVUNDRVNTIiwic2Vzc2lvblByb3BzIiwic2Vzc2lvbkRhdGEiLCJnZXRVc2VyQnlTZXNzaW9uIiwiR0VUX1NFU1NJT05fRVJST1IiLCJuZXh0U2Vzc2lvbiIsIkdFVF9TRVNTSU9OX1NVQ0NFU1MiLCJwZXJzb25hSWQiLCJpdGVtQnlJZCIsImNhY2hlZFJlc3VsdCIsImdldFVzZXJCeUlkIiwiR0VUX0lURU1fU1VDQ0VTUyIsInJlc3VsdCIsInNhZmVVc2VyUHJvcHMiLCJzYXZlQmlsbGluZ0NhcmQiLCJjYXJkIiwic2Vzc2lvblVzZXJJZCIsImRlbGV0ZUJpbGxpbmdDYXJkIiwidXBkYXRlUGxhbiIsInBsYW5JZCIsIm5leHRQbGFuSWQiLCJnZXRVc2VyTGlzdCIsIkdFVF9MSVNUX1NVQ0NFU1MiLCJsaXN0QnlMYXRlc3QiLCJmcm9tIiwidG8iLCJsaXN0QnlDb25uZWN0aW9uIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lcyIsInBlcnNvbmFQcm9wcyIsImxpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInRhZ3MiLCJzZWFyY2giLCJxdWVyeSIsImN1cnJlbnRBdXRoZW50aWNhdGVkVXNlciIsImN1cnJlbnRVc2VyIiwicmVmcmVzaFNlc3Npb25BY3Rpb24iLCJ0b2tlbiIsInNpZ25JbiIsImxlZ2FjeVZhcmlhYmxlcyIsImNvbmZpZyIsInJlcXVlc3RlZEV4cGlyZXMiLCJNYXRoIiwibWF4IiwiTnVtYmVyIiwiYXBwIiwibWF4TWludXRlcyIsInF1ZXJ5VmFyaWFibGVzV2l0aFVzZXJJbnB1dCIsInN0b3JlZFNlc3Npb24iLCJTSUdOX0lOX1NVQ0NFU1MiLCJwZXJmb3JtU2lnbkluIiwic2Vzc2lvblJlc3VsdCIsImJhc2VTZXNzaW9uIiwiaHlkcmF0ZWRTZXNzaW9uIiwiZmFsbGJhY2tTZXNzaW9uIiwiZmluYWxTZXNzaW9uIiwiU0lHTl9JTl9FUlJPUiIsInNpZ25PdXQiLCJTSUdOX09VVF9TVUNDRVNTIiwiY29uZmlybVNpZ25VcCIsImZvcmdvdFBhc3N3b3JkIiwic3VjY2VzcyIsIkZPUkdPVF9QQVNTV09SRF9TVUNDRVNTIiwiRk9SR09UX1BBU1NXT1JEX0VSUk9SIiwidGhlbiIsInJlc2V0UGFzc3dvcmQiLCJSRVNFVF9QQVNTV09SRF9TVUNDRVNTIiwiUkVTRVRfUEFTU1dPUkRfRVJST1IiLCJ1cGRhdGVQYXNzd29yZCIsIm5ld1Bhc3N3b3JkIiwidXBkYXRlVXNlckFkYXB0ZXIiLCJ1cGRhdGVBZGFwdGVyIiwidXBkYXRlVXNlckFkYXB0ZXJPcHRpb25zIiwidXBkYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsaUJBQWlCLFFBQU8sNENBQTRDO0FBQzVFLFNBQVFDLGNBQWMsUUFBTyw0QkFBNEI7QUFDekQsU0FBUUMsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLGNBQWMsRUFBRUMsY0FBYyxRQUFPLHFCQUFxQjtBQUN6RixTQUFRQyxpQkFBaUIsUUFBTyxtQ0FBbUM7QUFDbkUsU0FDRUMscUJBQXFCLEVBQ3JCQyx5QkFBeUIsRUFDekJDLGNBQWNDLHFCQUFxQixFQUNuQ0MsZ0JBQWdCLEVBQ2hCQyxZQUFZLFFBQ1AseUJBQXlCO0FBQ2hDLFNBQVFDLGlCQUFpQixRQUFPLDZCQUE2QjtBQUM3RCxTQUFRQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFPLDhCQUE4QjtBQUNuRyxTQUFRQyx3QkFBd0IsUUFBTyxzQ0FBc0M7QUFRN0UsTUFBTUMsWUFBWTtBQUNsQixN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