payload-better-auth 1.0.1 → 1.0.2
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.
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ To build your own Payload plugin, all you need is:
|
|
|
13
13
|
|
|
14
14
|
1. Install: `pnpm i`
|
|
15
15
|
2. Generate import map for payload: `cd packages/plugins/dev && pnpx payload generate:importmap`
|
|
16
|
-
3. Initialize / migrate the better-auth database: `pnpx @better-auth/cli migrate --yes` (
|
|
16
|
+
3. Initialize / migrate the better-auth database: `cd ../ && pnpx @better-auth/cli migrate --yes --config ./dev/lib/auth.ts` (Run from `dev` directory)
|
|
17
17
|
4. Run dev: `pnpm dev`
|
|
18
18
|
|
|
19
19
|
## Background
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/plugins/reconcile-queue-plugin.ts
|
|
2
|
-
import { APIError
|
|
2
|
+
import { APIError } from 'better-auth/api';
|
|
3
|
+
import { createAuthEndpoint, createAuthMiddleware } from 'better-auth/plugins';
|
|
3
4
|
import { createDatabaseHooks } from './databaseHooks.js';
|
|
4
5
|
import { Queue } from './reconcile-queue.js';
|
|
5
6
|
import { createDeleteUserFromPayload, createListPayloadUsersPage, createSyncUserToPayload } from './sources.js';
|
|
@@ -89,6 +90,37 @@ export const payloadBetterAuthPlugin = (opts)=>{
|
|
|
89
90
|
});
|
|
90
91
|
})
|
|
91
92
|
},
|
|
93
|
+
hooks: {
|
|
94
|
+
before: [
|
|
95
|
+
{
|
|
96
|
+
handler: createAuthMiddleware(async (ctx)=>{
|
|
97
|
+
const locale = ctx.getHeader('User-Locale');
|
|
98
|
+
return Promise.resolve({
|
|
99
|
+
context: {
|
|
100
|
+
...ctx,
|
|
101
|
+
body: {
|
|
102
|
+
...ctx.body,
|
|
103
|
+
locale: locale ?? undefined
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}),
|
|
108
|
+
matcher: (context)=>{
|
|
109
|
+
return context.path === '/sign-up/email';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
schema: {
|
|
115
|
+
user: {
|
|
116
|
+
fields: {
|
|
117
|
+
locale: {
|
|
118
|
+
type: 'string',
|
|
119
|
+
required: false
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
92
124
|
// TODO: the queue must be destroyed on better auth instance destruction, as it utilizes timers.
|
|
93
125
|
async init ({ internalAdapter, password }) {
|
|
94
126
|
if (opts.createAdmins) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/better-auth/plugin.ts"],"sourcesContent":["// src/plugins/reconcile-queue-plugin.ts\nimport type { AuthContext, BetterAuthPlugin, DeepPartial } from 'better-auth'\nimport type { SanitizedConfig } from 'payload'\n\nimport { APIError, createAuthEndpoint } from 'better-auth/api'\n\nimport { createDatabaseHooks } from './databaseHooks.js'\nimport { type InitOptions, Queue } from './reconcile-queue.js'\nimport {\n type BAUser,\n createDeleteUserFromPayload,\n createListPayloadUsersPage,\n createSyncUserToPayload,\n} from './sources.js'\n\ntype PayloadSyncPluginContext = { payloadSyncPlugin: { queue: Queue } } & AuthContext\n\ntype CreateAdminsUser = Parameters<AuthContext['internalAdapter']['createUser']>['0']\n\nconst defaultLog = (msg: string, extra?: unknown) => {\n console.log(`[reconcile] ${msg}`, extra ? JSON.stringify(extra, null, 2) : '')\n}\n\nexport const payloadBetterAuthPlugin = (\n opts: {\n createAdmins?: { overwrite?: boolean; user: CreateAdminsUser }[]\n enableLogging?: boolean\n payloadConfig: Promise<SanitizedConfig>\n token: string // simple header token for admin endpoints,\n } & InitOptions,\n): BetterAuthPlugin => {\n return {\n id: 'reconcile-queue-plugin',\n endpoints: {\n run: createAuthEndpoint(\n '/reconcile/run',\n { method: 'POST' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n throw new APIError('UNAUTHORIZED', { message: 'invalid token' })\n }\n await (context as PayloadSyncPluginContext).payloadSyncPlugin.queue.seedFullReconcile()\n return json({ ok: true })\n },\n ),\n status: createAuthEndpoint(\n '/reconcile/status',\n { method: 'GET' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n return Promise.reject(\n new APIError('UNAUTHORIZED', { message: 'invalid token' }) as Error,\n )\n }\n return json((context as PayloadSyncPluginContext).payloadSyncPlugin.queue.status())\n },\n ),\n // convenience for tests/admin tools (optional)\n authMethods: createAuthEndpoint(\n '/auth/methods',\n { method: 'GET' },\n async ({ context, json }) => {\n const authMethods: string[] = []\n\n // Check if emailAndPassword is enabled, or if present at all (not present defaults to false)\n if (context.options.emailAndPassword?.enabled) {\n authMethods.push('emailAndPassword')\n }\n\n return await json({ authMethods })\n },\n ),\n deleteNow: createAuthEndpoint(\n '/reconcile/delete',\n { method: 'POST' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n throw new APIError('UNAUTHORIZED', { message: 'invalid token' })\n }\n const body = (await request?.json().catch(() => ({}))) as { baId?: string } | undefined\n const baId = body?.baId\n if (!baId) {\n throw new APIError('BAD_REQUEST', { message: 'missing baId' })\n }\n ;(context as PayloadSyncPluginContext).payloadSyncPlugin.queue.enqueueDelete(\n baId,\n true,\n 'user-operation',\n )\n return json({ ok: true })\n },\n ),\n ensureNow: createAuthEndpoint(\n '/reconcile/ensure',\n { method: 'POST' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n throw new APIError('UNAUTHORIZED', { message: 'invalid token' })\n }\n const body = (await request?.json().catch(() => ({}))) as { user?: BAUser } | undefined\n const user = body?.user\n if (!user?.id) {\n throw new APIError('BAD_REQUEST', { message: 'missing user' })\n }\n ;(context as PayloadSyncPluginContext).payloadSyncPlugin.queue.enqueueEnsure(\n user,\n true,\n 'user-operation',\n )\n return json({ ok: true })\n },\n ),\n },\n // TODO: the queue must be destroyed on better auth instance destruction, as it utilizes timers.\n async init({ internalAdapter, password }) {\n if (opts.createAdmins) {\n try {\n await Promise.all(\n opts.createAdmins.map(async ({ overwrite, user }) => {\n const alreadyExistingUser = await internalAdapter.findUserByEmail(user.email)\n if (alreadyExistingUser) {\n if (overwrite) {\n // clear accounts\n await internalAdapter.deleteAccounts(alreadyExistingUser.user.id)\n const createdUser = await internalAdapter.updateUser(\n alreadyExistingUser.user.id,\n {\n ...user,\n role: 'admin',\n },\n )\n // assuming this creates an account?\n await internalAdapter.linkAccount({\n accountId: createdUser.id,\n password: await password.hash(user.password),\n providerId: 'credential',\n userId: createdUser.id,\n })\n }\n }\n // if the user doesnt exist there can't be an account\n else {\n const createdUser = await internalAdapter.createUser({ ...user, role: 'admin' })\n await internalAdapter.linkAccount({\n accountId: createdUser.id,\n password: await password.hash(user.password),\n providerId: 'credential',\n userId: createdUser.id,\n })\n }\n }),\n )\n } catch (error) {\n if (opts.enableLogging) {\n defaultLog('Failed to create Admin user', error)\n }\n }\n }\n\n const queue = new Queue(\n {\n deleteUserFromPayload: createDeleteUserFromPayload(opts.payloadConfig),\n internalAdapter,\n listPayloadUsersPage: createListPayloadUsersPage(opts.payloadConfig),\n log: opts.enableLogging ? defaultLog : undefined,\n syncUserToPayload: createSyncUserToPayload(opts.payloadConfig),\n },\n opts,\n )\n return {\n context: { payloadSyncPlugin: { queue } } as DeepPartial<Omit<AuthContext, 'options'>>,\n options: {\n databaseHooks: createDatabaseHooks({ config: opts.payloadConfig }),\n user: { deleteUser: { enabled: true } },\n },\n }\n },\n }\n}\n"],"names":["APIError","createAuthEndpoint","createDatabaseHooks","Queue","createDeleteUserFromPayload","createListPayloadUsersPage","createSyncUserToPayload","defaultLog","msg","extra","console","log","JSON","stringify","payloadBetterAuthPlugin","opts","id","endpoints","run","method","context","json","request","token","headers","get","message","payloadSyncPlugin","queue","seedFullReconcile","ok","status","Promise","reject","authMethods","options","emailAndPassword","enabled","push","deleteNow","body","catch","baId","enqueueDelete","ensureNow","user","enqueueEnsure","init","internalAdapter","password","createAdmins","all","map","overwrite","alreadyExistingUser","findUserByEmail","email","deleteAccounts","createdUser","updateUser","role","linkAccount","accountId","hash","providerId","userId","createUser","error","enableLogging","deleteUserFromPayload","payloadConfig","listPayloadUsersPage","undefined","syncUserToPayload","databaseHooks","config","deleteUser"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/better-auth/plugin.ts"],"sourcesContent":["// src/plugins/reconcile-queue-plugin.ts\nimport type { AuthContext, BetterAuthPlugin, DeepPartial } from 'better-auth'\nimport type { SanitizedConfig } from 'payload'\n\nimport { APIError } from 'better-auth/api'\nimport { createAuthEndpoint, createAuthMiddleware } from 'better-auth/plugins'\n\nimport { createDatabaseHooks } from './databaseHooks.js'\nimport { type InitOptions, Queue } from './reconcile-queue.js'\nimport {\n type BAUser,\n createDeleteUserFromPayload,\n createListPayloadUsersPage,\n createSyncUserToPayload,\n} from './sources.js'\n\ntype PayloadSyncPluginContext = { payloadSyncPlugin: { queue: Queue } } & AuthContext\n\ntype CreateAdminsUser = Parameters<AuthContext['internalAdapter']['createUser']>['0']\n\nconst defaultLog = (msg: string, extra?: unknown) => {\n console.log(`[reconcile] ${msg}`, extra ? JSON.stringify(extra, null, 2) : '')\n}\n\nexport const payloadBetterAuthPlugin = (\n opts: {\n createAdmins?: { overwrite?: boolean; user: CreateAdminsUser }[]\n enableLogging?: boolean\n payloadConfig: Promise<SanitizedConfig>\n token: string // simple header token for admin endpoints,\n } & InitOptions,\n): BetterAuthPlugin => {\n return {\n id: 'reconcile-queue-plugin',\n endpoints: {\n run: createAuthEndpoint(\n '/reconcile/run',\n { method: 'POST' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n throw new APIError('UNAUTHORIZED', { message: 'invalid token' })\n }\n await (context as PayloadSyncPluginContext).payloadSyncPlugin.queue.seedFullReconcile()\n return json({ ok: true })\n },\n ),\n status: createAuthEndpoint(\n '/reconcile/status',\n { method: 'GET' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n return Promise.reject(\n new APIError('UNAUTHORIZED', { message: 'invalid token' }) as Error,\n )\n }\n return json((context as PayloadSyncPluginContext).payloadSyncPlugin.queue.status())\n },\n ),\n // convenience for tests/admin tools (optional)\n authMethods: createAuthEndpoint(\n '/auth/methods',\n { method: 'GET' },\n async ({ context, json }) => {\n const authMethods: string[] = []\n\n // Check if emailAndPassword is enabled, or if present at all (not present defaults to false)\n if (context.options.emailAndPassword?.enabled) {\n authMethods.push('emailAndPassword')\n }\n\n return await json({ authMethods })\n },\n ),\n deleteNow: createAuthEndpoint(\n '/reconcile/delete',\n { method: 'POST' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n throw new APIError('UNAUTHORIZED', { message: 'invalid token' })\n }\n const body = (await request?.json().catch(() => ({}))) as { baId?: string } | undefined\n const baId = body?.baId\n if (!baId) {\n throw new APIError('BAD_REQUEST', { message: 'missing baId' })\n }\n ;(context as PayloadSyncPluginContext).payloadSyncPlugin.queue.enqueueDelete(\n baId,\n true,\n 'user-operation',\n )\n return json({ ok: true })\n },\n ),\n ensureNow: createAuthEndpoint(\n '/reconcile/ensure',\n { method: 'POST' },\n async ({ context, json, request }) => {\n if (opts.token && request?.headers.get('x-reconcile-token') !== opts.token) {\n throw new APIError('UNAUTHORIZED', { message: 'invalid token' })\n }\n const body = (await request?.json().catch(() => ({}))) as { user?: BAUser } | undefined\n const user = body?.user\n if (!user?.id) {\n throw new APIError('BAD_REQUEST', { message: 'missing user' })\n }\n ;(context as PayloadSyncPluginContext).payloadSyncPlugin.queue.enqueueEnsure(\n user,\n true,\n 'user-operation',\n )\n return json({ ok: true })\n },\n ),\n },\n hooks: {\n before: [\n {\n handler: createAuthMiddleware(async (ctx) => {\n const locale = ctx.getHeader('User-Locale')\n return Promise.resolve({\n context: { ...ctx, body: { ...ctx.body, locale: locale ?? undefined } },\n })\n }),\n matcher: (context) => {\n return context.path === '/sign-up/email'\n },\n },\n ],\n },\n schema: {\n user: {\n fields: {\n locale: {\n type: 'string',\n required: false,\n },\n },\n },\n },\n // TODO: the queue must be destroyed on better auth instance destruction, as it utilizes timers.\n async init({ internalAdapter, password }) {\n if (opts.createAdmins) {\n try {\n await Promise.all(\n opts.createAdmins.map(async ({ overwrite, user }) => {\n const alreadyExistingUser = await internalAdapter.findUserByEmail(user.email)\n if (alreadyExistingUser) {\n if (overwrite) {\n // clear accounts\n await internalAdapter.deleteAccounts(alreadyExistingUser.user.id)\n const createdUser = await internalAdapter.updateUser(\n alreadyExistingUser.user.id,\n {\n ...user,\n role: 'admin',\n },\n )\n // assuming this creates an account?\n await internalAdapter.linkAccount({\n accountId: createdUser.id,\n password: await password.hash(user.password),\n providerId: 'credential',\n userId: createdUser.id,\n })\n }\n }\n // if the user doesnt exist there can't be an account\n else {\n const createdUser = await internalAdapter.createUser({ ...user, role: 'admin' })\n await internalAdapter.linkAccount({\n accountId: createdUser.id,\n password: await password.hash(user.password),\n providerId: 'credential',\n userId: createdUser.id,\n })\n }\n }),\n )\n } catch (error) {\n if (opts.enableLogging) {\n defaultLog('Failed to create Admin user', error)\n }\n }\n }\n\n const queue = new Queue(\n {\n deleteUserFromPayload: createDeleteUserFromPayload(opts.payloadConfig),\n internalAdapter,\n listPayloadUsersPage: createListPayloadUsersPage(opts.payloadConfig),\n log: opts.enableLogging ? defaultLog : undefined,\n syncUserToPayload: createSyncUserToPayload(opts.payloadConfig),\n },\n opts,\n )\n return {\n context: { payloadSyncPlugin: { queue } } as DeepPartial<Omit<AuthContext, 'options'>>,\n options: {\n databaseHooks: createDatabaseHooks({ config: opts.payloadConfig }),\n user: { deleteUser: { enabled: true } },\n },\n }\n },\n }\n}\n"],"names":["APIError","createAuthEndpoint","createAuthMiddleware","createDatabaseHooks","Queue","createDeleteUserFromPayload","createListPayloadUsersPage","createSyncUserToPayload","defaultLog","msg","extra","console","log","JSON","stringify","payloadBetterAuthPlugin","opts","id","endpoints","run","method","context","json","request","token","headers","get","message","payloadSyncPlugin","queue","seedFullReconcile","ok","status","Promise","reject","authMethods","options","emailAndPassword","enabled","push","deleteNow","body","catch","baId","enqueueDelete","ensureNow","user","enqueueEnsure","hooks","before","handler","ctx","locale","getHeader","resolve","undefined","matcher","path","schema","fields","type","required","init","internalAdapter","password","createAdmins","all","map","overwrite","alreadyExistingUser","findUserByEmail","email","deleteAccounts","createdUser","updateUser","role","linkAccount","accountId","hash","providerId","userId","createUser","error","enableLogging","deleteUserFromPayload","payloadConfig","listPayloadUsersPage","syncUserToPayload","databaseHooks","config","deleteUser"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
const reconcileUrl = `${betterAuthUrl}/api/auth/reconcile/run`;
|
|
14
14
|
payload.logger.info('Triggering full reconcile from Payload onInit...');
|
|
15
15
|
const response = await fetch(reconcileUrl, {
|
|
16
|
+
body: JSON.stringify({}),
|
|
16
17
|
headers: {
|
|
17
18
|
'Content-Type': 'application/json',
|
|
18
19
|
'x-reconcile-token': reconcileToken
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/payload-reconcile.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\n/**\n * Triggers a full reconcile operation via the Better Auth reconcile API\n * This is typically called during Payload initialization to ensure data consistency\n */\nexport async function triggerFullReconcile(payload: Payload): Promise<void> {\n try {\n const reconcileToken = process.env.RECONCILE_TOKEN\n if (!reconcileToken) {\n payload.logger.warn('RECONCILE_TOKEN not set, skipping onInit reconcile trigger')\n return\n }\n\n // Determine the better-auth server URL\n const betterAuthUrl = process.env.BETTER_AUTH_URL || 'http://localhost:3000'\n const reconcileUrl = `${betterAuthUrl}/api/auth/reconcile/run`\n\n payload.logger.info('Triggering full reconcile from Payload onInit...')\n\n const response = await fetch(reconcileUrl, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-reconcile-token': reconcileToken,\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n throw new Error(`Reconcile request failed: ${response.status} ${response.statusText}`)\n }\n\n const result = await response.json()\n payload.logger.info('Full reconcile triggered successfully from Payload onInit', { result })\n } catch (error) {\n payload.logger.error('Failed to trigger full reconcile from Payload onInit', { error })\n // Don't throw - we don't want to prevent Payload from starting if reconcile fails\n }\n}\n"],"names":["triggerFullReconcile","payload","reconcileToken","process","env","RECONCILE_TOKEN","logger","warn","betterAuthUrl","BETTER_AUTH_URL","reconcileUrl","info","response","fetch","headers","method","ok","Error","status","statusText","result","json","error"],"mappings":"AAEA;;;CAGC,GACD,OAAO,eAAeA,qBAAqBC,OAAgB;IACzD,IAAI;QACF,MAAMC,iBAAiBC,QAAQC,GAAG,CAACC,eAAe;QAClD,IAAI,CAACH,gBAAgB;YACnBD,QAAQK,MAAM,CAACC,IAAI,CAAC;YACpB;QACF;QAEA,uCAAuC;QACvC,MAAMC,gBAAgBL,QAAQC,GAAG,CAACK,eAAe,IAAI;QACrD,MAAMC,eAAe,GAAGF,cAAc,uBAAuB,CAAC;QAE9DP,QAAQK,MAAM,CAACK,IAAI,CAAC;QAEpB,MAAMC,WAAW,MAAMC,MAAMH,cAAc;YACzCI,SAAS;gBACP,gBAAgB;gBAChB,
|
|
1
|
+
{"version":3,"sources":["../../src/utils/payload-reconcile.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\n/**\n * Triggers a full reconcile operation via the Better Auth reconcile API\n * This is typically called during Payload initialization to ensure data consistency\n */\nexport async function triggerFullReconcile(payload: Payload): Promise<void> {\n try {\n const reconcileToken = process.env.RECONCILE_TOKEN\n if (!reconcileToken) {\n payload.logger.warn('RECONCILE_TOKEN not set, skipping onInit reconcile trigger')\n return\n }\n\n // Determine the better-auth server URL\n const betterAuthUrl = process.env.BETTER_AUTH_URL || 'http://localhost:3000'\n const reconcileUrl = `${betterAuthUrl}/api/auth/reconcile/run`\n\n payload.logger.info('Triggering full reconcile from Payload onInit...')\n\n const response = await fetch(reconcileUrl, {\n body: JSON.stringify({}),\n headers: {\n 'Content-Type': 'application/json',\n 'x-reconcile-token': reconcileToken,\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n throw new Error(`Reconcile request failed: ${response.status} ${response.statusText}`)\n }\n\n const result = await response.json()\n payload.logger.info('Full reconcile triggered successfully from Payload onInit', { result })\n } catch (error) {\n payload.logger.error('Failed to trigger full reconcile from Payload onInit', { error })\n // Don't throw - we don't want to prevent Payload from starting if reconcile fails\n }\n}\n"],"names":["triggerFullReconcile","payload","reconcileToken","process","env","RECONCILE_TOKEN","logger","warn","betterAuthUrl","BETTER_AUTH_URL","reconcileUrl","info","response","fetch","body","JSON","stringify","headers","method","ok","Error","status","statusText","result","json","error"],"mappings":"AAEA;;;CAGC,GACD,OAAO,eAAeA,qBAAqBC,OAAgB;IACzD,IAAI;QACF,MAAMC,iBAAiBC,QAAQC,GAAG,CAACC,eAAe;QAClD,IAAI,CAACH,gBAAgB;YACnBD,QAAQK,MAAM,CAACC,IAAI,CAAC;YACpB;QACF;QAEA,uCAAuC;QACvC,MAAMC,gBAAgBL,QAAQC,GAAG,CAACK,eAAe,IAAI;QACrD,MAAMC,eAAe,GAAGF,cAAc,uBAAuB,CAAC;QAE9DP,QAAQK,MAAM,CAACK,IAAI,CAAC;QAEpB,MAAMC,WAAW,MAAMC,MAAMH,cAAc;YACzCI,MAAMC,KAAKC,SAAS,CAAC,CAAC;YACtBC,SAAS;gBACP,gBAAgB;gBAChB,qBAAqBf;YACvB;YACAgB,QAAQ;QACV;QAEA,IAAI,CAACN,SAASO,EAAE,EAAE;YAChB,MAAM,IAAIC,MAAM,CAAC,0BAA0B,EAAER,SAASS,MAAM,CAAC,CAAC,EAAET,SAASU,UAAU,EAAE;QACvF;QAEA,MAAMC,SAAS,MAAMX,SAASY,IAAI;QAClCvB,QAAQK,MAAM,CAACK,IAAI,CAAC,6DAA6D;YAAEY;QAAO;IAC5F,EAAE,OAAOE,OAAO;QACdxB,QAAQK,MAAM,CAACmB,KAAK,CAAC,wDAAwD;YAAEA;QAAM;IACrF,kFAAkF;IACpF;AACF"}
|