@fitzzero/quickdraw-core 5.1.1 → 5.1.3

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 (152) hide show
  1. package/README.md +1308 -219
  2. package/dist/{admin-DKwkIh5i.d.ts → admin-CS7JB_UH.d.ts} +2 -2
  3. package/dist/{adminSchemas-2DUA_hZ8.d.ts → adminSchemas-29cGgrg5.d.ts} +6 -4
  4. package/dist/{auth-BhWqdyb-.d.ts → auth-DtdYjrZ9.d.ts} +51 -21
  5. package/dist/{caller-CXTFswBO.d.ts → caller-BTwGl7vm.d.ts} +296 -33
  6. package/dist/chunk-2FDSKLBO.js +82 -0
  7. package/dist/chunk-2FDSKLBO.js.map +1 -0
  8. package/dist/{chunk-RT6OILOI.js → chunk-4D2DOGAW.js} +2 -14
  9. package/dist/chunk-4D2DOGAW.js.map +1 -0
  10. package/dist/{chunk-OECZPRPW.js → chunk-64I6MYBC.js} +162 -775
  11. package/dist/chunk-64I6MYBC.js.map +1 -0
  12. package/dist/chunk-7473HK24.js +17 -0
  13. package/dist/chunk-7473HK24.js.map +1 -0
  14. package/dist/chunk-7Y5ROPXL.js +33 -0
  15. package/dist/chunk-7Y5ROPXL.js.map +1 -0
  16. package/dist/chunk-A2RBQD66.js +7 -0
  17. package/dist/chunk-A2RBQD66.js.map +1 -0
  18. package/dist/chunk-AK23XSWD.js +16 -0
  19. package/dist/chunk-AK23XSWD.js.map +1 -0
  20. package/dist/chunk-ASAMUGHG.js +651 -0
  21. package/dist/chunk-ASAMUGHG.js.map +1 -0
  22. package/dist/{chunk-B2P7AZ25.js → chunk-CYE4UBOB.js} +6 -4
  23. package/dist/chunk-CYE4UBOB.js.map +1 -0
  24. package/dist/chunk-DKE6QO26.js +136 -0
  25. package/dist/chunk-DKE6QO26.js.map +1 -0
  26. package/dist/chunk-DNP65TD5.js +832 -0
  27. package/dist/chunk-DNP65TD5.js.map +1 -0
  28. package/dist/{chunk-H23KEFBA.js → chunk-DUBU3BB3.js} +30 -1
  29. package/dist/chunk-DUBU3BB3.js.map +1 -0
  30. package/dist/chunk-GYLWEJHW.js +19 -0
  31. package/dist/chunk-GYLWEJHW.js.map +1 -0
  32. package/dist/{chunk-SHEGLZEP.js → chunk-I3JCFS7H.js} +34 -13
  33. package/dist/chunk-I3JCFS7H.js.map +1 -0
  34. package/dist/{chunk-X5CWPX7H.js → chunk-IIQ3WMJK.js} +13 -2
  35. package/dist/chunk-IIQ3WMJK.js.map +1 -0
  36. package/dist/{chunk-RZTP4IEW.js → chunk-JVTONQFI.js} +6339 -4226
  37. package/dist/chunk-JVTONQFI.js.map +1 -0
  38. package/dist/{chunk-QEKVYG5F.js → chunk-KKQANRLG.js} +2 -2
  39. package/dist/chunk-KKQANRLG.js.map +1 -0
  40. package/dist/{chunk-CDKG4TFA.js → chunk-MPQAT55F.js} +38 -205
  41. package/dist/chunk-MPQAT55F.js.map +1 -0
  42. package/dist/chunk-NO4M6PO5.js +101 -0
  43. package/dist/chunk-NO4M6PO5.js.map +1 -0
  44. package/dist/{chunk-TBMKJ26R.js → chunk-NW6U45HX.js} +3 -1
  45. package/dist/chunk-NW6U45HX.js.map +1 -0
  46. package/dist/chunk-NX2V6SIL.js +202 -0
  47. package/dist/chunk-NX2V6SIL.js.map +1 -0
  48. package/dist/{chunk-ZIVPHYRG.js → chunk-NZHA4TZD.js} +72 -175
  49. package/dist/chunk-NZHA4TZD.js.map +1 -0
  50. package/dist/{chunk-2PWMUVC7.js → chunk-OCZJ4EYV.js} +518 -27
  51. package/dist/chunk-OCZJ4EYV.js.map +1 -0
  52. package/dist/{chunk-REX5YPHX.js → chunk-PHCURHC7.js} +76 -21
  53. package/dist/chunk-PHCURHC7.js.map +1 -0
  54. package/dist/{chunk-4YO5H5ON.js → chunk-Q4OGQM5I.js} +4 -10
  55. package/dist/chunk-Q4OGQM5I.js.map +1 -0
  56. package/dist/chunk-QSU47XEX.js +13 -0
  57. package/dist/chunk-QSU47XEX.js.map +1 -0
  58. package/dist/{chunk-DD4SKCNO.js → chunk-RZXJTDH5.js} +13 -2
  59. package/dist/chunk-RZXJTDH5.js.map +1 -0
  60. package/dist/{chunk-Z2LZ7IZ7.js → chunk-SN3OZVEQ.js} +5 -31
  61. package/dist/chunk-SN3OZVEQ.js.map +1 -0
  62. package/dist/{chunk-4DIQHASK.js → chunk-SQ5VUG77.js} +28 -8
  63. package/dist/chunk-SQ5VUG77.js.map +1 -0
  64. package/dist/chunk-STH5DLQP.js +1192 -0
  65. package/dist/chunk-STH5DLQP.js.map +1 -0
  66. package/dist/{chunk-QCHKWIRS.js → chunk-VZFJTKIW.js} +13 -13
  67. package/dist/{chunk-QCHKWIRS.js.map → chunk-VZFJTKIW.js.map} +1 -1
  68. package/dist/{chunk-VSQBHPWH.js → chunk-X4ZU4QH5.js} +54 -22
  69. package/dist/chunk-X4ZU4QH5.js.map +1 -0
  70. package/dist/chunk-XD7SRDUY.js +188 -0
  71. package/dist/chunk-XD7SRDUY.js.map +1 -0
  72. package/dist/chunk-XH2IZVLT.js +62 -0
  73. package/dist/chunk-XH2IZVLT.js.map +1 -0
  74. package/dist/chunk-Z7I6SONO.js +825 -0
  75. package/dist/chunk-Z7I6SONO.js.map +1 -0
  76. package/dist/cli/quickdraw-docs.js +132 -112
  77. package/dist/cli/quickdraw-docs.js.map +1 -1
  78. package/dist/client/core.d.ts +387 -0
  79. package/dist/client/core.js +109 -0
  80. package/dist/client/index.d.ts +52 -203
  81. package/dist/client/index.js +59 -218
  82. package/dist/client/index.js.map +1 -1
  83. package/dist/{clientTypes-Bc-G8n-U.d.ts → clientTypes-CUUNJwWs.d.ts} +3 -3
  84. package/dist/{connection-Cr1BU07W.d.ts → connection-2EeQ_Et0.d.ts} +22 -11
  85. package/dist/{createServer-CP9eDHZZ.d.ts → createServer-Bx5HOcYK.d.ts} +67 -17
  86. package/dist/{createTestApp-UKVGEmOf.d.ts → createTestApp-DAMANT79.d.ts} +46 -13
  87. package/dist/{envelope-Cp3YcVxC.d.ts → envelope-BMBaxppV.d.ts} +216 -10
  88. package/dist/{http-Djj2Inuu.d.ts → http-YzLAar3w.d.ts} +76 -60
  89. package/dist/index.d.ts +8 -7
  90. package/dist/index.js +82 -25
  91. package/dist/index.js.map +1 -1
  92. package/dist/{infer-Teo1xpsd.d.ts → infer-Br62cnyW.d.ts} +82 -11
  93. package/dist/logger-Yz93KzdV.d.ts +30 -0
  94. package/dist/{metrics-BdBu5o8G.d.ts → metrics-CTVpw0gu.d.ts} +2 -2
  95. package/dist/origins-kvpxnVcW.d.ts +8 -0
  96. package/dist/parser.js +2 -1
  97. package/dist/prisma/index.d.ts +14 -7
  98. package/dist/prisma/index.js +279 -70
  99. package/dist/prisma/index.js.map +1 -1
  100. package/dist/{rateLimit-ZMIZJUZF.js → rateLimit-5RKBFLUR.js} +2 -2
  101. package/dist/rateLimit-5RKBFLUR.js.map +1 -0
  102. package/dist/remote-N7OUAGOW.js +15 -0
  103. package/dist/remote-N7OUAGOW.js.map +1 -0
  104. package/dist/server/auth/index.d.ts +82 -33
  105. package/dist/server/auth/index.js +277 -270
  106. package/dist/server/auth/index.js.map +1 -1
  107. package/dist/server/express/index.d.ts +9 -2
  108. package/dist/server/express/index.js +1 -1
  109. package/dist/server/index.d.ts +268 -84
  110. package/dist/server/index.js +664 -418
  111. package/dist/server/index.js.map +1 -1
  112. package/dist/server/mcp/index.d.ts +89 -27
  113. package/dist/server/mcp/index.js +281 -62
  114. package/dist/server/mcp/index.js.map +1 -1
  115. package/dist/server/otel.d.ts +3 -3
  116. package/dist/{sharing-DVa8W-yR.d.ts → sharing-BrsmlDv_.d.ts} +3 -3
  117. package/dist/testing/client.d.ts +14 -14
  118. package/dist/testing/client.js +19 -10
  119. package/dist/testing/client.js.map +1 -1
  120. package/dist/testing/index.d.ts +50 -13
  121. package/dist/testing/index.js +113 -21
  122. package/dist/testing/index.js.map +1 -1
  123. package/dist/testing/mock.d.ts +5 -5
  124. package/dist/testing/mock.js +17 -9
  125. package/dist/tracked-BR5b2O-U.d.ts +43 -0
  126. package/dist/{types-Cu0vmx7c.d.ts → types-CLRCQGnO.d.ts} +4 -3
  127. package/dist/types-tMagHbjy.d.ts +151 -0
  128. package/dist/utils/index.d.ts +16 -4
  129. package/dist/utils/index.js +6 -3
  130. package/package.json +5 -1
  131. package/dist/chunk-2PWMUVC7.js.map +0 -1
  132. package/dist/chunk-4DIQHASK.js.map +0 -1
  133. package/dist/chunk-4YO5H5ON.js.map +0 -1
  134. package/dist/chunk-B2P7AZ25.js.map +0 -1
  135. package/dist/chunk-CDKG4TFA.js.map +0 -1
  136. package/dist/chunk-DD4SKCNO.js.map +0 -1
  137. package/dist/chunk-H23KEFBA.js.map +0 -1
  138. package/dist/chunk-OECZPRPW.js.map +0 -1
  139. package/dist/chunk-QEKVYG5F.js.map +0 -1
  140. package/dist/chunk-REX5YPHX.js.map +0 -1
  141. package/dist/chunk-RT6OILOI.js.map +0 -1
  142. package/dist/chunk-RZTP4IEW.js.map +0 -1
  143. package/dist/chunk-SHEGLZEP.js.map +0 -1
  144. package/dist/chunk-TBMKJ26R.js.map +0 -1
  145. package/dist/chunk-VSQBHPWH.js.map +0 -1
  146. package/dist/chunk-X5CWPX7H.js.map +0 -1
  147. package/dist/chunk-YSWH776Y.js +0 -13
  148. package/dist/chunk-YSWH776Y.js.map +0 -1
  149. package/dist/chunk-Z2LZ7IZ7.js.map +0 -1
  150. package/dist/chunk-ZIVPHYRG.js.map +0 -1
  151. package/dist/logger-BY28acW-.d.ts +0 -16
  152. /package/dist/{rateLimit-ZMIZJUZF.js.map → client/core.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/keys.ts","../src/client/members.ts"],"sourcesContent":["// TanStack Query keys (RFC 0003 section 11.5): a method call's result is\n// cached under `[\"qd\", service, \"m\", method, input]`, a live entity under\n// `[\"qd\", service, \"e\", id]` and a live collection scope under\n// `[\"qd\", service, \"c\", collection, scope]`, with the service's wire name\n// (the contract's `name`) and the input as the caller passed it. TanStack\n// hashes a key with sorted object keys, so two inputs with the same fields\n// share one cache entry whatever their key order. 4.1 put\n// `JSON.stringify(payload)` in the key\n// (4.1 `src/client/useServiceQuery.ts:88-91`), which made the cache depend\n// on key order and hid the input from `queryKey` filters.\n//\n// React-free: the hooks, the server-side caller and non-React code build the\n// same keys from here, so a query prefetched on the server is the one the\n// hook reads.\n\n/** The first element of every key the client caches under. */\nexport const KEY_ROOT = \"qd\";\n\n/** The key of one method call's result: `[\"qd\", service, \"m\", method, input]`. */\nexport type MethodQueryKey<Input = unknown> = readonly [\n root: typeof KEY_ROOT,\n service: string,\n kind: \"m\",\n method: string,\n input: Input,\n];\n\n/** The prefix of every key of one method: matches all its inputs in a `queryKey` filter. */\nexport type MethodKeyPrefix = readonly [\n root: typeof KEY_ROOT,\n service: string,\n kind: \"m\",\n method: string,\n];\n\n/** The prefix of every key of one service: its method calls, and later its entities and collections. */\nexport type ServiceKeyPrefix = readonly [root: typeof KEY_ROOT, service: string];\n\n/** The key a call of `service.method` with `input` is cached under. */\nexport function methodKey<Input>(\n service: string,\n method: string,\n input: Input,\n): MethodQueryKey<Input> {\n return [KEY_ROOT, service, \"m\", method, input];\n}\n\n/** The prefix of the keys of every call of `service.method`, for `invalidateQueries` and the like. */\nexport function methodKeyPrefix(service: string, method: string): MethodKeyPrefix {\n return [KEY_ROOT, service, \"m\", method];\n}\n\n/** The prefix of every key of `service`. */\nexport function serviceKeyPrefix(service: string): ServiceKeyPrefix {\n return [KEY_ROOT, service];\n}\n\n/** The key a live entity is cached under: `[\"qd\", service, \"e\", id]`. */\nexport type EntityQueryKey = readonly [\n root: typeof KEY_ROOT,\n service: string,\n kind: \"e\",\n id: string,\n];\n\n/** The key a live collection scope is cached under: `[\"qd\", service, \"c\", collection, scope]`. */\nexport type CollectionQueryKey = readonly [\n root: typeof KEY_ROOT,\n service: string,\n kind: \"c\",\n collection: string,\n scope: string,\n];\n\n/** The key row `id` of `service` is cached under while `useEntity` or `useEntities` holds it. */\nexport function entityKey(service: string, id: string): EntityQueryKey {\n return [KEY_ROOT, service, \"e\", id];\n}\n\n/** The key one scope of a collection is cached under while `useCollection` holds it. */\nexport function collectionKey(\n service: string,\n collection: string,\n scope: string,\n): CollectionQueryKey {\n return [KEY_ROOT, service, \"c\", collection, scope];\n}\n","// Builds a caller object from a map of contracts at runtime, with no code\n// generation: `client[key][method]` for every contract in the map and every\n// method of its contract. The typed client (`createClient.ts`) and the HTTP\n// server caller (`serverCaller.ts`) are both built here.\n//\n// Every member object is made once, when the caller is created, and frozen,\n// so a member's functions (hooks among them) are the same on every render;\n// the caller freezes the object of services once it has added its own keys.\n// No member is named `then`, so `await` never takes a caller or a service\n// for a promise: contracts reserve `then` and `$`-names for their methods\n// (`contract/validateContract.ts`), and the map's keys are checked here.\n// Building from own enumerable entries into fresh objects means a key such\n// as `__proto__` becomes an ordinary member, never a prototype. Each\n// method's target carries what its members need of the contract, such as\n// the `staleTime: 0` the admin kit's reads of rows give `useQuery`.\n//\n// React-free.\n\nimport type { CollectionDef } from \"../contract/collections\";\nimport type { AnyContract } from \"../contract/defineContract\";\nimport { adminSpecOf, type AdminMethodName } from \"../contract/kits/admin\";\nimport type { MethodDef, MethodKind, MethodOutput, ServiceWatch, Watch } from \"../contract/methods\";\nimport type { ContractMap } from \"../contract/infer\";\n\n/** What a query's `useQuery` starts from, the caller's options spread over it. */\nexport interface QueryDefaults {\n readonly staleTime: number;\n}\n\n/** One method of one service, as a member is built for it. */\nexport interface MethodTarget {\n /** The service's name on the wire: the contract's `name`. */\n readonly service: string;\n readonly method: string;\n readonly kind: MethodKind;\n /** The contract's `output`: a schema, or a projection reference such as `\"entity\"` or `listOf(\"card\")`. */\n readonly output?: MethodOutput;\n /** The query's `watch` declaration, when it has one. */\n readonly watch?: Watch<string> | ServiceWatch | undefined;\n /** The collections of the method's contract, for a mutation's `addEntity`. */\n readonly collections?: Readonly<Record<string, CollectionDef>>;\n /**\n * What the query's `useQuery` starts from, the caller's options spread\n * over it: `staleTime: 0` for the admin kit's reads of rows, which are\n * not live, so a screen reads them again whenever it mounts rather than\n * keeping the provider's five minutes. `call` and `prefetch` take none of it.\n */\n readonly queryDefaults?: QueryDefaults;\n}\n\n/** The admin kit's reads of rows; not `adminMeta`, whose fields change only with a deploy. */\nconst ADMIN_ROW_READS: readonly AdminMethodName[] = [\"adminList\", \"adminGet\", \"adminSubscribers\"];\n\nconst ROW_READ_DEFAULTS: QueryDefaults = Object.freeze({ staleTime: 0 });\n\n/** `definition`'s `queryDefaults`, found by what the admin kit made it for, never by its name. */\nfunction queryDefaultsOf(definition: MethodDef): Pick<MethodTarget, \"queryDefaults\"> {\n const spec = adminSpecOf(definition);\n return spec !== undefined && ADMIN_ROW_READS.includes(spec.method)\n ? { queryDefaults: ROW_READ_DEFAULTS }\n : {};\n}\n\nfunction isContract(value: unknown): value is AnyContract {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const { name, methods } = value as { readonly name?: unknown; readonly methods?: unknown };\n return typeof name === \"string\" && typeof methods === \"object\" && methods !== null;\n}\n\nfunction checkEntry(\n owner: string,\n key: string,\n contract: unknown,\n reserved: readonly string[],\n): AnyContract {\n if (key === \"then\" || key.startsWith(\"$\")) {\n throw new TypeError(\n `${owner}: \"${key}\" cannot name a service; \"then\" and $-names are reserved`,\n );\n }\n if (reserved.includes(key)) {\n throw new TypeError(`${owner}: \"${key}\" cannot name a service; the client uses it`);\n }\n if (!isContract(contract)) {\n throw new TypeError(`${owner}: \"${key}\" is not a contract from defineContract`);\n }\n return contract;\n}\n\n/**\n * Builds `{ [key]: { [method]: member(target, definition, contract) } }`\n * from `contracts`, frozen. `member` gets the method's declaration and its\n * contract too, for what a kit made (the search kit's `useSearch`). `owner`\n * names the function that builds it, in error messages; `reserved` are keys\n * the caller object uses itself, which no service may take. `live`, when\n * given, adds members of its own to each service (the typed client's\n * `useEntity`, `useEntities` and one member per collection); a contract\n * keeps them apart from its methods, since methods, collections and the\n * reserved names share one namespace. It gets the service's method members\n * too, for members that group them (the admin kit's `admin`).\n */\nexport function buildCaller(\n owner: string,\n contracts: ContractMap,\n member: (target: MethodTarget, definition: MethodDef, contract: AnyContract) => object,\n reserved: readonly string[] = [],\n live?: (\n contract: AnyContract,\n methods: Readonly<Record<string, object>>,\n ) => Readonly<Record<string, object>>,\n): Record<string, object> {\n if (typeof contracts !== \"object\" || contracts === null) {\n throw new TypeError(`${owner}: pass the contracts as an object, { task, project }`);\n }\n const services = Object.entries(contracts).map(([key, value]) => {\n const contract = checkEntry(owner, key, value, reserved);\n const methods = Object.entries(contract.methods).map(([method, definition]) => [\n method,\n member(\n {\n service: contract.name,\n method,\n kind: definition.kind,\n output: definition.output,\n watch: definition.watch,\n collections: contract.collections,\n ...queryDefaultsOf(definition),\n },\n definition,\n contract,\n ),\n ]);\n const extra = Object.entries(live?.(contract, Object.fromEntries(methods)) ?? {});\n return [key, Object.freeze(Object.fromEntries([...methods, ...extra]))];\n });\n return Object.fromEntries(services) as Record<string, object>;\n}\n"],"mappings":";;;;;AAgBO,IAAM,WAAW;AAuBjB,SAAS,UACd,SACA,QACA,OACuB;AACvB,SAAO,CAAC,UAAU,SAAS,KAAK,QAAQ,KAAK;AAC/C;AAGO,SAAS,gBAAgB,SAAiB,QAAiC;AAChF,SAAO,CAAC,UAAU,SAAS,KAAK,MAAM;AACxC;AAGO,SAAS,iBAAiB,SAAmC;AAClE,SAAO,CAAC,UAAU,OAAO;AAC3B;AAoBO,SAAS,UAAU,SAAiB,IAA4B;AACrE,SAAO,CAAC,UAAU,SAAS,KAAK,EAAE;AACpC;AAGO,SAAS,cACd,SACA,YACA,OACoB;AACpB,SAAO,CAAC,UAAU,SAAS,KAAK,YAAY,KAAK;AACnD;;;ACnCA,IAAM,kBAA8C,CAAC,aAAa,YAAY,kBAAkB;AAEhG,IAAM,oBAAmC,OAAO,OAAO,EAAE,WAAW,EAAE,CAAC;AAGvE,SAAS,gBAAgB,YAA4D;AACnF,QAAM,OAAO,YAAY,UAAU;AACnC,SAAO,SAAS,UAAa,gBAAgB,SAAS,KAAK,MAAM,IAC7D,EAAE,eAAe,kBAAkB,IACnC,CAAC;AACP;AAEA,SAAS,WAAW,OAAsC;AACxD,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,SAAO,OAAO,SAAS,YAAY,OAAO,YAAY,YAAY,YAAY;AAChF;AAEA,SAAS,WACP,OACA,KACA,UACA,UACa;AACb,MAAI,QAAQ,UAAU,IAAI,WAAW,GAAG,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,GAAG,KAAK,MAAM,GAAG;AAAA,IACnB;AAAA,EACF;AACA,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,IAAI,UAAU,GAAG,KAAK,MAAM,GAAG,6CAA6C;AAAA,EACpF;AACA,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,UAAU,GAAG,KAAK,MAAM,GAAG,yCAAyC;AAAA,EAChF;AACA,SAAO;AACT;AAcO,SAAS,YACd,OACA,WACA,QACA,WAA8B,CAAC,GAC/B,MAIwB;AACxB,MAAI,OAAO,cAAc,YAAY,cAAc,MAAM;AACvD,UAAM,IAAI,UAAU,GAAG,KAAK,sDAAsD;AAAA,EACpF;AACA,QAAM,WAAW,OAAO,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/D,UAAM,WAAW,WAAW,OAAO,KAAK,OAAO,QAAQ;AACvD,UAAM,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE,IAAI,CAAC,CAAC,QAAQ,UAAU,MAAM;AAAA,MAC7E;AAAA,MACA;AAAA,QACE;AAAA,UACE,SAAS,SAAS;AAAA,UAClB;AAAA,UACA,MAAM,WAAW;AAAA,UACjB,QAAQ,WAAW;AAAA,UACnB,OAAO,WAAW;AAAA,UAClB,aAAa,SAAS;AAAA,UACtB,GAAG,gBAAgB,UAAU;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,OAAO,QAAQ,OAAO,UAAU,OAAO,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,WAAO,CAAC,KAAK,OAAO,OAAO,OAAO,YAAY,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,EACxE,CAAC;AACD,SAAO,OAAO,YAAY,QAAQ;AACpC;","names":[]}