studiograph 1.3.48-next.76 → 1.3.48-next.78
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/dist/agent/prompts/entity-types-section.d.ts +8 -0
- package/dist/agent/prompts/entity-types-section.js +27 -2
- package/dist/agent/prompts/entity-types-section.js.map +1 -1
- package/dist/agent/tools/folder-tools.js +18 -7
- package/dist/agent/tools/folder-tools.js.map +1 -1
- package/dist/agent/tools/graph-tools.js +65 -9
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/core/entity-types-catalog.js +2 -0
- package/dist/core/entity-types-catalog.js.map +1 -1
- package/dist/core/graph.d.ts +106 -2
- package/dist/core/graph.js +281 -10
- package/dist/core/graph.js.map +1 -1
- package/dist/core/validation.d.ts +85 -4
- package/dist/core/validation.js +34 -3
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.js +3 -1
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/mcp/tools.js +6 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/routes/asset-api.js +29 -7
- package/dist/server/routes/asset-api.js.map +1 -1
- package/dist/server/routes/graph-api.js +290 -38
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/services/asset-upload-service.d.ts +53 -0
- package/dist/services/asset-upload-service.js +199 -0
- package/dist/services/asset-upload-service.js.map +1 -0
- package/dist/services/assets/base.d.ts +15 -0
- package/dist/services/assets/base.js +63 -0
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +17 -0
- package/dist/services/assets/index.js +17 -0
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/import-service.d.ts +33 -1
- package/dist/services/import-service.js +234 -48
- package/dist/services/import-service.js.map +1 -1
- package/dist/services/vector-service.d.ts +20 -2
- package/dist/services/vector-service.js +46 -5
- package/dist/services/vector-service.js.map +1 -1
- package/dist/web/_app/immutable/assets/0.C-U08O83.css +2 -0
- package/dist/web/_app/immutable/assets/2.D4UyD6ef.css +1 -0
- package/dist/web/_app/immutable/assets/{4.DMWmOCtr.css → 4.CMuW9ER9.css} +1 -1
- package/dist/web/_app/immutable/chunks/{BxqZoi16.js → B2dQ_HtA.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CbChB7Sk.js → BVG-59G_.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CcKbicMh.js → BYMboxS1.js} +1 -1
- package/dist/web/_app/immutable/chunks/BcnRmtrP2.js +1 -0
- package/dist/web/_app/immutable/chunks/Bi49oCkW.js +1 -0
- package/dist/web/_app/immutable/chunks/{9wFWX30W.js → BkG8IWXL.js} +1 -1
- package/dist/web/_app/immutable/chunks/BljXMCRN2.js +1 -0
- package/dist/web/_app/immutable/chunks/C1eadUOT.js +1 -0
- package/dist/web/_app/immutable/chunks/{DgmiIA_n.js → C7ZXf1Ei.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BGQcC8WM.js → C9fPdp9e.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CpjCnsRC2.js → CABEPnKi2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C4o1fi_w.js → CFFhRHgg.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C3q48eWV.js → CMv-UMQD.js} +1 -1
- package/dist/web/_app/immutable/chunks/{14Ks5neZ.js → CO4LsWNt.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DNod4IR72.js → CXGYcrGq2.js} +1 -1
- package/dist/web/_app/immutable/chunks/ClxmxcVF.js +1 -0
- package/dist/web/_app/immutable/chunks/Co7pw0iy.js +1 -0
- package/dist/web/_app/immutable/chunks/Cu_13EXg.js +8 -0
- package/dist/web/_app/immutable/chunks/{DxmEO50C.js → Cy1yuSCN.js} +1 -1
- package/dist/web/_app/immutable/chunks/{_VOdw24P.js → CzT0T6FJ.js} +1 -1
- package/dist/web/_app/immutable/chunks/{1TGSC9bG.js → D1AVtJaJ.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CHdVOK6e.js → D6ObqpSX.js} +1 -1
- package/dist/web/_app/immutable/chunks/DBMIhZt72.js +1 -0
- package/dist/web/_app/immutable/chunks/{CUVp7kiS.js → DFE7ldAP.js} +1 -1
- package/dist/web/_app/immutable/chunks/{f1DrsN7w.js → DKDDh_Qn.js} +1 -1
- package/dist/web/_app/immutable/chunks/DNneJjJN.js +1 -0
- package/dist/web/_app/immutable/chunks/{r4OgPVQH.js → DOastlFY.js} +1 -1
- package/dist/web/_app/immutable/chunks/DPHJu-Bj.js +5 -0
- package/dist/web/_app/immutable/chunks/{D00taIEV.js → DQKT4stP.js} +1 -1
- package/dist/web/_app/immutable/chunks/DQe4a6BS.js +1 -0
- package/dist/web/_app/immutable/chunks/{Ce2P7b-X.js → DQpUZZbo.js} +1 -1
- package/dist/web/_app/immutable/chunks/DVxZLm0W.js +2 -0
- package/dist/web/_app/immutable/chunks/{Bzy2ehL_.js → DYbq0sax.js} +1 -1
- package/dist/web/_app/immutable/chunks/{hlnmlkiT.js → Ddr2JLfY.js} +1 -1
- package/dist/web/_app/immutable/chunks/DeQkDfnZ.js +1 -0
- package/dist/web/_app/immutable/chunks/Df-4W2cE2.js +2 -0
- package/dist/web/_app/immutable/chunks/{e9oCENPh.js → Dfu55H0O.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DDQLyGcm.js → DhERF52D.js} +1 -1
- package/dist/web/_app/immutable/chunks/{C2UI_KQ1.js → Dt_-Caf8.js} +1 -1
- package/dist/web/_app/immutable/chunks/DxS997Bi.js +1 -0
- package/dist/web/_app/immutable/chunks/{ChPgixWE.js → P-vv4BQi2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{Fgrpvl6l.js → UqWZFiDw.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DPXpm86N.js → ZhCPwTv_.js} +1 -1
- package/dist/web/_app/immutable/chunks/anxNIaXZ.js +1 -0
- package/dist/web/_app/immutable/chunks/{BO35Fv1U.js → dTznEU-N.js} +4 -4
- package/dist/web/_app/immutable/chunks/{wY5DYt0W.js → iqOW8ttz.js} +1 -1
- package/dist/web/_app/immutable/chunks/{1h1Q-dyp.js → j7kuJOP8.js} +1 -1
- package/dist/web/_app/immutable/chunks/{IXuV70l3.js → mbVGz96e.js} +1 -1
- package/dist/web/_app/immutable/chunks/rmFsC7j32.js +1 -0
- package/dist/web/_app/immutable/chunks/{CLBsX7ax.js → sdhQg9Jq.js} +1 -1
- package/dist/web/_app/immutable/entry/{app.DbP3pP9I.js → app.BUM2MbTk.js} +2 -2
- package/dist/web/_app/immutable/entry/start.BObvxb93.js +1 -0
- package/dist/web/_app/immutable/nodes/{0.CirGvHiz.js → 0.BMXqKYhl.js} +2 -2
- package/dist/web/_app/immutable/nodes/{1.kTjENnhN.js → 1.QaGjZyIl.js} +1 -1
- package/dist/web/_app/immutable/nodes/10.F1nNX_z9.js +1 -0
- package/dist/web/_app/immutable/nodes/{11.DIQCUxzh.js → 11.BfZsU6Vh.js} +1 -1
- package/dist/web/_app/immutable/nodes/{12.DOlW7sto.js → 12.C5hRguPI.js} +1 -1
- package/dist/web/_app/immutable/nodes/{13.qikQg_xf.js → 13.BqOI1wyC.js} +1 -1
- package/dist/web/_app/immutable/nodes/2.CCWtRh8O.js +130 -0
- package/dist/web/_app/immutable/nodes/3.DDPCGvvJ.js +2 -0
- package/dist/web/_app/immutable/nodes/4.BhR6-Pss.js +11 -0
- package/dist/web/_app/immutable/nodes/5.DkAirE7a.js +1 -0
- package/dist/web/_app/immutable/nodes/{6.C1tDoWWj.js → 6.CF014BWC.js} +1 -1
- package/dist/web/_app/immutable/nodes/{7.ZR0ZhRen.js → 7.B6NRypBk.js} +1 -1
- package/dist/web/_app/immutable/nodes/{8.DUZm9iwH.js → 8.B4moM7KQ.js} +1 -1
- package/dist/web/_app/immutable/nodes/{9.BuV4JbTd.js → 9.DVcGpCuy.js} +1 -1
- package/dist/web/_app/version.json +1 -1
- package/dist/web/index.html +16 -16
- package/package.json +1 -1
- package/dist/web/_app/immutable/assets/0.DNW-Nd5m.css +0 -2
- package/dist/web/_app/immutable/assets/2.R677OFd1.css +0 -1
- package/dist/web/_app/immutable/chunks/-jdP5JqO.js +0 -5
- package/dist/web/_app/immutable/chunks/B-z4a3eR.js +0 -1
- package/dist/web/_app/immutable/chunks/B6o1oq9U2.js +0 -2
- package/dist/web/_app/immutable/chunks/BDCOho_G.js +0 -1
- package/dist/web/_app/immutable/chunks/Be0wk0_s2.js +0 -1
- package/dist/web/_app/immutable/chunks/C7o6G8Ak2.js +0 -1
- package/dist/web/_app/immutable/chunks/CHRfvdkq2.js +0 -1
- package/dist/web/_app/immutable/chunks/CSWuNPeq.js +0 -1
- package/dist/web/_app/immutable/chunks/CTFOXiYo.js +0 -1
- package/dist/web/_app/immutable/chunks/CXYTfe_P2.js +0 -1
- package/dist/web/_app/immutable/chunks/DBATbpMA.js +0 -2
- package/dist/web/_app/immutable/chunks/DDzRa0WU.js +0 -1
- package/dist/web/_app/immutable/chunks/DTnTQDdN.js +0 -1
- package/dist/web/_app/immutable/chunks/DYG9AA8k.js +0 -8
- package/dist/web/_app/immutable/chunks/DhikmMsg2.js +0 -1
- package/dist/web/_app/immutable/chunks/Pr10v8I7.js +0 -1
- package/dist/web/_app/immutable/chunks/q69OiNAp.js +0 -1
- package/dist/web/_app/immutable/entry/start.Cl9IsfI4.js +0 -1
- package/dist/web/_app/immutable/nodes/10.5xATla_3.js +0 -1
- package/dist/web/_app/immutable/nodes/2.CiklFX4J.js +0 -130
- package/dist/web/_app/immutable/nodes/3.Byts3_Iy.js +0 -2
- package/dist/web/_app/immutable/nodes/4.BWfkHbqv.js +0 -11
- package/dist/web/_app/immutable/nodes/5.tH1sz1qb.js +0 -1
- /package/dist/web/_app/immutable/chunks/{D5VdX2NC.js → CQwUl_3l.js} +0 -0
- /package/dist/web/_app/immutable/chunks/{EdMwt2az.js → CvZmtMIf.js} +0 -0
- /package/dist/web/_app/immutable/chunks/{CUyyAHze.js → Dn6yJ9ZG.js} +0 -0
- /package/dist/web/_app/immutable/chunks/{DXeZwJCC2.js → rsjIo1y12.js} +0 -0
|
@@ -51,6 +51,69 @@ export function detectContentType(filename) {
|
|
|
51
51
|
const ext = filename.split('.').pop()?.toLowerCase() || '';
|
|
52
52
|
return CONTENT_TYPES[ext] || 'application/octet-stream';
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Map a filename to the high-level `asset_kind` written into the asset
|
|
56
|
+
* entity's frontmatter. Drives icon and viewer selection; coarser than
|
|
57
|
+
* MIME so the UI doesn't need to enumerate every format. The kind set
|
|
58
|
+
* is canonical in `ASSET_KINDS` in src/core/validation.ts.
|
|
59
|
+
*/
|
|
60
|
+
export function detectAssetKind(filename) {
|
|
61
|
+
const ext = filename.split('.').pop()?.toLowerCase() || '';
|
|
62
|
+
if (IMAGE_EXTS.has(ext))
|
|
63
|
+
return 'image';
|
|
64
|
+
if (VIDEO_EXTS.has(ext))
|
|
65
|
+
return 'video';
|
|
66
|
+
if (AUDIO_EXTS.has(ext))
|
|
67
|
+
return 'audio';
|
|
68
|
+
if (ext === 'pdf')
|
|
69
|
+
return 'pdf';
|
|
70
|
+
if (INDESIGN_EXTS.has(ext))
|
|
71
|
+
return 'indesign';
|
|
72
|
+
if (ext === 'sketch')
|
|
73
|
+
return 'sketch';
|
|
74
|
+
if (ext === 'psd')
|
|
75
|
+
return 'psd';
|
|
76
|
+
if (ext === 'ai')
|
|
77
|
+
return 'illustrator';
|
|
78
|
+
if (ext === 'fig')
|
|
79
|
+
return 'figma';
|
|
80
|
+
if (OFFICE_EXTS.has(ext))
|
|
81
|
+
return 'office';
|
|
82
|
+
if (ARCHIVE_EXTS.has(ext))
|
|
83
|
+
return 'archive';
|
|
84
|
+
return 'other';
|
|
85
|
+
}
|
|
86
|
+
// SVG is intentionally excluded — see docs/asset-architecture.md §security.
|
|
87
|
+
// Stored XSS risk: SVG can contain <script> and the GET /api/assets/* route
|
|
88
|
+
// serves files inline with `Content-Type: image/svg+xml`, which executes in
|
|
89
|
+
// the app origin. Users who need vector assets can paste source into a note
|
|
90
|
+
// or embed via the editor's per-entity attach (which also blocks SVG).
|
|
91
|
+
const IMAGE_EXTS = new Set(['jpg', 'jpeg', 'png', 'gif', 'webp', 'avif', 'heic']);
|
|
92
|
+
const VIDEO_EXTS = new Set(['mp4', 'mov', 'webm', 'avi', 'mkv', 'm4v']);
|
|
93
|
+
const AUDIO_EXTS = new Set(['mp3', 'wav', 'm4a', 'ogg', 'flac', 'aac']);
|
|
94
|
+
const INDESIGN_EXTS = new Set(['indd', 'idml']);
|
|
95
|
+
const OFFICE_EXTS = new Set(['docx', 'doc', 'xlsx', 'xls', 'pptx', 'ppt', 'key', 'pages', 'numbers']);
|
|
96
|
+
const ARCHIVE_EXTS = new Set(['zip', 'tar', 'gz', '7z', 'rar']);
|
|
97
|
+
/**
|
|
98
|
+
* Extension set the asset upload route accepts. Excludes the structured
|
|
99
|
+
* formats handled elsewhere (.md/.txt/.csv → direct write, .docx →
|
|
100
|
+
* mammoth workstream, .html → bookmark importer).
|
|
101
|
+
*/
|
|
102
|
+
export const ASSET_UPLOAD_EXTENSIONS = new Set([
|
|
103
|
+
...IMAGE_EXTS,
|
|
104
|
+
...VIDEO_EXTS,
|
|
105
|
+
...AUDIO_EXTS,
|
|
106
|
+
'pdf',
|
|
107
|
+
...INDESIGN_EXTS,
|
|
108
|
+
'sketch', 'psd', 'ai', 'fig',
|
|
109
|
+
// .docx is intentionally excluded — handled by the mammoth workstream.
|
|
110
|
+
'xlsx', 'xls', 'pptx', 'ppt', 'key', 'pages', 'numbers',
|
|
111
|
+
...ARCHIVE_EXTS,
|
|
112
|
+
]);
|
|
113
|
+
export function isAssetUploadExtension(filename) {
|
|
114
|
+
const ext = filename.split('.').pop()?.toLowerCase() || '';
|
|
115
|
+
return ASSET_UPLOAD_EXTENSIONS.has(ext);
|
|
116
|
+
}
|
|
54
117
|
/**
|
|
55
118
|
* Determine media type from content type
|
|
56
119
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/services/assets/base.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/services/assets/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,3 +39,20 @@ export declare class AssetService {
|
|
|
39
39
|
*/
|
|
40
40
|
getInfo(entityType: string, entityId: string, filename: string, keyPrefix?: string): Promise<AssetInfo | null>;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Convert an `AssetInfo` returned by a backend into the URL stored in
|
|
44
|
+
* an entity's `asset_url` (or used as the `src` of an inline embed).
|
|
45
|
+
*
|
|
46
|
+
* R2 returns a fully-qualified `https://…` public URL; use it directly.
|
|
47
|
+
* Local backend returns either `file://…` or a relative path; rewrite to
|
|
48
|
+
* the workspace's HTTP serving route at `/api/assets/{type}/{id}/{file}`
|
|
49
|
+
* so the same URL works for the browser regardless of backend.
|
|
50
|
+
*
|
|
51
|
+
* Centralised here because three different call sites used to inline this
|
|
52
|
+
* ternary, and getting it wrong silently breaks image rendering.
|
|
53
|
+
*/
|
|
54
|
+
export declare function publicUrlFor(asset: {
|
|
55
|
+
url: string;
|
|
56
|
+
path: string;
|
|
57
|
+
filename: string;
|
|
58
|
+
}, entityType: string, entityId: string): string;
|
|
@@ -93,4 +93,21 @@ export class AssetService {
|
|
|
93
93
|
return assets.find(a => a.filename === filename) || null;
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Convert an `AssetInfo` returned by a backend into the URL stored in
|
|
98
|
+
* an entity's `asset_url` (or used as the `src` of an inline embed).
|
|
99
|
+
*
|
|
100
|
+
* R2 returns a fully-qualified `https://…` public URL; use it directly.
|
|
101
|
+
* Local backend returns either `file://…` or a relative path; rewrite to
|
|
102
|
+
* the workspace's HTTP serving route at `/api/assets/{type}/{id}/{file}`
|
|
103
|
+
* so the same URL works for the browser regardless of backend.
|
|
104
|
+
*
|
|
105
|
+
* Centralised here because three different call sites used to inline this
|
|
106
|
+
* ternary, and getting it wrong silently breaks image rendering.
|
|
107
|
+
*/
|
|
108
|
+
export function publicUrlFor(asset, entityType, entityId) {
|
|
109
|
+
if (asset.url.startsWith('http'))
|
|
110
|
+
return asset.path; // R2 returns full URL in `path`
|
|
111
|
+
return `/api/assets/${entityType}/${entityId}/${asset.filename}`;
|
|
112
|
+
}
|
|
96
113
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/assets/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/assets/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,15 +8,38 @@
|
|
|
8
8
|
* - .pdf → note entity (extracts text via pdf-parse)
|
|
9
9
|
*/
|
|
10
10
|
import { BaseGraphManager } from '../core/graph.js';
|
|
11
|
+
import type { GitUser } from './git.js';
|
|
11
12
|
export interface ImportResult {
|
|
12
13
|
entityId: string;
|
|
13
14
|
entityType: string;
|
|
14
15
|
status: 'created' | 'skipped' | 'error';
|
|
15
16
|
error?: string;
|
|
17
|
+
/** Absolute path of the written file. Set when status === 'created' so
|
|
18
|
+
* batch callers can collect paths to commit in one transaction.
|
|
19
|
+
* Undefined for 'skipped' / 'error'. */
|
|
20
|
+
path?: string;
|
|
21
|
+
/** Absolute paths of any per-folder display-name sidecars written for this
|
|
22
|
+
* import (one per source-segment that carried casing the slug fallback
|
|
23
|
+
* can't recover). Empty when the source path was already kebab. Batch
|
|
24
|
+
* callers should pass these to commitPending() under `extraPaths` so the
|
|
25
|
+
* sidecars land in the same commit as the entity files. */
|
|
26
|
+
sidecarPaths?: string[];
|
|
16
27
|
}
|
|
17
28
|
export interface ImportOptions {
|
|
18
29
|
entityType?: string;
|
|
19
30
|
entityId?: string;
|
|
31
|
+
/** Override commit author. When omitted, the import is committed under
|
|
32
|
+
* whatever default identity the underlying git service uses. */
|
|
33
|
+
user?: GitUser;
|
|
34
|
+
/** Repo-relative folder to create the entry in. Empty/undefined = repo
|
|
35
|
+
* root. Mirrors graph.create's folderPath option. */
|
|
36
|
+
folderPath?: string;
|
|
37
|
+
/** Commit message override. Defaults to a sensible auto-generated one. */
|
|
38
|
+
commitMessage?: string;
|
|
39
|
+
/** Defer the git commit. Defaults to true (preserves existing behavior
|
|
40
|
+
* where the agent tool batches commits). HTTP callers should pass false
|
|
41
|
+
* so each import lands as its own commit. */
|
|
42
|
+
skipCommit?: boolean;
|
|
20
43
|
}
|
|
21
44
|
export declare function isSupportedFile(filename: string): boolean;
|
|
22
45
|
/**
|
|
@@ -26,6 +49,15 @@ export declare function isSupportedFile(filename: string): boolean;
|
|
|
26
49
|
export declare function extractText(filename: string, content: string): Promise<string>;
|
|
27
50
|
/**
|
|
28
51
|
* Import a single file as a Studiograph entity.
|
|
29
|
-
*
|
|
52
|
+
*
|
|
53
|
+
* The `filename` may include a relative directory portion (e.g.
|
|
54
|
+
* `decks/2025-q1/talk.md`); the directory is slugified and combined with
|
|
55
|
+
* `options.folderPath` (the caller's chosen destination subfolder) to
|
|
56
|
+
* produce the final on-disk location. This preserves user-organized
|
|
57
|
+
* folder structure when a folder is dropped onto the import zone.
|
|
58
|
+
*
|
|
59
|
+
* Collisions on `(entity_type, entity_id)` are auto-suffixed (`talk` →
|
|
60
|
+
* `talk-2` → `talk-3` …) rather than skipped, so dropping a folder twice
|
|
61
|
+
* never silently swallows files.
|
|
30
62
|
*/
|
|
31
63
|
export declare function importFile(graph: BaseGraphManager, filename: string, content: Buffer | string, options?: ImportOptions): Promise<ImportResult>;
|
|
@@ -7,12 +7,124 @@
|
|
|
7
7
|
* - .csv → dataset entity (infers column schema)
|
|
8
8
|
* - .pdf → note entity (extracts text via pdf-parse)
|
|
9
9
|
*/
|
|
10
|
-
import { extname, basename } from 'path';
|
|
10
|
+
import { extname, basename, dirname } from 'path';
|
|
11
11
|
import matter from 'gray-matter';
|
|
12
12
|
/** Convert a string to kebab-case for use as an entity ID. */
|
|
13
13
|
function slugify(str) {
|
|
14
14
|
return str.toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
15
15
|
}
|
|
16
|
+
/** Convert a relative directory path (`'My Documents/Q1 Reports'`) into a
|
|
17
|
+
* kebab-case folder path (`'my-documents/q1-reports'`). Empty / `'.'`
|
|
18
|
+
* yields `''`. Each segment is slugified independently so multi-segment
|
|
19
|
+
* paths keep their structure. */
|
|
20
|
+
function slugifyFolderPath(dir) {
|
|
21
|
+
if (!dir || dir === '.')
|
|
22
|
+
return '';
|
|
23
|
+
return dir
|
|
24
|
+
.split(/[/\\]/)
|
|
25
|
+
.map(slugify)
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join('/');
|
|
28
|
+
}
|
|
29
|
+
/** Convert kebab-case slug to the title-cased fallback the UI uses when no
|
|
30
|
+
* sidecar override is present. Mirrors `toDisplayName(slug)` in
|
|
31
|
+
* workspace.svelte.ts so we only persist a sidecar when the user's original
|
|
32
|
+
* segment carries information the fallback can't recover (`Schema_OS`,
|
|
33
|
+
* `HR`, `Q1 Reports`). Skipping look-alikes keeps the manifest sparse. */
|
|
34
|
+
function toDisplayFallback(slug) {
|
|
35
|
+
return slug
|
|
36
|
+
.split('-')
|
|
37
|
+
.map(s => s.charAt(0).toUpperCase() + s.slice(1))
|
|
38
|
+
.join(' ');
|
|
39
|
+
}
|
|
40
|
+
/** Pick the best `name` fallback for an imported entity when the source
|
|
41
|
+
* carries no frontmatter `name`/`title`. Mirrors the sparse rule used for
|
|
42
|
+
* folder display sidecars: prefer the original filename stem only when it
|
|
43
|
+
* carries casing the slug → title-case fallback can't recover (e.g.
|
|
44
|
+
* "Schema_OS.md" → slug "schema-os" → fallback "Schema Os" ≠ original).
|
|
45
|
+
* Otherwise stick with the title-case fallback so kebab and already
|
|
46
|
+
* title-cased filenames keep producing the same display they do today.
|
|
47
|
+
*
|
|
48
|
+
* When the entity_id was explicitly overridden (frontmatter / options) so
|
|
49
|
+
* that finalId differs from the natural slug of the filename, the explicit
|
|
50
|
+
* id is the source of truth — don't substitute the original stem. */
|
|
51
|
+
function deriveImportName(filename, finalId) {
|
|
52
|
+
const ext = extname(filename);
|
|
53
|
+
const originalStem = basename(filename, ext);
|
|
54
|
+
const naturalSlug = slugify(originalStem);
|
|
55
|
+
const slugFallbackName = formatName(finalId);
|
|
56
|
+
if (finalId !== naturalSlug)
|
|
57
|
+
return slugFallbackName;
|
|
58
|
+
if (originalStem === naturalSlug)
|
|
59
|
+
return slugFallbackName;
|
|
60
|
+
if (originalStem === slugFallbackName)
|
|
61
|
+
return slugFallbackName;
|
|
62
|
+
return originalStem;
|
|
63
|
+
}
|
|
64
|
+
/** Walk an original directory string and the slug it produced, emitting a
|
|
65
|
+
* per-segment list of {full slug-path, original segment string} for any
|
|
66
|
+
* segment whose original differs from the slug fallback. The full slug-path
|
|
67
|
+
* is repo-relative within `targetFolderPath` (the caller's chosen base), so
|
|
68
|
+
* the returned paths are ready to pass to `recordFolderDisplays`. */
|
|
69
|
+
function deriveFolderDisplays(originalDir, targetFolderPath) {
|
|
70
|
+
if (!originalDir || originalDir === '.')
|
|
71
|
+
return [];
|
|
72
|
+
const originalSegments = originalDir.split(/[/\\]/).filter(Boolean);
|
|
73
|
+
const result = [];
|
|
74
|
+
let acc = targetFolderPath ?? '';
|
|
75
|
+
for (const original of originalSegments) {
|
|
76
|
+
const slug = slugify(original);
|
|
77
|
+
if (!slug)
|
|
78
|
+
continue;
|
|
79
|
+
acc = acc ? `${acc}/${slug}` : slug;
|
|
80
|
+
// Two skip conditions:
|
|
81
|
+
// 1. original === slug — already kebab on disk; no info to preserve.
|
|
82
|
+
// 2. original === fallback — title-case fallback already round-trips.
|
|
83
|
+
// Only when both fail does the original carry casing the fallback can't
|
|
84
|
+
// recover (e.g. "Schema_OS", "HR", "iOS"), and we persist it.
|
|
85
|
+
if (original !== slug && original !== toDisplayFallback(slug)) {
|
|
86
|
+
result.push({ path: acc, display_name: original });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/** Combine a target folder path (e.g. caller's chosen subfolder) with a
|
|
92
|
+
* per-file relative directory. Either or both may be empty. */
|
|
93
|
+
function joinFolderPaths(...parts) {
|
|
94
|
+
return parts.filter((p) => Boolean(p)).join('/');
|
|
95
|
+
}
|
|
96
|
+
/** Create an entity, auto-suffixing the entity_id on `(type, id)` collisions
|
|
97
|
+
* (`foo` → `foo-2` → `foo-3` …) up to `maxAttempts` tries. The base id
|
|
98
|
+
* comes through unchanged when there's no collision. Returns the id that
|
|
99
|
+
* was actually used. */
|
|
100
|
+
async function createWithCollisionRetry(graph, options, maxAttempts = 50) {
|
|
101
|
+
let suffix = 0;
|
|
102
|
+
while (true) {
|
|
103
|
+
const entityId = suffix === 0 ? options.entityId : `${options.entityId}-${suffix + 1}`;
|
|
104
|
+
try {
|
|
105
|
+
const created = await graph.create({
|
|
106
|
+
...options,
|
|
107
|
+
entityId,
|
|
108
|
+
data: { ...options.data, entity_id: entityId },
|
|
109
|
+
});
|
|
110
|
+
return { entityId, path: created.path };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
if (!msg.includes('already exists') || suffix >= maxAttempts)
|
|
115
|
+
throw err;
|
|
116
|
+
suffix++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Extensions importFile handles directly. Binary asset extensions
|
|
122
|
+
* (.indd, .sketch, .psd, .ai, .fig, .pptx, …) are NOT in this set —
|
|
123
|
+
* they go through `uploadAsset` in the route layer instead. .pdf stays
|
|
124
|
+
* here for backwards compatibility (the agent tool still uses importFile
|
|
125
|
+
* to import a PDF as a `note` entity); the web import dispatcher routes
|
|
126
|
+
* .pdf to the asset path before reaching importFile.
|
|
127
|
+
*/
|
|
16
128
|
const SUPPORTED_EXTENSIONS = new Set(['.md', '.txt', '.csv', '.pdf', '.docx', '.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg']);
|
|
17
129
|
export function isSupportedFile(filename) {
|
|
18
130
|
return SUPPORTED_EXTENSIONS.has(extname(filename).toLowerCase());
|
|
@@ -50,107 +162,175 @@ export async function extractText(filename, content) {
|
|
|
50
162
|
}
|
|
51
163
|
/**
|
|
52
164
|
* Import a single file as a Studiograph entity.
|
|
53
|
-
*
|
|
165
|
+
*
|
|
166
|
+
* The `filename` may include a relative directory portion (e.g.
|
|
167
|
+
* `decks/2025-q1/talk.md`); the directory is slugified and combined with
|
|
168
|
+
* `options.folderPath` (the caller's chosen destination subfolder) to
|
|
169
|
+
* produce the final on-disk location. This preserves user-organized
|
|
170
|
+
* folder structure when a folder is dropped onto the import zone.
|
|
171
|
+
*
|
|
172
|
+
* Collisions on `(entity_type, entity_id)` are auto-suffixed (`talk` →
|
|
173
|
+
* `talk-2` → `talk-3` …) rather than skipped, so dropping a folder twice
|
|
174
|
+
* never silently swallows files.
|
|
54
175
|
*/
|
|
55
176
|
export async function importFile(graph, filename, content, options) {
|
|
56
177
|
const ext = extname(filename).toLowerCase();
|
|
57
|
-
const
|
|
58
|
-
if (!
|
|
178
|
+
const baseId = options?.entityId ?? slugify(basename(filename, ext));
|
|
179
|
+
if (!baseId) {
|
|
59
180
|
return { entityId: '', entityType: '', status: 'error', error: 'Could not generate entity ID from filename' };
|
|
60
181
|
}
|
|
182
|
+
// Combine the caller's target folder with the file's own relative
|
|
183
|
+
// directory. e.g. importing `decks/talk.md` into target `2025-q1` →
|
|
184
|
+
// final folderPath `2025-q1/decks`. Directory segments from the source
|
|
185
|
+
// are slugified to match the workspace's kebab-case folder convention.
|
|
186
|
+
const fileDir = dirname(filename);
|
|
187
|
+
const fileSlugDir = slugifyFolderPath(fileDir);
|
|
188
|
+
const combinedFolderPath = joinFolderPaths(options?.folderPath, fileSlugDir);
|
|
189
|
+
const innerOptions = { ...options, folderPath: combinedFolderPath || undefined };
|
|
190
|
+
// Capture original-casing display names for each source segment that the
|
|
191
|
+
// slug can't round-trip ("Schema_OS" → "schema-os" → "Schema Os" ≠
|
|
192
|
+
// original). These are written as per-folder sidecars after the entity
|
|
193
|
+
// lands so the import path is the only place that auto-populates them.
|
|
194
|
+
// First-writer-wins inside recordFolderDisplays — re-importing a folder
|
|
195
|
+
// with the same shape never clobbers a manual rename.
|
|
196
|
+
const folderDisplays = deriveFolderDisplays(fileDir, options?.folderPath);
|
|
61
197
|
try {
|
|
198
|
+
let result;
|
|
62
199
|
// PDF needs binary data — handle before text conversion
|
|
63
200
|
if (ext === '.pdf') {
|
|
64
201
|
const buf = typeof content === 'string' ? Buffer.from(content, 'base64') : content;
|
|
65
|
-
|
|
202
|
+
result = await importPdf(graph, baseId, buf, filename, innerOptions);
|
|
66
203
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
204
|
+
else {
|
|
205
|
+
const text = typeof content === 'string' ? content : content.toString('utf-8');
|
|
206
|
+
switch (ext) {
|
|
207
|
+
case '.md':
|
|
208
|
+
result = await importMarkdown(graph, baseId, text, filename, innerOptions);
|
|
209
|
+
break;
|
|
210
|
+
case '.txt':
|
|
211
|
+
result = await importText(graph, baseId, text, filename, innerOptions);
|
|
212
|
+
break;
|
|
213
|
+
case '.csv':
|
|
214
|
+
result = await importCsv(graph, baseId, text, filename, innerOptions);
|
|
215
|
+
break;
|
|
216
|
+
default:
|
|
217
|
+
return { entityId: baseId, entityType: '', status: 'error', error: `Unsupported file type: ${ext}` };
|
|
218
|
+
}
|
|
77
219
|
}
|
|
220
|
+
// Sidecar pass: only after the entity write succeeds. Folder existence
|
|
221
|
+
// is guaranteed at this point — graph.create()'s mkdir -p semantics
|
|
222
|
+
// produced the directories we're writing into.
|
|
223
|
+
if (result.status === 'created' && folderDisplays.length > 0) {
|
|
224
|
+
const sidecarPaths = graph.recordFolderDisplays(folderDisplays);
|
|
225
|
+
if (sidecarPaths.length > 0) {
|
|
226
|
+
result = { ...result, sidecarPaths };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
78
230
|
}
|
|
79
231
|
catch (err) {
|
|
80
232
|
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
-
|
|
82
|
-
return { entityId, entityType: options?.entityType ?? 'note', status: 'skipped', error: 'Entity already exists' };
|
|
83
|
-
}
|
|
84
|
-
return { entityId, entityType: options?.entityType ?? 'note', status: 'error', error: msg };
|
|
233
|
+
return { entityId: baseId, entityType: options?.entityType ?? 'note', status: 'error', error: msg };
|
|
85
234
|
}
|
|
86
235
|
}
|
|
87
|
-
/** Import a .md file
|
|
88
|
-
|
|
89
|
-
|
|
236
|
+
/** Import a .md file. Frontmatter wins: if the file declares
|
|
237
|
+
* `entity_type`/`entity_id`, those are used; options.entityType/entityId
|
|
238
|
+
* are fallbacks; final fallback is `note` and the slugified filename.
|
|
239
|
+
* This preserves the explicit shape of structured markdown a user has
|
|
240
|
+
* already prepared (decks, references, datasets-by-hand, etc.) instead
|
|
241
|
+
* of overwriting it with a generic default. */
|
|
242
|
+
async function importMarkdown(graph, entityId, text, filename, options) {
|
|
90
243
|
const parsed = matter(text);
|
|
244
|
+
const fmType = typeof parsed.data.entity_type === 'string' ? parsed.data.entity_type : undefined;
|
|
245
|
+
const fmId = typeof parsed.data.entity_id === 'string' ? parsed.data.entity_id : undefined;
|
|
246
|
+
const entityType = (fmType ?? options?.entityType ?? 'note');
|
|
247
|
+
const finalId = fmId ?? options?.entityId ?? entityId;
|
|
91
248
|
const now = new Date().toISOString();
|
|
249
|
+
const userHandle = options?.user
|
|
250
|
+
? (options.user.email?.split('@')[0] ?? options.user.name ?? 'import')
|
|
251
|
+
: 'import';
|
|
92
252
|
const data = {
|
|
93
253
|
...parsed.data,
|
|
94
254
|
entity_type: entityType,
|
|
95
|
-
entity_id:
|
|
96
|
-
name: parsed.data.name ?? parsed.data.title ??
|
|
255
|
+
entity_id: finalId,
|
|
256
|
+
name: parsed.data.name ?? parsed.data.title ?? deriveImportName(filename, finalId),
|
|
97
257
|
created_at: parsed.data.created_at ?? now,
|
|
98
258
|
updated_at: now,
|
|
99
|
-
created_by
|
|
100
|
-
|
|
259
|
+
// Only stamp created_by/updated_by when the source didn't declare them —
|
|
260
|
+
// preserves attribution for files exported from another workspace.
|
|
261
|
+
created_by: parsed.data.created_by ?? userHandle,
|
|
262
|
+
updated_by: userHandle,
|
|
101
263
|
};
|
|
102
|
-
await graph
|
|
264
|
+
const created = await createWithCollisionRetry(graph, {
|
|
103
265
|
entityType,
|
|
104
|
-
entityId,
|
|
266
|
+
entityId: finalId,
|
|
105
267
|
data,
|
|
106
268
|
content: parsed.content.trim(),
|
|
107
|
-
|
|
269
|
+
folderPath: options?.folderPath,
|
|
270
|
+
user: options?.user,
|
|
271
|
+
commitMessage: options?.commitMessage ?? `Import ${entityType}: ${finalId}`,
|
|
272
|
+
skipCommit: options?.skipCommit ?? true,
|
|
108
273
|
});
|
|
109
|
-
return { entityId, entityType, status: 'created' };
|
|
274
|
+
return { entityId: created.entityId, entityType, status: 'created', path: created.path };
|
|
110
275
|
}
|
|
111
276
|
/** Import a .txt file as a note entity. */
|
|
112
277
|
async function importText(graph, entityId, text, filename, options) {
|
|
113
278
|
const entityType = (options?.entityType ?? 'note');
|
|
114
279
|
const now = new Date().toISOString();
|
|
115
|
-
|
|
280
|
+
const userHandle = options?.user
|
|
281
|
+
? (options.user.email?.split('@')[0] ?? options.user.name ?? 'import')
|
|
282
|
+
: 'import';
|
|
283
|
+
const created = await createWithCollisionRetry(graph, {
|
|
116
284
|
entityType,
|
|
117
285
|
entityId,
|
|
118
286
|
data: {
|
|
119
287
|
entity_type: entityType,
|
|
120
288
|
entity_id: entityId,
|
|
121
|
-
name:
|
|
289
|
+
name: deriveImportName(filename, entityId),
|
|
122
290
|
created_at: now,
|
|
123
291
|
updated_at: now,
|
|
124
|
-
created_by:
|
|
125
|
-
updated_by:
|
|
292
|
+
created_by: userHandle,
|
|
293
|
+
updated_by: userHandle,
|
|
126
294
|
},
|
|
127
295
|
content: text.trim(),
|
|
128
|
-
|
|
296
|
+
folderPath: options?.folderPath,
|
|
297
|
+
user: options?.user,
|
|
298
|
+
commitMessage: options?.commitMessage ?? `Import note: ${entityId}`,
|
|
299
|
+
skipCommit: options?.skipCommit ?? true,
|
|
129
300
|
});
|
|
130
|
-
return { entityId, entityType, status: 'created' };
|
|
301
|
+
return { entityId: created.entityId, entityType, status: 'created', path: created.path };
|
|
131
302
|
}
|
|
132
303
|
/** Import a .csv file as a dataset entity with inferred schema. */
|
|
133
304
|
async function importCsv(graph, entityId, text, filename, options) {
|
|
134
305
|
const entityType = (options?.entityType ?? 'dataset');
|
|
135
306
|
const schema = inferCsvSchema(text);
|
|
307
|
+
if (schema.length === 0) {
|
|
308
|
+
return { entityId, entityType, status: 'error', error: 'CSV is empty or has no parseable header row' };
|
|
309
|
+
}
|
|
136
310
|
const now = new Date().toISOString();
|
|
137
|
-
|
|
311
|
+
const userHandle = options?.user
|
|
312
|
+
? (options.user.email?.split('@')[0] ?? options.user.name ?? 'import')
|
|
313
|
+
: 'import';
|
|
314
|
+
const created = await createWithCollisionRetry(graph, {
|
|
138
315
|
entityType,
|
|
139
316
|
entityId,
|
|
140
317
|
data: {
|
|
141
318
|
entity_type: entityType,
|
|
142
319
|
entity_id: entityId,
|
|
143
|
-
name:
|
|
320
|
+
name: deriveImportName(filename, entityId),
|
|
144
321
|
schema,
|
|
145
322
|
created_at: now,
|
|
146
323
|
updated_at: now,
|
|
147
|
-
created_by:
|
|
148
|
-
updated_by:
|
|
324
|
+
created_by: userHandle,
|
|
325
|
+
updated_by: userHandle,
|
|
149
326
|
},
|
|
150
327
|
content: text.trim(),
|
|
151
|
-
|
|
328
|
+
folderPath: options?.folderPath,
|
|
329
|
+
user: options?.user,
|
|
330
|
+
commitMessage: options?.commitMessage ?? `Import dataset: ${entityId}`,
|
|
331
|
+
skipCommit: options?.skipCommit ?? true,
|
|
152
332
|
});
|
|
153
|
-
return { entityId, entityType, status: 'created' };
|
|
333
|
+
return { entityId: created.entityId, entityType, status: 'created', path: created.path };
|
|
154
334
|
}
|
|
155
335
|
/** Import a .pdf file as a note entity. Extracts text via pdf-parse. */
|
|
156
336
|
async function importPdf(graph, entityId, data, filename, options) {
|
|
@@ -164,22 +344,28 @@ async function importPdf(graph, entityId, data, filename, options) {
|
|
|
164
344
|
}
|
|
165
345
|
const entityType = (options?.entityType ?? 'note');
|
|
166
346
|
const now = new Date().toISOString();
|
|
167
|
-
|
|
347
|
+
const userHandle = options?.user
|
|
348
|
+
? (options.user.email?.split('@')[0] ?? options.user.name ?? 'import')
|
|
349
|
+
: 'import';
|
|
350
|
+
const created = await createWithCollisionRetry(graph, {
|
|
168
351
|
entityType,
|
|
169
352
|
entityId,
|
|
170
353
|
data: {
|
|
171
354
|
entity_type: entityType,
|
|
172
355
|
entity_id: entityId,
|
|
173
|
-
name:
|
|
356
|
+
name: deriveImportName(filename, entityId),
|
|
174
357
|
created_at: now,
|
|
175
358
|
updated_at: now,
|
|
176
|
-
created_by:
|
|
177
|
-
updated_by:
|
|
359
|
+
created_by: userHandle,
|
|
360
|
+
updated_by: userHandle,
|
|
178
361
|
},
|
|
179
362
|
content: text,
|
|
180
|
-
|
|
363
|
+
folderPath: options?.folderPath,
|
|
364
|
+
user: options?.user,
|
|
365
|
+
commitMessage: options?.commitMessage ?? `Import ${entityType}: ${entityId}`,
|
|
366
|
+
skipCommit: options?.skipCommit ?? true,
|
|
181
367
|
});
|
|
182
|
-
return { entityId, entityType, status: 'created' };
|
|
368
|
+
return { entityId: created.entityId, entityType, status: 'created', path: created.path };
|
|
183
369
|
}
|
|
184
370
|
/** Infer column schema from CSV content. */
|
|
185
371
|
function inferCsvSchema(csv) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-service.js","sourceRoot":"","sources":["../../src/services/import-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"import-service.js","sourceRoot":"","sources":["../../src/services/import-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,8DAA8D;AAC9D,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACpF,CAAC;AAED;;;kCAGkC;AAClC,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,OAAO,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;2EAI2E;AAC3E,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;;;;sEAUsE;AACtE,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,gBAAgB,CAAC;IACrD,IAAI,YAAY,KAAK,WAAW;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,YAAY,KAAK,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC/D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;sEAIsE;AACtE,SAAS,oBAAoB,CAC3B,WAAmB,EACnB,gBAAoC;IAEpC,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,MAAM,GAAkD,EAAE,CAAC;IACjE,IAAI,GAAG,GAAG,gBAAgB,IAAI,EAAE,CAAC;IACjC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,uBAAuB;QACvB,uEAAuE;QACvE,wEAAwE;QACxE,wEAAwE;QACxE,8DAA8D;QAC9D,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;gEACgE;AAChE,SAAS,eAAe,CAAC,GAAG,KAAgC;IAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChE,CAAC;AAED;;;yBAGyB;AACzB,KAAK,UAAU,wBAAwB,CACrC,KAAuB,EACvB,OAA4B,EAC5B,WAAW,GAAG,EAAE;IAEhB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACvF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBACjC,GAAG,OAAO;gBACV,QAAQ;gBACR,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;aAC/C,CAAC,CAAC;YACH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,MAAM,IAAI,WAAW;gBAAE,MAAM,GAAG,CAAC;YACxE,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAoCD;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjI,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAE5C,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,oDAAoD;IACpD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK;YAChD,CAAC,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,wCAAwC;IACxC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAuB,EACvB,QAAgB,EAChB,OAAwB,EACxB,OAAuB;IAEvB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAErE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;IAChH,CAAC;IAED,kEAAkE;IAClE,oEAAoE;IACpE,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,kBAAkB,GAAG,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAkB,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,kBAAkB,IAAI,SAAS,EAAE,CAAC;IAEhG,yEAAyE;IACzE,mEAAmE;IACnE,uEAAuE;IACvE,uEAAuE;IACvE,wEAAwE;IACxE,sDAAsD;IACtD,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1E,IAAI,CAAC;QACH,IAAI,MAAoB,CAAC;QACzB,wDAAwD;QACxD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACnF,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/E,QAAQ,GAAG,EAAE,CAAC;gBACZ,KAAK,KAAK;oBACR,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAC3E,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;oBACvE,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;oBACtE,MAAM;gBACR;oBACE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC;YACzG,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,oEAAoE;QACpE,+CAA+C;QAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACtG,CAAC;AACH,CAAC;AAED;;;;;gDAKgD;AAChD,KAAK,UAAU,cAAc,CAC3B,KAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,OAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3F,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,OAAO,EAAE,UAAU,IAAI,MAAM,CAAe,CAAC;IAC3E,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,EAAE,QAAQ,IAAI,QAAQ,CAAC;IAEtD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,EAAE,IAAI;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;QACtE,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,IAAI,GAAwB;QAChC,GAAG,MAAM,CAAC,IAAI;QACd,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC;QAClF,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG;QACzC,UAAU,EAAE,GAAG;QACf,yEAAyE;QACzE,mEAAmE;QACnE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU;QAChD,UAAU,EAAE,UAAU;KACvB,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE;QACpD,UAAU;QACV,QAAQ,EAAE,OAAO;QACjB,IAAI;QACJ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAC9B,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,UAAU,UAAU,KAAK,OAAO,EAAE;QAC3E,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI;KACxC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,2CAA2C;AAC3C,KAAK,UAAU,UAAU,CACvB,KAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,OAAuB;IAEvB,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,MAAM,CAAe,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,EAAE,IAAI;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;QACtE,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE;QACpD,UAAU;QACV,QAAQ;QACR,IAAI,EAAE;YACJ,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC1C,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;SACvB;QACD,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,gBAAgB,QAAQ,EAAE;QACnE,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI;KACxC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,mEAAmE;AACnE,KAAK,UAAU,SAAS,CACtB,KAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,OAAuB;IAEvB,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,SAAS,CAAe,CAAC;IACpE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;IACzG,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,EAAE,IAAI;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;QACtE,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE;QACpD,UAAU;QACV,QAAQ;QACR,IAAI,EAAE;YACJ,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC1C,MAAM;YACN,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;SACvB;QACD,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,mBAAmB,QAAQ,EAAE;QACtE,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI;KACxC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,wEAAwE;AACxE,KAAK,UAAU,SAAS,CACtB,KAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,OAAuB;IAEvB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAEjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;IACtG,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,MAAM,CAAe,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,EAAE,IAAI;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;QACtE,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE;QACpD,UAAU;QACV,QAAQ;QACR,IAAI,EAAE;YACJ,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC1C,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;SACvB;QACD,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,UAAU,UAAU,KAAK,QAAQ,EAAE;QAC5E,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI;KACxC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,4CAA4C;AAC5C,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,eAAe;IACf,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,+CAA+C;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEvD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACnG,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,MAAgB;IACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,IAAI,UAAU;QAAE,OAAO,QAAQ,CAAC;IAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;IACjG,IAAI,WAAW;QAAE,OAAO,SAAS,CAAC;IAElC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC3E,IAAI,QAAQ;QAAE,OAAO,MAAM,CAAC;IAE5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,iEAAiE;AACjE,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACpC,OAAO,IAAI,GAAG,CAAC;gBACf,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uDAAuD;AACvD,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,QAAQ;SACZ,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|