@im-nobsidian/core 0.1.1 → 0.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/config/manager.ts","../src/utils/id.ts","../src/state/migrations/001-initial.ts","../src/state/state-db.ts","../src/notion/property-mapper.ts","../src/notion/client.ts","../src/notion/block-builder.ts","../src/utils/hash.ts","../src/sync/change-detector.ts","../src/utils/logger.ts","../src/converter/pipeline.ts","../src/converter/pre-processors/frontmatter.ts","../src/converter/pre-processors/wikilink.ts","../src/converter/pre-processors/callout.ts","../src/converter/pre-processors/math.ts","../src/converter/pre-processors/embed.ts","../src/converter/pre-processors/preserve-marker.ts","../src/converter/pre-processors/unsupported-block-stripper.ts","../src/converter/pre-processors/properties-table.ts","../src/converter/pre-processors/html-annotation.ts","../src/converter/post-processors/mention-to-wikilink.ts","../src/converter/post-processors/preserve-marker-injector.ts","../src/converter/post-processors/callout-restorer.ts","../src/converter/post-processors/color-annotator.ts","../src/converter/post-processors/frontmatter-generator.ts","../src/converter/post-processors/local-image-restorer.ts","../src/converter/post-processors/properties-table-restorer.ts","../src/converter/pipeline-factory.ts","../src/converter/block-converter.ts","../src/sync/image-handler.ts","../src/utils/sanitize.ts","../src/converter/enhanced-md-converter.ts","../src/sync/orchestrator.ts","../src/sync/node-vault-fs.ts","../src/converter/pre-processors/inline-db.ts","../src/conflict/merger.ts","../src/conflict/resolver.ts","../src/structure/tree-mapper.ts","../src/watcher/file-watcher.ts","../src/watcher/watch-sync-service.ts"],"names":["stat","matter","escapeRegex","createHash","Sema","TOGGLE_START","TOGGLE_END","EMOJI_TYPE_MAP","title","pathParts","join","readFile","mkdir","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport const ConfigSchema = z.object({\n version: z.literal(1),\n notion: z.object({\n token: z.string().startsWith(\"ntn_\"),\n rootPageId: z.string(),\n workspaceId: z.string().optional(),\n parentMode: z.enum([\"page\", \"database\"]).default(\"page\"),\n databaseId: z.string().optional(),\n }),\n sync: z.object({\n direction: z.enum([\"push\", \"pull\", \"both\"]).default(\"both\"),\n conflictStrategy: z\n .enum([\"local-first\", \"remote-first\", \"manual\", \"duplicate\"])\n .default(\"manual\"),\n autoSync: z.boolean().default(false),\n autoSyncInterval: z.number().min(30).max(3600).default(300),\n deleteSync: z.boolean().default(false),\n }),\n paths: z.object({\n include: z.array(z.string()).default([\"**/*\"]),\n exclude: z.array(z.string()).default([]),\n attachments: z.string().default(\"attachments\"),\n }),\n conversion: z.object({\n preferMarkdownApi: z.boolean().default(true),\n preserveMarkers: z.boolean().default(true),\n frontmatterMapping: z.boolean().default(true),\n imageDownload: z.enum([\"immediate\", \"lazy\", \"skip\"]).default(\"immediate\"),\n }),\n advanced: z.object({\n concurrency: z.number().min(1).max(10).default(3),\n maxRetries: z.number().min(0).max(10).default(5),\n timeoutMs: z.number().min(5000).max(60000).default(30000),\n batchSize: z.number().min(1).max(100).default(50),\n }),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport const DEFAULT_CONFIG: Config = {\n version: 1,\n notion: {\n token: \"\",\n rootPageId: \"\",\n parentMode: \"page\",\n },\n sync: {\n direction: \"both\",\n conflictStrategy: \"manual\",\n autoSync: false,\n autoSyncInterval: 300,\n deleteSync: false,\n },\n paths: {\n include: [\"**/*\"],\n exclude: [],\n attachments: \"attachments\",\n },\n conversion: {\n preferMarkdownApi: true,\n preserveMarkers: true,\n frontmatterMapping: true,\n imageDownload: \"immediate\",\n },\n advanced: {\n concurrency: 3,\n maxRetries: 5,\n timeoutMs: 30000,\n batchSize: 50,\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ConfigSchema, DEFAULT_CONFIG } from \"../types/config.js\";\nimport type { Config } from \"../types/config.js\";\n\nconst CONFIG_FILE = \"config.json\";\nconst IM_NOBSIDIAN_DIR = \".im-nobsidian\";\n\nexport class ConfigManager {\n private config: Config | null = null;\n\n constructor(private readonly vaultRoot: string) {}\n\n get configDir(): string {\n return join(this.vaultRoot, IM_NOBSIDIAN_DIR);\n }\n\n get configPath(): string {\n return join(this.configDir, CONFIG_FILE);\n }\n\n get dbPath(): string {\n return join(this.configDir, \"sync.db\");\n }\n\n async load(): Promise<Config> {\n try {\n const raw = await readFile(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n this.config = ConfigSchema.parse(parsed);\n return this.config;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`설정 파일의 JSON 형식이 올바르지 않습니다: ${this.configPath}`);\n }\n if (error instanceof Error && error.name === \"ZodError\") {\n throw new Error(`설정 파일 검증 실패: ${error.message}`);\n }\n throw new Error(\n `설정 파일을 찾을 수 없습니다: ${this.configPath}\\n'im-nobsidian init'을 먼저 실행하세요.`,\n );\n }\n }\n\n async save(config: Config): Promise<void> {\n await mkdir(this.configDir, { recursive: true });\n const content = JSON.stringify(config, null, 2);\n await writeFile(this.configPath, content, \"utf-8\");\n this.config = config;\n }\n\n async init(params: { token: string; rootPageId: string }): Promise<Config> {\n const config: Config = {\n ...DEFAULT_CONFIG,\n notion: {\n ...DEFAULT_CONFIG.notion,\n token: params.token,\n rootPageId: params.rootPageId,\n },\n };\n\n await this.save(config);\n await this.ensureGitignore();\n return config;\n }\n\n getConfig(): Config {\n if (!this.config) {\n throw new Error(\"설정이 로드되지 않았습니다. load()를 먼저 호출하세요.\");\n }\n return this.config;\n }\n\n private async ensureGitignore(): Promise<void> {\n const gitignorePath = join(this.vaultRoot, \".gitignore\");\n const entry = \".im-nobsidian/\";\n\n try {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (!content.includes(entry)) {\n await writeFile(gitignorePath, `${content.trimEnd()}\\n${entry}\\n`, \"utf-8\");\n }\n } catch {\n await writeFile(gitignorePath, `${entry}\\n`, \"utf-8\");\n }\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n const { stat } = await import(\"node:fs/promises\");\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function generateId(): string {\n return randomUUID();\n}\n\nexport function normalizeNotionId(id: string): string {\n const raw = id.replace(/-/g, \"\");\n if (raw.length !== 32) return id;\n return `${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(16, 20)}-${raw.slice(20)}`;\n}\n\nexport function notionIdsEqual(a: string, b: string): boolean {\n return a.replace(/-/g, \"\") === b.replace(/-/g, \"\");\n}\n","export const INITIAL_MIGRATION = `\nCREATE TABLE IF NOT EXISTS sync_state (\n id TEXT PRIMARY KEY,\n obsidian_path TEXT NOT NULL,\n notion_page_id TEXT,\n notion_parent_id TEXT,\n content_hash TEXT NOT NULL,\n notion_last_edited TEXT,\n local_last_modified TEXT NOT NULL,\n sync_direction TEXT NOT NULL DEFAULT 'both',\n file_type TEXT NOT NULL DEFAULT 'file',\n status TEXT NOT NULL DEFAULT 'pending',\n base_snapshot BLOB,\n version INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n\n CONSTRAINT chk_sync_direction CHECK (sync_direction IN ('push', 'pull', 'both')),\n CONSTRAINT chk_file_type CHECK (file_type IN ('file', 'folder-note', 'folder-only', 'db-row')),\n CONSTRAINT chk_status CHECK (status IN ('synced', 'pending', 'conflict', 'error'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_path ON sync_state(obsidian_path);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_notion ON sync_state(notion_page_id) WHERE notion_page_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_sync_state_status ON sync_state(status);\nCREATE INDEX IF NOT EXISTS idx_sync_state_parent ON sync_state(notion_parent_id);\n\nCREATE TABLE IF NOT EXISTS wikilink_map (\n obsidian_path TEXT PRIMARY KEY,\n notion_page_id TEXT NOT NULL UNIQUE,\n title TEXT NOT NULL,\n aliases TEXT DEFAULT '[]',\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_wikilink_title ON wikilink_map(title);\nCREATE INDEX IF NOT EXISTS idx_wikilink_notion ON wikilink_map(notion_page_id);\n\nCREATE TABLE IF NOT EXISTS pending_operations (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n operation TEXT NOT NULL,\n direction TEXT NOT NULL,\n payload TEXT,\n retry_count INTEGER NOT NULL DEFAULT 0,\n error_message TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n completed_at TEXT,\n\n CONSTRAINT chk_operation CHECK (operation IN ('create', 'update', 'delete', 'move')),\n CONSTRAINT chk_direction CHECK (direction IN ('push', 'pull')),\n CONSTRAINT chk_op_status CHECK (status IN ('pending', 'processing', 'completed', 'failed'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_pending_status ON pending_operations(status, created_at);\n\nCREATE TABLE IF NOT EXISTS image_registry (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n notion_file_url TEXT NOT NULL,\n local_path TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n file_size INTEGER NOT NULL,\n mime_type TEXT NOT NULL,\n expires_at TEXT,\n downloaded_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_image_hash ON image_registry(content_hash);\nCREATE INDEX IF NOT EXISTS idx_image_sync ON image_registry(sync_state_id);\n\nCREATE TABLE IF NOT EXISTS sync_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nINSERT OR IGNORE INTO sync_metadata (key, value) VALUES ('schema_version', '1');\n`;\n","import Database from \"better-sqlite3\";\nimport type { SyncRecord, SyncStatus, WikilinkEntry, PreserveMarker } from \"../types/index.js\";\nimport { generateId } from \"../utils/id.js\";\nimport { INITIAL_MIGRATION } from \"./migrations/001-initial.js\";\n\nexport class StateDB {\n private readonly db: Database.Database;\n\n private constructor(db: Database.Database) {\n this.db = db;\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n }\n\n static open(dbPath: string): StateDB {\n const db = new Database(dbPath);\n const stateDb = new StateDB(db);\n stateDb.migrate();\n return stateDb;\n }\n\n private migrate(): void {\n const version = this.getSchemaVersion();\n if (version < 1) {\n this.db.exec(INITIAL_MIGRATION);\n }\n }\n\n private getSchemaVersion(): number {\n try {\n const row = this.db\n .prepare(\"SELECT value FROM sync_metadata WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n return row ? Number(row.value) : 0;\n } catch {\n return 0;\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n // --- sync_state ---\n\n getByPath(path: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE obsidian_path = ?\").get(path) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByNotionId(pageId: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE notion_page_id = ?\").get(pageId) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByStatus(status: SyncStatus): SyncRecord[] {\n const rows = this.db\n .prepare(\"SELECT * FROM sync_state WHERE status = ?\")\n .all(status) as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n getAll(): SyncRecord[] {\n const rows = this.db.prepare(\"SELECT * FROM sync_state\").all() as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n upsert(record: UpsertSyncRecord): SyncRecord {\n const existing = this.getByPath(record.obsidianPath);\n\n if (existing) {\n this.db\n .prepare(\n `UPDATE sync_state SET\n notion_page_id = ?, notion_parent_id = ?, content_hash = ?,\n notion_last_edited = ?, local_last_modified = ?,\n sync_direction = ?, file_type = ?, status = ?,\n base_snapshot = ?, version = version + 1,\n updated_at = datetime('now')\n WHERE id = ?`,\n )\n .run(\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n existing.id,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n const id = generateId();\n this.db\n .prepare(\n `INSERT INTO sync_state\n (id, obsidian_path, notion_page_id, notion_parent_id, content_hash,\n notion_last_edited, local_last_modified, sync_direction, file_type,\n status, base_snapshot, version)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`,\n )\n .run(\n id,\n record.obsidianPath,\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n updateStatus(id: string, status: SyncStatus): void {\n this.db\n .prepare(\"UPDATE sync_state SET status = ?, updated_at = datetime('now') WHERE id = ?\")\n .run(status, id);\n }\n\n updateHash(id: string, hash: string, snapshot?: Buffer | null): void {\n if (snapshot !== undefined) {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, base_snapshot = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, snapshot, id);\n } else {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, id);\n }\n }\n\n setNotionLastEdited(id: string, lastEdited: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_last_edited = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(lastEdited, id);\n }\n\n delete(id: string): void {\n this.db.prepare(\"DELETE FROM sync_state WHERE id = ?\").run(id);\n }\n\n // --- wikilink_map ---\n\n resolveWikilink(text: string): WikilinkEntry | null {\n const byTitle = this.db.prepare(\"SELECT * FROM wikilink_map WHERE title = ?\").get(text) as\n | RawWikilinkRow\n | undefined;\n\n if (byTitle) return this.mapWikilinkRow(byTitle);\n\n const byAlias = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE aliases LIKE ?\")\n .get(`%\"${text}\"%`) as RawWikilinkRow | undefined;\n\n if (byAlias) return this.mapWikilinkRow(byAlias);\n\n const byFilename = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE obsidian_path LIKE ?\")\n .get(`%/${text}.md`) as RawWikilinkRow | undefined;\n\n return byFilename ? this.mapWikilinkRow(byFilename) : null;\n }\n\n resolvePageId(pageId: string): WikilinkEntry | null {\n const row = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE notion_page_id = ?\")\n .get(pageId) as RawWikilinkRow | undefined;\n return row ? this.mapWikilinkRow(row) : null;\n }\n\n upsertWikilink(entry: WikilinkEntry): void {\n this.db\n .prepare(\n `INSERT OR REPLACE INTO wikilink_map (obsidian_path, notion_page_id, title, aliases, updated_at)\n VALUES (?, ?, ?, ?, datetime('now'))`,\n )\n .run(entry.obsidianPath, entry.notionPageId, entry.title, JSON.stringify(entry.aliases));\n }\n\n // --- sync_metadata ---\n\n getMeta(key: string): string | null {\n const row = this.db.prepare(\"SELECT value FROM sync_metadata WHERE key = ?\").get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n }\n\n setMeta(key: string, value: string): void {\n this.db\n .prepare(\"INSERT OR REPLACE INTO sync_metadata (key, value) VALUES (?, ?)\")\n .run(key, value);\n }\n\n // --- preserve markers ---\n\n storePreserveMarkers(path: string, markers: PreserveMarker[]): void {\n if (markers.length === 0) {\n this.db.prepare(\"DELETE FROM sync_metadata WHERE key = ?\").run(`preserve_markers:${path}`);\n return;\n }\n this.setMeta(`preserve_markers:${path}`, JSON.stringify(markers));\n }\n\n getPreserveMarkers(path: string): PreserveMarker[] {\n const value = this.getMeta(`preserve_markers:${path}`);\n if (!value) return [];\n try {\n return JSON.parse(value) as PreserveMarker[];\n } catch {\n return [];\n }\n }\n\n // --- transaction ---\n\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n\n // --- private ---\n\n private mapRow(row: RawSyncRow): SyncRecord {\n return {\n id: row.id,\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n notionParentId: row.notion_parent_id,\n contentHash: row.content_hash,\n notionLastEdited: row.notion_last_edited,\n localLastModified: row.local_last_modified,\n syncDirection: row.sync_direction as SyncRecord[\"syncDirection\"],\n fileType: row.file_type as SyncRecord[\"fileType\"],\n status: row.status as SyncRecord[\"status\"],\n baseSnapshot: row.base_snapshot,\n version: row.version,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n private mapWikilinkRow(row: RawWikilinkRow): WikilinkEntry {\n return {\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n title: row.title,\n aliases: JSON.parse(row.aliases || \"[]\") as string[],\n };\n }\n}\n\nexport interface UpsertSyncRecord {\n readonly obsidianPath: string;\n readonly notionPageId?: string | null;\n readonly notionParentId?: string | null;\n readonly contentHash: string;\n readonly notionLastEdited?: string | null;\n readonly localLastModified: string;\n readonly syncDirection: SyncRecord[\"syncDirection\"];\n readonly fileType: SyncRecord[\"fileType\"];\n readonly status: SyncRecord[\"status\"];\n readonly baseSnapshot?: Buffer | null;\n}\n\ninterface RawSyncRow {\n id: string;\n obsidian_path: string;\n notion_page_id: string | null;\n notion_parent_id: string | null;\n content_hash: string;\n notion_last_edited: string | null;\n local_last_modified: string;\n sync_direction: string;\n file_type: string;\n status: string;\n base_snapshot: Buffer | null;\n version: number;\n created_at: string;\n updated_at: string;\n}\n\ninterface RawWikilinkRow {\n obsidian_path: string;\n notion_page_id: string;\n title: string;\n aliases: string;\n updated_at: string;\n}\n","type NotionPropertySchema = {\n id: string;\n type: string;\n name: string;\n};\n\ntype NotionPropertyValue = Record<string, unknown>;\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2})?/;\n\nexport class PropertyMapper {\n private schema: Map<string, NotionPropertySchema> = new Map();\n\n loadSchema(properties: Record<string, { id: string; type: string }>): void {\n this.schema.clear();\n for (const [name, prop] of Object.entries(properties)) {\n this.schema.set(name, { id: prop.id, type: prop.type, name });\n }\n }\n\n toNotionProperties(\n frontmatter: Record<string, unknown>,\n title: string,\n ): Record<string, NotionPropertyValue> {\n const result: Record<string, NotionPropertyValue> = {\n title: { title: [{ text: { content: title } }] },\n };\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (key === \"title\") continue;\n if (value === null || value === undefined) continue;\n\n const schemaProp = this.schema.get(key);\n if (schemaProp) {\n const converted = this.convertBySchema(schemaProp.type, value);\n if (converted) result[key] = converted;\n } else {\n const inferred = this.inferAndConvert(value);\n if (inferred) result[key] = inferred;\n }\n }\n\n return result;\n }\n\n fromNotionProperties(notionProps: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, rawProp] of Object.entries(notionProps)) {\n const prop = rawProp as { type: string; [k: string]: unknown };\n if (prop.type === \"title\") continue;\n const value = this.extractValue(prop);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n private convertBySchema(type: string, value: unknown): NotionPropertyValue | null {\n switch (type) {\n case \"rich_text\":\n return { rich_text: [{ text: { content: String(value) } }] };\n\n case \"number\":\n return { number: typeof value === \"number\" ? value : Number(value) };\n\n case \"select\":\n return { select: { name: String(value) } };\n\n case \"multi_select\": {\n const items = Array.isArray(value)\n ? value\n : String(value)\n .split(\",\")\n .map((s) => s.trim());\n return { multi_select: items.map((name: unknown) => ({ name: String(name) })) };\n }\n\n case \"checkbox\":\n return { checkbox: Boolean(value) };\n\n case \"date\": {\n const dateStr = String(value);\n if (DATE_REGEX.test(dateStr)) {\n return { date: { start: dateStr } };\n }\n return null;\n }\n\n case \"url\":\n return { url: String(value) };\n\n case \"email\":\n return { email: String(value) };\n\n case \"phone_number\":\n return { phone_number: String(value) };\n\n case \"status\":\n return { status: { name: String(value) } };\n\n default:\n return { rich_text: [{ text: { content: String(value) } }] };\n }\n }\n\n private inferAndConvert(value: unknown): NotionPropertyValue | null {\n if (typeof value === \"boolean\") {\n return { checkbox: value };\n }\n if (typeof value === \"number\") {\n return { number: value };\n }\n if (Array.isArray(value)) {\n return {\n multi_select: value.map((v) => ({ name: String(v) })),\n };\n }\n if (typeof value === \"string\") {\n if (DATE_REGEX.test(value)) {\n return { date: { start: value } };\n }\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n return { url: value };\n }\n return { rich_text: [{ text: { content: value } }] };\n }\n return null;\n }\n\n private extractValue(prop: { type: string; [k: string]: unknown }): unknown {\n switch (prop.type) {\n case \"rich_text\": {\n const arr = prop.rich_text as Array<{ plain_text: string }> | undefined;\n return arr?.map((t) => t.plain_text).join(\"\") || null;\n }\n case \"number\":\n return prop.number;\n case \"select\": {\n const sel = prop.select as { name: string } | null;\n return sel?.name ?? null;\n }\n case \"multi_select\": {\n const items = prop.multi_select as Array<{ name: string }> | undefined;\n return items?.map((s) => s.name) ?? [];\n }\n case \"checkbox\":\n return prop.checkbox;\n case \"date\":\n return prop.date ?? null;\n case \"url\":\n return prop.url;\n case \"email\":\n return prop.email;\n case \"phone_number\":\n return prop.phone_number;\n case \"status\": {\n const status = prop.status as { name: string } | null;\n return status?.name ?? null;\n }\n case \"created_time\":\n return prop.created_time;\n case \"last_edited_time\":\n return prop.last_edited_time;\n case \"people\": {\n const people = prop.people as Array<{ name?: string; id: string }> | undefined;\n return people?.map((p) => p.name ?? p.id) ?? [];\n }\n case \"files\": {\n const files = prop.files as\n | Array<{\n name: string;\n type: string;\n file?: { url: string };\n external?: { url: string };\n }>\n | undefined;\n return (\n files?.map((f) => ({\n name: f.name,\n url: f.type === \"file\" ? f.file?.url : f.external?.url,\n })) ?? []\n );\n }\n case \"formula\": {\n const formula = prop.formula as { type: string; [k: string]: unknown } | undefined;\n if (!formula) return null;\n return formula[formula.type];\n }\n case \"relation\": {\n const rel = prop.relation as Array<{ id: string }> | undefined;\n return rel?.map((r) => r.id) ?? [];\n }\n case \"rollup\": {\n const rollup = prop.rollup as { type: string; [k: string]: unknown } | undefined;\n if (!rollup) return null;\n if (rollup.type === \"array\") {\n const arr = rollup.array as Array<{ type: string; [k: string]: unknown }>;\n return arr.map((item) => this.extractValue(item));\n }\n return rollup[rollup.type] ?? null;\n }\n case \"unique_id\": {\n const uid = prop.unique_id as { prefix?: string; number: number } | undefined;\n if (!uid) return null;\n return uid.prefix ? `${uid.prefix}-${uid.number}` : String(uid.number);\n }\n case \"created_by\":\n case \"last_edited_by\": {\n const user = prop[prop.type] as { name?: string; id: string } | undefined;\n return user?.name ?? user?.id ?? null;\n }\n case \"verification\": {\n const v = prop.verification as { state: string } | undefined;\n return v?.state ?? null;\n }\n default:\n return null;\n }\n }\n}\n","import { Client } from \"@notionhq/client\";\nimport { Sema } from \"async-sema\";\nimport type {\n BlockObjectResponse,\n PageObjectResponse,\n PartialBlockObjectResponse,\n PageMarkdownResponse,\n} from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { PropertyMapper } from \"./property-mapper.js\";\n\nexport interface NotionClientOptions {\n readonly token: string;\n readonly concurrency?: number;\n readonly timeoutMs?: number;\n}\n\nexport class NotionClient {\n private readonly client: Client;\n private readonly sema: Sema;\n private readonly propertyMapper = new PropertyMapper();\n\n constructor(options: NotionClientOptions) {\n this.client = new Client({\n auth: options.token,\n timeoutMs: options.timeoutMs ?? 30000,\n });\n this.sema = new Sema(options.concurrency ?? 3);\n }\n\n getInternalClient(): Client {\n return this.client;\n }\n\n // ─── Page CRUD ───\n\n async getPage(pageId: string): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () => this.client.pages.retrieve({ page_id: pageId }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPage(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n properties?: Record<string, unknown>;\n children?: BlockObjectResponse[];\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n children: params.children as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPageWithMarkdown(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n markdown: string;\n properties?: Record<string, unknown>;\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n markdown: params.markdown,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async updatePageProperties(\n pageId: string,\n properties: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n properties: properties as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Markdown API ───\n\n async getPageMarkdown(pageId: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() => this.client.pages.retrieveMarkdown({ page_id: pageId }));\n }\n\n async replacePageMarkdown(pageId: string, markdown: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"replace_content\",\n replace_content: {\n new_str: markdown,\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n // ─── Database / DataSource ───\n\n async getDatabaseSchema(\n databaseId: string,\n ): Promise<Record<string, { id: string; type: string }>> {\n const db = await this.withRateLimit(() =>\n this.client.databases.retrieve({ database_id: databaseId }),\n );\n const properties = (\n db as unknown as { properties: Record<string, { id: string; type: string }> }\n ).properties;\n const schema: Record<string, { id: string; type: string }> = {};\n for (const [name, prop] of Object.entries(properties)) {\n schema[name] = { id: prop.id, type: prop.type };\n }\n return schema;\n }\n\n async queryDatabase(\n databaseId: string,\n options?: { startCursor?: string; pageSize?: number },\n ): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const response = await this.withRateLimit(() =>\n this.client.dataSources.query({\n data_source_id: databaseId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async archivePage(pageId: string): Promise<void> {\n await this.withRateLimit(() => this.client.pages.update({ page_id: pageId, archived: true }));\n }\n\n // ─── Block CRUD ───\n\n async listChildren(\n blockId: string,\n options?: { startCursor?: string; pageSize?: number },\n ): Promise<{\n results: (BlockObjectResponse | PartialBlockObjectResponse)[];\n nextCursor: string | null;\n }> {\n const response = await this.withRateLimit(() =>\n this.client.blocks.children.list({\n block_id: blockId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n }),\n );\n return {\n results: response.results,\n nextCursor: response.next_cursor,\n };\n }\n\n async fetchAllChildren(blockId: string): Promise<BlockObjectResponse[]> {\n const blocks: BlockObjectResponse[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.listChildren(blockId, { startCursor: cursor });\n blocks.push(...response.results.filter((b): b is BlockObjectResponse => \"type\" in b));\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return blocks;\n }\n\n async appendChildren(blockId: string, children: unknown[]): Promise<void> {\n const BATCH_SIZE = 100;\n for (let i = 0; i < children.length; i += BATCH_SIZE) {\n const batch = children.slice(i, i + BATCH_SIZE);\n await this.withRateLimit(() =>\n this.client.blocks.children.append({\n block_id: blockId,\n children: batch as never,\n }),\n );\n }\n }\n\n async deleteBlock(blockId: string): Promise<void> {\n await this.withRateLimit(() => this.client.blocks.delete({ block_id: blockId }));\n }\n\n // ─── File Upload ───\n\n async uploadFile(fileData: Blob, filename: string, contentType: string): Promise<string> {\n const upload = await this.withRateLimit(() =>\n this.client.fileUploads.create({ filename, content_type: contentType }),\n );\n\n const fileUploadId = (upload as unknown as { id: string }).id;\n\n await this.withRateLimit(() =>\n this.client.fileUploads.send({\n file_upload_id: fileUploadId,\n file: { data: fileData, filename },\n }),\n );\n\n await this.withRateLimit(() =>\n this.client.fileUploads.complete({ file_upload_id: fileUploadId }),\n );\n\n return fileUploadId;\n }\n\n // ─── Search & Navigation ───\n\n async search(params: {\n query?: string;\n filter?: { property: \"object\"; value: \"page\" | \"data_source\" };\n startCursor?: string;\n pageSize?: number;\n }): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const response = await this.withRateLimit(() =>\n this.client.search({\n query: params.query,\n filter: params.filter,\n start_cursor: params.startCursor,\n page_size: params.pageSize ?? 100,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async getChildPages(parentId: string): Promise<PageObjectResponse[]> {\n const blocks = await this.fetchAllChildren(parentId);\n const childPageBlocks = blocks.filter((b) => b.type === \"child_page\");\n\n if (childPageBlocks.length === 0) return [];\n\n const pages = await Promise.all(childPageBlocks.map((b) => this.getPage(b.id)));\n return pages;\n }\n\n async getChildPagesRecursive(parentId: string): Promise<PageObjectResponse[]> {\n const all: PageObjectResponse[] = [];\n let currentLevel: string[] = [parentId];\n\n while (currentLevel.length > 0) {\n const childArrays = await Promise.all(currentLevel.map((id) => this.getChildPages(id)));\n const nextLevel: string[] = [];\n\n for (const children of childArrays) {\n for (const child of children) {\n all.push(child);\n nextLevel.push(child.id);\n }\n }\n\n currentLevel = nextLevel;\n }\n\n return all;\n }\n\n // ─── Property Extraction ───\n\n extractTitle(page: PageObjectResponse): string {\n const props = page.properties as Record<\n string,\n { type: string; title?: Array<{ plain_text?: string }> }\n >;\n for (const prop of Object.values(props)) {\n if (prop.type === \"title\" && prop.title) {\n const joined = prop.title.map((t) => t.plain_text ?? \"\").join(\"\");\n if (joined) return joined;\n }\n }\n return \"제목 없음\";\n }\n\n extractProperties(page: PageObjectResponse): Record<string, unknown> {\n return this.propertyMapper.fromNotionProperties(page.properties as Record<string, unknown>);\n }\n\n // ─── Internal ───\n\n private async withRateLimit<T>(fn: () => Promise<T>): Promise<T> {\n await this.sema.acquire();\n try {\n return await this.executeWithRetry(fn);\n } finally {\n this.sema.release();\n }\n }\n\n private async executeWithRetry<T>(fn: () => Promise<T>, attempt: number = 0): Promise<T> {\n try {\n return await fn();\n } catch (error: unknown) {\n if (isRetryable(error) && attempt < 5) {\n const baseDelay = extractRetryAfter(error) ?? 1000 * Math.pow(2, attempt);\n const jitter = baseDelay * (0.5 + Math.random() * 0.5);\n await sleep(jitter);\n return this.executeWithRetry(fn, attempt + 1);\n }\n throw error;\n }\n }\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false;\n const code = (error as { code?: string }).code;\n if (code === \"notionhq_client_request_timeout\" || code === \"ECONNRESET\" || code === \"ETIMEDOUT\") {\n return true;\n }\n if (!(\"status\" in error)) return false;\n const status = (error as { status: number }).status;\n return status === 429 || status === 502 || status === 503 || status === 504;\n}\n\nfunction extractRetryAfter(error: unknown): number | null {\n if (typeof error === \"object\" && error !== null && \"headers\" in error) {\n const headers = (error as { headers: Record<string, string> }).headers;\n const retryAfter = headers?.[\"retry-after\"];\n if (retryAfter) return Number(retryAfter) * 1000;\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","const VALID_COLORS = new Set([\n \"default\",\n \"gray\",\n \"brown\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"pink\",\n \"red\",\n \"gray_background\",\n \"brown_background\",\n \"orange_background\",\n \"yellow_background\",\n \"green_background\",\n \"blue_background\",\n \"purple_background\",\n \"pink_background\",\n \"red_background\",\n]);\n\ntype NotionColor = string;\n\nfunction safeColor(color: string): NotionColor {\n return VALID_COLORS.has(color) ? color : \"default\";\n}\n\nexport interface RichTextSegment {\n content: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n color?: string;\n link?: string;\n}\n\nexport interface NotionRichText {\n type: \"text\";\n text: { content: string; link?: { url: string } | null };\n annotations: {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n code: boolean;\n color: string;\n };\n}\n\nexport interface NotionEquationRichText {\n type: \"equation\";\n equation: { expression: string };\n}\n\nexport interface NotionMentionRichText {\n type: \"mention\";\n mention:\n | { type: \"page\"; page: { id: string } }\n | { type: \"date\"; date: { start: string; end?: string } }\n | { type: \"user\"; user: { id: string } }\n | { type: \"database\"; database: { id: string } };\n}\n\nexport type RichTextItem = NotionRichText | NotionEquationRichText | NotionMentionRichText;\n\nexport interface NotionBlock {\n object?: \"block\";\n type: string;\n [key: string]: unknown;\n}\n\nexport class NotionBlockBuilder {\n // ─── Rich Text ──────────────────────────────────────────\n\n static richText(content: string, options?: Partial<RichTextSegment>): NotionRichText[] {\n const textObj: { content: string; link?: { url: string } | null } = { content };\n if (options?.link) {\n textObj.link = { url: options.link };\n }\n return [\n {\n type: \"text\",\n text: textObj,\n annotations: {\n bold: options?.bold ?? false,\n italic: options?.italic ?? false,\n underline: options?.underline ?? false,\n strikethrough: options?.strikethrough ?? false,\n code: options?.code ?? false,\n color: safeColor(options?.color ?? \"default\"),\n },\n },\n ];\n }\n\n static richTextArray(segments: RichTextSegment[]): NotionRichText[] {\n return segments.map((seg) => {\n const textObj: { content: string; link?: { url: string } | null } = {\n content: seg.content,\n };\n if (seg.link) {\n textObj.link = { url: seg.link };\n }\n return {\n type: \"text\" as const,\n text: textObj,\n annotations: {\n bold: seg.bold ?? false,\n italic: seg.italic ?? false,\n underline: seg.underline ?? false,\n strikethrough: seg.strikethrough ?? false,\n code: seg.code ?? false,\n color: safeColor(seg.color ?? \"default\"),\n },\n };\n });\n }\n\n static richTextEquation(expression: string): NotionEquationRichText[] {\n return [{ type: \"equation\", equation: { expression } }];\n }\n\n static richTextMentionPage(pageId: string): NotionMentionRichText[] {\n return [{ type: \"mention\", mention: { type: \"page\", page: { id: pageId } } }];\n }\n\n static richTextMentionDate(start: string, end?: string): NotionMentionRichText[] {\n const date: { start: string; end?: string } = { start };\n if (end) date.end = end;\n return [{ type: \"mention\", mention: { type: \"date\", date } }];\n }\n\n // ─── Basic Blocks ───────────────────────────────────────\n\n static paragraph(richText: RichTextItem[], color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"paragraph\",\n paragraph: { rich_text: richText, color: safeColor(color ?? \"default\") },\n };\n }\n\n static heading(\n level: 1 | 2 | 3,\n richText: RichTextItem[],\n options?: { color?: string; isToggleable?: boolean; children?: NotionBlock[] },\n ): NotionBlock {\n const key = `heading_${level}`;\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(options?.color ?? \"default\"),\n is_toggleable: options?.isToggleable ?? false,\n };\n if (options?.isToggleable && options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: key, [key]: data };\n }\n\n static callout(\n richText: RichTextItem[],\n icon?: string,\n options?: { color?: string; children?: NotionBlock[] },\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n icon: { type: \"emoji\", emoji: icon ?? \"\\u{1F4CC}\" },\n color: safeColor(options?.color ?? \"default\"),\n };\n if (options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: \"callout\", callout: data };\n }\n\n static toggle(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"toggle\", toggle: data };\n }\n\n static bulletedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"bulleted_list_item\",\n bulleted_list_item: data,\n };\n }\n\n static numberedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"numbered_list_item\",\n numbered_list_item: data,\n };\n }\n\n static toDo(richText: RichTextItem[], checked?: boolean, color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"to_do\",\n to_do: {\n rich_text: richText,\n checked: checked ?? false,\n color: safeColor(color ?? \"default\"),\n },\n };\n }\n\n static quote(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"quote\", quote: data };\n }\n\n static divider(): NotionBlock {\n return { object: \"block\", type: \"divider\", divider: {} };\n }\n\n static code(code: string, language?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: NotionBlockBuilder.richText(code),\n language: language ?? \"plain text\",\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"code\", code: data };\n }\n\n static equationBlock(expression: string): NotionBlock {\n return {\n object: \"block\",\n type: \"equation\",\n equation: { expression },\n };\n }\n\n // ─── Media Blocks ───────────────────────────────────────\n\n static image(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"image\", image: data };\n }\n\n static bookmark(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"bookmark\", bookmark: data };\n }\n\n static video(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"video\", video: data };\n }\n\n static audio(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"audio\", audio: data };\n }\n\n static fileBlock(url: string, name?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (name) data.name = name;\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"file\", file: data };\n }\n\n static pdf(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"pdf\", pdf: data };\n }\n\n static embed(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"embed\", embed: data };\n }\n\n // ─── Advanced Blocks ────────────────────────────────────\n\n static tableOfContents(color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"table_of_contents\",\n table_of_contents: { color: safeColor(color ?? \"default\") },\n };\n }\n\n static breadcrumb(): NotionBlock {\n return { object: \"block\", type: \"breadcrumb\", breadcrumb: {} };\n }\n\n static columnList(columns: NotionBlock[][]): NotionBlock {\n const children = columns.map((colBlocks) => ({\n object: \"block\" as const,\n type: \"column\" as const,\n column: { children: colBlocks },\n }));\n return {\n object: \"block\",\n type: \"column_list\",\n column_list: { children },\n };\n }\n\n static syncedBlockOriginal(children: NotionBlock[]): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: null, children },\n };\n }\n\n static syncedBlockDuplicate(originalBlockId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: { block_id: originalBlockId } },\n };\n }\n\n static linkToPage(pageId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"link_to_page\",\n link_to_page: { type: \"page_id\", page_id: pageId },\n };\n }\n\n static table(rows: string[][], hasColumnHeader?: boolean, hasRowHeader?: boolean): NotionBlock {\n if (rows.length === 0) rows = [[\"\", \"\"]];\n const width = rows[0]!.length;\n const tableRows = rows.map((row) => {\n const cells = row.map((cell) => NotionBlockBuilder.richText(cell));\n while (cells.length < width) {\n cells.push(NotionBlockBuilder.richText(\"\"));\n }\n return {\n object: \"block\" as const,\n type: \"table_row\" as const,\n table_row: { cells },\n };\n });\n return {\n object: \"block\",\n type: \"table\",\n table: {\n table_width: width,\n has_column_header: hasColumnHeader ?? true,\n has_row_header: hasRowHeader ?? false,\n children: tableRows,\n },\n };\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport function computeHash(content: string): string {\n return createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\nexport function computeBufferHash(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n","import type { LocalChange } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport interface FileInfo {\n readonly path: string;\n readonly content: string;\n readonly mtime: string;\n}\n\nexport class ChangeDetector {\n constructor(private readonly stateDb: StateDB) {}\n\n detectLocalChanges(currentFiles: FileInfo[]): LocalChange[] {\n const changes: LocalChange[] = [];\n const existingPaths = new Set<string>();\n\n for (const file of currentFiles) {\n existingPaths.add(file.path);\n const record = this.stateDb.getByPath(file.path);\n\n if (!record) {\n changes.push({\n path: file.path,\n type: \"created\",\n currentHash: computeHash(file.content),\n previousHash: null,\n });\n continue;\n }\n\n if (record.localLastModified && file.mtime === record.localLastModified) {\n continue;\n }\n\n const currentHash = computeHash(file.content);\n if (record.contentHash !== currentHash) {\n changes.push({\n path: file.path,\n type: \"modified\",\n currentHash,\n previousHash: record.contentHash,\n });\n }\n }\n\n const syncedRecords = this.stateDb.getByStatus(\"synced\");\n for (const record of syncedRecords) {\n if (!existingPaths.has(record.obsidianPath)) {\n if (record.fileType === \"folder-note\" || record.fileType === \"folder-only\") {\n if (!record.obsidianPath.endsWith(\".md\")) continue;\n }\n changes.push({\n path: record.obsidianPath,\n type: \"deleted\",\n currentHash: \"\",\n previousHash: record.contentHash,\n });\n }\n }\n\n return this.detectMoves(changes);\n }\n\n private detectMoves(changes: LocalChange[]): LocalChange[] {\n const result: LocalChange[] = [];\n const created = changes.filter((c) => c.type === \"created\");\n const deleted = changes.filter((c) => c.type === \"deleted\");\n const others = changes.filter((c) => c.type !== \"created\" && c.type !== \"deleted\");\n\n const matchedCreated = new Set<string>();\n const matchedDeleted = new Set<string>();\n\n for (const del of deleted) {\n const match = created.find(\n (c) => c.currentHash === del.previousHash && !matchedCreated.has(c.path),\n );\n if (match) {\n matchedCreated.add(match.path);\n matchedDeleted.add(del.path);\n result.push({\n path: match.path,\n type: \"moved\",\n currentHash: match.currentHash,\n previousHash: del.previousHash,\n movedFrom: del.path,\n });\n }\n }\n\n for (const c of created) {\n if (!matchedCreated.has(c.path)) result.push(c);\n }\n for (const d of deleted) {\n if (!matchedDeleted.has(d.path)) result.push(d);\n }\n result.push(...others);\n\n return result;\n }\n}\n","export interface Logger {\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n}\n\nconst consoleLogger: Logger = {\n warn: (msg, ...args) => console.warn(msg, ...args),\n error: (msg, ...args) => console.error(msg, ...args),\n info: (msg, ...args) => console.info(msg, ...args),\n debug: () => {},\n};\n\nlet currentLogger: Logger = consoleLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n","import type {\n ConversionContext,\n ConversionPath,\n ConversionResult,\n Processor,\n ProcessorInput,\n ProcessorMetadata,\n} from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport class ConversionPipeline {\n private readonly preProcessors: Processor[] = [];\n private readonly postProcessors: Processor[] = [];\n\n registerPreProcessor(processor: Processor): void {\n this.preProcessors.push(processor);\n this.preProcessors.sort((a, b) => a.order - b.order);\n }\n\n registerPostProcessor(processor: Processor): void {\n this.postProcessors.push(processor);\n this.postProcessors.sort((a, b) => a.order - b.order);\n }\n\n selectPath(content: string): ConversionPath {\n const hasInlineDb = /%% im-nobsidian:inline-db/.test(content);\n const hasColumnLayout = />\\s*\\[!col\\]/.test(content);\n const hasToggleHeading = /%% im-nobsidian:toggle-heading/.test(content);\n\n if (hasInlineDb || hasColumnLayout || hasToggleHeading) {\n return \"block-api\";\n }\n\n return \"markdown-api\";\n }\n\n convertToNotion(markdown: string, context: ConversionContext): ConversionResult {\n let input: ProcessorInput = {\n content: markdown,\n metadata: {},\n context,\n };\n\n for (const processor of this.preProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Pre-processor failed:`, error);\n }\n }\n\n return {\n content: input.content,\n properties: (input.metadata.properties as Record<string, unknown>) ?? {},\n images: input.metadata.images ?? [],\n preserveMarkers: input.metadata.preserveMarkers ?? [],\n };\n }\n\n convertToMarkdown(\n content: string,\n context: ConversionContext,\n metadata?: ProcessorMetadata,\n ): string {\n let input: ProcessorInput = {\n content,\n metadata: metadata ?? {},\n context,\n };\n\n for (const processor of this.postProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Post-processor failed:`, error);\n }\n }\n\n return input.content;\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterExtractor implements Processor {\n readonly name = \"FrontmatterExtractor\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n const { data, content } = matter(input.content);\n\n return {\n content: content.trim(),\n metadata: {\n ...input.metadata,\n properties: data,\n },\n };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n WikilinkEntry,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nconst WIKILINK_REGEX = /(?<!!)\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g;\n\nexport type WikilinkResolverFn = (text: string) => WikilinkEntry | null;\n\nexport class WikilinkResolver implements Processor {\n readonly name = \"WikilinkResolver\";\n readonly order = 20;\n\n constructor(private readonly resolve?: WikilinkResolverFn) {}\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const preserveMarkers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const resolved = input.content.replace(\n WIKILINK_REGEX,\n (_match, target: string, display?: string) => {\n const label = display ?? target;\n\n if (this.resolve) {\n const entry = this.resolve(target);\n if (entry) {\n return `<mention-page id=\"${entry.notionPageId}\">${label}</mention-page>`;\n }\n }\n\n preserveMarkers.push({\n type: \"wikilink\",\n params: display ? { text: target, display } : { text: target },\n startIndex: 0,\n });\n\n const encodedTarget = encodeURIComponent(target);\n return `[${label}](im-nobsidian://wikilink/${encodedTarget})`;\n },\n );\n\n return {\n content: resolved,\n metadata: { ...input.metadata, preserveMarkers },\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst CALLOUT_REGEX = /^> \\[!(\\w+)\\]([+-])?\\s*(.*)?$/gm;\n\nconst CALLOUT_EMOJI_MAP: Record<string, string> = {\n note: \"\\u{1F4DD}\",\n abstract: \"\\u{1F4CB}\",\n summary: \"\\u{1F4CB}\",\n info: \"\\u{2139}\\u{FE0F}\",\n tip: \"\\u{1F4A1}\",\n hint: \"\\u{1F4A1}\",\n success: \"\\u{2705}\",\n check: \"\\u{2705}\",\n question: \"\\u{2753}\",\n faq: \"\\u{2753}\",\n warning: \"\\u{26A0}\\u{FE0F}\",\n caution: \"\\u{26A0}\\u{FE0F}\",\n failure: \"\\u{274C}\",\n fail: \"\\u{274C}\",\n danger: \"\\u{1F525}\",\n error: \"\\u{1F525}\",\n bug: \"\\u{1F41B}\",\n example: \"\\u{1F4CC}\",\n quote: \"\\u{1F4AC}\",\n cite: \"\\u{1F4AC}\",\n};\n\nexport class CalloutTransformer implements Processor {\n readonly name = \"CalloutTransformer\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.path === \"markdown-api\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(\n CALLOUT_REGEX,\n (_match, type: string, foldable: string | undefined, title: string | undefined) => {\n const emoji = CALLOUT_EMOJI_MAP[type.toLowerCase()] ?? \"\\u{1F4DD}\";\n const titleText = title?.trim() || type;\n const foldMeta = foldable\n ? `\\n%% im-nobsidian:callout:type=${type}&foldable=${foldable === \"+\" ? \"open\" : \"closed\"} %%`\n : `\\n%% im-nobsidian:callout:type=${type} %%`;\n\n return `> ${emoji} **${titleText}**${foldMeta}`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst BLOCK_MATH_REGEX = /\\$\\$([\\s\\S]+?)\\$\\$/g;\nconst INLINE_MATH_REGEX = /(?<![\\\\$])\\$([^\\n$]+?)\\$(?!\\$)/g;\n\nexport class MathNormalizer implements Processor {\n readonly name = \"MathNormalizer\";\n readonly order = 50;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(BLOCK_MATH_REGEX, (_match, equation: string) => {\n return `$$\\n${equation.trim()}\\n$$`;\n });\n\n content = content.replace(INLINE_MATH_REGEX, (_match, equation: string) => {\n return `$${equation.trim()}$`;\n });\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { ImageReference } from \"../../types/convert.js\";\n\nconst OBSIDIAN_EMBED_REGEX = /!\\[\\[([^\\]]+)\\]\\]/g;\nconst MARKDOWN_IMAGE_REGEX = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst VIDEO_HOSTS = [\"youtube.com\", \"youtu.be\", \"vimeo.com\"];\n\nexport class EmbedResolver implements Processor {\n readonly name = \"EmbedResolver\";\n readonly order = 60;\n\n process(input: ProcessorInput): ProcessorOutput {\n const images: ImageReference[] = input.metadata.images ? [...input.metadata.images] : [];\n const isPush = input.context.direction === \"push\";\n\n let content = input.content.replace(OBSIDIAN_EMBED_REGEX, (_match, target: string) => {\n if (isImageFile(target)) {\n images.push({ url: target, localPath: target, isExternal: false });\n if (isPush && !isExternalUrl(target)) {\n const fileName = target.split(\"/\").pop() ?? target;\n return `> 📎 ${fileName}\\n> %% im-nobsidian:local-image:${target} %%`;\n }\n return `![${target}](${encodeURI(target)})`;\n }\n const encoded = encodeURIComponent(target);\n return `[${target}](im-nobsidian://embed/${encoded})`;\n });\n\n content = content.replace(MARKDOWN_IMAGE_REGEX, (_match, alt: string, url: string) => {\n if (isVideoUrl(url)) {\n return `%% im-nobsidian:embed:type=video&url=${encodeURIComponent(url)} %%\\n[${alt || \"Video\"}](${url})`;\n }\n if (isExternalUrl(url)) {\n images.push({ url, isExternal: true });\n }\n return `![${alt}](${url})`;\n });\n\n return {\n content,\n metadata: { ...input.metadata, images },\n };\n }\n}\n\nfunction isImageFile(path: string): boolean {\n return /\\.(png|jpg|jpeg|gif|svg|webp|bmp|ico)$/i.test(path);\n}\n\nfunction isVideoUrl(url: string): boolean {\n return VIDEO_HOSTS.some((host) => url.includes(host));\n}\n\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { PreserveMarker } from \"../../types/convert.js\";\n\nconst MARKER_REGEX = /%% im-nobsidian:(\\w[\\w-]*):([^\\s]+?) %%/g;\n\nexport class PreserveMarkerCollector implements Processor {\n readonly name = \"PreserveMarkerCollector\";\n readonly order = 70;\n\n process(input: ProcessorInput): ProcessorOutput {\n const markers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const matches = [...input.content.matchAll(MARKER_REGEX)];\n for (const match of matches) {\n markers.push({\n type: match[1]!,\n params: parseMarkerParams(match[2]!),\n startIndex: match.index!,\n });\n }\n\n return {\n content: input.content,\n metadata: { ...input.metadata, preserveMarkers: markers },\n };\n }\n}\n\nfunction parseMarkerParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx > 0) {\n params[pair.slice(0, eqIdx)] = decodeURIComponent(pair.slice(eqIdx + 1));\n }\n }\n return params;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNSUPPORTED_CALLOUT_REGEX = /> \\[!im-nobsidian-unsupported\\][^\\n]*\\n(?:>[^\\n]*\\n)*/g;\n\nexport class UnsupportedBlockStripper implements Processor {\n readonly name = \"UnsupportedBlockStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(UNSUPPORTED_CALLOUT_REGEX, \"\");\n\n return {\n content: content.replace(/\\n{3,}/g, \"\\n\\n\"),\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class PropertiesTableInjector implements Processor {\n readonly name = \"PropertiesTableInjector\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n if (input.context.parentMode === \"database\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const filteredProps: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n filteredProps[key] = value;\n }\n\n if (Object.keys(filteredProps).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlStr = matter.stringify(\"\", filteredProps).trim();\n const yamlBody = yamlStr.slice(4, -3).trim();\n const codeBlock = \"```yaml\\n# im-nobsidian:properties\\n\" + yamlBody + \"\\n```\";\n\n const content = codeBlock + \"\\n\\n---\\n\\n\" + input.content;\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNDERLINE_REGEX = /<u>([\\s\\S]*?)<\\/u>/g;\n\nconst COLOR_SPAN_REGEX = /<span class=\"notion-(\\w+?)(?:-bg)?\">([\\s\\S]*?)<\\/span>/g;\n\nconst IM_NOBSIDIAN_COLOR_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class HtmlAnnotationStripper implements Processor {\n readonly name = \"HtmlAnnotationStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n content = content.replace(IM_NOBSIDIAN_COLOR_REGEX, (_m, _color: string, text: string) => text);\n\n content = content.replace(UNDERLINE_REGEX, (_m, text: string) => text);\n\n content = content.replace(COLOR_SPAN_REGEX, (_m, _color: string, text: string) => text);\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst NOTION_LINK_REGEX =\n /\\[([^\\]]+)\\]\\((?:https:\\/\\/(?:www\\.)?notion\\.so\\/|notion:\\/\\/)([a-f0-9-]+)\\)/g;\n\nconst WIKILINK_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/wikilink\\/([^)]+)\\)/g;\n\nconst EMBED_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/embed\\/([^)]+)\\)/g;\n\nexport class MentionToWikilink implements Processor {\n readonly name = \"MentionToWikilink\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(NOTION_LINK_REGEX, (_match, display: string) => `[[${display}]]`);\n\n content = content.replace(\n WIKILINK_PRESERVE_REGEX,\n (_match, display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return target === display ? `[[${target}]]` : `[[${target}|${display}]]`;\n },\n );\n\n content = content.replace(\n EMBED_PRESERVE_REGEX,\n (_match, _display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return `![[${target}]]`;\n },\n );\n\n return { content, metadata: input.metadata };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nexport class PreserveMarkerInjector implements Processor {\n readonly name = \"PreserveMarkerInjector\";\n readonly order = 100;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const markers = input.metadata.preserveMarkers;\n if (!markers || markers.length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n const missingMarkers = markers.filter((m) => !content.includes(this.formatMarker(m)));\n\n if (missingMarkers.length === 0) {\n return { content, metadata: input.metadata };\n }\n\n const markerLines = missingMarkers.map((m) => this.formatMarker(m));\n const suffix = \"\\n\\n\" + markerLines.join(\"\\n\");\n content = content.trimEnd() + suffix + \"\\n\";\n\n return { content, metadata: input.metadata };\n }\n\n private formatMarker(marker: PreserveMarker): string {\n const params = Object.entries(marker.params)\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n return `%% im-nobsidian:${marker.type}:${params} %%`;\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n};\n\nconst CALLOUT_PRESERVE_REGEX = /%% im-nobsidian:callout:type=(\\w+)(?:&foldable=(open|closed))? %%/g;\n\nexport class CalloutRestorer implements Processor {\n readonly name = \"CalloutRestorer\";\n readonly order = 20;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(CALLOUT_PRESERVE_REGEX, (_match, type: string, foldable?: string) => {\n if (foldable) {\n const foldChar = foldable === \"open\" ? \"+\" : \"-\";\n return `[!${type}]${foldChar}`;\n }\n return `[!${type}]`;\n });\n\n for (const [emoji, type] of Object.entries(EMOJI_TYPE_MAP)) {\n const pattern = new RegExp(`> ${escapeRegex(emoji)} \\\\*\\\\*(.+?)\\\\*\\\\*`, \"g\");\n content = content.replace(pattern, (_match, title: string) => {\n if (title.toLowerCase() === type) {\n return `> [!${type}]`;\n }\n return `> [!${type}] ${title}`;\n });\n }\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst COLOR_MARKER_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class ColorAnnotator implements Processor {\n readonly name = \"ColorAnnotator\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n const content = input.content.replace(\n COLOR_MARKER_REGEX,\n (_match, color: string, text: string) => {\n const cssClass = color.endsWith(\"_background\")\n ? `notion-${color.replace(\"_background\", \"-bg\")}`\n : `notion-${color}`;\n return `<span class=\"${cssClass}\">${text}</span>`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterGenerator implements Processor {\n readonly name = \"FrontmatterGenerator\";\n readonly order = 90;\n\n process(input: ProcessorInput): ProcessorOutput {\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = matter.stringify(input.content, properties);\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst LOCAL_IMAGE_MARKER_REGEX =\n />\\s*📎\\s*[^\\n]*\\n>\\s*%%\\s*im-nobsidian:local-image:([^\\s]+)\\s*%%/g;\n\nexport class LocalImageRestorer implements Processor {\n readonly name = \"LocalImageRestorer\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(LOCAL_IMAGE_MARKER_REGEX, (_match, target: string) => {\n return `![[${target}]]`;\n });\n\n return { content, metadata: input.metadata };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst YAML_PROPERTIES_REGEX = /```yaml\\n# im-nobsidian:properties\\n([\\s\\S]*?)```\\n*(?:---\\n*)?/;\n\nconst LEGACY_TABLE_REGEX =\n /^\\s*\\| Property\\s*\\| Value\\s*\\|\\n\\s*\\|\\s*-{3,}\\s*\\|\\s*-{3,}\\s*\\|\\n((?:\\|[^\\n]+\\|\\n?)+)\\n*---\\n*/;\n\nexport class PropertiesTableRestorer implements Processor {\n readonly name = \"PropertiesTableRestorer\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlMatch = input.content.match(YAML_PROPERTIES_REGEX);\n if (yamlMatch) {\n return this.restoreFromYaml(input, yamlMatch);\n }\n\n const tableMatch = input.content.match(LEGACY_TABLE_REGEX);\n if (tableMatch) {\n return this.restoreFromTable(input, tableMatch);\n }\n\n return { content: input.content, metadata: input.metadata };\n }\n\n private restoreFromYaml(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const yamlContent = match[1]!;\n const fakeDocument = `---\\n${yamlContent}---\\n`;\n\n let parsed: Record<string, unknown>;\n try {\n const result = matter(fakeDocument);\n parsed = result.data;\n } catch {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n ...parsed,\n };\n\n const content = input.content.replace(YAML_PROPERTIES_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n\n private restoreFromTable(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const rows = match[1]!.trim().split(\"\\n\");\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n };\n\n for (const row of rows) {\n const cells = row\n .split(\"|\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length >= 2) {\n const key = cells[0]!;\n const rawValue = cells[1]!;\n properties[key] = parseLegacyValue(rawValue);\n }\n }\n\n const content = input.content.replace(LEGACY_TABLE_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n}\n\nfunction parseLegacyValue(raw: string): unknown {\n if (raw === \"\" || raw === \"null\") return null;\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n\n const unquoted = stripQuotes(raw);\n const num = Number(unquoted);\n if (!isNaN(num) && unquoted.trim() !== \"\") return num;\n\n if (unquoted.includes(\", \")) {\n const parts = unquoted.split(\", \");\n const looksLikeArray = parts.every((p) => p.split(/\\s+/).length <= 3);\n if (looksLikeArray) {\n return parts.map((v) => {\n const n = Number(v);\n return !isNaN(n) && v.trim() !== \"\" ? n : v;\n });\n }\n }\n\n if (unquoted.startsWith(\"{\") || unquoted.startsWith(\"[\")) {\n try {\n return JSON.parse(unquoted);\n } catch {\n return unquoted;\n }\n }\n\n return unquoted;\n}\n\nfunction stripQuotes(s: string): string {\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { ConversionPipeline } from \"./pipeline.js\";\nimport { FrontmatterExtractor } from \"./pre-processors/frontmatter.js\";\nimport { WikilinkResolver, type WikilinkResolverFn } from \"./pre-processors/wikilink.js\";\nimport { CalloutTransformer } from \"./pre-processors/callout.js\";\nimport { MathNormalizer } from \"./pre-processors/math.js\";\nimport { EmbedResolver } from \"./pre-processors/embed.js\";\nimport { PreserveMarkerCollector } from \"./pre-processors/preserve-marker.js\";\nimport { UnsupportedBlockStripper } from \"./pre-processors/unsupported-block-stripper.js\";\nimport { PropertiesTableInjector } from \"./pre-processors/properties-table.js\";\nimport { HtmlAnnotationStripper } from \"./pre-processors/html-annotation.js\";\nimport { MentionToWikilink } from \"./post-processors/mention-to-wikilink.js\";\nimport { PreserveMarkerInjector } from \"./post-processors/preserve-marker-injector.js\";\nimport { CalloutRestorer } from \"./post-processors/callout-restorer.js\";\nimport { ColorAnnotator } from \"./post-processors/color-annotator.js\";\nimport { FrontmatterGenerator } from \"./post-processors/frontmatter-generator.js\";\nimport { LocalImageRestorer } from \"./post-processors/local-image-restorer.js\";\nimport { PropertiesTableRestorer } from \"./post-processors/properties-table-restorer.js\";\n\nexport interface PipelineOptions {\n readonly wikilinkResolver?: WikilinkResolverFn;\n}\n\nexport function createDefaultPipeline(options?: PipelineOptions): ConversionPipeline {\n const pipeline = new ConversionPipeline();\n\n pipeline.registerPreProcessor(new HtmlAnnotationStripper());\n pipeline.registerPreProcessor(new UnsupportedBlockStripper());\n pipeline.registerPreProcessor(new FrontmatterExtractor());\n pipeline.registerPreProcessor(new PropertiesTableInjector());\n pipeline.registerPreProcessor(new WikilinkResolver(options?.wikilinkResolver));\n pipeline.registerPreProcessor(new CalloutTransformer());\n pipeline.registerPreProcessor(new MathNormalizer());\n pipeline.registerPreProcessor(new EmbedResolver());\n pipeline.registerPreProcessor(new PreserveMarkerCollector());\n\n pipeline.registerPostProcessor(new PropertiesTableRestorer());\n pipeline.registerPostProcessor(new LocalImageRestorer());\n pipeline.registerPostProcessor(new PreserveMarkerInjector());\n pipeline.registerPostProcessor(new MentionToWikilink());\n pipeline.registerPostProcessor(new CalloutRestorer());\n pipeline.registerPostProcessor(new ColorAnnotator());\n pipeline.registerPostProcessor(new FrontmatterGenerator());\n\n return pipeline;\n}\n","import { markdownToBlocks } from \"@tryfabric/martian\";\nimport { NotionToMarkdown } from \"notion-to-md\";\nimport type { Client } from \"@notionhq/client\";\nimport type { BlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { NotionBlockBuilder } from \"../notion/block-builder.js\";\nimport type { NotionBlock } from \"../notion/block-builder.js\";\n\nconst TRULY_UNSUPPORTED_BLOCK_TYPES = [\"unsupported\", \"template\"] as const;\n\nconst DIVIDER_PLACEHOLDER = \"​%%IM-NOBSIDIAN_DIVIDER%%​\";\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\nconst COLUMN_LIST_START = \"%%im-nobsidian:column-list:start%%\";\nconst COLUMN_SEP = \"%%im-nobsidian:column%%\";\nconst COLUMN_LIST_END = \"%%im-nobsidian:column-list:end%%\";\n\nconst VIDEO_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch/,\n /^https?:\\/\\/youtu\\.be\\//,\n /^https?:\\/\\/(www\\.)?vimeo\\.com\\//,\n /^https?:\\/\\/(www\\.)?dailymotion\\.com\\//,\n /^https?:\\/\\/(www\\.)?loom\\.com\\/share\\//,\n];\n\nconst EMBED_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?figma\\.com\\//,\n /^https?:\\/\\/docs\\.google\\.com\\//,\n /^https?:\\/\\/drive\\.google\\.com\\//,\n /^https?:\\/\\/(www\\.)?miro\\.com\\//,\n /^https?:\\/\\/(www\\.)?twitter\\.com\\//,\n /^https?:\\/\\/(www\\.)?x\\.com\\//,\n /^https?:\\/\\/codepen\\.io\\//,\n /^https?:\\/\\/gist\\.github\\.com\\//,\n /^https?:\\/\\/(www\\.)?spotify\\.com\\//,\n /^https?:\\/\\/(www\\.)?soundcloud\\.com\\//,\n];\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ntype RichTextItem = { plain_text: string; href?: string | null };\n\nfunction richTextToPlain(richText: RichTextItem[] | undefined): string {\n if (!richText) return \"\";\n return richText.map((t) => t.plain_text).join(\"\");\n}\n\ninterface RichTextAnnotated extends RichTextItem {\n annotations?: Record<string, unknown>;\n type?: string;\n equation?: { expression: string };\n mention?: {\n type: string;\n page?: { id: string };\n date?: { start: string; end?: string | null };\n user?: { id: string; name?: string };\n database?: { id: string };\n };\n}\n\nfunction richTextToMarkdown(richText: RichTextAnnotated[] | undefined): string {\n if (!richText) return \"\";\n return richText\n .map((t) => {\n if (t.type === \"equation\" && t.equation) {\n return `$${t.equation.expression}$`;\n }\n\n if (t.type === \"mention\" && t.mention) {\n return formatMention(t.mention);\n }\n\n let text = t.plain_text;\n const a = t.annotations;\n if (a?.code) text = `\\`${text}\\``;\n if (a?.bold) text = `**${text}**`;\n if (a?.italic) text = `*${text}*`;\n if (a?.strikethrough) text = `~~${text}~~`;\n if (a?.underline) text = `<u>${text}</u>`;\n if (t.href) text = `[${text}](${t.href})`;\n\n const color = a?.color as string | undefined;\n if (color && color !== \"default\") {\n text = `%% im-nobsidian:color:${color} %%${text}%% im-nobsidian:end %%`;\n }\n\n return text;\n })\n .join(\"\");\n}\n\nfunction formatMention(mention: NonNullable<RichTextAnnotated[\"mention\"]>): string {\n switch (mention.type) {\n case \"page\":\n return mention.page ? `[[${mention.page.id}]]` : \"\";\n case \"date\": {\n if (!mention.date) return \"\";\n const start = mention.date.start;\n return mention.date.end ? `${start} → ${mention.date.end}` : start;\n }\n case \"user\":\n return mention.user?.name ? `@${mention.user.name}` : \"@user\";\n case \"database\":\n return mention.database ? `[[${mention.database.id}]]` : \"\";\n default:\n return \"\";\n }\n}\n\nexport class BlockConverter {\n private n2m: NotionToMarkdown | null = null;\n private client: Client | null = null;\n\n initNotionToMd(client: Client): void {\n this.client = client;\n this.n2m = new NotionToMarkdown({ notionClient: client });\n this.registerCustomTransformers();\n }\n\n private registerCustomTransformers(): void {\n if (!this.n2m) return;\n\n for (const blockType of TRULY_UNSUPPORTED_BLOCK_TYPES) {\n this.n2m.setCustomTransformer(blockType, (block) => {\n const id = block.id ?? \"unknown\";\n return Promise.resolve(\n `> [!im-nobsidian-unsupported] Notion 전용 블록\\n> type: ${blockType}, id: ${id}\\n> %%im-nobsidian:unsupported:type=${blockType}&id=${id}%%`,\n );\n });\n }\n\n this.registerToggleTransformer();\n this.registerColumnTransformer();\n this.registerSyncedBlockTransformer();\n this.registerBookmarkTransformer();\n this.registerVideoTransformer();\n this.registerAudioTransformer();\n this.registerFileTransformer();\n this.registerChildPageTransformer();\n this.registerChildDatabaseTransformer();\n this.registerLinkToPageTransformer();\n this.registerTocTransformer();\n this.registerBreadcrumbTransformer();\n this.registerLinkPreviewTransformer();\n this.registerCalloutTransformer();\n this.registerToggleHeadingTransformers();\n }\n\n private registerToggleTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"toggle\", async (block) => {\n const b = block as unknown as { toggle: { rich_text: RichTextItem[] } } & BlockObjectResponse;\n const title = richTextToMarkdown(b.toggle?.rich_text as never);\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n const indented = childMd\n .split(\"\\n\")\n .map((line: string) => (line ? ` ${line}` : \"\"))\n .join(\"\\n\")\n .trimEnd();\n return `${TOGGLE_START}\\n- ${title}\\n${indented}\\n${TOGGLE_END}`;\n });\n }\n\n private registerToggleHeadingTransformers(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n\n for (const level of [1, 2, 3] as const) {\n const headingKey = `heading_${level}` as const;\n this.n2m.setCustomTransformer(headingKey, async (block) => {\n const b = block as unknown as {\n [K in typeof headingKey]: { rich_text: RichTextItem[]; is_toggleable?: boolean };\n } & BlockObjectResponse;\n const headingData = b[headingKey];\n const text = richTextToMarkdown(headingData?.rich_text as never);\n const prefix = \"#\".repeat(level);\n\n if (headingData?.is_toggleable && b.has_children) {\n const children = await n2m.pageToMarkdown(b.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n return `${prefix} ${text}\\n\\n${childMd.trimEnd()}`;\n }\n\n return `${prefix} ${text}`;\n });\n }\n }\n\n private registerColumnTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"column_list\", async (block) => {\n const b = block as BlockObjectResponse;\n const response = await client.blocks.children.list({ block_id: b.id });\n const columns = response.results as BlockObjectResponse[];\n const parts: string[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i]!;\n const children = await n2m.pageToMarkdown(col.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n parts.push(`${COLUMN_SEP}\\n${childMd.trimEnd()}`);\n }\n\n return `${COLUMN_LIST_START}\\n${parts.join(\"\\n\")}\\n${COLUMN_LIST_END}`;\n });\n\n this.n2m.setCustomTransformer(\"column\", async () => \"\");\n }\n\n private registerSyncedBlockTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"synced_block\", async (block) => {\n const b = block as unknown as {\n synced_block: { synced_from: { block_id: string } | null };\n } & BlockObjectResponse;\n\n const sourceId = b.synced_block?.synced_from?.block_id ?? b.id;\n\n const response = await client.blocks.children.list({ block_id: sourceId });\n const mdBlocks: unknown[] = [];\n for (const child of response.results as BlockObjectResponse[]) {\n const result = await n2m.blockToMarkdown(child as never);\n if (result) mdBlocks.push(result);\n }\n const childMd = n2m.toMarkdownString(mdBlocks as never).parent ?? \"\";\n return childMd.trimEnd();\n });\n }\n\n private registerBookmarkTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"bookmark\", async (block) => {\n const b = block as unknown as {\n bookmark: { url: string; caption?: RichTextItem[] };\n };\n const url = b.bookmark?.url ?? \"\";\n const caption = richTextToPlain(b.bookmark?.caption);\n if (caption) {\n return `[${caption}](${url})`;\n }\n return `[${url}](${url})`;\n });\n }\n\n private registerVideoTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"video\", async (block) => {\n const b = block as unknown as {\n video: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.video?.type === \"external\" ? b.video.external?.url : b.video?.file?.url;\n const caption = richTextToPlain(b.video?.caption);\n return `![${caption || \"video\"}](${url ?? \"\"})`;\n });\n }\n\n private registerAudioTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"audio\", async (block) => {\n const b = block as unknown as {\n audio: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.audio?.type === \"external\" ? b.audio.external?.url : b.audio?.file?.url;\n const caption = richTextToPlain(b.audio?.caption);\n return `![${caption || \"audio\"}](${url ?? \"\"})`;\n });\n }\n\n private registerFileTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"file\", async (block) => {\n const b = block as unknown as {\n file: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n name?: string;\n };\n };\n const url = b.file?.type === \"external\" ? b.file.external?.url : b.file?.file?.url;\n const name = b.file?.name ?? richTextToPlain(b.file?.caption) ?? \"file\";\n return `[${name}](${url ?? \"\"})`;\n });\n }\n\n private registerChildPageTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_page\", async (block) => {\n const b = block as unknown as { child_page: { title: string } };\n const title = b.child_page?.title ?? \"Untitled\";\n return `[[${title}]]`;\n });\n }\n\n private registerChildDatabaseTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_database\", async (block) => {\n const b = block as unknown as {\n child_database: { title: string };\n } & BlockObjectResponse;\n const title = b.child_database?.title ?? \"Database\";\n return `> [!database] ${title}\\n> %%im-nobsidian:child-database:id=${b.id}&title=${encodeURIComponent(title)}%%`;\n });\n }\n\n private registerLinkToPageTransformer(): void {\n if (!this.n2m) return;\n const client = this.client!;\n this.n2m.setCustomTransformer(\"link_to_page\", async (block) => {\n const b = block as unknown as {\n link_to_page: { type: string; page_id?: string; database_id?: string };\n };\n const pageId = b.link_to_page?.page_id ?? b.link_to_page?.database_id;\n if (!pageId) return \"\";\n try {\n const page = await client.pages.retrieve({ page_id: pageId });\n const p = page as {\n properties: Record<string, { type: string; title?: Array<{ plain_text: string }> }>;\n };\n for (const prop of Object.values(p.properties)) {\n if (prop.type === \"title\" && prop.title?.[0]?.plain_text) {\n return `[[${prop.title[0].plain_text}]]`;\n }\n }\n } catch {\n // fallback\n }\n return `[[${pageId}]]`;\n });\n }\n\n private registerTocTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"table_of_contents\", async () => {\n return `%%im-nobsidian:toc%%`;\n });\n }\n\n private registerBreadcrumbTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"breadcrumb\", async () => \"\");\n }\n\n private registerLinkPreviewTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"link_preview\", async (block) => {\n const b = block as unknown as { link_preview: { url: string } };\n const url = b.link_preview?.url ?? \"\";\n return `[${url}](${url})`;\n });\n }\n\n private registerCalloutTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"callout\", async (block) => {\n const b = block as unknown as {\n callout: { rich_text: RichTextItem[]; icon?: { type: string; emoji?: string } };\n } & BlockObjectResponse;\n const text = richTextToMarkdown(b.callout?.rich_text as never);\n const emoji = b.callout?.icon?.emoji ?? \"\";\n\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n\n const EMOJI_TO_TYPE: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n };\n const calloutType = EMOJI_TO_TYPE[emoji] ?? \"note\";\n\n let result = `> [!${calloutType}] ${text}`;\n if (childMd?.trim()) {\n const lines = childMd\n .trim()\n .split(\"\\n\")\n .map((l: string) => `> ${l}`);\n result += \"\\n\" + lines.join(\"\\n\");\n }\n return result;\n });\n }\n\n markdownToNotionBlocks(markdown: string): unknown[] {\n const preprocessed = this.preProcessMarkdown(markdown);\n const blocks = markdownToBlocks(preprocessed) as Array<Record<string, unknown>>;\n const processed = this.postProcessBlocks(blocks);\n return normalizeBlocksForNotion(processed as Array<Record<string, unknown>>);\n }\n\n private toggleContents: Map<number, string> = new Map();\n private columnContents: Map<number, string[]> = new Map();\n private toggleCounter = 0;\n private columnCounter = 0;\n\n private preProcessMarkdown(markdown: string): string {\n this.toggleContents.clear();\n this.columnContents.clear();\n this.toggleCounter = 0;\n this.columnCounter = 0;\n\n let processed = this.extractToggleBlocks(markdown);\n processed = this.extractColumnBlocks(processed);\n processed = this.replaceDividers(processed);\n return processed;\n }\n\n private replaceDividers(markdown: string): string {\n const lines = markdown.split(\"\\n\");\n const result: string[] = [];\n let inCodeBlock = false;\n\n for (const line of lines) {\n if (line.trimStart().startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n }\n\n if (!inCodeBlock && /^---\\s*$/.test(line.trim())) {\n result.push(DIVIDER_PLACEHOLDER);\n } else {\n result.push(line);\n }\n }\n\n return result.join(\"\\n\");\n }\n\n private extractToggleBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(TOGGLE_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(TOGGLE_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const content = result.slice(match.index + match[0].length + 1, endMatch.index).trimEnd();\n const id = this.toggleCounter++;\n this.toggleContents.set(id, content);\n\n const placeholder = `%%IM-NOBSIDIAN_TOGGLE_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private extractColumnBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(COLUMN_LIST_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(COLUMN_LIST_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const inner = result.slice(match.index + match[0].length + 1, endMatch.index);\n const columns = inner\n .split(new RegExp(`^${escapeRegex(COLUMN_SEP)}$`, \"m\"))\n .map((c) => c.trim())\n .filter(Boolean);\n\n const id = this.columnCounter++;\n this.columnContents.set(id, columns);\n\n const placeholder = `%%IM-NOBSIDIAN_COLLIST_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private postProcessBlocks(blocks: Array<Record<string, unknown>>): unknown[] {\n const result: unknown[] = [];\n\n for (const block of blocks) {\n const toggleConverted = this.convertTogglePlaceholder(block);\n if (toggleConverted) {\n result.push(toggleConverted);\n continue;\n }\n\n const columnConverted = this.convertColumnPlaceholder(block);\n if (columnConverted) {\n result.push(columnConverted);\n continue;\n }\n\n const dividerConverted = this.convertDividerPlaceholder(block);\n if (dividerConverted) {\n result.push(dividerConverted);\n continue;\n }\n\n const videoConverted = this.convertImageToVideoOrEmbed(block);\n if (videoConverted) {\n result.push(videoConverted);\n continue;\n }\n\n const calloutConverted = this.convertQuoteToCallout(block);\n result.push(calloutConverted);\n }\n\n return result;\n }\n\n private convertTogglePlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const toggleMatch = text.match(/%%IM-NOBSIDIAN_TOGGLE_(\\d+)%%/);\n if (!toggleMatch) return null;\n\n const id = parseInt(toggleMatch[1]!, 10);\n const content = this.toggleContents.get(id);\n if (content === undefined) return null;\n\n const titleMatch = content.match(/^- (.+)$/m);\n const title = titleMatch?.[1] ?? \"Toggle\";\n\n const childLines = content.split(\"\\n\").slice(1);\n const childMd = childLines\n .map((l) => (l.startsWith(\" \") ? l.slice(2) : l))\n .join(\"\\n\")\n .trim();\n\n const children = childMd ? (markdownToBlocks(childMd) as Array<Record<string, unknown>>) : [];\n\n return NotionBlockBuilder.toggle(\n NotionBlockBuilder.richText(title),\n children.length > 0 ? (children as unknown as NotionBlock[]) : undefined,\n );\n }\n\n private convertColumnPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const colMatch = text.match(/%%IM-NOBSIDIAN_COLLIST_(\\d+)%%/);\n if (!colMatch) return null;\n\n const id = parseInt(colMatch[1]!, 10);\n const columns = this.columnContents.get(id);\n if (!columns) return null;\n\n const columnBlocks = columns.map((colMd) => {\n const blocks = markdownToBlocks(colMd) as Array<Record<string, unknown>>;\n return this.postProcessBlocks(blocks) as unknown as NotionBlock[];\n });\n\n return NotionBlockBuilder.columnList(columnBlocks);\n }\n\n private convertDividerPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n if (text.includes(\"%%IM-NOBSIDIAN_DIVIDER%%\")) {\n return NotionBlockBuilder.divider();\n }\n return null;\n }\n\n private convertImageToVideoOrEmbed(block: Record<string, unknown>): unknown | null {\n let url = \"\";\n let caption: string | undefined;\n\n if (block.type === \"image\") {\n const img = block.image as\n | { external?: { url: string }; caption?: Array<{ text?: { content: string } }> }\n | undefined;\n url = img?.external?.url ?? \"\";\n caption = img?.caption?.[0]?.text?.content;\n } else if (block.type === \"paragraph\") {\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const texts = para?.rich_text ?? [];\n if (texts.length === 1) {\n const content = texts[0]?.text?.content ?? \"\";\n if (/^https?:\\/\\//.test(content)) {\n url = content;\n }\n }\n }\n\n if (!url) return null;\n\n if (VIDEO_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.video(url, caption);\n }\n\n if (EMBED_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.embed(url, caption);\n }\n\n return null;\n }\n\n private convertQuoteToCallout(block: Record<string, unknown>): unknown {\n if (block.type !== \"quote\") return block;\n\n const quote = block.quote as\n | {\n rich_text: Array<{\n type: string;\n text?: { content: string; link?: unknown };\n annotations?: Record<string, boolean>;\n }>;\n children?: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!quote?.rich_text?.[0]) return block;\n\n const firstText = quote.rich_text[0]?.text?.content ?? \"\";\n\n const KNOWN_CALLOUT_EMOJIS = [\n \"\\u{1F4DD}\",\n \"\\u{1F4CB}\",\n \"\\u{2139}\\u{FE0F}\",\n \"\\u{1F4A1}\",\n \"\\u{2705}\",\n \"\\u{2753}\",\n \"\\u{26A0}\\u{FE0F}\",\n \"\\u{274C}\",\n \"\\u{1F525}\",\n \"\\u{1F41B}\",\n \"\\u{1F4CC}\",\n \"\\u{1F4AC}\",\n ];\n const matchedEmoji = KNOWN_CALLOUT_EMOJIS.find((e) => firstText.startsWith(e));\n if (!matchedEmoji) return block;\n\n const emoji = matchedEmoji;\n const remainingText = firstText.slice(emoji.length).replace(/^\\s+/, \"\");\n\n const newRichText = [...quote.rich_text];\n if (remainingText) {\n newRichText[0] = {\n ...newRichText[0]!,\n text: { content: remainingText, link: null },\n };\n } else {\n newRichText.shift();\n }\n\n return {\n type: \"callout\",\n callout: {\n rich_text: newRichText,\n icon: { type: \"emoji\", emoji },\n children: quote.children ?? [],\n },\n };\n }\n\n async notionBlocksToMarkdown(pageId: string): Promise<string> {\n if (!this.n2m) {\n throw new Error(\n \"NotionToMarkdown이 초기화되지 않았습니다. initNotionToMd()를 먼저 호출하세요.\",\n );\n }\n\n const mdBlocks = await this.n2m.pageToMarkdown(pageId);\n const result = this.n2m.toMarkdownString(mdBlocks);\n return result.parent ?? \"\";\n }\n}\n\nconst NOTION_MAX_TABLE_ROWS = 100;\nconst NOTION_MAX_LIST_DEPTH = 3;\n\nfunction normalizeBlocksForNotion(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n\n for (const block of blocks) {\n if (block.type === \"table\") {\n result.push(...normalizeTable(block));\n } else if (isListBlock(block)) {\n result.push(flattenListDepth(block, 0));\n } else {\n result.push(block);\n }\n }\n\n return result;\n}\n\nfunction normalizeTable(block: Record<string, unknown>): Array<Record<string, unknown>> {\n const table = block.table as\n | {\n table_width: number;\n has_column_header: boolean;\n has_row_header: boolean;\n children: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!table?.children) return [block];\n\n const rows = table.children;\n if (rows.length === 0) return [block];\n\n let maxCells = table.table_width;\n for (const row of rows) {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (tr?.cells && tr.cells.length > maxCells) {\n maxCells = tr.cells.length;\n }\n }\n\n const normalizedRows = rows.map((row) => {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (!tr?.cells) return row;\n\n const cells = [...tr.cells];\n while (cells.length < maxCells) {\n cells.push([{ type: \"text\", text: { content: \"\" } }]);\n }\n if (cells.length > maxCells) {\n cells.length = maxCells;\n }\n\n return { ...row, table_row: { ...tr, cells } };\n });\n\n if (normalizedRows.length <= NOTION_MAX_TABLE_ROWS) {\n return [\n {\n ...block,\n table: { ...table, table_width: maxCells, children: normalizedRows },\n },\n ];\n }\n\n const tables: Array<Record<string, unknown>> = [];\n const headerRow = table.has_column_header ? normalizedRows[0] : null;\n const dataRows = table.has_column_header ? normalizedRows.slice(1) : normalizedRows;\n const chunkSize = headerRow ? NOTION_MAX_TABLE_ROWS - 1 : NOTION_MAX_TABLE_ROWS;\n\n for (let i = 0; i < dataRows.length; i += chunkSize) {\n const chunk = dataRows.slice(i, i + chunkSize);\n const children = headerRow ? [headerRow, ...chunk] : chunk;\n tables.push({\n type: \"table\",\n table: {\n table_width: maxCells,\n has_column_header: !!headerRow,\n has_row_header: table.has_row_header,\n children,\n },\n });\n }\n\n return tables;\n}\n\nfunction isListBlock(block: Record<string, unknown>): boolean {\n return (\n block.type === \"bulleted_list_item\" ||\n block.type === \"numbered_list_item\" ||\n block.type === \"to_do\"\n );\n}\n\nfunction flattenListDepth(block: Record<string, unknown>, depth: number): Record<string, unknown> {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n if (!blockData?.children || blockData.children.length === 0) return block;\n\n if (depth >= NOTION_MAX_LIST_DEPTH - 1) {\n const flattened = collectAllDescendants(blockData.children);\n return {\n ...block,\n [blockType]: { ...blockData, children: flattened },\n };\n }\n\n const normalizedChildren = blockData.children.map((child) => {\n if (isListBlock(child)) {\n return flattenListDepth(child, depth + 1);\n }\n return child;\n });\n\n return {\n ...block,\n [blockType]: { ...blockData, children: normalizedChildren },\n };\n}\n\nfunction collectAllDescendants(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n for (const block of blocks) {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n const children = blockData?.children;\n const blockWithoutChildren = children\n ? { ...block, [blockType]: { ...blockData, children: undefined } }\n : block;\n result.push(blockWithoutChildren);\n if (children && children.length > 0) {\n result.push(...collectAllDescendants(children));\n }\n }\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { Sema } from \"async-sema\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { ImageReference } from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport interface ImageDownloadResult {\n readonly originalUrl: string;\n readonly localPath: string;\n readonly hash: string;\n readonly size: number;\n}\n\nexport interface ImageUploadResult {\n readonly localPath: string;\n readonly fileUploadId: string;\n}\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"image/bmp\": \".bmp\",\n \"image/tiff\": \".tiff\",\n};\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".ico\": \"image/x-icon\",\n \".tiff\": \"image/tiff\",\n};\n\nexport class ImageHandler {\n constructor(\n private readonly vaultFs: VaultFS,\n private readonly attachmentFolder: string = \"attachments\",\n private readonly notionClient?: NotionClient,\n ) {}\n\n async downloadImage(url: string, pageTitle: string): Promise<ImageDownloadResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`이미지 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"image/png\";\n const extension = IMAGE_EXTENSIONS[contentType] ?? this.guessExtension(url) ?? \".png\";\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\").slice(0, 12);\n const safeName = pageTitle\n .replace(/[^a-zA-Z0-9가-힣\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 50);\n\n const fileName = `${safeName}-${hash}${extension}`;\n const localPath = `${this.attachmentFolder}/${fileName}`;\n\n await this.vaultFs.ensureFolder(this.attachmentFolder);\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return {\n originalUrl: url,\n localPath,\n hash,\n size: buffer.length,\n };\n }\n\n async downloadAllImages(\n markdown: string,\n pageTitle: string,\n ): Promise<{ content: string; downloads: ImageDownloadResult[] }> {\n const imageRegex = /!\\[([^\\]]*)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n const matches = [...markdown.matchAll(imageRegex)];\n const notionMatches = matches.filter((m) => m[2] && this.isNotionImageUrl(m[2]));\n\n if (notionMatches.length === 0) {\n return { content: markdown, downloads: [] };\n }\n\n const sema = new Sema(3);\n const results = await Promise.allSettled(\n notionMatches.map(async (match) => {\n await sema.acquire();\n try {\n return {\n match,\n download: await this.downloadImage(match[2]!, pageTitle),\n };\n } finally {\n sema.release();\n }\n }),\n );\n\n const downloads: ImageDownloadResult[] = [];\n let result = markdown;\n\n for (const settled of results) {\n if (settled.status !== \"fulfilled\") continue;\n const { match, download } = settled.value;\n downloads.push(download);\n const obsidianEmbed = `![[${download.localPath}${match[1] ? `|${match[1]}` : \"\"}]]`;\n result = result.replace(match[0]!, obsidianEmbed);\n }\n\n return { content: result, downloads };\n }\n\n async uploadLocalImage(localPath: string): Promise<ImageUploadResult> {\n if (!this.notionClient) {\n throw new Error(\"NotionClient required for image upload\");\n }\n\n const buffer = await this.readImageFromVault(localPath);\n const filename = localPath.split(\"/\").pop() ?? \"image.png\";\n const contentType = this.getContentTypeFromPath(filename);\n const blob = new Blob([buffer], { type: contentType });\n const fileUploadId = await this.notionClient.uploadFile(blob, filename, contentType);\n\n return { localPath, fileUploadId };\n }\n\n async uploadAndAppendImages(\n pageId: string,\n images: ImageReference[],\n ): Promise<ImageUploadResult[]> {\n if (!this.notionClient) return [];\n\n const localImages = images.filter((img) => !img.isExternal && img.localPath);\n if (localImages.length === 0) return [];\n\n const results: ImageUploadResult[] = [];\n const imageBlocks: unknown[] = [];\n\n for (const img of localImages) {\n try {\n const result = await this.uploadLocalImage(img.localPath!);\n results.push(result);\n imageBlocks.push({\n type: \"image\",\n image: {\n type: \"file_upload\",\n file_upload: { id: result.fileUploadId },\n },\n });\n } catch (error) {\n getLogger().warn(`이미지 업로드 실패 (${img.localPath}):`, error);\n }\n }\n\n if (imageBlocks.length > 0) {\n await this.notionClient.appendChildren(pageId, imageBlocks);\n }\n\n return results;\n }\n\n private async readImageFromVault(localPath: string): Promise<Buffer> {\n try {\n return await this.vaultFs.readBinary(localPath);\n } catch {\n return await this.vaultFs.readBinary(`${this.attachmentFolder}/${localPath}`);\n }\n }\n\n private getContentTypeFromPath(filename: string): string {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n return (ext && EXTENSION_TO_MIME[ext]) ?? \"application/octet-stream\";\n }\n\n private isNotionImageUrl(url: string): boolean {\n return (\n url.includes(\"secure.notion-static.com\") ||\n url.includes(\"prod-files-secure\") ||\n url.includes(\"s3.us-west-2.amazonaws.com/secure.notion-static.com\")\n );\n }\n\n private guessExtension(url: string): string | null {\n const pathname = new URL(url).pathname;\n const ext = pathname.match(/\\.(png|jpg|jpeg|gif|webp|svg|bmp|tiff)(\\?|$)/i);\n return ext ? `.${ext[1]!.toLowerCase()}` : null;\n }\n}\n","// eslint-disable-next-line no-control-regex\nconst INVALID_CHARS = /[<>:\"/\\\\|?*\\x00-\\x1f]/g;\nconst TRAILING_DOTS = /\\.+$/;\nconst RESERVED_NAMES = new Set([\n \"CON\",\n \"PRN\",\n \"AUX\",\n \"NUL\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\",\n]);\n\nexport function sanitizeFileName(name: string): string {\n let sanitized = name.replace(INVALID_CHARS, \"_\").replace(TRAILING_DOTS, \"\").trim().slice(0, 200);\n\n if (RESERVED_NAMES.has(sanitized.toUpperCase())) {\n sanitized = `_${sanitized}`;\n }\n\n if (sanitized.length === 0) {\n sanitized = \"_untitled\";\n }\n\n return sanitized;\n}\n","const NOTION_CALLOUT_RE = /^::: callout\\n([\\s\\S]*?)\\n:::/gm;\nconst NOTION_TOGGLE_RE = /<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/gs;\nconst NOTION_PAGE_MENTION_RE = /<mention-page id=\"([^\"]+)\">([\\s\\S]*?)<\\/mention-page>/g;\nconst NOTION_USER_MENTION_RE = /<mention-user id=\"[^\"]*\">([^<]*)<\\/mention-user>/g;\nconst NOTION_DATE_MENTION_RE = /<mention-date start=\"([^\"]*)\"(?: end=\"([^\"]*)\")?[^>]*\\/>/g;\nconst NOTION_UNKNOWN_RE = /<unknown id=\"[^\"]*\"[^>]*\\/>/g;\n\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\n\nexport function notionEnhancedToObsidian(enhanced: string): string {\n let result = enhanced;\n\n result = convertToggles(result);\n result = convertCallouts(result);\n result = convertPageMentions(result);\n result = convertPageLinks(result);\n result = convertUserMentions(result);\n result = convertDateMentions(result);\n result = removeUnknownBlocks(result);\n result = convertNotionMath(result);\n result = convertNotionTables(result);\n result = convertColorSpans(result);\n result = removeEmptyBlocks(result);\n result = unescapePipes(result);\n\n return result;\n}\n\nexport function obsidianToNotionEnhanced(obsidian: string): string {\n let result = obsidian;\n\n result = convertTogglesToHtml(result);\n result = convertObsidianCallouts(result);\n\n return result;\n}\n\nfunction convertToggles(content: string): string {\n function replaceToggle(match: string): string {\n const m = /<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/s.exec(match);\n if (!m) return match;\n\n const title = m[1]!.trim();\n let body = m[2]!.trim();\n\n body = convertToggles(body);\n\n const indented = body\n .split(\"\\n\")\n .map((line) => (line ? ` ${line}` : \"\"))\n .join(\"\\n\")\n .trimEnd();\n\n return `${TOGGLE_START}\\n- ${title}\\n${indented}\\n${TOGGLE_END}`;\n }\n\n return content.replace(NOTION_TOGGLE_RE, replaceToggle);\n}\n\nfunction convertCallouts(content: string): string {\n return content.replace(NOTION_CALLOUT_RE, (_match, body: string) => {\n const lines = body.trim().split(\"\\n\");\n const firstLine = lines[0] ?? \"\";\n\n const emojiMatch = /^([\\p{Emoji}️‍]+)\\s*(.*)/u.exec(firstLine);\n const type = emojiMatch ? emojiToCalloutType(emojiMatch[1]!) : \"note\";\n const title = emojiMatch ? emojiMatch[2]! : firstLine;\n const rest = lines.slice(1).join(\"\\n\").trim();\n\n const calloutTitle = title ? `> [!${type}] ${title}` : `> [!${type}]`;\n const calloutBody = rest\n ? \"\\n\" +\n rest\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\")\n : \"\";\n\n return calloutTitle + calloutBody;\n });\n}\n\nfunction convertPageMentions(content: string): string {\n return content.replace(NOTION_PAGE_MENTION_RE, (_match, _id: string, text: string) => {\n const cleaned = text.trim();\n return `[[${cleaned}]]`;\n });\n}\n\nfunction convertUserMentions(content: string): string {\n return content.replace(NOTION_USER_MENTION_RE, (_match, name: string) => `@${name}`);\n}\n\nfunction convertDateMentions(content: string): string {\n return content.replace(NOTION_DATE_MENTION_RE, (_match, start: string, end?: string) => {\n return end ? `${start} → ${end}` : start;\n });\n}\n\nfunction removeUnknownBlocks(content: string): string {\n return content.replace(NOTION_UNKNOWN_RE, \"\");\n}\n\nfunction convertTogglesToHtml(content: string): string {\n const startRe = new RegExp(escapeRegex(TOGGLE_START), \"g\");\n const endRe = new RegExp(escapeRegex(TOGGLE_END), \"g\");\n\n let result = content;\n let safety = 0;\n\n while (result.includes(TOGGLE_START) && safety++ < 100) {\n const startIdx = result.indexOf(TOGGLE_START);\n const endIdx = findMatchingEnd(result, startIdx + TOGGLE_START.length);\n if (endIdx === -1) break;\n\n const inner = result.slice(startIdx + TOGGLE_START.length, endIdx).trim();\n const titleMatch = /^- (.+)$/m.exec(inner);\n const title = titleMatch ? titleMatch[1]! : \"\";\n const body = inner\n .split(\"\\n\")\n .slice(1)\n .map((line) => line.replace(/^ {2}/, \"\"))\n .join(\"\\n\")\n .trim();\n\n const html = `<details>\\n<summary>${title}</summary>\\n\\n${body}\\n\\n</details>`;\n result = result.slice(0, startIdx) + html + result.slice(endIdx + TOGGLE_END.length);\n }\n\n result = result.replace(startRe, \"\").replace(endRe, \"\");\n return result;\n}\n\nfunction findMatchingEnd(content: string, startFrom: number): number {\n let depth = 1;\n let pos = startFrom;\n\n while (pos < content.length && depth > 0) {\n const nextStart = content.indexOf(TOGGLE_START, pos);\n const nextEnd = content.indexOf(TOGGLE_END, pos);\n\n if (nextEnd === -1) return -1;\n\n if (nextStart !== -1 && nextStart < nextEnd) {\n depth++;\n pos = nextStart + TOGGLE_START.length;\n } else {\n depth--;\n if (depth === 0) return nextEnd;\n pos = nextEnd + TOGGLE_END.length;\n }\n }\n\n return -1;\n}\n\nfunction convertObsidianCallouts(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const headerMatch = /^> \\[!(\\w+)\\]([-+])?\\s*(.*)/.exec(lines[i]!);\n if (headerMatch) {\n const type = headerMatch[1]!;\n const title = headerMatch[3]!;\n const emoji = calloutTypeToEmoji(type) ?? \"💡\";\n const calloutTitle = title ? `${emoji} ${title}` : emoji;\n\n const bodyLines: string[] = [];\n i++;\n while (i < lines.length && lines[i]!.startsWith(\"> \")) {\n bodyLines.push(lines[i]!.slice(2));\n i++;\n }\n\n result.push(\"::: callout\");\n result.push(calloutTitle);\n if (bodyLines.length > 0) {\n result.push(...bodyLines);\n }\n result.push(\":::\");\n } else {\n result.push(lines[i]!);\n i++;\n }\n }\n\n return result.join(\"\\n\");\n}\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"💡\": \"tip\",\n ℹ️: \"info\",\n \"⚠️\": \"warning\",\n \"🔥\": \"danger\",\n \"✅\": \"success\",\n \"❌\": \"failure\",\n \"❓\": \"question\",\n \"📝\": \"note\",\n \"📌\": \"abstract\",\n \"🐛\": \"bug\",\n \"💬\": \"quote\",\n \"📋\": \"example\",\n};\n\nconst TYPE_EMOJI_MAP: Record<string, string> = Object.fromEntries(\n Object.entries(EMOJI_TYPE_MAP).map(([k, v]) => [v, k]),\n);\n\nfunction emojiToCalloutType(emoji: string): string {\n return EMOJI_TYPE_MAP[emoji] ?? \"note\";\n}\n\nfunction calloutTypeToEmoji(type: string): string | undefined {\n return TYPE_EMOJI_MAP[type.toLowerCase()];\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst NOTION_PAGE_LINK_RE = /<page url=\"[^\"]*\">([\\s\\S]*?)<\\/page>/g;\nconst NOTION_COLOR_SPAN_RE = /<span color=\"([^\"]+)\">([\\s\\S]*?)<\\/span>/g;\nconst NOTION_EMPTY_BLOCK_RE = /^<empty-block\\/>\\n?/gm;\n\nfunction convertPageLinks(content: string): string {\n return content.replace(NOTION_PAGE_LINK_RE, (_match, text: string) => {\n const cleaned = text.replace(/\\*\\*/g, \"\").trim();\n return `[[${cleaned}]]`;\n });\n}\n\nfunction convertColorSpans(content: string): string {\n return content.replace(NOTION_COLOR_SPAN_RE, (_match, _color: string, text: string) => text);\n}\n\nfunction removeEmptyBlocks(content: string): string {\n return content.replace(NOTION_EMPTY_BLOCK_RE, \"\\n\");\n}\n\nconst NOTION_INLINE_MATH_RE = /\\$`([^`]+)`\\$/g;\nconst NOTION_BLOCK_MATH_RE = /\\$\\$\\n```\\n([\\s\\S]*?)\\n```\\n\\$\\$/g;\n\nfunction convertNotionMath(content: string): string {\n let result = content.replace(NOTION_BLOCK_MATH_RE, (_match, eq: string) => {\n return `$$\\n${eq.trim()}\\n$$`;\n });\n result = result.replace(NOTION_INLINE_MATH_RE, (_match, eq: string) => `$${eq}$`);\n return result;\n}\n\nconst NOTION_TABLE_RE = /<table[^>]*>([\\s\\S]*?)<\\/table>/g;\nconst TABLE_ROW_RE = /<tr>([\\s\\S]*?)<\\/tr>/g;\nconst TABLE_CELL_RE = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/g;\n\nfunction convertNotionTables(content: string): string {\n return content.replace(NOTION_TABLE_RE, (_match, tableBody: string) => {\n const rows: string[][] = [];\n let rowMatch: RegExpExecArray | null;\n const rowRe = new RegExp(TABLE_ROW_RE.source, TABLE_ROW_RE.flags);\n\n while ((rowMatch = rowRe.exec(tableBody)) !== null) {\n const cells: string[] = [];\n let cellMatch: RegExpExecArray | null;\n const cellRe = new RegExp(TABLE_CELL_RE.source, TABLE_CELL_RE.flags);\n while ((cellMatch = cellRe.exec(rowMatch[1]!)) !== null) {\n cells.push(cellMatch[1]!.trim());\n }\n rows.push(cells);\n }\n\n if (rows.length === 0) return _match;\n\n const colCount = Math.max(...rows.map((r) => r.length));\n const lines: string[] = [];\n\n for (let i = 0; i < rows.length; i++) {\n const padded = rows[i]!;\n while (padded.length < colCount) padded.push(\"\");\n lines.push(`| ${padded.join(\" | \")} |`);\n if (i === 0) {\n lines.push(`| ${padded.map(() => \"---\").join(\" | \")} |`);\n }\n }\n\n return lines.join(\"\\n\");\n });\n}\n\nfunction unescapePipes(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let inTable = false;\n\n for (const line of lines) {\n if (/^\\|.*\\|$/.test(line.trim()) || /^\\|[\\s-|]+\\|$/.test(line.trim())) {\n inTable = true;\n result.push(line);\n } else {\n if (inTable && line.trim() === \"\") {\n inTable = false;\n } else if (!/^\\|/.test(line.trim())) {\n inTable = false;\n }\n result.push(inTable ? line : line.replace(/\\\\\\|/g, \"|\"));\n }\n }\n\n return result.join(\"\\n\");\n}\n","import type {\n PushOptions,\n PushResult,\n PullOptions,\n PullResult,\n SyncOptions,\n SyncResult,\n StatusResult,\n SyncRecord,\n LocalChange,\n RemoteChange,\n Conflict,\n FailedOperation,\n} from \"../types/sync.js\";\nimport type { Config } from \"../types/config.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { PageObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { Sema } from \"async-sema\";\nimport { ChangeDetector } from \"./change-detector.js\";\nimport type { ConversionPipeline } from \"../converter/pipeline.js\";\nimport { createDefaultPipeline } from \"../converter/pipeline-factory.js\";\nimport { BlockConverter } from \"../converter/block-converter.js\";\nimport { ImageHandler } from \"./image-handler.js\";\nimport { PropertyMapper } from \"../notion/property-mapper.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { getLogger } from \"../utils/logger.js\";\nimport { sanitizeFileName } from \"../utils/sanitize.js\";\nimport { notionIdsEqual } from \"../utils/id.js\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport {\n notionEnhancedToObsidian,\n obsidianToNotionEnhanced,\n} from \"../converter/enhanced-md-converter.js\";\n\nexport class SyncOrchestrator {\n private readonly changeDetector: ChangeDetector;\n private readonly pipeline: ConversionPipeline;\n private readonly blockConverter: BlockConverter;\n private readonly imageHandler: ImageHandler;\n private readonly propertyMapper: PropertyMapper;\n private dbSchemaLoaded = false;\n\n constructor(\n private readonly config: Config,\n private readonly stateDb: StateDB,\n private readonly notionClient: NotionClient,\n private readonly vaultFs: VaultFS,\n ) {\n this.changeDetector = new ChangeDetector(stateDb);\n this.pipeline = createDefaultPipeline({\n wikilinkResolver: (text) => stateDb.resolveWikilink(text),\n });\n this.blockConverter = new BlockConverter();\n this.imageHandler = new ImageHandler(vaultFs, config.paths.attachments, notionClient);\n this.propertyMapper = new PropertyMapper();\n\n this.blockConverter.initNotionToMd(this.notionClient.getInternalClient());\n }\n\n async push(options?: PushOptions): Promise<PushResult> {\n const startTime = Date.now();\n\n if (this.config.sync.direction === \"pull\") {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n this.cleanupInterruptedSync();\n\n const files = await this.vaultFs.listMarkdownFiles();\n const changes = this.changeDetector.detectLocalChanges(files);\n\n const conflictPaths = new Set(this.stateDb.getByStatus(\"conflict\").map((r) => r.obsidianPath));\n const eligible = options?.force ? changes : changes.filter((c) => !conflictPaths.has(c.path));\n\n const filtered = options?.paths\n ? eligible.filter((c) => options.paths!.some((p) => c.path.startsWith(p)))\n : eligible;\n\n if (filtered.length === 0) {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\" || c.type === \"moved\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"push_in_progress\", \"true\");\n\n const folderPaths = new Set<string>();\n for (const change of filtered) {\n const parts = change.path.split(\"/\");\n if (parts.length > 1) {\n for (let i = 1; i < parts.length; i++) {\n folderPaths.add(parts.slice(0, i).join(\"/\"));\n }\n }\n }\n\n const sortedFolders = [...folderPaths].sort(\n (a, b) => a.split(\"/\").length - b.split(\"/\").length,\n );\n for (const folderPath of sortedFolders) {\n await this.ensureFolderPage(folderPath);\n }\n\n const sema = new Sema(this.config.advanced.concurrency);\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const failed: FailedOperation[] = [];\n\n let completed = 0;\n const total = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n options?.onProgress?.(++completed, total, change.path);\n switch (change.type) {\n case \"created\":\n await this.pushCreate(change.path);\n created++;\n break;\n case \"modified\":\n case \"moved\":\n await this.pushUpdate(change.path);\n updated++;\n break;\n case \"deleted\":\n await this.pushDelete(change.path);\n deleted++;\n break;\n }\n } catch (error) {\n failed.push({\n path: change.path,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n this.stateDb.setMeta(\"last_push_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n\n return { created, updated, deleted, failed, duration: Date.now() - startTime };\n }\n\n async pull(options?: PullOptions): Promise<PullResult> {\n const startTime = Date.now();\n const emptyResult: PullResult = {\n created: 0,\n updated: 0,\n deleted: 0,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n };\n\n if (this.config.sync.direction === \"push\") {\n return emptyResult;\n }\n\n this.cleanupInterruptedSync();\n\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const conflicts: Conflict[] = [];\n const writtenPaths: string[] = [];\n const failed: FailedOperation[] = [];\n\n const remoteChanges = await this.detectRemoteChanges();\n\n const filtered = options?.paths\n ? remoteChanges.filter((c) => {\n const record = this.stateDb.getByNotionId(c.pageId);\n return record && options.paths!.some((p) => record.obsidianPath.startsWith(p));\n })\n : remoteChanges;\n\n if (filtered.length === 0) {\n return emptyResult;\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"pull_in_progress\", \"true\");\n\n const sema = new Sema(this.config.advanced.concurrency);\n\n let pullCompleted = 0;\n const pullTotal = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n options?.onProgress?.(++pullCompleted, pullTotal, change.pageId);\n switch (change.type) {\n case \"created\": {\n const path = await this.pullCreate(change.pageId);\n writtenPaths.push(path);\n created++;\n break;\n }\n case \"modified\": {\n const result = await this.pullUpdate(change);\n if (result.conflict) {\n conflicts.push(result.conflict);\n } else if (result.path) {\n writtenPaths.push(result.path);\n updated++;\n }\n break;\n }\n case \"deleted\": {\n const path = await this.pullDelete(change.pageId);\n if (path) {\n deleted++;\n }\n break;\n }\n }\n } catch (error) {\n const record = this.stateDb.getByNotionId(change.pageId);\n failed.push({\n path: record?.obsidianPath ?? change.pageId,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n this.stateDb.setMeta(\"last_pull_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n\n return {\n created,\n updated,\n deleted,\n conflicts,\n writtenPaths,\n failed,\n duration: Date.now() - startTime,\n };\n }\n\n async sync(options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const pullResult = await this.pull(options);\n const pushResult = await this.push({\n ...options,\n paths: options?.paths,\n });\n\n return {\n pull: pullResult,\n push: pushResult,\n conflicts: pullResult.conflicts,\n duration: Date.now() - startTime,\n };\n }\n\n async status(): Promise<StatusResult> {\n const files = await this.vaultFs.listMarkdownFiles();\n const localChanges = this.changeDetector.detectLocalChanges(files);\n const remoteChanges = await this.detectRemoteChanges();\n const conflictRecords = this.stateDb.getByStatus(\"conflict\");\n const lastSyncAt = this.stateDb.getMeta(\"last_sync_at\");\n\n const conflicts: Conflict[] = await this.buildConflictsFromRecords(\n conflictRecords,\n localChanges,\n remoteChanges,\n );\n\n return {\n localChanges,\n remoteChanges,\n conflicts,\n conflictRecords,\n pendingOperations: conflictRecords.length,\n lastSyncAt,\n };\n }\n\n private async buildConflictsFromRecords(\n records: SyncRecord[],\n localChanges: LocalChange[],\n remoteChanges: RemoteChange[],\n ): Promise<Conflict[]> {\n const conflicts: Conflict[] = [];\n\n for (const record of records) {\n const localChange = localChanges.find((c) => c.path === record.obsidianPath) ?? {\n path: record.obsidianPath,\n type: \"modified\" as const,\n currentHash: record.contentHash,\n previousHash: record.contentHash,\n };\n\n const remoteChange = remoteChanges.find((c) => c.pageId === record.notionPageId) ?? {\n pageId: record.notionPageId ?? \"\",\n type: \"modified\" as const,\n lastEdited: record.notionLastEdited ?? \"\",\n previousEdited: null,\n };\n\n let localContent = \"\";\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n // 파일이 삭제된 경우\n }\n\n conflicts.push({\n syncRecord: record,\n localChange,\n remoteChange,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent: \"\",\n });\n }\n\n return conflicts;\n }\n\n private get isDatabaseMode(): boolean {\n return this.config.notion.parentMode === \"database\" && !!this.config.notion.databaseId;\n }\n\n private async ensureDbSchema(): Promise<void> {\n if (this.dbSchemaLoaded || !this.isDatabaseMode) return;\n const schema = await this.notionClient.getDatabaseSchema(this.config.notion.databaseId!);\n this.propertyMapper.loadSchema(schema);\n this.dbSchemaLoaded = true;\n }\n\n private async pushCreate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const title = extractTitle(path);\n const parentId = await this.resolveNotionParent(path);\n\n const selectedPath = this.pipeline.selectPath(content);\n if (selectedPath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: selectedPath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n let effectiveParentId = parentId;\n let effectiveParentType: \"page\" | \"database\" = \"page\";\n let effectiveProperties = conversionResult.properties;\n\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n effectiveParentId = this.config.notion.databaseId!;\n effectiveParentType = \"database\";\n effectiveProperties = this.propertyMapper.toNotionProperties(\n conversionResult.properties,\n title,\n );\n }\n\n const page = await this.pushCreatePage(\n effectiveParentId,\n effectiveParentType,\n title,\n conversionResult.content,\n effectiveProperties,\n );\n\n await this.imageHandler.uploadAndAppendImages(page.id, conversionResult.images);\n\n const hash = computeHash(content);\n\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: path,\n notionPageId: page.id,\n notionParentId: parentId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: this.isFolderNote(path) ? \"folder-note\" : \"file\",\n status: \"synced\",\n baseSnapshot: Buffer.from(content, \"utf-8\"),\n });\n\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: page.id,\n title,\n aliases,\n });\n\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n });\n }\n\n private async pushUpdate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const updatePath = this.pipeline.selectPath(content);\n if (updatePath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: updatePath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n await this.pushUpdatePage(record.notionPageId, conversionResult.content);\n\n await this.imageHandler.uploadAndAppendImages(record.notionPageId, conversionResult.images);\n\n let propsToUpdate = conversionResult.properties;\n if (this.isDatabaseMode && propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n await this.ensureDbSchema();\n const title = extractTitle(path);\n propsToUpdate = this.propertyMapper.toNotionProperties(propsToUpdate, title);\n }\n\n if (propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n await this.notionClient.updatePageProperties(record.notionPageId, propsToUpdate);\n }\n\n const updatedPage = await this.notionClient.getPage(record.notionPageId);\n\n const hash = computeHash(content);\n const title = extractTitle(path);\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.transaction(() => {\n this.stateDb.updateHash(record.id, hash, Buffer.from(content, \"utf-8\"));\n this.stateDb.updateStatus(record.id, \"synced\");\n this.stateDb.setNotionLastEdited(record.id, updatedPage.last_edited_time);\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: record.notionPageId!,\n title,\n aliases,\n });\n });\n }\n\n private async pushDelete(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n if (this.config.sync.deleteSync) {\n await this.notionClient.archivePage(record.notionPageId);\n this.stateDb.delete(record.id);\n } else {\n this.stateDb.updateStatus(record.id, \"pending\");\n }\n }\n\n private async detectRemoteChanges(): Promise<RemoteChange[]> {\n const changes: RemoteChange[] = [];\n const lastPull = this.stateDb.getMeta(\"last_pull_at\");\n const syncedRecords = this.stateDb.getAll();\n const trackedPageIds = new Set(\n syncedRecords.filter((r) => r.notionPageId).map((r) => r.notionPageId!),\n );\n\n let remotePages: Array<{ id: string; last_edited_time: string }>;\n if (this.isDatabaseMode) {\n const allPages: Array<{ id: string; last_edited_time: string }> = [];\n let cursor: string | undefined;\n do {\n const result = await this.notionClient.queryDatabase(this.config.notion.databaseId!, {\n startCursor: cursor,\n });\n allPages.push(\n ...result.results.map((p) => ({ id: p.id, last_edited_time: p.last_edited_time })),\n );\n cursor = result.nextCursor ?? undefined;\n } while (cursor);\n remotePages = allPages;\n } else {\n remotePages = await this.notionClient.getChildPagesRecursive(this.config.notion.rootPageId);\n }\n\n for (const page of remotePages) {\n const record = this.stateDb.getByNotionId(page.id);\n\n if (!record) {\n changes.push({\n pageId: page.id,\n type: \"created\",\n lastEdited: page.last_edited_time,\n previousEdited: null,\n });\n } else if (page.last_edited_time !== record.notionLastEdited) {\n changes.push({\n pageId: page.id,\n type: \"modified\",\n lastEdited: page.last_edited_time,\n previousEdited: record.notionLastEdited,\n });\n }\n\n trackedPageIds.delete(page.id);\n }\n\n if (this.config.sync.deleteSync && lastPull) {\n for (const orphanId of trackedPageIds) {\n const record = syncedRecords.find((r) => r.notionPageId === orphanId);\n if (record) {\n changes.push({\n pageId: orphanId,\n type: \"deleted\",\n lastEdited: new Date().toISOString(),\n previousEdited: record.notionLastEdited,\n });\n }\n }\n }\n\n return changes;\n }\n\n private async pullCreate(pageId: string): Promise<string> {\n const page = await this.notionClient.getPage(pageId);\n const title = this.notionClient.extractTitle(page);\n const safeName = sanitizeFileName(title);\n\n const parentPath = await this.resolveParentPath(page);\n\n const allChildren = await this.notionClient.fetchAllChildren(pageId);\n const hasChildPages = allChildren.some((b) => \"type\" in b && b.type === \"child_page\");\n\n const markdown = await this.fetchPageMarkdown(pageId);\n const hasContent = markdown.trim().length > 0;\n\n let filePath: string;\n let fileType: \"file\" | \"folder-note\" | \"folder-only\";\n\n if (hasChildPages && hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-note\";\n await this.vaultFs.ensureFolder(folderPath);\n } else if (hasChildPages && !hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-only\";\n await this.vaultFs.ensureFolder(folderPath);\n } else {\n const basePath = parentPath ? `${parentPath}/${safeName}.md` : `${safeName}.md`;\n filePath = await this.resolveUniqueFilePath(basePath);\n fileType = \"file\";\n }\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n let processedMarkdown = markdown;\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n processedMarkdown = imageResult.content;\n }\n\n const finalContent = this.pipeline.convertToMarkdown(\n processedMarkdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath,\n parentMode: this.config.notion.parentMode,\n },\n { properties },\n );\n\n await this.vaultFs.writeFile(filePath, finalContent);\n\n const hash = computeHash(finalContent);\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: filePath,\n notionPageId: pageId,\n notionParentId: this.extractParentId(page),\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(finalContent, \"utf-8\"),\n });\n\n const aliases = extractAliases(properties);\n this.stateDb.upsertWikilink({\n obsidianPath: filePath,\n notionPageId: pageId,\n title,\n aliases,\n });\n });\n\n return filePath;\n }\n\n private async pullUpdate(change: RemoteChange): Promise<{ path?: string; conflict?: Conflict }> {\n const record = this.stateDb.getByNotionId(change.pageId);\n if (!record) return {};\n\n const page = await this.notionClient.getPage(change.pageId);\n let markdown = await this.fetchPageMarkdown(change.pageId);\n\n const title = this.notionClient.extractTitle(page);\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n markdown = imageResult.content;\n }\n\n const savedMarkers = this.stateDb.getPreserveMarkers(record.obsidianPath);\n const remoteContent = this.pipeline.convertToMarkdown(\n markdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath: record.obsidianPath,\n parentMode: this.config.notion.parentMode,\n },\n { properties, preserveMarkers: savedMarkers.length > 0 ? savedMarkers : undefined },\n );\n\n let localContent: string;\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n localContent = \"\";\n }\n\n const localHash = computeHash(localContent);\n const localModified = localHash !== record.contentHash;\n\n if (localModified) {\n const strategy = this.config.sync.conflictStrategy;\n\n if (strategy === \"remote-first\") {\n // 리모트 우선: 로컬 변경 무시, 리모트 내용으로 덮어쓰기\n } else if (strategy === \"local-first\") {\n return { path: record.obsidianPath };\n } else {\n const conflict: Conflict = {\n syncRecord: record,\n localChange: {\n path: record.obsidianPath,\n type: \"modified\",\n currentHash: localHash,\n previousHash: record.contentHash,\n },\n remoteChange: change,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n };\n\n this.stateDb.updateStatus(record.id, \"conflict\");\n return { conflict };\n }\n }\n\n await this.vaultFs.writeFile(record.obsidianPath, remoteContent);\n\n const newHash = computeHash(remoteContent);\n this.stateDb.upsert({\n obsidianPath: record.obsidianPath,\n notionPageId: change.pageId,\n notionParentId: record.notionParentId,\n contentHash: newHash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: record.syncDirection,\n fileType: record.fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(remoteContent, \"utf-8\"),\n });\n\n return { path: record.obsidianPath };\n }\n\n private async pullDelete(pageId: string): Promise<string | null> {\n const record = this.stateDb.getByNotionId(pageId);\n if (!record) return null;\n\n if (this.config.sync.deleteSync) {\n try {\n await this.vaultFs.deleteFile(record.obsidianPath);\n } catch {\n // 이미 삭제된 경우 무시\n }\n }\n\n this.stateDb.delete(record.id);\n return record.obsidianPath;\n }\n\n private async ensureFolderPage(folderPath: string): Promise<void> {\n const existing = this.stateDb.getByPath(folderPath);\n if (existing?.notionPageId) return;\n\n const folderNotePath = `${folderPath}/${folderPath.split(\"/\").pop()}.md`;\n const folderNoteRecord = this.stateDb.getByPath(folderNotePath);\n if (folderNoteRecord?.notionParentId) {\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderNoteRecord.notionParentId,\n notionParentId: \"\",\n contentHash: \"\",\n notionLastEdited: folderNoteRecord.notionLastEdited,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n return;\n }\n\n const parts = folderPath.split(\"/\");\n const folderName = parts[parts.length - 1]!;\n\n let parentId = this.config.notion.rootPageId;\n if (parts.length > 1) {\n const parentPath = parts.slice(0, -1).join(\"/\");\n const parentRecord = this.stateDb.getByPath(parentPath);\n if (parentRecord?.notionPageId) {\n parentId = parentRecord.notionPageId;\n }\n }\n\n const folderPage = await this.notionClient.createPage({\n parentId,\n parentType: \"page\",\n title: folderName,\n });\n\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderPage.id,\n notionParentId: parentId,\n contentHash: \"\",\n notionLastEdited: folderPage.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n }\n\n private async resolveNotionParent(filePath: string): Promise<string> {\n const parts = filePath.split(\"/\");\n if (parts.length <= 1) return this.config.notion.rootPageId;\n\n const folderPath = parts.slice(0, -1).join(\"/\");\n const folderRecord = this.stateDb.getByPath(folderPath);\n if (folderRecord?.notionPageId) return folderRecord.notionPageId;\n\n return this.config.notion.rootPageId;\n }\n\n private isFolderNote(filePath: string): boolean {\n const parts = filePath.split(\"/\");\n if (parts.length < 2) return false;\n const fileName = parts[parts.length - 1]!.replace(/\\.md$/, \"\");\n const folderName = parts[parts.length - 2]!;\n return fileName === folderName;\n }\n\n private async resolveParentPath(page: PageObjectResponse): Promise<string> {\n const parentId = this.extractParentId(page);\n if (!parentId || notionIdsEqual(parentId, this.config.notion.rootPageId)) return \"\";\n\n const parentRecord = this.stateDb.getByNotionId(parentId);\n if (parentRecord) {\n if (parentRecord.fileType === \"folder-note\" || parentRecord.fileType === \"folder-only\") {\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n return pathParts.join(\"/\");\n }\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n const parentDir = pathParts.join(\"/\");\n return (\n parentDir ||\n sanitizeFileName(this.notionClient.extractTitle(await this.notionClient.getPage(parentId)))\n );\n }\n\n try {\n const parentPage = await this.notionClient.getPage(parentId);\n const parentTitle = this.notionClient.extractTitle(parentPage);\n const grandparentPath = await this.resolveParentPath(parentPage);\n const safeName = sanitizeFileName(parentTitle);\n return grandparentPath ? `${grandparentPath}/${safeName}` : safeName;\n } catch {\n return \"\";\n }\n }\n\n private async pushCreatePage(\n parentId: string,\n parentType: \"page\" | \"database\",\n title: string,\n markdownContent: string,\n properties?: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n return await this.notionClient.createPageWithMarkdown({\n parentId,\n parentType,\n title,\n markdown: enhanced,\n properties,\n });\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const page = await this.notionClient.createPage({\n parentId,\n parentType,\n title,\n properties,\n });\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(page.id, blocks);\n }\n return page;\n }\n\n private async pushUpdatePage(pageId: string, markdownContent: string): Promise<void> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n await this.notionClient.replacePageMarkdown(pageId, enhanced);\n return;\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const existingBlocks = await this.notionClient.fetchAllChildren(pageId);\n\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(pageId, blocks);\n }\n const deleteSema = new Sema(this.config.advanced.concurrency);\n await Promise.all(\n existingBlocks.map(async (block) => {\n await deleteSema.acquire();\n try {\n await this.notionClient.deleteBlock(block.id);\n } finally {\n deleteSema.release();\n }\n }),\n );\n }\n\n private async fetchPageMarkdown(pageId: string): Promise<string> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const result = await this.notionClient.getPageMarkdown(pageId);\n return notionEnhancedToObsidian(result.markdown);\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n return this.blockConverter.notionBlocksToMarkdown(pageId);\n }\n\n private extractParentId(page: PageObjectResponse): string | null {\n const parent = page.parent as { type: string; page_id?: string; database_id?: string };\n if (parent.type === \"page_id\") return parent.page_id ?? null;\n if (parent.type === \"database_id\") return parent.database_id ?? null;\n return null;\n }\n\n private cleanupInterruptedSync(): void {\n const pushInProgress = this.stateDb.getMeta(\"push_in_progress\");\n const pullInProgress = this.stateDb.getMeta(\"pull_in_progress\");\n\n if (pushInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 push가 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n }\n if (pullInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 pull이 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n }\n }\n\n private async resolveUniqueFilePath(basePath: string): Promise<string> {\n if (!(await this.vaultFs.exists(basePath))) return basePath;\n\n const dir = basePath.lastIndexOf(\"/\") >= 0 ? basePath.slice(0, basePath.lastIndexOf(\"/\")) : \"\";\n const ext = \".md\";\n const name = basePath.slice(dir ? dir.length + 1 : 0, -ext.length);\n\n for (let i = 1; i <= 99; i++) {\n const candidate = dir ? `${dir}/${name} (${i})${ext}` : `${name} (${i})${ext}`;\n if (!(await this.vaultFs.exists(candidate))) return candidate;\n }\n\n return basePath;\n }\n}\n\nfunction extractTitle(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n\nfunction extractAliases(properties: Record<string, unknown>): string[] {\n const raw = properties.aliases ?? properties.alias;\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.filter((a): a is string => typeof a === \"string\");\n if (typeof raw === \"string\")\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n","import { readFile, writeFile, unlink, rename, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport { join, relative, dirname } from \"node:path\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { FileInfo } from \"./change-detector.js\";\n\nexport interface PathFilterConfig {\n readonly include?: string[];\n readonly exclude?: string[];\n}\n\nexport class NodeVaultFS implements VaultFS {\n private readonly includePatterns: string[];\n private readonly excludePatterns: string[];\n\n constructor(\n private readonly rootPath: string,\n pathConfig?: PathFilterConfig,\n ) {\n this.includePatterns = pathConfig?.include ?? [];\n const configExclude = pathConfig?.exclude ?? [];\n const ignorePatterns = this.loadImNobsidianIgnore();\n this.excludePatterns = [...configExclude, ...ignorePatterns];\n }\n\n private loadImNobsidianIgnore(): string[] {\n try {\n const ignorePath = join(this.rootPath, \".im-nobsidian-ignore\");\n const content = readFileSync(ignorePath, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line: string) => line.trim())\n .filter((line: string) => line && !line.startsWith(\"#\"));\n } catch {\n return [];\n }\n }\n\n async readFile(path: string): Promise<string> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath, \"utf-8\");\n }\n\n async readBinary(path: string): Promise<Buffer> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf-8\");\n }\n\n async writeBinary(path: string, data: Buffer): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, data);\n }\n\n async deleteFile(path: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await unlink(fullPath);\n }\n\n async moveFile(from: string, to: string): Promise<void> {\n const fromPath = join(this.rootPath, from);\n const toPath = join(this.rootPath, to);\n await mkdir(dirname(toPath), { recursive: true });\n await rename(fromPath, toPath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await stat(join(this.rootPath, path));\n return true;\n } catch {\n return false;\n }\n }\n\n async ensureFolder(path: string): Promise<void> {\n await mkdir(join(this.rootPath, path), { recursive: true });\n }\n\n async listMarkdownFiles(): Promise<FileInfo[]> {\n const files: FileInfo[] = [];\n await this.walkDir(this.rootPath, files);\n return files;\n }\n\n private matchesPattern(relativePath: string, pattern: string): boolean {\n if (pattern === \"**/*\" || pattern === \"**\") return true;\n\n if (pattern.endsWith(\"/**\")) {\n const dir = pattern.slice(0, -3);\n return relativePath.startsWith(dir + \"/\") || relativePath === dir;\n } else if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return relativePath.endsWith(ext);\n } else if (pattern.includes(\"*\")) {\n const regexStr = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n return new RegExp(\"^\" + regexStr + \"$\").test(relativePath);\n } else {\n return relativePath === pattern || relativePath.startsWith(pattern + \"/\");\n }\n }\n\n private isExcluded(relativePath: string): boolean {\n if (this.includePatterns.length > 0) {\n const included = this.includePatterns.some((p) => this.matchesPattern(relativePath, p));\n if (!included) return true;\n }\n\n return this.excludePatterns.some((p) => this.matchesPattern(relativePath, p));\n }\n\n private async walkDir(dir: string, result: FileInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDir(fullPath, result);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const content = await readFile(fullPath, \"utf-8\");\n const fileStat = await stat(fullPath);\n\n result.push({\n path: relativePath,\n content,\n mtime: fileStat.mtime.toISOString(),\n });\n }\n }\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst INLINE_DB_START = /%% im-nobsidian:inline-db:([^\\s]+) %%/g;\nconst INLINE_DB_END = /%% im-nobsidian:end %%/g;\n\nexport class InlineDBParser implements Processor {\n readonly name = \"InlineDBParser\";\n readonly order = 40;\n\n process(input: ProcessorInput): ProcessorOutput {\n const inlineDbBlocks: InlineDBBlock[] = [];\n const content = input.content;\n\n const startMatches = [...content.matchAll(INLINE_DB_START)];\n for (const match of startMatches) {\n const startIdx = match.index!;\n const params = parseParams(match[1]!);\n\n const afterStart = content.indexOf(\"\\n\", startIdx) + 1;\n const endMatch = INLINE_DB_END.exec(content.slice(afterStart));\n\n if (endMatch) {\n const tableContent = content.slice(afterStart, afterStart + endMatch.index!);\n inlineDbBlocks.push({\n id: params[\"id\"] ?? \"\",\n title: params[\"title\"] ?? \"\",\n tableMarkdown: tableContent.trim(),\n startIdx,\n endIdx: afterStart + endMatch.index! + endMatch[0].length,\n });\n }\n\n INLINE_DB_END.lastIndex = 0;\n }\n\n return {\n content,\n metadata: {\n ...input.metadata,\n inlineDbBlocks,\n },\n };\n }\n}\n\ninterface InlineDBBlock {\n readonly id: string;\n readonly title: string;\n readonly tableMarkdown: string;\n readonly startIdx: number;\n readonly endIdx: number;\n}\n\nfunction parseParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const [key, value] = pair.split(\"=\");\n if (key && value) {\n params[key] = decodeURIComponent(value);\n }\n }\n return params;\n}\n","export interface MergeResult {\n readonly success: boolean;\n readonly merged: string;\n readonly conflicts: MergeConflictRegion[];\n}\n\nexport interface MergeConflictRegion {\n readonly localLines: string[];\n readonly remoteLines: string[];\n}\n\nexport function threeWayMerge(base: string, local: string, remote: string): MergeResult {\n const baseLines = base.split(\"\\n\");\n const localLines = local.split(\"\\n\");\n const remoteLines = remote.split(\"\\n\");\n\n const localDiff = computeDiff(baseLines, localLines);\n const remoteDiff = computeDiff(baseLines, remoteLines);\n\n const merged: string[] = [];\n const conflicts: MergeConflictRegion[] = [];\n let success = true;\n\n let baseIdx = 0;\n\n while (baseIdx < baseLines.length || localDiff.length > 0 || remoteDiff.length > 0) {\n const localChange = localDiff.find((d) => d.baseStart === baseIdx);\n const remoteChange = remoteDiff.find((d) => d.baseStart === baseIdx);\n\n if (localChange && remoteChange) {\n if (arraysEqual(localChange.newLines, remoteChange.newLines)) {\n merged.push(...localChange.newLines);\n } else {\n success = false;\n conflicts.push({\n localLines: localChange.newLines,\n remoteLines: remoteChange.newLines,\n });\n merged.push(\"<<<<<<< LOCAL\");\n merged.push(...localChange.newLines);\n merged.push(\"=======\");\n merged.push(...remoteChange.newLines);\n merged.push(\">>>>>>> REMOTE\");\n }\n\n baseIdx = Math.max(localChange.baseEnd, remoteChange.baseEnd);\n localDiff.splice(localDiff.indexOf(localChange), 1);\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else if (localChange) {\n merged.push(...localChange.newLines);\n baseIdx = localChange.baseEnd;\n localDiff.splice(localDiff.indexOf(localChange), 1);\n } else if (remoteChange) {\n merged.push(...remoteChange.newLines);\n baseIdx = remoteChange.baseEnd;\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else {\n if (baseIdx < baseLines.length) {\n merged.push(baseLines[baseIdx]!);\n }\n baseIdx++;\n }\n }\n\n return {\n success,\n merged: merged.join(\"\\n\"),\n conflicts,\n };\n}\n\ninterface DiffHunk {\n baseStart: number;\n baseEnd: number;\n newLines: string[];\n}\n\nfunction computeDiff(base: string[], modified: string[]): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n let baseIdx = 0;\n let modIdx = 0;\n\n while (baseIdx < base.length && modIdx < modified.length) {\n if (base[baseIdx] === modified[modIdx]) {\n baseIdx++;\n modIdx++;\n } else {\n const hunkStart = baseIdx;\n const newLines: string[] = [];\n\n while (modIdx < modified.length && base[baseIdx] !== modified[modIdx]) {\n newLines.push(modified[modIdx]!);\n modIdx++;\n }\n baseIdx++;\n\n hunks.push({ baseStart: hunkStart, baseEnd: baseIdx, newLines });\n }\n }\n\n if (modIdx < modified.length) {\n hunks.push({\n baseStart: baseIdx,\n baseEnd: base.length,\n newLines: modified.slice(modIdx),\n });\n }\n\n return hunks;\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => val === b[idx]);\n}\n","import type { Conflict, ConflictStrategy } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { VaultFS } from \"../sync/vault-fs.js\";\nimport { threeWayMerge } from \"./merger.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport type ResolutionChoice = \"local\" | \"remote\" | \"merge\" | \"duplicate\";\n\nexport interface ResolutionResult {\n readonly path: string;\n readonly choice: ResolutionChoice;\n readonly success: boolean;\n readonly mergeHadConflicts?: boolean;\n}\n\nexport class ConflictResolver {\n constructor(\n private readonly stateDb: StateDB,\n private readonly vaultFs: VaultFS,\n ) {}\n\n async resolve(conflict: Conflict, choice: ResolutionChoice): Promise<ResolutionResult> {\n switch (choice) {\n case \"local\":\n return this.resolveLocal(conflict);\n case \"remote\":\n return this.resolveRemote(conflict);\n case \"merge\":\n return this.resolveMerge(conflict);\n case \"duplicate\":\n return this.resolveDuplicate(conflict);\n }\n }\n\n async resolveByStrategy(\n conflict: Conflict,\n strategy: ConflictStrategy,\n ): Promise<ResolutionResult> {\n switch (strategy) {\n case \"local-first\":\n return this.resolve(conflict, \"local\");\n case \"remote-first\":\n return this.resolve(conflict, \"remote\");\n case \"duplicate\":\n return this.resolve(conflict, \"duplicate\");\n case \"manual\":\n return this.resolve(conflict, \"merge\");\n }\n }\n\n async resolveAll(conflicts: Conflict[], strategy: ConflictStrategy): Promise<ResolutionResult[]> {\n const results: ResolutionResult[] = [];\n for (const conflict of conflicts) {\n const result = await this.resolveByStrategy(conflict, strategy);\n results.push(result);\n }\n return results;\n }\n\n private async resolveLocal(conflict: Conflict): Promise<ResolutionResult> {\n const hash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"local\", success: true };\n }\n\n private async resolveRemote(conflict: Conflict): Promise<ResolutionResult> {\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, conflict.remoteContent);\n\n const hash = computeHash(conflict.remoteContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.remoteContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"remote\", success: true };\n }\n\n private async resolveMerge(conflict: Conflict): Promise<ResolutionResult> {\n const base = conflict.baseContent ?? \"\";\n const mergeResult = threeWayMerge(base, conflict.localContent, conflict.remoteContent);\n\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, mergeResult.merged);\n\n const hash = computeHash(mergeResult.merged);\n this.stateDb.updateHash(conflict.syncRecord.id, hash, Buffer.from(mergeResult.merged, \"utf-8\"));\n\n if (mergeResult.success) {\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n }\n\n return {\n path: conflict.syncRecord.obsidianPath,\n choice: \"merge\",\n success: mergeResult.success,\n mergeHadConflicts: !mergeResult.success,\n };\n }\n\n private async resolveDuplicate(conflict: Conflict): Promise<ResolutionResult> {\n const originalPath = conflict.syncRecord.obsidianPath;\n const ext = originalPath.endsWith(\".md\") ? \".md\" : \"\";\n const baseName = originalPath.replace(/\\.md$/, \"\");\n const conflictPath = `${baseName}.conflict${ext}`;\n\n await this.vaultFs.writeFile(conflictPath, conflict.remoteContent);\n\n const localHash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n localHash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: originalPath, choice: \"duplicate\", success: true };\n }\n\n generateDiff(conflict: Conflict): string {\n const localLines = conflict.localContent.split(\"\\n\");\n const remoteLines = conflict.remoteContent.split(\"\\n\");\n const lines: string[] = [];\n\n lines.push(`--- local: ${conflict.syncRecord.obsidianPath}`);\n lines.push(`+++ remote: Notion (${conflict.remoteChange.pageId})`);\n lines.push(\"\");\n\n const maxLen = Math.max(localLines.length, remoteLines.length);\n for (let i = 0; i < maxLen; i++) {\n const localLine = localLines[i];\n const remoteLine = remoteLines[i];\n\n if (localLine === remoteLine) {\n lines.push(` ${localLine ?? \"\"}`);\n } else {\n if (localLine !== undefined) lines.push(`- ${localLine}`);\n if (remoteLine !== undefined) lines.push(`+ ${remoteLine}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n}\n","import { sanitizeFileName } from \"../utils/sanitize.js\";\n\nexport interface NotionPageNode {\n readonly id: string;\n readonly title: string;\n readonly hasContent: boolean;\n readonly hasChildren: boolean;\n readonly isDatabase: boolean;\n readonly parentId: string | null;\n readonly children: NotionPageNode[];\n}\n\nexport type MappingType = \"file\" | \"folder-note\" | \"folder-only\" | \"database-folder\";\n\nexport interface MappingResult {\n readonly type: MappingType;\n readonly obsidianPath: string;\n readonly folderPath?: string;\n readonly notePath?: string;\n readonly schemaPath?: string;\n}\n\nexport class TreeMapper {\n mapNotionToObsidian(root: NotionPageNode, basePath: string = \"\"): MappingResult[] {\n const results: MappingResult[] = [];\n this.mapRecursive(root, basePath, results);\n return results;\n }\n\n private mapRecursive(node: NotionPageNode, parentPath: string, results: MappingResult[]): void {\n const safeName = sanitizeFileName(node.title || \"_untitled\");\n const currentPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n\n if (node.isDatabase) {\n results.push({\n type: \"database-folder\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n schemaPath: `${currentPath}/_schema.yml`,\n });\n } else if (node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-note\",\n obsidianPath: `${currentPath}/${safeName}.md`,\n folderPath: `${currentPath}/`,\n notePath: `${currentPath}/${safeName}.md`,\n });\n } else if (!node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-only\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n });\n } else {\n results.push({\n type: \"file\",\n obsidianPath: `${currentPath}.md`,\n });\n }\n\n for (const child of node.children) {\n this.mapRecursive(child, currentPath, results);\n }\n }\n\n mapObsidianToNotion(entries: FileSystemEntry[], parentPageId: string): PageCreationPlan[] {\n const plans: PageCreationPlan[] = [];\n this.planRecursive(entries, parentPageId, plans);\n return plans;\n }\n\n private planRecursive(\n entries: FileSystemEntry[],\n parentPageId: string,\n plans: PageCreationPlan[],\n ): void {\n for (const entry of entries) {\n if (entry.isDirectory) {\n const folderNote = this.findFolderNote(entry);\n\n if (folderNote) {\n plans.push({\n type: \"page-with-children\",\n title: entry.name,\n parentPageId,\n contentSource: folderNote.path,\n hasContent: true,\n });\n\n const childEntries = entry.children.filter((c) => c.path !== folderNote.path);\n this.planRecursive(childEntries, `placeholder:${entry.path}`, plans);\n } else {\n plans.push({\n type: \"empty-page-with-children\",\n title: entry.name,\n parentPageId,\n hasContent: false,\n });\n this.planRecursive(entry.children, `placeholder:${entry.path}`, plans);\n }\n } else if (entry.name.endsWith(\".md\") && !entry.name.startsWith(\"_\")) {\n plans.push({\n type: \"leaf-page\",\n title: entry.name.replace(/\\.md$/, \"\"),\n parentPageId,\n contentSource: entry.path,\n hasContent: true,\n });\n }\n }\n }\n\n private findFolderNote(dir: FileSystemEntry): FileSystemEntry | null {\n return dir.children.find((c) => c.name === `${dir.name}.md` || c.name === \"index.md\") ?? null;\n }\n\n determineFileType(page: {\n hasContent: boolean;\n hasChildren: boolean;\n isDatabase: boolean;\n }): MappingType {\n if (page.isDatabase) return \"database-folder\";\n if (page.hasContent && page.hasChildren) return \"folder-note\";\n if (!page.hasContent && page.hasChildren) return \"folder-only\";\n return \"file\";\n }\n}\n\nexport interface FileSystemEntry {\n readonly name: string;\n readonly path: string;\n readonly isDirectory: boolean;\n readonly children: FileSystemEntry[];\n}\n\nexport interface PageCreationPlan {\n readonly type: \"page-with-children\" | \"empty-page-with-children\" | \"leaf-page\";\n readonly title: string;\n readonly parentPageId: string;\n readonly contentSource?: string;\n readonly hasContent: boolean;\n}\n","import { watch } from \"chokidar\";\nimport type { FSWatcher } from \"chokidar\";\n\nexport type WatchEvent = \"add\" | \"change\" | \"unlink\";\n\nexport interface WatchCallback {\n (event: WatchEvent, path: string): void;\n}\n\nexport class FileWatcher {\n private watcher: FSWatcher | null = null;\n\n constructor(\n private readonly rootPath: string,\n private readonly callback: WatchCallback,\n ) {}\n\n start(): void {\n this.watcher = watch(this.rootPath, {\n ignored: [/(^|[/\\\\])\\./, \"**/node_modules/**\", \"**/.im-nobsidian/**\"],\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 500,\n pollInterval: 100,\n },\n });\n\n this.watcher.on(\"add\", (path) => this.callback(\"add\", path));\n this.watcher.on(\"change\", (path) => this.callback(\"change\", path));\n this.watcher.on(\"unlink\", (path) => this.callback(\"unlink\", path));\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","import type { SyncOrchestrator } from \"../sync/orchestrator.js\";\nimport type { SyncResult } from \"../types/sync.js\";\nimport { FileWatcher } from \"./file-watcher.js\";\nimport type { WatchEvent } from \"./file-watcher.js\";\n\nexport interface WatchSyncOptions {\n readonly debounceMs?: number;\n readonly syncDirection?: \"push\" | \"pull\" | \"both\";\n readonly onSyncStart?: () => void;\n readonly onSyncComplete?: (result: SyncResult) => void;\n readonly onSyncError?: (error: Error) => void;\n readonly onFileChange?: (event: WatchEvent, path: string) => void;\n}\n\nconst DEFAULT_DEBOUNCE_MS = 2000;\n\nexport class WatchSyncService {\n private readonly debounceMs: number;\n private readonly options: WatchSyncOptions;\n private watcher: FileWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChanges: Map<string, WatchEvent> = new Map();\n private syncing = false;\n private syncQueued = false;\n private running = false;\n\n constructor(\n private readonly rootPath: string,\n private readonly orchestrator: SyncOrchestrator,\n options: WatchSyncOptions = {},\n ) {\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n this.options = options;\n }\n\n start(): void {\n if (this.running) return;\n\n this.running = true;\n this.watcher = new FileWatcher(this.rootPath, (event, path) => {\n this.handleFileChange(event, path);\n });\n this.watcher.start();\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n this.running = false;\n this.clearDebounce();\n this.pendingChanges.clear();\n\n if (this.watcher) {\n await this.watcher.stop();\n this.watcher = null;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n isSyncing(): boolean {\n return this.syncing;\n }\n\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n private handleFileChange(event: WatchEvent, path: string): void {\n if (!path.endsWith(\".md\")) return;\n\n this.pendingChanges.set(path, event);\n this.options.onFileChange?.(event, path);\n this.scheduleSync();\n }\n\n private scheduleSync(): void {\n this.clearDebounce();\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n void this.executeSync();\n }, this.debounceMs);\n }\n\n private clearDebounce(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private async executeSync(): Promise<void> {\n if (this.syncing) {\n this.syncQueued = true;\n return;\n }\n\n this.syncing = true;\n const changedPaths = [...this.pendingChanges.keys()];\n this.pendingChanges.clear();\n\n try {\n this.options.onSyncStart?.();\n\n const result = await this.orchestrator.sync({\n paths: changedPaths.length > 0 ? changedPaths : undefined,\n });\n\n this.options.onSyncComplete?.(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.options.onSyncError?.(err);\n } finally {\n this.syncing = false;\n\n if (this.syncQueued) {\n this.syncQueued = false;\n void this.executeSync();\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/config/manager.ts","../src/utils/id.ts","../src/state/migrations/001-initial.ts","../src/state/state-db.ts","../src/notion/property-mapper.ts","../src/notion/client.ts","../src/notion/block-builder.ts","../src/utils/hash.ts","../src/sync/change-detector.ts","../src/utils/logger.ts","../src/converter/pipeline.ts","../src/converter/pre-processors/frontmatter.ts","../src/converter/pre-processors/wikilink.ts","../src/converter/pre-processors/callout.ts","../src/converter/pre-processors/math.ts","../src/converter/pre-processors/embed.ts","../src/converter/pre-processors/preserve-marker.ts","../src/converter/pre-processors/unsupported-block-stripper.ts","../src/converter/pre-processors/properties-table.ts","../src/converter/pre-processors/html-annotation.ts","../src/converter/post-processors/mention-to-wikilink.ts","../src/converter/post-processors/preserve-marker-injector.ts","../src/converter/post-processors/callout-restorer.ts","../src/converter/post-processors/color-annotator.ts","../src/converter/post-processors/frontmatter-generator.ts","../src/converter/post-processors/local-image-restorer.ts","../src/converter/post-processors/properties-table-restorer.ts","../src/converter/pipeline-factory.ts","../src/converter/block-converter.ts","../src/sync/image-handler.ts","../src/utils/sanitize.ts","../src/converter/enhanced-md-converter.ts","../src/sync/orchestrator.ts","../src/sync/node-vault-fs.ts","../src/converter/pre-processors/inline-db.ts","../src/conflict/merger.ts","../src/conflict/resolver.ts","../src/structure/tree-mapper.ts","../src/watcher/file-watcher.ts","../src/watcher/watch-sync-service.ts"],"names":["stat","WIKILINK_REGEX","matter","escapeRegex","createHash","Sema","TOGGLE_START","TOGGLE_END","EMOJI_TYPE_MAP","title","pathParts","join","readFile","mkdir","writeFile"],"mappings":";;;;;;;;;;;;;;AAEO,IAAM,YAAA,GAAe,EAAE,MAAA,CAAO;AAAA,EACnC,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,MAAA,EAAQ,EAAE,MAAA,CAAO;AAAA,IACf,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,WAAW,MAAM,CAAA;AAAA,IACnC,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,IACrB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACjC,UAAA,EAAY,EAAE,IAAA,CAAK,CAAC,QAAQ,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACvD,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACjC,CAAA;AAAA,EACD,IAAA,EAAM,EAAE,MAAA,CAAO;AAAA,IACb,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAQ,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC1D,gBAAA,EAAkB,CAAA,CACf,IAAA,CAAK,CAAC,aAAA,EAAe,cAAA,EAAgB,QAAA,EAAU,WAAW,CAAC,CAAA,CAC3D,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACnB,QAAA,EAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,IACnC,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC1D,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK;AAAA,GACtC,CAAA;AAAA,EACD,KAAA,EAAO,EAAE,MAAA,CAAO;AAAA,IACd,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAM,CAAC,CAAA;AAAA,IAC7C,OAAA,EAAS,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IACvC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,aAAa;AAAA,GAC9C,CAAA;AAAA,EACD,UAAA,EAAY,EAAE,MAAA,CAAO;AAAA,IACnB,iBAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IAC3C,eAAA,EAAiB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IACzC,kBAAA,EAAoB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IAC5C,aAAA,EAAe,CAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,QAAQ,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAW;AAAA,GACzE,CAAA;AAAA,EACD,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,IAChD,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC/C,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,OAAA,CAAQ,GAAK,CAAA;AAAA,IACxD,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,EAAE;AAAA,GACjD;AACH,CAAC;AAIM,IAAM,cAAA,GAAyB;AAAA,EACpC,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,UAAA,EAAY,EAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,MAAA;AAAA,IACX,gBAAA,EAAkB,QAAA;AAAA,IAClB,QAAA,EAAU,KAAA;AAAA,IACV,gBAAA,EAAkB,GAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,IAChB,SAAS,EAAC;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,eAAA,EAAiB,IAAA;AAAA,IACjB,kBAAA,EAAoB,IAAA;AAAA,IACpB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf;ACnEA,IAAM,WAAA,GAAc,aAAA;AACpB,IAAM,gBAAA,GAAmB,eAAA;AAElB,IAAM,gBAAN,MAAoB;AAAA,EAGzB,YAA6B,SAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAoB;AAAA,EAApB,SAAA;AAAA,EAFrB,MAAA,GAAwB,IAAA;AAAA,EAIhC,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,gBAAgB,CAAA;AAAA,EAC9C;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,IAAA,GAAwB;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AACvC,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2GAAA,EAA8B,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACvD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qDAAA,EAAgB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjD;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,8EAAA,EAAqB,KAAK,UAAU;AAAA,sEAAA;AAAA,OACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,MAAA,EAA+B;AACxC,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC9C,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,MAAA,EAAgE;AACzE,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,GAAG,cAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACN,GAAG,cAAA,CAAe,MAAA;AAAA,QAClB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,YAAY,MAAA,CAAO;AAAA;AACrB,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,KAAK,MAAM,CAAA;AACtB,IAAA,MAAM,KAAK,eAAA,EAAgB;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,uIAAmC,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,gBAAA;AAEd,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,aAAA,EAAe,OAAO,CAAA;AACrD,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,SAAA,CAAU,aAAA,EAAe,CAAA,EAAG,OAAA,CAAQ,SAAS;AAAA,EAAK,KAAK;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,SAAA,CAAU,aAAA,EAAe,CAAA,EAAG,KAAK;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,GAAkC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAK,GAAI,MAAM,OAAO,aAAkB,CAAA;AAChD,MAAA,MAAMA,KAAAA,CAAK,KAAK,UAAU,CAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AC9FO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,UAAA,EAAW;AACpB;AAEO,SAAS,kBAAkB,EAAA,EAAoB;AACpD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC/B,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,EAAA,EAAI,OAAO,EAAA;AAC9B,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC1G;AAEO,SAAS,cAAA,CAAe,GAAW,CAAA,EAAoB;AAC5D,EAAA,OAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,EAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AACnD;;;ACdO,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;;;ACK1B,IAAM,OAAA,GAAN,MAAM,QAAA,CAAQ;AAAA,EACF,EAAA;AAAA,EAET,YAAY,EAAA,EAAuB;AACzC,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,mBAAmB,CAAA;AAAA,EACpC;AAAA,EAEA,OAAO,KAAK,MAAA,EAAyB;AACnC,IAAA,MAAM,EAAA,GAAK,IAAI,QAAA,CAAS,MAAM,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAI,QAAA,CAAQ,EAAE,CAAA;AAC9B,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,EAAA,CAAG,KAAK,iBAAiB,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,gBAAA,GAA2B;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,OAAA,CAAQ,8DAA8D,EACtE,GAAA,EAAI;AACP,MAAA,OAAO,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EAChB;AAAA;AAAA,EAIA,UAAU,IAAA,EAAiC;AACzC,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,kDAAkD,CAAA,CAAE,IAAI,IAAI,CAAA;AAGxF,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAAA,EAClC;AAAA,EAEA,cAAc,MAAA,EAAmC;AAC/C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,mDAAmD,CAAA,CAAE,IAAI,MAAM,CAAA;AAG3F,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAAA,EAClC;AAAA,EAEA,YAAY,MAAA,EAAkC;AAC5C,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CACf,QAAQ,2CAA2C,CAAA,CACnD,IAAI,MAAM,CAAA;AACb,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,0BAA0B,EAAE,GAAA,EAAI;AAC7D,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,OAAO,MAAA,EAAsC;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAEnD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,QACC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA;AAAA,OAOF,CACC,GAAA;AAAA,QACC,OAAO,YAAA,IAAgB,IAAA;AAAA,QACvB,OAAO,cAAA,IAAkB,IAAA;AAAA,QACzB,MAAA,CAAO,WAAA;AAAA,QACP,OAAO,gBAAA,IAAoB,IAAA;AAAA,QAC3B,MAAA,CAAO,iBAAA;AAAA,QACP,MAAA,CAAO,aAAA;AAAA,QACP,MAAA,CAAO,QAAA;AAAA,QACP,MAAA,CAAO,MAAA;AAAA,QACP,OAAO,YAAA,IAAgB,IAAA;AAAA,QACvB,QAAA,CAAS;AAAA,OACX;AACF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA;AAAA;AAAA;AAAA,mDAAA;AAAA,KAKF,CACC,GAAA;AAAA,MACC,EAAA;AAAA,MACA,MAAA,CAAO,YAAA;AAAA,MACP,OAAO,YAAA,IAAgB,IAAA;AAAA,MACvB,OAAO,cAAA,IAAkB,IAAA;AAAA,MACzB,MAAA,CAAO,WAAA;AAAA,MACP,OAAO,gBAAA,IAAoB,IAAA;AAAA,MAC3B,MAAA,CAAO,iBAAA;AAAA,MACP,MAAA,CAAO,aAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP,OAAO,YAAA,IAAgB;AAAA,KACzB;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAAA,EAC3C;AAAA,EAEA,YAAA,CAAa,IAAY,MAAA,EAA0B;AACjD,IAAA,IAAA,CAAK,GACF,OAAA,CAAQ,6EAA6E,CAAA,CACrF,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,EACnB;AAAA,EAEA,UAAA,CAAW,EAAA,EAAY,IAAA,EAAc,QAAA,EAAgC;AACnE,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,QACC;AAAA,OACF,CACC,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,EAAE,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,QACC;AAAA,OACF,CACC,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,mBAAA,CAAoB,IAAY,UAAA,EAA0B;AACxD,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC;AAAA,KACF,CACC,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AAAA,EACvB;AAAA,EAEA,iBAAA,CAAkB,IAAY,QAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC;AAAA,KACF,CACC,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAAA,EACrB;AAAA,EAEA,OAAO,EAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,qCAAqC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC/D;AAAA;AAAA,EAIA,gBAAgB,IAAA,EAAoC;AAClD,IAAA,MAAM,UAAU,IAAA,CAAK,EAAA,CAAG,QAAQ,4CAA4C,CAAA,CAAE,IAAI,IAAI,CAAA;AAItF,IAAA,IAAI,OAAA,EAAS,OAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAE/C,IAAA,MAAM,OAAA,GAAU,KAAK,EAAA,CAClB,OAAA,CAAQ,iDAAiD,CAAA,CACzD,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAI,CAAA;AAEpB,IAAA,IAAI,OAAA,EAAS,OAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAE/C,IAAA,MAAM,UAAA,GAAa,KAAK,EAAA,CACrB,OAAA,CAAQ,uDAAuD,CAAA,CAC/D,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,CAAK,CAAA;AAErB,IAAA,OAAO,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA,GAAI,IAAA;AAAA,EACxD;AAAA,EAEA,cAAc,MAAA,EAAsC;AAClD,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,QAAQ,qDAAqD,CAAA,CAC7D,IAAI,MAAM,CAAA;AACb,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,GAAI,IAAA;AAAA,EAC1C;AAAA,EAEA,eAAe,KAAA,EAA4B;AACzC,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA,4CAAA;AAAA,KAEF,CACC,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EAC3F;AAAA;AAAA,EAIA,QAAQ,GAAA,EAA4B;AAClC,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,+CAA+C,CAAA,CAAE,IAAI,GAAG,CAAA;AAGpF,IAAA,OAAO,KAAK,KAAA,IAAS,IAAA;AAAA,EACvB;AAAA,EAEA,OAAA,CAAQ,KAAa,KAAA,EAAqB;AACxC,IAAA,IAAA,CAAK,GACF,OAAA,CAAQ,iEAAiE,CAAA,CACzE,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACnB;AAAA;AAAA,EAIA,oBAAA,CAAqB,MAAc,OAAA,EAAiC;AAClE,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,GAAG,OAAA,CAAQ,yCAAyC,EAAE,GAAA,CAAI,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AACzF,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,IAAI,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,mBAAmB,IAAA,EAAgC;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAIA,YAAe,EAAA,EAAgB;AAC7B,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,EAAE,CAAA,EAAE;AAAA,EACjC;AAAA;AAAA,EAIQ,OAAO,GAAA,EAA6B;AAC1C,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,gBAAgB,GAAA,CAAI,gBAAA;AAAA,MACpB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,mBAAmB,GAAA,CAAI,mBAAA;AAAA,MACvB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,eAAe,GAAA,EAAoC;AACzD,IAAA,OAAO;AAAA,MACL,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,IAAI;AAAA,KACzC;AAAA,EACF;AACF;;;AC3QA,IAAM,UAAA,GAAa,qCAAA;AACnB,IAAM,cAAA,GAAiB,2BAAA;AAOhB,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA,uBAAgD,GAAA,EAAI;AAAA,EACpD,gBAAA,GAA4C,IAAA;AAAA,EAEpD,oBAAoB,QAAA,EAAkC;AACpD,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AAAA,EAC1B;AAAA,EAEA,WAAW,UAAA,EAAgE;AACzE,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,kBAAA,CACE,aACA,KAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAA8C;AAAA,MAClD,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM,EAAG,CAAA;AAAE,KACjD;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtD,MAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAE3C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,MAAM,KAAK,CAAA;AAC7D,QAAA,IAAI,SAAA,EAAW,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC3C,QAAA,IAAI,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA,GAAI,QAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,qBAAqB,WAAA,EAA+D;AAClF,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxD,MAAA,MAAM,IAAA,GAAO,OAAA;AACb,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACpC,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,MAAc,KAAA,EAA4C;AAChF,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,WAAA;AACH,QAAA,OAAO,EAAE,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE,EAAG,CAAA,EAAE;AAAA,MAE7D,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,QAAQ,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAErE,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,MAAM,MAAA,CAAO,KAAK,GAAE,EAAE;AAAA,MAE3C,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAC7B,QACA,MAAA,CAAO,KAAK,CAAA,CACT,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AAC1B,QAAA,OAAO,EAAE,YAAA,EAAc,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAmB,EAAE,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAE,CAAE,CAAA,EAAE;AAAA,MAChF;AAAA,MAEA,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,EAAE;AAAA,MAEpC,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,WAAW,KAAA,EAAO;AACnE,UAAA,MAAM,GAAA,GAAM,KAAA;AACZ,UAAA,OAAO,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,GAAA,CAAI,OAAO,GAAA,EAAK,GAAA,CAAI,GAAA,IAAO,IAAA,EAAK,EAAE;AAAA,QAC5D;AACA,QAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,QAAA,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,UAAA,OAAO,EAAE,IAAA,EAAM,EAAE,OAAO,OAAA,EAAS,GAAA,EAAK,MAAK,EAAE;AAAA,QAC/C;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,KAAK,KAAA;AACH,QAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAE9B,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAEhC,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAEvC,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,MAAM,MAAA,CAAO,KAAK,GAAE,EAAE;AAAA,MAE3C,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,QAAA,MAAM,MAA6B,EAAC;AACpC,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AACtC,UAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA,CAAK,gBAAA,EAAkB;AACvC,YAAA,MAAM,SAAS,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,YAAA,IAAI,QAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,QAAQ,CAAA;AAAA,UACrC,CAAA,MAAA,IAAW,GAAA,CAAI,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC1C,YAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,GAAA,EAAK,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,EAAE,QAAA,EAAU,KAAI,GAAI,IAAA;AAAA,MAC9C;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,QAAA,MAAM,SAAA,GAAY,KAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,UAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,UAAA,IAAI,CAAA,CAAE,MAAM,oBAAoB,CAAA,SAAU,EAAE,MAAA,EAAQ,MAAA,EAAiB,EAAA,EAAI,CAAA,EAAE;AAC3E,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AACjB,QAAA,OAAO,UAAU,MAAA,GAAS,CAAA,GAAI,EAAE,MAAA,EAAQ,WAAU,GAAI,IAAA;AAAA,MACxD;AAAA,MAEA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACtD,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACnC,UAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,SAAS,CAAA,EAAG;AACrD,YAAA,MAAM,GAAA,GAAM,CAAA;AACZ,YAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,MAAA,EAAQ,QAAA,EAAU,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAI,EAAE;AAAA,UAClF;AACA,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,YACd,QAAA,EAAU,EAAE,GAAA,EAAK,MAAA,CAAO,CAAC,CAAA;AAAE,WAC7B;AAAA,QACF,CAAC,CAAA;AACD,QAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAAA,MAC3B;AAAA,MAEA,KAAK,cAAA;AAAA,MACL,KAAK,kBAAA;AAAA,MACL,KAAK,YAAA;AAAA,MACL,KAAK,gBAAA;AAAA,MACL,KAAK,SAAA;AAAA,MACL,KAAK,QAAA;AAAA,MACL,KAAK,WAAA;AAAA,MACL,KAAK,cAAA;AACH,QAAA,OAAO,IAAA;AAAA,MAET;AACE,QAAA,OAAO,EAAE,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE,EAAG,CAAA,EAAE;AAAA;AAC/D,EACF;AAAA,EAEQ,gBAAgB,KAAA,EAA4C;AAClE,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,IACzB;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAE,CAAE;AAAA,OACtD;AAAA,IACF;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1B,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,OAAO,KAAA,EAAO,GAAA,EAAK,MAAK,EAAE;AAAA,MAC7C;AACA,MAAA,IAAI,MAAM,UAAA,CAAW,SAAS,KAAK,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,MACtB;AACA,MAAA,OAAO,EAAE,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM,EAAG,CAAA,EAAE;AAAA,IACrD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,IAAA,EAAuD;AAC1E,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AACjB,QAAA,OAAO,GAAA,EAAK,IAAI,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA;AAAA,MACnD;AAAA,MACA,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,QAAA,OAAO,KAAK,IAAA,IAAQ,IAAA;AAAA,MACtB;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,QAAA,OAAO,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,KAAK,EAAC;AAAA,MACvC;AAAA,MACA,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACd,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AACrB,QAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,QAAA,IAAI,OAAA,CAAQ,KAAK,OAAO,EAAE,OAAO,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI;AACjE,QAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACjB;AAAA,MACA,KAAK,KAAA;AACH,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACd,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,OAAO,QAAQ,IAAA,IAAQ,IAAA;AAAA,MACzB;AAAA,MACA,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACd,KAAK,kBAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,OAAO,MAAA,EAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,IAAA,IAAQ,CAAA,CAAE,EAAE,CAAA,IAAK,EAAC;AAAA,MAChD;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAQnB,QAAA,OACE,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACjB,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,GAAA,EAAK,EAAE,IAAA,KAAS,MAAA,GAAS,EAAE,IAAA,EAAM,GAAA,GAAM,EAAE,QAAA,EAAU;AAAA,SACrD,CAAE,KAAK,EAAC;AAAA,MAEZ;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,QAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,QAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MAC7B;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,QAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,CAAA,SAAU,EAAC;AACtC,QAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AACpB,UAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,EAAE,EAAE,CAAA;AACtD,YAAA,IAAI,KAAA,EAAO,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,CAAA;AAAA,UAC9B;AACA,UAAA,OAAO,CAAA,CAAE,EAAA;AAAA,QACX,CAAC,CAAA;AAAA,MACH;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,QAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,UAAA,OAAO,IAAI,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,QAClD;AACA,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA;AAAA,MAChC;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AACjB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,QAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA,CAAA,GAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,MACvE;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC3B,QAAA,OAAO,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,EAAA,IAAM,IAAA;AAAA,MACnC;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,IAAA,CAAK,YAAA;AACf,QAAA,OAAO,GAAG,KAAA,IAAS,IAAA;AAAA,MACrB;AAAA,MACA;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AACF;;;AC9RO,IAAM,eAAN,MAAmB;AAAA,EACP,MAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA,GAAiB,IAAI,cAAA,EAAe;AAAA,EAErD,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,MACvB,MAAM,OAAA,CAAQ,KAAA;AAAA,MACd,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,iBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,QAAQ,MAAA,EAA6C;AACzD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,QAAQ;AAAA,KACtD;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAMe;AAC9B,IAAA,MAAM,MAAA,GACJ,MAAA,CAAO,UAAA,KAAe,UAAA,GAClB,EAAE,WAAA,EAAa,MAAA,CAAO,QAAA,EAAS,GAC/B,EAAE,OAAA,EAAS,MAAA,CAAO,QAAA,EAAS;AAEjC,IAAA,MAAM,UAAA,GACJ,OAAO,UAAA,KAAe,MAAA,GAClB,EAAE,KAAA,EAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAA,EAAS,OAAO,KAAA,EAAM,EAAG,CAAA,EAAE,EAAE,GACxD,MAAA,CAAO,UAAA,IAAwB;AAAA,MAC/B,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAA,EAAM,EAAG,CAAA;AAAE,KACxD;AAEN,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,MAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAU,MAAA,CAAO;AAAA,OAClB;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,MAAA,EAMG;AAC9B,IAAA,MAAM,MAAA,GACJ,MAAA,CAAO,UAAA,KAAe,UAAA,GAClB,EAAE,WAAA,EAAa,MAAA,CAAO,QAAA,EAAS,GAC/B,EAAE,OAAA,EAAS,MAAA,CAAO,QAAA,EAAS;AAEjC,IAAA,MAAM,UAAA,GACJ,OAAO,UAAA,KAAe,MAAA,GAClB,EAAE,KAAA,EAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAA,EAAS,OAAO,KAAA,EAAM,EAAG,CAAA,EAAE,EAAE,GACxD,MAAA,CAAO,UAAA,IAAwB;AAAA,MAC/B,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAA,EAAM,EAAG,CAAA;AAAE,KACxD;AAEN,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,MAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAU,MAAA,CAAO;AAAA,OAClB;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CACJ,MAAA,EACA,UAAA,EAC6B;AAC7B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,OAAA,EAAS,MAAA;AAAA,QACT;AAAA,OACD;AAAA,KACL;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,gBAAgB,MAAA,EAA+C;AACnE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,CAAiB,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,mBAAA,CAAoB,MAAA,EAAgB,QAAA,EAAiD;AACzF,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MAAc,MACxB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe;AAAA,QAC/B,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,iBAAA;AAAA,QACN,eAAA,EAAiB;AAAA,UACf,OAAA,EAAS,QAAA;AAAA,UACT,sBAAA,EAAwB;AAAA;AAC1B,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,yBAAA,CACJ,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MAAc,MACxB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe;AAAA,QAC/B,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,gBAAA;AAAA,QACN,cAAA,EAAgB;AAAA,UACd,eAAA,EAAiB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACnC,SAAS,CAAA,CAAE,MAAA;AAAA,YACX,SAAS,CAAA,CAAE,MAAA;AAAA,YACX,mBAAA,EAAqB,EAAE,UAAA,IAAc;AAAA,WACvC,CAAE,CAAA;AAAA,UACF,sBAAA,EAAwB;AAAA;AAC1B,OACD;AAAA,KACH;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,QAAA,CACJ,MAAA,EACA,WAAA,EACA,aAAA,EAC6B;AAC7B,IAAA,MAAM,MAAA,GACJ,kBAAkB,UAAA,GAAa,EAAE,aAAa,WAAA,EAAY,GAAI,EAAE,OAAA,EAAS,WAAA,EAAY;AACvF,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,OAAA,EAAS,MAAA;AAAA,QACT;AAAA,OACQ;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,kBACJ,UAAA,EACuD;AACvD,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MAClC,KAAK,MAAA,CAAO,SAAA,CAAU,SAAS,EAAE,WAAA,EAAa,YAAY;AAAA,KAC5D;AACA,IAAA,MAAM,aACJ,EAAA,CACA,UAAA;AACF,IAAA,MAAM,SAAuD,EAAC;AAC9D,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,MAAA,CAAO,IAAI,IAAI,EAAE,EAAA,EAAI,KAAK,EAAA,EAAI,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,IAChD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,CACJ,UAAA,EACA,OAAA,EACuE;AACvE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACxC,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM;AAAA,QAC5B,cAAA,EAAgB,UAAA;AAAA,QAChB,cAAc,OAAA,EAAS,WAAA;AAAA,QACvB,SAAA,EAAW,SAAS,QAAA,IAAY;AAAA,OACjC;AAAA,KACH;AACA,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,MAAA,EAA+B;AAC/C,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAAA,EAC9F;AAAA;AAAA,EAIA,MAAM,YAAA,CACJ,OAAA,EACA,OAAA,EAIC;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACxC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,QAC/B,QAAA,EAAU,OAAA;AAAA,QACV,cAAc,OAAA,EAAS,WAAA;AAAA,QACvB,SAAA,EAAW,SAAS,QAAA,IAAY;AAAA,OACjC;AAAA,KACH;AACA,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAAA,EAAiD;AACtE,IAAA,MAAM,SAAgC,EAAC;AACvC,IAAA,IAAI,MAAA;AAEJ,IAAA,GAAG;AACD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,WAAA,EAAa,QAAQ,CAAA;AACzE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAgC,MAAA,IAAU,CAAC,CAAC,CAAA;AACpF,MAAA,MAAA,GAAS,SAAS,UAAA,IAAc,MAAA;AAAA,IAClC,CAAA,QAAS,MAAA;AAET,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,CAAe,OAAA,EAAiB,QAAA,EAAoC;AACxE,IAAA,MAAM,UAAA,GAAa,GAAA;AACnB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,UAAA,EAAY;AACpD,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,UAAU,CAAA;AAC9C,MAAA,MAAM,IAAA,CAAK,aAAA;AAAA,QAAc,MACvB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,MAAA,CAAO;AAAA,UACjC,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAA,EAAgC;AAChD,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,EAAE,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAAA,EACjF;AAAA;AAAA,EAIA,MAAM,UAAA,CAAW,QAAA,EAAgB,QAAA,EAAkB,WAAA,EAAsC;AACvF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACtC,KAAK,MAAA,CAAO,WAAA,CAAY,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,WAAA,EAAa;AAAA,KACxE;AAEA,IAAA,MAAM,eAAgB,MAAA,CAAqC,EAAA;AAE3D,IAAA,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACvB,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK;AAAA,QAC3B,cAAA,EAAgB,YAAA;AAAA,QAChB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA;AAAS,OAClC;AAAA,KACH;AAEA,IAAA,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACvB,KAAK,MAAA,CAAO,WAAA,CAAY,SAAS,EAAE,cAAA,EAAgB,cAAc;AAAA,KACnE;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAO,MAAA,EAK6D;AACxE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACxC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,QACjB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,cAAc,MAAA,CAAO,WAAA;AAAA,QACrB,SAAA,EAAW,OAAO,QAAA,IAAY;AAAA,OAC/B;AAAA,KACH;AACA,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,QAAA,EAAiD;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AACnD,IAAA,MAAM,kBAAkB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAEpE,IAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE1C,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,uBAAuB,QAAA,EAAiD;AAC5E,IAAA,MAAM,MAA4B,EAAC;AACnC,IAAA,IAAI,YAAA,GAAyB,CAAC,QAAQ,CAAA;AAEtC,IAAA,OAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,aAAA,CAAc,EAAE,CAAC,CAAC,CAAA;AACtF,MAAA,MAAM,YAAsB,EAAC;AAE7B,MAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,QAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,UAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AACd,UAAA,SAAA,CAAU,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,QACzB;AAAA,MACF;AAEA,MAAA,YAAA,GAAe,SAAA;AAAA,IACjB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIA,aAAa,IAAA,EAAkC;AAC7C,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAInB,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACvC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,KAAA,EAAO;AACvC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAChE,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,2BAAA;AAAA,EACT;AAAA,EAEA,kBAAkB,IAAA,EAAmD;AACnE,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,oBAAA,CAAqB,IAAA,CAAK,UAAqC,CAAA;AAAA,EAC5F;AAAA;AAAA,EAIA,MAAc,cAAiB,EAAA,EAAkC;AAC/D,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,CAAoB,EAAA,EAAsB,OAAA,GAAkB,CAAA,EAAe;AACvF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,WAAA,CAAY,KAAK,CAAA,IAAK,OAAA,GAAU,CAAA,EAAG;AACrC,QAAA,MAAM,SAAA,GAAY,kBAAkB,KAAK,CAAA,IAAK,MAAO,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AACxE,QAAA,MAAM,MAAA,GAAS,SAAA,IAAa,GAAA,GAAM,IAAA,CAAK,QAAO,GAAI,GAAA,CAAA;AAClD,QAAA,MAAM,MAAM,MAAM,CAAA;AAClB,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,EAAA,EAAI,OAAA,GAAU,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,EAAA,IAAI,IAAA,KAAS,iCAAA,IAAqC,IAAA,KAAS,YAAA,IAAgB,SAAS,WAAA,EAAa;AAC/F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,EAAE,QAAA,IAAY,KAAA,CAAA,EAAQ,OAAO,KAAA;AACjC,EAAA,MAAM,SAAU,KAAA,CAA6B,MAAA;AAC7C,EAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,KAAW,GAAA;AAC1E;AAEA,SAAS,kBAAkB,KAAA,EAA+B;AACxD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,aAAa,KAAA,EAAO;AACrE,IAAA,MAAM,UAAW,KAAA,CAA8C,OAAA;AAC/D,IAAA,MAAM,UAAA,GAAa,UAAU,aAAa,CAAA;AAC1C,IAAA,IAAI,UAAA,EAAY,OAAO,MAAA,CAAO,UAAU,CAAA,GAAI,GAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACpZA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAID,SAAS,UAAU,KAAA,EAA4B;AAC7C,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,GAAQ,SAAA;AAC3C;AAgDO,IAAM,kBAAA,GAAN,MAAM,mBAAA,CAAmB;AAAA;AAAA,EAG9B,OAAO,QAAA,CAAS,OAAA,EAAiB,OAAA,EAAsD;AACrF,IAAA,MAAM,OAAA,GAA8D,EAAE,OAAA,EAAQ;AAC9E,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,IAAA,GAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,IAAA,EAAK;AAAA,IACrC;AACA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,SAAS,IAAA,IAAQ,KAAA;AAAA,UACvB,MAAA,EAAQ,SAAS,MAAA,IAAU,KAAA;AAAA,UAC3B,SAAA,EAAW,SAAS,SAAA,IAAa,KAAA;AAAA,UACjC,aAAA,EAAe,SAAS,aAAA,IAAiB,KAAA;AAAA,UACzC,IAAA,EAAM,SAAS,IAAA,IAAQ,KAAA;AAAA,UACvB,KAAA,EAAO,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,SAAS;AAAA;AAC9C;AACF,KACF;AAAA,EACF;AAAA,EAEA,OAAO,cAAc,QAAA,EAA+C;AAClE,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,MAAA,MAAM,OAAA,GAA8D;AAAA,QAClE,SAAS,GAAA,CAAI;AAAA,OACf;AACA,MAAA,IAAI,IAAI,IAAA,EAAM;AACZ,QAAA,OAAA,CAAQ,IAAA,GAAO,EAAE,GAAA,EAAK,GAAA,CAAI,IAAA,EAAK;AAAA,MACjC;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,UAClB,MAAA,EAAQ,IAAI,MAAA,IAAU,KAAA;AAAA,UACtB,SAAA,EAAW,IAAI,SAAA,IAAa,KAAA;AAAA,UAC5B,aAAA,EAAe,IAAI,aAAA,IAAiB,KAAA;AAAA,UACpC,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,UAClB,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,KAAA,IAAS,SAAS;AAAA;AACzC,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,iBAAiB,UAAA,EAA8C;AACpE,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,EAAE,UAAA,IAAc,CAAA;AAAA,EACxD;AAAA,EAEA,OAAO,oBAAoB,MAAA,EAAyC;AAClE,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,EAAO,IAAK,CAAA;AAAA,EAC9E;AAAA,EAEA,OAAO,mBAAA,CAAoB,KAAA,EAAe,GAAA,EAAuC;AAC/E,IAAA,MAAM,IAAA,GAAwC,EAAE,KAAA,EAAM;AACtD,IAAA,IAAI,GAAA,OAAU,GAAA,GAAM,GAAA;AACpB,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,EAAG,CAAA;AAAA,EAC9D;AAAA;AAAA,EAIA,OAAO,SAAA,CAAU,QAAA,EAA0B,KAAA,EAA6B;AACtE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAW,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,SAAS,CAAA;AAAE,KACzE;AAAA,EACF;AAAA,EAEA,OAAO,OAAA,CACL,KAAA,EACA,QAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,SAAS,CAAA;AAAA,MAC5C,aAAA,EAAe,SAAS,YAAA,IAAgB;AAAA,KAC1C;AACA,IAAA,IAAI,OAAA,EAAS,YAAA,IAAgB,OAAA,EAAS,QAAA,EAAU;AAC9C,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B;AACA,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAS,IAAA,EAAM,KAAK,CAAC,GAAG,GAAG,IAAA,EAAK;AAAA,EACnD;AAAA,EAEA,OAAO,OAAA,CACL,QAAA,EACA,IAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAQ,WAAA,EAAY;AAAA,MAClD,KAAA,EAAO,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,SAAS;AAAA,KAC9C;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,EAC3D;AAAA,EAEA,OAAO,MAAA,CAAO,QAAA,EAA0B,QAAA,EAA0B,KAAA,EAA6B;AAC7F,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,QAAQ,IAAA,EAAK;AAAA,EACzD;AAAA,EAEA,OAAO,gBAAA,CACL,QAAA,EACA,QAAA,EACA,KAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,oBAAA;AAAA,MACN,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAAA,EAEA,OAAO,gBAAA,CACL,QAAA,EACA,QAAA,EACA,KAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,oBAAA;AAAA,MACN,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAAA,EAEA,OAAO,IAAA,CAAK,QAAA,EAA0B,OAAA,EAAmB,KAAA,EAA6B;AACpF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,QAAA;AAAA,QACX,SAAS,OAAA,IAAW,KAAA;AAAA,QACpB,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA;AACrC,KACF;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,CAAM,QAAA,EAA0B,QAAA,EAA0B,KAAA,EAA6B;AAC5F,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,OAAA,GAAuB;AAC5B,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,EAAW,OAAA,EAAS,EAAC,EAAE;AAAA,EACzD;AAAA,EAEA,OAAO,IAAA,CAAK,IAAA,EAAc,QAAA,EAAmB,OAAA,EAA+B;AAC1E,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,mBAAA,CAAmB,QAAA,CAAS,IAAI,CAAA;AAAA,MAC3C,UAAU,QAAA,IAAY;AAAA,KACxB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,EAAK;AAAA,EACrD;AAAA,EAEA,OAAO,cAAc,UAAA,EAAiC;AACpD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,UAAA;AAAW,KACzB;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,QAAA,CAAS,GAAA,EAAa,OAAA,EAA+B;AAC1D,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAA,EAAI;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,SAAA,CAAU,GAAA,EAAa,IAAA,EAAe,OAAA,EAA+B;AAC1E,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AACtB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,EAAK;AAAA,EACrD;AAAA,EAEA,OAAO,GAAA,CAAI,GAAA,EAAa,OAAA,EAA+B;AACrD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAK,IAAA,EAAK;AAAA,EACnD;AAAA,EAEA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAA,EAAI;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA;AAAA,EAIA,OAAO,gBAAgB,KAAA,EAA6B;AAClD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,mBAAA;AAAA,MACN,mBAAmB,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS,CAAA;AAAE,KAC5D;AAAA,EACF;AAAA,EAEA,OAAO,UAAA,GAA0B;AAC/B,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,YAAA,EAAc,UAAA,EAAY,EAAC,EAAE;AAAA,EAC/D;AAAA,EAEA,OAAO,WAAW,OAAA,EAAuC;AACvD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,MAC3C,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA;AAAU,KAChC,CAAE,CAAA;AACF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,EAAE,QAAA;AAAS,KAC1B;AAAA,EACF;AAAA,EAEA,OAAO,oBAAoB,QAAA,EAAsC;AAC/D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,YAAA,EAAc,EAAE,WAAA,EAAa,IAAA,EAAM,QAAA;AAAS,KAC9C;AAAA,EACF;AAAA,EAEA,OAAO,qBAAqB,eAAA,EAAsC;AAChE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,cAAc,EAAE,WAAA,EAAa,EAAE,QAAA,EAAU,iBAAgB;AAAE,KAC7D;AAAA,EACF;AAAA,EAEA,OAAO,WAAW,MAAA,EAA6B;AAC7C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,MAAA;AAAO,KACnD;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,CAAM,IAAA,EAAkB,eAAA,EAA2B,YAAA,EAAqC;AAC7F,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAG,MAAA;AACvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,CAAC,SAAS,mBAAA,CAAmB,QAAA,CAAS,IAAI,CAAC,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,SAAS,KAAA,EAAO;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAmB,QAAA,CAAS,EAAE,CAAC,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,EAAE,KAAA;AAAM,OACrB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,KAAA;AAAA,QACb,mBAAmB,eAAA,IAAmB,IAAA;AAAA,QACtC,gBAAgB,YAAA,IAAgB,KAAA;AAAA,QAChC,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF;ACraO,SAAS,YAAY,OAAA,EAAyB;AACnD,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACnE;AAEO,SAAS,kBAAkB,MAAA,EAAwB;AACxD,EAAA,OAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACzD;;;ACEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,OAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAmB;AAAA,EAAnB,OAAA;AAAA,EAE7B,mBAAmB,YAAA,EAAyC;AAC1D,IAAA,MAAM,UAAyB,EAAC;AAChC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,IAAI,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,IAAI,CAAA;AAE/C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAAA,UACrC,YAAA,EAAc;AAAA,SACf,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,iBAAA,IAAqB,IAAA,CAAK,KAAA,KAAU,OAAO,iBAAA,EAAmB;AACvE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAC5C,MAAA,IAAI,MAAA,CAAO,gBAAgB,WAAA,EAAa;AACtC,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAM,UAAA;AAAA,UACN,WAAA;AAAA,UACA,cAAc,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAA;AACvD,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC3C,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,aAAA,IAAiB,MAAA,CAAO,aAAa,aAAA,EAAe;AAC1E,UAAA,IAAI,CAAC,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,EAAG;AAAA,QAC5C;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,MAAA,CAAO,YAAA;AAAA,UACb,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,EAAA;AAAA,UACb,cAAc,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA,EAEQ,YAAY,OAAA,EAAuC;AACzD,IAAA,MAAM,SAAwB,EAAC;AAC/B,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAC1D,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA;AAEjF,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AAEvC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA;AAAA,QACpB,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,GAAA,CAAI,gBAAgB,CAAC,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,IAAI;AAAA,OACzE;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,cAAA,CAAe,GAAA,CAAI,MAAM,IAAI,CAAA;AAC7B,QAAA,cAAA,CAAe,GAAA,CAAI,IAAI,IAAI,CAAA;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAA,EAAM,OAAA;AAAA,UACN,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,WAAW,GAAA,CAAI;AAAA,SAChB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,eAAe,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,eAAe,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAErB,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC7FA,IAAM,aAAA,GAAwB;AAAA,EAC5B,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,QAAQ,IAAA,CAAK,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACjD,KAAA,EAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,QAAQ,KAAA,CAAM,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACnD,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,QAAQ,IAAA,CAAK,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACjD,OAAO,MAAM;AAAA,EAAC;AAChB,CAAA;AAEA,IAAI,aAAA,GAAwB,aAAA;AAErB,SAAS,UAAU,MAAA,EAAsB;AAC9C,EAAA,aAAA,GAAgB,MAAA;AAClB;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,aAAA;AACT;;;ACZO,IAAM,qBAAN,MAAyB;AAAA,EACb,gBAA6B,EAAC;AAAA,EAC9B,iBAA8B,EAAC;AAAA,EAEhD,qBAAqB,SAAA,EAA4B;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,EACrD;AAAA,EAEA,sBAAsB,SAAA,EAA4B;AAChD,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,SAAS,CAAA;AAClC,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,EACtD;AAAA,EAEA,WAAW,OAAA,EAAiC;AAC1C,IAAA,MAAM,WAAA,GAAc,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AAC5D,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA;AAEtE,IAAA,IAAI,WAAA,IAAe,mBAAmB,gBAAA,EAAkB;AACtD,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEA,eAAA,CAAgB,UAAkB,OAAA,EAA8C;AAC9E,IAAA,IAAI,KAAA,GAAwB;AAAA,MAC1B,OAAA,EAAS,QAAA;AAAA,MACT,UAAU,EAAC;AAAA,MACX;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,aAAA,EAAe;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACtC,QAAA,KAAA,GAAQ;AAAA,UACN,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,2BAA2B,KAAK,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,KAAA,CAAM,QAAA,CAAS,UAAA,IAA0C,EAAC;AAAA,MACvE,MAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,MAAA,IAAU,EAAC;AAAA,MAClC,eAAA,EAAiB,KAAA,CAAM,QAAA,CAAS,eAAA,IAAmB;AAAC,KACtD;AAAA,EACF;AAAA,EAEA,iBAAA,CACE,OAAA,EACA,OAAA,EACA,QAAA,EACQ;AACR,IAAA,IAAI,KAAA,GAAwB;AAAA,MAC1B,OAAA;AAAA,MACA,QAAA,EAAU,YAAY,EAAC;AAAA,MACvB;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,cAAA,EAAgB;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACtC,QAAA,KAAA,GAAQ;AAAA,UACN,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,4BAA4B,KAAK,CAAA;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACF;ACvFO,IAAM,uBAAN,MAAgD;AAAA,EAC5C,IAAA,GAAO,sBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA,CAAO,MAAM,OAAO,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,MACtB,QAAA,EAAU;AAAA,QACR,GAAG,KAAA,CAAM,QAAA;AAAA,QACT,UAAA,EAAY;AAAA;AACd,KACF;AAAA,EACF;AACF;;;ACVA,IAAMC,eAAAA,GAAiB,yCAAA;AAIhB,IAAM,mBAAN,MAA4C;AAAA,EAIjD,YAA6B,OAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA+B;AAAA,EAA/B,OAAA;AAAA,EAHpB,IAAA,GAAO,kBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAIjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,eAAA,GAAoC,KAAA,CAAM,QAAA,CAAS,eAAA,GACrD,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,GAClC,EAAC;AAEL,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,OAAA;AAAA,MAC7BA,eAAAA;AAAA,MACA,CAAC,MAAA,EAAQ,MAAA,EAAgB,OAAA,KAAqB;AAC5C,QAAA,MAAM,QAAQ,OAAA,IAAW,MAAA;AAEzB,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACjC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAO,CAAA,kBAAA,EAAqB,KAAA,CAAM,YAAY,CAAA,EAAA,EAAK,KAAK,CAAA,eAAA,CAAA;AAAA,UAC1D;AAAA,QACF;AAEA,QAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,UACnB,IAAA,EAAM,UAAA;AAAA,UACN,MAAA,EAAQ,UAAU,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAQ,GAAI,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,UAC7D,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,MAAM,aAAA,GAAgB,mBAAmB,MAAM,CAAA;AAC/C,QAAA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,0BAAA,EAA6B,aAAa,CAAA,CAAA,CAAA;AAAA,MAC5D;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,eAAA;AAAgB,KACjD;AAAA,EACF;AACF;;;ACrDA,IAAM,aAAA,GAAgB,iCAAA;AAEtB,IAAM,iBAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,OAAA,EAAS,WAAA;AAAA,EACT,IAAA,EAAM,cAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS,QAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK,QAAA;AAAA,EACL,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,KAAA,EAAO,WAAA;AAAA,EACP,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,WAAA;AAAA,EACT,KAAA,EAAO,WAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,qBAAN,MAA8C;AAAA,EAC1C,IAAA,GAAO,oBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,cAAA,EAAgB;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA;AAAA,MAC5B,aAAA;AAAA,MACA,CAAC,MAAA,EAAQ,IAAA,EAAc,QAAA,EAA8B,KAAA,KAA8B;AACjF,QAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,WAAA;AACvD,QAAA,MAAM,SAAA,GAAY,KAAA,EAAO,IAAA,EAAK,IAAK,IAAA;AACnC,QAAA,MAAM,WAAW,QAAA,GACb;AAAA,6BAAA,EAAkC,IAAI,CAAA,UAAA,EAAa,QAAA,KAAa,GAAA,GAAM,MAAA,GAAS,QAAQ,CAAA,GAAA,CAAA,GACvF;AAAA,6BAAA,EAAkC,IAAI,CAAA,GAAA,CAAA;AAE1C,QAAA,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,GAAA,EAAM,SAAS,KAAK,QAAQ,CAAA,CAAA;AAAA,MAC/C;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;;;ACpDA,IAAM,gBAAA,GAAmB,qBAAA;AACzB,IAAM,iBAAA,GAAoB,iCAAA;AAEnB,IAAM,iBAAN,MAA0C;AAAA,EACtC,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,CAAC,QAAQ,QAAA,KAAqB;AACxE,MAAA,OAAO,CAAA;AAAA,EAAO,QAAA,CAAS,MAAM;AAAA,EAAA,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,QAAQ,QAAA,KAAqB;AACzE,MAAA,OAAO,CAAA,CAAA,EAAI,QAAA,CAAS,IAAA,EAAM,CAAA,CAAA,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;;;ACtBA,IAAM,oBAAA,GAAuB,oBAAA;AAC7B,IAAM,oBAAA,GAAuB,2BAAA;AAE7B,IAAM,WAAA,GAAc,CAAC,aAAA,EAAe,UAAA,EAAY,WAAW,CAAA;AAEpD,IAAM,gBAAN,MAAyC;AAAA,EACrC,IAAA,GAAO,eAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,MAAA,GAA2B,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAAI,EAAC;AACvF,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA;AAE3C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,oBAAA,EAAsB,CAAC,QAAQ,MAAA,KAAmB;AACpF,MAAA,IAAI,WAAA,CAAY,MAAM,CAAA,EAAG;AACvB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,WAAW,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AACjE,QAAA,IAAI,MAAA,IAAU,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AACpC,UAAA,MAAM,WAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC5C,UAAA,OAAO,eAAQ,QAAQ;AAAA,8BAAA,EAAmC,MAAM,CAAA,GAAA,CAAA;AAAA,QAClE;AACA,QAAA,OAAO,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,MAC1C;AACA,MAAA,MAAM,OAAA,GAAU,mBAAmB,MAAM,CAAA;AACzC,MAAA,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA,CAAA;AAAA,IACpD,CAAC,CAAA;AAED,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,oBAAA,EAAsB,CAAC,MAAA,EAAQ,KAAa,GAAA,KAAgB;AACpF,MAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,QAAA,OAAO,CAAA,qCAAA,EAAwC,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,CAAA,EAAS,GAAA,IAAO,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,MACvG;AACA,MAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,UAAA,EAAY,MAAM,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACzB,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,MAAA;AAAO,KACxC;AAAA,EACF;AACF;AAEA,SAAS,YAAY,IAAA,EAAuB;AAC1C,EAAA,OAAO,yCAAA,CAA0C,KAAK,IAAI,CAAA;AAC5D;AAEA,SAAS,WAAW,GAAA,EAAsB;AACxC,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,SAAS,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA;AACtD;AAEA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,OAAO,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,GAAA,CAAI,WAAW,UAAU,CAAA;AAC/D;;;ACrDA,IAAM,YAAA,GAAe,0CAAA;AAEd,IAAM,0BAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,yBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,OAAA,GAA4B,KAAA,CAAM,QAAA,CAAS,eAAA,GAC7C,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,GAClC,EAAC;AAEL,IAAA,MAAM,UAAU,CAAC,GAAG,MAAM,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAC,CAAA;AACxD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACb,MAAA,EAAQ,iBAAA,CAAkB,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,QACnC,YAAY,KAAA,CAAM;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAU,EAAE,GAAG,KAAA,CAAM,QAAA,EAAU,iBAAiB,OAAA;AAAQ,KAC1D;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAA,EAA6C;AACtE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,IACzE;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACrCA,IAAM,yBAAA,GAA4B,wDAAA;AAE3B,IAAM,2BAAN,MAAoD;AAAA,EAChD,IAAA,GAAO,0BAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,2BAA2B,EAAE,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1C,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;ACjBO,IAAM,0BAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,yBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAA,KAAe,UAAA,EAAY;AAC3C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,UAAA;AAClC,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,gBAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,aAAA,CAAc,GAAG,CAAA,GAAI,KAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAUC,MAAAA,CAAO,SAAA,CAAU,EAAA,EAAI,aAAa,EAAE,IAAA,EAAK;AACzD,IAAA,MAAM,WAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAC3C,IAAA,MAAM,SAAA,GAAY,yCAAyC,QAAA,GAAW,OAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,SAAA,GAAY,aAAA,GAAgB,KAAA,CAAM,OAAA;AAElD,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;;;ACpCA,IAAM,eAAA,GAAkB,qBAAA;AAExB,IAAM,gBAAA,GAAmB,yDAAA;AAEzB,IAAM,wBAAA,GACJ,iFAAA;AAEK,IAAM,yBAAN,MAAkD;AAAA,EAC9C,IAAA,GAAO,wBAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,wBAAA,EAA0B,CAAC,EAAA,EAAI,MAAA,EAAgB,SAAiB,IAAI,CAAA;AAE9F,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,EAAA,EAAI,SAAiB,IAAI,CAAA;AAErE,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,gBAAA,EAAkB,CAAC,EAAA,EAAI,MAAA,EAAgB,SAAiB,IAAI,CAAA;AAEtF,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;;;AC1BA,IAAM,iBAAA,GACJ,+EAAA;AAEF,IAAM,uBAAA,GAA0B,qDAAA;AAEhC,IAAM,oBAAA,GAAuB,kDAAA;AAEtB,IAAM,oBAAN,MAA6C;AAAA,EACzC,IAAA,GAAO,mBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,OAAA,CAAQ,QAAQ,iBAAA,EAAmB,CAAC,QAAQ,OAAA,KAAoB,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,CAAI,CAAA;AAE1F,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,uBAAA;AAAA,MACA,CAAC,MAAA,EAAQ,OAAA,EAAiB,aAAA,KAA0B;AAClD,QAAA,MAAM,MAAA,GAAS,mBAAmB,aAAa,CAAA;AAC/C,QAAA,OAAO,MAAA,KAAW,UAAU,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,OAAO,CAAA,EAAA,CAAA;AAAA,MACtE;AAAA,KACF;AAEA,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,oBAAA;AAAA,MACA,CAAC,MAAA,EAAQ,QAAA,EAAkB,aAAA,KAA0B;AACnD,QAAA,MAAM,MAAA,GAAS,mBAAmB,aAAa,CAAA;AAC/C,QAAA,OAAO,MAAM,MAAM,CAAA,EAAA,CAAA;AAAA,MACrB;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;;;AC7BO,IAAM,yBAAN,MAAkD;AAAA,EAC9C,IAAA,GAAO,wBAAA;AAAA,EACP,KAAA,GAAQ,GAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,eAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAEpF,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,IAC7C;AAEA,IAAA,MAAM,WAAA,GAAc,eAAe,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAClE,IAAA,MAAM,MAAA,GAAS,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAQ,GAAI,MAAA,GAAS,IAAA;AAEvC,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AAAA,EAEQ,aAAa,MAAA,EAAgC;AACnD,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,CACxC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,CAAA,CAC/C,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,OAAO,CAAA,gBAAA,EAAmB,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,CAAA;AAAA,EACjD;AACF;;;ACxCA,IAAM,cAAA,GAAyC;AAAA,EAC7C,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,UAAA;AAAA,EACb,cAAA,EAAoB,MAAA;AAAA,EACpB,WAAA,EAAa,KAAA;AAAA,EACb,QAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAY,UAAA;AAAA,EACZ,cAAA,EAAoB,SAAA;AAAA,EACpB,QAAA,EAAY,SAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,WAAA,EAAa,KAAA;AAAA,EACb,WAAA,EAAa,SAAA;AAAA,EACb,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,sBAAA,GAAyB,oEAAA;AAExB,IAAM,kBAAN,MAA2C;AAAA,EACvC,IAAA,GAAO,iBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,MAAc,QAAA,KAAsB;AAC7F,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,QAAA,GAAW,QAAA,KAAa,MAAA,GAAS,GAAA,GAAM,GAAA;AAC7C,QAAA,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,MAC9B;AACA,MAAA,OAAO,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC1D,MAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,YAAY,KAAK,CAAC,sBAAsB,GAAG,CAAA;AAC3E,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,CAAC,QAAQ,KAAA,KAAkB;AAC5D,QAAA,IAAI,KAAA,CAAM,WAAA,EAAY,KAAM,IAAA,EAAM;AAChC,UAAA,OAAO,OAAO,IAAI,CAAA,CAAA,CAAA;AAAA,QACpB;AACA,QAAA,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,MAC9B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;AAEA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;;;ACnDA,IAAM,kBAAA,GACJ,iFAAA;AAEK,IAAM,iBAAN,MAA0C;AAAA,EACtC,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA;AAAA,MAC5B,kBAAA;AAAA,MACA,CAAC,MAAA,EAAQ,KAAA,EAAe,IAAA,KAAiB;AACvC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,GACzC,CAAA,OAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,KAAK,CAAC,CAAA,CAAA,GAC7C,UAAU,KAAK,CAAA,CAAA;AACnB,QAAA,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,OAAA,CAAA;AAAA,MAC1C;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;ACtBO,IAAM,uBAAN,MAAgD;AAAA,EAC5C,IAAA,GAAO,sBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,UAAA;AAElC,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAa,oBAAoB,UAAU,CAAA;AACjD,IAAA,MAAM,OAAA,GAAUA,MAAAA,CAAO,SAAA,CAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAyD;AACpF,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,UAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAyB;AAC/C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,WAAW,KAAA,EAAO;AACnE,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,KAAA,EAAO,aAAA,CAAc,OAAA,CAAQ,KAAK,CAAA;AAAA,MAClC,GAAI,OAAA,CAAQ,GAAA,GAAM,EAAE,GAAA,EAAK,cAAc,OAAA,CAAQ,GAAG,CAAA,EAAE,GAAI;AAAC,KAC3D;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,WAAA,GAAc,4CAAA;AAEpB,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAAA,EAClC;AACA,EAAA,OAAO,OAAA;AACT;;;ACjEA,IAAM,wBAAA,GACJ,mEAAA;AAEK,IAAM,qBAAN,MAA8C;AAAA,EAC1C,IAAA,GAAO,oBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,wBAAA,EAA0B,CAAC,QAAQ,MAAA,KAAmB;AAC1F,MAAA,OAAO,MAAM,MAAM,CAAA,EAAA,CAAA;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;ACjBA,IAAM,qBAAA,GAAwB,iEAAA;AAE9B,IAAM,kBAAA,GACJ,iGAAA;AAEK,IAAM,0BAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,yBAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,qBAAqB,CAAA;AAC3D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EAC5D;AAAA,EAEQ,eAAA,CAAgB,OAAuB,KAAA,EAA0C;AACvF,IAAA,MAAM,WAAA,GAAc,MAAM,CAAC,CAAA;AAC3B,IAAA,MAAM,YAAA,GAAe,CAAA;AAAA,EAAQ,WAAW,CAAA;AAAA,CAAA;AAExC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAASA,OAAO,YAAY,CAAA;AAClC,MAAA,MAAA,GAAS,MAAA,CAAO,IAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,GAAI,MAAM,QAAA,CAAS,UAAA;AAAA,MACnB,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,qBAAA,EAAuB,EAAE,EAAE,SAAA,EAAU;AAE3E,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,UAAA;AAAW,KAC5C;AAAA,EACF;AAAA,EAEQ,gBAAA,CAAiB,OAAuB,KAAA,EAA0C;AACxF,IAAA,MAAM,OAAO,KAAA,CAAM,CAAC,EAAG,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AACxC,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,GAAI,MAAM,QAAA,CAAS;AAAA,KACrB;AAEA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,GAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,MAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,QAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,QAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,gBAAA,CAAiB,QAAQ,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,kBAAA,EAAoB,EAAE,EAAE,SAAA,EAAU;AAExE,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,UAAA;AAAW,KAC5C;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,GAAA,EAAsB;AAC9C,EAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,GAAA,KAAQ,MAAA,EAAQ,OAAO,IAAA;AACzC,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,IAAA;AAC3B,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,KAAA;AAE5B,EAAA,MAAM,QAAA,GAAW,YAAY,GAAG,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,OAAO,QAAQ,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAM,GAAG,CAAA,IAAK,SAAS,IAAA,EAAK,KAAM,IAAI,OAAO,GAAA;AAElD,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA;AACpE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AACtB,QAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,QAAA,OAAO,CAAC,MAAM,CAAC,CAAA,IAAK,EAAE,IAAA,EAAK,KAAM,KAAK,CAAA,GAAI,CAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,UAAA,CAAW,GAAG,KAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,IAAO,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAI;AACpF,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;;;AChGO,SAAS,sBAAsB,OAAA,EAA+C;AACnF,EAAA,MAAM,QAAA,GAAW,IAAI,kBAAA,EAAmB;AAExC,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,sBAAA,EAAwB,CAAA;AAC1D,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,wBAAA,EAA0B,CAAA;AAC5D,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,oBAAA,EAAsB,CAAA;AACxD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,uBAAA,EAAyB,CAAA;AAC3D,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,gBAAA,CAAiB,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAC7E,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,kBAAA,EAAoB,CAAA;AACtD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,cAAA,EAAgB,CAAA;AAClD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,aAAA,EAAe,CAAA;AACjD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,uBAAA,EAAyB,CAAA;AAE3D,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,uBAAA,EAAyB,CAAA;AAC5D,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,kBAAA,EAAoB,CAAA;AACvD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,sBAAA,EAAwB,CAAA;AAC3D,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,iBAAA,EAAmB,CAAA;AACtD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,eAAA,EAAiB,CAAA;AACpD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,cAAA,EAAgB,CAAA;AACnD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,oBAAA,EAAsB,CAAA;AAEzD,EAAA,OAAO,QAAA;AACT;ACrCA,IAAM,6BAAA,GAAgC,CAAC,aAAA,EAAe,UAAU,CAAA;AAEhE,IAAM,mBAAA,GAAsB,sCAAA;AAC5B,IAAM,YAAA,GAAe,+BAAA;AACrB,IAAM,UAAA,GAAa,6BAAA;AACnB,IAAM,iBAAA,GAAoB,oCAAA;AAC1B,IAAM,UAAA,GAAa,yBAAA;AACnB,IAAM,eAAA,GAAkB,kCAAA;AAExB,IAAM,kBAAA,GAAqB;AAAA,EACzB,yCAAA;AAAA,EACA,yBAAA;AAAA,EACA,kCAAA;AAAA,EACA,wCAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAA,GAAqB;AAAA,EACzB,kCAAA;AAAA,EACA,iCAAA;AAAA,EACA,kCAAA;AAAA,EACA,iCAAA;AAAA,EACA,oCAAA;AAAA,EACA,8BAAA;AAAA,EACA,2BAAA;AAAA,EACA,iCAAA;AAAA,EACA,oCAAA;AAAA,EACA;AACF,CAAA;AAEA,SAASC,aAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;AAIA,SAAS,gBAAgB,QAAA,EAA8C;AACrE,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,EAAA,OAAO,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA,CAAE,KAAK,EAAE,CAAA;AAClD;AAeA,SAAS,mBAAmB,QAAA,EAAmD;AAC7E,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,EAAA,OAAO,QAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,QAAA,EAAU;AACvC,MAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,CAAA,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,OAAA,EAAS;AACrC,MAAA,OAAO,aAAA,CAAc,EAAE,OAAO,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,OAAO,CAAA,CAAE,UAAA;AACb,IAAA,MAAM,IAAI,CAAA,CAAE,WAAA;AACZ,IAAA,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AAC7B,IAAA,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AAC7B,IAAA,IAAI,CAAA,EAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAC9B,IAAA,IAAI,CAAA,EAAG,aAAA,EAAe,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AACtC,IAAA,IAAI,CAAA,EAAG,SAAA,EAAW,IAAA,GAAO,CAAA,GAAA,EAAM,IAAI,CAAA,IAAA,CAAA;AACnC,IAAA,IAAI,EAAE,IAAA,EAAM,IAAA,GAAO,IAAI,IAAI,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAA,CAAA;AAEtC,IAAA,MAAM,QAAQ,CAAA,EAAG,KAAA;AACjB,IAAA,IAAI,KAAA,IAAS,UAAU,SAAA,EAAW;AAChC,MAAA,IAAA,GAAO,CAAA,sBAAA,EAAyB,KAAK,CAAA,GAAA,EAAM,IAAI,CAAA,sBAAA,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,cAAc,OAAA,EAA4D;AACjF,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAA,GAAO,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAA,CAAA,GAAO,EAAA;AAAA,IACnD,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,CAAK,KAAA;AAC3B,MAAA,OAAO,OAAA,CAAQ,KAAK,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,GAAK,KAAA;AAAA,IAC/D;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAA,EAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,CAAA,GAAK,OAAA;AAAA,IACxD,KAAK,UAAA;AACH,MAAA,OAAO,QAAQ,QAAA,GAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,EAAA,CAAA,GAAO,EAAA;AAAA,IAC3D;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,GAAA,GAA+B,IAAA;AAAA,EAC/B,MAAA,GAAwB,IAAA;AAAA,EAEhC,eAAe,MAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,gBAAA,CAAiB,EAAE,YAAA,EAAc,QAAQ,CAAA;AACxD,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAAA,EAClC;AAAA,EAEQ,0BAAA,GAAmC;AACzC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AAEf,IAAA,KAAA,MAAW,aAAa,6BAAA,EAA+B;AACrD,MAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,SAAA,EAAW,CAAC,KAAA,KAAU;AAClD,QAAA,MAAM,EAAA,GAAK,MAAM,EAAA,IAAM,SAAA;AACvB,QAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,UACb,CAAA;AAAA,QAAA,EAAuD,SAAS,SAAS,EAAE;AAAA,kCAAA,EAAuC,SAAS,OAAO,EAAE,CAAA,EAAA;AAAA,SACtI;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,8BAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,IAAA,IAAA,CAAK,gCAAA,EAAiC;AACtC,IAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,8BAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,iCAAA,EAAkC;AAAA,EACzC;AAAA,EAEQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,QAAA,EAAU,OAAO,KAAA,KAAU;AACvD,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,MAAA,EAAQ,SAAkB,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,EAAE,YAAA,GAAe,MAAM,IAAI,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,GAAI,EAAC;AACpE,MAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAC1F,MAAA,MAAM,WAAW,OAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,IAAA,KAAkB,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAG,EAC/C,IAAA,CAAK,IAAI,EACT,OAAA,EAAQ;AACX,MAAA,OAAO,GAAG,YAAY;AAAA,EAAA,EAAO,KAAK;AAAA,EAAK,QAAQ;AAAA,EAAK,UAAU,CAAA,CAAA;AAAA,IAChE,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iCAAA,GAA0C;AAChD,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAEjB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAY;AACtC,MAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA,CAAA;AACnC,MAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,EAAY,OAAO,KAAA,KAAU;AACzD,QAAA,MAAM,CAAA,GAAI,KAAA;AAGV,QAAA,MAAM,WAAA,GAAc,EAAE,UAAU,CAAA;AAChC,QAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,WAAA,EAAa,SAAkB,CAAA;AAC/D,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAE/B,QAAA,IAAI,WAAA,EAAa,aAAA,IAAiB,CAAA,CAAE,YAAA,EAAc;AAChD,UAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,EAAE,EAAE,CAAA;AAC9C,UAAA,MAAM,OAAA,GAAA,CACH,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAC5E,UAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI;;AAAA,EAAO,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,QAClD;AAEA,QAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,aAAA,EAAe,OAAO,KAAA,KAAU;AAC5D,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAK,EAAE,QAAA,EAAU,CAAA,CAAE,EAAA,EAAI,CAAA;AACrE,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,MAAA,MAAM,QAAkB,EAAC;AAEzB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,IAAI,EAAE,CAAA;AAChD,QAAA,MAAM,OAAA,GAAA,CACH,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAC5E,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU;AAAA,EAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,CAAA;AAAA,MAClD;AAEA,MAAA,OAAO,GAAG,iBAAiB;AAAA,EAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,EAAK,eAAe,CAAA,CAAA;AAAA,IACtE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,QAAA,EAAU,YAAY,EAAE,CAAA;AAAA,EACxD;AAAA,EAEQ,8BAAA,GAAuC;AAC7C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAA;AAIV,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,YAAA,EAAc,WAAA,EAAa,YAAY,CAAA,CAAE,EAAA;AAE5D,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAAK,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AACzE,MAAA,MAAM,WAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,OAAA,EAAkC;AAC7D,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,eAAA,CAAgB,KAAc,CAAA;AACvD,QAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,QAAiB,EAAE,MAAA,IAAU,EAAA;AAClE,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,2BAAA,GAAoC;AAC1C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,EAAY,OAAO,KAAA,KAAU;AACzD,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,GAAA,IAAO,EAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,QAAA,EAAU,OAAO,CAAA;AACnD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,KAAA,KAAU;AACtD,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,KAAS,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,QAAA,EAAU,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,GAAA;AAClF,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAChD,MAAA,OAAO,CAAA,EAAA,EAAK,OAAA,IAAW,OAAO,CAAA,EAAA,EAAK,OAAO,EAAE,CAAA,CAAA,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,KAAA,KAAU;AACtD,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,KAAS,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,QAAA,EAAU,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,GAAA;AAClF,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAChD,MAAA,OAAO,CAAA,EAAA,EAAK,OAAA,IAAW,OAAO,CAAA,EAAA,EAAK,OAAO,EAAE,CAAA,CAAA,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,MAAA,EAAQ,OAAO,KAAA,KAAU;AACrD,MAAA,MAAM,CAAA,GAAI,KAAA;AASV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,IAAA,KAAS,UAAA,GAAa,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,GAAA;AAC/E,MAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,IAAQ,gBAAgB,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA,IAAK,MAAA;AACjE,MAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,GAAA,IAAO,EAAE,CAAA,CAAA,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,4BAAA,GAAqC;AAC3C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,YAAA,EAAc,OAAO,KAAA,KAAU;AAC3D,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,EAAY,KAAA,IAAS,UAAA;AACrC,MAAA,OAAO,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gCAAA,GAAyC;AAC/C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,gBAAA,EAAkB,OAAO,KAAA,KAAU;AAC/D,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,cAAA,EAAgB,KAAA,IAAS,UAAA;AACzC,MAAA,OAAO,iBAAiB,KAAK;AAAA,mCAAA,EAAwC,CAAA,CAAE,EAAE,CAAA,OAAA,EAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IAC9G,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,YAAA,EAAc,OAAA,IAAW,EAAE,YAAA,EAAc,WAAA;AAC1D,MAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC5D,QAAA,MAAM,CAAA,GAAI,IAAA;AAGV,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA,EAAG;AAC9C,UAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAW,KAAK,KAAA,GAAQ,CAAC,GAAG,UAAA,EAAY;AACxD,YAAA,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,UAAU,CAAA,EAAA,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,KAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,mBAAA,EAAqB,YAAY;AAC7D,MAAA,OAAO,CAAA,oBAAA,CAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,YAAA,EAAc,YAAY,EAAE,CAAA;AAAA,EAC5D;AAAA,EAEQ,8BAAA,GAAuC;AAC7C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,GAAA,IAAO,EAAA;AACnC,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,KAAA,EAAO,OAAO,KAAA,KAAU;AACpD,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,IAAA,KAAS,MAAA,GAAU,CAAA,CAAE,GAAA,CAAI,IAAA,EAAM,GAAA,IAAO,EAAA,GAAO,CAAA,CAAE,GAAA,EAAK,UAAU,GAAA,IAAO,EAAA;AACxF,MAAA,MAAM,OAAA,GAAU,EAAE,GAAA,EAAK,OAAA,GAAU,mBAAmB,CAAA,CAAE,GAAA,CAAI,OAAgB,CAAA,GAAI,EAAA;AAC9E,MAAA,OAAO,CAAA,WAAA,EAAO,OAAA,IAAW,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,KAAA,KAAU;AACtD,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,GAAA,IAAO,EAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,EAAE,KAAA,EAAO,OAAA,GAAU,mBAAmB,CAAA,CAAE,KAAA,CAAM,OAAgB,CAAA,GAAI,EAAA;AAClF,MAAA,OAAO,CAAA,CAAA,EAAI,OAAA,IAAW,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACnC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,0BAAA,GAAmC;AACzC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,SAAA,EAAW,OAAO,KAAA,KAAU;AACxD,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,OAAA,EAAS,SAAkB,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,KAAA,IAAS,EAAA;AAExC,MAAA,MAAM,QAAA,GAAW,EAAE,YAAA,GAAe,MAAM,IAAI,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,GAAI,EAAC;AACpE,MAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAE1F,MAAA,MAAM,aAAA,GAAwC;AAAA,QAC5C,WAAA,EAAa,MAAA;AAAA,QACb,WAAA,EAAa,UAAA;AAAA,QACb,cAAA,EAAoB,MAAA;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,QAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAY,UAAA;AAAA,QACZ,cAAA,EAAoB,SAAA;AAAA,QACpB,QAAA,EAAY,SAAA;AAAA,QACZ,WAAA,EAAa,QAAA;AAAA,QACb,WAAA,EAAa,KAAA;AAAA,QACb,WAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AACA,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAK,CAAA,IAAK,MAAA;AAE5C,MAAA,IAAI,MAAA,GAAS,CAAA,IAAA,EAAO,WAAW,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AACxC,MAAA,IAAI,OAAA,EAAS,MAAK,EAAG;AACnB,QAAA,MAAM,KAAA,GAAQ,OAAA,CACX,IAAA,EAAK,CACL,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAC9B,QAAA,MAAA,IAAU,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,uBAAuB,QAAA,EAA6B;AAClD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,iBAAiB,YAAY,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC/C,IAAA,OAAO,yBAAyB,SAA2C,CAAA;AAAA,EAC7E;AAAA,EAEQ,cAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,cAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,aAAA,GAAgB,CAAA;AAAA,EAChB,aAAA,GAAgB,CAAA;AAAA,EAEhB,mBAAmB,QAAA,EAA0B;AACnD,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAErB,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AACjD,IAAA,SAAA,GAAY,IAAA,CAAK,oBAAoB,SAAS,CAAA;AAC9C,IAAA,SAAA,GAAY,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC1C,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,QAAA,EAA0B;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,SAAA,EAAU,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACtC,QAAA,WAAA,GAAc,CAAC,WAAA;AAAA,MACjB;AAEA,MAAA,IAAI,CAAC,WAAA,IAAe,UAAA,CAAW,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAChD,QAAA,MAAA,CAAO,KAAK,mBAAmB,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACzB;AAAA,EAEQ,oBAAoB,QAAA,EAA0B;AACpD,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,YAAY,CAAC,KAAK,IAAI,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,UAAU,CAAC,KAAK,IAAI,CAAA;AAC7D,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,KAAA;AAEJ,IAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,IAAA,EAAM;AAC9C,MAAA,KAAA,CAAM,YAAY,KAAA,CAAM,KAAA;AACxB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAClC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,KAAK,EAAE,OAAA,EAAQ;AACxF,MAAA,MAAM,KAAK,IAAA,CAAK,aAAA,EAAA;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAEnC,MAAA,MAAM,WAAA,GAAc,yBAAyB,EAAE,CAAA,EAAA,CAAA;AAC/C,MAAA,MAAA,GACE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,GAC3B,WAAA,GACA,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,CAAC,EAAE,MAAM,CAAA;AAElD,MAAA,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,WAAA,CAAY,MAAA;AAAA,IAChD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAAA,EAA0B;AACpD,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,iBAAiB,CAAC,KAAK,IAAI,CAAA;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,eAAe,CAAC,KAAK,IAAI,CAAA;AAClE,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,KAAA;AAEJ,IAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,IAAA,EAAM;AAC9C,MAAA,KAAA,CAAM,YAAY,KAAA,CAAM,KAAA;AACxB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAClC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA;AAC5E,MAAA,MAAM,OAAA,GAAU,MACb,KAAA,CAAM,IAAI,OAAO,CAAA,CAAA,EAAIA,YAAAA,CAAY,UAAU,CAAC,CAAA,CAAA,CAAA,EAAK,GAAG,CAAC,CAAA,CACrD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AAEjB,MAAA,MAAM,KAAK,IAAA,CAAK,aAAA,EAAA;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAEnC,MAAA,MAAM,WAAA,GAAc,0BAA0B,EAAE,CAAA,EAAA,CAAA;AAChD,MAAA,MAAA,GACE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,GAC3B,WAAA,GACA,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,CAAC,EAAE,MAAM,CAAA;AAElD,MAAA,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,WAAA,CAAY,MAAA;AAAA,IAChD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAAA,EAAmD;AAC3E,IAAA,MAAM,SAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAA;AAC3D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAA;AAC3D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,yBAAA,CAA0B,KAAK,CAAA;AAC7D,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,0BAAA,CAA2B,KAAK,CAAA;AAC5D,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAA,CAAO,KAAK,cAAc,CAAA;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AACzD,MAAA,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,yBAAyB,KAAA,EAAgD;AAC/E,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEvC,IAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,IAAA,MAAM,OAAO,IAAA,EAAM,SAAA,GAAY,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,WAAA,CAAY,CAAC,GAAI,EAAE,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAC1C,IAAA,IAAI,OAAA,KAAY,QAAW,OAAO,IAAA;AAElC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,CAAC,CAAA,IAAK,QAAA;AAEjC,IAAA,MAAM,aAAa,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9C,IAAA,MAAM,UAAU,UAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,WAAW,IAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAE,EAChD,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,IAAA,MAAM,QAAA,GAAW,OAAA,GAAW,gBAAA,CAAiB,OAAO,IAAuC,EAAC;AAE5F,IAAA,OAAO,kBAAA,CAAmB,MAAA;AAAA,MACxB,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,MACjC,QAAA,CAAS,MAAA,GAAS,CAAA,GAAK,QAAA,GAAwC;AAAA,KACjE;AAAA,EACF;AAAA,EAEQ,yBAAyB,KAAA,EAAgD;AAC/E,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEvC,IAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,IAAA,MAAM,OAAO,IAAA,EAAM,SAAA,GAAY,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA;AAC5D,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,CAAC,GAAI,EAAE,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAC1C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAC1C,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,OAAO,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,OAAO,kBAAA,CAAmB,WAAW,YAAY,CAAA;AAAA,EACnD;AAAA,EAEQ,0BAA0B,KAAA,EAAgD;AAChF,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEvC,IAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,IAAA,MAAM,OAAO,IAAA,EAAM,SAAA,GAAY,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEpD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,0BAA0B,CAAA,EAAG;AAC7C,MAAA,OAAO,mBAAmB,OAAA,EAAQ;AAAA,IACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,2BAA2B,KAAA,EAAgD;AACjF,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAM,MAAM,KAAA,CAAM,KAAA;AAGlB,MAAA,GAAA,GAAM,GAAA,EAAK,UAAU,GAAA,IAAO,EAAA;AAC5B,MAAA,OAAA,GAAU,GAAA,EAAK,OAAA,GAAU,CAAC,CAAA,EAAG,IAAA,EAAM,OAAA;AAAA,IACrC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa;AACrC,MAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,MAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,SAAA,IAAa,EAAC;AAClC,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAC3C,QAAA,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG;AAChC,UAAA,GAAA,GAAM,OAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AAC/C,MAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AAC/C,MAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,sBAAsB,KAAA,EAAyC;AACrE,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAUpB,IAAA,IAAI,CAAC,KAAA,EAAO,SAAA,GAAY,CAAC,GAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,YAAY,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEvD,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,WAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,YAAA,GAAe,qBAAqB,IAAA,CAAK,CAAC,MAAM,SAAA,CAAU,UAAA,CAAW,CAAC,CAAC,CAAA;AAC7E,IAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAE1B,IAAA,MAAM,KAAA,GAAQ,YAAA;AACd,IAAA,MAAM,aAAA,GAAgB,UAAU,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAEtE,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA;AACvC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,WAAA,CAAY,CAAC,CAAA,GAAI;AAAA,QACf,GAAG,YAAY,CAAC,CAAA;AAAA,QAChB,IAAA,EAAM,EAAE,OAAA,EAAS,aAAA,EAAe,MAAM,IAAA;AAAK,OAC7C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,KAAA,EAAM;AAAA,IACpB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,WAAA;AAAA,QACX,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,QAC7B,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY;AAAC;AAC/B,KACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,MAAA,EAAiC;AAC5D,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,MAAM,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,QAAQ,CAAA;AACjD,IAAA,OAAO,OAAO,MAAA,IAAU,EAAA;AAAA,EAC1B;AACF;AAEA,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,qBAAA,GAAwB,CAAA;AAE9B,SAAS,yBACP,MAAA,EACgC;AAChC,EAAA,MAAM,SAAyC,EAAC;AAEhD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,WAAA,CAAY,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAgE;AACtF,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAQpB,EAAA,IAAI,CAAC,KAAA,EAAO,QAAA,EAAU,OAAO,CAAC,KAAK,CAAA;AAEnC,EAAA,MAAM,OAAO,KAAA,CAAM,QAAA;AACnB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA;AAEpC,EAAA,IAAI,WAAW,KAAA,CAAM,WAAA;AACrB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAK,GAAA,CAAI,SAAA;AACf,IAAA,IAAI,EAAA,EAAI,KAAA,IAAS,EAAA,CAAG,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3C,MAAA,QAAA,GAAW,GAAG,KAAA,CAAM,MAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvC,IAAA,MAAM,KAAK,GAAA,CAAI,SAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI,KAAA,EAAO,OAAO,GAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,EAAA,CAAG,KAAK,CAAA;AAC1B,IAAA,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,OAAA,EAAS,EAAA,EAAG,EAAG,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AAAA,IACjB;AAEA,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,EAAE,GAAG,EAAA,EAAI,OAAM,EAAE;AAAA,EAC/C,CAAC,CAAA;AAED,EAAA,IAAI,cAAA,CAAe,UAAU,qBAAA,EAAuB;AAClD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAG,KAAA;AAAA,QACH,OAAO,EAAE,GAAG,OAAO,WAAA,EAAa,QAAA,EAAU,UAAU,cAAA;AAAe;AACrE,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,iBAAA,GAAoB,cAAA,CAAe,CAAC,CAAA,GAAI,IAAA;AAChE,EAAA,MAAM,WAAW,KAAA,CAAM,iBAAA,GAAoB,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA,GAAI,cAAA;AACrE,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,qBAAA,GAAwB,CAAA,GAAI,qBAAA;AAE1D,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,SAAA,EAAW;AACnD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAC7C,IAAA,MAAM,WAAW,SAAA,GAAY,CAAC,SAAA,EAAW,GAAG,KAAK,CAAA,GAAI,KAAA;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,QAAA;AAAA,QACb,iBAAA,EAAmB,CAAC,CAAC,SAAA;AAAA,QACrB,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAyC;AAC5D,EAAA,OACE,MAAM,IAAA,KAAS,oBAAA,IACf,MAAM,IAAA,KAAS,oBAAA,IACf,MAAM,IAAA,KAAS,OAAA;AAEnB;AAEA,SAAS,gBAAA,CAAiB,OAAgC,KAAA,EAAwC;AAChG,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,EAAA,MAAM,SAAA,GAAY,MAAM,SAAS,CAAA;AAGjC,EAAA,IAAI,CAAC,SAAA,EAAW,QAAA,IAAY,UAAU,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,KAAA;AAEpE,EAAA,IAAI,KAAA,IAAS,wBAAwB,CAAA,EAAG;AACtC,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,SAAA,CAAU,QAAQ,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,CAAC,SAAS,GAAG,EAAE,GAAG,SAAA,EAAW,UAAU,SAAA;AAAU,KACnD;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3D,IAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,MAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,CAAC,SAAS,GAAG,EAAE,GAAG,SAAA,EAAW,UAAU,kBAAA;AAAmB,GAC5D;AACF;AAEA,SAAS,sBACP,MAAA,EACgC;AAChC,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,MAAM,SAAA,GAAY,MAAM,SAAS,CAAA;AAGjC,IAAA,MAAM,WAAW,SAAA,EAAW,QAAA;AAC5B,IAAA,MAAM,oBAAA,GAAuB,QAAA,GACzB,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,SAAA,EAAW,QAAA,EAAU,MAAA,IAAY,GAC/D,KAAA;AACJ,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAChC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,qBAAA,CAAsB,QAAQ,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;ACp3BA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,WAAA,EAAa,MAAA;AAAA,EACb,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,YAAA,EAAc,OAAA;AAAA,EACd,eAAA,EAAiB,MAAA;AAAA,EACjB,WAAA,EAAa,MAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,iBAAA,GAA4C;AAAA,EAChD,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB,WAAA,CACmB,OAAA,EACA,gBAAA,GAA2B,aAAA,EAC3B,YAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EAHgB,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EAGnB,MAAM,aAAA,CAAc,GAAA,EAAa,SAAA,EAAiD;AAChF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,0DAAA,EAAgB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,WAAA;AAC5D,IAAA,MAAM,YAAY,gBAAA,CAAiB,WAAW,KAAK,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,IAAK,MAAA;AAE/E,IAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACvD,IAAA,MAAM,IAAA,GAAOC,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,SAAA,CACd,OAAA,CAAQ,qBAAA,EAAuB,EAAE,CAAA,CACjC,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEd,IAAA,MAAM,WAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,GAAG,SAAS,CAAA,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,gBAAgB,IAAI,QAAQ,CAAA,CAAA;AAEtD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AACrD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,SAAA,EAAW,MAAM,CAAA;AAEhD,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,GAAA;AAAA,MACb,SAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CACJ,QAAA,EACA,SAAA,EACgE;AAChE,IAAA,MAAM,UAAA,GAAa,sCAAA;AACnB,IAAA,MAAM,UAAU,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,UAAU,CAAC,CAAA;AACjD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAE/E,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,EAAC,EAAE;AAAA,IAC5C;AAEA,IAAA,MAAM,IAAA,GAAO,IAAIC,IAAAA,CAAK,CAAC,CAAA;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,aAAA,CAAc,GAAA,CAAI,OAAO,KAAA,KAAU;AACjC,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,IAAI;AACF,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,UAAU,MAAM,IAAA,CAAK,cAAc,KAAA,CAAM,CAAC,GAAI,SAAS;AAAA,WACzD;AAAA,QACF,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,QACf;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,YAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,GAAS,QAAA;AAEb,IAAA,KAAA,MAAW,WAAW,OAAA,EAAS;AAC7B,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AACpC,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,OAAA,CAAQ,KAAA;AACpC,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,MAAA,MAAM,aAAA,GAAgB,CAAA,GAAA,EAAM,QAAA,CAAS,SAAS,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,KAAK,EAAE,CAAA,EAAA,CAAA;AAC/E,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,aAAa,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAU;AAAA,EACtC;AAAA,EAEA,MAAM,iBAAiB,SAAA,EAA+C;AACpE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AACtD,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,WAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,QAAQ,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AACrD,IAAA,MAAM,eAAe,MAAM,IAAA,CAAK,aAAa,UAAA,CAAW,IAAA,EAAM,UAAU,WAAW,CAAA;AAEnF,IAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AAAA,EACnC;AAAA,EAEA,MAAM,qBAAA,CACJ,MAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,EAAC;AAEhC,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,QAAQ,CAAC,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAS,CAAA;AAC3E,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEtC,IAAA,MAAM,UAA+B,EAAC;AACtC,IAAA,MAAM,cAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAU,CAAA;AACzD,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,aAAA;AAAA,YACN,WAAA,EAAa,EAAE,EAAA,EAAI,MAAA,CAAO,YAAA;AAAa;AACzC,SACD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,oDAAA,EAAe,GAAA,CAAI,SAAS,MAAM,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,SAAA,EAAoC;AACnE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,IAAA,CAAK,gBAAgB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,uBAAuB,QAAA,EAA0B;AACvD,IAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,GAAI,CAAC,GAAG,WAAA,EAAY;AACzD,IAAA,OAAA,CAAQ,GAAA,IAAO,iBAAA,CAAkB,GAAG,CAAA,KAAM,0BAAA;AAAA,EAC5C;AAAA,EAEQ,iBAAiB,GAAA,EAAsB;AAC7C,IAAA,OACE,GAAA,CAAI,QAAA,CAAS,0BAA0B,CAAA,IACvC,GAAA,CAAI,SAAS,mBAAmB,CAAA,IAChC,GAAA,CAAI,QAAA,CAAS,qDAAqD,CAAA;AAAA,EAEtE;AAAA,EAEQ,eAAe,GAAA,EAA4B;AACjD,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,+CAA+C,CAAA;AAC1E,IAAA,OAAO,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAG,WAAA,EAAa,CAAA,CAAA,GAAK,IAAA;AAAA,EAC7C;AACF;;;ACjMA,IAAM,aAAA,GAAgB,wBAAA;AACtB,IAAM,aAAA,GAAgB,MAAA;AACtB,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,IAAI,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAE/F,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AAC/C,IAAA,SAAA,GAAY,IAAI,SAAS,CAAA,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,WAAA;AAAA,EACd;AAEA,EAAA,OAAO,SAAA;AACT;;;ACxCA,IAAM,iBAAA,GAAoB,iCAAA;AAC1B,IAAM,gBAAA,GAAmB,mEAAA;AACzB,IAAM,sBAAA,GAAyB,wDAAA;AAC/B,IAAM,sBAAA,GAAyB,mDAAA;AAC/B,IAAM,sBAAA,GAAyB,2DAAA;AAC/B,IAAM,iBAAA,GAAoB,kCAAA;AAE1B,IAAM,eAAA,GAAkB,2CAAA;AACxB,IAAM,eAAA,GAAkB,2CAAA;AACxB,IAAM,aAAA,GAAgB,uCAAA;AACtB,IAAM,cAAA,GAAiB,yCAAA;AACvB,IAAM,aAAA,GAAgB,yCAAA;AACtB,IAAM,mBAAA,GAAsB,4CAAA;AAE5B,IAAMC,aAAAA,GAAe,+BAAA;AACrB,IAAMC,WAAAA,GAAa,6BAAA;AAEZ,SAAS,yBAAyB,QAAA,EAA0B;AACjE,EAAA,IAAI,MAAA,GAAS,QAAA;AAEb,EAAA,MAAA,GAAS,eAAe,MAAM,CAAA;AAC9B,EAAA,MAAA,GAAS,gBAAgB,MAAM,CAAA;AAC/B,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,cAAc,MAAM,CAAA;AAE7B,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,yBAAyB,QAAA,EAA0B;AACjE,EAAA,IAAI,MAAA,GAAS,QAAA;AAEb,EAAA,MAAA,GAAS,qBAAqB,MAAM,CAAA;AACpC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,wBAAwB,MAAM,CAAA;AACvC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,qBAAqB,MAAM,CAAA;AACpC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AAErC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,OAAA,EAAyB;AAC/C,EAAA,SAAS,cAAc,KAAA,EAAuB;AAC5C,IAAA,MAAM,CAAA,GAAI,kEAAA,CAAmE,IAAA,CAAK,KAAK,CAAA;AACvF,IAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AAEf,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AACzB,IAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAEtB,IAAA,IAAA,GAAO,eAAe,IAAI,CAAA;AAE1B,IAAA,MAAM,WAAW,IAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,IAAA,KAAU,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAG,EACvC,IAAA,CAAK,IAAI,EACT,OAAA,EAAQ;AAEX,IAAA,OAAO,GAAGD,aAAY;AAAA,EAAA,EAAO,KAAK;AAAA,EAAK,QAAQ;AAAA,EAAKC,WAAU,CAAA,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,aAAa,CAAA;AACxD;AAEA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,QAAQ,IAAA,KAAiB;AAClE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAE9B,IAAA,MAAM,UAAA,GAAa,2BAAA,CAA4B,IAAA,CAAK,SAAS,CAAA;AAC7D,IAAA,MAAM,OAAO,UAAA,GAAa,kBAAA,CAAmB,UAAA,CAAW,CAAC,CAAE,CAAA,GAAI,MAAA;AAC/D,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAK,SAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,CAAC,EAAE,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAE5C,IAAA,MAAM,YAAA,GAAe,QAAQ,CAAA,IAAA,EAAO,IAAI,KAAK,KAAK,CAAA,CAAA,GAAK,OAAO,IAAI,CAAA,CAAA,CAAA;AAClE,IAAA,MAAM,cAAc,IAAA,GAChB,IAAA,GACA,IAAA,CACG,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA,CAAE,CAAA,CACzB,IAAA,CAAK,IAAI,CAAA,GACZ,EAAA;AAEJ,IAAA,OAAO,YAAA,GAAe,WAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,QAAQ,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,KAAa,IAAA,KAAiB;AACpF,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,OAAO,KAAK,OAAO,CAAA,EAAA,CAAA;AAAA,EACrB,CAAC,CAAA;AACH;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAA,CAAQ,QAAQ,sBAAA,EAAwB,CAAC,QAAQ,IAAA,KAAiB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACrF;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,QAAQ,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,OAAe,GAAA,KAAiB;AACtF,IAAA,OAAO,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,GAAG,CAAA,CAAA,GAAK,KAAA;AAAA,EACrC,CAAC,CAAA;AACH;AAGA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,QAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,MAAA,EAAQ,IAAY,KAAA,KAAkB;AAC/E,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,MAAM,YAAY,QAAA,GAAW,CAAC,CAAA,IAAK,SAAA,GAAY,CAAC,CAAA,IAAK,SAAA;AACrD,IAAA,OAAO,CAAA,0BAAA,EAA6B,EAAE,CAAA,MAAA,EAAS,SAAS,CAAA,EAAA,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAGA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,IAAI,MAAA,GAAS,OAAA;AAEb,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AACjF,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,qBAAc,GAAG,CAAA,CAAA,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AACjF,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,qBAAc,GAAG,CAAA,CAAA,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,aAAA,EAAe,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AAC/E,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,mBAAY,GAAG,CAAA,CAAA,CAAA;AAAA,EACtD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,cAAA,EAAgB,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AAChF,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,oBAAa,GAAG,CAAA,CAAA,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAO,QAAQ,OAAA,CAAQ,aAAA,EAAe,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AAC7E,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,MAAM,QAAA,GAAW,OAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,CACzB,KAAK,IAAI,CAAA;AACZ,IAAA,OAAO,YAAY,KAAK;AAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAGA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,QAAQ,IAAA,KAAiB;AACpE,IAAA,OAAO,6BAA6B,IAAI,CAAA,cAAA,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,MAAM,UAAU,IAAI,MAAA,CAAOJ,YAAAA,CAAYG,aAAY,GAAG,GAAG,CAAA;AACzD,EAAA,MAAM,QAAQ,IAAI,MAAA,CAAOH,YAAAA,CAAYI,WAAU,GAAG,GAAG,CAAA;AAErD,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,MAAA,CAAO,QAAA,CAASD,aAAY,CAAA,IAAK,WAAW,GAAA,EAAK;AACtD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQA,aAAY,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,QAAA,GAAWA,cAAa,MAAM,CAAA;AACrE,IAAA,IAAI,WAAW,EAAA,EAAI;AAEnB,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,QAAA,GAAWA,cAAa,MAAA,EAAQ,MAAM,EAAE,IAAA,EAAK;AACxE,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAK,EAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,MACV,KAAA,CAAM,IAAI,EACV,KAAA,CAAM,CAAC,EACP,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAC,EACvC,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA,SAAA,EAAuB,KAAK,CAAA;;AAAA,EAAiB,IAAI;;AAAA,UAAA,CAAA;AAC9D,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,GAASC,WAAAA,CAAW,MAAM,CAAA;AAAA,EACrF;AAEA,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,SAAiB,SAAA,EAA2B;AACnE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,GAAA,GAAM,SAAA;AAEV,EAAA,OAAO,GAAA,GAAM,OAAA,CAAQ,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACxC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQD,aAAAA,EAAc,GAAG,CAAA;AACnD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQC,WAAAA,EAAY,GAAG,CAAA;AAE/C,IAAA,IAAI,OAAA,KAAY,IAAI,OAAO,EAAA;AAE3B,IAAA,IAAI,SAAA,KAAc,EAAA,IAAM,SAAA,GAAY,OAAA,EAAS;AAC3C,MAAA,KAAA,EAAA;AACA,MAAA,GAAA,GAAM,YAAYD,aAAAA,CAAa,MAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,KAAA,KAAU,GAAG,OAAO,OAAA;AACxB,MAAA,GAAA,GAAM,UAAUC,WAAAA,CAAW,MAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,wBAAwB,OAAA,EAAyB;AACxD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,WAAA,GAAc,6BAAA,CAA8B,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAChE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAI,CAAA,IAAK,WAAA;AAC1C,MAAA,MAAM,eAAe,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,KAAA;AAEnD,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,CAAA,EAAA;AACA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAG,UAAA,CAAW,IAAI,CAAA,EAAG;AACrD,QAAA,SAAA,CAAU,KAAK,KAAA,CAAM,CAAC,CAAA,CAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,QAAA,CAAA,EAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AACzB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,MAC1B;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AACrB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,IAAMC,eAAAA,GAAyC;AAAA,EAC7C,WAAA,EAAM,KAAA;AAAA,EACN,cAAA,EAAI,MAAA;AAAA,EACJ,cAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAK,SAAA;AAAA,EACL,QAAA,EAAK,SAAA;AAAA,EACL,QAAA,EAAK,UAAA;AAAA,EACL,WAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAM,KAAA;AAAA,EACN,WAAA,EAAM,OAAA;AAAA,EACN,WAAA,EAAM;AACR,CAAA;AAEA,IAAM,iBAAyC,MAAA,CAAO,WAAA;AAAA,EACpD,MAAA,CAAO,OAAA,CAAQA,eAAc,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAC;AACvD,CAAA;AAEA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,OAAOA,eAAAA,CAAe,KAAK,CAAA,IAAK,MAAA;AAClC;AAEA,SAAS,mBAAmB,IAAA,EAAkC;AAC5D,EAAA,OAAO,cAAA,CAAe,IAAA,CAAK,WAAA,EAAa,CAAA;AAC1C;AAEA,SAASL,aAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;AAEA,IAAM,mBAAA,GAAsB,uCAAA;AAC5B,IAAM,oBAAA,GAAuB,2CAAA;AAC7B,IAAM,qBAAA,GAAwB,uBAAA;AAE9B,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,QAAQ,IAAA,KAAiB;AACpE,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAC/C,IAAA,OAAO,KAAK,OAAO,CAAA,EAAA,CAAA;AAAA,EACrB,CAAC,CAAA;AACH;AAGA,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACb,oBAAA;AAAA,IACA,CAAC,MAAA,EAAQ,KAAA,EAAe,SAAiB,CAAA,qBAAA,EAAwB,KAAK,KAAK,IAAI,CAAA,UAAA;AAAA,GACjF;AACF;AAEA,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,IAAI,CAAA;AACpD;AAEA,IAAM,qBAAA,GAAwB,gBAAA;AAC9B,IAAM,oBAAA,GAAuB,mCAAA;AAE7B,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,IAAI,SAAS,OAAA,CAAQ,OAAA,CAAQ,oBAAA,EAAsB,CAAC,QAAQ,EAAA,KAAe;AACzE,IAAA,OAAO,CAAA;AAAA,EAAO,EAAA,CAAG,MAAM;AAAA,EAAA,CAAA;AAAA,EACzB,CAAC,CAAA;AACD,EAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,qBAAA,EAAuB,CAAC,QAAQ,EAAA,KAAe,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,eAAA,GAAkB,kCAAA;AACxB,IAAM,YAAA,GAAe,uBAAA;AACrB,IAAM,aAAA,GAAgB,kCAAA;AAEtB,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,QAAQ,SAAA,KAAsB;AACrE,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,IAAI,QAAA;AACJ,IAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,aAAa,KAAK,CAAA;AAEhE,IAAA,OAAA,CAAQ,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAS,OAAO,IAAA,EAAM;AAClD,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,SAAA;AACJ,MAAA,MAAM,SAAS,IAAI,MAAA,CAAO,aAAA,CAAc,MAAA,EAAQ,cAAc,KAAK,CAAA;AACnE,MAAA,OAAA,CAAQ,YAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAE,OAAO,IAAA,EAAM;AACvD,QAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAG,MAAM,CAAA;AAAA,MACjC;AACA,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAE9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,MAAA,OAAO,MAAA,CAAO,MAAA,GAAS,QAAA,EAAU,MAAA,CAAO,KAAK,EAAE,CAAA;AAC/C,MAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AACtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAIA,IAAM,uBAAA,GAA0B,+BAAA;AAChC,IAAM,uBAAA,GAA0B,+BAAA;AAChC,IAAM,qBAAA,GAAwB,+BAAA;AAC9B,IAAM,sBAAA,GAAyB,+BAAA;AAE/B,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,IAAI,MAAA,GAAS,OAAA;AAEb,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,uBAAA,EAAyB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACzF,IAAA,OAAO,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,QAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,uBAAA,EAAyB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACzF,IAAA,OAAO,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,QAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,qBAAA,EAAuB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACvF,IAAA,OAAO,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,MAAA,CAAA;AAAA,EACrC,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACxF,IAAA,OAAO,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,OAAA,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,eAAA,GAAkB,sCAAA;AAExB,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAO,QAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AAC/E,IAAA,MAAM,WAAW,IAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAC,EACrC,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AACR,IAAA,OAAO,CAAA,YAAA,EAAe,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,MAAA,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,IAAM,mBAAA,GAAsB,mDAAA;AAE5B,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,OAAO,QAAQ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,MAAA,EAAQ,IAAY,IAAA,KAAiB;AAChF,IAAA,OAAO,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,EAAW,IAAI,CAAA,GAAA,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,IAAM,iBAAA,GAAoB,sDAAA;AAE1B,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,OAAO,QAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AACjF,IAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,OAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAEA,IAAM,qBAAA,GAAwB,sDAAA;AAE9B,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,CAAC,QAAQ,IAAA,KAAiB;AACtE,IAAA,OAAO,0BAA0B,IAAI,CAAA,OAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAEA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACrE,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,EAAI;AACjC,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,WAAW,CAAC,KAAA,CAAM,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACnC,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AACA,MAAA,MAAA,CAAO,KAAK,OAAA,GAAU,IAAA,GAAO,KAAK,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;;;AC7ZO,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,WAAA,CACmB,MAAA,EACA,OAAA,EACA,YAAA,EACA,OAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,WAAW,qBAAA,CAAsB;AAAA,MACpC,gBAAA,EAAkB,CAAC,IAAA,KAAS,OAAA,CAAQ,gBAAgB,IAAI;AAAA,KACzD,CAAA;AACD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AACzC,IAAA,IAAA,CAAK,eAAe,IAAI,YAAA,CAAa,SAAS,MAAA,CAAO,KAAA,CAAM,aAAa,YAAY,CAAA;AACpF,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AACzC,IAAA,IAAA,CAAK,eAAe,mBAAA,CAAoB;AAAA,MACtC,SAAS,CAAC,KAAA,KAAkB,QAAQ,eAAA,CAAgB,KAAK,GAAG,YAAA,IAAgB,IAAA;AAAA,MAC5E,eAAe,CAAC,MAAA,KAAmB,QAAQ,aAAA,CAAc,MAAM,GAAG,KAAA,IAAS;AAAA,KAC5E,CAAA;AAED,IAAA,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,IAAA,CAAK,YAAA,CAAa,mBAAmB,CAAA;AAAA,EAC1E;AAAA,EAlBmB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EAXF,cAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACT,cAAA,GAAiB,KAAA;AAAA,EAuBzB,MAAM,KAAK,OAAA,EAA4C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,KAAc,MAAA,EAAQ;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,IAAA,CAAK,GAAA,KAAQ,SAAA,EAAU;AAAA,IAC5F;AAEA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAE5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,KAAK,CAAA;AAE5D,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAC,CAAA;AAC7F,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,KAAA,GAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAE5F,IAAA,MAAM,WAAW,OAAA,EAAS,KAAA,GACtB,SAAS,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,KAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,WAAW,CAAC,CAAC,CAAC,CAAA,GACvE,QAAA;AAEJ,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,IAAA,CAAK,GAAA,KAAQ,SAAA,EAAU;AAAA,IAC5F;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAAE,MAAA;AACvF,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,QAAQ,EAAC;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,MAAM,CAAA;AAE/C,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,WAAA,CAAY,GAAA,CAAI,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA;AAAA,MACrC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE;AAAA,KAC/C;AACA,IAAA,KAAA,MAAW,cAAc,aAAA,EAAe;AACtC,MAAA,MAAM,IAAA,CAAK,iBAAiB,UAAU,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,OAAO,IAAIE,IAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AACtD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,WAAW,YAAY;AACjD,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,OAAA,EAAS,UAAA,GAAa,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,IAAI,CAAA;AACrD,QAAA,QAAQ,OAAO,IAAA;AAAM,UACnB,KAAK,SAAA;AACH,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAC/B,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,OAAA,EAAA;AACA,YAAA;AAAA;AACJ,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAA,EACE,OAAO,IAAA,KAAS,SAAA,GAAY,WAAW,MAAA,CAAO,IAAA,KAAS,YAAY,QAAA,GAAW,QAAA;AAAA,UAChF,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA;AAEvC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAE3C,IAAA,OAAO,EAAE,SAAS,OAAA,EAAS,OAAA,EAAS,QAAQ,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,EAAU;AAAA,EAC/E;AAAA,EAEA,MAAM,KAAK,OAAA,EAA4C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,WAAA,GAA0B;AAAA,MAC9B,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,cAAc,EAAC;AAAA,MACf,QAAQ,EAAC;AAAA,MACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,KAAc,MAAA,EAAQ;AACzC,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAE5B,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,YAAwB,EAAC;AAC/B,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAErD,IAAA,MAAM,WAAW,OAAA,EAAS,KAAA,GACtB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,EAAE,MAAM,CAAA;AAClD,MAAA,OAAO,MAAA,IAAU,OAAA,CAAQ,KAAA,CAAO,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAC/E,CAAC,CAAA,GACD,aAAA;AAEJ,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,MAAA;AACjE,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,WAAW,EAAC;AAAA,QACZ,cAAc,EAAC;AAAA,QACf,QAAQ,EAAC;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,MAAM,CAAA;AAE/C,IAAA,MAAM,OAAO,IAAIA,IAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AAEtD,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,MAAM,YAAY,QAAA,CAAS,MAAA;AAE3B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,WAAW,YAAY;AACjD,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,OAAA,EAAS,UAAA,GAAa,EAAE,aAAA,EAAe,SAAA,EAAW,OAAO,MAAM,CAAA;AAC/D,QAAA,QAAQ,OAAO,IAAA;AAAM,UACnB,KAAK,SAAA,EAAW;AACd,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,YAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,UAAA,EAAY;AACf,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAC3C,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,SAAA,CAAU,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,YAChC,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,cAAA,YAAA,CAAa,IAAA,CAAK,OAAO,IAAI,CAAA;AAC7B,cAAA,OAAA,EAAA;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,SAAA,EAAW;AACd,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,OAAA,EAAA;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA;AACF,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAO,MAAM,CAAA;AACvD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,MAAA,EAAQ,YAAA,IAAgB,MAAA,CAAO,MAAA;AAAA,UACrC,SAAA,EACE,OAAO,IAAA,KAAS,SAAA,GAAY,WAAW,MAAA,CAAO,IAAA,KAAS,YAAY,QAAA,GAAW,QAAA;AAAA,UAChF,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA;AAEvC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAE3C,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAA,EAA4C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,CAAK;AAAA,MACjC,GAAG,OAAA;AAAA,MACH,OAAO,OAAA,EAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAgC;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AACnD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,KAAK,CAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AACrD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAEtD,IAAA,MAAM,SAAA,GAAwB,MAAM,IAAA,CAAK,yBAAA;AAAA,MACvC,eAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAmB,eAAA,CAAgB,MAAA;AAAA,MACnC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,yBAAA,CACZ,OAAA,EACA,YAAA,EACA,aAAA,EACqB;AACrB,IAAA,MAAM,YAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,WAAA,GAAc,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,QAC9E,MAAM,MAAA,CAAO,YAAA;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO;AAAA,OACvB;AAEA,MAAA,MAAM,YAAA,GAAe,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,QAClF,MAAA,EAAQ,OAAO,YAAA,IAAgB,EAAA;AAAA,QAC/B,IAAA,EAAM,UAAA;AAAA,QACN,UAAA,EAAY,OAAO,gBAAA,IAAoB,EAAA;AAAA,QACvC,cAAA,EAAgB;AAAA,OAClB;AAEA,MAAA,IAAI,YAAA,GAAe,EAAA;AACnB,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,YAAY,CAAA;AAAA,MAChE,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,IAAI;AACF,UAAA,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,UAAA,EAAY,MAAA;AAAA,QACZ,WAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA,EAAa,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA;AAAA,QACvD,YAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,IAAY,cAAA,GAA0B;AACpC,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA,KAAe,cAAc,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,CAAC,IAAA,CAAK,cAAA,EAAgB;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,kBAAkB,IAAA,CAAK,MAAA,CAAO,OAAO,UAAW,CAAA;AACvF,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEA,MAAc,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AAEpD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACrD,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,SAAA,EAAU,CAAE,IAAA;AAAA,QACV,mBAAmB,IAAI,CAAA,wGAAA;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS;AAAA,MAC9D,SAAA,EAAW,MAAA;AAAA,MACX,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,KAChC,CAAA;AAED,IAAA,IAAI,iBAAA,GAAoB,QAAA;AACxB,IAAA,IAAI,mBAAA,GAA2C,MAAA;AAC/C,IAAA,IAAI,sBAAsB,gBAAA,CAAiB,UAAA;AAE3C,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,iBAAA,GAAoB,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AACvC,MAAA,mBAAA,GAAsB,UAAA;AACtB,MAAA,mBAAA,GAAsB,KAAK,cAAA,CAAe,kBAAA;AAAA,QACxC,gBAAA,CAAiB,UAAA;AAAA,QACjB;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,cAAA;AAAA,MACtB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,KAAA;AAAA,MACA,gBAAA,CAAiB,OAAA;AAAA,MACjB;AAAA,KACF;AAEA,IAAA,MAAM,KAAK,YAAA,CAAa,qBAAA,CAAsB,IAAA,CAAK,EAAA,EAAI,iBAAiB,MAAM,CAAA;AAE9E,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAEhC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,IAAA;AAAA,QACd,cAAc,IAAA,CAAK,EAAA;AAAA,QACnB,cAAA,EAAgB,QAAA;AAAA,QAChB,WAAA,EAAa,IAAA;AAAA,QACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,QACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,aAAA,GAAgB,MAAA;AAAA,QACpD,MAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO;AAAA,OAC3C,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,gBAAA,CAAiB,UAAU,CAAA;AAC1D,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,IAAA;AAAA,QACd,cAAc,IAAA,CAAK,EAAA;AAAA,QACnB,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,IAAA,EAAM,gBAAA,CAAiB,eAAe,CAAA;AAAA,IAC1E,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAE3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACnD,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,SAAA,EAAU,CAAE,IAAA;AAAA,QACV,mBAAmB,IAAI,CAAA,wGAAA;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS;AAAA,MAC9D,SAAA,EAAW,MAAA;AAAA,MACX,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,KAAK,cAAA,CAAe,MAAA,CAAO,cAAc,gBAAA,CAAiB,OAAA,EAAS,OAAO,YAAY,CAAA;AAE5F,IAAA,MAAM,KAAK,YAAA,CAAa,qBAAA,CAAsB,MAAA,CAAO,YAAA,EAAc,iBAAiB,MAAM,CAAA;AAE1F,IAAA,IAAI,gBAAgB,gBAAA,CAAiB,UAAA;AACrC,IAAA,IAAI,IAAA,CAAK,kBAAkB,aAAA,IAAiB,MAAA,CAAO,KAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACjF,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,MAAMI,MAAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,MAAA,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,aAAA,EAAeA,MAAK,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI,iBAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,oBAAA,CAAqB,MAAA,CAAO,cAAc,aAAa,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,YAAY,CAAA;AAEvE,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,gBAAA,CAAiB,UAAU,CAAA;AAC1D,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO,CAAC,CAAA;AACtE,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,QAAQ,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,MAAA,CAAO,EAAA,EAAI,YAAY,gBAAgB,CAAA;AACxE,MAAA,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,IAAA,EAAM,gBAAA,CAAiB,eAAe,CAAA;AACxE,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,IAAA;AAAA,QACd,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAE3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY;AAC/B,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA;AACvD,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,SAAS,CAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,IAAA,EAA6B;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAE3B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AACvD,IAAA,MAAM,kBAAkB,MAAA,CAAO,cAAA;AAE/B,IAAA,IAAI,eAAA,IAAmB,CAAC,cAAA,CAAe,WAAA,EAAa,eAAe,CAAA,EAAG;AACpE,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,GAAiB,UAAA,GAAa,MAAA;AACtD,QAAA,MAAM,KAAK,YAAA,CAAa,QAAA,CAAS,MAAA,CAAO,YAAA,EAAc,aAAa,UAAU,CAAA;AAC7E,QAAA,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,MAAA,CAAO,EAAA,EAAI,WAAW,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AACN,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,6CAAA,EAAiC,IAAI,CAAA,+DAAA,CAAe,CAAA;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,mBAAA,GAA+C;AAC3D,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AACpD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AAC1C,IAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,MACzB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAa;AAAA,KACxE;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,WAA4D,EAAC;AACnE,MAAA,IAAI,MAAA;AACJ,MAAA,GAAG;AACD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,cAAc,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,EAAa;AAAA,UACnF,WAAA,EAAa;AAAA,SACd,CAAA;AACD,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,GAAG,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,gBAAA,EAAkB,CAAA,CAAE,kBAAiB,CAAE;AAAA,SACnF;AACA,QAAA,MAAA,GAAS,OAAO,UAAA,IAAc,MAAA;AAAA,MAChC,CAAA,QAAS,MAAA;AACT,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,uBAAuB,IAAA,CAAK,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA,IAC5F;AAEA,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,EAAE,CAAA;AAEjD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,IAAA,EAAM,SAAA;AAAA,UACN,YAAY,IAAA,CAAK,gBAAA;AAAA,UACjB,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,IAAA,CAAK,gBAAA,KAAqB,MAAA,CAAO,gBAAA,EAAkB;AAC5D,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,IAAA,EAAM,UAAA;AAAA,UACN,YAAY,IAAA,CAAK,gBAAA;AAAA,UACjB,gBAAgB,MAAA,CAAO;AAAA,SACxB,CAAA;AAAA,MACH;AAEA,MAAA,cAAA,CAAe,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,QAAA,EAAU;AAC3C,MAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,QAAA,MAAM,SAAS,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,QAAQ,CAAA;AACpE,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,MAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAM,SAAA;AAAA,YACN,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YACnC,gBAAgB,MAAA,CAAO;AAAA,WACxB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,MAAA,EAAiC;AACxD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,MAAM,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAI,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAEpD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAiB,MAAM,CAAA;AACnE,IAAA,MAAM,aAAA,GAAgB,YAAY,IAAA,CAAK,CAAC,MAAM,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA;AAEpF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AACpD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAE5C,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,MAAM,aAAa,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAC9D,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAK,CAAA;AAC1E,MAAA,QAAA,GAAW,aAAA;AACX,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,aAAA,IAAiB,CAAC,UAAA,EAAY;AACvC,MAAA,MAAM,aAAa,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAC9D,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAK,CAAA;AAC1E,MAAA,QAAA,GAAW,aAAA;AACX,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,aAAa,CAAA,EAAG,UAAU,IAAI,QAAQ,CAAA,GAAA,CAAA,GAAQ,GAAG,QAAQ,CAAA,GAAA,CAAA;AAC1E,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAQ,CAAA;AACpD,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAEA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,UAAA,GAAa,KAAK,cAAA,CAAe,oBAAA;AAAA,QAC9B,IAAA,CAA4D;AAAA,OAC/D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACvD;AACA,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAEnB,IAAA,IAAI,iBAAA,GAAoB,QAAA;AACxB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,aAAA,KAAkB,WAAA,EAAa;AACxD,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,UAAU,KAAK,CAAA;AAC7E,MAAA,iBAAA,GAAoB,WAAA,CAAY,OAAA;AAAA,IAClC;AAEA,IAAA,MAAM,YAAA,GAAe,KAAK,QAAA,CAAS,iBAAA;AAAA,MACjC,iBAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,QAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,OACjC;AAAA,MACA,EAAE,UAAA;AAAW,KACf;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,YAAY,CAAA;AAEnD,IAAA,MAAM,IAAA,GAAO,YAAY,YAAY,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAc,MAAA;AAAA,QACd,cAAA,EAAgB,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAAA,QACzC,WAAA,EAAa,IAAA;AAAA,QACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,QACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,OAAO;AAAA,OAChD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,eAAe,UAAU,CAAA;AACzC,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAc,MAAA;AAAA,QACd,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,MAAA,EAAuE;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AAErB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,MAAM,CAAA;AAC1D,IAAA,IAAI,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAEzD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAI,CAAA;AAEjD,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,UAAA,GAAa,KAAK,cAAA,CAAe,oBAAA;AAAA,QAC9B,IAAA,CAA4D;AAAA,OAC/D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACvD;AACA,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAEnB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,aAAA,KAAkB,WAAA,EAAa;AACxD,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,UAAU,KAAK,CAAA;AAC7E,MAAA,QAAA,GAAW,WAAA,CAAY,OAAA;AAAA,IACzB;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,OAAO,YAAY,CAAA;AACxE,IAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,CAAS,iBAAA;AAAA,MAClC,QAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,UAAU,MAAA,CAAO,YAAA;AAAA,QACjB,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,OACjC;AAAA,MACA,EAAE,UAAA,EAAY,eAAA,EAAiB,aAAa,MAAA,GAAS,CAAA,GAAI,eAAe,MAAA;AAAU,KACpF;AAEA,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,YAAY,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,GAAe,EAAA;AAAA,IACjB;AAEA,IAAA,MAAM,SAAA,GAAY,YAAY,YAAY,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,cAAc,MAAA,CAAO,WAAA;AAE3C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,gBAAA;AAElC,MAAA,IAAI,aAAa,cAAA,EAAgB,CAEjC,MAAA,IAAW,aAAa,aAAA,EAAe;AACrC,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,YAAA,EAAa;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAqB;AAAA,UACzB,UAAA,EAAY,MAAA;AAAA,UACZ,WAAA,EAAa;AAAA,YACX,MAAM,MAAA,CAAO,YAAA;AAAA,YACb,IAAA,EAAM,UAAA;AAAA,YACN,WAAA,EAAa,SAAA;AAAA,YACb,cAAc,MAAA,CAAO;AAAA,WACvB;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,WAAA,EAAa,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA;AAAA,UACvD,YAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,UAAU,CAAA;AAC/C,QAAA,OAAO,EAAE,QAAA,EAAS;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,cAAc,aAAa,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,YAAY,aAAa,CAAA;AACzC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,MAClB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,cAAc,MAAA,CAAO,MAAA;AAAA,MACrB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,WAAA,EAAa,OAAA;AAAA,MACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAC1C,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA,EAAQ,QAAA;AAAA,MACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,OAAO;AAAA,KACjD,CAAA;AAED,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,YAAA,EAAa;AAAA,EACrC;AAAA,EAEA,MAAc,WAAW,MAAA,EAAwC;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAChD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AAAA,MACnD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAC7B,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA,EAEA,MAAc,iBAAiB,UAAA,EAAmC;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AAClD,IAAA,IAAI,UAAU,YAAA,EAAc;AAE5B,IAAA,MAAM,cAAA,GAAiB,GAAG,UAAU,CAAA,CAAA,EAAI,WAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAK,CAAA,GAAA,CAAA;AACnE,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,cAAc,CAAA;AAC9D,IAAA,IAAI,kBAAkB,cAAA,EAAgB;AACpC,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,UAAA;AAAA,QACd,cAAc,gBAAA,CAAiB,cAAA;AAAA,QAC/B,cAAA,EAAgB,EAAA;AAAA,QAChB,WAAA,EAAa,EAAA;AAAA,QACb,kBAAkB,gBAAA,CAAiB,gBAAA;AAAA,QACnC,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,aAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAEzC,IAAA,IAAI,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA;AAClC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AACtD,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,QAAA,GAAW,YAAA,CAAa,YAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW;AAAA,MACpD,QAAA;AAAA,MACA,UAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,MAClB,YAAA,EAAc,UAAA;AAAA,MACd,cAAc,UAAA,CAAW,EAAA;AAAA,MACzB,cAAA,EAAgB,QAAA;AAAA,MAChB,WAAA,EAAa,EAAA;AAAA,MACb,kBAAkB,UAAA,CAAW,gBAAA;AAAA,MAC7B,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAC1C,aAAA,EAAe,MAAA;AAAA,MACf,QAAA,EAAU,aAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,oBAAoB,QAAA,EAAmC;AACnE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AAEjD,IAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AACtD,IAAA,IAAI,YAAA,EAAc,YAAA,EAAc,OAAO,YAAA,CAAa,YAAA;AAEpD,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AAAA,EAC5B;AAAA,EAEQ,aAAa,QAAA,EAA2B;AAC9C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,OAAA,CAAQ,SAAS,EAAE,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzC,IAAA,OAAO,QAAA,KAAa,UAAA;AAAA,EACtB;AAAA,EAEA,MAAc,kBAAkB,IAAA,EAA2C;AACzE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,YAAY,cAAA,CAAe,QAAA,EAAU,KAAK,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,EAAG,OAAO,EAAA;AAEjF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA;AACxD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI,YAAA,CAAa,QAAA,KAAa,aAAA,IAAiB,YAAA,CAAa,aAAa,aAAA,EAAe;AACtF,QAAA,MAAMC,UAAAA,GAAY,YAAA,CAAa,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACrD,QAAAA,WAAU,GAAA,EAAI;AACd,QAAA,OAAOA,UAAAA,CAAU,KAAK,GAAG,CAAA;AAAA,MAC3B;AACA,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACrD,MAAA,SAAA,CAAU,GAAA,EAAI;AACd,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AACpC,MAAA,OACE,SAAA,IACA,gBAAA,CAAiB,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAAA,IAE9F;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAC3D,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,UAAU,CAAA;AAC7D,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,iBAAiB,WAAW,CAAA;AAC7C,MAAA,OAAO,eAAA,GAAkB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,CACZ,QAAA,EACA,UAAA,EACA,KAAA,EACA,iBACA,UAAA,EAC6B;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,iBAAA,KAAsB,KAAA,EAAO;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,yBAAyB,eAAe,CAAA;AACzD,QAAA,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,sBAAA,CAAuB;AAAA,UACpD,QAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU,QAAA;AAAA,UACV;AAAA,SACD,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,sBAAA,CAAuB,eAAe,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW;AAAA,MAC9C,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAA,CACZ,MAAA,EACA,eAAA,EACA,YAAA,EACe;AACf,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,iBAAA,KAAsB,KAAA,EAAO;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,yBAAyB,eAAe,CAAA;AAEzD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,YAAA,GAAe,wBAAA,CAAyB,YAAA,CAAa,QAAA,CAAS,OAAO,CAAC,CAAA;AAC5E,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,QAAQ,CAAA;AAC1D,UAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,UAAU,EAAA,EAAI;AAC9C,YAAA,MAAM,IAAA,CAAK,YAAA,CAAa,yBAAA,CAA0B,MAAA,EAAQ,OAAO,CAAA;AACjE,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,mBAAA,CAAoB,MAAA,EAAQ,QAAQ,CAAA;AAC5D,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,sBAAA,CAAuB,eAAe,CAAA;AACzE,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAiB,MAAM,CAAA;AAEtE,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,aAAa,IAAIL,IAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AAC5D,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,cAAA,CAAe,GAAA,CAAI,OAAO,KAAA,KAAU;AAClC,QAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA;AAAA,QAC9C,CAAA,SAAE;AACA,UAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,cAAA,CACN,YACA,UAAA,EAC2C;AAC3C,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,MAAM,UAAqD,EAAC;AAE5D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,CAAA,GAAI,SAAS,MAAA,EAAQ;AACjD,MAAA,IAAI,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/B,QAAA,CAAA,EAAA;AACA,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAS,CAAA,GAAI,CAAA;AACjB,MAAA,IAAI,SAAS,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,EAAA,EAAI,SAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACvE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AACnC,QAAA,IAAI,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG;AAC9D,UAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AACb,UAAA,MAAA,GAAS,CAAA;AACT,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG;AAC9D,UAAA,MAAA,GAAS,CAAA;AACT,UAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AACb,QAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AACpD,MAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AACpD,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,KAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AAAA,MACrD;AACA,MAAA,CAAA,GAAI,MAAA;AACJ,MAAA,CAAA,GAAI,MAAA;AAAA,IACN;AAEA,IAAA,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,QAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,QACnC,QAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,IAAI;AAAA,OACpC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,MAAA,EAAiC;AAC/D,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,iBAAA,KAAsB,KAAA,EAAO;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAC7D,QAAA,OAAO,wBAAA,CAAyB,OAAO,QAAQ,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,sBAAA,CAAuB,MAAM,CAAA;AAAA,EAC1D;AAAA,EAEQ,gBAAgB,IAAA,EAAyC;AAC/D,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,SAAA,EAAW,OAAO,OAAO,OAAA,IAAW,IAAA;AACxD,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,aAAA,EAAe,OAAO,OAAO,WAAA,IAAe,IAAA;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,CAAA;AAC9D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,CAAA;AAE9D,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,MAAA,SAAA,EAAU,CAAE,KAAK,qHAA0C,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,MAAA,SAAA,EAAU,CAAE,KAAK,qHAA0C,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,QAAA,EAAmC;AACrE,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,QAAQ,MAAA,CAAO,QAAQ,GAAI,OAAO,QAAA;AAEnD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA,IAAK,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA,GAAI,EAAA;AAC5F,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA,EAAG,CAAC,GAAA,CAAI,MAAM,CAAA;AAEjE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,YAAY,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,GAAG,KAAK,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,CAAC,IAAI,GAAG,CAAA,CAAA;AAC5E,MAAA,IAAI,CAAE,MAAM,IAAA,CAAK,QAAQ,MAAA,CAAO,SAAS,GAAI,OAAO,SAAA;AAAA,IACtD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,QAAA,EAA0B;AAC9C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAC5C,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACrC;AAEA,SAAS,eAAe,UAAA,EAA+C;AACrE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,KAAA;AAC7C,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,CAAA;AACnF,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA;AACjB,IAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB,EAAA,OAAO,EAAC;AACV;AC3kCO,IAAM,cAAN,MAAqC;AAAA,EAI1C,WAAA,CACmB,UACjB,UAAA,EACA;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGjB,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA,EAAY,OAAA,IAAW,EAAC;AAC/C,IAAA,MAAM,aAAA,GAAgB,UAAA,EAAY,OAAA,IAAW,EAAC;AAC9C,IAAA,MAAM,cAAA,GAAiB,KAAK,qBAAA,EAAsB;AAClD,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,aAAA,EAAe,GAAG,cAAc,CAAA;AAAA,EAC7D;AAAA,EAPmB,QAAA;AAAA,EAJF,eAAA;AAAA,EACA,eAAA;AAAA,EAYT,qBAAA,GAAkC;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAaM,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,sBAAsB,CAAA;AAC7D,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAChD,MAAA,OAAO,QACJ,KAAA,CAAM,IAAI,EACV,GAAA,CAAI,CAAC,SAAiB,IAAA,CAAK,IAAA,EAAM,CAAA,CACjC,MAAA,CAAO,CAAC,IAAA,KAAiB,IAAA,IAAQ,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,IAAA,EAA+B;AAC5C,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,OAAOC,QAAAA,CAAS,UAAU,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,IAAA,EAA+B;AAC9C,IAAA,MAAM,QAAA,GAAWD,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,OAAOC,SAAS,QAAQ,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAgC;AAC5D,IAAA,MAAM,QAAA,GAAWD,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAME,MAAM,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,IAAA,MAAMC,SAAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAc,IAAA,EAA6B;AAC3D,IAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAME,MAAM,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,IAAA,MAAMC,SAAAA,CAAU,UAAU,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,IAAA,EAA6B;AAC5C,IAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAM,OAAO,QAAQ,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,EAAA,EAA2B;AACtD,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AACrC,IAAA,MAAME,MAAM,OAAA,CAAQ,MAAM,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,MAAM,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAKF,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAC,CAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,IAAA,EAA6B;AAC9C,IAAA,MAAME,KAAAA,CAAMF,KAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,iBAAA,GAAyC;AAC7C,IAAA,MAAM,QAAoB,EAAC;AAC3B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,cAAsB,OAAA,EAA0B;AACrE,IAAA,IAAI,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,IAAA,EAAM,OAAO,IAAA;AAEnD,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,MAAA,OAAO,YAAA,CAAa,UAAA,CAAW,GAAA,GAAM,GAAG,KAAK,YAAA,KAAiB,GAAA;AAAA,IAChE,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACnC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC3B,MAAA,OAAO,YAAA,CAAa,SAAS,GAAG,CAAA;AAAA,IAClC,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAChC,MAAA,MAAM,WAAW,OAAA,CACd,OAAA,CAAQ,KAAA,EAAO,KAAK,EACpB,OAAA,CAAQ,OAAA,EAAS,cAAc,CAAA,CAC/B,QAAQ,KAAA,EAAO,OAAO,CAAA,CACtB,OAAA,CAAQ,qBAAqB,IAAI,CAAA;AACpC,MAAA,OAAO,IAAI,MAAA,CAAO,GAAA,GAAM,WAAW,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,OAAO,YAAA,KAAiB,OAAA,IAAW,YAAA,CAAa,UAAA,CAAW,UAAU,GAAG,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA,EAEQ,WAAW,YAAA,EAA+B;AAChD,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,CAAC,CAAC,CAAA;AACtF,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,CAAC,CAAC,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,OAAA,CAAQ,GAAA,EAAa,MAAA,EAAmC;AACpE,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE1D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAErC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEhC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAErD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG;AAEnC,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,MACrC,CAAA,MAAA,IAAW,MAAM,MAAA,EAAO,IAAK,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,QAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAChD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAQ,CAAA;AAEpC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,YAAA;AAAA,UACN,OAAA;AAAA,UACA,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,WAAA;AAAY,SACnC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACjJA,IAAM,eAAA,GAAkB,wCAAA;AACxB,IAAM,aAAA,GAAgB,yBAAA;AAEf,IAAM,iBAAN,MAA0C;AAAA,EACtC,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,iBAAkC,EAAC;AACzC,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AAEtB,IAAA,MAAM,eAAe,CAAC,GAAG,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAC,CAAA;AAC1D,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,CAAC,CAAE,CAAA;AAEpC,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,GAAI,CAAA;AACrD,MAAA,MAAM,WAAW,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAC,CAAA;AAE7D,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY,UAAA,GAAa,SAAS,KAAM,CAAA;AAC3E,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,EAAA,EAAI,MAAA,CAAO,IAAI,CAAA,IAAK,EAAA;AAAA,UACpB,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,IAAK,EAAA;AAAA,UAC1B,aAAA,EAAe,aAAa,IAAA,EAAK;AAAA,UACjC,QAAA;AAAA,UACA,QAAQ,UAAA,GAAa,QAAA,CAAS,KAAA,GAAS,QAAA,CAAS,CAAC,CAAA,CAAE;AAAA,SACpD,CAAA;AAAA,MACH;AAEA,MAAA,aAAA,CAAc,SAAA,GAAY,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAG,KAAA,CAAM,QAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AACF;AAUA,SAAS,YAAY,WAAA,EAA6C;AAChE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACnDO,SAAS,aAAA,CAAc,IAAA,EAAc,KAAA,EAAe,MAAA,EAA6B;AACtF,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAErC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,SAAA,EAAW,UAAU,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAErD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,YAAmC,EAAC;AAC1C,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,OAAO,OAAA,GAAU,UAAU,MAAA,IAAU,SAAA,CAAU,SAAS,CAAA,IAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAClF,IAAA,MAAM,cAAc,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,OAAO,CAAA;AACjE,IAAA,MAAM,eAAe,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,OAAO,CAAA;AAEnE,IAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,MAAA,IAAI,WAAA,CAAY,WAAA,CAAY,QAAA,EAAU,YAAA,CAAa,QAAQ,CAAA,EAAG;AAC5D,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,YAAY,WAAA,CAAY,QAAA;AAAA,UACxB,aAAa,YAAA,CAAa;AAAA,SAC3B,CAAA;AACD,QAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AACnC,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AACpC,QAAA,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAAA,MAC9B;AAEA,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,aAAa,OAAO,CAAA;AAC5D,MAAA,SAAA,CAAU,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,WAAW,GAAG,CAAC,CAAA;AAClD,MAAA,UAAA,CAAW,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,YAAY,GAAG,CAAC,CAAA;AAAA,IACvD,WAAW,WAAA,EAAa;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AACnC,MAAA,OAAA,GAAU,WAAA,CAAY,OAAA;AACtB,MAAA,SAAA,CAAU,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,WAAW,GAAG,CAAC,CAAA;AAAA,IACpD,WAAW,YAAA,EAAc;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AACpC,MAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AACvB,MAAA,UAAA,CAAW,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,YAAY,GAAG,CAAC,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,UAAU,MAAA,EAAQ;AAC9B,QAAA,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAE,CAAA;AAAA,MACjC;AACA,MAAA,OAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACxB;AAAA,GACF;AACF;AAQA,SAAS,WAAA,CAAY,MAAgB,QAAA,EAAgC;AACnE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,OAAA,GAAU,IAAA,CAAK,MAAA,IAAU,MAAA,GAAS,SAAS,MAAA,EAAQ;AACxD,IAAA,IAAI,IAAA,CAAK,OAAO,CAAA,KAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACtC,MAAA,OAAA,EAAA;AACA,MAAA,MAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,OAAA;AAClB,MAAA,MAAM,WAAqB,EAAC;AAE5B,MAAA,OAAO,MAAA,GAAS,SAAS,MAAA,IAAU,IAAA,CAAK,OAAO,CAAA,KAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACrE,QAAA,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAE,CAAA;AAC/B,QAAA,MAAA,EAAA;AAAA,MACF;AACA,MAAA,OAAA,EAAA;AAEA,MAAA,KAAA,CAAM,KAAK,EAAE,SAAA,EAAW,WAAW,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,SAAS,MAAA,EAAQ;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,SAAA,EAAW,OAAA;AAAA,MACX,SAAS,IAAA,CAAK,MAAA;AAAA,MACd,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,MAAM;AAAA,KAChC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,WAAA,CAAY,GAAa,CAAA,EAAsB;AACtD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,OAAO,CAAA,CAAE,MAAM,CAAC,GAAA,EAAK,QAAQ,GAAA,KAAQ,CAAA,CAAE,GAAG,CAAC,CAAA;AAC7C;;;ACnGO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,WAAA,CACmB,SACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAFgB,OAAA;AAAA,EACA,OAAA;AAAA,EAGnB,MAAM,OAAA,CAAQ,QAAA,EAAoB,MAAA,EAAqD;AACrF,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,MACnC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,MACpC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,MACnC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAAA;AACzC,EACF;AAAA,EAEA,MAAM,iBAAA,CACJ,QAAA,EACA,QAAA,EAC2B;AAC3B,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AAAA,MACvC,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,QAAQ,CAAA;AAAA,MACxC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,WAAW,CAAA;AAAA,MAC3C,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AAAA;AACzC,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAuB,QAAA,EAAyD;AAC/F,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,UAAU,QAAQ,CAAA;AAC9D,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,aAAa,QAAA,EAA+C;AACxE,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,YAAY,CAAA;AAC9C,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAA,MACX,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc,OAAO;AAAA,KAC5C;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE1D,IAAA,OAAO,EAAE,MAAM,QAAA,CAAS,UAAA,CAAW,cAAc,MAAA,EAAQ,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EAClF;AAAA,EAEA,MAAc,cAAc,QAAA,EAA+C;AACzE,IAAA,MAAM,KAAK,OAAA,CAAQ,SAAA,CAAU,SAAS,UAAA,CAAW,YAAA,EAAc,SAAS,aAAa,CAAA;AAErF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,aAAa,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAA,MACX,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe,OAAO;AAAA,KAC7C;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE1D,IAAA,OAAO,EAAE,MAAM,QAAA,CAAS,UAAA,CAAW,cAAc,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAA,EAAK;AAAA,EACnF;AAAA,EAEA,MAAc,aAAa,QAAA,EAA+C;AACxE,IAAA,MAAM,IAAA,GAAO,SAAS,WAAA,IAAe,EAAA;AACrC,IAAA,MAAM,cAAc,aAAA,CAAc,IAAA,EAAM,QAAA,CAAS,YAAA,EAAc,SAAS,aAAa,CAAA;AAErF,IAAA,MAAM,KAAK,OAAA,CAAQ,SAAA,CAAU,SAAS,UAAA,CAAW,YAAA,EAAc,YAAY,MAAM,CAAA;AAEjF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,WAAA,CAAY,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE9F,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAS,UAAA,CAAW,YAAA;AAAA,MAC1B,MAAA,EAAQ,OAAA;AAAA,MACR,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,iBAAA,EAAmB,CAAC,WAAA,CAAY;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,QAAA,EAA+C;AAC5E,IAAA,MAAM,YAAA,GAAe,SAAS,UAAA,CAAW,YAAA;AACzC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,EAAA;AACnD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,CAAA,EAAG,QAAQ,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA;AAE/C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,YAAA,EAAc,SAAS,aAAa,CAAA;AAEjE,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,CAAS,YAAY,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAA,MACX,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,SAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc,OAAO;AAAA,KAC5C;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE1D,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,WAAA,EAAa,SAAS,IAAA,EAAK;AAAA,EAClE;AAAA,EAEA,aAAa,QAAA,EAA4B;AACvC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AACrD,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,QAAA,CAAS,UAAA,CAAW,YAAY,CAAA,CAAE,CAAA;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,YAAY,MAAM,CAAA;AAC7D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAEhC,MAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAA,IAAa,EAAE,CAAA,CAAE,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,IAAI,cAAc,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AACxD,QAAA,IAAI,eAAe,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACF;;;AC/HO,IAAM,aAAN,MAAiB;AAAA,EACtB,mBAAA,CAAoB,IAAA,EAAsB,QAAA,GAAmB,EAAA,EAAqB;AAChF,IAAA,MAAM,UAA2B,EAAC;AAClC,IAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AACzC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,IAAA,EAAsB,UAAA,EAAoB,OAAA,EAAgC;AAC7F,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,KAAA,IAAS,WAAW,CAAA;AAC3D,IAAA,MAAM,cAAc,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAE/D,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,iBAAA;AAAA,QACN,YAAA,EAAc,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC5B,UAAA,EAAY,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC1B,UAAA,EAAY,GAAG,WAAW,CAAA,YAAA;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,aAAA;AAAA,QACN,YAAA,EAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAA;AAAA,QACxC,UAAA,EAAY,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC1B,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA;AAAA,OACrC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,UAAA,IAAc,KAAK,WAAA,EAAa;AAC/C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,aAAA;AAAA,QACN,YAAA,EAAc,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC5B,UAAA,EAAY,GAAG,WAAW,CAAA,CAAA;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,MAAA;AAAA,QACN,YAAA,EAAc,GAAG,WAAW,CAAA,GAAA;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,mBAAA,CAAoB,SAA4B,YAAA,EAA0C;AACxF,IAAA,MAAM,QAA4B,EAAC;AACnC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,EAAc,KAAK,CAAA;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CACN,OAAA,EACA,YAAA,EACA,KAAA,EACM;AACN,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAE5C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,oBAAA;AAAA,YACN,OAAO,KAAA,CAAM,IAAA;AAAA,YACb,YAAA;AAAA,YACA,eAAe,UAAA,CAAW,IAAA;AAAA,YAC1B,UAAA,EAAY;AAAA,WACb,CAAA;AAED,UAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,CAAW,IAAI,CAAA;AAC5E,UAAA,IAAA,CAAK,cAAc,YAAA,EAAc,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,IAAI,KAAK,CAAA;AAAA,QACrE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,0BAAA;AAAA,YACN,OAAO,KAAA,CAAM,IAAA;AAAA,YACb,YAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,IAAA,CAAK,cAAc,KAAA,CAAM,QAAA,EAAU,eAAe,KAAA,CAAM,IAAI,IAAI,KAAK,CAAA;AAAA,QACvE;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACpE,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,UACrC,YAAA;AAAA,UACA,eAAe,KAAA,CAAM,IAAA;AAAA,UACrB,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,GAAA,EAA8C;AACnE,IAAA,OAAO,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,GAAA,CAAA,IAAS,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,IAAK,IAAA;AAAA,EAC3F;AAAA,EAEA,kBAAkB,IAAA,EAIF;AACd,IAAA,IAAI,IAAA,CAAK,YAAY,OAAO,iBAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa,OAAO,aAAA;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAa,OAAO,aAAA;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;ACrHO,IAAM,cAAN,MAAkB;AAAA,EAGvB,WAAA,CACmB,UACA,QAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAFgB,QAAA;AAAA,EACA,QAAA;AAAA,EAJX,OAAA,GAA4B,IAAA;AAAA,EAOpC,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU;AAAA,MAClC,OAAA,EAAS,CAAC,aAAA,EAAe,oBAAA,EAAsB,qBAAqB,CAAA;AAAA,MACpE,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,gBAAA,EAAkB;AAAA,QAChB,kBAAA,EAAoB,GAAA;AAAA,QACpB,YAAA,EAAc;AAAA;AAChB,KACD,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,KAAA,EAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAC,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,QAAA,EAAU,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,QAAA,EAAU,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AACF;;;ACzBA,IAAM,mBAAA,GAAsB,GAAA;AAErB,IAAM,mBAAN,MAAuB;AAAA,EAU5B,WAAA,CACmB,QAAA,EACA,YAAA,EACjB,OAAA,GAA4B,EAAC,EAC7B;AAHiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGjB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EANmB,QAAA;AAAA,EACA,YAAA;AAAA,EAXF,UAAA;AAAA,EACA,OAAA;AAAA,EACT,OAAA,GAA8B,IAAA;AAAA,EAC9B,aAAA,GAAsD,IAAA;AAAA,EACtD,cAAA,uBAA8C,GAAA,EAAI;AAAA,EAClD,OAAA,GAAU,KAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAU,KAAA;AAAA,EAWlB,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAElB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,UAAU,IAAI,WAAA,CAAY,KAAK,QAAA,EAAU,CAAC,OAAO,IAAA,KAAS;AAC7D,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IACnC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAE1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,IAAA,EAAK;AACxB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,cAAA,CAAe,IAAA;AAAA,EAC7B;AAAA,EAEQ,gBAAA,CAAiB,OAAmB,IAAA,EAAoB;AAC9D,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAE3B,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,KAAA,EAAO,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,KAAK,KAAK,WAAA,EAAY;AAAA,IACxB,CAAA,EAAG,KAAK,UAAU,CAAA;AAAA,EACpB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,MAAM,eAAe,CAAC,GAAG,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAE1B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,QAAQ,WAAA,IAAc;AAE3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK;AAAA,QAC1C,KAAA,EAAO,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,OACjD,CAAA;AAED,MAAA,IAAA,CAAK,OAAA,CAAQ,iBAAiB,MAAM,CAAA;AAAA,IACtC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,OAAA,CAAQ,cAAc,GAAG,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,QAAA,KAAK,KAAK,WAAA,EAAY;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport const ConfigSchema = z.object({\n version: z.literal(1),\n notion: z.object({\n token: z.string().startsWith(\"ntn_\"),\n rootPageId: z.string(),\n workspaceId: z.string().optional(),\n parentMode: z.enum([\"page\", \"database\"]).default(\"page\"),\n databaseId: z.string().optional(),\n }),\n sync: z.object({\n direction: z.enum([\"push\", \"pull\", \"both\"]).default(\"both\"),\n conflictStrategy: z\n .enum([\"local-first\", \"remote-first\", \"manual\", \"duplicate\"])\n .default(\"manual\"),\n autoSync: z.boolean().default(false),\n autoSyncInterval: z.number().min(30).max(3600).default(300),\n deleteSync: z.boolean().default(false),\n }),\n paths: z.object({\n include: z.array(z.string()).default([\"**/*\"]),\n exclude: z.array(z.string()).default([]),\n attachments: z.string().default(\"attachments\"),\n }),\n conversion: z.object({\n preferMarkdownApi: z.boolean().default(true),\n preserveMarkers: z.boolean().default(true),\n frontmatterMapping: z.boolean().default(true),\n imageDownload: z.enum([\"immediate\", \"lazy\", \"skip\"]).default(\"immediate\"),\n }),\n advanced: z.object({\n concurrency: z.number().min(1).max(10).default(3),\n maxRetries: z.number().min(0).max(10).default(5),\n timeoutMs: z.number().min(5000).max(60000).default(30000),\n batchSize: z.number().min(1).max(100).default(50),\n }),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport const DEFAULT_CONFIG: Config = {\n version: 1,\n notion: {\n token: \"\",\n rootPageId: \"\",\n parentMode: \"page\",\n },\n sync: {\n direction: \"both\",\n conflictStrategy: \"manual\",\n autoSync: false,\n autoSyncInterval: 300,\n deleteSync: false,\n },\n paths: {\n include: [\"**/*\"],\n exclude: [],\n attachments: \"attachments\",\n },\n conversion: {\n preferMarkdownApi: true,\n preserveMarkers: true,\n frontmatterMapping: true,\n imageDownload: \"immediate\",\n },\n advanced: {\n concurrency: 3,\n maxRetries: 5,\n timeoutMs: 30000,\n batchSize: 50,\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ConfigSchema, DEFAULT_CONFIG } from \"../types/config.js\";\nimport type { Config } from \"../types/config.js\";\n\nconst CONFIG_FILE = \"config.json\";\nconst IM_NOBSIDIAN_DIR = \".im-nobsidian\";\n\nexport class ConfigManager {\n private config: Config | null = null;\n\n constructor(private readonly vaultRoot: string) {}\n\n get configDir(): string {\n return join(this.vaultRoot, IM_NOBSIDIAN_DIR);\n }\n\n get configPath(): string {\n return join(this.configDir, CONFIG_FILE);\n }\n\n get dbPath(): string {\n return join(this.configDir, \"sync.db\");\n }\n\n async load(): Promise<Config> {\n try {\n const raw = await readFile(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n this.config = ConfigSchema.parse(parsed);\n return this.config;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`설정 파일의 JSON 형식이 올바르지 않습니다: ${this.configPath}`);\n }\n if (error instanceof Error && error.name === \"ZodError\") {\n throw new Error(`설정 파일 검증 실패: ${error.message}`);\n }\n throw new Error(\n `설정 파일을 찾을 수 없습니다: ${this.configPath}\\n'im-nobsidian init'을 먼저 실행하세요.`,\n );\n }\n }\n\n async save(config: Config): Promise<void> {\n await mkdir(this.configDir, { recursive: true });\n const content = JSON.stringify(config, null, 2);\n await writeFile(this.configPath, content, \"utf-8\");\n this.config = config;\n }\n\n async init(params: { token: string; rootPageId: string }): Promise<Config> {\n const config: Config = {\n ...DEFAULT_CONFIG,\n notion: {\n ...DEFAULT_CONFIG.notion,\n token: params.token,\n rootPageId: params.rootPageId,\n },\n };\n\n await this.save(config);\n await this.ensureGitignore();\n return config;\n }\n\n getConfig(): Config {\n if (!this.config) {\n throw new Error(\"설정이 로드되지 않았습니다. load()를 먼저 호출하세요.\");\n }\n return this.config;\n }\n\n private async ensureGitignore(): Promise<void> {\n const gitignorePath = join(this.vaultRoot, \".gitignore\");\n const entry = \".im-nobsidian/\";\n\n try {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (!content.includes(entry)) {\n await writeFile(gitignorePath, `${content.trimEnd()}\\n${entry}\\n`, \"utf-8\");\n }\n } catch {\n await writeFile(gitignorePath, `${entry}\\n`, \"utf-8\");\n }\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n const { stat } = await import(\"node:fs/promises\");\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function generateId(): string {\n return randomUUID();\n}\n\nexport function normalizeNotionId(id: string): string {\n const raw = id.replace(/-/g, \"\");\n if (raw.length !== 32) return id;\n return `${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(16, 20)}-${raw.slice(20)}`;\n}\n\nexport function notionIdsEqual(a: string, b: string): boolean {\n return a.replace(/-/g, \"\") === b.replace(/-/g, \"\");\n}\n","export const INITIAL_MIGRATION = `\nCREATE TABLE IF NOT EXISTS sync_state (\n id TEXT PRIMARY KEY,\n obsidian_path TEXT NOT NULL,\n notion_page_id TEXT,\n notion_parent_id TEXT,\n content_hash TEXT NOT NULL,\n notion_last_edited TEXT,\n local_last_modified TEXT NOT NULL,\n sync_direction TEXT NOT NULL DEFAULT 'both',\n file_type TEXT NOT NULL DEFAULT 'file',\n status TEXT NOT NULL DEFAULT 'pending',\n base_snapshot BLOB,\n version INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n\n CONSTRAINT chk_sync_direction CHECK (sync_direction IN ('push', 'pull', 'both')),\n CONSTRAINT chk_file_type CHECK (file_type IN ('file', 'folder-note', 'folder-only', 'db-row')),\n CONSTRAINT chk_status CHECK (status IN ('synced', 'pending', 'conflict', 'error'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_path ON sync_state(obsidian_path);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_notion ON sync_state(notion_page_id) WHERE notion_page_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_sync_state_status ON sync_state(status);\nCREATE INDEX IF NOT EXISTS idx_sync_state_parent ON sync_state(notion_parent_id);\n\nCREATE TABLE IF NOT EXISTS wikilink_map (\n obsidian_path TEXT PRIMARY KEY,\n notion_page_id TEXT NOT NULL UNIQUE,\n title TEXT NOT NULL,\n aliases TEXT DEFAULT '[]',\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_wikilink_title ON wikilink_map(title);\nCREATE INDEX IF NOT EXISTS idx_wikilink_notion ON wikilink_map(notion_page_id);\n\nCREATE TABLE IF NOT EXISTS pending_operations (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n operation TEXT NOT NULL,\n direction TEXT NOT NULL,\n payload TEXT,\n retry_count INTEGER NOT NULL DEFAULT 0,\n error_message TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n completed_at TEXT,\n\n CONSTRAINT chk_operation CHECK (operation IN ('create', 'update', 'delete', 'move')),\n CONSTRAINT chk_direction CHECK (direction IN ('push', 'pull')),\n CONSTRAINT chk_op_status CHECK (status IN ('pending', 'processing', 'completed', 'failed'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_pending_status ON pending_operations(status, created_at);\n\nCREATE TABLE IF NOT EXISTS image_registry (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n notion_file_url TEXT NOT NULL,\n local_path TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n file_size INTEGER NOT NULL,\n mime_type TEXT NOT NULL,\n expires_at TEXT,\n downloaded_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_image_hash ON image_registry(content_hash);\nCREATE INDEX IF NOT EXISTS idx_image_sync ON image_registry(sync_state_id);\n\nCREATE TABLE IF NOT EXISTS sync_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nINSERT OR IGNORE INTO sync_metadata (key, value) VALUES ('schema_version', '1');\n`;\n","import Database from \"better-sqlite3\";\nimport type { SyncRecord, SyncStatus, WikilinkEntry, PreserveMarker } from \"../types/index.js\";\nimport { generateId } from \"../utils/id.js\";\nimport { INITIAL_MIGRATION } from \"./migrations/001-initial.js\";\n\nexport class StateDB {\n private readonly db: Database.Database;\n\n private constructor(db: Database.Database) {\n this.db = db;\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n }\n\n static open(dbPath: string): StateDB {\n const db = new Database(dbPath);\n const stateDb = new StateDB(db);\n stateDb.migrate();\n return stateDb;\n }\n\n private migrate(): void {\n const version = this.getSchemaVersion();\n if (version < 1) {\n this.db.exec(INITIAL_MIGRATION);\n }\n }\n\n private getSchemaVersion(): number {\n try {\n const row = this.db\n .prepare(\"SELECT value FROM sync_metadata WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n return row ? Number(row.value) : 0;\n } catch {\n return 0;\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n // --- sync_state ---\n\n getByPath(path: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE obsidian_path = ?\").get(path) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByNotionId(pageId: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE notion_page_id = ?\").get(pageId) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByStatus(status: SyncStatus): SyncRecord[] {\n const rows = this.db\n .prepare(\"SELECT * FROM sync_state WHERE status = ?\")\n .all(status) as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n getAll(): SyncRecord[] {\n const rows = this.db.prepare(\"SELECT * FROM sync_state\").all() as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n upsert(record: UpsertSyncRecord): SyncRecord {\n const existing = this.getByPath(record.obsidianPath);\n\n if (existing) {\n this.db\n .prepare(\n `UPDATE sync_state SET\n notion_page_id = ?, notion_parent_id = ?, content_hash = ?,\n notion_last_edited = ?, local_last_modified = ?,\n sync_direction = ?, file_type = ?, status = ?,\n base_snapshot = ?, version = version + 1,\n updated_at = datetime('now')\n WHERE id = ?`,\n )\n .run(\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n existing.id,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n const id = generateId();\n this.db\n .prepare(\n `INSERT INTO sync_state\n (id, obsidian_path, notion_page_id, notion_parent_id, content_hash,\n notion_last_edited, local_last_modified, sync_direction, file_type,\n status, base_snapshot, version)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`,\n )\n .run(\n id,\n record.obsidianPath,\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n updateStatus(id: string, status: SyncStatus): void {\n this.db\n .prepare(\"UPDATE sync_state SET status = ?, updated_at = datetime('now') WHERE id = ?\")\n .run(status, id);\n }\n\n updateHash(id: string, hash: string, snapshot?: Buffer | null): void {\n if (snapshot !== undefined) {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, base_snapshot = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, snapshot, id);\n } else {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, id);\n }\n }\n\n setNotionLastEdited(id: string, lastEdited: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_last_edited = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(lastEdited, id);\n }\n\n setNotionParentId(id: string, parentId: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_parent_id = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(parentId, id);\n }\n\n delete(id: string): void {\n this.db.prepare(\"DELETE FROM sync_state WHERE id = ?\").run(id);\n }\n\n // --- wikilink_map ---\n\n resolveWikilink(text: string): WikilinkEntry | null {\n const byTitle = this.db.prepare(\"SELECT * FROM wikilink_map WHERE title = ?\").get(text) as\n | RawWikilinkRow\n | undefined;\n\n if (byTitle) return this.mapWikilinkRow(byTitle);\n\n const byAlias = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE aliases LIKE ?\")\n .get(`%\"${text}\"%`) as RawWikilinkRow | undefined;\n\n if (byAlias) return this.mapWikilinkRow(byAlias);\n\n const byFilename = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE obsidian_path LIKE ?\")\n .get(`%/${text}.md`) as RawWikilinkRow | undefined;\n\n return byFilename ? this.mapWikilinkRow(byFilename) : null;\n }\n\n resolvePageId(pageId: string): WikilinkEntry | null {\n const row = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE notion_page_id = ?\")\n .get(pageId) as RawWikilinkRow | undefined;\n return row ? this.mapWikilinkRow(row) : null;\n }\n\n upsertWikilink(entry: WikilinkEntry): void {\n this.db\n .prepare(\n `INSERT OR REPLACE INTO wikilink_map (obsidian_path, notion_page_id, title, aliases, updated_at)\n VALUES (?, ?, ?, ?, datetime('now'))`,\n )\n .run(entry.obsidianPath, entry.notionPageId, entry.title, JSON.stringify(entry.aliases));\n }\n\n // --- sync_metadata ---\n\n getMeta(key: string): string | null {\n const row = this.db.prepare(\"SELECT value FROM sync_metadata WHERE key = ?\").get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n }\n\n setMeta(key: string, value: string): void {\n this.db\n .prepare(\"INSERT OR REPLACE INTO sync_metadata (key, value) VALUES (?, ?)\")\n .run(key, value);\n }\n\n // --- preserve markers ---\n\n storePreserveMarkers(path: string, markers: PreserveMarker[]): void {\n if (markers.length === 0) {\n this.db.prepare(\"DELETE FROM sync_metadata WHERE key = ?\").run(`preserve_markers:${path}`);\n return;\n }\n this.setMeta(`preserve_markers:${path}`, JSON.stringify(markers));\n }\n\n getPreserveMarkers(path: string): PreserveMarker[] {\n const value = this.getMeta(`preserve_markers:${path}`);\n if (!value) return [];\n try {\n return JSON.parse(value) as PreserveMarker[];\n } catch {\n return [];\n }\n }\n\n // --- transaction ---\n\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n\n // --- private ---\n\n private mapRow(row: RawSyncRow): SyncRecord {\n return {\n id: row.id,\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n notionParentId: row.notion_parent_id,\n contentHash: row.content_hash,\n notionLastEdited: row.notion_last_edited,\n localLastModified: row.local_last_modified,\n syncDirection: row.sync_direction as SyncRecord[\"syncDirection\"],\n fileType: row.file_type as SyncRecord[\"fileType\"],\n status: row.status as SyncRecord[\"status\"],\n baseSnapshot: row.base_snapshot,\n version: row.version,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n private mapWikilinkRow(row: RawWikilinkRow): WikilinkEntry {\n return {\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n title: row.title,\n aliases: JSON.parse(row.aliases || \"[]\") as string[],\n };\n }\n}\n\nexport interface UpsertSyncRecord {\n readonly obsidianPath: string;\n readonly notionPageId?: string | null;\n readonly notionParentId?: string | null;\n readonly contentHash: string;\n readonly notionLastEdited?: string | null;\n readonly localLastModified: string;\n readonly syncDirection: SyncRecord[\"syncDirection\"];\n readonly fileType: SyncRecord[\"fileType\"];\n readonly status: SyncRecord[\"status\"];\n readonly baseSnapshot?: Buffer | null;\n}\n\ninterface RawSyncRow {\n id: string;\n obsidian_path: string;\n notion_page_id: string | null;\n notion_parent_id: string | null;\n content_hash: string;\n notion_last_edited: string | null;\n local_last_modified: string;\n sync_direction: string;\n file_type: string;\n status: string;\n base_snapshot: Buffer | null;\n version: number;\n created_at: string;\n updated_at: string;\n}\n\ninterface RawWikilinkRow {\n obsidian_path: string;\n notion_page_id: string;\n title: string;\n aliases: string;\n updated_at: string;\n}\n","type NotionPropertySchema = {\n id: string;\n type: string;\n name: string;\n};\n\ntype NotionPropertyValue = Record<string, unknown>;\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2})?/;\nconst WIKILINK_REGEX = /^\\[\\[(.+?)(?:\\|.+?)?\\]\\]$/;\n\nexport interface WikilinkResolver {\n resolve(title: string): string | null;\n resolvePageId(pageId: string): string | null;\n}\n\nexport class PropertyMapper {\n private schema: Map<string, NotionPropertySchema> = new Map();\n private wikilinkResolver: WikilinkResolver | null = null;\n\n setWikilinkResolver(resolver: WikilinkResolver): void {\n this.wikilinkResolver = resolver;\n }\n\n loadSchema(properties: Record<string, { id: string; type: string }>): void {\n this.schema.clear();\n for (const [name, prop] of Object.entries(properties)) {\n this.schema.set(name, { id: prop.id, type: prop.type, name });\n }\n }\n\n toNotionProperties(\n frontmatter: Record<string, unknown>,\n title: string,\n ): Record<string, NotionPropertyValue> {\n const result: Record<string, NotionPropertyValue> = {\n title: { title: [{ text: { content: title } }] },\n };\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (key === \"title\") continue;\n if (value === null || value === undefined) continue;\n\n const schemaProp = this.schema.get(key);\n if (schemaProp) {\n const converted = this.convertBySchema(schemaProp.type, value);\n if (converted) result[key] = converted;\n } else {\n const inferred = this.inferAndConvert(value);\n if (inferred) result[key] = inferred;\n }\n }\n\n return result;\n }\n\n fromNotionProperties(notionProps: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, rawProp] of Object.entries(notionProps)) {\n const prop = rawProp as { type: string; [k: string]: unknown };\n if (prop.type === \"title\") continue;\n const value = this.extractValue(prop);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n private convertBySchema(type: string, value: unknown): NotionPropertyValue | null {\n switch (type) {\n case \"rich_text\":\n return { rich_text: [{ text: { content: String(value) } }] };\n\n case \"number\":\n return { number: typeof value === \"number\" ? value : Number(value) };\n\n case \"select\":\n return { select: { name: String(value) } };\n\n case \"multi_select\": {\n const items = Array.isArray(value)\n ? value\n : String(value)\n .split(\",\")\n .map((s) => s.trim());\n return { multi_select: items.map((name: unknown) => ({ name: String(name) })) };\n }\n\n case \"checkbox\":\n return { checkbox: Boolean(value) };\n\n case \"date\": {\n if (typeof value === \"object\" && value !== null && \"start\" in value) {\n const obj = value as { start: string; end?: string | null };\n return { date: { start: obj.start, end: obj.end ?? null } };\n }\n const dateStr = String(value);\n if (DATE_REGEX.test(dateStr)) {\n return { date: { start: dateStr, end: null } };\n }\n return null;\n }\n\n case \"url\":\n return { url: String(value) };\n\n case \"email\":\n return { email: String(value) };\n\n case \"phone_number\":\n return { phone_number: String(value) };\n\n case \"status\":\n return { status: { name: String(value) } };\n\n case \"relation\": {\n const items = Array.isArray(value) ? value : [value];\n const ids: Array<{ id: string }> = [];\n for (const item of items) {\n const str = String(item);\n const match = str.match(WIKILINK_REGEX);\n if (match?.[1] && this.wikilinkResolver) {\n const pageId = this.wikilinkResolver.resolve(match[1]);\n if (pageId) ids.push({ id: pageId });\n } else if (str.match(/^[0-9a-f-]{32,36}$/)) {\n ids.push({ id: str });\n }\n }\n return ids.length > 0 ? { relation: ids } : null;\n }\n\n case \"people\": {\n const users = Array.isArray(value) ? value : [value];\n const peopleArr = users\n .map((u) => {\n const s = String(u);\n if (s.match(/^[0-9a-f-]{32,36}$/)) return { object: \"user\" as const, id: s };\n return null;\n })\n .filter(Boolean);\n return peopleArr.length > 0 ? { people: peopleArr } : null;\n }\n\n case \"files\": {\n const fileList = Array.isArray(value) ? value : [value];\n const filesArr = fileList.map((f) => {\n if (typeof f === \"object\" && f !== null && \"url\" in f) {\n const obj = f as { name?: string; url: string };\n return { type: \"external\", name: obj.name ?? \"file\", external: { url: obj.url } };\n }\n return {\n type: \"external\",\n name: String(f),\n external: { url: String(f) },\n };\n });\n return { files: filesArr };\n }\n\n case \"created_time\":\n case \"last_edited_time\":\n case \"created_by\":\n case \"last_edited_by\":\n case \"formula\":\n case \"rollup\":\n case \"unique_id\":\n case \"verification\":\n return null;\n\n default:\n return { rich_text: [{ text: { content: String(value) } }] };\n }\n }\n\n private inferAndConvert(value: unknown): NotionPropertyValue | null {\n if (typeof value === \"boolean\") {\n return { checkbox: value };\n }\n if (typeof value === \"number\") {\n return { number: value };\n }\n if (Array.isArray(value)) {\n return {\n multi_select: value.map((v) => ({ name: String(v) })),\n };\n }\n if (typeof value === \"string\") {\n if (DATE_REGEX.test(value)) {\n return { date: { start: value, end: null } };\n }\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n return { url: value };\n }\n return { rich_text: [{ text: { content: value } }] };\n }\n return null;\n }\n\n private extractValue(prop: { type: string; [k: string]: unknown }): unknown {\n switch (prop.type) {\n case \"rich_text\": {\n const arr = prop.rich_text as Array<{ plain_text: string }> | undefined;\n return arr?.map((t) => t.plain_text).join(\"\") || null;\n }\n case \"number\":\n return prop.number;\n case \"select\": {\n const sel = prop.select as { name: string } | null;\n return sel?.name ?? null;\n }\n case \"multi_select\": {\n const items = prop.multi_select as Array<{ name: string }> | undefined;\n return items?.map((s) => s.name) ?? [];\n }\n case \"checkbox\":\n return prop.checkbox;\n case \"date\": {\n const dateObj = prop.date as { start: string; end?: string | null } | null;\n if (!dateObj) return null;\n if (dateObj.end) return { start: dateObj.start, end: dateObj.end };\n return dateObj.start;\n }\n case \"url\":\n return prop.url;\n case \"email\":\n return prop.email;\n case \"phone_number\":\n return prop.phone_number;\n case \"status\": {\n const status = prop.status as { name: string } | null;\n return status?.name ?? null;\n }\n case \"created_time\":\n return prop.created_time;\n case \"last_edited_time\":\n return prop.last_edited_time;\n case \"people\": {\n const people = prop.people as Array<{ name?: string; id: string }> | undefined;\n return people?.map((p) => p.name ?? p.id) ?? [];\n }\n case \"files\": {\n const files = prop.files as\n | Array<{\n name: string;\n type: string;\n file?: { url: string };\n external?: { url: string };\n }>\n | undefined;\n return (\n files?.map((f) => ({\n name: f.name,\n url: f.type === \"file\" ? f.file?.url : f.external?.url,\n })) ?? []\n );\n }\n case \"formula\": {\n const formula = prop.formula as { type: string; [k: string]: unknown } | undefined;\n if (!formula) return null;\n return formula[formula.type];\n }\n case \"relation\": {\n const rel = prop.relation as Array<{ id: string }> | undefined;\n if (!rel || rel.length === 0) return [];\n return rel.map((r) => {\n if (this.wikilinkResolver) {\n const title = this.wikilinkResolver.resolvePageId(r.id);\n if (title) return `[[${title}]]`;\n }\n return r.id;\n });\n }\n case \"rollup\": {\n const rollup = prop.rollup as { type: string; [k: string]: unknown } | undefined;\n if (!rollup) return null;\n if (rollup.type === \"array\") {\n const arr = rollup.array as Array<{ type: string; [k: string]: unknown }>;\n return arr.map((item) => this.extractValue(item));\n }\n return rollup[rollup.type] ?? null;\n }\n case \"unique_id\": {\n const uid = prop.unique_id as { prefix?: string; number: number } | undefined;\n if (!uid) return null;\n return uid.prefix ? `${uid.prefix}-${uid.number}` : String(uid.number);\n }\n case \"created_by\":\n case \"last_edited_by\": {\n const user = prop[prop.type] as { name?: string; id: string } | undefined;\n return user?.name ?? user?.id ?? null;\n }\n case \"verification\": {\n const v = prop.verification as { state: string } | undefined;\n return v?.state ?? null;\n }\n default:\n return null;\n }\n }\n}\n","import { Client } from \"@notionhq/client\";\nimport { Sema } from \"async-sema\";\nimport type {\n BlockObjectResponse,\n PageObjectResponse,\n PartialBlockObjectResponse,\n PageMarkdownResponse,\n} from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { PropertyMapper } from \"./property-mapper.js\";\n\nexport interface NotionClientOptions {\n readonly token: string;\n readonly concurrency?: number;\n readonly timeoutMs?: number;\n}\n\nexport class NotionClient {\n private readonly client: Client;\n private readonly sema: Sema;\n private readonly propertyMapper = new PropertyMapper();\n\n constructor(options: NotionClientOptions) {\n this.client = new Client({\n auth: options.token,\n timeoutMs: options.timeoutMs ?? 30000,\n });\n this.sema = new Sema(options.concurrency ?? 3);\n }\n\n getInternalClient(): Client {\n return this.client;\n }\n\n // ─── Page CRUD ───\n\n async getPage(pageId: string): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () => this.client.pages.retrieve({ page_id: pageId }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPage(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n properties?: Record<string, unknown>;\n children?: BlockObjectResponse[];\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n children: params.children as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPageWithMarkdown(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n markdown: string;\n properties?: Record<string, unknown>;\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n markdown: params.markdown,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async updatePageProperties(\n pageId: string,\n properties: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n properties: properties as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Markdown API ───\n\n async getPageMarkdown(pageId: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() => this.client.pages.retrieveMarkdown({ page_id: pageId }));\n }\n\n async replacePageMarkdown(pageId: string, markdown: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"replace_content\",\n replace_content: {\n new_str: markdown,\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n async updatePageMarkdownPartial(\n pageId: string,\n patches: Array<{ oldStr: string; newStr: string; replaceAll?: boolean }>,\n ): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"update_content\",\n update_content: {\n content_updates: patches.map((p) => ({\n old_str: p.oldStr,\n new_str: p.newStr,\n replace_all_matches: p.replaceAll ?? false,\n })),\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n // ─── Page Move ───\n\n async movePage(\n pageId: string,\n newParentId: string,\n newParentType: \"page\" | \"database\",\n ): Promise<PageObjectResponse> {\n const parent =\n newParentType === \"database\" ? { database_id: newParentId } : { page_id: newParentId };\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n parent,\n } as never) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Database / DataSource ───\n\n async getDatabaseSchema(\n databaseId: string,\n ): Promise<Record<string, { id: string; type: string }>> {\n const db = await this.withRateLimit(() =>\n this.client.databases.retrieve({ database_id: databaseId }),\n );\n const properties = (\n db as unknown as { properties: Record<string, { id: string; type: string }> }\n ).properties;\n const schema: Record<string, { id: string; type: string }> = {};\n for (const [name, prop] of Object.entries(properties)) {\n schema[name] = { id: prop.id, type: prop.type };\n }\n return schema;\n }\n\n async queryDatabase(\n databaseId: string,\n options?: { startCursor?: string; pageSize?: number },\n ): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const response = await this.withRateLimit(() =>\n this.client.dataSources.query({\n data_source_id: databaseId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async archivePage(pageId: string): Promise<void> {\n await this.withRateLimit(() => this.client.pages.update({ page_id: pageId, archived: true }));\n }\n\n // ─── Block CRUD ───\n\n async listChildren(\n blockId: string,\n options?: { startCursor?: string; pageSize?: number },\n ): Promise<{\n results: (BlockObjectResponse | PartialBlockObjectResponse)[];\n nextCursor: string | null;\n }> {\n const response = await this.withRateLimit(() =>\n this.client.blocks.children.list({\n block_id: blockId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n }),\n );\n return {\n results: response.results,\n nextCursor: response.next_cursor,\n };\n }\n\n async fetchAllChildren(blockId: string): Promise<BlockObjectResponse[]> {\n const blocks: BlockObjectResponse[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.listChildren(blockId, { startCursor: cursor });\n blocks.push(...response.results.filter((b): b is BlockObjectResponse => \"type\" in b));\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return blocks;\n }\n\n async appendChildren(blockId: string, children: unknown[]): Promise<void> {\n const BATCH_SIZE = 100;\n for (let i = 0; i < children.length; i += BATCH_SIZE) {\n const batch = children.slice(i, i + BATCH_SIZE);\n await this.withRateLimit(() =>\n this.client.blocks.children.append({\n block_id: blockId,\n children: batch as never,\n }),\n );\n }\n }\n\n async deleteBlock(blockId: string): Promise<void> {\n await this.withRateLimit(() => this.client.blocks.delete({ block_id: blockId }));\n }\n\n // ─── File Upload ───\n\n async uploadFile(fileData: Blob, filename: string, contentType: string): Promise<string> {\n const upload = await this.withRateLimit(() =>\n this.client.fileUploads.create({ filename, content_type: contentType }),\n );\n\n const fileUploadId = (upload as unknown as { id: string }).id;\n\n await this.withRateLimit(() =>\n this.client.fileUploads.send({\n file_upload_id: fileUploadId,\n file: { data: fileData, filename },\n }),\n );\n\n await this.withRateLimit(() =>\n this.client.fileUploads.complete({ file_upload_id: fileUploadId }),\n );\n\n return fileUploadId;\n }\n\n // ─── Search & Navigation ───\n\n async search(params: {\n query?: string;\n filter?: { property: \"object\"; value: \"page\" | \"data_source\" };\n startCursor?: string;\n pageSize?: number;\n }): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const response = await this.withRateLimit(() =>\n this.client.search({\n query: params.query,\n filter: params.filter,\n start_cursor: params.startCursor,\n page_size: params.pageSize ?? 100,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async getChildPages(parentId: string): Promise<PageObjectResponse[]> {\n const blocks = await this.fetchAllChildren(parentId);\n const childPageBlocks = blocks.filter((b) => b.type === \"child_page\");\n\n if (childPageBlocks.length === 0) return [];\n\n const pages = await Promise.all(childPageBlocks.map((b) => this.getPage(b.id)));\n return pages;\n }\n\n async getChildPagesRecursive(parentId: string): Promise<PageObjectResponse[]> {\n const all: PageObjectResponse[] = [];\n let currentLevel: string[] = [parentId];\n\n while (currentLevel.length > 0) {\n const childArrays = await Promise.all(currentLevel.map((id) => this.getChildPages(id)));\n const nextLevel: string[] = [];\n\n for (const children of childArrays) {\n for (const child of children) {\n all.push(child);\n nextLevel.push(child.id);\n }\n }\n\n currentLevel = nextLevel;\n }\n\n return all;\n }\n\n // ─── Property Extraction ───\n\n extractTitle(page: PageObjectResponse): string {\n const props = page.properties as Record<\n string,\n { type: string; title?: Array<{ plain_text?: string }> }\n >;\n for (const prop of Object.values(props)) {\n if (prop.type === \"title\" && prop.title) {\n const joined = prop.title.map((t) => t.plain_text ?? \"\").join(\"\");\n if (joined) return joined;\n }\n }\n return \"제목 없음\";\n }\n\n extractProperties(page: PageObjectResponse): Record<string, unknown> {\n return this.propertyMapper.fromNotionProperties(page.properties as Record<string, unknown>);\n }\n\n // ─── Internal ───\n\n private async withRateLimit<T>(fn: () => Promise<T>): Promise<T> {\n await this.sema.acquire();\n try {\n return await this.executeWithRetry(fn);\n } finally {\n this.sema.release();\n }\n }\n\n private async executeWithRetry<T>(fn: () => Promise<T>, attempt: number = 0): Promise<T> {\n try {\n return await fn();\n } catch (error: unknown) {\n if (isRetryable(error) && attempt < 5) {\n const baseDelay = extractRetryAfter(error) ?? 1000 * Math.pow(2, attempt);\n const jitter = baseDelay * (0.5 + Math.random() * 0.5);\n await sleep(jitter);\n return this.executeWithRetry(fn, attempt + 1);\n }\n throw error;\n }\n }\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false;\n const code = (error as { code?: string }).code;\n if (code === \"notionhq_client_request_timeout\" || code === \"ECONNRESET\" || code === \"ETIMEDOUT\") {\n return true;\n }\n if (!(\"status\" in error)) return false;\n const status = (error as { status: number }).status;\n return status === 429 || status === 502 || status === 503 || status === 504;\n}\n\nfunction extractRetryAfter(error: unknown): number | null {\n if (typeof error === \"object\" && error !== null && \"headers\" in error) {\n const headers = (error as { headers: Record<string, string> }).headers;\n const retryAfter = headers?.[\"retry-after\"];\n if (retryAfter) return Number(retryAfter) * 1000;\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","const VALID_COLORS = new Set([\n \"default\",\n \"gray\",\n \"brown\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"pink\",\n \"red\",\n \"gray_background\",\n \"brown_background\",\n \"orange_background\",\n \"yellow_background\",\n \"green_background\",\n \"blue_background\",\n \"purple_background\",\n \"pink_background\",\n \"red_background\",\n]);\n\ntype NotionColor = string;\n\nfunction safeColor(color: string): NotionColor {\n return VALID_COLORS.has(color) ? color : \"default\";\n}\n\nexport interface RichTextSegment {\n content: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n color?: string;\n link?: string;\n}\n\nexport interface NotionRichText {\n type: \"text\";\n text: { content: string; link?: { url: string } | null };\n annotations: {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n code: boolean;\n color: string;\n };\n}\n\nexport interface NotionEquationRichText {\n type: \"equation\";\n equation: { expression: string };\n}\n\nexport interface NotionMentionRichText {\n type: \"mention\";\n mention:\n | { type: \"page\"; page: { id: string } }\n | { type: \"date\"; date: { start: string; end?: string } }\n | { type: \"user\"; user: { id: string } }\n | { type: \"database\"; database: { id: string } };\n}\n\nexport type RichTextItem = NotionRichText | NotionEquationRichText | NotionMentionRichText;\n\nexport interface NotionBlock {\n object?: \"block\";\n type: string;\n [key: string]: unknown;\n}\n\nexport class NotionBlockBuilder {\n // ─── Rich Text ──────────────────────────────────────────\n\n static richText(content: string, options?: Partial<RichTextSegment>): NotionRichText[] {\n const textObj: { content: string; link?: { url: string } | null } = { content };\n if (options?.link) {\n textObj.link = { url: options.link };\n }\n return [\n {\n type: \"text\",\n text: textObj,\n annotations: {\n bold: options?.bold ?? false,\n italic: options?.italic ?? false,\n underline: options?.underline ?? false,\n strikethrough: options?.strikethrough ?? false,\n code: options?.code ?? false,\n color: safeColor(options?.color ?? \"default\"),\n },\n },\n ];\n }\n\n static richTextArray(segments: RichTextSegment[]): NotionRichText[] {\n return segments.map((seg) => {\n const textObj: { content: string; link?: { url: string } | null } = {\n content: seg.content,\n };\n if (seg.link) {\n textObj.link = { url: seg.link };\n }\n return {\n type: \"text\" as const,\n text: textObj,\n annotations: {\n bold: seg.bold ?? false,\n italic: seg.italic ?? false,\n underline: seg.underline ?? false,\n strikethrough: seg.strikethrough ?? false,\n code: seg.code ?? false,\n color: safeColor(seg.color ?? \"default\"),\n },\n };\n });\n }\n\n static richTextEquation(expression: string): NotionEquationRichText[] {\n return [{ type: \"equation\", equation: { expression } }];\n }\n\n static richTextMentionPage(pageId: string): NotionMentionRichText[] {\n return [{ type: \"mention\", mention: { type: \"page\", page: { id: pageId } } }];\n }\n\n static richTextMentionDate(start: string, end?: string): NotionMentionRichText[] {\n const date: { start: string; end?: string } = { start };\n if (end) date.end = end;\n return [{ type: \"mention\", mention: { type: \"date\", date } }];\n }\n\n // ─── Basic Blocks ───────────────────────────────────────\n\n static paragraph(richText: RichTextItem[], color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"paragraph\",\n paragraph: { rich_text: richText, color: safeColor(color ?? \"default\") },\n };\n }\n\n static heading(\n level: 1 | 2 | 3,\n richText: RichTextItem[],\n options?: { color?: string; isToggleable?: boolean; children?: NotionBlock[] },\n ): NotionBlock {\n const key = `heading_${level}`;\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(options?.color ?? \"default\"),\n is_toggleable: options?.isToggleable ?? false,\n };\n if (options?.isToggleable && options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: key, [key]: data };\n }\n\n static callout(\n richText: RichTextItem[],\n icon?: string,\n options?: { color?: string; children?: NotionBlock[] },\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n icon: { type: \"emoji\", emoji: icon ?? \"\\u{1F4CC}\" },\n color: safeColor(options?.color ?? \"default\"),\n };\n if (options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: \"callout\", callout: data };\n }\n\n static toggle(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"toggle\", toggle: data };\n }\n\n static bulletedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"bulleted_list_item\",\n bulleted_list_item: data,\n };\n }\n\n static numberedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"numbered_list_item\",\n numbered_list_item: data,\n };\n }\n\n static toDo(richText: RichTextItem[], checked?: boolean, color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"to_do\",\n to_do: {\n rich_text: richText,\n checked: checked ?? false,\n color: safeColor(color ?? \"default\"),\n },\n };\n }\n\n static quote(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"quote\", quote: data };\n }\n\n static divider(): NotionBlock {\n return { object: \"block\", type: \"divider\", divider: {} };\n }\n\n static code(code: string, language?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: NotionBlockBuilder.richText(code),\n language: language ?? \"plain text\",\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"code\", code: data };\n }\n\n static equationBlock(expression: string): NotionBlock {\n return {\n object: \"block\",\n type: \"equation\",\n equation: { expression },\n };\n }\n\n // ─── Media Blocks ───────────────────────────────────────\n\n static image(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"image\", image: data };\n }\n\n static bookmark(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"bookmark\", bookmark: data };\n }\n\n static video(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"video\", video: data };\n }\n\n static audio(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"audio\", audio: data };\n }\n\n static fileBlock(url: string, name?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (name) data.name = name;\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"file\", file: data };\n }\n\n static pdf(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"pdf\", pdf: data };\n }\n\n static embed(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"embed\", embed: data };\n }\n\n // ─── Advanced Blocks ────────────────────────────────────\n\n static tableOfContents(color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"table_of_contents\",\n table_of_contents: { color: safeColor(color ?? \"default\") },\n };\n }\n\n static breadcrumb(): NotionBlock {\n return { object: \"block\", type: \"breadcrumb\", breadcrumb: {} };\n }\n\n static columnList(columns: NotionBlock[][]): NotionBlock {\n const children = columns.map((colBlocks) => ({\n object: \"block\" as const,\n type: \"column\" as const,\n column: { children: colBlocks },\n }));\n return {\n object: \"block\",\n type: \"column_list\",\n column_list: { children },\n };\n }\n\n static syncedBlockOriginal(children: NotionBlock[]): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: null, children },\n };\n }\n\n static syncedBlockDuplicate(originalBlockId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: { block_id: originalBlockId } },\n };\n }\n\n static linkToPage(pageId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"link_to_page\",\n link_to_page: { type: \"page_id\", page_id: pageId },\n };\n }\n\n static table(rows: string[][], hasColumnHeader?: boolean, hasRowHeader?: boolean): NotionBlock {\n if (rows.length === 0) rows = [[\"\", \"\"]];\n const width = rows[0]!.length;\n const tableRows = rows.map((row) => {\n const cells = row.map((cell) => NotionBlockBuilder.richText(cell));\n while (cells.length < width) {\n cells.push(NotionBlockBuilder.richText(\"\"));\n }\n return {\n object: \"block\" as const,\n type: \"table_row\" as const,\n table_row: { cells },\n };\n });\n return {\n object: \"block\",\n type: \"table\",\n table: {\n table_width: width,\n has_column_header: hasColumnHeader ?? true,\n has_row_header: hasRowHeader ?? false,\n children: tableRows,\n },\n };\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport function computeHash(content: string): string {\n return createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\nexport function computeBufferHash(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n","import type { LocalChange } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport interface FileInfo {\n readonly path: string;\n readonly content: string;\n readonly mtime: string;\n}\n\nexport class ChangeDetector {\n constructor(private readonly stateDb: StateDB) {}\n\n detectLocalChanges(currentFiles: FileInfo[]): LocalChange[] {\n const changes: LocalChange[] = [];\n const existingPaths = new Set<string>();\n\n for (const file of currentFiles) {\n existingPaths.add(file.path);\n const record = this.stateDb.getByPath(file.path);\n\n if (!record) {\n changes.push({\n path: file.path,\n type: \"created\",\n currentHash: computeHash(file.content),\n previousHash: null,\n });\n continue;\n }\n\n if (record.localLastModified && file.mtime === record.localLastModified) {\n continue;\n }\n\n const currentHash = computeHash(file.content);\n if (record.contentHash !== currentHash) {\n changes.push({\n path: file.path,\n type: \"modified\",\n currentHash,\n previousHash: record.contentHash,\n });\n }\n }\n\n const syncedRecords = this.stateDb.getByStatus(\"synced\");\n for (const record of syncedRecords) {\n if (!existingPaths.has(record.obsidianPath)) {\n if (record.fileType === \"folder-note\" || record.fileType === \"folder-only\") {\n if (!record.obsidianPath.endsWith(\".md\")) continue;\n }\n changes.push({\n path: record.obsidianPath,\n type: \"deleted\",\n currentHash: \"\",\n previousHash: record.contentHash,\n });\n }\n }\n\n return this.detectMoves(changes);\n }\n\n private detectMoves(changes: LocalChange[]): LocalChange[] {\n const result: LocalChange[] = [];\n const created = changes.filter((c) => c.type === \"created\");\n const deleted = changes.filter((c) => c.type === \"deleted\");\n const others = changes.filter((c) => c.type !== \"created\" && c.type !== \"deleted\");\n\n const matchedCreated = new Set<string>();\n const matchedDeleted = new Set<string>();\n\n for (const del of deleted) {\n const match = created.find(\n (c) => c.currentHash === del.previousHash && !matchedCreated.has(c.path),\n );\n if (match) {\n matchedCreated.add(match.path);\n matchedDeleted.add(del.path);\n result.push({\n path: match.path,\n type: \"moved\",\n currentHash: match.currentHash,\n previousHash: del.previousHash,\n movedFrom: del.path,\n });\n }\n }\n\n for (const c of created) {\n if (!matchedCreated.has(c.path)) result.push(c);\n }\n for (const d of deleted) {\n if (!matchedDeleted.has(d.path)) result.push(d);\n }\n result.push(...others);\n\n return result;\n }\n}\n","export interface Logger {\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n}\n\nconst consoleLogger: Logger = {\n warn: (msg, ...args) => console.warn(msg, ...args),\n error: (msg, ...args) => console.error(msg, ...args),\n info: (msg, ...args) => console.info(msg, ...args),\n debug: () => {},\n};\n\nlet currentLogger: Logger = consoleLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n","import type {\n ConversionContext,\n ConversionPath,\n ConversionResult,\n Processor,\n ProcessorInput,\n ProcessorMetadata,\n} from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport class ConversionPipeline {\n private readonly preProcessors: Processor[] = [];\n private readonly postProcessors: Processor[] = [];\n\n registerPreProcessor(processor: Processor): void {\n this.preProcessors.push(processor);\n this.preProcessors.sort((a, b) => a.order - b.order);\n }\n\n registerPostProcessor(processor: Processor): void {\n this.postProcessors.push(processor);\n this.postProcessors.sort((a, b) => a.order - b.order);\n }\n\n selectPath(content: string): ConversionPath {\n const hasInlineDb = /%% im-nobsidian:inline-db/.test(content);\n const hasColumnLayout = />\\s*\\[!col\\]/.test(content);\n const hasToggleHeading = /%% im-nobsidian:toggle-heading/.test(content);\n\n if (hasInlineDb || hasColumnLayout || hasToggleHeading) {\n return \"block-api\";\n }\n\n return \"markdown-api\";\n }\n\n convertToNotion(markdown: string, context: ConversionContext): ConversionResult {\n let input: ProcessorInput = {\n content: markdown,\n metadata: {},\n context,\n };\n\n for (const processor of this.preProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Pre-processor failed:`, error);\n }\n }\n\n return {\n content: input.content,\n properties: (input.metadata.properties as Record<string, unknown>) ?? {},\n images: input.metadata.images ?? [],\n preserveMarkers: input.metadata.preserveMarkers ?? [],\n };\n }\n\n convertToMarkdown(\n content: string,\n context: ConversionContext,\n metadata?: ProcessorMetadata,\n ): string {\n let input: ProcessorInput = {\n content,\n metadata: metadata ?? {},\n context,\n };\n\n for (const processor of this.postProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Post-processor failed:`, error);\n }\n }\n\n return input.content;\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterExtractor implements Processor {\n readonly name = \"FrontmatterExtractor\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n const { data, content } = matter(input.content);\n\n return {\n content: content.trim(),\n metadata: {\n ...input.metadata,\n properties: data,\n },\n };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n WikilinkEntry,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nconst WIKILINK_REGEX = /(?<!!)\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g;\n\nexport type WikilinkResolverFn = (text: string) => WikilinkEntry | null;\n\nexport class WikilinkResolver implements Processor {\n readonly name = \"WikilinkResolver\";\n readonly order = 20;\n\n constructor(private readonly resolve?: WikilinkResolverFn) {}\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const preserveMarkers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const resolved = input.content.replace(\n WIKILINK_REGEX,\n (_match, target: string, display?: string) => {\n const label = display ?? target;\n\n if (this.resolve) {\n const entry = this.resolve(target);\n if (entry) {\n return `<mention-page id=\"${entry.notionPageId}\">${label}</mention-page>`;\n }\n }\n\n preserveMarkers.push({\n type: \"wikilink\",\n params: display ? { text: target, display } : { text: target },\n startIndex: 0,\n });\n\n const encodedTarget = encodeURIComponent(target);\n return `[${label}](im-nobsidian://wikilink/${encodedTarget})`;\n },\n );\n\n return {\n content: resolved,\n metadata: { ...input.metadata, preserveMarkers },\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst CALLOUT_REGEX = /^> \\[!(\\w+)\\]([+-])?\\s*(.*)?$/gm;\n\nconst CALLOUT_EMOJI_MAP: Record<string, string> = {\n note: \"\\u{1F4DD}\",\n abstract: \"\\u{1F4CB}\",\n summary: \"\\u{1F4CB}\",\n info: \"\\u{2139}\\u{FE0F}\",\n tip: \"\\u{1F4A1}\",\n hint: \"\\u{1F4A1}\",\n success: \"\\u{2705}\",\n check: \"\\u{2705}\",\n question: \"\\u{2753}\",\n faq: \"\\u{2753}\",\n warning: \"\\u{26A0}\\u{FE0F}\",\n caution: \"\\u{26A0}\\u{FE0F}\",\n failure: \"\\u{274C}\",\n fail: \"\\u{274C}\",\n danger: \"\\u{1F525}\",\n error: \"\\u{1F525}\",\n bug: \"\\u{1F41B}\",\n example: \"\\u{1F4CC}\",\n quote: \"\\u{1F4AC}\",\n cite: \"\\u{1F4AC}\",\n};\n\nexport class CalloutTransformer implements Processor {\n readonly name = \"CalloutTransformer\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.path === \"markdown-api\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(\n CALLOUT_REGEX,\n (_match, type: string, foldable: string | undefined, title: string | undefined) => {\n const emoji = CALLOUT_EMOJI_MAP[type.toLowerCase()] ?? \"\\u{1F4DD}\";\n const titleText = title?.trim() || type;\n const foldMeta = foldable\n ? `\\n%% im-nobsidian:callout:type=${type}&foldable=${foldable === \"+\" ? \"open\" : \"closed\"} %%`\n : `\\n%% im-nobsidian:callout:type=${type} %%`;\n\n return `> ${emoji} **${titleText}**${foldMeta}`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst BLOCK_MATH_REGEX = /\\$\\$([\\s\\S]+?)\\$\\$/g;\nconst INLINE_MATH_REGEX = /(?<![\\\\$])\\$([^\\n$]+?)\\$(?!\\$)/g;\n\nexport class MathNormalizer implements Processor {\n readonly name = \"MathNormalizer\";\n readonly order = 50;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(BLOCK_MATH_REGEX, (_match, equation: string) => {\n return `$$\\n${equation.trim()}\\n$$`;\n });\n\n content = content.replace(INLINE_MATH_REGEX, (_match, equation: string) => {\n return `$${equation.trim()}$`;\n });\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { ImageReference } from \"../../types/convert.js\";\n\nconst OBSIDIAN_EMBED_REGEX = /!\\[\\[([^\\]]+)\\]\\]/g;\nconst MARKDOWN_IMAGE_REGEX = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst VIDEO_HOSTS = [\"youtube.com\", \"youtu.be\", \"vimeo.com\"];\n\nexport class EmbedResolver implements Processor {\n readonly name = \"EmbedResolver\";\n readonly order = 60;\n\n process(input: ProcessorInput): ProcessorOutput {\n const images: ImageReference[] = input.metadata.images ? [...input.metadata.images] : [];\n const isPush = input.context.direction === \"push\";\n\n let content = input.content.replace(OBSIDIAN_EMBED_REGEX, (_match, target: string) => {\n if (isImageFile(target)) {\n images.push({ url: target, localPath: target, isExternal: false });\n if (isPush && !isExternalUrl(target)) {\n const fileName = target.split(\"/\").pop() ?? target;\n return `> 📎 ${fileName}\\n> %% im-nobsidian:local-image:${target} %%`;\n }\n return `![${target}](${encodeURI(target)})`;\n }\n const encoded = encodeURIComponent(target);\n return `[${target}](im-nobsidian://embed/${encoded})`;\n });\n\n content = content.replace(MARKDOWN_IMAGE_REGEX, (_match, alt: string, url: string) => {\n if (isVideoUrl(url)) {\n return `%% im-nobsidian:embed:type=video&url=${encodeURIComponent(url)} %%\\n[${alt || \"Video\"}](${url})`;\n }\n if (isExternalUrl(url)) {\n images.push({ url, isExternal: true });\n }\n return `![${alt}](${url})`;\n });\n\n return {\n content,\n metadata: { ...input.metadata, images },\n };\n }\n}\n\nfunction isImageFile(path: string): boolean {\n return /\\.(png|jpg|jpeg|gif|svg|webp|bmp|ico)$/i.test(path);\n}\n\nfunction isVideoUrl(url: string): boolean {\n return VIDEO_HOSTS.some((host) => url.includes(host));\n}\n\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { PreserveMarker } from \"../../types/convert.js\";\n\nconst MARKER_REGEX = /%% im-nobsidian:(\\w[\\w-]*):([^\\s]+?) %%/g;\n\nexport class PreserveMarkerCollector implements Processor {\n readonly name = \"PreserveMarkerCollector\";\n readonly order = 70;\n\n process(input: ProcessorInput): ProcessorOutput {\n const markers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const matches = [...input.content.matchAll(MARKER_REGEX)];\n for (const match of matches) {\n markers.push({\n type: match[1]!,\n params: parseMarkerParams(match[2]!),\n startIndex: match.index!,\n });\n }\n\n return {\n content: input.content,\n metadata: { ...input.metadata, preserveMarkers: markers },\n };\n }\n}\n\nfunction parseMarkerParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx > 0) {\n params[pair.slice(0, eqIdx)] = decodeURIComponent(pair.slice(eqIdx + 1));\n }\n }\n return params;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNSUPPORTED_CALLOUT_REGEX = /> \\[!im-nobsidian-unsupported\\][^\\n]*\\n(?:>[^\\n]*\\n)*/g;\n\nexport class UnsupportedBlockStripper implements Processor {\n readonly name = \"UnsupportedBlockStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(UNSUPPORTED_CALLOUT_REGEX, \"\");\n\n return {\n content: content.replace(/\\n{3,}/g, \"\\n\\n\"),\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class PropertiesTableInjector implements Processor {\n readonly name = \"PropertiesTableInjector\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n if (input.context.parentMode === \"database\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const filteredProps: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n filteredProps[key] = value;\n }\n\n if (Object.keys(filteredProps).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlStr = matter.stringify(\"\", filteredProps).trim();\n const yamlBody = yamlStr.slice(4, -3).trim();\n const codeBlock = \"```yaml\\n# im-nobsidian:properties\\n\" + yamlBody + \"\\n```\";\n\n const content = codeBlock + \"\\n\\n---\\n\\n\" + input.content;\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNDERLINE_REGEX = /<u>([\\s\\S]*?)<\\/u>/g;\n\nconst COLOR_SPAN_REGEX = /<span class=\"notion-(\\w+?)(?:-bg)?\">([\\s\\S]*?)<\\/span>/g;\n\nconst IM_NOBSIDIAN_COLOR_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class HtmlAnnotationStripper implements Processor {\n readonly name = \"HtmlAnnotationStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n content = content.replace(IM_NOBSIDIAN_COLOR_REGEX, (_m, _color: string, text: string) => text);\n\n content = content.replace(UNDERLINE_REGEX, (_m, text: string) => text);\n\n content = content.replace(COLOR_SPAN_REGEX, (_m, _color: string, text: string) => text);\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst NOTION_LINK_REGEX =\n /\\[([^\\]]+)\\]\\((?:https:\\/\\/(?:www\\.)?notion\\.so\\/|notion:\\/\\/)([a-f0-9-]+)\\)/g;\n\nconst WIKILINK_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/wikilink\\/([^)]+)\\)/g;\n\nconst EMBED_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/embed\\/([^)]+)\\)/g;\n\nexport class MentionToWikilink implements Processor {\n readonly name = \"MentionToWikilink\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(NOTION_LINK_REGEX, (_match, display: string) => `[[${display}]]`);\n\n content = content.replace(\n WIKILINK_PRESERVE_REGEX,\n (_match, display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return target === display ? `[[${target}]]` : `[[${target}|${display}]]`;\n },\n );\n\n content = content.replace(\n EMBED_PRESERVE_REGEX,\n (_match, _display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return `![[${target}]]`;\n },\n );\n\n return { content, metadata: input.metadata };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nexport class PreserveMarkerInjector implements Processor {\n readonly name = \"PreserveMarkerInjector\";\n readonly order = 100;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const markers = input.metadata.preserveMarkers;\n if (!markers || markers.length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n const missingMarkers = markers.filter((m) => !content.includes(this.formatMarker(m)));\n\n if (missingMarkers.length === 0) {\n return { content, metadata: input.metadata };\n }\n\n const markerLines = missingMarkers.map((m) => this.formatMarker(m));\n const suffix = \"\\n\\n\" + markerLines.join(\"\\n\");\n content = content.trimEnd() + suffix + \"\\n\";\n\n return { content, metadata: input.metadata };\n }\n\n private formatMarker(marker: PreserveMarker): string {\n const params = Object.entries(marker.params)\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n return `%% im-nobsidian:${marker.type}:${params} %%`;\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n};\n\nconst CALLOUT_PRESERVE_REGEX = /%% im-nobsidian:callout:type=(\\w+)(?:&foldable=(open|closed))? %%/g;\n\nexport class CalloutRestorer implements Processor {\n readonly name = \"CalloutRestorer\";\n readonly order = 20;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(CALLOUT_PRESERVE_REGEX, (_match, type: string, foldable?: string) => {\n if (foldable) {\n const foldChar = foldable === \"open\" ? \"+\" : \"-\";\n return `[!${type}]${foldChar}`;\n }\n return `[!${type}]`;\n });\n\n for (const [emoji, type] of Object.entries(EMOJI_TYPE_MAP)) {\n const pattern = new RegExp(`> ${escapeRegex(emoji)} \\\\*\\\\*(.+?)\\\\*\\\\*`, \"g\");\n content = content.replace(pattern, (_match, title: string) => {\n if (title.toLowerCase() === type) {\n return `> [!${type}]`;\n }\n return `> [!${type}] ${title}`;\n });\n }\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst COLOR_MARKER_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class ColorAnnotator implements Processor {\n readonly name = \"ColorAnnotator\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n const content = input.content.replace(\n COLOR_MARKER_REGEX,\n (_match, color: string, text: string) => {\n const cssClass = color.endsWith(\"_background\")\n ? `notion-${color.replace(\"_background\", \"-bg\")}`\n : `notion-${color}`;\n return `<span class=\"${cssClass}\">${text}</span>`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterGenerator implements Processor {\n readonly name = \"FrontmatterGenerator\";\n readonly order = 90;\n\n process(input: ProcessorInput): ProcessorOutput {\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const normalized = normalizeProperties(properties);\n const content = matter.stringify(input.content, normalized);\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction normalizeProperties(props: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n const normalized = normalizeValue(value);\n if (normalized !== undefined) {\n result[key] = normalized;\n }\n }\n\n return result;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n return normalizeDate(value);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return undefined;\n return value;\n }\n\n if (typeof value === \"object\" && value !== null && \"start\" in value) {\n const dateObj = value as { start: string; end?: string | null };\n const normalized = {\n start: normalizeDate(dateObj.start),\n ...(dateObj.end ? { end: normalizeDate(dateObj.end) } : {}),\n };\n return normalized;\n }\n\n return value;\n}\n\nconst MIDNIGHT_RE = /T00:00:00(?:\\.\\d{3})?(?:Z|[+-]\\d{2}:\\d{2})/;\n\nfunction normalizeDate(dateStr: string): string {\n if (typeof dateStr !== \"string\") return dateStr;\n if (MIDNIGHT_RE.test(dateStr)) {\n return dateStr.split(\"T\")[0] ?? dateStr;\n }\n return dateStr;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst LOCAL_IMAGE_MARKER_REGEX =\n />\\s*📎\\s*[^\\n]*\\n>\\s*%%\\s*im-nobsidian:local-image:([^\\s]+)\\s*%%/g;\n\nexport class LocalImageRestorer implements Processor {\n readonly name = \"LocalImageRestorer\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(LOCAL_IMAGE_MARKER_REGEX, (_match, target: string) => {\n return `![[${target}]]`;\n });\n\n return { content, metadata: input.metadata };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst YAML_PROPERTIES_REGEX = /```yaml\\n# im-nobsidian:properties\\n([\\s\\S]*?)```\\n*(?:---\\n*)?/;\n\nconst LEGACY_TABLE_REGEX =\n /^\\s*\\| Property\\s*\\| Value\\s*\\|\\n\\s*\\|\\s*-{3,}\\s*\\|\\s*-{3,}\\s*\\|\\n((?:\\|[^\\n]+\\|\\n?)+)\\n*---\\n*/;\n\nexport class PropertiesTableRestorer implements Processor {\n readonly name = \"PropertiesTableRestorer\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlMatch = input.content.match(YAML_PROPERTIES_REGEX);\n if (yamlMatch) {\n return this.restoreFromYaml(input, yamlMatch);\n }\n\n const tableMatch = input.content.match(LEGACY_TABLE_REGEX);\n if (tableMatch) {\n return this.restoreFromTable(input, tableMatch);\n }\n\n return { content: input.content, metadata: input.metadata };\n }\n\n private restoreFromYaml(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const yamlContent = match[1]!;\n const fakeDocument = `---\\n${yamlContent}---\\n`;\n\n let parsed: Record<string, unknown>;\n try {\n const result = matter(fakeDocument);\n parsed = result.data;\n } catch {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n ...parsed,\n };\n\n const content = input.content.replace(YAML_PROPERTIES_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n\n private restoreFromTable(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const rows = match[1]!.trim().split(\"\\n\");\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n };\n\n for (const row of rows) {\n const cells = row\n .split(\"|\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length >= 2) {\n const key = cells[0]!;\n const rawValue = cells[1]!;\n properties[key] = parseLegacyValue(rawValue);\n }\n }\n\n const content = input.content.replace(LEGACY_TABLE_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n}\n\nfunction parseLegacyValue(raw: string): unknown {\n if (raw === \"\" || raw === \"null\") return null;\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n\n const unquoted = stripQuotes(raw);\n const num = Number(unquoted);\n if (!isNaN(num) && unquoted.trim() !== \"\") return num;\n\n if (unquoted.includes(\", \")) {\n const parts = unquoted.split(\", \");\n const looksLikeArray = parts.every((p) => p.split(/\\s+/).length <= 3);\n if (looksLikeArray) {\n return parts.map((v) => {\n const n = Number(v);\n return !isNaN(n) && v.trim() !== \"\" ? n : v;\n });\n }\n }\n\n if (unquoted.startsWith(\"{\") || unquoted.startsWith(\"[\")) {\n try {\n return JSON.parse(unquoted);\n } catch {\n return unquoted;\n }\n }\n\n return unquoted;\n}\n\nfunction stripQuotes(s: string): string {\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { ConversionPipeline } from \"./pipeline.js\";\nimport { FrontmatterExtractor } from \"./pre-processors/frontmatter.js\";\nimport { WikilinkResolver, type WikilinkResolverFn } from \"./pre-processors/wikilink.js\";\nimport { CalloutTransformer } from \"./pre-processors/callout.js\";\nimport { MathNormalizer } from \"./pre-processors/math.js\";\nimport { EmbedResolver } from \"./pre-processors/embed.js\";\nimport { PreserveMarkerCollector } from \"./pre-processors/preserve-marker.js\";\nimport { UnsupportedBlockStripper } from \"./pre-processors/unsupported-block-stripper.js\";\nimport { PropertiesTableInjector } from \"./pre-processors/properties-table.js\";\nimport { HtmlAnnotationStripper } from \"./pre-processors/html-annotation.js\";\nimport { MentionToWikilink } from \"./post-processors/mention-to-wikilink.js\";\nimport { PreserveMarkerInjector } from \"./post-processors/preserve-marker-injector.js\";\nimport { CalloutRestorer } from \"./post-processors/callout-restorer.js\";\nimport { ColorAnnotator } from \"./post-processors/color-annotator.js\";\nimport { FrontmatterGenerator } from \"./post-processors/frontmatter-generator.js\";\nimport { LocalImageRestorer } from \"./post-processors/local-image-restorer.js\";\nimport { PropertiesTableRestorer } from \"./post-processors/properties-table-restorer.js\";\n\nexport interface PipelineOptions {\n readonly wikilinkResolver?: WikilinkResolverFn;\n}\n\nexport function createDefaultPipeline(options?: PipelineOptions): ConversionPipeline {\n const pipeline = new ConversionPipeline();\n\n pipeline.registerPreProcessor(new HtmlAnnotationStripper());\n pipeline.registerPreProcessor(new UnsupportedBlockStripper());\n pipeline.registerPreProcessor(new FrontmatterExtractor());\n pipeline.registerPreProcessor(new PropertiesTableInjector());\n pipeline.registerPreProcessor(new WikilinkResolver(options?.wikilinkResolver));\n pipeline.registerPreProcessor(new CalloutTransformer());\n pipeline.registerPreProcessor(new MathNormalizer());\n pipeline.registerPreProcessor(new EmbedResolver());\n pipeline.registerPreProcessor(new PreserveMarkerCollector());\n\n pipeline.registerPostProcessor(new PropertiesTableRestorer());\n pipeline.registerPostProcessor(new LocalImageRestorer());\n pipeline.registerPostProcessor(new PreserveMarkerInjector());\n pipeline.registerPostProcessor(new MentionToWikilink());\n pipeline.registerPostProcessor(new CalloutRestorer());\n pipeline.registerPostProcessor(new ColorAnnotator());\n pipeline.registerPostProcessor(new FrontmatterGenerator());\n\n return pipeline;\n}\n","import { markdownToBlocks } from \"@tryfabric/martian\";\nimport { NotionToMarkdown } from \"notion-to-md\";\nimport type { Client } from \"@notionhq/client\";\nimport type { BlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { NotionBlockBuilder } from \"../notion/block-builder.js\";\nimport type { NotionBlock } from \"../notion/block-builder.js\";\n\nconst TRULY_UNSUPPORTED_BLOCK_TYPES = [\"unsupported\", \"template\"] as const;\n\nconst DIVIDER_PLACEHOLDER = \"​%%IM-NOBSIDIAN_DIVIDER%%​\";\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\nconst COLUMN_LIST_START = \"%%im-nobsidian:column-list:start%%\";\nconst COLUMN_SEP = \"%%im-nobsidian:column%%\";\nconst COLUMN_LIST_END = \"%%im-nobsidian:column-list:end%%\";\n\nconst VIDEO_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch/,\n /^https?:\\/\\/youtu\\.be\\//,\n /^https?:\\/\\/(www\\.)?vimeo\\.com\\//,\n /^https?:\\/\\/(www\\.)?dailymotion\\.com\\//,\n /^https?:\\/\\/(www\\.)?loom\\.com\\/share\\//,\n];\n\nconst EMBED_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?figma\\.com\\//,\n /^https?:\\/\\/docs\\.google\\.com\\//,\n /^https?:\\/\\/drive\\.google\\.com\\//,\n /^https?:\\/\\/(www\\.)?miro\\.com\\//,\n /^https?:\\/\\/(www\\.)?twitter\\.com\\//,\n /^https?:\\/\\/(www\\.)?x\\.com\\//,\n /^https?:\\/\\/codepen\\.io\\//,\n /^https?:\\/\\/gist\\.github\\.com\\//,\n /^https?:\\/\\/(www\\.)?spotify\\.com\\//,\n /^https?:\\/\\/(www\\.)?soundcloud\\.com\\//,\n];\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ntype RichTextItem = { plain_text: string; href?: string | null };\n\nfunction richTextToPlain(richText: RichTextItem[] | undefined): string {\n if (!richText) return \"\";\n return richText.map((t) => t.plain_text).join(\"\");\n}\n\ninterface RichTextAnnotated extends RichTextItem {\n annotations?: Record<string, unknown>;\n type?: string;\n equation?: { expression: string };\n mention?: {\n type: string;\n page?: { id: string };\n date?: { start: string; end?: string | null };\n user?: { id: string; name?: string };\n database?: { id: string };\n };\n}\n\nfunction richTextToMarkdown(richText: RichTextAnnotated[] | undefined): string {\n if (!richText) return \"\";\n return richText\n .map((t) => {\n if (t.type === \"equation\" && t.equation) {\n return `$${t.equation.expression}$`;\n }\n\n if (t.type === \"mention\" && t.mention) {\n return formatMention(t.mention);\n }\n\n let text = t.plain_text;\n const a = t.annotations;\n if (a?.code) text = `\\`${text}\\``;\n if (a?.bold) text = `**${text}**`;\n if (a?.italic) text = `*${text}*`;\n if (a?.strikethrough) text = `~~${text}~~`;\n if (a?.underline) text = `<u>${text}</u>`;\n if (t.href) text = `[${text}](${t.href})`;\n\n const color = a?.color as string | undefined;\n if (color && color !== \"default\") {\n text = `%% im-nobsidian:color:${color} %%${text}%% im-nobsidian:end %%`;\n }\n\n return text;\n })\n .join(\"\");\n}\n\nfunction formatMention(mention: NonNullable<RichTextAnnotated[\"mention\"]>): string {\n switch (mention.type) {\n case \"page\":\n return mention.page ? `[[${mention.page.id}]]` : \"\";\n case \"date\": {\n if (!mention.date) return \"\";\n const start = mention.date.start;\n return mention.date.end ? `${start} → ${mention.date.end}` : start;\n }\n case \"user\":\n return mention.user?.name ? `@${mention.user.name}` : \"@user\";\n case \"database\":\n return mention.database ? `[[${mention.database.id}]]` : \"\";\n default:\n return \"\";\n }\n}\n\nexport class BlockConverter {\n private n2m: NotionToMarkdown | null = null;\n private client: Client | null = null;\n\n initNotionToMd(client: Client): void {\n this.client = client;\n this.n2m = new NotionToMarkdown({ notionClient: client });\n this.registerCustomTransformers();\n }\n\n private registerCustomTransformers(): void {\n if (!this.n2m) return;\n\n for (const blockType of TRULY_UNSUPPORTED_BLOCK_TYPES) {\n this.n2m.setCustomTransformer(blockType, (block) => {\n const id = block.id ?? \"unknown\";\n return Promise.resolve(\n `> [!im-nobsidian-unsupported] Notion 전용 블록\\n> type: ${blockType}, id: ${id}\\n> %%im-nobsidian:unsupported:type=${blockType}&id=${id}%%`,\n );\n });\n }\n\n this.registerToggleTransformer();\n this.registerColumnTransformer();\n this.registerSyncedBlockTransformer();\n this.registerBookmarkTransformer();\n this.registerVideoTransformer();\n this.registerAudioTransformer();\n this.registerFileTransformer();\n this.registerChildPageTransformer();\n this.registerChildDatabaseTransformer();\n this.registerLinkToPageTransformer();\n this.registerTocTransformer();\n this.registerBreadcrumbTransformer();\n this.registerLinkPreviewTransformer();\n this.registerPdfTransformer();\n this.registerEmbedTransformer();\n this.registerCalloutTransformer();\n this.registerToggleHeadingTransformers();\n }\n\n private registerToggleTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"toggle\", async (block) => {\n const b = block as unknown as { toggle: { rich_text: RichTextItem[] } } & BlockObjectResponse;\n const title = richTextToMarkdown(b.toggle?.rich_text as never);\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n const indented = childMd\n .split(\"\\n\")\n .map((line: string) => (line ? ` ${line}` : \"\"))\n .join(\"\\n\")\n .trimEnd();\n return `${TOGGLE_START}\\n- ${title}\\n${indented}\\n${TOGGLE_END}`;\n });\n }\n\n private registerToggleHeadingTransformers(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n\n for (const level of [1, 2, 3] as const) {\n const headingKey = `heading_${level}` as const;\n this.n2m.setCustomTransformer(headingKey, async (block) => {\n const b = block as unknown as {\n [K in typeof headingKey]: { rich_text: RichTextItem[]; is_toggleable?: boolean };\n } & BlockObjectResponse;\n const headingData = b[headingKey];\n const text = richTextToMarkdown(headingData?.rich_text as never);\n const prefix = \"#\".repeat(level);\n\n if (headingData?.is_toggleable && b.has_children) {\n const children = await n2m.pageToMarkdown(b.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n return `${prefix} ${text}\\n\\n${childMd.trimEnd()}`;\n }\n\n return `${prefix} ${text}`;\n });\n }\n }\n\n private registerColumnTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"column_list\", async (block) => {\n const b = block as BlockObjectResponse;\n const response = await client.blocks.children.list({ block_id: b.id });\n const columns = response.results as BlockObjectResponse[];\n const parts: string[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i]!;\n const children = await n2m.pageToMarkdown(col.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n parts.push(`${COLUMN_SEP}\\n${childMd.trimEnd()}`);\n }\n\n return `${COLUMN_LIST_START}\\n${parts.join(\"\\n\")}\\n${COLUMN_LIST_END}`;\n });\n\n this.n2m.setCustomTransformer(\"column\", async () => \"\");\n }\n\n private registerSyncedBlockTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"synced_block\", async (block) => {\n const b = block as unknown as {\n synced_block: { synced_from: { block_id: string } | null };\n } & BlockObjectResponse;\n\n const sourceId = b.synced_block?.synced_from?.block_id ?? b.id;\n\n const response = await client.blocks.children.list({ block_id: sourceId });\n const mdBlocks: unknown[] = [];\n for (const child of response.results as BlockObjectResponse[]) {\n const result = await n2m.blockToMarkdown(child as never);\n if (result) mdBlocks.push(result);\n }\n const childMd = n2m.toMarkdownString(mdBlocks as never).parent ?? \"\";\n return childMd.trimEnd();\n });\n }\n\n private registerBookmarkTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"bookmark\", async (block) => {\n const b = block as unknown as {\n bookmark: { url: string; caption?: RichTextItem[] };\n };\n const url = b.bookmark?.url ?? \"\";\n const caption = richTextToPlain(b.bookmark?.caption);\n if (caption) {\n return `[${caption}](${url})`;\n }\n return `[${url}](${url})`;\n });\n }\n\n private registerVideoTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"video\", async (block) => {\n const b = block as unknown as {\n video: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.video?.type === \"external\" ? b.video.external?.url : b.video?.file?.url;\n const caption = richTextToPlain(b.video?.caption);\n return `![${caption || \"video\"}](${url ?? \"\"})`;\n });\n }\n\n private registerAudioTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"audio\", async (block) => {\n const b = block as unknown as {\n audio: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.audio?.type === \"external\" ? b.audio.external?.url : b.audio?.file?.url;\n const caption = richTextToPlain(b.audio?.caption);\n return `![${caption || \"audio\"}](${url ?? \"\"})`;\n });\n }\n\n private registerFileTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"file\", async (block) => {\n const b = block as unknown as {\n file: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n name?: string;\n };\n };\n const url = b.file?.type === \"external\" ? b.file.external?.url : b.file?.file?.url;\n const name = b.file?.name ?? richTextToPlain(b.file?.caption) ?? \"file\";\n return `[${name}](${url ?? \"\"})`;\n });\n }\n\n private registerChildPageTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_page\", async (block) => {\n const b = block as unknown as { child_page: { title: string } };\n const title = b.child_page?.title ?? \"Untitled\";\n return `[[${title}]]`;\n });\n }\n\n private registerChildDatabaseTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_database\", async (block) => {\n const b = block as unknown as {\n child_database: { title: string };\n } & BlockObjectResponse;\n const title = b.child_database?.title ?? \"Database\";\n return `> [!database] ${title}\\n> %%im-nobsidian:child-database:id=${b.id}&title=${encodeURIComponent(title)}%%`;\n });\n }\n\n private registerLinkToPageTransformer(): void {\n if (!this.n2m) return;\n const client = this.client!;\n this.n2m.setCustomTransformer(\"link_to_page\", async (block) => {\n const b = block as unknown as {\n link_to_page: { type: string; page_id?: string; database_id?: string };\n };\n const pageId = b.link_to_page?.page_id ?? b.link_to_page?.database_id;\n if (!pageId) return \"\";\n try {\n const page = await client.pages.retrieve({ page_id: pageId });\n const p = page as {\n properties: Record<string, { type: string; title?: Array<{ plain_text: string }> }>;\n };\n for (const prop of Object.values(p.properties)) {\n if (prop.type === \"title\" && prop.title?.[0]?.plain_text) {\n return `[[${prop.title[0].plain_text}]]`;\n }\n }\n } catch {\n // fallback\n }\n return `[[${pageId}]]`;\n });\n }\n\n private registerTocTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"table_of_contents\", async () => {\n return `%%im-nobsidian:toc%%`;\n });\n }\n\n private registerBreadcrumbTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"breadcrumb\", async () => \"\");\n }\n\n private registerLinkPreviewTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"link_preview\", async (block) => {\n const b = block as unknown as { link_preview: { url: string } };\n const url = b.link_preview?.url ?? \"\";\n return `[${url}](${url})`;\n });\n }\n\n private registerPdfTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"pdf\", async (block) => {\n const b = block as unknown as {\n pdf: {\n type: string;\n file?: { url: string };\n external?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.pdf?.type === \"file\" ? (b.pdf.file?.url ?? \"\") : (b.pdf?.external?.url ?? \"\");\n const caption = b.pdf?.caption ? richTextToMarkdown(b.pdf.caption as never) : \"\";\n return `[📄 ${caption || \"PDF\"}](${url})`;\n });\n }\n\n private registerEmbedTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"embed\", async (block) => {\n const b = block as unknown as {\n embed: { url: string; caption?: RichTextItem[] };\n };\n const url = b.embed?.url ?? \"\";\n const caption = b.embed?.caption ? richTextToMarkdown(b.embed.caption as never) : \"\";\n return `[${caption || url}](${url})`;\n });\n }\n\n private registerCalloutTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"callout\", async (block) => {\n const b = block as unknown as {\n callout: { rich_text: RichTextItem[]; icon?: { type: string; emoji?: string } };\n } & BlockObjectResponse;\n const text = richTextToMarkdown(b.callout?.rich_text as never);\n const emoji = b.callout?.icon?.emoji ?? \"\";\n\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n\n const EMOJI_TO_TYPE: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n };\n const calloutType = EMOJI_TO_TYPE[emoji] ?? \"note\";\n\n let result = `> [!${calloutType}] ${text}`;\n if (childMd?.trim()) {\n const lines = childMd\n .trim()\n .split(\"\\n\")\n .map((l: string) => `> ${l}`);\n result += \"\\n\" + lines.join(\"\\n\");\n }\n return result;\n });\n }\n\n markdownToNotionBlocks(markdown: string): unknown[] {\n const preprocessed = this.preProcessMarkdown(markdown);\n const blocks = markdownToBlocks(preprocessed) as Array<Record<string, unknown>>;\n const processed = this.postProcessBlocks(blocks);\n return normalizeBlocksForNotion(processed as Array<Record<string, unknown>>);\n }\n\n private toggleContents: Map<number, string> = new Map();\n private columnContents: Map<number, string[]> = new Map();\n private toggleCounter = 0;\n private columnCounter = 0;\n\n private preProcessMarkdown(markdown: string): string {\n this.toggleContents.clear();\n this.columnContents.clear();\n this.toggleCounter = 0;\n this.columnCounter = 0;\n\n let processed = this.extractToggleBlocks(markdown);\n processed = this.extractColumnBlocks(processed);\n processed = this.replaceDividers(processed);\n return processed;\n }\n\n private replaceDividers(markdown: string): string {\n const lines = markdown.split(\"\\n\");\n const result: string[] = [];\n let inCodeBlock = false;\n\n for (const line of lines) {\n if (line.trimStart().startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n }\n\n if (!inCodeBlock && /^---\\s*$/.test(line.trim())) {\n result.push(DIVIDER_PLACEHOLDER);\n } else {\n result.push(line);\n }\n }\n\n return result.join(\"\\n\");\n }\n\n private extractToggleBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(TOGGLE_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(TOGGLE_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const content = result.slice(match.index + match[0].length + 1, endMatch.index).trimEnd();\n const id = this.toggleCounter++;\n this.toggleContents.set(id, content);\n\n const placeholder = `%%IM-NOBSIDIAN_TOGGLE_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private extractColumnBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(COLUMN_LIST_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(COLUMN_LIST_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const inner = result.slice(match.index + match[0].length + 1, endMatch.index);\n const columns = inner\n .split(new RegExp(`^${escapeRegex(COLUMN_SEP)}$`, \"m\"))\n .map((c) => c.trim())\n .filter(Boolean);\n\n const id = this.columnCounter++;\n this.columnContents.set(id, columns);\n\n const placeholder = `%%IM-NOBSIDIAN_COLLIST_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private postProcessBlocks(blocks: Array<Record<string, unknown>>): unknown[] {\n const result: unknown[] = [];\n\n for (const block of blocks) {\n const toggleConverted = this.convertTogglePlaceholder(block);\n if (toggleConverted) {\n result.push(toggleConverted);\n continue;\n }\n\n const columnConverted = this.convertColumnPlaceholder(block);\n if (columnConverted) {\n result.push(columnConverted);\n continue;\n }\n\n const dividerConverted = this.convertDividerPlaceholder(block);\n if (dividerConverted) {\n result.push(dividerConverted);\n continue;\n }\n\n const videoConverted = this.convertImageToVideoOrEmbed(block);\n if (videoConverted) {\n result.push(videoConverted);\n continue;\n }\n\n const calloutConverted = this.convertQuoteToCallout(block);\n result.push(calloutConverted);\n }\n\n return result;\n }\n\n private convertTogglePlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const toggleMatch = text.match(/%%IM-NOBSIDIAN_TOGGLE_(\\d+)%%/);\n if (!toggleMatch) return null;\n\n const id = parseInt(toggleMatch[1]!, 10);\n const content = this.toggleContents.get(id);\n if (content === undefined) return null;\n\n const titleMatch = content.match(/^- (.+)$/m);\n const title = titleMatch?.[1] ?? \"Toggle\";\n\n const childLines = content.split(\"\\n\").slice(1);\n const childMd = childLines\n .map((l) => (l.startsWith(\" \") ? l.slice(2) : l))\n .join(\"\\n\")\n .trim();\n\n const children = childMd ? (markdownToBlocks(childMd) as Array<Record<string, unknown>>) : [];\n\n return NotionBlockBuilder.toggle(\n NotionBlockBuilder.richText(title),\n children.length > 0 ? (children as unknown as NotionBlock[]) : undefined,\n );\n }\n\n private convertColumnPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const colMatch = text.match(/%%IM-NOBSIDIAN_COLLIST_(\\d+)%%/);\n if (!colMatch) return null;\n\n const id = parseInt(colMatch[1]!, 10);\n const columns = this.columnContents.get(id);\n if (!columns) return null;\n\n const columnBlocks = columns.map((colMd) => {\n const blocks = markdownToBlocks(colMd) as Array<Record<string, unknown>>;\n return this.postProcessBlocks(blocks) as unknown as NotionBlock[];\n });\n\n return NotionBlockBuilder.columnList(columnBlocks);\n }\n\n private convertDividerPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n if (text.includes(\"%%IM-NOBSIDIAN_DIVIDER%%\")) {\n return NotionBlockBuilder.divider();\n }\n return null;\n }\n\n private convertImageToVideoOrEmbed(block: Record<string, unknown>): unknown | null {\n let url = \"\";\n let caption: string | undefined;\n\n if (block.type === \"image\") {\n const img = block.image as\n | { external?: { url: string }; caption?: Array<{ text?: { content: string } }> }\n | undefined;\n url = img?.external?.url ?? \"\";\n caption = img?.caption?.[0]?.text?.content;\n } else if (block.type === \"paragraph\") {\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const texts = para?.rich_text ?? [];\n if (texts.length === 1) {\n const content = texts[0]?.text?.content ?? \"\";\n if (/^https?:\\/\\//.test(content)) {\n url = content;\n }\n }\n }\n\n if (!url) return null;\n\n if (VIDEO_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.video(url, caption);\n }\n\n if (EMBED_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.embed(url, caption);\n }\n\n return null;\n }\n\n private convertQuoteToCallout(block: Record<string, unknown>): unknown {\n if (block.type !== \"quote\") return block;\n\n const quote = block.quote as\n | {\n rich_text: Array<{\n type: string;\n text?: { content: string; link?: unknown };\n annotations?: Record<string, boolean>;\n }>;\n children?: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!quote?.rich_text?.[0]) return block;\n\n const firstText = quote.rich_text[0]?.text?.content ?? \"\";\n\n const KNOWN_CALLOUT_EMOJIS = [\n \"\\u{1F4DD}\",\n \"\\u{1F4CB}\",\n \"\\u{2139}\\u{FE0F}\",\n \"\\u{1F4A1}\",\n \"\\u{2705}\",\n \"\\u{2753}\",\n \"\\u{26A0}\\u{FE0F}\",\n \"\\u{274C}\",\n \"\\u{1F525}\",\n \"\\u{1F41B}\",\n \"\\u{1F4CC}\",\n \"\\u{1F4AC}\",\n ];\n const matchedEmoji = KNOWN_CALLOUT_EMOJIS.find((e) => firstText.startsWith(e));\n if (!matchedEmoji) return block;\n\n const emoji = matchedEmoji;\n const remainingText = firstText.slice(emoji.length).replace(/^\\s+/, \"\");\n\n const newRichText = [...quote.rich_text];\n if (remainingText) {\n newRichText[0] = {\n ...newRichText[0]!,\n text: { content: remainingText, link: null },\n };\n } else {\n newRichText.shift();\n }\n\n return {\n type: \"callout\",\n callout: {\n rich_text: newRichText,\n icon: { type: \"emoji\", emoji },\n children: quote.children ?? [],\n },\n };\n }\n\n async notionBlocksToMarkdown(pageId: string): Promise<string> {\n if (!this.n2m) {\n throw new Error(\n \"NotionToMarkdown이 초기화되지 않았습니다. initNotionToMd()를 먼저 호출하세요.\",\n );\n }\n\n const mdBlocks = await this.n2m.pageToMarkdown(pageId);\n const result = this.n2m.toMarkdownString(mdBlocks);\n return result.parent ?? \"\";\n }\n}\n\nconst NOTION_MAX_TABLE_ROWS = 100;\nconst NOTION_MAX_LIST_DEPTH = 3;\n\nfunction normalizeBlocksForNotion(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n\n for (const block of blocks) {\n if (block.type === \"table\") {\n result.push(...normalizeTable(block));\n } else if (isListBlock(block)) {\n result.push(flattenListDepth(block, 0));\n } else {\n result.push(block);\n }\n }\n\n return result;\n}\n\nfunction normalizeTable(block: Record<string, unknown>): Array<Record<string, unknown>> {\n const table = block.table as\n | {\n table_width: number;\n has_column_header: boolean;\n has_row_header: boolean;\n children: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!table?.children) return [block];\n\n const rows = table.children;\n if (rows.length === 0) return [block];\n\n let maxCells = table.table_width;\n for (const row of rows) {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (tr?.cells && tr.cells.length > maxCells) {\n maxCells = tr.cells.length;\n }\n }\n\n const normalizedRows = rows.map((row) => {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (!tr?.cells) return row;\n\n const cells = [...tr.cells];\n while (cells.length < maxCells) {\n cells.push([{ type: \"text\", text: { content: \"\" } }]);\n }\n if (cells.length > maxCells) {\n cells.length = maxCells;\n }\n\n return { ...row, table_row: { ...tr, cells } };\n });\n\n if (normalizedRows.length <= NOTION_MAX_TABLE_ROWS) {\n return [\n {\n ...block,\n table: { ...table, table_width: maxCells, children: normalizedRows },\n },\n ];\n }\n\n const tables: Array<Record<string, unknown>> = [];\n const headerRow = table.has_column_header ? normalizedRows[0] : null;\n const dataRows = table.has_column_header ? normalizedRows.slice(1) : normalizedRows;\n const chunkSize = headerRow ? NOTION_MAX_TABLE_ROWS - 1 : NOTION_MAX_TABLE_ROWS;\n\n for (let i = 0; i < dataRows.length; i += chunkSize) {\n const chunk = dataRows.slice(i, i + chunkSize);\n const children = headerRow ? [headerRow, ...chunk] : chunk;\n tables.push({\n type: \"table\",\n table: {\n table_width: maxCells,\n has_column_header: !!headerRow,\n has_row_header: table.has_row_header,\n children,\n },\n });\n }\n\n return tables;\n}\n\nfunction isListBlock(block: Record<string, unknown>): boolean {\n return (\n block.type === \"bulleted_list_item\" ||\n block.type === \"numbered_list_item\" ||\n block.type === \"to_do\"\n );\n}\n\nfunction flattenListDepth(block: Record<string, unknown>, depth: number): Record<string, unknown> {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n if (!blockData?.children || blockData.children.length === 0) return block;\n\n if (depth >= NOTION_MAX_LIST_DEPTH - 1) {\n const flattened = collectAllDescendants(blockData.children);\n return {\n ...block,\n [blockType]: { ...blockData, children: flattened },\n };\n }\n\n const normalizedChildren = blockData.children.map((child) => {\n if (isListBlock(child)) {\n return flattenListDepth(child, depth + 1);\n }\n return child;\n });\n\n return {\n ...block,\n [blockType]: { ...blockData, children: normalizedChildren },\n };\n}\n\nfunction collectAllDescendants(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n for (const block of blocks) {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n const children = blockData?.children;\n const blockWithoutChildren = children\n ? { ...block, [blockType]: { ...blockData, children: undefined } }\n : block;\n result.push(blockWithoutChildren);\n if (children && children.length > 0) {\n result.push(...collectAllDescendants(children));\n }\n }\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { Sema } from \"async-sema\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { ImageReference } from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport interface ImageDownloadResult {\n readonly originalUrl: string;\n readonly localPath: string;\n readonly hash: string;\n readonly size: number;\n}\n\nexport interface ImageUploadResult {\n readonly localPath: string;\n readonly fileUploadId: string;\n}\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"image/bmp\": \".bmp\",\n \"image/tiff\": \".tiff\",\n};\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".ico\": \"image/x-icon\",\n \".tiff\": \"image/tiff\",\n};\n\nexport class ImageHandler {\n constructor(\n private readonly vaultFs: VaultFS,\n private readonly attachmentFolder: string = \"attachments\",\n private readonly notionClient?: NotionClient,\n ) {}\n\n async downloadImage(url: string, pageTitle: string): Promise<ImageDownloadResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`이미지 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"image/png\";\n const extension = IMAGE_EXTENSIONS[contentType] ?? this.guessExtension(url) ?? \".png\";\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\").slice(0, 12);\n const safeName = pageTitle\n .replace(/[^a-zA-Z0-9가-힣\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 50);\n\n const fileName = `${safeName}-${hash}${extension}`;\n const localPath = `${this.attachmentFolder}/${fileName}`;\n\n await this.vaultFs.ensureFolder(this.attachmentFolder);\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return {\n originalUrl: url,\n localPath,\n hash,\n size: buffer.length,\n };\n }\n\n async downloadAllImages(\n markdown: string,\n pageTitle: string,\n ): Promise<{ content: string; downloads: ImageDownloadResult[] }> {\n const imageRegex = /!\\[([^\\]]*)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n const matches = [...markdown.matchAll(imageRegex)];\n const notionMatches = matches.filter((m) => m[2] && this.isNotionImageUrl(m[2]));\n\n if (notionMatches.length === 0) {\n return { content: markdown, downloads: [] };\n }\n\n const sema = new Sema(3);\n const results = await Promise.allSettled(\n notionMatches.map(async (match) => {\n await sema.acquire();\n try {\n return {\n match,\n download: await this.downloadImage(match[2]!, pageTitle),\n };\n } finally {\n sema.release();\n }\n }),\n );\n\n const downloads: ImageDownloadResult[] = [];\n let result = markdown;\n\n for (const settled of results) {\n if (settled.status !== \"fulfilled\") continue;\n const { match, download } = settled.value;\n downloads.push(download);\n const obsidianEmbed = `![[${download.localPath}${match[1] ? `|${match[1]}` : \"\"}]]`;\n result = result.replace(match[0]!, obsidianEmbed);\n }\n\n return { content: result, downloads };\n }\n\n async uploadLocalImage(localPath: string): Promise<ImageUploadResult> {\n if (!this.notionClient) {\n throw new Error(\"NotionClient required for image upload\");\n }\n\n const buffer = await this.readImageFromVault(localPath);\n const filename = localPath.split(\"/\").pop() ?? \"image.png\";\n const contentType = this.getContentTypeFromPath(filename);\n const blob = new Blob([buffer], { type: contentType });\n const fileUploadId = await this.notionClient.uploadFile(blob, filename, contentType);\n\n return { localPath, fileUploadId };\n }\n\n async uploadAndAppendImages(\n pageId: string,\n images: ImageReference[],\n ): Promise<ImageUploadResult[]> {\n if (!this.notionClient) return [];\n\n const localImages = images.filter((img) => !img.isExternal && img.localPath);\n if (localImages.length === 0) return [];\n\n const results: ImageUploadResult[] = [];\n const imageBlocks: unknown[] = [];\n\n for (const img of localImages) {\n try {\n const result = await this.uploadLocalImage(img.localPath!);\n results.push(result);\n imageBlocks.push({\n type: \"image\",\n image: {\n type: \"file_upload\",\n file_upload: { id: result.fileUploadId },\n },\n });\n } catch (error) {\n getLogger().warn(`이미지 업로드 실패 (${img.localPath}):`, error);\n }\n }\n\n if (imageBlocks.length > 0) {\n await this.notionClient.appendChildren(pageId, imageBlocks);\n }\n\n return results;\n }\n\n private async readImageFromVault(localPath: string): Promise<Buffer> {\n try {\n return await this.vaultFs.readBinary(localPath);\n } catch {\n return await this.vaultFs.readBinary(`${this.attachmentFolder}/${localPath}`);\n }\n }\n\n private getContentTypeFromPath(filename: string): string {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n return (ext && EXTENSION_TO_MIME[ext]) ?? \"application/octet-stream\";\n }\n\n private isNotionImageUrl(url: string): boolean {\n return (\n url.includes(\"secure.notion-static.com\") ||\n url.includes(\"prod-files-secure\") ||\n url.includes(\"s3.us-west-2.amazonaws.com/secure.notion-static.com\")\n );\n }\n\n private guessExtension(url: string): string | null {\n const pathname = new URL(url).pathname;\n const ext = pathname.match(/\\.(png|jpg|jpeg|gif|webp|svg|bmp|tiff)(\\?|$)/i);\n return ext ? `.${ext[1]!.toLowerCase()}` : null;\n }\n}\n","// eslint-disable-next-line no-control-regex\nconst INVALID_CHARS = /[<>:\"/\\\\|?*\\x00-\\x1f]/g;\nconst TRAILING_DOTS = /\\.+$/;\nconst RESERVED_NAMES = new Set([\n \"CON\",\n \"PRN\",\n \"AUX\",\n \"NUL\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\",\n]);\n\nexport function sanitizeFileName(name: string): string {\n let sanitized = name.replace(INVALID_CHARS, \"_\").replace(TRAILING_DOTS, \"\").trim().slice(0, 200);\n\n if (RESERVED_NAMES.has(sanitized.toUpperCase())) {\n sanitized = `_${sanitized}`;\n }\n\n if (sanitized.length === 0) {\n sanitized = \"_untitled\";\n }\n\n return sanitized;\n}\n","const NOTION_CALLOUT_RE = /^::: callout\\n([\\s\\S]*?)\\n:::/gm;\nconst NOTION_TOGGLE_RE = /<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/gs;\nconst NOTION_PAGE_MENTION_RE = /<mention-page id=\"([^\"]+)\">([\\s\\S]*?)<\\/mention-page>/g;\nconst NOTION_USER_MENTION_RE = /<mention-user id=\"[^\"]*\">([^<]*)<\\/mention-user>/g;\nconst NOTION_DATE_MENTION_RE = /<mention-date start=\"([^\"]*)\"(?: end=\"([^\"]*)\")?[^>]*\\/>/g;\nconst NOTION_UNKNOWN_RE = /<unknown id=\"([^\"]*)\"([^>]*)\\/>/g;\n\nconst NOTION_AUDIO_RE = /<audio src=\"([^\"]*)\">([\\s\\S]*?)<\\/audio>/g;\nconst NOTION_VIDEO_RE = /<video src=\"([^\"]*)\">([\\s\\S]*?)<\\/video>/g;\nconst NOTION_PDF_RE = /<pdf src=\"([^\"]*)\">([\\s\\S]*?)<\\/pdf>/g;\nconst NOTION_FILE_RE = /<file src=\"([^\"]*)\">([\\s\\S]*?)<\\/file>/g;\nconst NOTION_TAB_RE = /<tab title=\"([^\"]*)\">([\\s\\S]*?)<\\/tab>/g;\nconst NOTION_UNDERLINE_RE = /<span underline=\"true\">([\\s\\S]*?)<\\/span>/g;\n\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\n\nexport function notionEnhancedToObsidian(enhanced: string): string {\n let result = enhanced;\n\n result = convertToggles(result);\n result = convertCallouts(result);\n result = convertPageMentions(result);\n result = convertPageLinks(result);\n result = convertUserMentions(result);\n result = convertDateMentions(result);\n result = convertMediaTags(result);\n result = convertTabBlocks(result);\n result = preserveUnknownBlocks(result);\n result = convertNotionMath(result);\n result = convertNotionTables(result);\n result = convertColorSpans(result);\n result = convertUnderlineSpans(result);\n result = removeEmptyBlocks(result);\n result = unescapePipes(result);\n\n return result;\n}\n\nexport function obsidianToNotionEnhanced(obsidian: string): string {\n let result = obsidian;\n\n result = convertTogglesToHtml(result);\n result = restoreTabBlocks(result);\n result = convertObsidianCallouts(result);\n result = restoreMediaTags(result);\n result = restoreUnknownBlocks(result);\n result = restoreColorSpans(result);\n result = restoreUnderlineSpans(result);\n\n return result;\n}\n\nfunction convertToggles(content: string): string {\n function replaceToggle(match: string): string {\n const m = /<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/s.exec(match);\n if (!m) return match;\n\n const title = m[1]!.trim();\n let body = m[2]!.trim();\n\n body = convertToggles(body);\n\n const indented = body\n .split(\"\\n\")\n .map((line) => (line ? ` ${line}` : \"\"))\n .join(\"\\n\")\n .trimEnd();\n\n return `${TOGGLE_START}\\n- ${title}\\n${indented}\\n${TOGGLE_END}`;\n }\n\n return content.replace(NOTION_TOGGLE_RE, replaceToggle);\n}\n\nfunction convertCallouts(content: string): string {\n return content.replace(NOTION_CALLOUT_RE, (_match, body: string) => {\n const lines = body.trim().split(\"\\n\");\n const firstLine = lines[0] ?? \"\";\n\n const emojiMatch = /^([\\p{Emoji}️‍]+)\\s*(.*)/u.exec(firstLine);\n const type = emojiMatch ? emojiToCalloutType(emojiMatch[1]!) : \"note\";\n const title = emojiMatch ? emojiMatch[2]! : firstLine;\n const rest = lines.slice(1).join(\"\\n\").trim();\n\n const calloutTitle = title ? `> [!${type}] ${title}` : `> [!${type}]`;\n const calloutBody = rest\n ? \"\\n\" +\n rest\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\")\n : \"\";\n\n return calloutTitle + calloutBody;\n });\n}\n\nfunction convertPageMentions(content: string): string {\n return content.replace(NOTION_PAGE_MENTION_RE, (_match, _id: string, text: string) => {\n const cleaned = text.trim();\n return `[[${cleaned}]]`;\n });\n}\n\nfunction convertUserMentions(content: string): string {\n return content.replace(NOTION_USER_MENTION_RE, (_match, name: string) => `@${name}`);\n}\n\nfunction convertDateMentions(content: string): string {\n return content.replace(NOTION_DATE_MENTION_RE, (_match, start: string, end?: string) => {\n return end ? `${start} → ${end}` : start;\n });\n}\n\n// 2D: <unknown> → 보존 마커 (삭제 대신 보존)\nfunction preserveUnknownBlocks(content: string): string {\n return content.replace(NOTION_UNKNOWN_RE, (_match, id: string, attrs: string) => {\n const typeMatch = /type=\"([^\"]*)\"/.exec(attrs);\n const altMatch = /alt=\"([^\"]*)\"/.exec(attrs);\n const blockType = altMatch?.[1] ?? typeMatch?.[1] ?? \"unknown\";\n return `%%im-nobsidian:unknown:id=${id}&type=${blockType}%%`;\n });\n}\n\n// 2A: 미디어 태그 → Obsidian 마크다운\nfunction convertMediaTags(content: string): string {\n let result = content;\n\n result = result.replace(NOTION_AUDIO_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[🔊 ${cap}](${src})` : `[🔊 audio](${src})`;\n });\n\n result = result.replace(NOTION_VIDEO_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[🎬 ${cap}](${src})` : `[🎬 video](${src})`;\n });\n\n result = result.replace(NOTION_PDF_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[📄 ${cap}](${src})` : `[📄 pdf](${src})`;\n });\n\n result = result.replace(NOTION_FILE_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[📎 ${cap}](${src})` : `[📎 file](${src})`;\n });\n\n return result;\n}\n\n// 2B: <tab> → 보존 마커\nfunction convertTabBlocks(content: string): string {\n return content.replace(NOTION_TAB_RE, (_match, title: string, body: string) => {\n const trimmed = body.trim();\n const indented = trimmed\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `> [!tab] ${title}\\n${indented}`;\n });\n}\n\n// 2C: <span underline> → 보존 마커\nfunction convertUnderlineSpans(content: string): string {\n return content.replace(NOTION_UNDERLINE_RE, (_match, text: string) => {\n return `%%im-nobsidian:underline%%${text}%%/underline%%`;\n });\n}\n\nfunction convertTogglesToHtml(content: string): string {\n const startRe = new RegExp(escapeRegex(TOGGLE_START), \"g\");\n const endRe = new RegExp(escapeRegex(TOGGLE_END), \"g\");\n\n let result = content;\n let safety = 0;\n\n while (result.includes(TOGGLE_START) && safety++ < 100) {\n const startIdx = result.indexOf(TOGGLE_START);\n const endIdx = findMatchingEnd(result, startIdx + TOGGLE_START.length);\n if (endIdx === -1) break;\n\n const inner = result.slice(startIdx + TOGGLE_START.length, endIdx).trim();\n const titleMatch = /^- (.+)$/m.exec(inner);\n const title = titleMatch ? titleMatch[1]! : \"\";\n const body = inner\n .split(\"\\n\")\n .slice(1)\n .map((line) => line.replace(/^ {2}/, \"\"))\n .join(\"\\n\")\n .trim();\n\n const html = `<details>\\n<summary>${title}</summary>\\n\\n${body}\\n\\n</details>`;\n result = result.slice(0, startIdx) + html + result.slice(endIdx + TOGGLE_END.length);\n }\n\n result = result.replace(startRe, \"\").replace(endRe, \"\");\n return result;\n}\n\nfunction findMatchingEnd(content: string, startFrom: number): number {\n let depth = 1;\n let pos = startFrom;\n\n while (pos < content.length && depth > 0) {\n const nextStart = content.indexOf(TOGGLE_START, pos);\n const nextEnd = content.indexOf(TOGGLE_END, pos);\n\n if (nextEnd === -1) return -1;\n\n if (nextStart !== -1 && nextStart < nextEnd) {\n depth++;\n pos = nextStart + TOGGLE_START.length;\n } else {\n depth--;\n if (depth === 0) return nextEnd;\n pos = nextEnd + TOGGLE_END.length;\n }\n }\n\n return -1;\n}\n\nfunction convertObsidianCallouts(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const headerMatch = /^> \\[!(\\w+)\\]([-+])?\\s*(.*)/.exec(lines[i]!);\n if (headerMatch) {\n const type = headerMatch[1]!;\n const title = headerMatch[3]!;\n const emoji = calloutTypeToEmoji(type) ?? \"💡\";\n const calloutTitle = title ? `${emoji} ${title}` : emoji;\n\n const bodyLines: string[] = [];\n i++;\n while (i < lines.length && lines[i]!.startsWith(\"> \")) {\n bodyLines.push(lines[i]!.slice(2));\n i++;\n }\n\n result.push(\"::: callout\");\n result.push(calloutTitle);\n if (bodyLines.length > 0) {\n result.push(...bodyLines);\n }\n result.push(\":::\");\n } else {\n result.push(lines[i]!);\n i++;\n }\n }\n\n return result.join(\"\\n\");\n}\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"💡\": \"tip\",\n ℹ️: \"info\",\n \"⚠️\": \"warning\",\n \"🔥\": \"danger\",\n \"✅\": \"success\",\n \"❌\": \"failure\",\n \"❓\": \"question\",\n \"📝\": \"note\",\n \"📌\": \"abstract\",\n \"🐛\": \"bug\",\n \"💬\": \"quote\",\n \"📋\": \"example\",\n};\n\nconst TYPE_EMOJI_MAP: Record<string, string> = Object.fromEntries(\n Object.entries(EMOJI_TYPE_MAP).map(([k, v]) => [v, k]),\n);\n\nfunction emojiToCalloutType(emoji: string): string {\n return EMOJI_TYPE_MAP[emoji] ?? \"note\";\n}\n\nfunction calloutTypeToEmoji(type: string): string | undefined {\n return TYPE_EMOJI_MAP[type.toLowerCase()];\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst NOTION_PAGE_LINK_RE = /<page url=\"[^\"]*\">([\\s\\S]*?)<\\/page>/g;\nconst NOTION_COLOR_SPAN_RE = /<span color=\"([^\"]+)\">([\\s\\S]*?)<\\/span>/g;\nconst NOTION_EMPTY_BLOCK_RE = /^<empty-block\\/>\\n?/gm;\n\nfunction convertPageLinks(content: string): string {\n return content.replace(NOTION_PAGE_LINK_RE, (_match, text: string) => {\n const cleaned = text.replace(/\\*\\*/g, \"\").trim();\n return `[[${cleaned}]]`;\n });\n}\n\n// 2C: <span color> → 보존 마커 (색상 제거 대신 보존)\nfunction convertColorSpans(content: string): string {\n return content.replace(\n NOTION_COLOR_SPAN_RE,\n (_match, color: string, text: string) => `%%im-nobsidian:color:${color}%%${text}%%/color%%`,\n );\n}\n\nfunction removeEmptyBlocks(content: string): string {\n return content.replace(NOTION_EMPTY_BLOCK_RE, \"\\n\");\n}\n\nconst NOTION_INLINE_MATH_RE = /\\$`([^`]+)`\\$/g;\nconst NOTION_BLOCK_MATH_RE = /\\$\\$\\n```\\n([\\s\\S]*?)\\n```\\n\\$\\$/g;\n\nfunction convertNotionMath(content: string): string {\n let result = content.replace(NOTION_BLOCK_MATH_RE, (_match, eq: string) => {\n return `$$\\n${eq.trim()}\\n$$`;\n });\n result = result.replace(NOTION_INLINE_MATH_RE, (_match, eq: string) => `$${eq}$`);\n return result;\n}\n\nconst NOTION_TABLE_RE = /<table[^>]*>([\\s\\S]*?)<\\/table>/g;\nconst TABLE_ROW_RE = /<tr>([\\s\\S]*?)<\\/tr>/g;\nconst TABLE_CELL_RE = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/g;\n\nfunction convertNotionTables(content: string): string {\n return content.replace(NOTION_TABLE_RE, (_match, tableBody: string) => {\n const rows: string[][] = [];\n let rowMatch: RegExpExecArray | null;\n const rowRe = new RegExp(TABLE_ROW_RE.source, TABLE_ROW_RE.flags);\n\n while ((rowMatch = rowRe.exec(tableBody)) !== null) {\n const cells: string[] = [];\n let cellMatch: RegExpExecArray | null;\n const cellRe = new RegExp(TABLE_CELL_RE.source, TABLE_CELL_RE.flags);\n while ((cellMatch = cellRe.exec(rowMatch[1]!)) !== null) {\n cells.push(cellMatch[1]!.trim());\n }\n rows.push(cells);\n }\n\n if (rows.length === 0) return _match;\n\n const colCount = Math.max(...rows.map((r) => r.length));\n const lines: string[] = [];\n\n for (let i = 0; i < rows.length; i++) {\n const padded = rows[i]!;\n while (padded.length < colCount) padded.push(\"\");\n lines.push(`| ${padded.join(\" | \")} |`);\n if (i === 0) {\n lines.push(`| ${padded.map(() => \"---\").join(\" | \")} |`);\n }\n }\n\n return lines.join(\"\\n\");\n });\n}\n\n// ─── Push 방향: 보존 마커 → Enhanced MD 복원 ───\n\nconst OBSIDIAN_MEDIA_AUDIO_RE = /\\[🔊\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_VIDEO_RE = /\\[🎬\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_PDF_RE = /\\[📄\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_FILE_RE = /\\[📎\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nfunction restoreMediaTags(content: string): string {\n let result = content;\n\n result = result.replace(OBSIDIAN_MEDIA_AUDIO_RE, (_match, caption: string, src: string) => {\n return `<audio src=\"${src}\">${caption}</audio>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_VIDEO_RE, (_match, caption: string, src: string) => {\n return `<video src=\"${src}\">${caption}</video>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_PDF_RE, (_match, caption: string, src: string) => {\n return `<pdf src=\"${src}\">${caption}</pdf>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_FILE_RE, (_match, caption: string, src: string) => {\n return `<file src=\"${src}\">${caption}</file>`;\n });\n\n return result;\n}\n\nconst OBSIDIAN_TAB_RE = /^> \\[!tab\\]\\s*(.+)\\n((?:> .*\\n?)*)/gm;\n\nfunction restoreTabBlocks(content: string): string {\n return content.replace(OBSIDIAN_TAB_RE, (_match, title: string, body: string) => {\n const unquoted = body\n .split(\"\\n\")\n .map((line) => line.replace(/^> /, \"\"))\n .join(\"\\n\")\n .trim();\n return `<tab title=\"${title}\">${unquoted}</tab>`;\n });\n}\n\nconst OBSIDIAN_UNKNOWN_RE = /%%im-nobsidian:unknown:id=([^&]+)&type=([^%]+)%%/g;\n\nfunction restoreUnknownBlocks(content: string): string {\n return content.replace(OBSIDIAN_UNKNOWN_RE, (_match, id: string, type: string) => {\n return `<unknown id=\"${id}\" type=\"${type}\"/>`;\n });\n}\n\nconst OBSIDIAN_COLOR_RE = /%%im-nobsidian:color:([^%]+)%%([\\s\\S]*?)%%\\/color%%/g;\n\nfunction restoreColorSpans(content: string): string {\n return content.replace(OBSIDIAN_COLOR_RE, (_match, color: string, text: string) => {\n return `<span color=\"${color}\">${text}</span>`;\n });\n}\n\nconst OBSIDIAN_UNDERLINE_RE = /%%im-nobsidian:underline%%([\\s\\S]*?)%%\\/underline%%/g;\n\nfunction restoreUnderlineSpans(content: string): string {\n return content.replace(OBSIDIAN_UNDERLINE_RE, (_match, text: string) => {\n return `<span underline=\"true\">${text}</span>`;\n });\n}\n\nfunction unescapePipes(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let inTable = false;\n\n for (const line of lines) {\n if (/^\\|.*\\|$/.test(line.trim()) || /^\\|[\\s-|]+\\|$/.test(line.trim())) {\n inTable = true;\n result.push(line);\n } else {\n if (inTable && line.trim() === \"\") {\n inTable = false;\n } else if (!/^\\|/.test(line.trim())) {\n inTable = false;\n }\n result.push(inTable ? line : line.replace(/\\\\\\|/g, \"|\"));\n }\n }\n\n return result.join(\"\\n\");\n}\n","import type {\n PushOptions,\n PushResult,\n PullOptions,\n PullResult,\n SyncOptions,\n SyncResult,\n StatusResult,\n SyncRecord,\n LocalChange,\n RemoteChange,\n Conflict,\n FailedOperation,\n} from \"../types/sync.js\";\nimport type { Config } from \"../types/config.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { PageObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { Sema } from \"async-sema\";\nimport { ChangeDetector } from \"./change-detector.js\";\nimport type { ConversionPipeline } from \"../converter/pipeline.js\";\nimport { createDefaultPipeline } from \"../converter/pipeline-factory.js\";\nimport { BlockConverter } from \"../converter/block-converter.js\";\nimport { ImageHandler } from \"./image-handler.js\";\nimport { PropertyMapper } from \"../notion/property-mapper.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { getLogger } from \"../utils/logger.js\";\nimport { sanitizeFileName } from \"../utils/sanitize.js\";\nimport { notionIdsEqual } from \"../utils/id.js\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport {\n notionEnhancedToObsidian,\n obsidianToNotionEnhanced,\n} from \"../converter/enhanced-md-converter.js\";\n\nexport class SyncOrchestrator {\n private readonly changeDetector: ChangeDetector;\n private readonly pipeline: ConversionPipeline;\n private readonly blockConverter: BlockConverter;\n private readonly imageHandler: ImageHandler;\n private readonly propertyMapper: PropertyMapper;\n private dbSchemaLoaded = false;\n\n constructor(\n private readonly config: Config,\n private readonly stateDb: StateDB,\n private readonly notionClient: NotionClient,\n private readonly vaultFs: VaultFS,\n ) {\n this.changeDetector = new ChangeDetector(stateDb);\n this.pipeline = createDefaultPipeline({\n wikilinkResolver: (text) => stateDb.resolveWikilink(text),\n });\n this.blockConverter = new BlockConverter();\n this.imageHandler = new ImageHandler(vaultFs, config.paths.attachments, notionClient);\n this.propertyMapper = new PropertyMapper();\n this.propertyMapper.setWikilinkResolver({\n resolve: (title: string) => stateDb.resolveWikilink(title)?.notionPageId ?? null,\n resolvePageId: (pageId: string) => stateDb.resolvePageId(pageId)?.title ?? null,\n });\n\n this.blockConverter.initNotionToMd(this.notionClient.getInternalClient());\n }\n\n async push(options?: PushOptions): Promise<PushResult> {\n const startTime = Date.now();\n\n if (this.config.sync.direction === \"pull\") {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n this.cleanupInterruptedSync();\n\n const files = await this.vaultFs.listMarkdownFiles();\n const changes = this.changeDetector.detectLocalChanges(files);\n\n const conflictPaths = new Set(this.stateDb.getByStatus(\"conflict\").map((r) => r.obsidianPath));\n const eligible = options?.force ? changes : changes.filter((c) => !conflictPaths.has(c.path));\n\n const filtered = options?.paths\n ? eligible.filter((c) => options.paths!.some((p) => c.path.startsWith(p)))\n : eligible;\n\n if (filtered.length === 0) {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\" || c.type === \"moved\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"push_in_progress\", \"true\");\n\n const folderPaths = new Set<string>();\n for (const change of filtered) {\n const parts = change.path.split(\"/\");\n if (parts.length > 1) {\n for (let i = 1; i < parts.length; i++) {\n folderPaths.add(parts.slice(0, i).join(\"/\"));\n }\n }\n }\n\n const sortedFolders = [...folderPaths].sort(\n (a, b) => a.split(\"/\").length - b.split(\"/\").length,\n );\n for (const folderPath of sortedFolders) {\n await this.ensureFolderPage(folderPath);\n }\n\n const sema = new Sema(this.config.advanced.concurrency);\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const failed: FailedOperation[] = [];\n\n let completed = 0;\n const total = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n options?.onProgress?.(++completed, total, change.path);\n switch (change.type) {\n case \"created\":\n await this.pushCreate(change.path);\n created++;\n break;\n case \"modified\":\n await this.pushUpdate(change.path);\n updated++;\n break;\n case \"moved\":\n await this.pushMove(change.path);\n updated++;\n break;\n case \"deleted\":\n await this.pushDelete(change.path);\n deleted++;\n break;\n }\n } catch (error) {\n failed.push({\n path: change.path,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n this.stateDb.setMeta(\"last_push_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n\n return { created, updated, deleted, failed, duration: Date.now() - startTime };\n }\n\n async pull(options?: PullOptions): Promise<PullResult> {\n const startTime = Date.now();\n const emptyResult: PullResult = {\n created: 0,\n updated: 0,\n deleted: 0,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n };\n\n if (this.config.sync.direction === \"push\") {\n return emptyResult;\n }\n\n this.cleanupInterruptedSync();\n\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const conflicts: Conflict[] = [];\n const writtenPaths: string[] = [];\n const failed: FailedOperation[] = [];\n\n const remoteChanges = await this.detectRemoteChanges();\n\n const filtered = options?.paths\n ? remoteChanges.filter((c) => {\n const record = this.stateDb.getByNotionId(c.pageId);\n return record && options.paths!.some((p) => record.obsidianPath.startsWith(p));\n })\n : remoteChanges;\n\n if (filtered.length === 0) {\n return emptyResult;\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"pull_in_progress\", \"true\");\n\n const sema = new Sema(this.config.advanced.concurrency);\n\n let pullCompleted = 0;\n const pullTotal = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n options?.onProgress?.(++pullCompleted, pullTotal, change.pageId);\n switch (change.type) {\n case \"created\": {\n const path = await this.pullCreate(change.pageId);\n writtenPaths.push(path);\n created++;\n break;\n }\n case \"modified\": {\n const result = await this.pullUpdate(change);\n if (result.conflict) {\n conflicts.push(result.conflict);\n } else if (result.path) {\n writtenPaths.push(result.path);\n updated++;\n }\n break;\n }\n case \"deleted\": {\n const path = await this.pullDelete(change.pageId);\n if (path) {\n deleted++;\n }\n break;\n }\n }\n } catch (error) {\n const record = this.stateDb.getByNotionId(change.pageId);\n failed.push({\n path: record?.obsidianPath ?? change.pageId,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n this.stateDb.setMeta(\"last_pull_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n\n return {\n created,\n updated,\n deleted,\n conflicts,\n writtenPaths,\n failed,\n duration: Date.now() - startTime,\n };\n }\n\n async sync(options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const pullResult = await this.pull(options);\n const pushResult = await this.push({\n ...options,\n paths: options?.paths,\n });\n\n return {\n pull: pullResult,\n push: pushResult,\n conflicts: pullResult.conflicts,\n duration: Date.now() - startTime,\n };\n }\n\n async status(): Promise<StatusResult> {\n const files = await this.vaultFs.listMarkdownFiles();\n const localChanges = this.changeDetector.detectLocalChanges(files);\n const remoteChanges = await this.detectRemoteChanges();\n const conflictRecords = this.stateDb.getByStatus(\"conflict\");\n const lastSyncAt = this.stateDb.getMeta(\"last_sync_at\");\n\n const conflicts: Conflict[] = await this.buildConflictsFromRecords(\n conflictRecords,\n localChanges,\n remoteChanges,\n );\n\n return {\n localChanges,\n remoteChanges,\n conflicts,\n conflictRecords,\n pendingOperations: conflictRecords.length,\n lastSyncAt,\n };\n }\n\n private async buildConflictsFromRecords(\n records: SyncRecord[],\n localChanges: LocalChange[],\n remoteChanges: RemoteChange[],\n ): Promise<Conflict[]> {\n const conflicts: Conflict[] = [];\n\n for (const record of records) {\n const localChange = localChanges.find((c) => c.path === record.obsidianPath) ?? {\n path: record.obsidianPath,\n type: \"modified\" as const,\n currentHash: record.contentHash,\n previousHash: record.contentHash,\n };\n\n const remoteChange = remoteChanges.find((c) => c.pageId === record.notionPageId) ?? {\n pageId: record.notionPageId ?? \"\",\n type: \"modified\" as const,\n lastEdited: record.notionLastEdited ?? \"\",\n previousEdited: null,\n };\n\n let localContent = \"\";\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n // 파일이 삭제된 경우\n }\n\n let remoteContent = \"\";\n if (record.notionPageId) {\n try {\n remoteContent = await this.fetchPageMarkdown(record.notionPageId);\n } catch {\n // 페이지가 삭제된 경우\n }\n }\n\n conflicts.push({\n syncRecord: record,\n localChange,\n remoteChange,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n });\n }\n\n return conflicts;\n }\n\n private get isDatabaseMode(): boolean {\n return this.config.notion.parentMode === \"database\" && !!this.config.notion.databaseId;\n }\n\n private async ensureDbSchema(): Promise<void> {\n if (this.dbSchemaLoaded || !this.isDatabaseMode) return;\n const schema = await this.notionClient.getDatabaseSchema(this.config.notion.databaseId!);\n this.propertyMapper.loadSchema(schema);\n this.dbSchemaLoaded = true;\n }\n\n private async pushCreate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const title = extractTitle(path);\n const parentId = await this.resolveNotionParent(path);\n\n const selectedPath = this.pipeline.selectPath(content);\n if (selectedPath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: selectedPath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n let effectiveParentId = parentId;\n let effectiveParentType: \"page\" | \"database\" = \"page\";\n let effectiveProperties = conversionResult.properties;\n\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n effectiveParentId = this.config.notion.databaseId!;\n effectiveParentType = \"database\";\n effectiveProperties = this.propertyMapper.toNotionProperties(\n conversionResult.properties,\n title,\n );\n }\n\n const page = await this.pushCreatePage(\n effectiveParentId,\n effectiveParentType,\n title,\n conversionResult.content,\n effectiveProperties,\n );\n\n await this.imageHandler.uploadAndAppendImages(page.id, conversionResult.images);\n\n const hash = computeHash(content);\n\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: path,\n notionPageId: page.id,\n notionParentId: parentId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: this.isFolderNote(path) ? \"folder-note\" : \"file\",\n status: \"synced\",\n baseSnapshot: Buffer.from(content, \"utf-8\"),\n });\n\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: page.id,\n title,\n aliases,\n });\n\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n });\n }\n\n private async pushUpdate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const updatePath = this.pipeline.selectPath(content);\n if (updatePath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: updatePath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n await this.pushUpdatePage(record.notionPageId, conversionResult.content, record.baseSnapshot);\n\n await this.imageHandler.uploadAndAppendImages(record.notionPageId, conversionResult.images);\n\n let propsToUpdate = conversionResult.properties;\n if (this.isDatabaseMode && propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n await this.ensureDbSchema();\n const title = extractTitle(path);\n propsToUpdate = this.propertyMapper.toNotionProperties(propsToUpdate, title);\n }\n\n if (propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n await this.notionClient.updatePageProperties(record.notionPageId, propsToUpdate);\n }\n\n const updatedPage = await this.notionClient.getPage(record.notionPageId);\n\n const hash = computeHash(content);\n const title = extractTitle(path);\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.transaction(() => {\n this.stateDb.updateHash(record.id, hash, Buffer.from(content, \"utf-8\"));\n this.stateDb.updateStatus(record.id, \"synced\");\n this.stateDb.setNotionLastEdited(record.id, updatedPage.last_edited_time);\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: record.notionPageId!,\n title,\n aliases,\n });\n });\n }\n\n private async pushDelete(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n if (this.config.sync.deleteSync) {\n await this.notionClient.archivePage(record.notionPageId);\n this.stateDb.delete(record.id);\n } else {\n this.stateDb.updateStatus(record.id, \"pending\");\n }\n }\n\n private async pushMove(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const newParentId = await this.resolveNotionParent(path);\n const currentParentId = record.notionParentId;\n\n if (currentParentId && !notionIdsEqual(newParentId, currentParentId)) {\n try {\n const parentType = this.isDatabaseMode ? \"database\" : \"page\";\n await this.notionClient.movePage(record.notionPageId, newParentId, parentType);\n this.stateDb.setNotionParentId(record.id, newParentId);\n } catch {\n getLogger().warn(`[Im-Nobsidian] Move API 실패 — \"${path}\" 내용만 업데이트합니다`);\n }\n }\n\n await this.pushUpdate(path);\n }\n\n private async detectRemoteChanges(): Promise<RemoteChange[]> {\n const changes: RemoteChange[] = [];\n const lastPull = this.stateDb.getMeta(\"last_pull_at\");\n const syncedRecords = this.stateDb.getAll();\n const trackedPageIds = new Set(\n syncedRecords.filter((r) => r.notionPageId).map((r) => r.notionPageId!),\n );\n\n let remotePages: Array<{ id: string; last_edited_time: string }>;\n if (this.isDatabaseMode) {\n const allPages: Array<{ id: string; last_edited_time: string }> = [];\n let cursor: string | undefined;\n do {\n const result = await this.notionClient.queryDatabase(this.config.notion.databaseId!, {\n startCursor: cursor,\n });\n allPages.push(\n ...result.results.map((p) => ({ id: p.id, last_edited_time: p.last_edited_time })),\n );\n cursor = result.nextCursor ?? undefined;\n } while (cursor);\n remotePages = allPages;\n } else {\n remotePages = await this.notionClient.getChildPagesRecursive(this.config.notion.rootPageId);\n }\n\n for (const page of remotePages) {\n const record = this.stateDb.getByNotionId(page.id);\n\n if (!record) {\n changes.push({\n pageId: page.id,\n type: \"created\",\n lastEdited: page.last_edited_time,\n previousEdited: null,\n });\n } else if (page.last_edited_time !== record.notionLastEdited) {\n changes.push({\n pageId: page.id,\n type: \"modified\",\n lastEdited: page.last_edited_time,\n previousEdited: record.notionLastEdited,\n });\n }\n\n trackedPageIds.delete(page.id);\n }\n\n if (this.config.sync.deleteSync && lastPull) {\n for (const orphanId of trackedPageIds) {\n const record = syncedRecords.find((r) => r.notionPageId === orphanId);\n if (record) {\n changes.push({\n pageId: orphanId,\n type: \"deleted\",\n lastEdited: new Date().toISOString(),\n previousEdited: record.notionLastEdited,\n });\n }\n }\n }\n\n return changes;\n }\n\n private async pullCreate(pageId: string): Promise<string> {\n const page = await this.notionClient.getPage(pageId);\n const title = this.notionClient.extractTitle(page);\n const safeName = sanitizeFileName(title);\n\n const parentPath = await this.resolveParentPath(page);\n\n const allChildren = await this.notionClient.fetchAllChildren(pageId);\n const hasChildPages = allChildren.some((b) => \"type\" in b && b.type === \"child_page\");\n\n const markdown = await this.fetchPageMarkdown(pageId);\n const hasContent = markdown.trim().length > 0;\n\n let filePath: string;\n let fileType: \"file\" | \"folder-note\" | \"folder-only\";\n\n if (hasChildPages && hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-note\";\n await this.vaultFs.ensureFolder(folderPath);\n } else if (hasChildPages && !hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-only\";\n await this.vaultFs.ensureFolder(folderPath);\n } else {\n const basePath = parentPath ? `${parentPath}/${safeName}.md` : `${safeName}.md`;\n filePath = await this.resolveUniqueFilePath(basePath);\n fileType = \"file\";\n }\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n let processedMarkdown = markdown;\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n processedMarkdown = imageResult.content;\n }\n\n const finalContent = this.pipeline.convertToMarkdown(\n processedMarkdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath,\n parentMode: this.config.notion.parentMode,\n },\n { properties },\n );\n\n await this.vaultFs.writeFile(filePath, finalContent);\n\n const hash = computeHash(finalContent);\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: filePath,\n notionPageId: pageId,\n notionParentId: this.extractParentId(page),\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(finalContent, \"utf-8\"),\n });\n\n const aliases = extractAliases(properties);\n this.stateDb.upsertWikilink({\n obsidianPath: filePath,\n notionPageId: pageId,\n title,\n aliases,\n });\n });\n\n return filePath;\n }\n\n private async pullUpdate(change: RemoteChange): Promise<{ path?: string; conflict?: Conflict }> {\n const record = this.stateDb.getByNotionId(change.pageId);\n if (!record) return {};\n\n const page = await this.notionClient.getPage(change.pageId);\n let markdown = await this.fetchPageMarkdown(change.pageId);\n\n const title = this.notionClient.extractTitle(page);\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n markdown = imageResult.content;\n }\n\n const savedMarkers = this.stateDb.getPreserveMarkers(record.obsidianPath);\n const remoteContent = this.pipeline.convertToMarkdown(\n markdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath: record.obsidianPath,\n parentMode: this.config.notion.parentMode,\n },\n { properties, preserveMarkers: savedMarkers.length > 0 ? savedMarkers : undefined },\n );\n\n let localContent: string;\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n localContent = \"\";\n }\n\n const localHash = computeHash(localContent);\n const localModified = localHash !== record.contentHash;\n\n if (localModified) {\n const strategy = this.config.sync.conflictStrategy;\n\n if (strategy === \"remote-first\") {\n // 리모트 우선: 로컬 변경 무시, 리모트 내용으로 덮어쓰기\n } else if (strategy === \"local-first\") {\n return { path: record.obsidianPath };\n } else {\n const conflict: Conflict = {\n syncRecord: record,\n localChange: {\n path: record.obsidianPath,\n type: \"modified\",\n currentHash: localHash,\n previousHash: record.contentHash,\n },\n remoteChange: change,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n };\n\n this.stateDb.updateStatus(record.id, \"conflict\");\n return { conflict };\n }\n }\n\n await this.vaultFs.writeFile(record.obsidianPath, remoteContent);\n\n const newHash = computeHash(remoteContent);\n this.stateDb.upsert({\n obsidianPath: record.obsidianPath,\n notionPageId: change.pageId,\n notionParentId: record.notionParentId,\n contentHash: newHash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: record.syncDirection,\n fileType: record.fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(remoteContent, \"utf-8\"),\n });\n\n return { path: record.obsidianPath };\n }\n\n private async pullDelete(pageId: string): Promise<string | null> {\n const record = this.stateDb.getByNotionId(pageId);\n if (!record) return null;\n\n if (this.config.sync.deleteSync) {\n try {\n await this.vaultFs.deleteFile(record.obsidianPath);\n } catch {\n // 이미 삭제된 경우 무시\n }\n }\n\n this.stateDb.delete(record.id);\n return record.obsidianPath;\n }\n\n private async ensureFolderPage(folderPath: string): Promise<void> {\n const existing = this.stateDb.getByPath(folderPath);\n if (existing?.notionPageId) return;\n\n const folderNotePath = `${folderPath}/${folderPath.split(\"/\").pop()}.md`;\n const folderNoteRecord = this.stateDb.getByPath(folderNotePath);\n if (folderNoteRecord?.notionParentId) {\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderNoteRecord.notionParentId,\n notionParentId: \"\",\n contentHash: \"\",\n notionLastEdited: folderNoteRecord.notionLastEdited,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n return;\n }\n\n const parts = folderPath.split(\"/\");\n const folderName = parts[parts.length - 1]!;\n\n let parentId = this.config.notion.rootPageId;\n if (parts.length > 1) {\n const parentPath = parts.slice(0, -1).join(\"/\");\n const parentRecord = this.stateDb.getByPath(parentPath);\n if (parentRecord?.notionPageId) {\n parentId = parentRecord.notionPageId;\n }\n }\n\n const folderPage = await this.notionClient.createPage({\n parentId,\n parentType: \"page\",\n title: folderName,\n });\n\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderPage.id,\n notionParentId: parentId,\n contentHash: \"\",\n notionLastEdited: folderPage.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n }\n\n private async resolveNotionParent(filePath: string): Promise<string> {\n const parts = filePath.split(\"/\");\n if (parts.length <= 1) return this.config.notion.rootPageId;\n\n const folderPath = parts.slice(0, -1).join(\"/\");\n const folderRecord = this.stateDb.getByPath(folderPath);\n if (folderRecord?.notionPageId) return folderRecord.notionPageId;\n\n return this.config.notion.rootPageId;\n }\n\n private isFolderNote(filePath: string): boolean {\n const parts = filePath.split(\"/\");\n if (parts.length < 2) return false;\n const fileName = parts[parts.length - 1]!.replace(/\\.md$/, \"\");\n const folderName = parts[parts.length - 2]!;\n return fileName === folderName;\n }\n\n private async resolveParentPath(page: PageObjectResponse): Promise<string> {\n const parentId = this.extractParentId(page);\n if (!parentId || notionIdsEqual(parentId, this.config.notion.rootPageId)) return \"\";\n\n const parentRecord = this.stateDb.getByNotionId(parentId);\n if (parentRecord) {\n if (parentRecord.fileType === \"folder-note\" || parentRecord.fileType === \"folder-only\") {\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n return pathParts.join(\"/\");\n }\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n const parentDir = pathParts.join(\"/\");\n return (\n parentDir ||\n sanitizeFileName(this.notionClient.extractTitle(await this.notionClient.getPage(parentId)))\n );\n }\n\n try {\n const parentPage = await this.notionClient.getPage(parentId);\n const parentTitle = this.notionClient.extractTitle(parentPage);\n const grandparentPath = await this.resolveParentPath(parentPage);\n const safeName = sanitizeFileName(parentTitle);\n return grandparentPath ? `${grandparentPath}/${safeName}` : safeName;\n } catch {\n return \"\";\n }\n }\n\n private async pushCreatePage(\n parentId: string,\n parentType: \"page\" | \"database\",\n title: string,\n markdownContent: string,\n properties?: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n return await this.notionClient.createPageWithMarkdown({\n parentId,\n parentType,\n title,\n markdown: enhanced,\n properties,\n });\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const page = await this.notionClient.createPage({\n parentId,\n parentType,\n title,\n properties,\n });\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(page.id, blocks);\n }\n return page;\n }\n\n private async pushUpdatePage(\n pageId: string,\n markdownContent: string,\n baseSnapshot?: Buffer | null,\n ): Promise<void> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n\n if (baseSnapshot) {\n const baseEnhanced = obsidianToNotionEnhanced(baseSnapshot.toString(\"utf-8\"));\n const patches = this.computePatches(baseEnhanced, enhanced);\n if (patches.length > 0 && patches.length <= 20) {\n await this.notionClient.updatePageMarkdownPartial(pageId, patches);\n return;\n }\n }\n\n await this.notionClient.replacePageMarkdown(pageId, enhanced);\n return;\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const existingBlocks = await this.notionClient.fetchAllChildren(pageId);\n\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(pageId, blocks);\n }\n const deleteSema = new Sema(this.config.advanced.concurrency);\n await Promise.all(\n existingBlocks.map(async (block) => {\n await deleteSema.acquire();\n try {\n await this.notionClient.deleteBlock(block.id);\n } finally {\n deleteSema.release();\n }\n }),\n );\n }\n\n private computePatches(\n oldContent: string,\n newContent: string,\n ): Array<{ oldStr: string; newStr: string }> {\n const oldLines = oldContent.split(\"\\n\");\n const newLines = newContent.split(\"\\n\");\n const patches: Array<{ oldStr: string; newStr: string }> = [];\n\n let i = 0;\n let j = 0;\n while (i < oldLines.length && j < newLines.length) {\n if (oldLines[i] === newLines[j]) {\n i++;\n j++;\n continue;\n }\n\n let oldEnd = i + 1;\n let newEnd = j + 1;\n const lookahead = Math.min(10, oldLines.length - i, newLines.length - j);\n for (let k = 1; k <= lookahead; k++) {\n if (i + k < oldLines.length && newLines[j] === oldLines[i + k]) {\n oldEnd = i + k;\n newEnd = j;\n break;\n }\n if (j + k < newLines.length && oldLines[i] === newLines[j + k]) {\n oldEnd = i;\n newEnd = j + k;\n break;\n }\n oldEnd = i + k;\n newEnd = j + k;\n }\n\n const oldChunk = oldLines.slice(i, oldEnd).join(\"\\n\");\n const newChunk = newLines.slice(j, newEnd).join(\"\\n\");\n if (oldChunk || newChunk) {\n patches.push({ oldStr: oldChunk, newStr: newChunk });\n }\n i = oldEnd;\n j = newEnd;\n }\n\n if (i < oldLines.length || j < newLines.length) {\n patches.push({\n oldStr: oldLines.slice(i).join(\"\\n\"),\n newStr: newLines.slice(j).join(\"\\n\"),\n });\n }\n\n return patches;\n }\n\n private async fetchPageMarkdown(pageId: string): Promise<string> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const result = await this.notionClient.getPageMarkdown(pageId);\n return notionEnhancedToObsidian(result.markdown);\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n return this.blockConverter.notionBlocksToMarkdown(pageId);\n }\n\n private extractParentId(page: PageObjectResponse): string | null {\n const parent = page.parent as { type: string; page_id?: string; database_id?: string };\n if (parent.type === \"page_id\") return parent.page_id ?? null;\n if (parent.type === \"database_id\") return parent.database_id ?? null;\n return null;\n }\n\n private cleanupInterruptedSync(): void {\n const pushInProgress = this.stateDb.getMeta(\"push_in_progress\");\n const pullInProgress = this.stateDb.getMeta(\"pull_in_progress\");\n\n if (pushInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 push가 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n }\n if (pullInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 pull이 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n }\n }\n\n private async resolveUniqueFilePath(basePath: string): Promise<string> {\n if (!(await this.vaultFs.exists(basePath))) return basePath;\n\n const dir = basePath.lastIndexOf(\"/\") >= 0 ? basePath.slice(0, basePath.lastIndexOf(\"/\")) : \"\";\n const ext = \".md\";\n const name = basePath.slice(dir ? dir.length + 1 : 0, -ext.length);\n\n for (let i = 1; i <= 99; i++) {\n const candidate = dir ? `${dir}/${name} (${i})${ext}` : `${name} (${i})${ext}`;\n if (!(await this.vaultFs.exists(candidate))) return candidate;\n }\n\n return basePath;\n }\n}\n\nfunction extractTitle(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n\nfunction extractAliases(properties: Record<string, unknown>): string[] {\n const raw = properties.aliases ?? properties.alias;\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.filter((a): a is string => typeof a === \"string\");\n if (typeof raw === \"string\")\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n","import { readFile, writeFile, unlink, rename, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport { join, relative, dirname } from \"node:path\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { FileInfo } from \"./change-detector.js\";\n\nexport interface PathFilterConfig {\n readonly include?: string[];\n readonly exclude?: string[];\n}\n\nexport class NodeVaultFS implements VaultFS {\n private readonly includePatterns: string[];\n private readonly excludePatterns: string[];\n\n constructor(\n private readonly rootPath: string,\n pathConfig?: PathFilterConfig,\n ) {\n this.includePatterns = pathConfig?.include ?? [];\n const configExclude = pathConfig?.exclude ?? [];\n const ignorePatterns = this.loadImNobsidianIgnore();\n this.excludePatterns = [...configExclude, ...ignorePatterns];\n }\n\n private loadImNobsidianIgnore(): string[] {\n try {\n const ignorePath = join(this.rootPath, \".im-nobsidian-ignore\");\n const content = readFileSync(ignorePath, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line: string) => line.trim())\n .filter((line: string) => line && !line.startsWith(\"#\"));\n } catch {\n return [];\n }\n }\n\n async readFile(path: string): Promise<string> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath, \"utf-8\");\n }\n\n async readBinary(path: string): Promise<Buffer> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf-8\");\n }\n\n async writeBinary(path: string, data: Buffer): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, data);\n }\n\n async deleteFile(path: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await unlink(fullPath);\n }\n\n async moveFile(from: string, to: string): Promise<void> {\n const fromPath = join(this.rootPath, from);\n const toPath = join(this.rootPath, to);\n await mkdir(dirname(toPath), { recursive: true });\n await rename(fromPath, toPath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await stat(join(this.rootPath, path));\n return true;\n } catch {\n return false;\n }\n }\n\n async ensureFolder(path: string): Promise<void> {\n await mkdir(join(this.rootPath, path), { recursive: true });\n }\n\n async listMarkdownFiles(): Promise<FileInfo[]> {\n const files: FileInfo[] = [];\n await this.walkDir(this.rootPath, files);\n return files;\n }\n\n private matchesPattern(relativePath: string, pattern: string): boolean {\n if (pattern === \"**/*\" || pattern === \"**\") return true;\n\n if (pattern.endsWith(\"/**\")) {\n const dir = pattern.slice(0, -3);\n return relativePath.startsWith(dir + \"/\") || relativePath === dir;\n } else if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return relativePath.endsWith(ext);\n } else if (pattern.includes(\"*\")) {\n const regexStr = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n return new RegExp(\"^\" + regexStr + \"$\").test(relativePath);\n } else {\n return relativePath === pattern || relativePath.startsWith(pattern + \"/\");\n }\n }\n\n private isExcluded(relativePath: string): boolean {\n if (this.includePatterns.length > 0) {\n const included = this.includePatterns.some((p) => this.matchesPattern(relativePath, p));\n if (!included) return true;\n }\n\n return this.excludePatterns.some((p) => this.matchesPattern(relativePath, p));\n }\n\n private async walkDir(dir: string, result: FileInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDir(fullPath, result);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const content = await readFile(fullPath, \"utf-8\");\n const fileStat = await stat(fullPath);\n\n result.push({\n path: relativePath,\n content,\n mtime: fileStat.mtime.toISOString(),\n });\n }\n }\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst INLINE_DB_START = /%% im-nobsidian:inline-db:([^\\s]+) %%/g;\nconst INLINE_DB_END = /%% im-nobsidian:end %%/g;\n\nexport class InlineDBParser implements Processor {\n readonly name = \"InlineDBParser\";\n readonly order = 40;\n\n process(input: ProcessorInput): ProcessorOutput {\n const inlineDbBlocks: InlineDBBlock[] = [];\n const content = input.content;\n\n const startMatches = [...content.matchAll(INLINE_DB_START)];\n for (const match of startMatches) {\n const startIdx = match.index!;\n const params = parseParams(match[1]!);\n\n const afterStart = content.indexOf(\"\\n\", startIdx) + 1;\n const endMatch = INLINE_DB_END.exec(content.slice(afterStart));\n\n if (endMatch) {\n const tableContent = content.slice(afterStart, afterStart + endMatch.index!);\n inlineDbBlocks.push({\n id: params[\"id\"] ?? \"\",\n title: params[\"title\"] ?? \"\",\n tableMarkdown: tableContent.trim(),\n startIdx,\n endIdx: afterStart + endMatch.index! + endMatch[0].length,\n });\n }\n\n INLINE_DB_END.lastIndex = 0;\n }\n\n return {\n content,\n metadata: {\n ...input.metadata,\n inlineDbBlocks,\n },\n };\n }\n}\n\ninterface InlineDBBlock {\n readonly id: string;\n readonly title: string;\n readonly tableMarkdown: string;\n readonly startIdx: number;\n readonly endIdx: number;\n}\n\nfunction parseParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const [key, value] = pair.split(\"=\");\n if (key && value) {\n params[key] = decodeURIComponent(value);\n }\n }\n return params;\n}\n","export interface MergeResult {\n readonly success: boolean;\n readonly merged: string;\n readonly conflicts: MergeConflictRegion[];\n}\n\nexport interface MergeConflictRegion {\n readonly localLines: string[];\n readonly remoteLines: string[];\n}\n\nexport function threeWayMerge(base: string, local: string, remote: string): MergeResult {\n const baseLines = base.split(\"\\n\");\n const localLines = local.split(\"\\n\");\n const remoteLines = remote.split(\"\\n\");\n\n const localDiff = computeDiff(baseLines, localLines);\n const remoteDiff = computeDiff(baseLines, remoteLines);\n\n const merged: string[] = [];\n const conflicts: MergeConflictRegion[] = [];\n let success = true;\n\n let baseIdx = 0;\n\n while (baseIdx < baseLines.length || localDiff.length > 0 || remoteDiff.length > 0) {\n const localChange = localDiff.find((d) => d.baseStart === baseIdx);\n const remoteChange = remoteDiff.find((d) => d.baseStart === baseIdx);\n\n if (localChange && remoteChange) {\n if (arraysEqual(localChange.newLines, remoteChange.newLines)) {\n merged.push(...localChange.newLines);\n } else {\n success = false;\n conflicts.push({\n localLines: localChange.newLines,\n remoteLines: remoteChange.newLines,\n });\n merged.push(\"<<<<<<< LOCAL\");\n merged.push(...localChange.newLines);\n merged.push(\"=======\");\n merged.push(...remoteChange.newLines);\n merged.push(\">>>>>>> REMOTE\");\n }\n\n baseIdx = Math.max(localChange.baseEnd, remoteChange.baseEnd);\n localDiff.splice(localDiff.indexOf(localChange), 1);\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else if (localChange) {\n merged.push(...localChange.newLines);\n baseIdx = localChange.baseEnd;\n localDiff.splice(localDiff.indexOf(localChange), 1);\n } else if (remoteChange) {\n merged.push(...remoteChange.newLines);\n baseIdx = remoteChange.baseEnd;\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else {\n if (baseIdx < baseLines.length) {\n merged.push(baseLines[baseIdx]!);\n }\n baseIdx++;\n }\n }\n\n return {\n success,\n merged: merged.join(\"\\n\"),\n conflicts,\n };\n}\n\ninterface DiffHunk {\n baseStart: number;\n baseEnd: number;\n newLines: string[];\n}\n\nfunction computeDiff(base: string[], modified: string[]): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n let baseIdx = 0;\n let modIdx = 0;\n\n while (baseIdx < base.length && modIdx < modified.length) {\n if (base[baseIdx] === modified[modIdx]) {\n baseIdx++;\n modIdx++;\n } else {\n const hunkStart = baseIdx;\n const newLines: string[] = [];\n\n while (modIdx < modified.length && base[baseIdx] !== modified[modIdx]) {\n newLines.push(modified[modIdx]!);\n modIdx++;\n }\n baseIdx++;\n\n hunks.push({ baseStart: hunkStart, baseEnd: baseIdx, newLines });\n }\n }\n\n if (modIdx < modified.length) {\n hunks.push({\n baseStart: baseIdx,\n baseEnd: base.length,\n newLines: modified.slice(modIdx),\n });\n }\n\n return hunks;\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => val === b[idx]);\n}\n","import type { Conflict, ConflictStrategy } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { VaultFS } from \"../sync/vault-fs.js\";\nimport { threeWayMerge } from \"./merger.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport type ResolutionChoice = \"local\" | \"remote\" | \"merge\" | \"duplicate\";\n\nexport interface ResolutionResult {\n readonly path: string;\n readonly choice: ResolutionChoice;\n readonly success: boolean;\n readonly mergeHadConflicts?: boolean;\n}\n\nexport class ConflictResolver {\n constructor(\n private readonly stateDb: StateDB,\n private readonly vaultFs: VaultFS,\n ) {}\n\n async resolve(conflict: Conflict, choice: ResolutionChoice): Promise<ResolutionResult> {\n switch (choice) {\n case \"local\":\n return this.resolveLocal(conflict);\n case \"remote\":\n return this.resolveRemote(conflict);\n case \"merge\":\n return this.resolveMerge(conflict);\n case \"duplicate\":\n return this.resolveDuplicate(conflict);\n }\n }\n\n async resolveByStrategy(\n conflict: Conflict,\n strategy: ConflictStrategy,\n ): Promise<ResolutionResult> {\n switch (strategy) {\n case \"local-first\":\n return this.resolve(conflict, \"local\");\n case \"remote-first\":\n return this.resolve(conflict, \"remote\");\n case \"duplicate\":\n return this.resolve(conflict, \"duplicate\");\n case \"manual\":\n return this.resolve(conflict, \"merge\");\n }\n }\n\n async resolveAll(conflicts: Conflict[], strategy: ConflictStrategy): Promise<ResolutionResult[]> {\n const results: ResolutionResult[] = [];\n for (const conflict of conflicts) {\n const result = await this.resolveByStrategy(conflict, strategy);\n results.push(result);\n }\n return results;\n }\n\n private async resolveLocal(conflict: Conflict): Promise<ResolutionResult> {\n const hash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"local\", success: true };\n }\n\n private async resolveRemote(conflict: Conflict): Promise<ResolutionResult> {\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, conflict.remoteContent);\n\n const hash = computeHash(conflict.remoteContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.remoteContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"remote\", success: true };\n }\n\n private async resolveMerge(conflict: Conflict): Promise<ResolutionResult> {\n const base = conflict.baseContent ?? \"\";\n const mergeResult = threeWayMerge(base, conflict.localContent, conflict.remoteContent);\n\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, mergeResult.merged);\n\n const hash = computeHash(mergeResult.merged);\n this.stateDb.updateHash(conflict.syncRecord.id, hash, Buffer.from(mergeResult.merged, \"utf-8\"));\n\n if (mergeResult.success) {\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n }\n\n return {\n path: conflict.syncRecord.obsidianPath,\n choice: \"merge\",\n success: mergeResult.success,\n mergeHadConflicts: !mergeResult.success,\n };\n }\n\n private async resolveDuplicate(conflict: Conflict): Promise<ResolutionResult> {\n const originalPath = conflict.syncRecord.obsidianPath;\n const ext = originalPath.endsWith(\".md\") ? \".md\" : \"\";\n const baseName = originalPath.replace(/\\.md$/, \"\");\n const conflictPath = `${baseName}.conflict${ext}`;\n\n await this.vaultFs.writeFile(conflictPath, conflict.remoteContent);\n\n const localHash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n localHash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: originalPath, choice: \"duplicate\", success: true };\n }\n\n generateDiff(conflict: Conflict): string {\n const localLines = conflict.localContent.split(\"\\n\");\n const remoteLines = conflict.remoteContent.split(\"\\n\");\n const lines: string[] = [];\n\n lines.push(`--- local: ${conflict.syncRecord.obsidianPath}`);\n lines.push(`+++ remote: Notion (${conflict.remoteChange.pageId})`);\n lines.push(\"\");\n\n const maxLen = Math.max(localLines.length, remoteLines.length);\n for (let i = 0; i < maxLen; i++) {\n const localLine = localLines[i];\n const remoteLine = remoteLines[i];\n\n if (localLine === remoteLine) {\n lines.push(` ${localLine ?? \"\"}`);\n } else {\n if (localLine !== undefined) lines.push(`- ${localLine}`);\n if (remoteLine !== undefined) lines.push(`+ ${remoteLine}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n}\n","import { sanitizeFileName } from \"../utils/sanitize.js\";\n\nexport interface NotionPageNode {\n readonly id: string;\n readonly title: string;\n readonly hasContent: boolean;\n readonly hasChildren: boolean;\n readonly isDatabase: boolean;\n readonly parentId: string | null;\n readonly children: NotionPageNode[];\n}\n\nexport type MappingType = \"file\" | \"folder-note\" | \"folder-only\" | \"database-folder\";\n\nexport interface MappingResult {\n readonly type: MappingType;\n readonly obsidianPath: string;\n readonly folderPath?: string;\n readonly notePath?: string;\n readonly schemaPath?: string;\n}\n\nexport class TreeMapper {\n mapNotionToObsidian(root: NotionPageNode, basePath: string = \"\"): MappingResult[] {\n const results: MappingResult[] = [];\n this.mapRecursive(root, basePath, results);\n return results;\n }\n\n private mapRecursive(node: NotionPageNode, parentPath: string, results: MappingResult[]): void {\n const safeName = sanitizeFileName(node.title || \"_untitled\");\n const currentPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n\n if (node.isDatabase) {\n results.push({\n type: \"database-folder\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n schemaPath: `${currentPath}/_schema.yml`,\n });\n } else if (node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-note\",\n obsidianPath: `${currentPath}/${safeName}.md`,\n folderPath: `${currentPath}/`,\n notePath: `${currentPath}/${safeName}.md`,\n });\n } else if (!node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-only\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n });\n } else {\n results.push({\n type: \"file\",\n obsidianPath: `${currentPath}.md`,\n });\n }\n\n for (const child of node.children) {\n this.mapRecursive(child, currentPath, results);\n }\n }\n\n mapObsidianToNotion(entries: FileSystemEntry[], parentPageId: string): PageCreationPlan[] {\n const plans: PageCreationPlan[] = [];\n this.planRecursive(entries, parentPageId, plans);\n return plans;\n }\n\n private planRecursive(\n entries: FileSystemEntry[],\n parentPageId: string,\n plans: PageCreationPlan[],\n ): void {\n for (const entry of entries) {\n if (entry.isDirectory) {\n const folderNote = this.findFolderNote(entry);\n\n if (folderNote) {\n plans.push({\n type: \"page-with-children\",\n title: entry.name,\n parentPageId,\n contentSource: folderNote.path,\n hasContent: true,\n });\n\n const childEntries = entry.children.filter((c) => c.path !== folderNote.path);\n this.planRecursive(childEntries, `placeholder:${entry.path}`, plans);\n } else {\n plans.push({\n type: \"empty-page-with-children\",\n title: entry.name,\n parentPageId,\n hasContent: false,\n });\n this.planRecursive(entry.children, `placeholder:${entry.path}`, plans);\n }\n } else if (entry.name.endsWith(\".md\") && !entry.name.startsWith(\"_\")) {\n plans.push({\n type: \"leaf-page\",\n title: entry.name.replace(/\\.md$/, \"\"),\n parentPageId,\n contentSource: entry.path,\n hasContent: true,\n });\n }\n }\n }\n\n private findFolderNote(dir: FileSystemEntry): FileSystemEntry | null {\n return dir.children.find((c) => c.name === `${dir.name}.md` || c.name === \"index.md\") ?? null;\n }\n\n determineFileType(page: {\n hasContent: boolean;\n hasChildren: boolean;\n isDatabase: boolean;\n }): MappingType {\n if (page.isDatabase) return \"database-folder\";\n if (page.hasContent && page.hasChildren) return \"folder-note\";\n if (!page.hasContent && page.hasChildren) return \"folder-only\";\n return \"file\";\n }\n}\n\nexport interface FileSystemEntry {\n readonly name: string;\n readonly path: string;\n readonly isDirectory: boolean;\n readonly children: FileSystemEntry[];\n}\n\nexport interface PageCreationPlan {\n readonly type: \"page-with-children\" | \"empty-page-with-children\" | \"leaf-page\";\n readonly title: string;\n readonly parentPageId: string;\n readonly contentSource?: string;\n readonly hasContent: boolean;\n}\n","import { watch } from \"chokidar\";\nimport type { FSWatcher } from \"chokidar\";\n\nexport type WatchEvent = \"add\" | \"change\" | \"unlink\";\n\nexport interface WatchCallback {\n (event: WatchEvent, path: string): void;\n}\n\nexport class FileWatcher {\n private watcher: FSWatcher | null = null;\n\n constructor(\n private readonly rootPath: string,\n private readonly callback: WatchCallback,\n ) {}\n\n start(): void {\n this.watcher = watch(this.rootPath, {\n ignored: [/(^|[/\\\\])\\./, \"**/node_modules/**\", \"**/.im-nobsidian/**\"],\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 500,\n pollInterval: 100,\n },\n });\n\n this.watcher.on(\"add\", (path) => this.callback(\"add\", path));\n this.watcher.on(\"change\", (path) => this.callback(\"change\", path));\n this.watcher.on(\"unlink\", (path) => this.callback(\"unlink\", path));\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","import type { SyncOrchestrator } from \"../sync/orchestrator.js\";\nimport type { SyncResult } from \"../types/sync.js\";\nimport { FileWatcher } from \"./file-watcher.js\";\nimport type { WatchEvent } from \"./file-watcher.js\";\n\nexport interface WatchSyncOptions {\n readonly debounceMs?: number;\n readonly syncDirection?: \"push\" | \"pull\" | \"both\";\n readonly onSyncStart?: () => void;\n readonly onSyncComplete?: (result: SyncResult) => void;\n readonly onSyncError?: (error: Error) => void;\n readonly onFileChange?: (event: WatchEvent, path: string) => void;\n}\n\nconst DEFAULT_DEBOUNCE_MS = 2000;\n\nexport class WatchSyncService {\n private readonly debounceMs: number;\n private readonly options: WatchSyncOptions;\n private watcher: FileWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChanges: Map<string, WatchEvent> = new Map();\n private syncing = false;\n private syncQueued = false;\n private running = false;\n\n constructor(\n private readonly rootPath: string,\n private readonly orchestrator: SyncOrchestrator,\n options: WatchSyncOptions = {},\n ) {\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n this.options = options;\n }\n\n start(): void {\n if (this.running) return;\n\n this.running = true;\n this.watcher = new FileWatcher(this.rootPath, (event, path) => {\n this.handleFileChange(event, path);\n });\n this.watcher.start();\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n this.running = false;\n this.clearDebounce();\n this.pendingChanges.clear();\n\n if (this.watcher) {\n await this.watcher.stop();\n this.watcher = null;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n isSyncing(): boolean {\n return this.syncing;\n }\n\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n private handleFileChange(event: WatchEvent, path: string): void {\n if (!path.endsWith(\".md\")) return;\n\n this.pendingChanges.set(path, event);\n this.options.onFileChange?.(event, path);\n this.scheduleSync();\n }\n\n private scheduleSync(): void {\n this.clearDebounce();\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n void this.executeSync();\n }, this.debounceMs);\n }\n\n private clearDebounce(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private async executeSync(): Promise<void> {\n if (this.syncing) {\n this.syncQueued = true;\n return;\n }\n\n this.syncing = true;\n const changedPaths = [...this.pendingChanges.keys()];\n this.pendingChanges.clear();\n\n try {\n this.options.onSyncStart?.();\n\n const result = await this.orchestrator.sync({\n paths: changedPaths.length > 0 ? changedPaths : undefined,\n });\n\n this.options.onSyncComplete?.(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.options.onSyncError?.(err);\n } finally {\n this.syncing = false;\n\n if (this.syncQueued) {\n this.syncQueued = false;\n void this.executeSync();\n }\n }\n }\n}\n"]}