@nlabs/reaktor 1.17.0 → 1.19.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 (320) hide show
  1. package/README.md +182 -0
  2. package/docs/ASSISTANT.md +138 -0
  3. package/docs/GENERATION.md +42 -5
  4. package/docs/NATIVE_PUSH.md +56 -0
  5. package/lib/actions/alfredFaq.d.ts +80 -0
  6. package/lib/actions/alfredFaq.js +206 -0
  7. package/lib/actions/analytics.js +1 -1
  8. package/lib/actions/apps.js +1 -1
  9. package/lib/actions/connections.js +1 -1
  10. package/lib/actions/content.js +1 -1
  11. package/lib/actions/contentGeneration.d.ts +4 -0
  12. package/lib/actions/contentGeneration.js +82 -10
  13. package/lib/actions/contentGenerationErrors.js +1 -1
  14. package/lib/actions/conversations.d.ts +1 -1
  15. package/lib/actions/conversations.js +19 -9
  16. package/lib/actions/crm.js +1 -1
  17. package/lib/actions/crud.js +26 -1
  18. package/lib/actions/databaseAccounts.js +1 -1
  19. package/lib/actions/databaseProvisioningLease.js +1 -1
  20. package/lib/actions/dynamodb.js +1 -1
  21. package/lib/actions/email.js +1 -1
  22. package/lib/actions/files.js +1 -1
  23. package/lib/actions/flags.js +1 -1
  24. package/lib/actions/geminiVideo.js +1 -1
  25. package/lib/actions/groups.js +1 -1
  26. package/lib/actions/higgsfield.js +1 -1
  27. package/lib/actions/imageGeneration.js +1 -1
  28. package/lib/actions/images.js +1 -1
  29. package/lib/actions/index.d.ts +1 -0
  30. package/lib/actions/index.js +2 -1
  31. package/lib/actions/ios.js +1 -1
  32. package/lib/actions/locations.js +1 -1
  33. package/lib/actions/messages.js +23 -7
  34. package/lib/actions/notifications.js +1 -1
  35. package/lib/actions/ollamaGeneration.js +1 -1
  36. package/lib/actions/openaiResponseSession.js +1 -1
  37. package/lib/actions/payments.js +1 -1
  38. package/lib/actions/personas.js +1 -1
  39. package/lib/actions/phoneSupport.js +1 -1
  40. package/lib/actions/posts.js +1 -1
  41. package/lib/actions/query.js +1 -1
  42. package/lib/actions/reactions.js +1 -1
  43. package/lib/actions/rum.js +1 -1
  44. package/lib/actions/s3.js +1 -1
  45. package/lib/actions/search.js +1 -1
  46. package/lib/actions/sms.js +1 -1
  47. package/lib/actions/statistics.js +1 -1
  48. package/lib/actions/subscriptions.js +1 -1
  49. package/lib/actions/tags.js +1 -1
  50. package/lib/actions/users.js +57 -4
  51. package/lib/actions/videoGeneration.js +1 -1
  52. package/lib/actions/videos.js +1 -1
  53. package/lib/adapters/arangoAdapter.js +1 -1
  54. package/lib/adapters/contentAdapter.js +1 -1
  55. package/lib/adapters/fileAdapter.js +1 -1
  56. package/lib/adapters/geminiGenerationAdapter.js +1 -1
  57. package/lib/adapters/higgsfieldAdapter.js +1 -1
  58. package/lib/adapters/higgsfieldModelCatalog.js +1 -1
  59. package/lib/adapters/higgsfieldModels.js +1 -1
  60. package/lib/adapters/imageAdapter.js +1 -1
  61. package/lib/adapters/imageGenerationAdapter.js +1 -1
  62. package/lib/adapters/index.js +1 -1
  63. package/lib/adapters/messageAdapter.js +1 -1
  64. package/lib/adapters/postAdapter.js +1 -1
  65. package/lib/adapters/reaktorAdapter.js +1 -1
  66. package/lib/adapters/tagAdapter.js +1 -1
  67. package/lib/adapters/userAdapter.js +1 -1
  68. package/lib/assistant/core.d.ts +53 -0
  69. package/lib/assistant/core.js +123 -0
  70. package/lib/assistant/faq.d.ts +26 -0
  71. package/lib/assistant/faq.js +238 -0
  72. package/lib/assistant/faqCore.d.ts +23 -0
  73. package/lib/assistant/faqCore.js +20 -0
  74. package/lib/assistant/index.d.ts +7 -0
  75. package/lib/assistant/index.js +5 -0
  76. package/lib/assistant/service.d.ts +35 -0
  77. package/lib/assistant/service.js +201 -0
  78. package/lib/config.js +1 -1
  79. package/lib/constants/collections.js +1 -1
  80. package/lib/durableChat/conversations.d.ts +62 -0
  81. package/lib/durableChat/conversations.js +729 -0
  82. package/lib/durableChat/errors.d.ts +6 -0
  83. package/lib/durableChat/errors.js +11 -0
  84. package/lib/durableChat/events.d.ts +22 -0
  85. package/lib/durableChat/events.js +50 -0
  86. package/lib/durableChat/index.d.ts +8 -0
  87. package/lib/durableChat/index.js +10 -0
  88. package/lib/durableChat/membership.d.ts +24 -0
  89. package/lib/durableChat/membership.js +85 -0
  90. package/lib/durableChat/messageTypes.d.ts +76 -0
  91. package/lib/durableChat/messageTypes.js +3 -0
  92. package/lib/durableChat/messages.d.ts +16 -0
  93. package/lib/durableChat/messages.js +257 -0
  94. package/lib/durableChat/transaction.d.ts +10 -0
  95. package/lib/durableChat/transaction.js +53 -0
  96. package/lib/durableChat/types.d.ts +81 -0
  97. package/lib/durableChat/types.js +3 -0
  98. package/lib/handlers/graphqlHandler.js +1 -1
  99. package/lib/index.d.ts +4 -4
  100. package/lib/index.js +5 -3
  101. package/lib/lambdas/actions/websockets.js +4 -4
  102. package/lib/lambdas/authorizer.js +1 -1
  103. package/lib/lambdas/connection.js +1 -1
  104. package/lib/lambdas/utils/message.js +1 -1
  105. package/lib/lambdas/utils/websocket.js +1 -1
  106. package/lib/mocks/conversation.js +1 -1
  107. package/lib/mocks/file.js +1 -1
  108. package/lib/mocks/group.js +1 -1
  109. package/lib/mocks/image.js +1 -1
  110. package/lib/mocks/post.js +1 -1
  111. package/lib/mocks/tag.js +1 -1
  112. package/lib/mocks/user.js +1 -1
  113. package/lib/mocks/video.js +1 -1
  114. package/lib/mutations/analytics/analytics.js +1 -1
  115. package/lib/mutations/content/content.js +1 -1
  116. package/lib/mutations/crm/crm.js +1 -1
  117. package/lib/mutations/events/events.js +1 -1
  118. package/lib/mutations/flags/flags.js +1 -1
  119. package/lib/mutations/groups/groups.js +1 -1
  120. package/lib/mutations/higgsfield/higgsfield.js +1 -1
  121. package/lib/mutations/images/images.js +1 -1
  122. package/lib/mutations/index.js +1 -1
  123. package/lib/mutations/locations/locations.js +1 -1
  124. package/lib/mutations/messages/messages.js +1 -1
  125. package/lib/mutations/personas/personas.js +1 -1
  126. package/lib/mutations/posts/posts.js +1 -1
  127. package/lib/mutations/reactions/reactions.js +1 -1
  128. package/lib/mutations/rum/rum.js +1 -1
  129. package/lib/mutations/statistics/statistics.js +1 -1
  130. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  131. package/lib/mutations/tags/tags.js +1 -1
  132. package/lib/mutations/users/users.js +1 -1
  133. package/lib/mutations/videos/videos.js +1 -1
  134. package/lib/nativePush/graphql.d.ts +14 -0
  135. package/lib/nativePush/graphql.js +105 -0
  136. package/lib/nativePush/index.d.ts +7 -0
  137. package/lib/nativePush/index.js +9 -0
  138. package/lib/nativePush/migrations.d.ts +2 -0
  139. package/lib/nativePush/migrations.js +36 -0
  140. package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
  141. package/lib/nativePush/nativePushContract.fixture.js +27 -0
  142. package/lib/nativePush/payload.d.ts +2 -0
  143. package/lib/nativePush/payload.js +106 -0
  144. package/lib/nativePush/repository.d.ts +9 -0
  145. package/lib/nativePush/repository.js +120 -0
  146. package/lib/nativePush/service.d.ts +2 -0
  147. package/lib/nativePush/service.js +110 -0
  148. package/lib/nativePush/snsProvider.d.ts +17 -0
  149. package/lib/nativePush/snsProvider.js +165 -0
  150. package/lib/nativePush/types.d.ts +89 -0
  151. package/lib/nativePush/types.js +3 -0
  152. package/lib/objectTypes/analytics.js +1 -1
  153. package/lib/objectTypes/app.js +1 -1
  154. package/lib/objectTypes/bankAccount.js +1 -1
  155. package/lib/objectTypes/connection.js +1 -1
  156. package/lib/objectTypes/content.js +1 -1
  157. package/lib/objectTypes/contentGeneration.js +1 -1
  158. package/lib/objectTypes/conversation.js +1 -1
  159. package/lib/objectTypes/creditCard.js +1 -1
  160. package/lib/objectTypes/crm.js +1 -1
  161. package/lib/objectTypes/document.js +1 -1
  162. package/lib/objectTypes/error.js +1 -1
  163. package/lib/objectTypes/event.js +1 -1
  164. package/lib/objectTypes/external.js +1 -1
  165. package/lib/objectTypes/file.js +1 -1
  166. package/lib/objectTypes/filter.js +1 -1
  167. package/lib/objectTypes/flag.js +1 -1
  168. package/lib/objectTypes/group.js +1 -1
  169. package/lib/objectTypes/higgsfield.js +1 -1
  170. package/lib/objectTypes/iapSubscription.js +1 -1
  171. package/lib/objectTypes/image.js +1 -1
  172. package/lib/objectTypes/imageGeneration.js +1 -1
  173. package/lib/objectTypes/index.js +1 -1
  174. package/lib/objectTypes/location.js +1 -1
  175. package/lib/objectTypes/message.js +1 -1
  176. package/lib/objectTypes/passcode.js +1 -1
  177. package/lib/objectTypes/persona.js +1 -1
  178. package/lib/objectTypes/plan.js +1 -1
  179. package/lib/objectTypes/post.js +1 -1
  180. package/lib/objectTypes/query.js +1 -1
  181. package/lib/objectTypes/reaction.js +1 -1
  182. package/lib/objectTypes/relation.js +1 -1
  183. package/lib/objectTypes/rum.js +1 -1
  184. package/lib/objectTypes/search.js +1 -1
  185. package/lib/objectTypes/statistics.js +1 -1
  186. package/lib/objectTypes/subscription.js +1 -1
  187. package/lib/objectTypes/tag.js +1 -1
  188. package/lib/objectTypes/user.js +1 -1
  189. package/lib/objectTypes/video.js +1 -1
  190. package/lib/objectTypes/videoGeneration.js +1 -1
  191. package/lib/organizations/accountLifecycle.d.ts +7 -0
  192. package/lib/organizations/accountLifecycle.js +106 -0
  193. package/lib/organizations/authorization.d.ts +9 -0
  194. package/lib/organizations/authorization.js +40 -0
  195. package/lib/organizations/billing.d.ts +38 -0
  196. package/lib/organizations/billing.js +277 -0
  197. package/lib/organizations/billingProvider.d.ts +4 -0
  198. package/lib/organizations/billingProvider.js +287 -0
  199. package/lib/organizations/billingUpdates.d.ts +9 -0
  200. package/lib/organizations/billingUpdates.js +388 -0
  201. package/lib/organizations/index.d.ts +10 -0
  202. package/lib/organizations/index.js +12 -0
  203. package/lib/organizations/mail.d.ts +10 -0
  204. package/lib/organizations/mail.js +60 -0
  205. package/lib/organizations/memberDirectory.d.ts +15 -0
  206. package/lib/organizations/memberDirectory.js +28 -0
  207. package/lib/organizations/membership.d.ts +19 -0
  208. package/lib/organizations/membership.js +248 -0
  209. package/lib/organizations/passwordRecovery.d.ts +9 -0
  210. package/lib/organizations/passwordRecovery.js +50 -0
  211. package/lib/organizations/plans.d.ts +6 -0
  212. package/lib/organizations/plans.js +40 -0
  213. package/lib/organizations/providerPagination.d.ts +6 -0
  214. package/lib/organizations/providerPagination.js +23 -0
  215. package/lib/organizations/reconciliation.d.ts +11 -0
  216. package/lib/organizations/reconciliation.js +400 -0
  217. package/lib/organizations/signup.d.ts +25 -0
  218. package/lib/organizations/signup.js +169 -0
  219. package/lib/organizations/store.d.ts +25 -0
  220. package/lib/organizations/store.js +167 -0
  221. package/lib/organizations/types.d.ts +138 -0
  222. package/lib/organizations/types.js +3 -0
  223. package/lib/organizations/verification.d.ts +3 -0
  224. package/lib/organizations/verification.js +51 -0
  225. package/lib/queries/analytics/analytics.js +1 -1
  226. package/lib/queries/content/content.js +1 -1
  227. package/lib/queries/crm/crm.js +1 -1
  228. package/lib/queries/events/events.js +1 -1
  229. package/lib/queries/flags/flags.js +1 -1
  230. package/lib/queries/groups/groups.js +1 -1
  231. package/lib/queries/higgsfield/higgsfield.js +1 -1
  232. package/lib/queries/images/images.js +1 -1
  233. package/lib/queries/index.js +1 -1
  234. package/lib/queries/locations/locations.js +1 -1
  235. package/lib/queries/messages/messages.js +1 -1
  236. package/lib/queries/personas/personas.js +1 -1
  237. package/lib/queries/posts/posts.js +1 -1
  238. package/lib/queries/query/query.js +1 -1
  239. package/lib/queries/reactions/reactions.js +1 -1
  240. package/lib/queries/statistics/statistics.js +1 -1
  241. package/lib/queries/subscriptions/subscriptions.js +1 -1
  242. package/lib/queries/tags/tags.js +1 -1
  243. package/lib/queries/users/users.js +1 -1
  244. package/lib/queries/videos/videos.js +1 -1
  245. package/lib/templates/email/layout.js +1 -1
  246. package/lib/templates/email/passwordForgot.js +1 -1
  247. package/lib/templates/email/passwordRecovery.js +1 -1
  248. package/lib/templates/email/verifyEmail.js +1 -1
  249. package/lib/templates/email/welcome.js +1 -1
  250. package/lib/templates/sms/passwordForgot.js +1 -1
  251. package/lib/templates/sms/passwordRecovery.js +1 -1
  252. package/lib/templates/sms/verifyEmail.js +1 -1
  253. package/lib/templates/sms/verifyPhone.js +1 -1
  254. package/lib/templates/sms/welcome.js +1 -1
  255. package/lib/types/analytics.types.js +1 -1
  256. package/lib/types/apps.types.js +1 -1
  257. package/lib/types/arangodb.types.js +1 -1
  258. package/lib/types/auth.types.js +1 -1
  259. package/lib/types/connections.types.js +1 -1
  260. package/lib/types/content.types.js +1 -1
  261. package/lib/types/conversations.types.js +1 -1
  262. package/lib/types/crm.types.js +1 -1
  263. package/lib/types/databaseCredentials.types.js +1 -1
  264. package/lib/types/email.types.js +1 -1
  265. package/lib/types/error.types.js +1 -1
  266. package/lib/types/files.types.js +1 -1
  267. package/lib/types/flags.types.js +1 -1
  268. package/lib/types/google.types.js +1 -1
  269. package/lib/types/groups.types.js +1 -1
  270. package/lib/types/images.types.js +1 -1
  271. package/lib/types/index.js +1 -1
  272. package/lib/types/locations.types.js +1 -1
  273. package/lib/types/messages.types.js +1 -1
  274. package/lib/types/notifications.types.js +1 -1
  275. package/lib/types/payments.types.js +1 -1
  276. package/lib/types/personas.types.js +1 -1
  277. package/lib/types/posts.types.js +1 -1
  278. package/lib/types/rum.types.js +1 -1
  279. package/lib/types/statistics.types.js +1 -1
  280. package/lib/types/tags.types.js +1 -1
  281. package/lib/types/users.types.js +1 -1
  282. package/lib/types/videos.types.js +1 -1
  283. package/lib/types/websockets.types.js +1 -1
  284. package/lib/upload.js +1 -1
  285. package/lib/utils/adapterUtils.js +1 -1
  286. package/lib/utils/analyticsUtils.js +1 -1
  287. package/lib/utils/appContext.js +1 -1
  288. package/lib/utils/aqlHelpers.js +1 -1
  289. package/lib/utils/arangodbUtils.js +1 -1
  290. package/lib/utils/authUtils.js +1 -1
  291. package/lib/utils/awsUtils.js +1 -1
  292. package/lib/utils/collectionRegistry.js +1 -1
  293. package/lib/utils/contextUtils.js +1 -1
  294. package/lib/utils/databaseCredentials.js +1 -1
  295. package/lib/utils/dbI18n.example.js +1 -1
  296. package/lib/utils/dbI18n.js +1 -1
  297. package/lib/utils/generationCallback.js +1 -1
  298. package/lib/utils/googleTranslate.js +1 -1
  299. package/lib/utils/graphqlUtils.js +1 -1
  300. package/lib/utils/imageUtils.js +1 -1
  301. package/lib/utils/index.js +1 -1
  302. package/lib/utils/languageDetection.js +1 -1
  303. package/lib/utils/localeUtils.example.js +1 -1
  304. package/lib/utils/localeUtils.js +1 -1
  305. package/lib/utils/mediaAccess.js +1 -1
  306. package/lib/utils/middlewareUtils.js +1 -1
  307. package/lib/utils/nodeRealtime.js +1 -1
  308. package/lib/utils/opaqueToken.js +1 -1
  309. package/lib/utils/queryBuilder.js +1 -1
  310. package/lib/utils/schemaUtils.js +1 -1
  311. package/lib/utils/secretDatabase.js +1 -1
  312. package/lib/utils/sessionUtils.js +1 -1
  313. package/lib/utils/stripeUtils.js +1 -1
  314. package/lib/utils/stripeUtils.ts.bak +1 -1
  315. package/lib/utils/templateUtils.js +1 -1
  316. package/lib/utils/testUtils.js +1 -1
  317. package/lib/utils/translationQueue.example.js +1 -1
  318. package/lib/utils/translationQueue.js +1 -1
  319. package/lib/videoProcessing.js +1 -1
  320. package/package.json +16 -3
@@ -380,4 +380,4 @@ export const videoUploadPartInputType = schemaComposer.createInputTC({
380
380
  name: 'VideoUploadPartInput'
381
381
  });
382
382
 
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvb2JqZWN0VHlwZXMvdmlkZW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cblxuaW1wb3J0IHtzY2hlbWFDb21wb3Nlcn0gZnJvbSAnZ3JhcGhxbC1jb21wb3NlJztcbmltcG9ydCB7cGFyc2VJZH0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5cbmltcG9ydCB7Z2V0SW1hZ2VVcmx9IGZyb20gJy4uL2FjdGlvbnMvaW1hZ2VzLmpzJztcbmltcG9ydCB7Z2V0VmlkZW9TaWduZWRLZXlVcmwsIGdldFZpZGVvVXJsfSBmcm9tICcuLi9hY3Rpb25zL3ZpZGVvcy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7ZG9jdW1lbnR9IGZyb20gJy4vZG9jdW1lbnQuanMnO1xuXG5jb25zdCBnZXREb2N1bWVudEtleSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuXG4gIGlmKCFub3JtYWxpemVkVmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IG5vcm1hbGl6ZWRWYWx1ZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIFN0cmluZyhwYXJ0cy5hdCgtMSkgfHwgbm9ybWFsaXplZFZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWRlb1R5cGUgPSBzY2hlbWFDb21wb3Nlci5jcmVhdGVPYmplY3RUQyh7XG4gIGZpZWxkczoge1xuICAgIGFkZGVkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RpbWVzdGFtcCB3aGVuIHRoZSB2aWRlbyB3YXMgYWRkZWQuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uIG9mIHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRHVyYXRpb24gb2YgdGhlIHZpZGVvIGluIG1pbGxpc2Vjb25kcy4nLFxuICAgICAgdHlwZTogJ0ludCdcbiAgICB9LFxuICAgIGV4dGVybmFsSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgcHJvdmlkZXIgdmlkZW8gaWQuJyxcbiAgICAgIHR5cGU6ICdJRCdcbiAgICB9LFxuICAgIGV4dGVybmFsVXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIHByb3ZpZGVyIFVSTC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGZpbGVTaXplOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpemUgb2YgdGhlIHZpZGVvIGZpbGUgaW4gYnl0ZXMuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIGZpbGVUeXBlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgdHlwZS9leHRlbnNpb24uJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBoZWlnaHQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuJyxcbiAgICAgIHR5cGU6ICdJbnQnXG4gICAgfSxcbiAgICBobHNVcmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmVkIEhMUyBwbGF5bGlzdCBVUkwgZm9yIGJyb3dzZXIgcGxheWJhY2suJyxcbiAgICAgIHJlc29sdmUoaXRlbSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBnZXRWaWRlb1NpZ25lZEtleVVybChTdHJpbmcoaXRlbT8uaGxzS2V5IHx8ICcnKSwgQ29uZmlnLmdldCgnYXdzLnMzLkJ1Y2tldCcpKTtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgcGxheWJhY2tGaWxlVHlwZToge1xuICAgICAgZGVzY3JpcHRpb246ICdNSU1FIHR5cGUgb2YgdGhlIHByb2Nlc3NlZCBicm93c2VyIHBsYXliYWNrIGFzc2V0LicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgcGxheWJhY2tVcmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmVkIFVSTCBvZiB0aGUgcHJvY2Vzc2VkIGJyb3dzZXIgcGxheWJhY2sgYXNzZXQuJyxcbiAgICAgIHJlc29sdmUoaXRlbSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBnZXRWaWRlb1NpZ25lZEtleVVybChTdHJpbmcoaXRlbT8ucGxheWJhY2tLZXkgfHwgJycpLCBDb25maWcuZ2V0KCdhd3MuczMuQnVja2V0JykpO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwcml2YWN5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1dobyBjYW4gdmlldyB0aGUgdmlkZW8uJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBtb2RpZmllZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdUaW1lc3RhbXAgd2hlbiB0aGUgdmlkZW8gd2FzIGxhc3QgbW9kaWZpZWQuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIG1lZGlhQ29udmVydEpvYklkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FXUyBFbGVtZW50YWwgTWVkaWFDb252ZXJ0IGpvYiBpZC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIG93bmVyUGVyc29uYUlkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1BlcnNvbmEgSUQgZm9yIHRoZSBwcm9maWxlIHRoYXQgb3ducyB0aGlzIHZpZGVvLicsXG4gICAgICB0eXBlOiAnSUQnXG4gICAgfSxcbiAgICBvd25lclBlcnNvbmFJbWFnZVVybDoge1xuICAgICAgZGVzY3JpcHRpb246ICdJbWFnZSBVUkwgZm9yIHRoZSBwcm9maWxlIHRoYXQgb3ducyB0aGlzIHZpZGVvLicsXG4gICAgICByZXNvbHZlKGl0ZW0pOiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmcge1xuICAgICAgICBpZihpdGVtPy5vd25lclBlcnNvbmFJbWFnZVVybCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaXRlbS5vd25lclBlcnNvbmFJbWFnZVVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZUlkID0gcGFyc2VJZChTdHJpbmcoaXRlbT8ub3duZXJQZXJzb25hSW1hZ2VJZCB8fCAnJykpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXJzZUlkKFN0cmluZyhpdGVtPy5vd25lclBlcnNvbmFVc2VySWQgfHwgJycpKTtcblxuICAgICAgICBpZighaW1hZ2VJZCB8fCAhdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldEltYWdlVXJsKHtcbiAgICAgICAgICBidWNrZXQ6IENvbmZpZy5nZXQoJ2F3cy5zMy5CdWNrZXQnKSxcbiAgICAgICAgICBpbWFnZURpcjogJ2ltYWdlcycsXG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpbWFnZVR5cGU6ICdqcGcnLFxuICAgICAgICAgIHR5cGU6ICd1c2VycycsXG4gICAgICAgICAgdHlwZUlkOiB1c2VySWQsXG4gICAgICAgICAgdXJsVHlwZTogJ3NpZ25lZCdcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIG93bmVyUGVyc29uYU5hbWU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheSBuYW1lIGZvciB0aGUgcHJvZmlsZSB0aGF0IG93bnMgdGhpcyB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIG93bmVyUGVyc29uYVRodW1iVXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RodW1ibmFpbCBVUkwgZm9yIHRoZSBwcm9maWxlIHRoYXQgb3ducyB0aGlzIHZpZGVvLicsXG4gICAgICByZXNvbHZlKGl0ZW0pOiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmcge1xuICAgICAgICBpZihpdGVtPy5vd25lclBlcnNvbmFUaHVtYlVybCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaXRlbS5vd25lclBlcnNvbmFUaHVtYlVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZUlkID0gcGFyc2VJZChTdHJpbmcoaXRlbT8ub3duZXJQZXJzb25hSW1hZ2VJZCB8fCAnJykpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXJzZUlkKFN0cmluZyhpdGVtPy5vd25lclBlcnNvbmFVc2VySWQgfHwgJycpKTtcblxuICAgICAgICBpZighaW1hZ2VJZCB8fCAhdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldEltYWdlVXJsKHtcbiAgICAgICAgICBidWNrZXQ6IENvbmZpZy5nZXQoJ2F3cy5zMy5CdWNrZXQnKSxcbiAgICAgICAgICBpbWFnZURpcjogJ3RodW1icycsXG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpbWFnZVR5cGU6ICdqcGcnLFxuICAgICAgICAgIHR5cGU6ICd1c2VycycsXG4gICAgICAgICAgdHlwZUlkOiB1c2VySWQsXG4gICAgICAgICAgdXJsVHlwZTogJ3NpZ25lZCdcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHByb3ZpZGVyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIHZpZGVvIHByb3ZpZGVyLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgcHJvY2Vzc2luZ1N0YXR1czoge1xuICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50IHZpZGVvIHByb2Nlc3Npbmcgc3RhdGUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwcm9jZXNzaW5nRXJyb3I6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGFzdCB2aWRlbyBwcm9jZXNzaW5nIGZhaWx1cmUgbWVzc2FnZS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHNvdXJjZUtleToge1xuICAgICAgZGVzY3JpcHRpb246ICdPcmlnaW5hbCBTMyBvYmplY3Qga2V5LicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgc3RyZWFtVHlwZToge1xuICAgICAgZGVzY3JpcHRpb246ICdQbGF5YmFjayBzdHJlYW0gdHlwZSBmb3IgcHJvY2Vzc2VkIHZpZGVvLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdGh1bWJVcmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVVJMIGZvciB0aGUgdmlkZW8gcG9zdGVyL3RodW1iIGlmIGF2YWlsYWJsZS4nLFxuICAgICAgcmVzb2x2ZShpdGVtKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qge19rZXk6IHZpZGVvSWQsIHRodW1iRmlsZVR5cGUsIHVzZXJJZH0gPSBpdGVtO1xuXG4gICAgICAgIGlmKCF0aHVtYkZpbGVUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0VmlkZW9Vcmwoe1xuICAgICAgICAgIGJ1Y2tldDogQ29uZmlnLmdldCgnYXdzLnMzLkJ1Y2tldCcpLFxuICAgICAgICAgIGZpbGVUeXBlOiB0aHVtYkZpbGVUeXBlLFxuICAgICAgICAgIHR5cGU6ICd1c2VycycsXG4gICAgICAgICAgdHlwZUlkOiB1c2VySWQsXG4gICAgICAgICAgdXJsVHlwZTogJ3NpZ25lZCcsXG4gICAgICAgICAgdmlkZW9EaXI6ICd2aWRlby10aHVtYnMnLFxuICAgICAgICAgIHZpZGVvSWRcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVmlkZW8gdHlwZS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHVybDoge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduZWQgVVJMIG9mIHRoZSBwbGF5YWJsZSB2aWRlbyBhc3NldC4nLFxuICAgICAgcmVzb2x2ZShpdGVtKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qge19rZXk6IHZpZGVvSWQsIGZpbGVUeXBlLCB1c2VySWR9ID0gaXRlbTtcbiAgICAgICAgY29uc3QgcGxheWJhY2tLZXkgPSBTdHJpbmcoaXRlbT8ucGxheWJhY2tLZXkgfHwgJycpLnRyaW0oKTtcblxuICAgICAgICBpZihwbGF5YmFja0tleSkge1xuICAgICAgICAgIHJldHVybiBnZXRWaWRlb1NpZ25lZEtleVVybChwbGF5YmFja0tleSwgQ29uZmlnLmdldCgnYXdzLnMzLkJ1Y2tldCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRWaWRlb1VybCh7XG4gICAgICAgICAgYnVja2V0OiBDb25maWcuZ2V0KCdhd3MuczMuQnVja2V0JyksXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgdHlwZTogJ3VzZXJzJyxcbiAgICAgICAgICB0eXBlSWQ6IHVzZXJJZCxcbiAgICAgICAgICB1cmxUeXBlOiAnc2lnbmVkJyxcbiAgICAgICAgICB2aWRlb0RpcjogJ3ZpZGVvcycsXG4gICAgICAgICAgdmlkZW9JZFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdXNlcklkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgd2hvIHVwbG9hZGVkIHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ0lEJ1xuICAgIH0sXG4gICAgdXBsb2FkSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUzMgbXVsdGlwYXJ0IHVwbG9hZCBpZCB3aGlsZSB1cGxvYWQgaXMgYWN0aXZlLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdXBsb2FkS2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIG9iamVjdCBrZXkgdXNlZCBmb3IgdXBsb2FkLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdXBsb2FkU3RhdHVzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0N1cnJlbnQgdmlkZW8gdXBsb2FkIHN0YXRlLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdmlkZW9JZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHZpZGVvLicsXG4gICAgICByZXNvbHZlKGl0ZW0pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBrZXkgPSBwYXJzZUlkKFN0cmluZyhpdGVtPy5fa2V5IHx8ICcnKSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZERvY0lkID0gZ2V0RG9jdW1lbnRLZXkoaXRlbT8uaWQgfHwgaXRlbT8uX2lkKTtcbiAgICAgICAgcmV0dXJuIGtleSB8fCBwYXJzZWREb2NJZDtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnSUQhJ1xuICAgIH0sXG4gICAgd2lkdGg6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2lkdGggb2YgdGhlIHZpZGVvIGluIHBpeGVscy4nLFxuICAgICAgdHlwZTogJ0ludCdcbiAgICB9XG4gIH0sXG4gIG5hbWU6ICdWaWRlbydcbn0pO1xudmlkZW9UeXBlLmFkZEZpZWxkcyhkb2N1bWVudC5nZXRGaWVsZHMoKSk7XG5cbmV4cG9ydCBjb25zdCB2aWRlb0lucHV0VHlwZSA9IHNjaGVtYUNvbXBvc2VyLmNyZWF0ZUlucHV0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBiYXNlNjQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQmFzZTY0LWVuY29kZWQgdmlkZW8gZGF0YS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uIG9mIHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGV4dGVybmFsSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgcHJvdmlkZXIgdmlkZW8gaWQuJyxcbiAgICAgIHR5cGU6ICdJRCdcbiAgICB9LFxuICAgIGV4dGVybmFsVXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIHByb3ZpZGVyIFVSTC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGZpbGVUeXBlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgdHlwZS9leHRlbnNpb24uJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBmaWxlTmFtZToge1xuICAgICAgZGVzY3JpcHRpb246ICdPcmlnaW5hbCBmaWxlIG5hbWUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBmaWxlU2l6ZToge1xuICAgICAgZGVzY3JpcHRpb246ICdPcmlnaW5hbCBmaWxlIHNpemUgaW4gYnl0ZXMuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIGhsc0tleToge1xuICAgICAgZGVzY3JpcHRpb246ICdTMyBrZXkgZm9yIHByb2Nlc3NlZCBITFMgcGxheWxpc3QuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBpdGVtSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSUQgb2YgdGhlIGl0ZW0gdGhpcyB2aWRlbyBpcyBhdHRhY2hlZCB0by4nLFxuICAgICAgdHlwZTogJ0lEJ1xuICAgIH0sXG4gICAgaXRlbVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVHlwZS9jYXRlZ29yeSBvZiB0aGUgaXRlbS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHByaXZhY3k6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hvIGNhbiB2aWV3IHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHBsYXliYWNrRmlsZVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTUlNRSB0eXBlIG9mIHRoZSBwcm9jZXNzZWQgYnJvd3NlciBwbGF5YmFjayBhc3NldC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHBsYXliYWNrS2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIGtleSBmb3IgcHJvY2Vzc2VkIGJyb3dzZXIgcGxheWJhY2sgYXNzZXQuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwcm92aWRlcjoge1xuICAgICAgZGVzY3JpcHRpb246ICdFeHRlcm5hbCB2aWRlbyBwcm92aWRlci4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHN0cmVhbVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGxheWJhY2sgc3RyZWFtIHR5cGUgZm9yIHByb2Nlc3NlZCB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHRodW1iQmFzZTY0OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Jhc2U2NC1lbmNvZGVkIHZpZGVvIHRodW1ibmFpbCBpbWFnZS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHRodW1iRmlsZVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVmlkZW8gdGh1bWJuYWlsIGltYWdlIHR5cGUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwYXJ0Q291bnQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHVwbG9hZCBwYXJ0cyByZXF1ZXN0ZWQuJyxcbiAgICAgIHR5cGU6ICdJbnQnXG4gICAgfSxcbiAgICB0eXBlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1ZpZGVvIHR5cGUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICB1cmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgb3IgaG9zdGVkIFVSTCBmb3IgdGhlIHZpZGVvLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdmlkZW9JZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdWaWRlbyBJRC4nLFxuICAgICAgdHlwZTogJ0lEJ1xuICAgIH1cbiAgfSxcbiAgbmFtZTogJ1ZpZGVvSW5wdXQnXG59KTtcblxuZXhwb3J0IGNvbnN0IHZpZGVvVXBsb2FkUGFydFVybFR5cGUgPSBzY2hlbWFDb21wb3Nlci5jcmVhdGVPYmplY3RUQyh7XG4gIGZpZWxkczoge1xuICAgIHBhcnROdW1iZXI6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTXVsdGlwYXJ0IHVwbG9hZCBwYXJ0IG51bWJlci4nLFxuICAgICAgdHlwZTogJ0ludCdcbiAgICB9LFxuICAgIHVybDoge1xuICAgICAgZGVzY3JpcHRpb246ICdQcmVzaWduZWQgVVJMIGZvciB0aGlzIHVwbG9hZCBwYXJ0LicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH1cbiAgfSxcbiAgbmFtZTogJ1ZpZGVvVXBsb2FkUGFydFVybCdcbn0pO1xuXG5leHBvcnQgY29uc3QgdmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlID0gc2NoZW1hQ29tcG9zZXIuY3JlYXRlT2JqZWN0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBidWNrZXQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUzMgYnVja2V0IGZvciB0aGUgdXBsb2FkLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAga2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIGtleSBmb3IgdGhlIHVwbG9hZC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHBhcnRTaXplOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1JlY29tbWVuZGVkIHVwbG9hZCBwYXJ0IHNpemUgaW4gYnl0ZXMuJyxcbiAgICAgIHR5cGU6ICdJbnQnXG4gICAgfSxcbiAgICBwYXJ0VXJsczoge1xuICAgICAgZGVzY3JpcHRpb246ICdQcmVzaWduZWQgVVJMcyBmb3IgdXBsb2FkIHBhcnRzLicsXG4gICAgICB0eXBlOiBbdmlkZW9VcGxvYWRQYXJ0VXJsVHlwZV1cbiAgICB9LFxuICAgIHVwbG9hZElkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIG11bHRpcGFydCB1cGxvYWQgaWQuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICB2aWRlbzoge1xuICAgICAgZGVzY3JpcHRpb246ICdQZW5kaW5nIHZpZGVvIHJlY29yZC4nLFxuICAgICAgdHlwZTogdmlkZW9UeXBlXG4gICAgfSxcbiAgICB2aWRlb0lkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1ZpZGVvIElEIGZvciB0aGUgdXBsb2FkLicsXG4gICAgICB0eXBlOiAnSUQnXG4gICAgfVxuICB9LFxuICBuYW1lOiAnVmlkZW9NdWx0aXBhcnRVcGxvYWQnXG59KTtcblxuZXhwb3J0IGNvbnN0IHZpZGVvVXBsb2FkUGFydElucHV0VHlwZSA9IHNjaGVtYUNvbXBvc2VyLmNyZWF0ZUlucHV0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBldGFnOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0VUYWcgcmV0dXJuZWQgYnkgUzMgZm9yIHRoaXMgdXBsb2FkZWQgcGFydC4nLFxuICAgICAgdHlwZTogJ1N0cmluZyEnXG4gICAgfSxcbiAgICBwYXJ0TnVtYmVyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ011bHRpcGFydCB1cGxvYWQgcGFydCBudW1iZXIuJyxcbiAgICAgIHR5cGU6ICdJbnQhJ1xuICAgIH1cbiAgfSxcbiAgbmFtZTogJ1ZpZGVvVXBsb2FkUGFydElucHV0J1xufSk7XG4iXSwibmFtZXMiOlsic2NoZW1hQ29tcG9zZXIiLCJwYXJzZUlkIiwiZ2V0SW1hZ2VVcmwiLCJnZXRWaWRlb1NpZ25lZEtleVVybCIsImdldFZpZGVvVXJsIiwiQ29uZmlnIiwiZG9jdW1lbnQiLCJnZXREb2N1bWVudEtleSIsInZhbHVlIiwibm9ybWFsaXplZFZhbHVlIiwiU3RyaW5nIiwidHJpbSIsInBhcnRzIiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiYXQiLCJ2aWRlb1R5cGUiLCJjcmVhdGVPYmplY3RUQyIsImZpZWxkcyIsImFkZGVkIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZHVyYXRpb25NcyIsImV4dGVybmFsSWQiLCJleHRlcm5hbFVybCIsImZpbGVTaXplIiwiZmlsZVR5cGUiLCJoZWlnaHQiLCJobHNVcmwiLCJyZXNvbHZlIiwiaXRlbSIsImhsc0tleSIsImdldCIsInBsYXliYWNrRmlsZVR5cGUiLCJwbGF5YmFja1VybCIsInBsYXliYWNrS2V5IiwicHJpdmFjeSIsIm1vZGlmaWVkIiwibWVkaWFDb252ZXJ0Sm9iSWQiLCJvd25lclBlcnNvbmFJZCIsIm93bmVyUGVyc29uYUltYWdlVXJsIiwiaW1hZ2VJZCIsIm93bmVyUGVyc29uYUltYWdlSWQiLCJ1c2VySWQiLCJvd25lclBlcnNvbmFVc2VySWQiLCJidWNrZXQiLCJpbWFnZURpciIsImltYWdlVHlwZSIsInR5cGVJZCIsInVybFR5cGUiLCJvd25lclBlcnNvbmFOYW1lIiwib3duZXJQZXJzb25hVGh1bWJVcmwiLCJwcm92aWRlciIsInByb2Nlc3NpbmdTdGF0dXMiLCJwcm9jZXNzaW5nRXJyb3IiLCJzb3VyY2VLZXkiLCJzdHJlYW1UeXBlIiwidGh1bWJVcmwiLCJfa2V5IiwidmlkZW9JZCIsInRodW1iRmlsZVR5cGUiLCJQcm9taXNlIiwidmlkZW9EaXIiLCJ1cmwiLCJ1cGxvYWRJZCIsInVwbG9hZEtleSIsInVwbG9hZFN0YXR1cyIsImtleSIsInBhcnNlZERvY0lkIiwiaWQiLCJfaWQiLCJ3aWR0aCIsIm5hbWUiLCJhZGRGaWVsZHMiLCJnZXRGaWVsZHMiLCJ2aWRlb0lucHV0VHlwZSIsImNyZWF0ZUlucHV0VEMiLCJiYXNlNjQiLCJmaWxlTmFtZSIsIml0ZW1JZCIsIml0ZW1UeXBlIiwidGh1bWJCYXNlNjQiLCJwYXJ0Q291bnQiLCJ2aWRlb1VwbG9hZFBhcnRVcmxUeXBlIiwicGFydE51bWJlciIsInZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZSIsInBhcnRTaXplIiwicGFydFVybHMiLCJ2aWRlbyIsInZpZGVvVXBsb2FkUGFydElucHV0VHlwZSIsImV0YWciXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUVELFNBQVFBLGNBQWMsUUFBTyxrQkFBa0I7QUFDL0MsU0FBUUMsT0FBTyxRQUFPLCtCQUErQjtBQUVyRCxTQUFRQyxXQUFXLFFBQU8sdUJBQXVCO0FBQ2pELFNBQVFDLG9CQUFvQixFQUFFQyxXQUFXLFFBQU8sdUJBQXVCO0FBQ3ZFLFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBQ3BDLFNBQVFDLFFBQVEsUUFBTyxnQkFBZ0I7QUFFdkMsTUFBTUMsaUJBQWlCLENBQUNDO0lBQ3RCLE1BQU1DLGtCQUFrQkMsT0FBT0YsU0FBUyxJQUFJRyxJQUFJO0lBRWhELElBQUcsQ0FBQ0YsaUJBQWlCO1FBQ25CLE9BQU87SUFDVDtJQUVBLE1BQU1HLFFBQVFILGdCQUFnQkksS0FBSyxDQUFDLEtBQUtDLE1BQU0sQ0FBQ0M7SUFDaEQsT0FBT0wsT0FBT0UsTUFBTUksRUFBRSxDQUFDLENBQUMsTUFBTVA7QUFDaEM7QUFFQSxPQUFPLE1BQU1RLFlBQVlqQixlQUFla0IsY0FBYyxDQUFDO0lBQ3JEQyxRQUFRO1FBQ05DLE9BQU87WUFDTEMsYUFBYTtZQUNiQyxNQUFNO1FBQ1I7UUFDQUQsYUFBYTtZQUNYQSxhQUFhO1lBQ2JDLE1BQU07UUFDUjtRQUNBQyxZQUFZO1lBQ1ZG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
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvb2JqZWN0VHlwZXMvdmlkZW8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cblxuaW1wb3J0IHtzY2hlbWFDb21wb3Nlcn0gZnJvbSAnZ3JhcGhxbC1jb21wb3NlJztcbmltcG9ydCB7cGFyc2VJZH0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5cbmltcG9ydCB7Z2V0SW1hZ2VVcmx9IGZyb20gJy4uL2FjdGlvbnMvaW1hZ2VzLmpzJztcbmltcG9ydCB7Z2V0VmlkZW9TaWduZWRLZXlVcmwsIGdldFZpZGVvVXJsfSBmcm9tICcuLi9hY3Rpb25zL3ZpZGVvcy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7ZG9jdW1lbnR9IGZyb20gJy4vZG9jdW1lbnQuanMnO1xuXG5jb25zdCBnZXREb2N1bWVudEtleSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuXG4gIGlmKCFub3JtYWxpemVkVmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IG5vcm1hbGl6ZWRWYWx1ZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIFN0cmluZyhwYXJ0cy5hdCgtMSkgfHwgbm9ybWFsaXplZFZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWRlb1R5cGUgPSBzY2hlbWFDb21wb3Nlci5jcmVhdGVPYmplY3RUQyh7XG4gIGZpZWxkczoge1xuICAgIGFkZGVkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RpbWVzdGFtcCB3aGVuIHRoZSB2aWRlbyB3YXMgYWRkZWQuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uIG9mIHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRHVyYXRpb24gb2YgdGhlIHZpZGVvIGluIG1pbGxpc2Vjb25kcy4nLFxuICAgICAgdHlwZTogJ0ludCdcbiAgICB9LFxuICAgIGV4dGVybmFsSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgcHJvdmlkZXIgdmlkZW8gaWQuJyxcbiAgICAgIHR5cGU6ICdJRCdcbiAgICB9LFxuICAgIGV4dGVybmFsVXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIHByb3ZpZGVyIFVSTC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGZpbGVTaXplOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpemUgb2YgdGhlIHZpZGVvIGZpbGUgaW4gYnl0ZXMuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIGZpbGVUeXBlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgdHlwZS9leHRlbnNpb24uJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBoZWlnaHQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuJyxcbiAgICAgIHR5cGU6ICdJbnQnXG4gICAgfSxcbiAgICBobHNVcmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmVkIEhMUyBwbGF5bGlzdCBVUkwgZm9yIGJyb3dzZXIgcGxheWJhY2suJyxcbiAgICAgIHJlc29sdmUoaXRlbSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBnZXRWaWRlb1NpZ25lZEtleVVybChTdHJpbmcoaXRlbT8uaGxzS2V5IHx8ICcnKSwgQ29uZmlnLmdldCgnYXdzLnMzLkJ1Y2tldCcpKTtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgcGxheWJhY2tGaWxlVHlwZToge1xuICAgICAgZGVzY3JpcHRpb246ICdNSU1FIHR5cGUgb2YgdGhlIHByb2Nlc3NlZCBicm93c2VyIHBsYXliYWNrIGFzc2V0LicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgcGxheWJhY2tVcmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmVkIFVSTCBvZiB0aGUgcHJvY2Vzc2VkIGJyb3dzZXIgcGxheWJhY2sgYXNzZXQuJyxcbiAgICAgIHJlc29sdmUoaXRlbSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBnZXRWaWRlb1NpZ25lZEtleVVybChTdHJpbmcoaXRlbT8ucGxheWJhY2tLZXkgfHwgJycpLCBDb25maWcuZ2V0KCdhd3MuczMuQnVja2V0JykpO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwcml2YWN5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1dobyBjYW4gdmlldyB0aGUgdmlkZW8uJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBtb2RpZmllZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdUaW1lc3RhbXAgd2hlbiB0aGUgdmlkZW8gd2FzIGxhc3QgbW9kaWZpZWQuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIG1lZGlhQ29udmVydEpvYklkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FXUyBFbGVtZW50YWwgTWVkaWFDb252ZXJ0IGpvYiBpZC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIG93bmVyUGVyc29uYUlkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1BlcnNvbmEgSUQgZm9yIHRoZSBwcm9maWxlIHRoYXQgb3ducyB0aGlzIHZpZGVvLicsXG4gICAgICB0eXBlOiAnSUQnXG4gICAgfSxcbiAgICBvd25lclBlcnNvbmFJbWFnZVVybDoge1xuICAgICAgZGVzY3JpcHRpb246ICdJbWFnZSBVUkwgZm9yIHRoZSBwcm9maWxlIHRoYXQgb3ducyB0aGlzIHZpZGVvLicsXG4gICAgICByZXNvbHZlKGl0ZW0pOiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmcge1xuICAgICAgICBpZihpdGVtPy5vd25lclBlcnNvbmFJbWFnZVVybCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaXRlbS5vd25lclBlcnNvbmFJbWFnZVVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZUlkID0gcGFyc2VJZChTdHJpbmcoaXRlbT8ub3duZXJQZXJzb25hSW1hZ2VJZCB8fCAnJykpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXJzZUlkKFN0cmluZyhpdGVtPy5vd25lclBlcnNvbmFVc2VySWQgfHwgJycpKTtcblxuICAgICAgICBpZighaW1hZ2VJZCB8fCAhdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldEltYWdlVXJsKHtcbiAgICAgICAgICBidWNrZXQ6IENvbmZpZy5nZXQoJ2F3cy5zMy5CdWNrZXQnKSxcbiAgICAgICAgICBpbWFnZURpcjogJ2ltYWdlcycsXG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpbWFnZVR5cGU6ICdqcGcnLFxuICAgICAgICAgIHR5cGU6ICd1c2VycycsXG4gICAgICAgICAgdHlwZUlkOiB1c2VySWQsXG4gICAgICAgICAgdXJsVHlwZTogJ3NpZ25lZCdcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIG93bmVyUGVyc29uYU5hbWU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheSBuYW1lIGZvciB0aGUgcHJvZmlsZSB0aGF0IG93bnMgdGhpcyB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIG93bmVyUGVyc29uYVRodW1iVXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RodW1ibmFpbCBVUkwgZm9yIHRoZSBwcm9maWxlIHRoYXQgb3ducyB0aGlzIHZpZGVvLicsXG4gICAgICByZXNvbHZlKGl0ZW0pOiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmcge1xuICAgICAgICBpZihpdGVtPy5vd25lclBlcnNvbmFUaHVtYlVybCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaXRlbS5vd25lclBlcnNvbmFUaHVtYlVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZUlkID0gcGFyc2VJZChTdHJpbmcoaXRlbT8ub3duZXJQZXJzb25hSW1hZ2VJZCB8fCAnJykpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXJzZUlkKFN0cmluZyhpdGVtPy5vd25lclBlcnNvbmFVc2VySWQgfHwgJycpKTtcblxuICAgICAgICBpZighaW1hZ2VJZCB8fCAhdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldEltYWdlVXJsKHtcbiAgICAgICAgICBidWNrZXQ6IENvbmZpZy5nZXQoJ2F3cy5zMy5CdWNrZXQnKSxcbiAgICAgICAgICBpbWFnZURpcjogJ3RodW1icycsXG4gICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICBpbWFnZVR5cGU6ICdqcGcnLFxuICAgICAgICAgIHR5cGU6ICd1c2VycycsXG4gICAgICAgICAgdHlwZUlkOiB1c2VySWQsXG4gICAgICAgICAgdXJsVHlwZTogJ3NpZ25lZCdcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHByb3ZpZGVyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIHZpZGVvIHByb3ZpZGVyLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgcHJvY2Vzc2luZ1N0YXR1czoge1xuICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50IHZpZGVvIHByb2Nlc3Npbmcgc3RhdGUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwcm9jZXNzaW5nRXJyb3I6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGFzdCB2aWRlbyBwcm9jZXNzaW5nIGZhaWx1cmUgbWVzc2FnZS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHNvdXJjZUtleToge1xuICAgICAgZGVzY3JpcHRpb246ICdPcmlnaW5hbCBTMyBvYmplY3Qga2V5LicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgc3RyZWFtVHlwZToge1xuICAgICAgZGVzY3JpcHRpb246ICdQbGF5YmFjayBzdHJlYW0gdHlwZSBmb3IgcHJvY2Vzc2VkIHZpZGVvLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdGh1bWJVcmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVVJMIGZvciB0aGUgdmlkZW8gcG9zdGVyL3RodW1iIGlmIGF2YWlsYWJsZS4nLFxuICAgICAgcmVzb2x2ZShpdGVtKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qge19rZXk6IHZpZGVvSWQsIHRodW1iRmlsZVR5cGUsIHVzZXJJZH0gPSBpdGVtO1xuXG4gICAgICAgIGlmKCF0aHVtYkZpbGVUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0VmlkZW9Vcmwoe1xuICAgICAgICAgIGJ1Y2tldDogQ29uZmlnLmdldCgnYXdzLnMzLkJ1Y2tldCcpLFxuICAgICAgICAgIGZpbGVUeXBlOiB0aHVtYkZpbGVUeXBlLFxuICAgICAgICAgIHR5cGU6ICd1c2VycycsXG4gICAgICAgICAgdHlwZUlkOiB1c2VySWQsXG4gICAgICAgICAgdXJsVHlwZTogJ3NpZ25lZCcsXG4gICAgICAgICAgdmlkZW9EaXI6ICd2aWRlby10aHVtYnMnLFxuICAgICAgICAgIHZpZGVvSWRcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVmlkZW8gdHlwZS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHVybDoge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduZWQgVVJMIG9mIHRoZSBwbGF5YWJsZSB2aWRlbyBhc3NldC4nLFxuICAgICAgcmVzb2x2ZShpdGVtKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qge19rZXk6IHZpZGVvSWQsIGZpbGVUeXBlLCB1c2VySWR9ID0gaXRlbTtcbiAgICAgICAgY29uc3QgcGxheWJhY2tLZXkgPSBTdHJpbmcoaXRlbT8ucGxheWJhY2tLZXkgfHwgJycpLnRyaW0oKTtcblxuICAgICAgICBpZihwbGF5YmFja0tleSkge1xuICAgICAgICAgIHJldHVybiBnZXRWaWRlb1NpZ25lZEtleVVybChwbGF5YmFja0tleSwgQ29uZmlnLmdldCgnYXdzLnMzLkJ1Y2tldCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRWaWRlb1VybCh7XG4gICAgICAgICAgYnVja2V0OiBDb25maWcuZ2V0KCdhd3MuczMuQnVja2V0JyksXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgdHlwZTogJ3VzZXJzJyxcbiAgICAgICAgICB0eXBlSWQ6IHVzZXJJZCxcbiAgICAgICAgICB1cmxUeXBlOiAnc2lnbmVkJyxcbiAgICAgICAgICB2aWRlb0RpcjogJ3ZpZGVvcycsXG4gICAgICAgICAgdmlkZW9JZFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdXNlcklkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgd2hvIHVwbG9hZGVkIHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ0lEJ1xuICAgIH0sXG4gICAgdXBsb2FkSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUzMgbXVsdGlwYXJ0IHVwbG9hZCBpZCB3aGlsZSB1cGxvYWQgaXMgYWN0aXZlLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdXBsb2FkS2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIG9iamVjdCBrZXkgdXNlZCBmb3IgdXBsb2FkLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdXBsb2FkU3RhdHVzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0N1cnJlbnQgdmlkZW8gdXBsb2FkIHN0YXRlLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdmlkZW9JZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHZpZGVvLicsXG4gICAgICByZXNvbHZlKGl0ZW0pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBrZXkgPSBwYXJzZUlkKFN0cmluZyhpdGVtPy5fa2V5IHx8ICcnKSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZERvY0lkID0gZ2V0RG9jdW1lbnRLZXkoaXRlbT8uaWQgfHwgaXRlbT8uX2lkKTtcbiAgICAgICAgcmV0dXJuIGtleSB8fCBwYXJzZWREb2NJZDtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnSUQhJ1xuICAgIH0sXG4gICAgd2lkdGg6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2lkdGggb2YgdGhlIHZpZGVvIGluIHBpeGVscy4nLFxuICAgICAgdHlwZTogJ0ludCdcbiAgICB9XG4gIH0sXG4gIG5hbWU6ICdWaWRlbydcbn0pO1xudmlkZW9UeXBlLmFkZEZpZWxkcyhkb2N1bWVudC5nZXRGaWVsZHMoKSk7XG5cbmV4cG9ydCBjb25zdCB2aWRlb0lucHV0VHlwZSA9IHNjaGVtYUNvbXBvc2VyLmNyZWF0ZUlucHV0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBiYXNlNjQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQmFzZTY0LWVuY29kZWQgdmlkZW8gZGF0YS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uIG9mIHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGV4dGVybmFsSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgcHJvdmlkZXIgdmlkZW8gaWQuJyxcbiAgICAgIHR5cGU6ICdJRCdcbiAgICB9LFxuICAgIGV4dGVybmFsVXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIHByb3ZpZGVyIFVSTC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIGZpbGVUeXBlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgdHlwZS9leHRlbnNpb24uJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBmaWxlTmFtZToge1xuICAgICAgZGVzY3JpcHRpb246ICdPcmlnaW5hbCBmaWxlIG5hbWUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBmaWxlU2l6ZToge1xuICAgICAgZGVzY3JpcHRpb246ICdPcmlnaW5hbCBmaWxlIHNpemUgaW4gYnl0ZXMuJyxcbiAgICAgIHR5cGU6ICdGbG9hdCdcbiAgICB9LFxuICAgIGhsc0tleToge1xuICAgICAgZGVzY3JpcHRpb246ICdTMyBrZXkgZm9yIHByb2Nlc3NlZCBITFMgcGxheWxpc3QuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBpdGVtSWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSUQgb2YgdGhlIGl0ZW0gdGhpcyB2aWRlbyBpcyBhdHRhY2hlZCB0by4nLFxuICAgICAgdHlwZTogJ0lEJ1xuICAgIH0sXG4gICAgaXRlbVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVHlwZS9jYXRlZ29yeSBvZiB0aGUgaXRlbS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHByaXZhY3k6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hvIGNhbiB2aWV3IHRoZSB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHBsYXliYWNrRmlsZVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTUlNRSB0eXBlIG9mIHRoZSBwcm9jZXNzZWQgYnJvd3NlciBwbGF5YmFjayBhc3NldC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHBsYXliYWNrS2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIGtleSBmb3IgcHJvY2Vzc2VkIGJyb3dzZXIgcGxheWJhY2sgYXNzZXQuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwcm92aWRlcjoge1xuICAgICAgZGVzY3JpcHRpb246ICdFeHRlcm5hbCB2aWRlbyBwcm92aWRlci4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHN0cmVhbVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGxheWJhY2sgc3RyZWFtIHR5cGUgZm9yIHByb2Nlc3NlZCB2aWRlby4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHRodW1iQmFzZTY0OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Jhc2U2NC1lbmNvZGVkIHZpZGVvIHRodW1ibmFpbCBpbWFnZS4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHRodW1iRmlsZVR5cGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVmlkZW8gdGh1bWJuYWlsIGltYWdlIHR5cGUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICBwYXJ0Q291bnQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHVwbG9hZCBwYXJ0cyByZXF1ZXN0ZWQuJyxcbiAgICAgIHR5cGU6ICdJbnQnXG4gICAgfSxcbiAgICB0eXBlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1ZpZGVvIHR5cGUuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICB1cmw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgb3IgaG9zdGVkIFVSTCBmb3IgdGhlIHZpZGVvLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAgdmlkZW9JZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdWaWRlbyBJRC4nLFxuICAgICAgdHlwZTogJ0lEJ1xuICAgIH1cbiAgfSxcbiAgbmFtZTogJ1ZpZGVvSW5wdXQnXG59KTtcblxuZXhwb3J0IGNvbnN0IHZpZGVvVXBsb2FkUGFydFVybFR5cGUgPSBzY2hlbWFDb21wb3Nlci5jcmVhdGVPYmplY3RUQyh7XG4gIGZpZWxkczoge1xuICAgIHBhcnROdW1iZXI6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTXVsdGlwYXJ0IHVwbG9hZCBwYXJ0IG51bWJlci4nLFxuICAgICAgdHlwZTogJ0ludCdcbiAgICB9LFxuICAgIHVybDoge1xuICAgICAgZGVzY3JpcHRpb246ICdQcmVzaWduZWQgVVJMIGZvciB0aGlzIHVwbG9hZCBwYXJ0LicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH1cbiAgfSxcbiAgbmFtZTogJ1ZpZGVvVXBsb2FkUGFydFVybCdcbn0pO1xuXG5leHBvcnQgY29uc3QgdmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlID0gc2NoZW1hQ29tcG9zZXIuY3JlYXRlT2JqZWN0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBidWNrZXQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUzMgYnVja2V0IGZvciB0aGUgdXBsb2FkLicsXG4gICAgICB0eXBlOiAnU3RyaW5nJ1xuICAgIH0sXG4gICAga2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIGtleSBmb3IgdGhlIHVwbG9hZC4nLFxuICAgICAgdHlwZTogJ1N0cmluZydcbiAgICB9LFxuICAgIHBhcnRTaXplOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1JlY29tbWVuZGVkIHVwbG9hZCBwYXJ0IHNpemUgaW4gYnl0ZXMuJyxcbiAgICAgIHR5cGU6ICdJbnQnXG4gICAgfSxcbiAgICBwYXJ0VXJsczoge1xuICAgICAgZGVzY3JpcHRpb246ICdQcmVzaWduZWQgVVJMcyBmb3IgdXBsb2FkIHBhcnRzLicsXG4gICAgICB0eXBlOiBbdmlkZW9VcGxvYWRQYXJ0VXJsVHlwZV1cbiAgICB9LFxuICAgIHVwbG9hZElkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIG11bHRpcGFydCB1cGxvYWQgaWQuJyxcbiAgICAgIHR5cGU6ICdTdHJpbmcnXG4gICAgfSxcbiAgICB2aWRlbzoge1xuICAgICAgZGVzY3JpcHRpb246ICdQZW5kaW5nIHZpZGVvIHJlY29yZC4nLFxuICAgICAgdHlwZTogdmlkZW9UeXBlXG4gICAgfSxcbiAgICB2aWRlb0lkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1ZpZGVvIElEIGZvciB0aGUgdXBsb2FkLicsXG4gICAgICB0eXBlOiAnSUQnXG4gICAgfVxuICB9LFxuICBuYW1lOiAnVmlkZW9NdWx0aXBhcnRVcGxvYWQnXG59KTtcblxuZXhwb3J0IGNvbnN0IHZpZGVvVXBsb2FkUGFydElucHV0VHlwZSA9IHNjaGVtYUNvbXBvc2VyLmNyZWF0ZUlucHV0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBldGFnOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0VUYWcgcmV0dXJuZWQgYnkgUzMgZm9yIHRoaXMgdXBsb2FkZWQgcGFydC4nLFxuICAgICAgdHlwZTogJ1N0cmluZyEnXG4gICAgfSxcbiAgICBwYXJ0TnVtYmVyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ011bHRpcGFydCB1cGxvYWQgcGFydCBudW1iZXIuJyxcbiAgICAgIHR5cGU6ICdJbnQhJ1xuICAgIH1cbiAgfSxcbiAgbmFtZTogJ1ZpZGVvVXBsb2FkUGFydElucHV0J1xufSk7XG4iXSwibmFtZXMiOlsic2NoZW1hQ29tcG9zZXIiLCJwYXJzZUlkIiwiZ2V0SW1hZ2VVcmwiLCJnZXRWaWRlb1NpZ25lZEtleVVybCIsImdldFZpZGVvVXJsIiwiQ29uZmlnIiwiZG9jdW1lbnQiLCJnZXREb2N1bWVudEtleSIsInZhbHVlIiwibm9ybWFsaXplZFZhbHVlIiwiU3RyaW5nIiwidHJpbSIsInBhcnRzIiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiYXQiLCJ2aWRlb1R5cGUiLCJjcmVhdGVPYmplY3RUQyIsImZpZWxkcyIsImFkZGVkIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZHVyYXRpb25NcyIsImV4dGVybmFsSWQiLCJleHRlcm5hbFVybCIsImZpbGVTaXplIiwiZmlsZVR5cGUiLCJoZWlnaHQiLCJobHNVcmwiLCJyZXNvbHZlIiwiaXRlbSIsImhsc0tleSIsImdldCIsInBsYXliYWNrRmlsZVR5cGUiLCJwbGF5YmFja1VybCIsInBsYXliYWNrS2V5IiwicHJpdmFjeSIsIm1vZGlmaWVkIiwibWVkaWFDb252ZXJ0Sm9iSWQiLCJvd25lclBlcnNvbmFJZCIsIm93bmVyUGVyc29uYUltYWdlVXJsIiwiaW1hZ2VJZCIsIm93bmVyUGVyc29uYUltYWdlSWQiLCJ1c2VySWQiLCJvd25lclBlcnNvbmFVc2VySWQiLCJidWNrZXQiLCJpbWFnZURpciIsImltYWdlVHlwZSIsInR5cGVJZCIsInVybFR5cGUiLCJvd25lclBlcnNvbmFOYW1lIiwib3duZXJQZXJzb25hVGh1bWJVcmwiLCJwcm92aWRlciIsInByb2Nlc3NpbmdTdGF0dXMiLCJwcm9jZXNzaW5nRXJyb3IiLCJzb3VyY2VLZXkiLCJzdHJlYW1UeXBlIiwidGh1bWJVcmwiLCJfa2V5IiwidmlkZW9JZCIsInRodW1iRmlsZVR5cGUiLCJQcm9taXNlIiwidmlkZW9EaXIiLCJ1cmwiLCJ1cGxvYWRJZCIsInVwbG9hZEtleSIsInVwbG9hZFN0YXR1cyIsImtleSIsInBhcnNlZERvY0lkIiwiaWQiLCJfaWQiLCJ3aWR0aCIsIm5hbWUiLCJhZGRGaWVsZHMiLCJnZXRGaWVsZHMiLCJ2aWRlb0lucHV0VHlwZSIsImNyZWF0ZUlucHV0VEMiLCJiYXNlNjQiLCJmaWxlTmFtZSIsIml0ZW1JZCIsIml0ZW1UeXBlIiwidGh1bWJCYXNlNjQiLCJwYXJ0Q291bnQiLCJ2aWRlb1VwbG9hZFBhcnRVcmxUeXBlIiwicGFydE51bWJlciIsInZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZSIsInBhcnRTaXplIiwicGFydFVybHMiLCJ2aWRlbyIsInZpZGVvVXBsb2FkUGFydElucHV0VHlwZSIsImV0YWciXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUVELFNBQVFBLGNBQWMsUUFBTyxrQkFBa0I7QUFDL0MsU0FBUUMsT0FBTyxRQUFPLCtCQUErQjtBQUVyRCxTQUFRQyxXQUFXLFFBQU8sdUJBQXVCO0FBQ2pELFNBQVFDLG9CQUFvQixFQUFFQyxXQUFXLFFBQU8sdUJBQXVCO0FBQ3ZFLFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBQ3BDLFNBQVFDLFFBQVEsUUFBTyxnQkFBZ0I7QUFFdkMsTUFBTUMsaUJBQWlCLENBQUNDO0lBQ3RCLE1BQU1DLGtCQUFrQkMsT0FBT0YsU0FBUyxJQUFJRyxJQUFJO0lBRWhELElBQUcsQ0FBQ0YsaUJBQWlCO1FBQ25CLE9BQU87SUFDVDtJQUVBLE1BQU1HLFFBQVFILGdCQUFnQkksS0FBSyxDQUFDLEtBQUtDLE1BQU0sQ0FBQ0M7SUFDaEQsT0FBT0wsT0FBT0UsTUFBTUksRUFBRSxDQUFDLENBQUMsTUFBTVA7QUFDaEM7QUFFQSxPQUFPLE1BQU1RLFlBQVlqQixlQUFla0IsY0FBYyxDQUFDO0lBQ3JEQyxRQUFRO1FBQ05DLE9BQU87WUFDTEMsYUFBYTtZQUNiQyxNQUFNO1FBQ1I7UUFDQUQsYUFBYTtZQUNYQSxhQUFhO1lBQ2JDLE1BQU07UUFDUjtRQUNBQyxZQUFZO1lB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
@@ -29,4 +29,4 @@ export const videoGenerationResultType = schemaComposer.createObjectTC({
29
29
  name: 'VideoGenerationResult'
30
30
  });
31
31
 
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvb2JqZWN0VHlwZXMvdmlkZW9HZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5cbmV4cG9ydCBjb25zdCB2aWRlb0dlbmVyYXRpb25JbnB1dFR5cGUgPSBzY2hlbWFDb21wb3Nlci5jcmVhdGVJbnB1dFRDKHtcbiAgZmllbGRzOiB7XG4gICAgYXNwZWN0UmF0aW86ICdTdHJpbmcnLFxuICAgIGF1ZGlvVXJsczogJ1tTdHJpbmchXScsXG4gICAgZHVyYXRpb246ICdJbnQnLFxuICAgIGVuZEltYWdlVXJsOiAnU3RyaW5nJyxcbiAgICBnZW5lcmF0ZUF1ZGlvOiAnQm9vbGVhbicsXG4gICAgaW1hZ2VVcmw6ICdTdHJpbmcnLFxuICAgIGltYWdlVXJsczogJ1tTdHJpbmchXScsXG4gICAgbW9kZWw6ICdTdHJpbmcnLCBtb2RlbElucHV0OiAnSlNPTicsIG91dHB1dEZvcm1hdDogJ1N0cmluZycsXG4gICAgcHJvbXB0OiAnU3RyaW5nJyxcbiAgICBwcm92aWRlcjogJ1N0cmluZycsXG4gICAgcmVzb2x1dGlvbjogJ1N0cmluZycsXG4gICAgdmlkZW9VcmxzOiAnW1N0cmluZyFdJ1xuICB9LFxuICBuYW1lOiAnVmlkZW9HZW5lcmF0aW9uSW5wdXQnXG59KTtcbmV4cG9ydCBjb25zdCB2aWRlb0dlbmVyYXRpb25SZXN1bHRUeXBlID0gc2NoZW1hQ29tcG9zZXIuY3JlYXRlT2JqZWN0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBjYW5jZWxVcmw6ICdTdHJpbmcnLFxuICAgIHByb3ZpZGVyOiAnU3RyaW5nIScsXG4gICAgcmVxdWVzdElkOiAnU3RyaW5nIScsXG4gICAgc3RhdHVzOiAnU3RyaW5nIScsXG4gICAgc3RhdHVzVXJsOiAnU3RyaW5nISdcbiAgfSxcbiAgbmFtZTogJ1ZpZGVvR2VuZXJhdGlvblJlc3VsdCdcbn0pO1xuIl0sIm5hbWVzIjpbInNjaGVtYUNvbXBvc2VyIiwidmlkZW9HZW5lcmF0aW9uSW5wdXRUeXBlIiwiY3JlYXRlSW5wdXRUQyIsImZpZWxkcyIsImFzcGVjdFJhdGlvIiwiYXVkaW9VcmxzIiwiZHVyYXRpb24iLCJlbmRJbWFnZVVybCIsImdlbmVyYXRlQXVkaW8iLCJpbWFnZVVybCIsImltYWdlVXJscyIsIm1vZGVsIiwibW9kZWxJbnB1dCIsIm91dHB1dEZvcm1hdCIsInByb21wdCIsInByb3ZpZGVyIiwicmVzb2x1dGlvbiIsInZpZGVvVXJscyIsIm5hbWUiLCJ2aWRlb0dlbmVyYXRpb25SZXN1bHRUeXBlIiwiY3JlYXRlT2JqZWN0VEMiLCJjYW5jZWxVcmwiLCJyZXF1ZXN0SWQiLCJzdGF0dXMiLCJzdGF0dXNVcmwiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLGNBQWMsUUFBTyxrQkFBa0I7QUFFL0MsT0FBTyxNQUFNQywyQkFBMkJELGVBQWVFLGFBQWEsQ0FBQztJQUNuRUMsUUFBUTtRQUNOQyxhQUFhO1FBQ2JDLFdBQVc7UUFDWEMsVUFBVTtRQUNWQyxhQUFhO1FBQ2JDLGVBQWU7UUFDZkMsVUFBVTtRQUNWQyxXQUFXO1FBQ1hDLE9BQU87UUFBVUMsWUFBWTtRQUFRQyxjQUFjO1FBQ25EQyxRQUFRO1FBQ1JDLFVBQVU7UUFDVkMsWUFBWTtRQUNaQyxXQUFXO0lBQ2I7SUFDQUMsTUFBTTtBQUNSLEdBQUc7QUFDSCxPQUFPLE1BQU1DLDRCQUE0Qm5CLGVBQWVvQixjQUFjLENBQUM7SUFDckVqQixRQUFRO1FBQ05rQixXQUFXO1FBQ1hOLFVBQVU7UUFDVk8sV0FBVztRQUNYQyxRQUFRO1FBQ1JDLFdBQVc7SUFDYjtJQUNBTixNQUFNO0FBQ1IsR0FBRyJ9
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvb2JqZWN0VHlwZXMvdmlkZW9HZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2NoZW1hQ29tcG9zZXJ9IGZyb20gJ2dyYXBocWwtY29tcG9zZSc7XG5cbmV4cG9ydCBjb25zdCB2aWRlb0dlbmVyYXRpb25JbnB1dFR5cGUgPSBzY2hlbWFDb21wb3Nlci5jcmVhdGVJbnB1dFRDKHtcbiAgZmllbGRzOiB7XG4gICAgYXNwZWN0UmF0aW86ICdTdHJpbmcnLFxuICAgIGF1ZGlvVXJsczogJ1tTdHJpbmchXScsXG4gICAgZHVyYXRpb246ICdJbnQnLFxuICAgIGVuZEltYWdlVXJsOiAnU3RyaW5nJyxcbiAgICBnZW5lcmF0ZUF1ZGlvOiAnQm9vbGVhbicsXG4gICAgaW1hZ2VVcmw6ICdTdHJpbmcnLFxuICAgIGltYWdlVXJsczogJ1tTdHJpbmchXScsXG4gICAgbW9kZWw6ICdTdHJpbmcnLCBtb2RlbElucHV0OiAnSlNPTicsIG91dHB1dEZvcm1hdDogJ1N0cmluZycsXG4gICAgcHJvbXB0OiAnU3RyaW5nJyxcbiAgICBwcm92aWRlcjogJ1N0cmluZycsXG4gICAgcmVzb2x1dGlvbjogJ1N0cmluZycsXG4gICAgdmlkZW9VcmxzOiAnW1N0cmluZyFdJ1xuICB9LFxuICBuYW1lOiAnVmlkZW9HZW5lcmF0aW9uSW5wdXQnXG59KTtcbmV4cG9ydCBjb25zdCB2aWRlb0dlbmVyYXRpb25SZXN1bHRUeXBlID0gc2NoZW1hQ29tcG9zZXIuY3JlYXRlT2JqZWN0VEMoe1xuICBmaWVsZHM6IHtcbiAgICBjYW5jZWxVcmw6ICdTdHJpbmcnLFxuICAgIHByb3ZpZGVyOiAnU3RyaW5nIScsXG4gICAgcmVxdWVzdElkOiAnU3RyaW5nIScsXG4gICAgc3RhdHVzOiAnU3RyaW5nIScsXG4gICAgc3RhdHVzVXJsOiAnU3RyaW5nISdcbiAgfSxcbiAgbmFtZTogJ1ZpZGVvR2VuZXJhdGlvblJlc3VsdCdcbn0pO1xuIl0sIm5hbWVzIjpbInNjaGVtYUNvbXBvc2VyIiwidmlkZW9HZW5lcmF0aW9uSW5wdXRUeXBlIiwiY3JlYXRlSW5wdXRUQyIsImZpZWxkcyIsImFzcGVjdFJhdGlvIiwiYXVkaW9VcmxzIiwiZHVyYXRpb24iLCJlbmRJbWFnZVVybCIsImdlbmVyYXRlQXVkaW8iLCJpbWFnZVVybCIsImltYWdlVXJscyIsIm1vZGVsIiwibW9kZWxJbnB1dCIsIm91dHB1dEZvcm1hdCIsInByb21wdCIsInByb3ZpZGVyIiwicmVzb2x1dGlvbiIsInZpZGVvVXJscyIsIm5hbWUiLCJ2aWRlb0dlbmVyYXRpb25SZXN1bHRUeXBlIiwiY3JlYXRlT2JqZWN0VEMiLCJjYW5jZWxVcmwiLCJyZXF1ZXN0SWQiLCJzdGF0dXMiLCJzdGF0dXNVcmwiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLGNBQWMsUUFBTyxrQkFBa0I7QUFFL0MsT0FBTyxNQUFNQywyQkFBMkJELGVBQWVFLGFBQWEsQ0FBQztJQUNuRUMsUUFBUTtRQUNOQyxhQUFhO1FBQ2JDLFdBQVc7UUFDWEMsVUFBVTtRQUNWQyxhQUFhO1FBQ2JDLGVBQWU7UUFDZkMsVUFBVTtRQUNWQyxXQUFXO1FBQ1hDLE9BQU87UUFBVUMsWUFBWTtRQUFRQyxjQUFjO1FBQ25EQyxRQUFRO1FBQ1JDLFVBQVU7UUFDVkMsWUFBWTtRQUNaQyxXQUFXO0lBQ2I7SUFDQUMsTUFBTTtBQUNSLEdBQUc7QUFDSCxPQUFPLE1BQU1DLDRCQUE0Qm5CLGVBQWVvQixjQUFjLENBQUM7SUFDckVqQixRQUFRO1FBQ05rQixXQUFXO1FBQ1hOLFVBQVU7UUFDVk8sV0FBVztRQUNYQyxRQUFRO1FBQ1JDLFdBQVc7SUFDYjtJQUNBTixNQUFNO0FBQ1IsR0FBRyJ9
@@ -0,0 +1,7 @@
1
+ import { literal } from 'arangojs/aql';
2
+ import type { ApiContext } from '../types/auth.types.js';
3
+ import type { UserType } from '../types/users.types.js';
4
+ /** Recheck atomic enrollment at the legacy write, after an earlier unassociated-account lookup. */
5
+ export declare const organizationAccountWriteGuard: (context: ApiContext, collection: string, variable?: 'doc' | 'u') => ReturnType<typeof literal>;
6
+ /** Protect control-plane accounts under the same lock as ownership changes. */
7
+ export declare const organizationAccountMutation: (context: ApiContext, userId: string, operation: 'deactivate' | 'delete' | 'update', patch: Record<string, unknown>) => Promise<UserType | null>;
@@ -0,0 +1,106 @@
1
+ /* Stream-transaction steps and ordered retry assertions must execute sequentially. */ /* eslint-disable no-await-in-loop */ import { literal } from 'arangojs/aql';
2
+ import { organizationUserId } from './authorization.js';
3
+ import { activeMemberCount, writeSeatChange } from './membership.js';
4
+ import { organizationEdgeCollections, organizationStoreFor } from './store.js';
5
+ /** Recheck atomic enrollment at the legacy write, after an earlier unassociated-account lookup. */ export const organizationAccountWriteGuard = (context, collection, variable = 'doc')=>literal(collection === 'users' && process.env.ARANGODB_DATABASE && context.databaseName === process.env.ARANGODB_DATABASE ? `${variable}.organizationAccount != true` : 'true');
6
+ /** Protect control-plane accounts under the same lock as ownership changes. */ export const organizationAccountMutation = async (context, userId, operation, patch)=>{
7
+ if (!process.env.ARANGODB_DATABASE || context.databaseName !== process.env.ARANGODB_DATABASE) {
8
+ return null;
9
+ }
10
+ const key = userId.replace(/^users\//, '');
11
+ return organizationStoreFor(context).transaction(async (tx)=>{
12
+ const user = await tx.get('users', key);
13
+ const organizations = await tx.find('organizations', {
14
+ ownerUserId: key
15
+ });
16
+ const related = await tx.find('organizationMemberships', {
17
+ userId: key
18
+ });
19
+ if (!user || !user.organizationAccount && !organizations.length && !related.length) {
20
+ return null;
21
+ }
22
+ if (!context.session?.userId || organizationUserId(context) !== key) {
23
+ throw new Error('account_access_denied');
24
+ }
25
+ if (operation === 'update') {
26
+ if ([
27
+ 'organizationAccount',
28
+ 'verifiedEmail',
29
+ 'verifiedEmailCode',
30
+ 'verifiedEmailExpires',
31
+ 'verifiedPhone',
32
+ 'verifiedPhoneExpires',
33
+ 'verifiedSmsCode',
34
+ 'email',
35
+ 'phone',
36
+ 'active',
37
+ 'userAccess',
38
+ 'salt',
39
+ 'type',
40
+ 'username',
41
+ 'deleted',
42
+ '_key',
43
+ '_id',
44
+ '_rev'
45
+ ].some((field)=>patch[field] !== undefined)) {
46
+ throw new Error('protected_account_field');
47
+ }
48
+ if (patch.userId !== undefined && patch.userId !== key || patch.id !== undefined && patch.id !== `users/${key}`) {
49
+ throw new Error('protected_account_field');
50
+ }
51
+ const { id, userId: ignoredUserId, ...safePatch } = patch;
52
+ const updated = {
53
+ ...user,
54
+ ...safePatch
55
+ };
56
+ await tx.put('users', key, updated, user);
57
+ return updated;
58
+ }
59
+ if (organizations.length) {
60
+ throw new Error('ownership_transfer_required');
61
+ }
62
+ const memberships = related.filter((membership)=>membership.status === 'active');
63
+ for (const membership of memberships){
64
+ const org = await tx.get('organizations', membership.organizationId);
65
+ if (!org) {
66
+ throw new Error('organization_state_invalid');
67
+ }
68
+ const previousCount = await activeMemberCount(tx, org.organizationId);
69
+ await tx.put('organizationMemberships', membership._key, {
70
+ ...membership,
71
+ revision: membership.revision + 1,
72
+ status: 'deactivated',
73
+ updatedAt: Date.now()
74
+ }, membership);
75
+ await writeSeatChange(tx, org, previousCount - 1, Date.now(), previousCount);
76
+ }
77
+ if (operation === 'delete') {
78
+ for (const collection of organizationEdgeCollections){
79
+ const edges = [
80
+ ...await tx.find(collection, {
81
+ _from: `users/${key}`
82
+ }),
83
+ ...await tx.find(collection, {
84
+ _to: `users/${key}`
85
+ })
86
+ ];
87
+ const unique = new Map(edges.map((edge)=>[
88
+ edge._key,
89
+ edge
90
+ ]));
91
+ for (const edge of unique.values()){
92
+ await tx.remove(collection, edge);
93
+ }
94
+ }
95
+ await tx.remove('users', user);
96
+ } else {
97
+ await tx.put('users', key, {
98
+ ...user,
99
+ active: false
100
+ }, user);
101
+ }
102
+ return user;
103
+ });
104
+ }; /* Stream-transaction steps and ordered retry assertions must execute sequentially. */ /* ArangoDB document metadata uses these reserved field names. */ /* eslint no-underscore-dangle: ["warn", {"allow": ["_key", "_rev", "_id"]}] */
105
+
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvb3JnYW5pemF0aW9ucy9hY2NvdW50TGlmZWN5Y2xlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFN0cmVhbS10cmFuc2FjdGlvbiBzdGVwcyBhbmQgb3JkZXJlZCByZXRyeSBhc3NlcnRpb25zIG11c3QgZXhlY3V0ZSBzZXF1ZW50aWFsbHkuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1hd2FpdC1pbi1sb29wICovXG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7b3JnYW5pemF0aW9uVXNlcklkfSBmcm9tICcuL2F1dGhvcml6YXRpb24uanMnO1xuaW1wb3J0IHthY3RpdmVNZW1iZXJDb3VudCwgd3JpdGVTZWF0Q2hhbmdlfSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuaW1wb3J0IHtvcmdhbml6YXRpb25FZGdlQ29sbGVjdGlvbnMsIG9yZ2FuaXphdGlvblN0b3JlRm9yfSBmcm9tICcuL3N0b3JlLmpzJztcblxuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7T3JnYW5pemF0aW9uLCBPcmdhbml6YXRpb25NZW1iZXJzaGlwfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFJlY2hlY2sgYXRvbWljIGVucm9sbG1lbnQgYXQgdGhlIGxlZ2FjeSB3cml0ZSwgYWZ0ZXIgYW4gZWFybGllciB1bmFzc29jaWF0ZWQtYWNjb3VudCBsb29rdXAuICovXG5leHBvcnQgY29uc3Qgb3JnYW5pemF0aW9uQWNjb3VudFdyaXRlR3VhcmQgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbGxlY3Rpb246IHN0cmluZywgdmFyaWFibGU6ICdkb2MnIHwgJ3UnID0gJ2RvYydcbik6IFJldHVyblR5cGU8dHlwZW9mIGxpdGVyYWw+ID0+IGxpdGVyYWwoXG4gIGNvbGxlY3Rpb24gPT09ICd1c2VycycgJiYgcHJvY2Vzcy5lbnYuQVJBTkdPREJfREFUQUJBU0UgJiYgY29udGV4dC5kYXRhYmFzZU5hbWUgPT09IHByb2Nlc3MuZW52LkFSQU5HT0RCX0RBVEFCQVNFXG4gICAgPyBgJHt2YXJpYWJsZX0ub3JnYW5pemF0aW9uQWNjb3VudCAhPSB0cnVlYCA6ICd0cnVlJ1xuKTtcblxuLyoqIFByb3RlY3QgY29udHJvbC1wbGFuZSBhY2NvdW50cyB1bmRlciB0aGUgc2FtZSBsb2NrIGFzIG93bmVyc2hpcCBjaGFuZ2VzLiAqL1xuZXhwb3J0IGNvbnN0IG9yZ2FuaXphdGlvbkFjY291bnRNdXRhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogJ2RlYWN0aXZhdGUnIHwgJ2RlbGV0ZScgfCAndXBkYXRlJyxcbiAgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBpZighcHJvY2Vzcy5lbnYuQVJBTkdPREJfREFUQUJBU0UgfHwgY29udGV4dC5kYXRhYmFzZU5hbWUgIT09IHByb2Nlc3MuZW52LkFSQU5HT0RCX0RBVEFCQVNFKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qga2V5ID0gdXNlcklkLnJlcGxhY2UoL151c2Vyc1xcLy8sICcnKTtcbiAgcmV0dXJuIG9yZ2FuaXphdGlvblN0b3JlRm9yKGNvbnRleHQpLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0eC5nZXQ8VXNlclR5cGUgJiB7b3JnYW5pemF0aW9uQWNjb3VudD86IGJvb2xlYW59PigndXNlcnMnLCBrZXkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbnMgPSBhd2FpdCB0eC5maW5kPE9yZ2FuaXphdGlvbj4oJ29yZ2FuaXphdGlvbnMnLCB7b3duZXJVc2VySWQ6IGtleX0pO1xuICAgIGNvbnN0IHJlbGF0ZWQgPSBhd2FpdCB0eC5maW5kPE9yZ2FuaXphdGlvbk1lbWJlcnNoaXA+KCdvcmdhbml6YXRpb25NZW1iZXJzaGlwcycsIHt1c2VySWQ6IGtleX0pO1xuICAgIGlmKCF1c2VyIHx8ICghdXNlci5vcmdhbml6YXRpb25BY2NvdW50ICYmICFvcmdhbml6YXRpb25zLmxlbmd0aCAmJiAhcmVsYXRlZC5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYoIWNvbnRleHQuc2Vzc2lvbj8udXNlcklkIHx8IG9yZ2FuaXphdGlvblVzZXJJZChjb250ZXh0KSAhPT0ga2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FjY291bnRfYWNjZXNzX2RlbmllZCcpO1xuICAgIH1cbiAgICBpZihvcGVyYXRpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICBpZihcbiAgICAgICAgW1xuICAgICAgICAgICdvcmdhbml6YXRpb25BY2NvdW50JyxcbiAgICAgICAgICAndmVyaWZpZWRFbWFpbCcsXG4gICAgICAgICAgJ3ZlcmlmaWVkRW1haWxDb2RlJyxcbiAgICAgICAgICAndmVyaWZpZWRFbWFpbEV4cGlyZXMnLFxuICAgICAgICAgICd2ZXJpZmllZFBob25lJyxcbiAgICAgICAgICAndmVyaWZpZWRQaG9uZUV4cGlyZXMnLFxuICAgICAgICAgICd2ZXJpZmllZFNtc0NvZGUnLFxuICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgJ3Bob25lJyxcbiAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgICAgICAndXNlckFjY2VzcycsXG4gICAgICAgICAgJ3NhbHQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAndXNlcm5hbWUnLFxuICAgICAgICAgICdkZWxldGVkJyxcbiAgICAgICAgICAnX2tleScsXG4gICAgICAgICAgJ19pZCcsXG4gICAgICAgICAgJ19yZXYnXG4gICAgICAgIF0uc29tZSgoZmllbGQpID0+IHBhdGNoW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvdGVjdGVkX2FjY291bnRfZmllbGQnKTtcbiAgICAgIH1cbiAgICAgIGlmKFxuICAgICAgICAocGF0Y2gudXNlcklkICE9PSB1bmRlZmluZWQgJiYgcGF0Y2gudXNlcklkICE9PSBrZXkpIHx8XG4gICAgICAgIChwYXRjaC5pZCAhPT0gdW5kZWZpbmVkICYmIHBhdGNoLmlkICE9PSBgdXNlcnMvJHtrZXl9YClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3RlY3RlZF9hY2NvdW50X2ZpZWxkJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB7aWQsIHVzZXJJZDogaWdub3JlZFVzZXJJZCwgLi4uc2FmZVBhdGNofSA9IHBhdGNoO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsuLi51c2VyLCAuLi5zYWZlUGF0Y2h9O1xuICAgICAgYXdhaXQgdHgucHV0KCd1c2VycycsIGtleSwgdXBkYXRlZCwgdXNlcik7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gICAgaWYob3JnYW5pemF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3duZXJzaGlwX3RyYW5zZmVyX3JlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gcmVsYXRlZC5maWx0ZXIoKG1lbWJlcnNoaXApID0+IG1lbWJlcnNoaXAuc3RhdHVzID09PSAnYWN0aXZlJyk7XG4gICAgZm9yKGNvbnN0IG1lbWJlcnNoaXAgb2YgbWVtYmVyc2hpcHMpIHtcbiAgICAgIGNvbnN0IG9yZyA9IGF3YWl0IHR4LmdldDxPcmdhbml6YXRpb24+KCdvcmdhbml6YXRpb25zJywgbWVtYmVyc2hpcC5vcmdhbml6YXRpb25JZCk7XG4gICAgICBpZighb3JnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3JnYW5pemF0aW9uX3N0YXRlX2ludmFsaWQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZXZpb3VzQ291bnQgPSBhd2FpdCBhY3RpdmVNZW1iZXJDb3VudCh0eCwgb3JnLm9yZ2FuaXphdGlvbklkKTtcbiAgICAgIGF3YWl0IHR4LnB1dChcbiAgICAgICAgJ29yZ2FuaXphdGlvbk1lbWJlcnNoaXBzJyxcbiAgICAgICAgbWVtYmVyc2hpcC5fa2V5LFxuICAgICAgICB7Li4ubWVtYmVyc2hpcCwgcmV2aXNpb246IG1lbWJlcnNoaXAucmV2aXNpb24gKyAxLCBzdGF0dXM6ICdkZWFjdGl2YXRlZCcsIHVwZGF0ZWRBdDogRGF0ZS5ub3coKX0sXG4gICAgICAgIG1lbWJlcnNoaXBcbiAgICAgICk7XG4gICAgICBhd2FpdCB3cml0ZVNlYXRDaGFuZ2UodHgsIG9yZywgcHJldmlvdXNDb3VudCAtIDEsIERhdGUubm93KCksIHByZXZpb3VzQ291bnQpO1xuICAgIH1cbiAgICBpZihvcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICBmb3IoY29uc3QgY29sbGVjdGlvbiBvZiBvcmdhbml6YXRpb25FZGdlQ29sbGVjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZWRnZXMgPSBbXG4gICAgICAgICAgLi4uKGF3YWl0IHR4LmZpbmQoY29sbGVjdGlvbiwge19mcm9tOiBgdXNlcnMvJHtrZXl9YH0pKSxcbiAgICAgICAgICAuLi4oYXdhaXQgdHguZmluZChjb2xsZWN0aW9uLCB7X3RvOiBgdXNlcnMvJHtrZXl9YH0pKVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCB1bmlxdWUgPSBuZXcgTWFwKGVkZ2VzLm1hcCgoZWRnZSkgPT4gW2VkZ2UuX2tleSwgZWRnZV0pKTtcbiAgICAgICAgZm9yKGNvbnN0IGVkZ2Ugb2YgdW5pcXVlLnZhbHVlcygpKSB7XG4gICAgICAgICAgYXdhaXQgdHgucmVtb3ZlKGNvbGxlY3Rpb24sIGVkZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCB0eC5yZW1vdmUoJ3VzZXJzJywgdXNlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHR4LnB1dCgndXNlcnMnLCBrZXksIHsuLi51c2VyLCBhY3RpdmU6IGZhbHNlfSwgdXNlcik7XG4gICAgfVxuICAgIHJldHVybiB1c2VyO1xuICB9KTtcbn07XG4vKiBTdHJlYW0tdHJhbnNhY3Rpb24gc3RlcHMgYW5kIG9yZGVyZWQgcmV0cnkgYXNzZXJ0aW9ucyBtdXN0IGV4ZWN1dGUgc2VxdWVudGlhbGx5LiAqL1xuXG4vKiBBcmFuZ29EQiBkb2N1bWVudCBtZXRhZGF0YSB1c2VzIHRoZXNlIHJlc2VydmVkIGZpZWxkIG5hbWVzLiAqL1xuLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBbXCJ3YXJuXCIsIHtcImFsbG93XCI6IFtcIl9rZXlcIiwgXCJfcmV2XCIsIFwiX2lkXCJdfV0gKi9cbiJdLCJuYW1lcyI6WyJsaXRlcmFsIiwib3JnYW5pemF0aW9uVXNlcklkIiwiYWN0aXZlTWVtYmVyQ291bnQiLCJ3cml0ZVNlYXRDaGFuZ2UiLCJvcmdhbml6YXRpb25FZGdlQ29sbGVjdGlvbnMiLCJvcmdhbml6YXRpb25TdG9yZUZvciIsIm9yZ2FuaXphdGlvbkFjY291bnRXcml0ZUd1YXJkIiwiY29udGV4dCIsImNvbGxlY3Rpb24iLCJ2YXJpYWJsZSIsInByb2Nlc3MiLCJlbnYiLCJBUkFOR09EQl9EQVRBQkFTRSIsImRhdGFiYXNlTmFtZSIsIm9yZ2FuaXphdGlvbkFjY291bnRNdXRhdGlvbiIsInVzZXJJZCIsIm9wZXJhdGlvbiIsInBhdGNoIiwia2V5IiwicmVwbGFjZSIsInRyYW5zYWN0aW9uIiwidHgiLCJ1c2VyIiwiZ2V0Iiwib3JnYW5pemF0aW9ucyIsImZpbmQiLCJvd25lclVzZXJJZCIsInJlbGF0ZWQiLCJvcmdhbml6YXRpb25BY2NvdW50IiwibGVuZ3RoIiwic2Vzc2lvbiIsIkVycm9yIiwic29tZSIsImZpZWxkIiwidW5kZWZpbmVkIiwiaWQiLCJpZ25vcmVkVXNlcklkIiwic2FmZVBhdGNoIiwidXBkYXRlZCIsInB1dCIsIm1lbWJlcnNoaXBzIiwiZmlsdGVyIiwibWVtYmVyc2hpcCIsInN0YXR1cyIsIm9yZyIsIm9yZ2FuaXphdGlvbklkIiwicHJldmlvdXNDb3VudCIsIl9rZXkiLCJyZXZpc2lvbiIsInVwZGF0ZWRBdCIsIkRhdGUiLCJub3ciLCJlZGdlcyIsIl9mcm9tIiwiX3RvIiwidW5pcXVlIiwiTWFwIiwibWFwIiwiZWRnZSIsInZhbHVlcyIsInJlbW92ZSIsImFjdGl2ZSJdLCJtYXBwaW5ncyI6IkFBQUEsb0ZBQW9GLEdBQ3BGLG1DQUFtQyxHQUNuQyxTQUFRQSxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxrQkFBa0IsUUFBTyxxQkFBcUI7QUFDdEQsU0FBUUMsaUJBQWlCLEVBQUVDLGVBQWUsUUFBTyxrQkFBa0I7QUFDbkUsU0FBUUMsMkJBQTJCLEVBQUVDLG9CQUFvQixRQUFPLGFBQWE7QUFNN0UsaUdBQWlHLEdBQ2pHLE9BQU8sTUFBTUMsZ0NBQWdDLENBQzNDQyxTQUFxQkMsWUFBb0JDLFdBQXdCLEtBQUssR0FDdkNULFFBQy9CUSxlQUFlLFdBQVdFLFFBQVFDLEdBQUcsQ0FBQ0MsaUJBQWlCLElBQUlMLFFBQVFNLFlBQVksS0FBS0gsUUFBUUMsR0FBRyxDQUFDQyxpQkFBaUIsR0FDN0csR0FBR0gsU0FBUyw0QkFBNEIsQ0FBQyxHQUFHLFFBQ2hEO0FBRUYsNkVBQTZFLEdBQzdFLE9BQU8sTUFBTUssOEJBQThCLE9BQ3pDUCxTQUNBUSxRQUNBQyxXQUNBQztJQUVBLElBQUcsQ0FBQ1AsUUFBUUMsR0FBRyxDQUFDQyxpQkFBaUIsSUFBSUwsUUFBUU0sWUFBWSxLQUFLSCxRQUFRQyxHQUFHLENBQUNDLGlCQUFpQixFQUFFO1FBQzNGLE9BQU87SUFDVDtJQUNBLE1BQU1NLE1BQU1ILE9BQU9JLE9BQU8sQ0FBQyxZQUFZO0lBQ3ZDLE9BQU9kLHFCQUFxQkUsU0FBU2EsV0FBVyxDQUFDLE9BQU9DO1FBQ3RELE1BQU1DLE9BQU8sTUFBTUQsR0FBR0UsR0FBRyxDQUE2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
@@ -0,0 +1,9 @@
1
+ import { type OrganizationTransaction } from './store.js';
2
+ import type { ApiContext } from '../types/auth.types.js';
3
+ import type { Organization, OrganizationAccess } from './types.js';
4
+ export declare const organizationUserId: (context: ApiContext) => string;
5
+ export declare const organizationAccessInTransaction: (tx: OrganizationTransaction, context: ApiContext, organizationId: string, role: 'member' | 'admin' | 'owner') => Promise<OrganizationAccess>;
6
+ export declare const requireOrganizationAccess: (context: ApiContext, organizationId: string, role: 'member' | 'admin' | 'owner') => Promise<OrganizationAccess>;
7
+ export declare const listOrganizations: (context: ApiContext) => Promise<(Organization & {
8
+ canManage: boolean;
9
+ })[]>;
@@ -0,0 +1,40 @@
1
+ /* Stream-transaction steps and ordered retry assertions must execute sequentially. */ /* eslint-disable no-await-in-loop */ import { organizationKey, organizationStoreFor, requireIdentifier } from './store.js';
2
+ export const organizationUserId = (context)=>{
3
+ if (!context.session?.userId) {
4
+ throw new Error('authentication_required');
5
+ }
6
+ return requireIdentifier(context.session.userId.replace(/^users\//, ''));
7
+ };
8
+ export const organizationAccessInTransaction = async (tx, context, organizationId, role)=>{
9
+ const userId = organizationUserId(context);
10
+ const organization = await tx.get('organizations', requireIdentifier(organizationId));
11
+ const membership = await tx.get('organizationMemberships', organizationKey(organizationId, userId));
12
+ const user = await tx.get('users', userId);
13
+ if (!organization || !membership || membership.status !== 'active' || user?.active !== true || role === 'admin' && membership.role !== 'admin' || role === 'owner' && organization.ownerUserId !== userId) {
14
+ throw new Error('organization_access_denied');
15
+ }
16
+ return {
17
+ membership,
18
+ organization,
19
+ userId
20
+ };
21
+ };
22
+ export const requireOrganizationAccess = (context, organizationId, role)=>organizationStoreFor(context).transaction((tx)=>organizationAccessInTransaction(tx, context, organizationId, role));
23
+ export const listOrganizations = (context)=>organizationStoreFor(context).transaction(async (tx)=>{
24
+ const userId = organizationUserId(context);
25
+ const memberships = await tx.find('organizationMemberships', {
26
+ status: 'active',
27
+ userId
28
+ });
29
+ const result = [];
30
+ for (const membership of memberships){
31
+ const access = await organizationAccessInTransaction(tx, context, membership.organizationId, 'member');
32
+ result.push({
33
+ ...access.organization,
34
+ canManage: access.membership.role === 'admin'
35
+ });
36
+ }
37
+ return result;
38
+ }); /* Stream-transaction steps and ordered retry assertions must execute sequentially. */ /* ArangoDB document metadata uses these reserved field names. */ /* eslint no-underscore-dangle: ["warn", {"allow": ["_key", "_rev", "_id"]}] */
39
+
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvb3JnYW5pemF0aW9ucy9hdXRob3JpemF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFN0cmVhbS10cmFuc2FjdGlvbiBzdGVwcyBhbmQgb3JkZXJlZCByZXRyeSBhc3NlcnRpb25zIG11c3QgZXhlY3V0ZSBzZXF1ZW50aWFsbHkuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1hd2FpdC1pbi1sb29wICovXG5pbXBvcnQge1xuICBvcmdhbml6YXRpb25LZXksXG4gIG9yZ2FuaXphdGlvblN0b3JlRm9yLFxuICByZXF1aXJlSWRlbnRpZmllcixcbiAgdHlwZSBPcmdhbml6YXRpb25UcmFuc2FjdGlvblxufSBmcm9tICcuL3N0b3JlLmpzJztcblxuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge09yZ2FuaXphdGlvbiwgT3JnYW5pemF0aW9uQWNjZXNzLCBPcmdhbml6YXRpb25NZW1iZXJzaGlwfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNvbnN0IG9yZ2FuaXphdGlvblVzZXJJZCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogc3RyaW5nID0+IHtcbiAgaWYoIWNvbnRleHQuc2Vzc2lvbj8udXNlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhdXRoZW50aWNhdGlvbl9yZXF1aXJlZCcpO1xuICB9XG4gIHJldHVybiByZXF1aXJlSWRlbnRpZmllcihjb250ZXh0LnNlc3Npb24udXNlcklkLnJlcGxhY2UoL151c2Vyc1xcLy8sICcnKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgb3JnYW5pemF0aW9uQWNjZXNzSW5UcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgdHg6IE9yZ2FuaXphdGlvblRyYW5zYWN0aW9uLFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcmdhbml6YXRpb25JZDogc3RyaW5nLFxuICByb2xlOiAnbWVtYmVyJyB8ICdhZG1pbicgfCAnb3duZXInXG4pOiBQcm9taXNlPE9yZ2FuaXphdGlvbkFjY2Vzcz4gPT4ge1xuICBjb25zdCB1c2VySWQgPSBvcmdhbml6YXRpb25Vc2VySWQoY29udGV4dCk7XG4gIGNvbnN0IG9yZ2FuaXphdGlvbiA9IGF3YWl0IHR4LmdldDxPcmdhbml6YXRpb24+KCdvcmdhbml6YXRpb25zJywgcmVxdWlyZUlkZW50aWZpZXIob3JnYW5pemF0aW9uSWQpKTtcbiAgY29uc3QgbWVtYmVyc2hpcCA9IGF3YWl0IHR4LmdldDxPcmdhbml6YXRpb25NZW1iZXJzaGlwPihcbiAgICAnb3JnYW5pemF0aW9uTWVtYmVyc2hpcHMnLFxuICAgIG9yZ2FuaXphdGlvbktleShvcmdhbml6YXRpb25JZCwgdXNlcklkKVxuICApO1xuICBjb25zdCB1c2VyID0gYXdhaXQgdHguZ2V0PHthY3RpdmU/OiBib29sZWFufT4oJ3VzZXJzJywgdXNlcklkKTtcbiAgaWYoXG4gICAgIW9yZ2FuaXphdGlvbiB8fFxuICAgICFtZW1iZXJzaGlwIHx8XG4gICAgbWVtYmVyc2hpcC5zdGF0dXMgIT09ICdhY3RpdmUnIHx8XG4gICAgdXNlcj8uYWN0aXZlICE9PSB0cnVlIHx8XG4gICAgKHJvbGUgPT09ICdhZG1pbicgJiYgbWVtYmVyc2hpcC5yb2xlICE9PSAnYWRtaW4nKSB8fFxuICAgIChyb2xlID09PSAnb3duZXInICYmIG9yZ2FuaXphdGlvbi5vd25lclVzZXJJZCAhPT0gdXNlcklkKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29yZ2FuaXphdGlvbl9hY2Nlc3NfZGVuaWVkJyk7XG4gIH1cbiAgcmV0dXJuIHttZW1iZXJzaGlwLCBvcmdhbml6YXRpb24sIHVzZXJJZH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVxdWlyZU9yZ2FuaXphdGlvbkFjY2VzcyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZyxcbiAgcm9sZTogJ21lbWJlcicgfCAnYWRtaW4nIHwgJ293bmVyJ1xuKTogUHJvbWlzZTxPcmdhbml6YXRpb25BY2Nlc3M+ID0+XG4gIG9yZ2FuaXphdGlvblN0b3JlRm9yKGNvbnRleHQpLnRyYW5zYWN0aW9uKCh0eCkgPT5cbiAgICBvcmdhbml6YXRpb25BY2Nlc3NJblRyYW5zYWN0aW9uKHR4LCBjb250ZXh0LCBvcmdhbml6YXRpb25JZCwgcm9sZSlcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGxpc3RPcmdhbml6YXRpb25zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPChPcmdhbml6YXRpb24gJiB7Y2FuTWFuYWdlOiBib29sZWFufSlbXT4gPT5cbiAgb3JnYW5pemF0aW9uU3RvcmVGb3IoY29udGV4dCkudHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gICAgY29uc3QgdXNlcklkID0gb3JnYW5pemF0aW9uVXNlcklkKGNvbnRleHQpO1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdHguZmluZDxPcmdhbml6YXRpb25NZW1iZXJzaGlwPignb3JnYW5pemF0aW9uTWVtYmVyc2hpcHMnLCB7XG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgdXNlcklkXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0OiAoT3JnYW5pemF0aW9uICYge2Nhbk1hbmFnZTogYm9vbGVhbn0pW10gPSBbXTtcbiAgICBmb3IoY29uc3QgbWVtYmVyc2hpcCBvZiBtZW1iZXJzaGlwcykge1xuICAgICAgY29uc3QgYWNjZXNzID0gYXdhaXQgb3JnYW5pemF0aW9uQWNjZXNzSW5UcmFuc2FjdGlvbih0eCwgY29udGV4dCwgbWVtYmVyc2hpcC5vcmdhbml6YXRpb25JZCwgJ21lbWJlcicpO1xuICAgICAgcmVzdWx0LnB1c2goey4uLmFjY2Vzcy5vcmdhbml6YXRpb24sIGNhbk1hbmFnZTogYWNjZXNzLm1lbWJlcnNoaXAucm9sZSA9PT0gJ2FkbWluJ30pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbi8qIFN0cmVhbS10cmFuc2FjdGlvbiBzdGVwcyBhbmQgb3JkZXJlZCByZXRyeSBhc3NlcnRpb25zIG11c3QgZXhlY3V0ZSBzZXF1ZW50aWFsbHkuICovXG5cbi8qIEFyYW5nb0RCIGRvY3VtZW50IG1ldGFkYXRhIHVzZXMgdGhlc2UgcmVzZXJ2ZWQgZmllbGQgbmFtZXMuICovXG4vKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFtcIndhcm5cIiwge1wiYWxsb3dcIjogW1wiX2tleVwiLCBcIl9yZXZcIiwgXCJfaWRcIl19XSAqL1xuIl0sIm5hbWVzIjpbIm9yZ2FuaXphdGlvbktleSIsIm9yZ2FuaXphdGlvblN0b3JlRm9yIiwicmVxdWlyZUlkZW50aWZpZXIiLCJvcmdhbml6YXRpb25Vc2VySWQiLCJjb250ZXh0Iiwic2Vzc2lvbiIsInVzZXJJZCIsIkVycm9yIiwicmVwbGFjZSIsIm9yZ2FuaXphdGlvbkFjY2Vzc0luVHJhbnNhY3Rpb24iLCJ0eCIsIm9yZ2FuaXphdGlvbklkIiwicm9sZSIsIm9yZ2FuaXphdGlvbiIsImdldCIsIm1lbWJlcnNoaXAiLCJ1c2VyIiwic3RhdHVzIiwiYWN0aXZlIiwib3duZXJVc2VySWQiLCJyZXF1aXJlT3JnYW5pemF0aW9uQWNjZXNzIiwidHJhbnNhY3Rpb24iLCJsaXN0T3JnYW5pemF0aW9ucyIsIm1lbWJlcnNoaXBzIiwiZmluZCIsInJlc3VsdCIsImFjY2VzcyIsInB1c2giLCJjYW5NYW5hZ2UiXSwibWFwcGluZ3MiOiJBQUFBLG9GQUFvRixHQUNwRixtQ0FBbUMsR0FDbkMsU0FDRUEsZUFBZSxFQUNmQyxvQkFBb0IsRUFDcEJDLGlCQUFpQixRQUVaLGFBQWE7QUFLcEIsT0FBTyxNQUFNQyxxQkFBcUIsQ0FBQ0M7SUFDakMsSUFBRyxDQUFDQSxRQUFRQyxPQUFPLEVBQUVDLFFBQVE7UUFDM0IsTUFBTSxJQUFJQyxNQUFNO0lBQ2xCO0lBQ0EsT0FBT0wsa0JBQWtCRSxRQUFRQyxPQUFPLENBQUNDLE1BQU0sQ0FBQ0UsT0FBTyxDQUFDLFlBQVk7QUFDdEUsRUFBRTtBQUVGLE9BQU8sTUFBTUMsa0NBQWtDLE9BQzdDQyxJQUNBTixTQUNBTyxnQkFDQUM7SUFFQSxNQUFNTixTQUFTSCxtQkFBbUJDO0lBQ2xDLE1BQU1TLGVBQWUsTUFBTUgsR0FBR0ksR0FBRyxDQUFlLGlCQUFpQlosa0JBQWtCUztJQUNuRixNQUFNSSxhQUFhLE1BQU1MLEdBQUdJLEdBQUcsQ0FDN0IsMkJBQ0FkLGdCQUFnQlcsZ0JBQWdCTDtJQUVsQyxNQUFNVSxPQUFPLE1BQU1OLEdBQUdJLEdBQUcsQ0FBcUIsU0FBU1I7SUFDdkQsSUFDRSxDQUFDTyxnQkFDRCxDQUFDRSxjQUNEQSxXQUFXRSxNQUFNLEtBQUssWUFDdEJELE1BQU1FLFdBQVcsUUFDaEJOLFNBQVMsV0FBV0csV0FBV0gsSUFBSSxLQUFLLFdBQ3hDQSxTQUFTLFdBQVdDLGFBQWFNLFdBQVcsS0FBS2IsUUFDbEQ7UUFDQSxNQUFNLElBQUlDLE1BQU07SUFDbEI7SUFDQSxPQUFPO1FBQUNRO1FBQVlGO1FBQWNQO0lBQU07QUFDMUMsRUFBRTtBQUVGLE9BQU8sTUFBTWMsNEJBQTRCLENBQ3ZDaEIsU0FDQU8sZ0JBQ0FDLE9BRUFYLHFCQUFxQkcsU0FBU2lCLFdBQVcsQ0FBQyxDQUFDWCxLQUN6Q0QsZ0NBQWdDQyxJQUFJTixTQUFTTyxnQkFBZ0JDLE9BQzdEO0FBRUosT0FBTyxNQUFNVSxvQkFBb0IsQ0FBQ2xCLFVBQ2hDSCxxQkFBcUJHLFNBQVNpQixXQUFXLENBQUMsT0FBT1g7UUFDL0MsTUFBTUosU0FBU0gsbUJBQW1CQztRQUNsQyxNQUFNbUIsY0FBYyxNQUFNYixHQUFHYyxJQUFJLENBQXlCLDJCQUEyQjtZQUNuRlAsUUFBUTtZQUNSWDtRQUNGO1FBQ0EsTUFBTW1CLFNBQWtELEVBQUU7UUFDMUQsS0FBSSxNQUFNVixjQUFjUSxZQUFhO1lBQ25DLE1BQU1HLFNBQVMsTUFBTWpCLGdDQUFnQ0MsSUFBSU4sU0FBU1csV0FBV0osY0FBYyxFQUFFO1lBQzdGYyxPQUFPRSxJQUFJLENBQUM7Z0JBQUMsR0FBR0QsT0FBT2IsWUFBWTtnQkFBRWUsV0FBV0YsT0FBT1gsVUFBVSxDQUFDSCxJQUFJLEtBQUs7WUFBTztRQUNwRjtRQUNBLE9BQU9hO0lBQ1QsR0FBRyxDQUNMLG9GQUFvRixJQUVwRiwrREFBK0QsSUFDL0QsNkVBQTZFIn0=
@@ -0,0 +1,38 @@
1
+ import { type OrganizationTransaction } from './store.js';
2
+ import type { ApiContext } from '../types/auth.types.js';
3
+ import type { CheckoutResult, MembershipChange, OrganizationMembership, OveragePreference, PlanKey, ProviderSubscription, SeatChangeQuote, SubscriptionSummary } from './types.js';
4
+ export type CheckoutAttempt = Readonly<{
5
+ generation: number;
6
+ key: string;
7
+ leaseExpires: number;
8
+ owner: string;
9
+ plan: PlanKey;
10
+ quantity: number;
11
+ sequence: number;
12
+ session?: CheckoutResult;
13
+ }>;
14
+ export type OrganizationBilling = Readonly<{
15
+ checkout?: CheckoutAttempt;
16
+ customerId: string;
17
+ organizationId: string;
18
+ overage?: OveragePreference;
19
+ pendingChange?: string | null;
20
+ periodEnd?: number | null;
21
+ plan?: PlanKey | null;
22
+ status?: string;
23
+ subscription?: ProviderSubscription | null;
24
+ }>;
25
+ export declare const requireBillingAdmin: (tx: OrganizationTransaction, context: ApiContext, organizationId: string) => Promise<{
26
+ membership: OrganizationMembership;
27
+ organization: import("./types.js").Organization;
28
+ userId: string;
29
+ email: string;
30
+ }>;
31
+ export declare const getOrganizationSubscription: (context: ApiContext, organizationId: string) => Promise<SubscriptionSummary>;
32
+ export declare const createOrganizationCheckout: (context: ApiContext, organizationId: string, plan: PlanKey, requestId: string) => Promise<{
33
+ url: string;
34
+ }>;
35
+ export declare const createOrganizationBillingPortal: (context: ApiContext, organizationId: string) => Promise<{
36
+ url: string;
37
+ }>;
38
+ export declare const quoteOrganizationSeatChange: (context: ApiContext, organizationId: string, change: MembershipChange) => Promise<SeatChangeQuote>;