@contentrain/mcp 1.2.1 → 1.3.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 (153) hide show
  1. package/README.md +93 -25
  2. package/dist/annotations-Clhbw2lh.mjs +126 -0
  3. package/dist/annotations-Clhbw2lh.mjs.map +1 -0
  4. package/dist/{apply-manager-BkPMfpsN.mjs → apply-manager-D5ym5Jba.mjs} +7 -7
  5. package/dist/{apply-manager-BkPMfpsN.mjs.map → apply-manager-D5ym5Jba.mjs.map} +1 -1
  6. package/dist/{astro-parser-BJ-54JGe.mjs → astro-parser-B-nLl0zE.mjs} +3 -3
  7. package/dist/{astro-parser-BJ-54JGe.mjs.map → astro-parser-B-nLl0zE.mjs.map} +1 -1
  8. package/dist/{branch-lifecycle-wGJg25LT.mjs → branch-lifecycle-CFVpTpNT.mjs} +33 -3
  9. package/dist/{branch-lifecycle-wGJg25LT.mjs.map → branch-lifecycle-CFVpTpNT.mjs.map} +1 -1
  10. package/dist/{compiler-rIC4ETHv.mjs → compiler-k4yttlzM.mjs} +2 -2
  11. package/dist/{compiler-rIC4ETHv.mjs.map → compiler-k4yttlzM.mjs.map} +1 -1
  12. package/dist/{compiler-sfc.cjs-BbD04rn_.mjs → compiler-sfc.cjs-D0d_OicF.mjs} +2 -2
  13. package/dist/{compiler-sfc.cjs-BbD04rn_.mjs.map → compiler-sfc.cjs-D0d_OicF.mjs.map} +1 -1
  14. package/dist/config-BIl5Ybj0.mjs +40 -0
  15. package/dist/config-BIl5Ybj0.mjs.map +1 -0
  16. package/dist/content-manager-DqDLSNQ-.d.mts +63 -0
  17. package/dist/content-manager-DqDLSNQ-.d.mts.map +1 -0
  18. package/dist/context-J0OU9Nfp.mjs +102 -0
  19. package/dist/context-J0OU9Nfp.mjs.map +1 -0
  20. package/dist/contracts-DfL0BfrD.mjs +2 -0
  21. package/dist/core/apply-manager.mjs +10 -10
  22. package/dist/core/config.d.mts +13 -0
  23. package/dist/core/config.d.mts.map +1 -1
  24. package/dist/core/config.mjs +2 -3
  25. package/dist/core/content-manager.d.mts +2 -45
  26. package/dist/core/content-manager.mjs +3 -4
  27. package/dist/core/context.d.mts +32 -2
  28. package/dist/core/context.d.mts.map +1 -1
  29. package/dist/core/context.mjs +7 -7
  30. package/dist/core/contracts/index.d.mts +2 -0
  31. package/dist/core/contracts/index.mjs +2 -0
  32. package/dist/core/doctor.d.mts +76 -0
  33. package/dist/core/doctor.d.mts.map +1 -0
  34. package/dist/core/doctor.mjs +8 -0
  35. package/dist/core/graph-builder.mjs +3 -4
  36. package/dist/core/meta-manager.mjs +2 -3
  37. package/dist/core/model-manager.d.mts +34 -1
  38. package/dist/core/model-manager.d.mts.map +1 -1
  39. package/dist/core/model-manager.mjs +3 -4
  40. package/dist/core/ops/index.d.mts +137 -0
  41. package/dist/core/ops/index.d.mts.map +1 -0
  42. package/dist/core/ops/index.mjs +4 -0
  43. package/dist/core/overlay-reader.d.mts +42 -0
  44. package/dist/core/overlay-reader.d.mts.map +1 -0
  45. package/dist/core/overlay-reader.mjs +2 -0
  46. package/dist/core/scan-config.mjs +2 -3
  47. package/dist/core/scanner.mjs +4 -5
  48. package/dist/core/validator/index.d.mts +129 -0
  49. package/dist/core/validator/index.d.mts.map +1 -0
  50. package/dist/core/validator/index.mjs +6 -0
  51. package/dist/{detect-DinOQAmK.mjs → detect-DL9mFmaS.mjs} +2 -2
  52. package/dist/{detect-DinOQAmK.mjs.map → detect-DL9mFmaS.mjs.map} +1 -1
  53. package/dist/doctor-CgBoT6h1.mjs +338 -0
  54. package/dist/doctor-CgBoT6h1.mjs.map +1 -0
  55. package/dist/{fs-BnIQ4dKj.mjs → fs-DLbVB-Ek.mjs} +2 -2
  56. package/dist/fs-DLbVB-Ek.mjs.map +1 -0
  57. package/dist/git/branch-lifecycle.d.mts +30 -1
  58. package/dist/git/branch-lifecycle.d.mts.map +1 -1
  59. package/dist/git/branch-lifecycle.mjs +4 -5
  60. package/dist/git/transaction.d.mts +2 -2
  61. package/dist/git/transaction.d.mts.map +1 -1
  62. package/dist/git/transaction.mjs +8 -8
  63. package/dist/{graph-builder-tM7zj-SX.mjs → graph-builder-DXv2JEp-.mjs} +3 -3
  64. package/dist/{graph-builder-tM7zj-SX.mjs.map → graph-builder-DXv2JEp-.mjs.map} +1 -1
  65. package/dist/{id-DV_T9Ic8.mjs → id-CIO9s0x_.mjs} +1 -1
  66. package/dist/{id-DV_T9Ic8.mjs.map → id-CIO9s0x_.mjs.map} +1 -1
  67. package/dist/index-D0wQJSgs.d.mts +2 -0
  68. package/dist/index.mjs +22 -17
  69. package/dist/index.mjs.map +1 -1
  70. package/dist/local-DvP4Y4T-.mjs +182 -0
  71. package/dist/local-DvP4Y4T-.mjs.map +1 -0
  72. package/dist/{meta-manager--0IwAPCl.mjs → meta-manager-C900rEyG.mjs} +2 -2
  73. package/dist/{meta-manager--0IwAPCl.mjs.map → meta-manager-C900rEyG.mjs.map} +1 -1
  74. package/dist/{model-manager-DW_fOGRM.mjs → model-manager-BhLsUgaB.mjs} +241 -49
  75. package/dist/model-manager-BhLsUgaB.mjs.map +1 -0
  76. package/dist/{node-Cbq5eR5i.mjs → node-DN9hZeil.mjs} +1 -1
  77. package/dist/{node-Cbq5eR5i.mjs.map → node-DN9hZeil.mjs.map} +1 -1
  78. package/dist/ops-DjEWi5Wa.mjs +486 -0
  79. package/dist/ops-DjEWi5Wa.mjs.map +1 -0
  80. package/dist/overlay-reader-DOdyDRIv.mjs +74 -0
  81. package/dist/overlay-reader-DOdyDRIv.mjs.map +1 -0
  82. package/dist/paths-C3xNyc7z.mjs +52 -0
  83. package/dist/paths-C3xNyc7z.mjs.map +1 -0
  84. package/dist/paths-CYl5vCBD.mjs +54 -0
  85. package/dist/paths-CYl5vCBD.mjs.map +1 -0
  86. package/dist/providers/github/index.d.mts +144 -0
  87. package/dist/providers/github/index.d.mts.map +1 -0
  88. package/dist/providers/github/index.mjs +414 -0
  89. package/dist/providers/github/index.mjs.map +1 -0
  90. package/dist/providers/gitlab/index.d.mts +158 -0
  91. package/dist/providers/gitlab/index.d.mts.map +1 -0
  92. package/dist/providers/gitlab/index.mjs +361 -0
  93. package/dist/providers/gitlab/index.mjs.map +1 -0
  94. package/dist/providers/local/index.d.mts +106 -0
  95. package/dist/providers/local/index.d.mts.map +1 -0
  96. package/dist/providers/local/index.mjs +12 -0
  97. package/dist/{scan-config-QgnJ1-52.mjs → scan-config-jC6XmiqF.mjs} +2 -2
  98. package/dist/{scan-config-QgnJ1-52.mjs.map → scan-config-jC6XmiqF.mjs.map} +1 -1
  99. package/dist/{scanner-DUoXnmtI.mjs → scanner-DKMwc03k.mjs} +7 -7
  100. package/dist/{scanner-DUoXnmtI.mjs.map → scanner-DKMwc03k.mjs.map} +1 -1
  101. package/dist/serialization-B1CEzR4H.mjs +2 -0
  102. package/dist/server/http/index.d.mts +65 -0
  103. package/dist/server/http/index.d.mts.map +1 -0
  104. package/dist/server/http/index.mjs +137 -0
  105. package/dist/server/http/index.mjs.map +1 -0
  106. package/dist/{server-Dtq8vqbK.mjs → server-B1OJrUQ9.mjs} +486 -355
  107. package/dist/server-B1OJrUQ9.mjs.map +1 -0
  108. package/dist/server-WqGx6ait.d.mts +50 -0
  109. package/dist/server-WqGx6ait.d.mts.map +1 -0
  110. package/dist/server.d.mts +2 -7
  111. package/dist/server.mjs +22 -17
  112. package/dist/{source-map-generator-DpO-ejrt.mjs → source-map-generator-BWDva49I.mjs} +1 -1
  113. package/dist/{source-map-generator-DpO-ejrt.mjs.map → source-map-generator-BWDva49I.mjs.map} +1 -1
  114. package/dist/{svelte-parser-1bBcMx3T.mjs → svelte-parser-Dr9mmZuk.mjs} +3 -3
  115. package/dist/{svelte-parser-1bBcMx3T.mjs.map → svelte-parser-Dr9mmZuk.mjs.map} +1 -1
  116. package/dist/templates/index.mjs +1 -1
  117. package/dist/{templates-bRPzYq4M.mjs → templates-VrLVqfe5.mjs} +1 -1
  118. package/dist/{templates-bRPzYq4M.mjs.map → templates-VrLVqfe5.mjs.map} +1 -1
  119. package/dist/tools/annotations.d.mts +24 -0
  120. package/dist/tools/annotations.d.mts.map +1 -0
  121. package/dist/tools/annotations.mjs +2 -0
  122. package/dist/{transaction-C_Pvux78.mjs → transaction-DgkNgWSI.mjs} +61 -32
  123. package/dist/transaction-DgkNgWSI.mjs.map +1 -0
  124. package/dist/tsx-parser-BOMZE_yQ.mjs +2 -0
  125. package/dist/{tsx-parser-BWiMGAIR.mjs → tsx-parser-CQc6nr-o.mjs} +1 -1
  126. package/dist/{tsx-parser-BWiMGAIR.mjs.map → tsx-parser-CQc6nr-o.mjs.map} +1 -1
  127. package/dist/util/detect.mjs +2 -3
  128. package/dist/util/fs.mjs +1 -2
  129. package/dist/util/id.mjs +1 -1
  130. package/dist/validator-B0nNRFeU.mjs +906 -0
  131. package/dist/validator-B0nNRFeU.mjs.map +1 -0
  132. package/dist/{vue-parser-DTPTN3Yb.mjs → vue-parser-COgjArqv.mjs} +3 -3
  133. package/dist/{vue-parser-DTPTN3Yb.mjs.map → vue-parser-COgjArqv.mjs.map} +1 -1
  134. package/package.json +75 -21
  135. package/dist/config-B5kc2oeV.mjs +0 -27
  136. package/dist/config-B5kc2oeV.mjs.map +0 -1
  137. package/dist/context-DIDt_TxX.mjs +0 -46
  138. package/dist/context-DIDt_TxX.mjs.map +0 -1
  139. package/dist/core/content-manager.d.mts.map +0 -1
  140. package/dist/core/validator.d.mts +0 -23
  141. package/dist/core/validator.d.mts.map +0 -1
  142. package/dist/core/validator.mjs +0 -7
  143. package/dist/fs-BnIQ4dKj.mjs.map +0 -1
  144. package/dist/model-manager-DW_fOGRM.mjs.map +0 -1
  145. package/dist/serializer-CnHTtmc1.mjs +0 -2
  146. package/dist/server-Dtq8vqbK.mjs.map +0 -1
  147. package/dist/server.d.mts.map +0 -1
  148. package/dist/transaction-C_Pvux78.mjs.map +0 -1
  149. package/dist/tsx-parser-BFLv292Y.mjs +0 -2
  150. package/dist/util/serializer.d.mts +0 -2
  151. package/dist/util/serializer.mjs +0 -2
  152. package/dist/validator-SQYUV2JP.mjs +0 -581
  153. package/dist/validator-SQYUV2JP.mjs.map +0 -1
@@ -0,0 +1,137 @@
1
+ import "../../contracts-DfL0BfrD.mjs";
2
+ import "../../ops-DjEWi5Wa.mjs";
3
+ import "../../serialization-B1CEzR4H.mjs";
4
+ import "../../fs-DLbVB-Ek.mjs";
5
+ import "../../config-BIl5Ybj0.mjs";
6
+ import "../../model-manager-BhLsUgaB.mjs";
7
+ import "../../meta-manager-C900rEyG.mjs";
8
+ import "../../context-J0OU9Nfp.mjs";
9
+ import "../../id-CIO9s0x_.mjs";
10
+ import "../../transaction-DgkNgWSI.mjs";
11
+ import "../../local-DvP4Y4T-.mjs";
12
+ import "../../detect-DL9mFmaS.mjs";
13
+ import "../../branch-lifecycle-CFVpTpNT.mjs";
14
+ import "../../annotations-Clhbw2lh.mjs";
15
+ import { t as createServer } from "../../server-B1OJrUQ9.mjs";
16
+ import "../../validator-B0nNRFeU.mjs";
17
+ import "../../scan-config-jC6XmiqF.mjs";
18
+ import "../../graph-builder-DXv2JEp-.mjs";
19
+ import "../../scanner-DKMwc03k.mjs";
20
+ import "../../tsx-parser-CQc6nr-o.mjs";
21
+ import "../../apply-manager-D5ym5Jba.mjs";
22
+ import "../../doctor-CgBoT6h1.mjs";
23
+ import { randomUUID } from "node:crypto";
24
+ import http from "node:http";
25
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
26
+ //#region src/server/http/server.ts
27
+ /**
28
+ * Start an HTTP transport for the MCP server on top of the local project.
29
+ *
30
+ * Phase 5.2 scope: stateless, single-endpoint `POST /mcp`. The underlying
31
+ * McpServer is the same one the stdio entry point uses, so every tool
32
+ * registered for stdio is available over HTTP with no duplication. Only
33
+ * the transport swaps out.
34
+ *
35
+ * Auth is a simple opaque Bearer token. When `authToken` is supplied, any
36
+ * request without the exact `Authorization: Bearer <token>` header gets
37
+ * a 401 before the MCP transport sees it. Multi-tenant auth (per-project
38
+ * API keys, GitHub App scopes) is Studio's concern — MCP stays minimal.
39
+ *
40
+ * GitHubProvider HTTP routing will land in phase 5.3 together with the
41
+ * tool-handler provider abstraction; today the HTTP server still drives
42
+ * a LocalProvider under the hood.
43
+ */
44
+ async function startHttpMcpServer(opts) {
45
+ return startHttpMcpServerInternal({
46
+ mcp: createServer(opts.projectRoot),
47
+ port: opts.port,
48
+ host: opts.host,
49
+ authToken: opts.authToken,
50
+ path: opts.path
51
+ });
52
+ }
53
+ /**
54
+ * Variant of {@link startHttpMcpServer} that accepts a pre-built provider
55
+ * (and an optional `projectRoot`). This is the phase-5.3 entry point that
56
+ * lets HTTP-hosted MCP route tool calls to a non-Local provider — e.g. a
57
+ * `GitHubProvider` shared across many projects. Read-only tools work out
58
+ * of the box; write-path tools return `capability_required: localWorktree`
59
+ * when no `projectRoot` is supplied.
60
+ */
61
+ async function startHttpMcpServerWith(opts) {
62
+ return startHttpMcpServerInternal({
63
+ mcp: createServer({
64
+ provider: opts.provider,
65
+ projectRoot: opts.projectRoot
66
+ }),
67
+ port: opts.port,
68
+ host: opts.host,
69
+ authToken: opts.authToken,
70
+ path: opts.path
71
+ });
72
+ }
73
+ async function startHttpMcpServerInternal(input) {
74
+ const { mcp } = input;
75
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID() });
76
+ await mcp.connect(transport);
77
+ const mountPath = input.path ?? "/mcp";
78
+ const host = input.host ?? "127.0.0.1";
79
+ const server = http.createServer((req, res) => {
80
+ handleRequest(req, res, {
81
+ transport,
82
+ mountPath,
83
+ authToken: input.authToken
84
+ });
85
+ });
86
+ await new Promise((resolve, reject) => {
87
+ server.once("error", reject);
88
+ server.listen(input.port, host, () => {
89
+ server.off("error", reject);
90
+ resolve();
91
+ });
92
+ });
93
+ return {
94
+ server,
95
+ mcp,
96
+ url: `http://${host}:${server.address().port}${mountPath}`,
97
+ close: async () => {
98
+ await new Promise((resolve, reject) => {
99
+ server.close((err) => err ? reject(err) : resolve());
100
+ });
101
+ await transport.close().catch(() => {});
102
+ await mcp.close().catch(() => {});
103
+ }
104
+ };
105
+ }
106
+ async function handleRequest(req, res, ctx) {
107
+ if (req.method !== "POST" && req.method !== "GET" && req.method !== "DELETE") {
108
+ writeJson(res, 405, { error: "Method Not Allowed" });
109
+ return;
110
+ }
111
+ if (!req.url || !req.url.startsWith(ctx.mountPath)) {
112
+ writeJson(res, 404, { error: "Not Found" });
113
+ return;
114
+ }
115
+ if (ctx.authToken) {
116
+ if (req.headers.authorization !== `Bearer ${ctx.authToken}`) {
117
+ writeJson(res, 401, { error: "Unauthorized" });
118
+ return;
119
+ }
120
+ }
121
+ try {
122
+ await ctx.transport.handleRequest(req, res);
123
+ } catch (error) {
124
+ if (!res.headersSent) writeJson(res, 500, {
125
+ error: "Internal Server Error",
126
+ message: error instanceof Error ? error.message : String(error)
127
+ });
128
+ }
129
+ }
130
+ function writeJson(res, status, body) {
131
+ res.writeHead(status, { "Content-Type": "application/json" });
132
+ res.end(JSON.stringify(body));
133
+ }
134
+ //#endregion
135
+ export { startHttpMcpServer, startHttpMcpServerWith };
136
+
137
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["createMcpServer"],"sources":["../../../src/server/http/server.ts"],"sourcesContent":["import http from 'node:http'\nimport { randomUUID } from 'node:crypto'\nimport type { AddressInfo } from 'node:net'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport { createServer as createMcpServer, type ToolProvider } from '../../server.js'\n\nexport interface HttpMcpServerOptions {\n /** Project root the MCP server operates against (LocalProvider path). */\n projectRoot: string\n /** Optional Bearer token — when set, requests must send `Authorization: Bearer <token>`. */\n authToken?: string\n /** Mount path for the MCP JSON-RPC endpoint. Defaults to `/mcp`. */\n path?: string\n}\n\nexport interface HttpMcpServerProviderOptions {\n /** Pre-built content provider (GitHubProvider, a mock, etc.). */\n provider: ToolProvider\n /** Local project root when the provider is a LocalProvider; optional otherwise. */\n projectRoot?: string\n /** Optional Bearer token — when set, requests must send `Authorization: Bearer <token>`. */\n authToken?: string\n /** Mount path for the MCP JSON-RPC endpoint. Defaults to `/mcp`. */\n path?: string\n}\n\nexport interface HttpMcpServerHandle {\n server: http.Server\n mcp: McpServer\n url: string\n close: () => Promise<void>\n}\n\n/**\n * Start an HTTP transport for the MCP server on top of the local project.\n *\n * Phase 5.2 scope: stateless, single-endpoint `POST /mcp`. The underlying\n * McpServer is the same one the stdio entry point uses, so every tool\n * registered for stdio is available over HTTP with no duplication. Only\n * the transport swaps out.\n *\n * Auth is a simple opaque Bearer token. When `authToken` is supplied, any\n * request without the exact `Authorization: Bearer <token>` header gets\n * a 401 before the MCP transport sees it. Multi-tenant auth (per-project\n * API keys, GitHub App scopes) is Studio's concern — MCP stays minimal.\n *\n * GitHubProvider HTTP routing will land in phase 5.3 together with the\n * tool-handler provider abstraction; today the HTTP server still drives\n * a LocalProvider under the hood.\n */\nexport async function startHttpMcpServer(\n opts: HttpMcpServerOptions & { port: number, host?: string },\n): Promise<HttpMcpServerHandle> {\n return startHttpMcpServerInternal({\n mcp: createMcpServer(opts.projectRoot),\n port: opts.port,\n host: opts.host,\n authToken: opts.authToken,\n path: opts.path,\n })\n}\n\n/**\n * Variant of {@link startHttpMcpServer} that accepts a pre-built provider\n * (and an optional `projectRoot`). This is the phase-5.3 entry point that\n * lets HTTP-hosted MCP route tool calls to a non-Local provider — e.g. a\n * `GitHubProvider` shared across many projects. Read-only tools work out\n * of the box; write-path tools return `capability_required: localWorktree`\n * when no `projectRoot` is supplied.\n */\nexport async function startHttpMcpServerWith(\n opts: HttpMcpServerProviderOptions & { port: number, host?: string },\n): Promise<HttpMcpServerHandle> {\n return startHttpMcpServerInternal({\n mcp: createMcpServer({ provider: opts.provider, projectRoot: opts.projectRoot }),\n port: opts.port,\n host: opts.host,\n authToken: opts.authToken,\n path: opts.path,\n })\n}\n\nasync function startHttpMcpServerInternal(input: {\n mcp: McpServer\n port: number\n host?: string\n authToken?: string\n path?: string\n}): Promise<HttpMcpServerHandle> {\n const { mcp } = input\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n })\n await mcp.connect(transport)\n\n const mountPath = input.path ?? '/mcp'\n const host = input.host ?? '127.0.0.1'\n\n const server = http.createServer((req, res) => {\n void handleRequest(req, res, { transport, mountPath, authToken: input.authToken })\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(input.port, host, () => {\n server.off('error', reject)\n resolve()\n })\n })\n\n const address = server.address() as AddressInfo\n const url = `http://${host}:${address.port}${mountPath}`\n\n return {\n server,\n mcp,\n url,\n close: async () => {\n await new Promise<void>((resolve, reject) => {\n server.close(err => (err ? reject(err) : resolve()))\n })\n await transport.close().catch(() => { /* best-effort */ })\n await mcp.close().catch(() => { /* best-effort */ })\n },\n }\n}\n\nasync function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ctx: { transport: StreamableHTTPServerTransport, mountPath: string, authToken?: string },\n): Promise<void> {\n if (req.method !== 'POST' && req.method !== 'GET' && req.method !== 'DELETE') {\n writeJson(res, 405, { error: 'Method Not Allowed' })\n return\n }\n\n if (!req.url || !req.url.startsWith(ctx.mountPath)) {\n writeJson(res, 404, { error: 'Not Found' })\n return\n }\n\n if (ctx.authToken) {\n const header = req.headers.authorization\n if (header !== `Bearer ${ctx.authToken}`) {\n writeJson(res, 401, { error: 'Unauthorized' })\n return\n }\n }\n\n try {\n await ctx.transport.handleRequest(req, res)\n } catch (error) {\n if (!res.headersSent) {\n writeJson(res, 500, {\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n}\n\nfunction writeJson(res: http.ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify(body))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,eAAsB,mBACpB,MAC8B;AAC9B,QAAO,2BAA2B;EAChC,KAAKA,aAAgB,KAAK,YAAY;EACtC,MAAM,KAAK;EACX,MAAM,KAAK;EACX,WAAW,KAAK;EAChB,MAAM,KAAK;EACZ,CAAC;;;;;;;;;;AAWJ,eAAsB,uBACpB,MAC8B;AAC9B,QAAO,2BAA2B;EAChC,KAAKA,aAAgB;GAAE,UAAU,KAAK;GAAU,aAAa,KAAK;GAAa,CAAC;EAChF,MAAM,KAAK;EACX,MAAM,KAAK;EACX,WAAW,KAAK;EAChB,MAAM,KAAK;EACZ,CAAC;;AAGJ,eAAe,2BAA2B,OAMT;CAC/B,MAAM,EAAE,QAAQ;CAChB,MAAM,YAAY,IAAI,8BAA8B,EAClD,0BAA0B,YAAY,EACvC,CAAC;AACF,OAAM,IAAI,QAAQ,UAAU;CAE5B,MAAM,YAAY,MAAM,QAAQ;CAChC,MAAM,OAAO,MAAM,QAAQ;CAE3B,MAAM,SAAS,KAAK,cAAc,KAAK,QAAQ;AACxC,gBAAc,KAAK,KAAK;GAAE;GAAW;GAAW,WAAW,MAAM;GAAW,CAAC;GAClF;AAEF,OAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,SAAO,KAAK,SAAS,OAAO;AAC5B,SAAO,OAAO,MAAM,MAAM,YAAY;AACpC,UAAO,IAAI,SAAS,OAAO;AAC3B,YAAS;IACT;GACF;AAKF,QAAO;EACL;EACA;EACA,KALU,UAAU,KAAK,GADX,OAAO,SAAS,CACM,OAAO;EAM3C,OAAO,YAAY;AACjB,SAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,WAAO,OAAM,QAAQ,MAAM,OAAO,IAAI,GAAG,SAAS,CAAE;KACpD;AACF,SAAM,UAAU,OAAO,CAAC,YAAY,GAAsB;AAC1D,SAAM,IAAI,OAAO,CAAC,YAAY,GAAsB;;EAEvD;;AAGH,eAAe,cACb,KACA,KACA,KACe;AACf,KAAI,IAAI,WAAW,UAAU,IAAI,WAAW,SAAS,IAAI,WAAW,UAAU;AAC5E,YAAU,KAAK,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACpD;;AAGF,KAAI,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,WAAW,IAAI,UAAU,EAAE;AAClD,YAAU,KAAK,KAAK,EAAE,OAAO,aAAa,CAAC;AAC3C;;AAGF,KAAI,IAAI;MACS,IAAI,QAAQ,kBACZ,UAAU,IAAI,aAAa;AACxC,aAAU,KAAK,KAAK,EAAE,OAAO,gBAAgB,CAAC;AAC9C;;;AAIJ,KAAI;AACF,QAAM,IAAI,UAAU,cAAc,KAAK,IAAI;UACpC,OAAO;AACd,MAAI,CAAC,IAAI,YACP,WAAU,KAAK,KAAK;GAClB,OAAO;GACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAChE,CAAC;;;AAKR,SAAS,UAAU,KAA0B,QAAgB,MAAqB;AAChF,KAAI,UAAU,QAAQ,EAAE,gBAAgB,oBAAoB,CAAC;AAC7D,KAAI,IAAI,KAAK,UAAU,KAAK,CAAC"}