@holokai/holo 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/holo.js +18745 -0
- package/dist/holo.js.map +1 -0
- package/package.json +82 -0
package/dist/holo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../packages/holo-sdk/src/env.ts","../src/services/settings.ts","../src/paths.ts","../src/utils/env.parsers.ts","../src/env.ts","../src/utils/logger.ts","../src/db/app.db.ts","../src/db/application.db.ts","../src/db/provider.db.ts","../../packages/holo-types/src/plugin/types.ts","../../packages/holo-types/src/plugin/index.ts","../../packages/holo-sdk/src/plugin/errors.ts","../../packages/holo-types/src/holo/content.ts","../../packages/holo-types/src/holo/messages.ts","../../packages/holo-types/src/holo/requests.ts","../../packages/holo-types/src/holo/responses.ts","../../packages/holo-types/src/holo/tools.ts","../../packages/holo-types/src/holo/errors.ts","../../packages/holo-types/src/holo/threads.ts","../../packages/holo-types/src/holo/generate.ts","../../packages/holo-types/src/holo/embed.ts","../../packages/holo-types/src/holo/metrics.ts","../../packages/holo-types/src/holo/models.ts","../../packages/holo-types/src/holo/index.ts","../../packages/holo-sdk/src/core/errors.ts","../../packages/holo-sdk/src/core/logger.ts","../../packages/holo-sdk/src/core/async-event-queue.ts","../../packages/holo-sdk/src/core/async-iter.ts","../../packages/holo-sdk/src/core/sanitize.object.ts","../../packages/holo-sdk/src/core/pick-defined.ts","../../packages/holo-sdk/src/core/set-by-path.ts","../../packages/holo-sdk/src/core/stringify-any.ts","../../packages/holo-sdk/src/core/stable-id.ts","../../packages/holo-sdk/src/core/safe-parse.ts","../../packages/holo-sdk/src/core/headers.ts","../../packages/holo-sdk/src/core/binary.ts","../../packages/holo-sdk/src/core/time-utils.ts","../../packages/holo-sdk/src/core/tokenizer.ts","../../packages/holo-sdk/src/core/version.ts","../../packages/holo-sdk/src/core/mime.ts","../../packages/holo-sdk/src/core/system.ts","../../packages/holo-sdk/src/core/index.ts","../../packages/holo-sdk/src/plugin/base.ts","../../packages/holo-sdk/src/plugin/datastore-base.ts","../../packages/holo-sdk/src/plugin/loader.ts","../../packages/holo-sdk/src/plugin/normalize.ts","../../packages/holo-sdk/src/plugin/index.ts","../../packages/holo-types/src/api/types.ts","../../packages/holo-types/src/api/index.ts","../../packages/holo-types/src/entities/base.ts","../../packages/holo-types/src/entities/protocol.ts","../../packages/holo-types/src/entities/server.ts","../../packages/holo-types/src/entities/pricing.ts","../../packages/holo-types/src/entities/index.ts","../../packages/holo-types/src/logger/logger.ts","../../packages/holo-types/src/logger/index.ts","../../packages/holo-types/src/notification/types.ts","../../packages/holo-types/src/notification/index.ts","../../packages/holo-types/src/provider/protocol.ts","../../packages/holo-types/src/provider/types.ts","../../packages/holo-types/src/provider/index.ts","../../packages/holo-types/src/routing/routes.ts","../../packages/holo-types/src/routing/index.ts","../../packages/holo-types/src/worker/envelopes.ts","../../packages/holo-types/src/worker/request.ts","../../packages/holo-types/src/worker/index.ts","../../packages/holo-types/src/index.ts","../../packages/holo-sdk/src/provider/auditor/base.ts","../../packages/holo-sdk/src/provider/auditor/index.ts","../../packages/holo-sdk/src/provider/translator/stream.ts","../../packages/holo-sdk/src/provider/translator/base.ts","../../packages/holo-sdk/src/provider/translator/stream-state.ts","../../packages/holo-sdk/src/provider/translator/translate-provider-events.ts","../../packages/holo-sdk/src/provider/translator/index.ts","../../packages/holo-sdk/src/provider/base.ts","../../packages/holo-sdk/src/provider/wire/base.ts","../../packages/holo-sdk/src/provider/wire/holo.wire.adapter.ts","../../packages/holo-sdk/src/provider/wire/index.ts","../../packages/holo-sdk/src/provider/event-processor.ts","../../packages/holo-sdk/src/provider/worker-request-factory.ts","../../packages/holo-sdk/src/provider/index.ts","../../packages/holo-sdk/src/holo/content.ts","../../packages/holo-sdk/src/holo/factories/request-factory.ts","../../packages/holo-sdk/src/holo/factories/index.ts","../../packages/holo-sdk/src/holo/index.ts","../../packages/holo-sdk/src/index.ts","../src/db/request.db.ts","../src/db/response.db.ts","../src/db/api.credential.db.ts","../src/db/holo.token.db.ts","../src/db/model.db.ts","../src/db/access.db.ts","../src/db/plugin.db.ts","../src/db/protocol.db.ts","../src/db/server.db.ts","../src/db/pricing.db.ts","../src/db/provider.response.cost.db.ts","../../packages/holo-sdk/src/matching/normalize.ts","../../packages/holo-sdk/src/matching/index.ts","../src/db/model-dictionary.db.ts","../src/db/model-dictionary-alias.db.ts","../src/db/model-match-override.db.ts","../src/db/datastore.db.ts","../src/db/index.ts","../../packages/holo-sdk/src/notification/service.ts","../../packages/holo-sdk/src/notification/store.ts","../../packages/holo-sdk/src/notification/types.ts","../../packages/holo-sdk/src/notification/index.ts","../src/db/notification.db.ts","../src/services/plugin/discovery.service.ts","../src/services/redis.service.ts","../src/services/plugin/loader.service.ts","../src/types/plugin.types.ts","../src/services/plugin/plugin.installer.service.ts","../src/services/plugin/provider.plugin.service.ts","../src/services/entities/base.entity.service.ts","../src/services/entities/application.service.ts","../src/services/entities/provider.service.ts","../src/services/entities/index.ts","../src/services/plugin/plugin.registry.ts","../src/services/auth/access.service.ts","../../packages/moku-sdk/src/errors.ts","../../packages/moku-sdk/src/transport.ts","../../packages/moku-sdk/src/namespaces/base.ts","../../packages/moku-sdk/src/namespaces/auth.ts","../../packages/moku-sdk/src/namespaces/applications.ts","../../packages/moku-sdk/src/namespaces/providers.ts","../../packages/moku-sdk/src/namespaces/models.ts","../../packages/moku-sdk/src/namespaces/organizations.ts","../../packages/moku-sdk/src/namespaces/teams.ts","../../packages/moku-sdk/src/namespaces/users.ts","../../packages/moku-sdk/src/namespaces/credentials.ts","../../packages/moku-sdk/src/namespaces/prompts.ts","../../packages/moku-sdk/src/namespaces/projects.ts","../../packages/moku-sdk/src/namespaces/pricing.ts","../../packages/moku-sdk/src/namespaces/plugins.ts","../../packages/moku-sdk/src/namespaces/datasets.ts","../../packages/moku-sdk/src/namespaces/evaluations.ts","../../packages/moku-sdk/src/namespaces/dashboards.ts","../../packages/moku-sdk/src/namespaces/analytics.ts","../../packages/moku-sdk/src/namespaces/servers.ts","../../packages/moku-sdk/src/namespaces/monitoring.ts","../../packages/moku-sdk/src/namespaces/audit.ts","../../packages/moku-sdk/src/namespaces/schemas.ts","../../packages/moku-sdk/src/namespaces/threads.ts","../../packages/moku-sdk/src/namespaces/agents.ts","../../packages/moku-sdk/src/namespaces/ref.ts","../../packages/moku-sdk/src/namespaces/index.ts","../../packages/moku-sdk/src/client.ts","../../packages/moku-sdk/src/index.ts","../src/services/auth/token.service.ts","../src/services/auth/holo.token.service.ts","../src/services/auth/auth.service.ts","../src/services/auth/crypto.service.ts","../src/services/auth/index.ts","../src/services/plugin/datastore.plugin.service.ts","../src/services/model-matching.service.ts","../src/services/plugin/plugin.service.ts","../src/services/plugin/provider.impl.service.ts","../src/services/queue.service.ts","../src/services/plugin/plugin.lifecycle.service.ts","../src/services/plugin/plugin.watcher.service.ts","../src/services/plugin/index.ts","../src/services/pricing.service.ts","../src/services/datastore.service.ts","../src/services/audit.mapping.service.ts","../src/services/audit.service.ts","../src/types/announcement.types.ts","../src/types/auth.types.ts","../src/types/config.types.ts","../src/types/errors.ts","../src/types/guard.types.ts","../src/types/index.ts","../src/utils/api.ts","../src/utils/pagination.ts","../src/utils/mixins.ts","../src/utils/indexing.ts","../src/utils/collection.ts","../src/utils/http.parsers.ts","../src/utils/index.ts","../src/services/response.service.ts","../src/services/worker.request.factory.ts","../src/services/guard.service.ts","../src/services/init.service.ts","../src/services/notification.service.ts","../src/services/request.service.ts","../src/services/admin.service.ts","../src/services/holo.request.service.ts","../src/services/index.ts","../src/api/middleware/error.middleware.ts","../src/api/middleware/cors.middleware.ts","../src/api/middleware/auth.middleware.ts","../src/api/middleware/index.ts","../src/services/plugin/plugin.route.service.ts","../../packages/holo-etl/src/sources/openrouter.source.ts","../../packages/holo-etl/src/sources/litellm.source.ts","../../packages/holo-etl/src/sources/modelsdev.source.ts","../../packages/holo-etl/src/sources/index.ts","../../packages/holo-etl/src/sync/alias-generator.ts","../../packages/holo-etl/src/sync/dictionary-sync.ts","../../packages/holo-etl/src/sync/canonicalize.ts","../../packages/holo-etl/src/sync/publish.ts","../../packages/holo-etl/src/sync/dictionary-enrich.ts","../../packages/holo-etl/src/sync/pipeline.ts","../../packages/holo-etl/src/sync/index.ts","../../packages/holo-etl/src/index.ts","../src/services/model-discovery.service.ts","../src/services/dictionary-sync.service.ts","../src/container/base.registry.ts","../src/container/api.registry.ts","../src/servers/base.server.ts","../src/servers/mixins/with.db.ts","../src/servers/mixins/with.queue.ts","../src/servers/mixins/with.admin.ts","../src/servers/mixins/with.stats.ts","../src/servers/mixins/index.ts","../src/api/controllers/app.controller.ts","../src/api/routes/app.routes.ts","../src/api/controllers/notification.controller.ts","../src/api/routes/notification.routes.ts","../src/api/controllers/token.controller.ts","../src/api/routes/token.routes.ts","../src/api/controllers/pricing.controller.ts","../src/api/routes/pricing.routes.ts","../src/api/controllers/cache.controller.ts","../src/api/routes/cache.routes.ts","../src/api/controllers/provider.crud.controller.ts","../src/api/routes/provider.routes.ts","../src/api/controllers/application.controller.ts","../src/api/routes/application.routes.ts","../src/api/controllers/model.controller.ts","../src/api/routes/model.routes.ts","../src/api/controllers/response.controller.ts","../src/api/routes/response.routes.ts","../src/api/controllers/request.controller.ts","../src/api/routes/request.routes.ts","../src/api/controllers/holo.controller.ts","../src/api/routes/holo.routes.ts","../src/api/controllers/plugin.controller.ts","../src/api/routes/plugin.routes.ts","../src/api/controllers/datastore.controller.ts","../src/api/routes/datastore.routes.ts","../src/api/routes/index.ts","../src/version.ts","../src/api/swagger.ts","../src/servers/api.server.ts","../src/app.ts","../src/container/worker.registry.ts","../src/servers/worker.server.ts","../src/worker.ts","../src/container/audit.registry.ts","../src/servers/audit.server.ts","../src/audit.ts","../src/aio.ts","../src/cli.ts","../src/cli/init.ts","../src/cli/start.ts","../src/cli/view.ts","../src/cli/doctor.ts","../src/cli/plugin.ts"],"sourcesContent":["import {existsSync, mkdirSync} from 'fs';\nimport os from 'os';\nimport {join, resolve} from 'path';\n\nfunction resolveHolokaiHome(): string {\n if (process.env.HOLOKAI_HOME) return resolve(process.env.HOLOKAI_HOME);\n const legacy = join(os.homedir(), '.holokai');\n if (existsSync(legacy)) return legacy;\n if (process.env.XDG_DATA_HOME) return join(process.env.XDG_DATA_HOME, 'holokai');\n return legacy;\n}\n\nexport const HOLOKAI_HOME = resolveHolokaiHome();\nexport const PLUGINS_DIR = process.env.HOLO_PLUGINS_DIR\n ? resolve(process.env.HOLO_PLUGINS_DIR)\n : join(HOLOKAI_HOME, 'plugins');\nexport const CONFIG_DIR = process.env.HOLOKAI_CONFIG_DIR\n ? resolve(process.env.HOLOKAI_CONFIG_DIR)\n : join(HOLOKAI_HOME, 'config');\nexport const LOGS_DIR = process.env.LOG_DIR\n ? resolve(process.env.LOG_DIR)\n : join(HOLOKAI_HOME, 'logs');\nexport const DATA_DIR = process.env.HOLOKAI_DATA_DIR\n ? resolve(process.env.HOLOKAI_DATA_DIR)\n : join(HOLOKAI_HOME, 'data');\n\nexport function ensureHolokaiDirs(): void {\n for (const dir of [HOLOKAI_HOME, PLUGINS_DIR, CONFIG_DIR, LOGS_DIR, DATA_DIR]) {\n if (!existsSync(dir)) {\n mkdirSync(dir, {recursive: true});\n }\n }\n}\n","import {existsSync, mkdirSync, readFileSync, writeFileSync} from 'fs';\nimport {dirname, join} from 'path';\nimport {CONFIG_DIR} from '@holokai/holo-sdk/env';\n\nexport interface HoloSettings {\n jwt?: {\n secret?: string;\n algorithm?: string;\n };\n encryption?: {\n credential_key?: string;\n };\n postgres?: {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n };\n rabbitmq?: {\n url?: string;\n };\n redis?: {\n url?: string;\n };\n moku?: {\n url?: string;\n };\n servers?: {\n api_id?: string;\n worker_id?: string;\n audit_id?: string;\n };\n}\n\nexport const SETTINGS_FILE = join(CONFIG_DIR, 'settings.json');\n\nexport function loadSettings(): HoloSettings | null {\n if (!existsSync(SETTINGS_FILE)) return null;\n try {\n return JSON.parse(readFileSync(SETTINGS_FILE, 'utf8')) as HoloSettings;\n } catch {\n return null;\n }\n}\n\nexport function writeSettings(settings: HoloSettings): void {\n mkdirSync(dirname(SETTINGS_FILE), {recursive: true});\n writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2) + '\\n');\n}\n\nexport function applySettingsToEnv(): void {\n const s = loadSettings();\n if (!s) return;\n const set = (key: string, val: string | number | undefined): void => {\n if (val != null && !process.env[key]) {\n process.env[key] = String(val);\n }\n };\n set('JWT_SECRET', s.jwt?.secret);\n set('JWT_ALGORITHM', s.jwt?.algorithm);\n set('CREDENTIAL_ENCRYPTION_KEY', s.encryption?.credential_key);\n set('AUDIT_PG_HOST', s.postgres?.host);\n set('AUDIT_PG_PORT', s.postgres?.port);\n set('AUDIT_PG_USER', s.postgres?.user);\n set('AUDIT_PG_PASSWORD', s.postgres?.password);\n set('AUDIT_PG_DATABASE', s.postgres?.database);\n set('RABBITMQ_URL', s.rabbitmq?.url);\n set('REDIS_URL', s.redis?.url);\n set('MOKU_URL', s.moku?.url);\n set('API_SERVER_ID', s.servers?.api_id);\n set('WORKER_ID', s.servers?.worker_id);\n set('AUDIT_ID', s.servers?.audit_id);\n}\n","import {existsSync} from 'fs';\nimport {createRequire} from 'module';\nimport {dirname, join, resolve} from 'path';\nimport {fileURLToPath} from 'url';\n\nconst require = createRequire(import.meta.url);\n\nexport {CONFIG_DIR, DATA_DIR, ensureHolokaiDirs, HOLOKAI_HOME, LOGS_DIR, PLUGINS_DIR} from '@holokai/holo-sdk/env';\n\nexport function resolveAppModulesDir(): string {\n if (process.env.API_PLUGINS_DIR) return resolve(process.env.API_PLUGINS_DIR);\n\n const startDir = fileURLToPath(new URL('.', import.meta.url));\n\n // Case 1: binary is installed inside a node_modules tree (global install, npx,\n // tarball install). Walk up looking for an ancestor named \"node_modules\".\n let probe = startDir;\n for (let i = 0; i < 10; i++) {\n if (probe.split(/[/\\\\]/).pop() === 'node_modules') return probe;\n const parent = dirname(probe);\n if (parent === probe) break;\n probe = parent;\n }\n\n // Case 2: dev / repo run — collect every ancestor that has a `node_modules/@holokai`\n // and return the OUTERMOST. In a monorepo (pnpm or npm), the per-workspace\n // `node_modules/@holokai` only carries direct deps; the workspace-root\n // `node_modules/@holokai` carries every workspace package (via hoist or symlink).\n // The outermost match is the authoritative one for plugin discovery.\n let outermost: string | null = null;\n probe = startDir;\n for (let i = 0; i < 10; i++) {\n const candidate = join(probe, 'node_modules');\n if (existsSync(join(candidate, '@holokai'))) outermost = candidate;\n const parent = dirname(probe);\n if (parent === probe) break;\n probe = parent;\n }\n if (outermost) return outermost;\n\n return resolve(startDir, '..', '..', 'node_modules');\n}\n","export function parseBoolean(value: string | undefined, defaultValue: boolean = false): boolean {\n if (!value) return defaultValue;\n return value.toLowerCase() === 'true';\n}\n\nexport function parseNumber(value: string | undefined, defaultValue: number): number {\n if (!value) return defaultValue;\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\nexport function parseArray(value: string | undefined, defaultValue: string[] = []): string[] {\n if (!value) return defaultValue;\n return value.split(',').map(item => item.trim());\n}\n\nexport function clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n","/**\n * Environment Configuration Module\n *\n * IMPORTANT: This module executes immediately when imported and reads from process.env.\n * Ensure dotenv.config() is called BEFORE importing this module in your main server files.\n *\n * The application entry points (app.ts, worker.server.ts, audit.server.ts) have been\n * configured to load dotenv before any other imports.\n */\nimport {resolve} from 'path';\nimport dotenv from 'dotenv';\nimport {ensureHolokaiDirs, LOGS_DIR, PLUGINS_DIR, resolveAppModulesDir} from \"./paths\";\nimport {applySettingsToEnv} from \"./services/settings\";\nimport {parseArray, parseBoolean, parseNumber} from \"./utils/env.parsers\";\n\ndotenv.config({path: [resolve(import.meta.dirname, '../../.env'), '.env']});\napplySettingsToEnv();\nensureHolokaiDirs();\n\nexport namespace env {\n export const NODE_ENV = process.env.NODE_ENV || 'development';\n export const id = process.env.PORT ? `p${process.env.PORT}` : Math.random().toString(36).substring(2, 10);\n export const logDir = LOGS_DIR;\n\n // API config\n export namespace api {\n export const apiServerId = process.env.API_SERVER_ID || `api_${id}`;\n export const port = parseNumber(process.env.PORT, 3000);\n export const configMode = process.env.API_CONFIG_MODE || 'local';\n export const configFile = process.env.API_CONFIG_FILE || './sample.app.config.json';\n export const configTimeoutMs = parseNumber(process.env.API_CONFIG_TIMEOUT, 60000);\n export const appModulesDir = resolveAppModulesDir();\n export const pluginsDir = PLUGINS_DIR;\n export const skipInitialPlugins = parseBoolean(process.env.SKIP_INITIAL_PLUGINS, false);\n export const pluginWatchEnabled = parseBoolean(process.env.PLUGIN_WATCH_ENABLED, NODE_ENV === 'development');\n export const pluginWatchIntervalMs = parseNumber(process.env.PLUGIN_WATCH_INTERVAL_MS, 30000);\n export const pluginReconcileIntervalMs = parseNumber(process.env.PLUGIN_RECONCILE_INTERVAL_MS, 0);\n\n // Notifications (SSE)\n export namespace notifications {\n // Endpoint behavior\n export const sseHeartbeatMs = parseNumber(process.env.NOTIF_SSE_HEARTBEAT_MS, 25000);\n export const replayDefaultLimit = parseNumber(process.env.NOTIF_REPLAY_DEFAULT_LIMIT, 250);\n export const replayMaxLimit = parseNumber(process.env.NOTIF_REPLAY_MAX_LIMIT, 1000);\n\n // Live fanout transport\n // NOTE: We default to your existing direct exchange to minimize disruption.\n export const exchange = process.env.NOTIF_EXCHANGE || \"direct-exchange\";\n export const routingKeyPrefix = process.env.NOTIF_ROUTING_KEY_PREFIX || \"notif\";\n export const queueNamePrefix = process.env.NOTIF_QUEUE_PREFIX || \"notif_stream\";\n\n // Optional: include additional events by default (comma-separated)\n // e.g. \"status,guard_started,guard_failed\"\n export const defaultTypes = parseArray(process.env.NOTIF_DEFAULT_TYPES, []);\n }\n }\n\n // Database config\n export namespace appDb {\n export const host = process.env.APP_PG_HOST || process.env.AUDIT_PG_HOST || 'localhost';\n export const port = parseNumber(process.env.APP_PG_PORT || process.env.AUDIT_PG_PORT, 5432);\n export const database = process.env.APP_PG_DATABASE || process.env.AUDIT_PG_DATABASE || 'holokai';\n export const user = process.env.APP_PG_USER || process.env.AUDIT_PG_USER || 'holo';\n export const password = process.env.APP_PG_PASSWORD || process.env.AUDIT_PG_PASSWORD || 'holopassword';\n export const ssl = parseBoolean(process.env.APP_PG_SSL || process.env.AUDIT_PG_SSL, false);\n export const maxConnections = parseNumber(process.env.APP_PG_MAX_CONNECTIONS || process.env.AUDIT_PG_MAX_CONNECTIONS, 20);\n export const idleTimeout = parseNumber(process.env.APP_PG_IDLE_TIMEOUT || process.env.AUDIT_PG_IDLE_TIMEOUT, 30000);\n\n export const config = {\n host,\n port,\n database,\n user,\n password,\n ssl,\n max: maxConnections,\n idleTimeoutMillis: idleTimeout\n };\n }\n\n // Database config\n export namespace auditDb {\n export const host = process.env.AUDIT_PG_HOST || process.env.APP_PG_HOST || 'postgres';\n export const port = parseNumber(process.env.AUDIT_PG_PORT || process.env.APP_PG_PORT, 5432);\n export const database = process.env.AUDIT_PG_DATABASE || process.env.APP_PG_DATABASE || 'holokai';\n export const user = process.env.AUDIT_PG_USER || process.env.APP_PG_USER || 'holo';\n export const password = process.env.AUDIT_PG_PASSWORD || process.env.APP_PG_PASSWORD || 'holopassword';\n export const ssl = parseBoolean(process.env.AUDIT_PG_SSL || process.env.APP_PG_SSL, false);\n export const maxConnections = parseNumber(process.env.AUDIT_PG_MAX_CONNECTIONS || process.env.APP_PG_MAX_CONNECTIONS, 20);\n export const idleTimeout = parseNumber(process.env.AUDIT_PG_IDLE_TIMEOUT || process.env.APP_PG_IDLE_TIMEOUT, 30000);\n\n export const config = {\n host,\n port,\n database,\n user,\n password,\n ssl,\n max: maxConnections,\n idleTimeoutMillis: idleTimeout\n };\n }\n\n export namespace redis {\n export const url = process.env.REDIS_URL || 'redis://localhost:6379';\n }\n\n // Queue config\n export namespace queue {\n export const url = process.env.RABBITMQ_URL || 'amqp://localhost:5672';\n export const reconnectAttempts = parseNumber(process.env.RABBITMQ_RECONNECT_ATTEMPTS, 5);\n export const reconnectDelayMs = parseNumber(process.env.RABBITMQ_RECONNECT_DELAY_MS, 5000);\n\n const prefix = process.env.QUEUE_PREFIX || '';\n\n function q(name: string) {\n return prefix ? `${prefix}_${name}` : name;\n }\n\n export const requestQueue = process.env.RABBITMQ_REQUEST_QUEUE || q('llm_requests');\n export const requestExchange = process.env.RABBITMQ_REQUEST_EXCHANGE || q('llm_requests_exchange');\n export const responseQueue = process.env.RABBITMQ_RESPONSE_QUEUE || q('llm_responses');\n export const responseExchange = process.env.RABBITMQ_RESPONSE_EXCHANGE || q('llm_responses_exchange');\n\n export const adminExchange = process.env.RABBITMQ_ADMIN_EXCHANGE || q('llm_admin');\n export const directExchange = process.env.RABBITMQ_DIRECT_EXCHANGE || q('direct-exchange');\n export const adminCommandQueue = process.env.RABBITMQ_ADMIN_COMMAND_QUEUE || q('llm_admin_commands');\n export const adminResponseExchange = process.env.RABBITMQ_ADMIN_RESPONSE_EXCHANGE || q('llm_admin_responses');\n export const adminResponseQueue = process.env.RABBITMQ_ADMIN_RESPONSE_QUEUE || q('llm_admin_responses');\n\n export const platformExchange = process.env.RABBITMQ_PLATFORM_EXCHANGE || q('platform');\n\n export const auditRequestQueue = process.env.RABBITMQ_AUDIT_REQUEST_QUEUE || q('llm_requests_audit');\n export const auditResponseQueue = process.env.RABBITMQ_AUDIT_RESPONSE_QUEUE || q('llm_responses_audit');\n export const auditRoutingKey = process.env.AUDIT_ROUTING_KEY || q(\"audit\");\n\n export const batchQueue = process.env.RABBITMQ_BATCH_QUEUE || q('batch-jobs');\n export const batchRoutingKey = process.env.BATCH_ROUTING_KEY || q('batch-jobs');\n\n export const queueExpiration = process.env.QUEUE_EXPIRATION || 3600000;\n\n export const managementQueue = process.env.PROXY_MANAGEMENT_QUEUE || q('proxy_management');\n\n export const notificationExchange = process.env.RABBITMQ_NOTIFICATION_EXCHANGE || q(\"notifications_exchange\");\n export const notificationQueue = process.env.RABBITMQ_NOTIFICATION_QUEUE || q('notifications');\n export const auditNotificationQueue = process.env.RABBITMQ_AUDIT_NOTIFICATION_QUEUE || q(\"notifications_audit\");\n\n export const config = {\n url,\n reconnectAttempts,\n reconnectDelayMs\n };\n }\n\n export namespace worker {\n export const serverId = process.env.WORKER_ID || `worker_${id}`;\n export const pluginsDir = process.env.WORKER_PLUGINS_DIR || api.pluginsDir;\n export const adminCommandQueue = `${queue.adminCommandQueue}_${worker.serverId}`;\n }\n\n export namespace audit {\n export const serverId = process.env.AUDIT_ID || `audit_${id}`;\n export const pluginsDir = process.env.AUDIT_PLUGINS_DIR || api.pluginsDir;\n }\n\n export namespace batch {\n export const serverId = process.env.BATCH_ID ||\n `batch_${id}`;\n }\n\n export interface JWTConfig {\n secret: string;\n expiresIn: string;\n algorithm: 'HS384';\n }\n\n if (!process.env.JWT_SECRET) {\n throw new Error('JWT_SECRET environment variable is required');\n }\n\n export const jwtConfig: JWTConfig = {\n secret: process.env.JWT_SECRET,\n expiresIn: process.env.JWT_EXPIRES_IN || '1h',\n algorithm: 'HS384'\n };\n\n export const mokuUrl = process.env.MOKU_URL || 'http://localhost:8080';\n\n export namespace security {\n export const encryptionKey = process.env.CREDENTIAL_ENCRYPTION_KEY;\n if (!encryptionKey) {\n throw new Error('ENCRYPTION_KEY environment variable is required for decrypting API credentials');\n }\n\n export const corsAllowedOrigins = parseArray(\n process.env.CORS_ALLOWED_ORIGINS,\n ['https://*.holokai.app', 'https://*.holokai.dev']\n );\n }\n}\n","import 'reflect-metadata';\nimport winston from 'winston';\nimport fs from 'fs';\nimport path from 'path';\nimport {env} from \"../env\";\nimport {container, type InjectionToken} from \"tsyringe\";\n\nconst logDir = env.logDir;\n\ntry {\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, {recursive: true});\n }\n} catch (error) {\n console.warn(`Warning: Could not create logs directory: ${(error as Error).message}`);\n console.warn('Logging to console only');\n}\n\nexport const levels = {\n fatal: 0,\n error: 1,\n warn: 2,\n info: 3,\n http: 4,\n verbose: 5,\n debug: 6,\n trace: 7,\n};\n\nexport const colors = {\n fatal: 'red',\n error: 'red',\n warn: 'yellow',\n info: 'green',\n http: 'magenta',\n verbose: 'cyan',\n debug: 'white',\n trace: 'gray',\n};\n\nwinston.addColors(colors);\n\nfunction formatTime(ts: any): string {\n const d = new Date(ts);\n const hh = String(d.getHours()).padStart(2, \"0\");\n const mm = String(d.getMinutes()).padStart(2, \"0\");\n const ss = String(d.getSeconds()).padStart(2, \"0\");\n const ms = String(d.getMilliseconds()).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\n\nfunction initialism(name: string): string {\n const caps = name.match(/[A-Z]/g);\n if (caps && caps.length >= 2) return caps.join(\"\");\n return name.slice(0, 2);\n}\n\nfunction truncate(s: string, width: number): string {\n if (s.length <= width) return s.padEnd(width, \" \");\n return s.slice(0, Math.max(0, width - 1)) + \"…\";\n}\n\nfunction shortRid(rid?: string, n = 6) {\n if (!rid) return \"\";\n const s = String(rid);\n return `rid=${s.length <= n ? s : s.slice(-n)}`;\n}\n\nfunction formatLocation(cls?: string, mth?: string, width = 26): string {\n const c = cls ? String(cls) : \"\";\n const m = mth ? String(mth) : \"\";\n if (!c && !m) return \"\";\n\n const full = c && m ? `${c}.${m}` : (c || m);\n if (full.length <= width) return full;\n\n if (c && m) {\n const init = `${initialism(c)}.${m}`;\n if (init.length <= width) return init;\n\n // truncate class to fit\n const roomForClass = Math.max(1, width - (m.length + 1));\n const truncCls = truncate(c, roomForClass).trim();\n return `${truncCls}.${m}`.slice(0, width);\n }\n\n return full.slice(0, width);\n}\n\nexport function createLoggerFormat(serverId: string) {\n const W_LVL = 3;\n const W_SRV = 10;\n const W_LOC = 28;\n const W_RID = 12;\n\n const lvl3 = (lvl: string) => {\n const l = lvl.toLowerCase();\n if (l === \"fatal\") return \"FTL\";\n if (l === \"error\") return \"ERR\";\n if (l === \"warn\") return \"WRN\";\n if (l === \"info\") return \"INF\";\n if (l === \"debug\") return \"DBG\";\n if (l === \"http\") return \"HTP\";\n if (l === \"verbose\") return \"VRB\";\n if (l === \"trace\") return \"TRC\";\n return l.slice(0, 3).toUpperCase();\n };\n\n return winston.format.combine(\n winston.format.timestamp(),\n winston.format.printf(({level, message, timestamp, className, methodName, requestId, ...metadata}) => {\n const time = formatTime(timestamp);\n // Strip ANSI color codes from level if present\n const cleanLevel = level.replace(/\\x1b\\[\\d+m/g, '');\n const lvl = truncate(lvl3(cleanLevel), W_LVL).trim();\n const srv = truncate(serverId, W_SRV).trim();\n const loc = truncate(formatLocation(className as string | undefined, methodName as string | undefined, W_LOC), W_LOC).trimEnd();\n const rid = truncate(shortRid(requestId as string | undefined, 6), W_RID).trim();\n\n let msg = `${time}|${lvl}|${srv}|${loc}|${rid}|${message}`;\n if (Object.keys(metadata).length > 0) {\n msg += ` ${JSON.stringify(metadata)}`;\n }\n return msg;\n }),\n winston.format.colorize({all: true})\n );\n}\n\nconst transports: any[] = [\n new winston.transports.Console()\n];\n\ntry {\n fs.accessSync(logDir, fs.constants.W_OK);\n\n transports.push(\n new winston.transports.File({\n filename: path.join(logDir, 'error.log'),\n level: 'error',\n })\n );\n\n transports.push(\n new winston.transports.File({\n filename: path.join(logDir, 'all.log')\n })\n );\n} catch (error) {\n console.warn(`Warning: Could not access logs directory for writing: ${(error as Error).message}`);\n console.warn('Logging to console only');\n}\n\nconst level = (): string => {\n return env.NODE_ENV === 'development' ? 'debug' : 'info';\n};\n\nexport function createLoggerOptions(serverId: string) {\n return {\n level: level(),\n levels,\n format: createLoggerFormat(serverId),\n transports,\n }\n}\n\nconst baseLogger = winston.createLogger(\n createLoggerOptions(env.id)\n);\n\n// Extend the logger with fatal and trace methods to match HoloLogger interface\nconst logger = baseLogger as winston.Logger & {\n fatal: typeof baseLogger.error;\n trace: typeof baseLogger.debug;\n};\n\n// Add fatal and trace methods (Winston creates these from custom levels but doesn't expose them in types)\n(logger as any).fatal = baseLogger.log.bind(baseLogger, 'fatal');\n(logger as any).trace = baseLogger.log.bind(baseLogger, 'trace');\n\nexport const LoggerFactoryToken: InjectionToken<(cls: Function | string) => winston.Logger> = 'LoggerFactory';\n\ncontainer.register(LoggerFactoryToken, {\n useFactory: () => (cls: Function | string) => {\n const childLogger = baseLogger.child({className: (cls as Function).name ?? cls}) as winston.Logger & {\n fatal: typeof baseLogger.error;\n trace: typeof baseLogger.debug;\n };\n (childLogger as any).fatal = childLogger.log.bind(childLogger, 'fatal');\n (childLogger as any).trace = childLogger.log.bind(childLogger, 'trace');\n return childLogger;\n }\n});\n\nexport default logger;\n","import {Pool, type QueryResult, type QueryResultRow} from 'pg';\nimport {type DatabaseConfig} from '../types';\nimport logger from '../utils/logger';\nimport {env} from \"../env\";\n\n/**\n * Database connection and management service\n */\nexport class AppDB {\n private readonly pool: Pool;\n private disconnected = false;\n\n constructor(private readonly config: DatabaseConfig = env.appDb.config) {\n this.pool = new Pool(this.config);\n }\n\n async connect(): Promise<void> {\n try {\n // Test connection\n const now = await this.pool.query('SELECT NOW()');\n logger.info(`Successfully connected to PostgreSQL: ${now.rows[0].now}`);\n } catch (error) {\n logger.error(`Failed to connect to PostgreSQL: ${(error as Error).message}`);\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.pool && !this.disconnected) {\n this.disconnected = true;\n await this.pool.end();\n logger.info('Disconnected from PostgreSQL');\n }\n }\n\n getPool(): Pool {\n if (!this.pool) {\n throw new Error('Database not connected');\n }\n return this.pool;\n }\n\n /**\n * Execute a generic query with type safety\n * @param text - SQL query string\n * @param params - Query parameters\n * @returns Promise<T[]> - Array of results typed as T\n */\n async query<T extends QueryResultRow = any>(text: string, params?: any[]): Promise<T[]> {\n const pool = this.getPool();\n return pool.query(text, params).then((result) => result.rows);\n }\n\n /**\n * Execute a query and return the full QueryResult object\n * @param text - SQL query string\n * @param params - Query parameters\n * @returns Promise<QueryResult<T>> - Full query result with metadata\n */\n async queryResult<T extends QueryResultRow = any>(text: string, params?: any[]): Promise<QueryResult<T>> {\n const pool = this.getPool();\n return pool.query(text, params);\n }\n\n /**\n * Execute a query and return only the first row\n * @param text - SQL query string\n * @param params - Query parameters\n * @returns Promise<T | null> - First row or null if no results\n */\n async queryOne<T = any>(text: string, params?: any[]): Promise<T | null> {\n return this.query(text, params).then((rows) => rows[0] || null);\n }\n\n /**\n * Execute a query and return a single scalar value\n * @param text - SQL query string\n * @param params - Query parameters\n * @returns Promise<U | null> - Single value or null\n */\n async queryScalar<U = any>(text: string, params?: any[]): Promise<U | null> {\n const result = await this.queryResult(text, params);\n if (result.rows.length === 0) return null;\n const firstRow = result.rows[0] as any;\n return Object.values(firstRow)[0] as U;\n }\n\n /**\n * Execute multiple queries in a transaction\n * @param queries - Array of query objects with text and params\n * @returns Promise<any[]> - Array of results\n */\n async queryBatch(queries: Array<{ text: string; params?: any[] }>): Promise<any[]> {\n return this.transaction(async (client) => {\n const results = [];\n for (const query of queries) {\n const result = await client.query(query.text, query.params);\n results.push(result.rows);\n }\n return results;\n });\n }\n\n async asUser<T>(orgId: string, callback: (client: any) => Promise<T>): Promise<T> {\n return this.transaction(async (client) => {\n await client.query(\n `SELECT set_config('holokai.current_organization_id', $1, true)`,\n [orgId]\n );\n return callback(client);\n });\n }\n\n async asSystem<T>(callback: (client: any) => Promise<T>): Promise<T> {\n return this.transaction(async (client) => {\n await client.query(\n `SELECT set_config('holokai.bypass_rls', 'true', true)`\n );\n return callback(client);\n });\n }\n\n async systemQuery<T extends QueryResultRow = any>(text: string, params?: any[]): Promise<T[]> {\n return this.asSystem(async (client) => {\n const result = await client.query(text, params);\n return result.rows;\n });\n }\n\n async systemQueryOne<T = any>(text: string, params?: any[]): Promise<T | null> {\n return this.asSystem(async (client) => {\n const result = await client.query(text, params);\n return result.rows[0] || null;\n });\n }\n\n async systemQueryScalar<U = any>(text: string, params?: any[]): Promise<U | null> {\n return this.asSystem(async (client) => {\n const result = await client.query(text, params);\n if (result.rows.length === 0) return null;\n const firstRow = result.rows[0] as any;\n return Object.values(firstRow)[0] as U;\n });\n }\n\n async transaction<T>(callback: (client: any) => Promise<T>): Promise<T> {\n const pool = this.getPool();\n const client = await pool.connect();\n\n try {\n await client.query('BEGIN');\n const result = await callback(client);\n await client.query('COMMIT');\n return result;\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n\n isConnected(): boolean {\n return this.pool !== null;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport type {Application} from '@holokai/holo-types/entities';\n\nconst POPULATED_APPLICATION_QUERY = `\n SELECT a.*,\n row_to_json(p.*) AS provider,\n (SELECT coalesce(json_agg(m.*), '[]'::json)\n FROM models m\n JOIN application_models am ON m.id = am.model_id\n WHERE am.application_id = a.id\n AND m.active = true) AS models,\n row_to_json(sp.*) AS system_prompt,\n (SELECT coalesce(json_agg(gp.*), '[]'::json)\n FROM prompts gp\n JOIN application_guards ag ON gp.id = ag.prompt_id\n WHERE ag.application_id = a.id\n AND gp.active = true) AS guards\n FROM applications a\n JOIN providers p ON a.provider_id = p.id\n LEFT JOIN prompts sp ON a.system_prompt_id = sp.id\n WHERE a.active = true\n`;\n\n@injectable()\nexport class ApplicationDB {\n constructor(private db: AppDB) {\n }\n\n async getById(id: string): Promise<Application | null> {\n return this.db.systemQueryOne<Application>(POPULATED_APPLICATION_QUERY + ` AND a.id = $1`, [id]);\n }\n\n async getBySlug(orgId: string, urlSlug: string): Promise<Application | null> {\n return this.db.systemQueryOne<Application>(\n POPULATED_APPLICATION_QUERY + ` AND a.organization_id = $1 AND a.url_slug = $2`,\n [orgId, urlSlug],\n );\n }\n\n async getBySlugUnscoped(urlSlug: string): Promise<Application | null> {\n return this.db.systemQueryOne<Application>(POPULATED_APPLICATION_QUERY + ` AND a.url_slug = $1`, [urlSlug]);\n }\n\n async getAllByOrg(orgId: string): Promise<Application[]> {\n return this.db.systemQuery<Application>(POPULATED_APPLICATION_QUERY + ` AND a.organization_id = $1 ORDER BY a.name`, [orgId]);\n }\n\n async listPaginated(filters: {\n org_id?: string; provider_id?: string; search?: string;\n }, limit: number, offset: number, sortBy: string, sortDir: string): Promise<{\n rows: Application[];\n total: number\n }> {\n const conditions: string[] = ['a.active = true'];\n const params: any[] = [];\n let idx = 1;\n\n if (filters.org_id) {\n conditions.push(`a.organization_id = $${idx++}`);\n params.push(filters.org_id);\n }\n if (filters.provider_id) {\n conditions.push(`a.provider_id = $${idx++}`);\n params.push(filters.provider_id);\n }\n if (filters.search) {\n conditions.push(`(a.name ILIKE $${idx} OR a.url_slug ILIKE $${idx})`);\n params.push(`%${filters.search}%`);\n idx++;\n }\n\n const where = conditions.join(' AND ');\n const allowedSorts = new Set(['name', 'url_slug', 'created_at', 'updated_at']);\n const col = allowedSorts.has(sortBy) ? sortBy : 'created_at';\n const dir = sortDir === 'asc' ? 'ASC' : 'DESC';\n\n const limitIdx = idx++;\n const offsetIdx = idx++;\n return this.db.asSystem(async (client) => {\n const [rowsResult, countResult] = await Promise.all([\n client.query(\n `SELECT a.*, row_to_json(p.*) AS provider\n FROM applications a\n JOIN providers p ON a.provider_id = p.id\n WHERE ${where}\n ORDER BY a.${col} ${dir}\n LIMIT $${limitIdx} OFFSET $${offsetIdx}`,\n [...params, limit, offset]\n ),\n client.query(`SELECT COUNT(*)::text as count\n FROM applications a\n WHERE ${where}`, params),\n ]);\n return {\n rows: rowsResult.rows as Application[],\n total: parseInt(countResult.rows[0]?.count ?? '0'),\n };\n });\n }\n\n async create(app: Record<string, any>): Promise<Application | null> {\n return this.db.systemQueryOne<Application>(\n `INSERT INTO applications (organization_id, name, url_slug, description, provider_id, system_prompt_id,\n enabled, available, active)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, true)\n RETURNING *`,\n [app.organization_id, app.name, app.url_slug, app.description ?? null,\n app.provider_id, app.system_prompt_id ?? null, app.enabled ?? true, app.available ?? true]\n );\n }\n\n async update(id: string, fields: Record<string, any>): Promise<Application | null> {\n const sets: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n const updatable = ['name', 'url_slug', 'description', 'provider_id', 'system_prompt_id', 'enabled', 'available'];\n for (const key of updatable) {\n if (fields[key] !== undefined) {\n sets.push(`${key} = $${idx++}`);\n params.push(fields[key]);\n }\n }\n\n if (sets.length === 0) return this.getById(id);\n\n sets.push(`updated_at = now()`);\n params.push(id);\n return this.db.systemQueryOne<Application>(`UPDATE applications\n SET ${sets.join(', ')}\n WHERE id = $${idx} AND active = true RETURNING *`, params);\n }\n\n async softDelete(id: string): Promise<boolean> {\n const result = await this.db.systemQueryOne<Application>(`UPDATE applications\n SET active = false,\n updated_at = now()\n WHERE id = $1\n RETURNING id`, [id]);\n return result !== null;\n }\n}\n","import 'reflect-metadata';\nimport {AppDB} from \"./app.db\";\nimport {injectable} from \"tsyringe\";\nimport {type Provider} from \"@holokai/holo-types/entities\";\n\nexport interface ProviderWithCredential extends Provider {\n encrypted_value?: string;\n initialization_vector?: string;\n}\n\n@injectable()\nexport class ProviderDB {\n constructor(private db: AppDB) {\n\n }\n\n async list(): Promise<ProviderWithCredential[]> {\n const query = `\n SELECT p.*,\n ac.encrypted_value,\n ac.initialization_vector\n FROM providers p\n LEFT JOIN api_credentials ac ON p.api_credential_id = ac.id\n WHERE p.enabled = true\n AND p.available = true\n ORDER BY p.name\n `;\n return this.db.systemQuery<ProviderWithCredential>(query);\n }\n\n async get(name: string): Promise<ProviderWithCredential | null> {\n const query = `\n SELECT p.*,\n ac.encrypted_value,\n ac.initialization_vector\n FROM providers p\n LEFT JOIN api_credentials ac ON p.api_credential_id = ac.id\n WHERE LOWER(p.name) = LOWER($1)\n AND p.enabled = true\n AND p.available = true\n `;\n return this.db.systemQueryOne<ProviderWithCredential>(query, [name]);\n }\n\n async getById(id: string): Promise<ProviderWithCredential | null> {\n const query = `\n SELECT p.*,\n ac.encrypted_value,\n ac.initialization_vector\n FROM providers p\n LEFT JOIN api_credentials ac ON p.api_credential_id = ac.id\n WHERE p.id = $1\n AND p.active = true\n `;\n return this.db.systemQueryOne<ProviderWithCredential>(query, [id]);\n }\n\n async listActiveByOrgId(orgId: string): Promise<Pick<Provider, 'id' | 'plugin_id'>[]> {\n return this.db.systemQuery<Pick<Provider, 'id' | 'plugin_id'>>(\n `SELECT p.id, p.plugin_id\n FROM providers p\n WHERE p.organization_id = $1\n AND p.active = true`,\n [orgId]\n );\n }\n\n async findByPluginId(pluginId: string): Promise<ProviderWithCredential[]> {\n return this.db.systemQuery(`\n SELECT p.*,\n ac.encrypted_value,\n ac.initialization_vector\n FROM providers p\n LEFT JOIN api_credentials ac ON p.api_credential_id = ac.id\n WHERE p.plugin_id = $1\n AND p.active = true\n `, [pluginId])\n }\n\n async migrateToLatestPlugin(family: string, latestPluginId: string): Promise<number> {\n const result = await this.db.systemQuery(\n `UPDATE providers p\n SET plugin_id = $2,\n updated_at = now()\n FROM plugins pl\n WHERE p.plugin_id = pl.id\n AND pl.family = $1\n AND pl.version != 'latest'\n AND p.active = true`,\n [family.toUpperCase(), latestPluginId]\n );\n return (result as any).length ?? 0;\n }\n\n async listPaginated(filters: {\n org_id?: string; enabled?: boolean; search?: string;\n }, limit: number, offset: number, sortBy: string, sortDir: string): Promise<{ rows: Provider[]; total: number }> {\n const conditions: string[] = ['p.active = true'];\n const params: any[] = [];\n let idx = 1;\n\n if (filters.org_id) {\n conditions.push(`p.organization_id = $${idx++}`);\n params.push(filters.org_id);\n }\n if (filters.enabled !== undefined) {\n conditions.push(`p.enabled = $${idx++}`);\n params.push(filters.enabled);\n }\n if (filters.search) {\n conditions.push(`p.name ILIKE $${idx++}`);\n params.push(`%${filters.search}%`);\n }\n\n const where = conditions.join(' AND ');\n const allowedSorts = new Set(['name', 'created_at', 'updated_at', 'type']);\n const col = allowedSorts.has(sortBy) ? sortBy : 'created_at';\n const dir = sortDir === 'asc' ? 'ASC' : 'DESC';\n\n const limitIdx = idx++;\n const offsetIdx = idx++;\n return this.db.asSystem(async (client) => {\n const [rowsResult, countResult] = await Promise.all([\n client.query(\n `SELECT p.*\n FROM providers p\n WHERE ${where}\n ORDER BY p.${col} ${dir}\n LIMIT $${limitIdx} OFFSET $${offsetIdx}`,\n [...params, limit, offset]\n ),\n client.query(\n `SELECT COUNT(*)::text as count\n FROM providers p\n WHERE ${where}`, params\n ),\n ]);\n return {\n rows: rowsResult.rows as Provider[],\n total: parseInt(countResult.rows[0]?.count ?? '0'),\n };\n });\n }\n\n async create(provider: Omit<Provider, 'id' | 'created_at' | 'updated_at'>): Promise<Provider | null> {\n return this.db.systemQueryOne<Provider>(\n `INSERT INTO providers (organization_id, name, type, description, config, api_credential_id, plugin_id,\n pricing_plan_id, enabled, available, deleted, active)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\n RETURNING *`,\n [provider.organization_id, provider.name, provider.type, provider.description ?? null,\n JSON.stringify(provider.config), provider.api_credential_id ?? null, provider.plugin_id,\n provider.pricing_plan_id ?? null, provider.enabled, provider.available, provider.deleted, provider.active]\n );\n }\n\n async update(id: string, fields: Partial<Provider>): Promise<Provider | null> {\n const sets: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n const updatable: (keyof Provider)[] = ['name', 'type', 'description', 'enabled', 'available', 'plugin_id', 'pricing_plan_id', 'api_credential_id'];\n for (const key of updatable) {\n if (fields[key] !== undefined) {\n sets.push(`${key} = $${idx++}`);\n params.push(fields[key]);\n }\n }\n if (fields.config !== undefined) {\n sets.push(`config = $${idx++}`);\n params.push(JSON.stringify(fields.config));\n }\n\n if (sets.length === 0) return this.db.systemQueryOne<Provider>(`SELECT *\n FROM providers\n WHERE id = $1`, [id]);\n\n sets.push(`updated_at = now()`);\n params.push(id);\n return this.db.systemQueryOne<Provider>(\n `UPDATE providers\n SET ${sets.join(', ')}\n WHERE id = $${idx} AND active = true RETURNING *`, params\n );\n }\n\n async softDelete(id: string): Promise<boolean> {\n const result = await this.db.systemQueryOne<Provider>(\n `UPDATE providers\n SET active = false,\n deleted = true,\n updated_at = now()\n WHERE id = $1\n RETURNING id`, [id]\n );\n return result !== null;\n }\n\n async findByPluginFamily(family: string, excludePluginId?: string): Promise<ProviderWithCredential[]> {\n if (excludePluginId) {\n return this.db.systemQuery(`\n SELECT p.*, ac.encrypted_value, ac.initialization_vector\n FROM providers p\n LEFT JOIN api_credentials ac ON p.api_credential_id = ac.id\n JOIN plugins pl ON p.plugin_id = pl.id\n WHERE pl.family = $1\n AND p.plugin_id != $2\n AND p.active = true\n `, [family.toUpperCase(), excludePluginId]);\n }\n return this.db.systemQuery(`\n SELECT p.*, ac.encrypted_value, ac.initialization_vector\n FROM providers p\n LEFT JOIN api_credentials ac ON p.api_credential_id = ac.id\n JOIN plugins pl ON p.plugin_id = pl.id\n WHERE pl.family = $1\n AND p.active = true\n `, [family.toUpperCase()]);\n }\n}\n","import type {JSONSchema7} from 'json-schema';\nimport type {HoloLogger} from \"../logger\";\nimport type {\n DiscoveredModel,\n IProvider,\n IProviderTranslator,\n IWireAdapter,\n ProviderCapabilities,\n WireAdapterParams\n} from \"../provider\";\nimport type {RouteDefinition, RouteHandler} from \"../routing\";\nimport type {INotificationService} from \"../notification\";\nimport type {CostResult, PricingSheetModel, ProtocolCapability} from \"../entities\";\nimport {type Plugin} from \"../entities\";\nimport type {HoloWorkerRequest} from \"../worker\";\n\nexport const PluginType = {\n PROVIDER: 'PROVIDER',\n DATASTORE: 'DATASTORE',\n} as const;\n\nexport type PluginType = typeof PluginType[keyof typeof PluginType];\n\nexport const PluginState = {\n UNINITIALIZED: 'UNINITIALIZED',\n INITIALIZING: 'INITIALIZING',\n READY: 'READY',\n ERROR: 'ERROR',\n DESTROYING: 'DESTROYING',\n DESTROYED: 'DESTROYED',\n} as const;\n\nexport type PluginState = typeof PluginState[keyof typeof PluginState];\n\nexport const PluginErrorCode = {\n INITIALIZATION_FAILED: 'PLUGIN_INIT_FAILED',\n DESTRUCTION_FAILED: 'PLUGIN_DESTROY_FAILED',\n INVALID_STATE: 'PLUGIN_INVALID_STATE',\n} as const;\n\nexport type PluginErrorCode = typeof PluginErrorCode[keyof typeof PluginErrorCode];\n\nexport interface PluginManifest {\n name: string;\n version: string;\n pluginType: PluginType;\n family?: string;\n displayName?: string;\n description?: string;\n}\n\nexport interface PluginContext {\n logger: HoloLogger;\n loggerFactory?: (pluginName: string) => HoloLogger;\n config?: unknown;\n env?: Record<string, string | undefined>;\n notifications?: INotificationService;\n}\n\nexport interface PluginSchema {\n connection: JSONSchema7 & { encrypted?: string[] };\n parameters?: JSONSchema7;\n defaultMapping?: AuditFieldMapping;\n}\n\nexport interface IPlugin {\n readonly manifest: PluginManifest;\n readonly name: string;\n readonly state: PluginState;\n readonly family: string;\n readonly type: PluginType;\n readonly version: string;\n\n initialize(context: PluginContext): Promise<void>;\n\n destroy(): Promise<void>;\n\n getState(): PluginState;\n\n getSchema?(): PluginSchema;\n}\n\nexport interface IPluginRegistry<T extends IPlugin> {\n registerPlugin(serverName: string, plugin: T, isLatest?: boolean): Promise<void>;\n\n unregisterPlugin(serverName: string, id: string, version?: string): Promise<void>;\n\n getPlugins(filter?: (plugin: Plugin) => boolean): Promise<Plugin[]>\n\n getImpls(filter?: (plugin: Plugin) => boolean): Promise<T[]>\n}\n\nexport interface PluginPricingModel {\n model_name: string;\n input_cost: number;\n output_cost: number;\n cache_read_cost?: number;\n cache_write_cost?: number;\n batch_input_cost?: number;\n batch_output_cost?: number;\n context_threshold?: number;\n extended_input_cost?: number;\n extended_output_cost?: number;\n token_costs?: Record<string, number>;\n}\n\nexport interface PluginPricingSheet {\n name: string;\n version: string;\n effective_from: string;\n effective_to?: string;\n models: PluginPricingModel[];\n}\n\nexport interface PricingSnapshot {\n name: string;\n version: string;\n effective_from: string;\n models: PluginPricingModel[];\n}\n\nexport interface PricingModelId {\n model_id: string;\n family: string;\n kind: string;\n release_date: string;\n shutdown_date: string | null;\n pricing_snapshot: string | null;\n aliases?: string[];\n}\n\nexport interface PricingDataset {\n name: string;\n version: string;\n pricing_snapshots: PricingSnapshot[];\n model_ids: PricingModelId[];\n}\n\nexport interface IProviderPlugin<TProvider = IProvider> extends IPlugin {\n translator: IProviderTranslator;\n defaultRouteHandler?: RouteHandler;\n protocols: Record<string, string>;\n defaultProtocol: string;\n\n createProvider(id: string, name: string, config: any): Promise<TProvider>;\n\n getCapabilities(): ProviderCapabilities;\n\n getRoutes(): RouteDefinition[];\n\n createWireAdapter(params: WireAdapterParams): Promise<IWireAdapter>;\n\n getDefaultPricing?(): PluginPricingSheet;\n\n getPricingSheets?(): Map<string, PluginPricingSheet>;\n\n getPricingModelIds?(): PricingModelId[];\n\n calculateCost(tokens: Record<string, number>, pricing: PricingSheetModel): CostResult;\n\n getProtocolByCapability(capability: ProtocolCapability): string | undefined;\n\n getModelNameFromRequest(payload: any, protocolName?: string): string | undefined;\n\n /**\n * Render canonical {@link DiscoveredModel}s as the wire-native shape this\n * plugin's `/v1/models` endpoint would normally return. Used by the\n * list-models route handlers to emit a wire-correct response when the\n * underlying app's models live on a different provider family.\n */\n formatModelsResponse(models: DiscoveredModel[]): unknown;\n\n getTestModels?(): { chat?: string; embed?: string };\n}\n\n// --- Datastore Plugin Types ---\n\nexport interface IDatastorePlugin extends IPlugin {\n getDefaultMapping(): AuditFieldMapping;\n\n createInstance(config: Record<string, any>): Promise<IDatastoreInstance>;\n}\n\nexport interface IDatastoreInstance {\n connect(): Promise<void>;\n\n disconnect(): Promise<void>;\n\n isConnected(): boolean;\n\n write(table: string, record: Record<string, any>): Promise<{ id?: string }>;\n\n updateResponseCost?(responseTable: string, responseId: string, cost: number): Promise<void>;\n\n testConnection(): Promise<{ ok: boolean; error?: string }>;\n}\n\nexport interface AuditFieldMapping {\n request?: { table: string; fields: Record<string, string> };\n response?: { table: string; fields: Record<string, string> };\n cost?: { table: string; fields: Record<string, string> };\n}\n\nexport interface NormalizedAuditData {\n request?: Record<string, any>;\n response?: Record<string, any>;\n cost?: Record<string, any>;\n _raw: HoloWorkerRequest;\n}\n","export * from './types';\n","export {PluginErrorCode} from '@holokai/holo-types/plugin';\n\nexport class PluginError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly plugin?: string,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'PluginError';\n }\n}\n","/** Plain text content block. */\nexport interface HoloContentText {\n type: 'text';\n text: string;\n}\n\n/**\n * Image content block, provided as a URL or inline base64 data.\n * @see {@link HoloContentFile} for non-image file attachments.\n */\nexport interface HoloContentImage {\n type: 'image';\n url?: string;\n data?: string;\n /** Whether the image is referenced by `'url'` or embedded as `'base64'`. */\n source_type?: 'url' | 'base64';\n /** Canonical MIME type. Producers normalize variants (`image/jpg` → `image/jpeg`, mixed case → lower) via `normalizeImageMime` from `@holokai/holo-sdk`. */\n mime?: string;\n alt_text?: string;\n}\n\n/**\n * Model reasoning / chain-of-thought content block.\n * @remarks Some providers return an opaque {@link signature} that must be echoed back in multi-turn conversations to maintain reasoning continuity.\n */\nexport interface HoloContentReasoning {\n type: 'reasoning';\n text?: string;\n summary?: string;\n /** Opaque token from the provider — echo it back in follow-up requests to maintain reasoning context. */\n signature?: string;\n}\n\n/**\n * Function-tool invocation emitted by the model.\n * @see {@link HoloContentToolResult} for the corresponding result block.\n */\nexport interface HoloContentFunctionToolCall {\n type: 'tool_call';\n /** Tool kind discriminator. Defaults to `'function'` when absent. */\n kind?: 'function';\n id?: string;\n name: string;\n arguments: Record<string, unknown>;\n /** The raw JSON string before parsing, useful when the model emits malformed JSON. */\n raw_arguments?: string;\n}\n\n/**\n * Custom-tool invocation emitted by the model (free-form text or grammar-constrained input).\n * @see {@link HoloContentToolResult} for the corresponding result block.\n */\nexport interface HoloContentCustomToolCall {\n type: 'tool_call';\n kind: 'custom';\n id?: string;\n name: string;\n /** Free-form text input emitted by the model for this custom tool. */\n input: string;\n}\n\n/**\n * Discriminated union of tool invocations emitted by the model.\n *\n * - default (`kind` absent or `'function'`) — JSON-argument function tool\n * - `'custom'` — free-form text input\n */\nexport type HoloContentToolCall = HoloContentFunctionToolCall | HoloContentCustomToolCall;\n\n/**\n * Result of a tool invocation, sent back to the model.\n * @see {@link HoloContentToolCall} for the originating call.\n */\nexport interface HoloContentToolResult {\n type: 'tool_result';\n tool_call_id: string;\n content: string | HoloContent[];\n is_error?: boolean;\n}\n\n/** Structured JSON content block, optionally associated with a named schema. */\nexport interface HoloContentJson {\n type: 'json';\n data: unknown;\n schema_name?: string;\n}\n\n/**\n * File attachment content block (non-image).\n * @see {@link HoloContentImage} for image-specific content.\n */\nexport interface HoloContentFile {\n type: 'file';\n url?: string;\n data?: string;\n mime?: string;\n filename?: string;\n}\n\n/**\n * Model refusal content block. Distinguished from plain text so downstream clients\n * and policy / audit rules can tell \"model refused\" apart from \"model produced text\".\n *\n * Currently emitted by OpenAI ChatCompletions; cross-provider routing emits text only\n * (other providers have no native refusal type).\n */\nexport interface HoloContentRefusal {\n type: 'refusal';\n text: string;\n}\n\n/**\n * Opaque provider-specific content block that has no first-class Holo representation.\n *\n * Used to losslessly round-trip blocks from one provider through Holo back to the same provider\n * (e.g., Claude `redacted_thinking`, `server_tool_use`, `web_search_tool_result`,\n * `code_execution_tool_result`, `container_upload`). When a block of this type is emitted to a\n * different provider, that provider's translator skips it.\n */\nexport interface HoloContentProviderExtension {\n type: 'provider_extension';\n /** Provider family that owns this block (e.g., `'claude'`, `'openai'`). */\n provider: string;\n /** Native block type discriminator (e.g., `'redacted_thinking'`, `'server_tool_use'`). */\n extension_type: string;\n /** Original block payload, sans the `type` field. */\n data: unknown;\n}\n\n/**\n * Discriminated union of all content block types.\n *\n * - `text` — plain text\n * - `image` — image URL or base64\n * - `reasoning` — model chain-of-thought\n * - `refusal` — typed refusal text (OpenAI; falls back to plain text on other providers)\n * - `tool_call` — tool invocation from the model\n * - `tool_result` — tool execution result sent back to the model\n * - `json` — structured JSON data\n * - `file` — non-image file attachment\n * - `provider_extension` — opaque provider-specific block, round-tripped only when the\n * destination provider matches the originating provider\n */\nexport type HoloContent =\n | HoloContentText\n | HoloContentImage\n | HoloContentReasoning\n | HoloContentRefusal\n | HoloContentToolCall\n | HoloContentToolResult\n | HoloContentJson\n | HoloContentFile\n | HoloContentProviderExtension;\n","import {type HoloContent} from \"./content\";\nimport {type HoloToolCall} from \"./tools\";\n\n/** A tool call that the model attempted but could not parse correctly. */\nexport interface HoloInvalidToolCall {\n id?: string;\n name?: string;\n /** The raw JSON string that failed to parse. */\n raw_arguments?: string;\n error: string;\n}\n\n/**\n * A single message in a conversation.\n * @see {@link HoloContent} for the typed content blocks that can appear in `content`.\n */\nexport interface HoloMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | HoloContent[];\n /** Convenience projection extracted from assistant content blocks. Content blocks (`HoloContent[]`) are the canonical ordered representation. */\n tool_calls?: HoloToolCall[];\n invalid_tool_calls?: HoloInvalidToolCall[];\n /** The ID of the tool call this message is responding to (when `role` is `'tool'`). */\n tool_call_id?: string;\n name?: string;\n metadata?: Record<string, unknown>;\n /** Opaque provider-specific metadata passed through without transformation. */\n provider_metadata?: Record<string, unknown>;\n}\n","import {type HoloMessage} from \"./messages\";\nimport {type HoloTool, type HoloToolChoice} from \"./tools\";\nimport {type HoloResponseFormat} from \"./responses\";\n\n/** Optional metadata attached to a request, forwarded to audit records. */\nexport interface HoloRequestMetadata {\n /** External user identifier for audit attribution. */\n user_id?: string | null;\n}\n\n/** Cache-control marker. Mirrors Anthropic's `CacheControlEphemeral`; other providers ignore it. */\nexport interface HoloCacheControl {\n type: 'ephemeral';\n}\n\n/** Structured system-prompt block. Used when a single string can't capture per-block cache markers or ordering. */\nexport interface HoloSystemBlock {\n type: 'text';\n text: string;\n cache_control?: HoloCacheControl;\n}\n\n/** System prompt: either a plain string, or a structured block array (preserves cache_control / ordering for Claude). */\nexport type HoloSystem = string | HoloSystemBlock[];\n\n/**\n * The normalized request sent to all Holo providers.\n *\n * @example\n * ```ts\n * const request: HoloRequest = {\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello' }],\n * temperature: 0.7,\n * };\n * ```\n *\n * @see {@link HoloResponse} for the corresponding output type.\n * @see {@link HoloRequestBuilder} for a fluent API to construct requests.\n */\nexport interface HoloRequest {\n model: string;\n messages?: HoloMessage[];\n temperature?: number;\n top_p?: number;\n stream?: boolean;\n tools?: HoloTool[];\n system?: HoloSystem;\n max_tokens?: number;\n stop_sequences?: string[];\n response_format?: HoloResponseFormat;\n service_tier?: 'auto' | 'default' | 'standard_only';\n /** Whether the model may emit multiple tool calls in one turn. Defaults to provider-specific. */\n parallel_tool_calls?: boolean;\n tool_choice?: HoloToolChoice;\n top_k?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n seed?: number;\n metadata?: HoloRequestMetadata | null;\n /** Route to a specific provider by name or UUID. */\n provider?: string;\n /** Conversation thread ID for multi-turn tracking. */\n thread_id?: string;\n /** Branch within a thread for A/B or parallel conversations. */\n branch?: string;\n /** Application slug — selects the system prompt, guards, and default model. */\n application?: string;\n /** Target a specific protocol by name (e.g. 'openai.chatCompletions'). */\n protocol?: string;\n}\n","import {type HoloMessage} from \"./messages\";\n\n/** Constrains the model to output JSON conforming to a provided JSON Schema. */\nexport interface HoloResponseFormatJsonSchema {\n type: 'json_schema';\n schema: Record<string, unknown>;\n strict?: boolean;\n}\n\n/** Constrains the model to output valid JSON (no schema enforcement). */\nexport interface HoloResponseFormatJsonObject {\n type: 'json_object';\n}\n\n/** Default response format — unconstrained text. */\nexport interface HoloResponseFormatText {\n type: 'text';\n}\n\n/**\n * Discriminated union controlling the model's output format.\n *\n * - `text` — unconstrained text (default)\n * - `json_object` — valid JSON, no schema\n * - `json_schema` — JSON conforming to the supplied schema\n */\nexport type HoloResponseFormat =\n | HoloResponseFormatText\n | HoloResponseFormatJsonObject\n | HoloResponseFormatJsonSchema;\n\n/** Token usage and timing information for a request. */\nexport interface HoloUsage {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n /** Tokens read from the provider's prompt cache (reduces input cost). */\n cache_read_tokens?: number;\n /** Tokens written to the provider's prompt cache (one-time write cost). */\n cache_write_tokens?: number;\n service_tier?: 'standard' | 'priority' | 'batch' | 'auto' | 'default' | 'flex' | 'scale';\n /** Provider-reported timing breakdown (primarily used by Ollama). */\n timings?: {\n total?: number;\n load?: number;\n prompt_eval?: number;\n eval?: number;\n };\n}\n\n/**\n * Reason the model stopped generating.\n *\n * - `'stop'` — natural end of response\n * - `'length'` — hit `max_tokens` limit\n * - `'tool_calls'` — model invoked one or more tools\n * - `'content_filter'` — blocked by provider safety filter\n * - `'function_call'` — legacy function-call stop (OpenAI)\n * - `'error'` — generation failed\n * - `null` — reason not reported\n */\nexport type HoloFinishReason =\n | 'stop'\n | 'length'\n | 'tool_calls'\n | 'content_filter'\n | 'function_call'\n | 'error'\n | null;\n\n/**\n * The normalized response returned by all Holo providers.\n * @see {@link HoloRequest} for the corresponding input type.\n */\nexport interface HoloResponse {\n id?: string;\n model: string;\n /** One or more output messages. Most responses contain a single assistant message. */\n output: HoloMessage[];\n created?: number | Date;\n finish_reason?: HoloFinishReason;\n service_tier?: string;\n usage?: HoloUsage;\n metadata?: Record<string, unknown>;\n /** Opaque provider-specific metadata passed through without transformation. */\n provider_metadata?: Record<string, unknown>;\n /** Originating wire protocol — used by translators that emit multiple wire shapes (e.g. OpenAI ChatCompletions vs Responses). */\n protocol?: string;\n}\n\n/** @internal Legacy streaming type — use HoloStreamEvent for new code. */\nexport type HoloStreamingDeltaType =\n | 'message_start'\n | 'content_delta'\n | 'reasoning_delta'\n | 'tool_arg_delta'\n | 'message_delta'\n | 'message_stop';\n\n/** @internal Legacy streaming type — use HoloStreamEvent for new code. */\nexport interface HoloStreamingDelta {\n provider: string;\n type: HoloStreamingDeltaType;\n index?: number;\n choice?: number;\n delta: Partial<HoloMessage>;\n usage?: HoloUsage | null;\n provider_delta?: any;\n}\n\n/** @internal Legacy streaming type — use HoloStreamEvent for new code. */\nexport interface HoloStreamChunk {\n id?: string;\n model?: string;\n created?: number;\n delta?: HoloStreamingDelta;\n done?: boolean;\n finish_reason?: HoloFinishReason;\n usage?: HoloUsage;\n}\n\n/**\n * Discriminated event types emitted during streaming.\n *\n * Lifecycle: `response.created` → `response.message.start` → content deltas → `response.message.stop` → `response.completed` (or `response.failed`).\n */\nexport type HoloStreamEventType =\n | 'response.created'\n | 'response.message.start'\n | 'response.content_block.start'\n | 'response.output_text.delta'\n | 'response.reasoning.delta'\n | 'response.tool_call.delta'\n | 'response.content_block.delta'\n | 'response.content_block.stop'\n | 'response.message.stop'\n | 'response.usage'\n | 'response.completed'\n | 'response.failed';\n\n/**\n * A single event in a streaming response.\n * @see {@link HoloStreamEventType} for the event lifecycle.\n * @see {@link HoloStream} for the streaming interface that yields these events.\n */\nexport interface HoloStreamEvent {\n type: HoloStreamEventType;\n index?: number;\n /** Text or reasoning delta payload (for `output_text.delta` and `reasoning.delta` events). */\n delta?: string;\n /** Incremental tool call data (for `tool_call.delta` events). */\n tool_call_delta?: { id?: string; name?: string; arguments_delta?: string };\n /** The complete response, present on `response.created` and `response.completed`. */\n response?: HoloResponse;\n usage?: HoloUsage;\n finish_reason?: HoloFinishReason;\n error?: { message: string; code?: string };\n}\n\n/** Model metadata returned by the models API. */\nexport interface HoloModelInfo {\n id: string;\n name: string;\n provider_family: string;\n context_length?: number;\n capabilities: string[];\n modality?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n supported_parameters?: string[];\n metadata?: Record<string, any>;\n}\n\n/** Application metadata returned by the applications API. */\nexport interface HoloApplicationInfo {\n slug: string;\n name: string;\n provider_family: string;\n default_model?: string;\n has_system_prompt: boolean;\n has_guards: boolean;\n}\n","/**\n * Function-tool definition exposed to the model.\n * @see {@link HoloCustomTool} for custom-format tools.\n */\nexport interface HoloFunctionTool {\n /** Tool kind discriminator. Defaults to `'function'` when absent. */\n type?: 'function';\n name: string;\n description?: string;\n /** JSON Schema describing the tool's input parameters. */\n parameters?: Record<string, unknown>;\n}\n\n/**\n * Custom-format tool definition (free-form text or grammar input).\n * @remarks Currently surfaced by OpenAI ChatCompletions; other providers drop the variant on emit.\n */\nexport interface HoloCustomTool {\n type: 'custom';\n name: string;\n description?: string;\n /** Input format the model is constrained to produce. Defaults to unconstrained text. */\n format?: HoloCustomToolFormat;\n}\n\n/** Input format for a custom tool. `text` is unconstrained free-form; `grammar` constrains output to a Lark or regex grammar. Mirrors OpenAI's wire shape so it can pass through unchanged. */\nexport type HoloCustomToolFormat =\n | { type: 'text' }\n | { type: 'grammar'; grammar: { definition: string; syntax: 'lark' | 'regex' } };\n\n/**\n * Discriminated union of tool definitions exposed to the model.\n *\n * - `'function'` (default) — JSON-schema constrained tool\n * - `'custom'` — free-form text or grammar-constrained tool\n */\nexport type HoloTool = HoloFunctionTool | HoloCustomTool;\n\n/**\n * Controls how the model selects tools.\n *\n * - `auto` — model decides whether to call a tool\n * - `none` — tool use disabled\n * - `required` — model must call at least one tool\n * - `specific` — model must call one of the tools identified by `name`. A\n * string array constrains the model to a subset; only Gemini natively\n * supports the multi-name form (`allowedFunctionNames`). Other providers\n * forward only the first name and document the loss.\n */\nexport type HoloToolChoice =\n | { type: 'auto' }\n | { type: 'none' }\n | { type: 'required' }\n | { type: 'specific'; name: string | string[] };\n\n/** A function call extracted from a model response. */\nexport interface HoloToolFunctionCall {\n /** Function name. Omitted on streaming continuation fragments — the name arrived in a prior shell chunk. */\n name?: string;\n arguments: Record<string, unknown>;\n /** Raw JSON string of arguments — populated for streaming partial fragments and as a lossless echo of malformed payloads. */\n raw_arguments?: string;\n}\n\n/** A custom-tool invocation extracted from a model response. */\nexport interface HoloToolCustomCall {\n name: string;\n /** Free-form text input emitted by the model for this custom tool. */\n input: string;\n}\n\n/**\n * Function-tool invocation in {@link HoloMessage.tool_calls}.\n * @see {@link HoloContentToolCall} for the content-block representation.\n */\nexport interface HoloFunctionToolCall {\n id?: string;\n type: 'function';\n function: HoloToolFunctionCall;\n}\n\n/**\n * Custom-tool invocation in {@link HoloMessage.tool_calls}.\n * @see {@link HoloContentToolCall} for the content-block representation.\n */\nexport interface HoloCustomToolCall {\n id?: string;\n type: 'custom';\n custom: HoloToolCustomCall;\n}\n\n/**\n * Discriminated union of tool invocations in {@link HoloMessage.tool_calls}.\n * @see {@link HoloContentToolCall} for the content-block representation.\n */\nexport type HoloToolCall = HoloFunctionToolCall | HoloCustomToolCall;\n","export const HoloErrorCode = {\n UNAUTHORIZED: 'unauthorized',\n FORBIDDEN: 'forbidden',\n VALIDATION_ERROR: 'validation_error',\n NOT_FOUND: 'not_found',\n GUARD_FAILURE: 'guard_failure',\n INTERNAL_ERROR: 'internal_error',\n NOT_IMPLEMENTED: 'not_implemented',\n TIMEOUT: 'timeout',\n} as const;\n\nexport type HoloErrorCode = typeof HoloErrorCode[keyof typeof HoloErrorCode];\n","export type HoloThreadStatus = 'active' | 'archived' | 'deleted';\nexport type HoloThreadType = 'personal' | 'project';\n\nexport interface HoloThread {\n id: string;\n title: string;\n description: string;\n type: HoloThreadType;\n status: HoloThreadStatus;\n project_id: string | null;\n metadata?: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface HoloThreadMessage {\n id: string;\n request_id: string;\n thread_id: string;\n branch_id: string | null;\n model: string | null;\n provider: string | null;\n role: string;\n user_prompt: string | null;\n response: string | null;\n status: string | null;\n input_tokens: number | null;\n output_tokens: number | null;\n cost: number | null;\n created_at: string;\n}\n\nexport interface HoloThreadCreateParams {\n title: string;\n description?: string;\n type?: HoloThreadType;\n project_id?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface HoloThreadUpdateParams {\n title?: string;\n status?: HoloThreadStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport interface HoloThreadListParams {\n type?: HoloThreadType;\n project_id?: string;\n page?: number;\n size?: number;\n}\n\nexport interface HoloThreadMessageListParams {\n page?: number;\n size?: number;\n}\n\nexport interface HoloPagedResponse<T> {\n data: T[];\n page: number;\n size: number;\n total: number;\n}\n","export interface HoloGenerateParams {\n model: string;\n prompt: string;\n stream?: boolean;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop_sequences?: string[];\n protocol?: string;\n provider?: string;\n application?: string;\n}\n","export interface HoloEmbedParams {\n model: string;\n input: string | string[];\n protocol?: string;\n provider?: string;\n application?: string;\n}\n\nexport interface HoloEmbedResponse {\n model: string;\n embeddings: number[][];\n usage?: { input_tokens?: number; total_tokens?: number };\n}\n","import {type HoloMessage} from './messages';\n\nexport interface HoloCountTokensParams {\n model: string;\n messages: HoloMessage[];\n protocol?: string;\n provider?: string;\n}\n\nexport interface HoloCountTokensResponse {\n input_tokens: number;\n}\n","export interface HoloModelListParams {\n family?: string;\n capability?: string;\n input_modality?: string;\n}\n","export * from './content';\nexport * from './messages';\nexport * from './requests';\nexport * from './responses';\nexport * from './tools';\nexport * from './errors';\nexport * from './threads';\nexport * from './generate';\nexport * from './embed';\nexport * from './metrics';\nexport * from './models';\n","import {HoloErrorCode} from '@holokai/holo-types/holo';\n\nexport class HoloError extends Error {\n constructor(\n public readonly statusCode: number,\n message: string,\n public readonly code: HoloErrorCode = HoloErrorCode.INTERNAL_ERROR\n ) {\n super(message);\n this.name = 'HoloError';\n }\n\n static notFound(resource: string): HoloError {\n return new HoloError(404, `${resource} not found`, HoloErrorCode.NOT_FOUND);\n }\n\n static badRequest(message: string): HoloError {\n return new HoloError(400, message, HoloErrorCode.VALIDATION_ERROR);\n }\n\n static unauthorized(message = 'Unauthorized'): HoloError {\n return new HoloError(401, message, HoloErrorCode.UNAUTHORIZED);\n }\n\n static forbidden(message = 'Forbidden'): HoloError {\n return new HoloError(403, message, HoloErrorCode.FORBIDDEN);\n }\n\n static notImplemented(message = 'Not Implemented'): HoloError {\n return new HoloError(501, message, HoloErrorCode.NOT_IMPLEMENTED);\n }\n}\n","import type {HoloLogger, HoloLogLevel} from '@holokai/holo-types/logger';\nimport {container, type InjectionToken} from \"tsyringe\";\nimport {Transform} from \"node:stream\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Constructor<T = {}> = new (...args: any[]) => T;\n\nexport type HoloLoggerFactory = (cls: Function | string) => HoloLogger;\n\n// ---------------------------------------------------------------------------\n// Log-level guard\n// ---------------------------------------------------------------------------\n\nexport function isHoloLogLevel(value: unknown): value is HoloLogLevel {\n return (\n value === 'fatal' ||\n value === 'error' ||\n value === 'warn' ||\n value === 'info' ||\n value === 'verbose' ||\n value === 'debug' ||\n value === 'trace' ||\n value === 'silent'\n );\n}\n\n// ---------------------------------------------------------------------------\n// Logger error\n// ---------------------------------------------------------------------------\n\nexport class HoloLoggerError extends Error {\n constructor(\n message: string\n ) {\n super(message);\n this.name = 'LoggerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory token + accessor\n// ---------------------------------------------------------------------------\n\nexport const LoggerFactoryToken: InjectionToken<(cls: Function | string) => HoloLogger> = 'LoggerFactory';\n\nlet cachedFactory: HoloLoggerFactory | undefined;\n\nexport function getLoggerFactory(): HoloLoggerFactory {\n if (!cachedFactory) {\n if (container.isRegistered(LoggerFactoryToken, true)) {\n cachedFactory = container.resolve<HoloLoggerFactory>(LoggerFactoryToken);\n } else {\n throw new HoloLoggerError(\"No HoloLogger Factory Defined\");\n }\n }\n return cachedFactory;\n}\n\n// ---------------------------------------------------------------------------\n// ClassLogger base class\n// ---------------------------------------------------------------------------\n\nexport abstract class ClassLogger {\n protected __className?: string;\n\n private _log?: HoloLogger;\n\n protected get log(): HoloLogger {\n this.__className = this.__className ?? this.constructor?.name;\n return (this._log ??= getLoggerFactory()(this.__className));\n }\n\n protected mlog(methodName: Function | string): HoloLogger {\n return this.log.child({methodName: (methodName as Function).name ?? methodName});\n }\n}\n\n// ---------------------------------------------------------------------------\n// withClassLogger mixin\n// ---------------------------------------------------------------------------\n\nexport function withClassLogger<TBase extends Constructor>(Base: TBase) {\n return class WithClassLogger extends Base {\n #log?: HoloLogger;\n #className?: string;\n\n get log(): HoloLogger {\n this.#className = this.#className ?? this.constructor?.name;\n return (this.#log ??= getLoggerFactory()(this.#className));\n }\n\n mlog(methodName: Function | string): HoloLogger {\n return this.log.child({methodName: (methodName as Function).name ?? methodName});\n }\n }\n}\n\nexport abstract class ObservableClassLogger extends withClassLogger(Transform) {\n}\n","export class AsyncEventQueue<T> implements AsyncIterable<T> {\n private q: T[] = [];\n private pending: ((v: IteratorResult<T>) => void)[] = [];\n private ended = false;\n private err: any = null;\n\n push(item: T) {\n if (this.ended) return;\n const r = this.pending.shift();\n if (r) r({value: item, done: false});\n else this.q.push(item);\n }\n\n end() {\n this.ended = true;\n while (this.pending.length) this.pending.shift()!({value: undefined as any, done: true});\n }\n\n fail(e: any) {\n this.err = e;\n this.end();\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: () => {\n if (this.err) return Promise.reject(this.err);\n if (this.q.length) return Promise.resolve({value: this.q.shift()!, done: false});\n if (this.ended) return Promise.resolve({value: undefined as any, done: true});\n return new Promise<IteratorResult<T>>(resolve => this.pending.push(resolve));\n },\n };\n }\n}\n","export async function* toAsyncIter<T>(items: Iterable<T>): AsyncIterable<T> {\n for (const item of items) yield item;\n}\n\nexport async function collectAsync<T>(source: AsyncIterable<T>): Promise<T[]> {\n const out: T[] = [];\n for await (const x of source) out.push(x);\n return out;\n}\n","export function sanitizeObject(obj: Record<string, any>) {\n return Object.entries(obj).reduce((acc, [key, value]) => {\n // Exclude null, undefined, and empty strings to use provider SDK defaults\n if (value != null && value !== '') {\n acc[key] = value;\n }\n return acc;\n }, {} as Record<string, any>);\n}","type AnyRecord = Record<string, unknown>;\n\nexport function pickDefined<T extends object>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const typedKey = key as keyof T;\n const value = obj[typedKey];\n if (value !== undefined) {\n out[typedKey] = value;\n }\n }\n }\n\n return out;\n}\n\n// export function pickDefined<T extends {}>(obj: T): Partial<T> {\n// return Object.fromEntries(\n// Object.entries(obj).filter(([, v]) => v !== undefined)\n// ) as Partial<T>;\n// }\n\n// usage:\nexport function pickDefinedNonNull<T extends AnyRecord>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key];\n if (value !== undefined && value !== null) {\n out[key] = value;\n }\n }\n }\n\n return out;\n}\n\n// usage: const usage = pick(response, ['input_tokens', 'output_tokens'] as const);\nexport function pick<T extends AnyRecord, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Pick<T, K> {\n const out = {} as Pick<T, K>;\n\n for (const key of keys) {\n if (key in obj) {\n out[key] = obj[key];\n }\n }\n\n return out;\n}\n\n// usage: const safe = omit(payload, ['token', 'apiKey'] as const);\nexport function omit<T extends AnyRecord, K extends keyof T>(\n obj: T,\n keys: readonly K[],\n): Omit<T, K> {\n const out = {...obj};\n const keySet = new Set<keyof T>(keys);\n\n for (const key of Object.keys(out) as Array<keyof T>) {\n if (keySet.has(key)) {\n delete out[key];\n }\n }\n\n return out as Omit<T, K>;\n}\n\nexport function pickBy<T extends AnyRecord>(\n obj: T,\n predicate: <K extends keyof T>(value: T[K], key: K) => boolean,\n): Partial<T> {\n const out: Partial<T> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const typedKey = key as keyof T;\n const value = obj[typedKey];\n if (predicate(value, typedKey)) {\n out[typedKey] = value;\n }\n }\n }\n\n return out;\n}\n\nexport function omitBy<T extends AnyRecord>(\n obj: T,\n predicate: <K extends keyof T>(value: T[K], key: K) => boolean,\n): Partial<T> {\n const out: Partial<T> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const typedKey = key as keyof T;\n const value = obj[typedKey];\n if (!predicate(value, typedKey)) {\n out[typedKey] = value;\n }\n }\n }\n\n return out;\n}","export function setByPath(obj: Record<string, any>, path: string, value: any): Record<string, any> {\n const result = {...obj};\n const keys = path.split('.');\n if (keys.length === 1) {\n result[keys[0]] = value;\n return result;\n }\n let current: any = result;\n for (let i = 0; i < keys.length - 1; i++) {\n current[keys[i]] = current[keys[i]] ? {...current[keys[i]]} : {};\n current = current[keys[i]];\n }\n current[keys[keys.length - 1]] = value;\n return result;\n}\n","export function stringifyAny(err: string | Object): string {\n return typeof err === 'string' ? err : JSON.stringify(err);\n}\n","export const createStableId = (name: string, args: Record<string, unknown>): string => {\n const input = name + JSON.stringify(args, Object.keys(args).sort());\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return `call_${Math.abs(hash).toString(16)}`;\n};\n","export function safeParse(json?: string): Record<string, unknown> {\n if (!json) return {};\n try {\n return JSON.parse(json);\n } catch {\n return {};\n }\n}\n","export function pickHeadersByPrefix(\n headers: Record<string, string | string[] | undefined>,\n prefixes: string[] = [\"anthropic-\"]\n): Record<string, string> {\n if (!headers) return {};\n const lowerPrefixes = prefixes.map(p => p.toLowerCase());\n const out: Record<string, string> = {};\n\n for (const [k, v] of Object.entries(headers)) {\n if (v == null) continue;\n\n const keyLower = k.toLowerCase();\n const matches = lowerPrefixes.some(p => keyLower.startsWith(p));\n if (!matches) continue;\n\n out[k] = Array.isArray(v) ? v.join(\",\") : String(v);\n }\n\n return out;\n}\n\nconst BLOCKED_HEADERS = new Set([\n 'host',\n 'connection',\n 'keep-alive',\n 'transfer-encoding',\n 'upgrade',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n]);\n\nexport function filterForwardableHeaders(\n headers: Record<string, string | string[] | undefined>\n): Record<string, string> {\n const out: Record<string, string> = {};\n\n for (const [k, v] of Object.entries(headers)) {\n if (v == null) continue;\n\n const keyLower = k.toLowerCase();\n\n if (BLOCKED_HEADERS.has(keyLower)) continue;\n if (keyLower.startsWith('proxy-')) continue;\n\n out[k] = Array.isArray(v) ? v.join(\",\") : String(v);\n }\n\n return out;\n}\n","export function uint8ToDataUrl(bytes: Uint8Array, mime = \"image/png\"): string {\n return `data:${mime};base64,${Buffer.from(bytes).toString(\"base64\")}`;\n}\n\nexport function isUint8Array(value: any): value is Uint8Array {\n return value &&\n typeof value === 'object' &&\n typeof value.byteLength === 'number' &&\n typeof value.buffer === 'object' &&\n value.constructor?.name === 'Uint8Array';\n}\n","export const nsToMs = (value: number): number => Math.round(value / 1_000_000);","import {encoding_for_model} from 'tiktoken';\n\nlet encoder: ReturnType<typeof encoding_for_model> | undefined;\n\nfunction getEncoder() {\n if (!encoder) {\n encoder = encoding_for_model('gpt-4o');\n }\n return encoder;\n}\n\nexport function countTokens(text: string): number {\n return getEncoder().encode(text).length;\n}\n","// Auto-generated — do not edit\nexport const VERSION = \"1.5.1\";\n","/**\n * Canonical MIME types for image content. Holo stores `HoloContentImage.mime`\n * in this form so cross-provider routing doesn't introduce variants\n * (`image/jpg` vs `image/jpeg`, lower-vs-mixed case, vendor-prefixed forms).\n */\nconst IMAGE_MIME_ALIASES: Record<string, string> = {\n 'image/jpg': 'image/jpeg',\n 'image/pjpeg': 'image/jpeg',\n 'image/x-jpeg': 'image/jpeg',\n 'image/x-png': 'image/png',\n 'image/x-gif': 'image/gif',\n 'image/x-webp': 'image/webp',\n};\n\n/**\n * Normalize an image MIME type to its canonical form. Returns `undefined` for\n * empty input. Preserves unknown MIME values verbatim — only known aliases\n * are rewritten.\n */\nexport function normalizeImageMime(mime: string | undefined): string | undefined {\n if (!mime) return undefined;\n const lower = mime.trim().toLowerCase();\n return IMAGE_MIME_ALIASES[lower] ?? lower;\n}\n","import type {HoloSystem} from '@holokai/holo-types/holo';\n\n/**\n * Flatten a `HoloSystem` (string or block array) to a single string for providers\n * whose wire format only accepts a flat system prompt. Returns `undefined` when\n * input is undefined; returns an empty string only when the array contains\n * exclusively empty text blocks (caller decides whether to pass that through).\n */\nexport function flattenHoloSystem(system: HoloSystem | undefined): string | undefined {\n if (system === undefined) return undefined;\n if (typeof system === 'string') return system;\n return system.map(block => block.text).filter(Boolean).join('\\n');\n}\n","export * from './errors';\nexport * from './logger';\nexport * from './async-event-queue';\nexport * from './async-iter';\nexport * from './sanitize.object';\nexport * from './pick-defined';\nexport * from './set-by-path';\nexport * from './stringify-any';\nexport * from './stable-id';\nexport * from './safe-parse';\nexport * from './headers';\nexport * from './binary';\nexport * from './time-utils';\nexport * from './tokenizer';\nexport * from './version';\nexport * from './mime';\nexport * from './system';\n","import {type IPlugin, type PluginContext, type PluginManifest, PluginState, PluginType} from \"@holokai/holo-types/plugin\";\nimport {PluginError, PluginErrorCode} from \"./errors\";\nimport {ClassLogger} from \"../core\";\nimport type {CostResult, PricingSheetModel} from \"@holokai/holo-types/entities\";\n\n\nexport abstract class BasePlugin extends ClassLogger implements IPlugin {\n id?: string;\n abstract readonly manifest: PluginManifest;\n\n private _context: PluginContext | undefined;\n protected _state: PluginState = PluginState.UNINITIALIZED;\n\n get state(): PluginState {\n return this._state;\n }\n\n get name(): string {\n return this.manifest.name;\n }\n\n get type(): PluginType {\n return this.manifest.pluginType;\n }\n\n get family(): string {\n return this.manifest.family ?? this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n protected get pluginContext(): PluginContext {\n if (!this._context) {\n throw new PluginError(\n 'Plugin context is not available. Initialize the plugin first.',\n PluginErrorCode.INVALID_STATE,\n this.manifest.name\n );\n }\n return this._context;\n }\n\n getState(): PluginState {\n return this._state;\n }\n\n async initialize(context: PluginContext): Promise<void> {\n const logger = this.mlog(this.initialize);\n if (this._state !== PluginState.UNINITIALIZED) {\n throw new PluginError(\n `Cannot initialize plugin in state ${this._state}`,\n PluginErrorCode.INITIALIZATION_FAILED,\n this.manifest.name\n );\n }\n\n this._state = PluginState.INITIALIZING;\n this._context = context;\n\n try {\n logger.debug('Initializing plugin');\n await this.onInitialize(context);\n this._state = PluginState.READY;\n logger.info('Plugin initialized successfully');\n } catch (error) {\n this._state = PluginState.ERROR;\n logger.error('Plugin initialization failed', {error});\n throw new PluginError(\n 'Failed to initialize plugin',\n PluginErrorCode.INITIALIZATION_FAILED,\n this.manifest.name,\n error\n );\n }\n }\n\n async destroy(): Promise<void> {\n const logger = this.mlog(this.destroy);\n if (this._state === PluginState.DESTROYED) {\n return;\n }\n\n if (this._state === PluginState.UNINITIALIZED) {\n this._state = PluginState.DESTROYED;\n return;\n }\n\n this._state = PluginState.DESTROYING;\n\n try {\n logger.info('Destroying plugin');\n await this.onDestroy();\n this._state = PluginState.DESTROYED;\n this._context = undefined;\n } catch (error) {\n this._state = PluginState.ERROR;\n try {\n logger.error('Plugin destruction failed', {error});\n } catch {\n console.error(`[${this.manifest.name}] Plugin destruction failed`, error);\n }\n throw new PluginError(\n 'Failed to destroy plugin',\n PluginErrorCode.DESTRUCTION_FAILED,\n this.manifest.name,\n error\n );\n }\n }\n\n calculateCost(tokens: Record<string, number>, pricing: PricingSheetModel): CostResult {\n let inputRate = Number(pricing.input_cost);\n let outputRate = Number(pricing.output_cost);\n\n if (pricing.context_threshold && pricing.extended_input_cost && pricing.extended_output_cost) {\n const totalInput = Object.entries(tokens)\n .filter(([k]) => k !== 'output')\n .reduce((sum, [, v]) => sum + v, 0);\n if (totalInput > pricing.context_threshold) {\n inputRate = Number(pricing.extended_input_cost);\n outputRate = Number(pricing.extended_output_cost);\n }\n }\n\n const inputCost = (tokens.input ?? 0) * inputRate;\n const outputCost = (tokens.output ?? 0) * outputRate;\n const extraCosts = this.calculateExtraCosts(tokens, pricing);\n\n return {\n input_cost: inputCost,\n output_cost: outputCost,\n total_cost: inputCost + outputCost + extraCosts.total,\n detail: {\n input: {tokens: tokens.input ?? 0, cost: inputCost},\n output: {tokens: tokens.output ?? 0, cost: outputCost},\n ...extraCosts.detail,\n }\n };\n }\n\n protected abstract calculateExtraCosts(\n tokens: Record<string, number>,\n pricing: PricingSheetModel\n ): { total: number; detail: Record<string, { tokens: number; cost: number }> };\n\n protected abstract onInitialize(context: PluginContext): Promise<void>;\n\n protected abstract onDestroy(): Promise<void>;\n}\n","import {BasePlugin} from './base';\nimport type {AuditFieldMapping, IDatastoreInstance, IDatastorePlugin, PluginContext,} from '@holokai/holo-types/plugin';\nimport type {PricingSheetModel} from '@holokai/holo-types/entities';\n\nexport abstract class BaseDatastorePlugin extends BasePlugin implements IDatastorePlugin {\n\n abstract getDefaultMapping(): AuditFieldMapping;\n\n abstract createInstance(config: Record<string, any>): Promise<IDatastoreInstance>;\n\n protected calculateExtraCosts(\n _tokens: Record<string, number>,\n _pricing: PricingSheetModel,\n ): { total: number; detail: Record<string, { tokens: number; cost: number }> } {\n return {total: 0, detail: {}};\n }\n\n protected abstract onInitialize(context: PluginContext): Promise<void>;\n\n protected abstract onDestroy(): Promise<void>;\n}\n","import {promises as fs} from 'fs';\nimport path from 'path';\nimport type {IProviderPlugin, PluginContext} from '@holokai/holo-types/plugin';\nimport type {HoloLogger} from '@holokai/holo-types/logger';\n\nconst pluginCache = new Map<string, IProviderPlugin>();\n\nexport interface LoadPluginOptions {\n context?: PluginContext;\n skipInitialize?: boolean;\n}\n\nexport function createMockPluginContext(): PluginContext {\n const noop = () => {\n };\n const noopLogger = {\n level: 'silent',\n info: noop,\n warn: noop,\n error: noop,\n debug: noop,\n verbose: noop,\n child: () => noopLogger,\n } as unknown as HoloLogger;\n return {logger: noopLogger};\n}\n\nexport async function discoverPlugins(nodeModulesDir?: string): Promise<string[]> {\n const scopePath = path.resolve(nodeModulesDir ?? 'node_modules', '@holokai');\n\n try {\n const entries = await fs.readdir(scopePath, {withFileTypes: true});\n return entries\n .filter(d => (d.isDirectory() || d.isSymbolicLink()) && d.name.startsWith('holo-provider-'))\n .map(d => `@holokai/${d.name}`);\n } catch {\n return [];\n }\n}\n\nexport function familyFromPackage(packageName: string): string {\n const match = packageName.match(/@holokai\\/holo-provider-(.+)/);\n return match?.[1] ?? packageName;\n}\n\nexport async function loadPlugin(family: string, opts?: LoadPluginOptions): Promise<IProviderPlugin> {\n const cached = pluginCache.get(family);\n if (cached) return cached;\n\n const packageName = `@holokai/holo-provider-${family}`;\n return loadPluginFromPackage(packageName, opts);\n}\n\nexport async function loadPluginFromPackage(packageName: string, opts?: LoadPluginOptions): Promise<IProviderPlugin> {\n const family = familyFromPackage(packageName);\n const cached = pluginCache.get(family);\n if (cached) return cached;\n\n const mod = await import(packageName);\n const plugin: IProviderPlugin = mod.default;\n\n if (!opts?.skipInitialize && plugin.getState() !== 'READY') {\n await plugin.initialize(opts?.context ?? createMockPluginContext());\n }\n\n pluginCache.set(family, plugin);\n return plugin;\n}\n\nexport async function loadAllPlugins(nodeModulesDir?: string, opts?: LoadPluginOptions): Promise<Map<string, IProviderPlugin>> {\n const packages = await discoverPlugins(nodeModulesDir);\n for (const pkg of packages) {\n await loadPluginFromPackage(pkg, opts);\n }\n return getLoadedPlugins();\n}\n\nexport function getLoadedPlugins(): Map<string, IProviderPlugin> {\n return new Map(pluginCache);\n}\n\nexport function clearPluginCache(): void {\n pluginCache.clear();\n}\n\nexport async function discoverDatastorePlugins(nodeModulesDir?: string): Promise<string[]> {\n const scopePath = path.resolve(nodeModulesDir ?? 'node_modules', '@holokai');\n\n try {\n const entries = await fs.readdir(scopePath, {withFileTypes: true});\n return entries\n .filter(d => (d.isDirectory() || d.isSymbolicLink()) && d.name.startsWith('holo-datastore-'))\n .map(d => `@holokai/${d.name}`);\n } catch {\n return [];\n }\n}\n","import type {PluginPricingModel, PluginPricingSheet, PricingDataset, PricingModelId} from '@holokai/holo-types/plugin';\n\ninterface ModelCosts {\n input_cost: number;\n output_cost: number;\n cache_read_cost?: number;\n cache_write_cost?: number;\n batch_input_cost?: number;\n batch_output_cost?: number;\n context_threshold?: number;\n extended_input_cost?: number;\n extended_output_cost?: number;\n token_costs?: Record<string, number>;\n}\n\ninterface ModelIdCosts extends ModelCosts {\n release_date: string;\n shutdown_date: string | null;\n}\n\nexport function normalizePricingDataset(dataset: PricingDataset): Map<string, PluginPricingSheet> {\n const snapshotsByName = new Map(dataset.pricing_snapshots.map(s => [s.name, s]));\n\n // Step 1: Build model_id → family pricing lookup\n const modelIdCosts = new Map<string, ModelIdCosts>();\n for (const mid of dataset.model_ids) {\n if (!mid.pricing_snapshot) continue;\n const snapshot = snapshotsByName.get(mid.pricing_snapshot);\n if (!snapshot) continue;\n const familyModel = snapshot.models.find(m => m.model_name === mid.family);\n if (!familyModel) continue;\n\n const entry: ModelIdCosts = {\n input_cost: familyModel.input_cost,\n output_cost: familyModel.output_cost,\n release_date: mid.release_date,\n shutdown_date: mid.shutdown_date,\n };\n if (familyModel.cache_read_cost !== undefined) entry.cache_read_cost = familyModel.cache_read_cost;\n if (familyModel.cache_write_cost !== undefined) entry.cache_write_cost = familyModel.cache_write_cost;\n if (familyModel.batch_input_cost !== undefined) entry.batch_input_cost = familyModel.batch_input_cost;\n if (familyModel.batch_output_cost !== undefined) entry.batch_output_cost = familyModel.batch_output_cost;\n if (familyModel.context_threshold !== undefined) entry.context_threshold = familyModel.context_threshold;\n if (familyModel.extended_input_cost !== undefined) entry.extended_input_cost = familyModel.extended_input_cost;\n if (familyModel.extended_output_cost !== undefined) entry.extended_output_cost = familyModel.extended_output_cost;\n if (familyModel.token_costs !== undefined) entry.token_costs = familyModel.token_costs;\n modelIdCosts.set(mid.model_id, entry);\n }\n\n // Step 2: Collect all distinct effective dates\n const dateSet = new Set<string>();\n for (const snapshot of dataset.pricing_snapshots) {\n dateSet.add(snapshot.effective_from);\n }\n for (const mid of dataset.model_ids) {\n if (mid.pricing_snapshot) {\n dateSet.add(mid.release_date);\n }\n }\n const sortedDates = Array.from(dateSet).sort();\n\n // Build index: date → snapshots effective at that date\n const snapshotsByDate = new Map<string, typeof dataset.pricing_snapshots>();\n for (const snapshot of dataset.pricing_snapshots) {\n const list = snapshotsByDate.get(snapshot.effective_from) ?? [];\n list.push(snapshot);\n snapshotsByDate.set(snapshot.effective_from, list);\n }\n\n // Build index: date → model_ids releasing at that date\n const modelIdsByDate = new Map<string, PricingModelId[]>();\n for (const mid of dataset.model_ids) {\n if (!mid.pricing_snapshot) continue;\n const list = modelIdsByDate.get(mid.release_date) ?? [];\n list.push(mid);\n modelIdsByDate.set(mid.release_date, list);\n }\n\n // Step 3: Build compiled snapshots\n let prevModels = new Map<string, PluginPricingModel>();\n const compiledSnapshots: { date: string; models: Map<string, PluginPricingModel> }[] = [];\n\n for (const date of sortedDates) {\n const currentModels = new Map(prevModels);\n\n // Apply pricing snapshot changes at this date\n const snapshots = snapshotsByDate.get(date);\n if (snapshots) {\n for (const snapshot of snapshots) {\n for (const model of snapshot.models) {\n currentModels.set(model.model_name, {...model});\n }\n }\n }\n\n // Apply model_id entries releasing at this date (alias expansion)\n const releasingModels = modelIdsByDate.get(date);\n if (releasingModels) {\n for (const mid of releasingModels) {\n const costs = modelIdCosts.get(mid.model_id);\n if (!costs) continue;\n\n // Add the model_id itself\n currentModels.set(mid.model_id, {\n model_name: mid.model_id,\n ...extractCosts(costs),\n });\n\n // Add aliases\n if (mid.aliases) {\n for (const alias of mid.aliases) {\n currentModels.set(alias, {\n model_name: alias,\n ...extractCosts(costs),\n });\n }\n }\n }\n }\n\n // Remove shutdown models\n for (const [name, _] of currentModels) {\n const mid = dataset.model_ids.find(m => m.model_id === name);\n if (mid?.shutdown_date && mid.shutdown_date <= date) {\n currentModels.delete(name);\n if (mid.aliases) {\n for (const alias of mid.aliases) {\n currentModels.delete(alias);\n }\n }\n }\n }\n\n compiledSnapshots.push({date, models: currentModels});\n prevModels = currentModels;\n }\n\n // Step 4 & 5: Compute effective_to and build result map\n const result = new Map<string, PluginPricingSheet>();\n for (let i = 0; i < compiledSnapshots.length; i++) {\n const snapshot = compiledSnapshots[i];\n const effectiveTo = i + 1 < compiledSnapshots.length\n ? compiledSnapshots[i + 1].date\n : undefined;\n\n const version = snapshot.date;\n const sheet: PluginPricingSheet = {\n name: `${dataset.name} ${version}`,\n version,\n effective_from: snapshot.date,\n models: Array.from(snapshot.models.values()),\n };\n if (effectiveTo !== undefined) sheet.effective_to = effectiveTo;\n result.set(version, sheet);\n }\n\n return result;\n}\n\nfunction extractCosts(costs: ModelIdCosts): ModelCosts {\n const result: ModelCosts = {\n input_cost: costs.input_cost,\n output_cost: costs.output_cost,\n };\n if (costs.cache_read_cost !== undefined) result.cache_read_cost = costs.cache_read_cost;\n if (costs.cache_write_cost !== undefined) result.cache_write_cost = costs.cache_write_cost;\n if (costs.batch_input_cost !== undefined) result.batch_input_cost = costs.batch_input_cost;\n if (costs.batch_output_cost !== undefined) result.batch_output_cost = costs.batch_output_cost;\n if (costs.context_threshold !== undefined) result.context_threshold = costs.context_threshold;\n if (costs.extended_input_cost !== undefined) result.extended_input_cost = costs.extended_input_cost;\n if (costs.extended_output_cost !== undefined) result.extended_output_cost = costs.extended_output_cost;\n if (costs.token_costs !== undefined) result.token_costs = costs.token_costs;\n return result;\n}\n","export * from './base';\nexport * from './datastore-base';\nexport * from './errors';\nexport * from './loader';\nexport * from './normalize';\n","import {type Application} from \"../entities\";\n\nexport type TokenType = 'holo_user' | 'holo_application' | 'jwt' | 'anonymous';\n\nexport interface Auth {\n organizationId: string;\n userId?: string;\n tokenType: TokenType;\n application?: Application;\n applications: Application[];\n clientIdentifier?: string;\n}\n","export * from './types';\n","export interface BaseEntity {\n id: string;\n created_at: Date;\n updated_at: Date;\n created_by?: string;\n last_modified_by?: string;\n}\n","export const ProtocolCapability = {\n CHAT: 'chat',\n GENERATE: 'generate',\n EMBED: 'embed',\n MODELS: 'models',\n METRICS: 'metrics'\n} as const;\n\nexport type ProtocolCapability = typeof ProtocolCapability[keyof typeof ProtocolCapability];\n\nexport interface Protocol {\n id: string;\n plugin_id: string;\n name: string;\n capability: ProtocolCapability;\n path?: string;\n active: boolean;\n created_at: Date;\n}\n","import {type BaseEntity} from \"./base\";\nimport {type Plugin} from \"./plugin\";\n\nexport const ServerType = {\n API: 'api',\n AUDIT: 'audit',\n WORKER: 'worker',\n BATCH: 'batch',\n}\n\nexport type ServerType = typeof ServerType[keyof typeof ServerType];\n\nexport interface Server extends BaseEntity {\n id: string;\n name: string;\n type: ServerType\n active: boolean;\n last_online: Date;\n plugins: Plugin[];\n}\n","import {type BaseEntity} from \"./base\";\n\nexport const PricingSource = {\n PLUGIN: 'plugin',\n ADMIN: 'admin',\n INTERNAL: 'internal',\n} as const;\n\nexport type PricingSource = typeof PricingSource[keyof typeof PricingSource];\n\nexport const CostType = {\n PROVIDER: 'provider',\n INTERNAL: 'internal',\n} as const;\n\nexport type CostType = typeof CostType[keyof typeof CostType];\n\nexport interface PricingPlan extends BaseEntity {\n plugin_family: string;\n name: string;\n description?: string;\n currency: string;\n source: PricingSource;\n is_default: boolean;\n read_only: boolean;\n active: boolean;\n}\n\nexport interface PricingSheet extends BaseEntity {\n plan_id: string;\n name: string;\n version: string;\n effective_from: string;\n effective_to?: string;\n notes?: string;\n}\n\nexport interface PricingSheetModel extends BaseEntity {\n sheet_id: string;\n model_name: string;\n input_cost: number;\n output_cost: number;\n cache_read_cost: number;\n cache_write_cost: number;\n batch_input_cost: number;\n batch_output_cost: number;\n context_threshold?: number;\n extended_input_cost?: number;\n extended_output_cost?: number;\n token_costs?: Record<string, number>;\n dictionary_id?: string;\n model_id?: string;\n normalized_model_name?: string;\n match_status?: string;\n match_confidence?: number;\n match_method?: string;\n}\n\nexport interface CostResult {\n input_cost: number;\n output_cost: number;\n total_cost: number;\n detail: Record<string, { tokens: number; cost: number }>;\n}\n\nexport interface ProviderResponseCost {\n id: string;\n response_id: string;\n cost_type: CostType;\n pricing_sheet_id?: string;\n input_tokens: number;\n output_tokens: number;\n cache_read_tokens: number;\n cache_write_tokens: number;\n input_cost: number;\n output_cost: number;\n cache_read_cost: number;\n cache_write_cost: number;\n total_cost: number;\n currency: string;\n metadata?: Record<string, any>;\n created_at: string;\n}\n","export * from './base';\nexport {type Provider} from \"./provider\";\nexport {type Model} from \"./model\";\nexport {type ModelDictionary, type ModelDictionaryStatus, type ModelKind} from \"./model-dictionary\";\nexport {type ModelDictionaryAlias, type ModelAliasType} from \"./model-dictionary-alias\";\nexport {\n type MatchStatus,\n type MatchMethod,\n type MatchCandidate,\n type MatchMetadata,\n type AmbiguousMatchMetadata,\n type ResolvedMatchMetadata,\n type ModelMatchResult,\n type ModelMatchOverride\n} from \"./model-match\";\nexport {type Notification} from \"./notification\";\nexport {type AnalysisResult} from \"./analysis.result\";\nexport {\n type ProviderResponse,\n type ProviderResponseView,\n type ProviderResponseMetadata,\n type ProviderResponseMetrics,\n ProviderResponseStatus\n} from \"./provider.response\";\nexport {\n type ProviderRequest, type ProviderAuditRequest, type ProviderRequestMetadata, type ProviderEnvelope\n} from \"./provider.request\";\nexport {type Application, type AccessLevel} from \"./application\";\nexport {FinishReason} from \"./finish.reason\";\nexport {type HoloToken} from \"./holo.token\";\nexport {type Organization} from \"./organization\";\nexport {type Prompt} from \"./prompt\";\nexport {type Plugin} from \"./plugin\";\nexport {type Datastore} from \"./datastore\";\nexport {type Protocol, ProtocolCapability} from \"./protocol\";\nexport {type Server, ServerType} from \"./server\";\nexport {\n type PricingPlan,\n type PricingSheet,\n type PricingSheetModel,\n type ProviderResponseCost,\n type CostResult,\n PricingSource,\n CostType\n} from \"./pricing\";","export type HoloLogLevel =\n 'fatal'\n | 'error'\n | 'warn'\n | 'info'\n | 'verbose'\n | 'debug'\n | 'trace'\n | 'silent';\n\nexport interface HoloLoggerMethod {\n (message: string, ...meta: any[]): HoloLogger;\n\n (message: any): HoloLogger;\n\n (infoObject: object): HoloLogger;\n}\n\nexport interface HoloLogger {\n level: HoloLogLevel;\n\n error: HoloLoggerMethod;\n\n warn: HoloLoggerMethod;\n\n info: HoloLoggerMethod;\n\n debug: HoloLoggerMethod;\n\n verbose: HoloLoggerMethod;\n\n child(meta: Record<string, unknown>): HoloLogger;\n}\n","export * from './logger';\n","export type NotificationSeverity = \"info\" | \"warn\" | \"error\";\n\n\nexport const NotificationEventType = {\n REQUEST_STARTED: 'request_started',\n GUARD_STARTED: 'guard_started',\n GUARD_PASSED: 'guard_passed',\n GUARD_FAILED: 'guard_failed',\n STATUS: 'status',\n PROVIDER_REQUEST_STARTED: 'provider_request_started',\n PROVIDER_RESPONSE_COMPLETED: 'provider_response_completed',\n RESPONSE_COMPLETED: 'response_completed',\n PROVIDER_ERROR: 'provider_error',\n} as const;\n\nexport type NotificationEventType = typeof NotificationEventType[keyof typeof NotificationEventType];\n\nexport interface NotificationEvent {\n id: string;\n ts: number;\n\n organizationId: string;\n userId: string;\n appSlug?: string;\n threadId?: string;\n requestId?: string;\n branchId?: string;\n\n type: NotificationEventType;\n severity: NotificationSeverity;\n message: string;\n payload?: unknown;\n}\n\nexport interface NotificationQuery {\n organizationId: string;\n userId: string;\n appSlug?: string;\n\n threadIds?: string[];\n requestIds?: string[];\n branchIds?: string[];\n types?: NotificationEventType[];\n\n afterId?: string;\n limit: number;\n}\n\nexport type NotificationSubscribeFilter = Omit<NotificationQuery, \"limit\"> & {\n limit?: number;\n};\n\nexport interface INotificationSub {\n id: string;\n filter: NotificationSubscribeFilter;\n q: AsyncIterable<NotificationEvent>;\n appSlug?: string;\n}\n\nexport interface INotificationService {\n publish(event: NotificationEvent): Promise<void>;\n\n subscribe(filter: NotificationSubscribeFilter): Promise<INotificationSub>;\n\n unsubscribe(id: string): Promise<boolean>;\n}\n\nexport interface INotificationStore {\n query(params: NotificationQuery): Promise<NotificationEvent[]>;\n\n insert(event: NotificationEvent): Promise<void>;\n}\n","export * from './types';\n","import type {ProtocolCapability} from \"../entities\";\n\nexport interface StreamEventSequence {\n ordered: string[];\n repeatable: string[];\n}\n\nexport interface ProviderProtocol {\n id?: string;\n name: string;\n capability: ProtocolCapability;\n streamEventSequence?: StreamEventSequence;\n}\n","import type {\n HoloCountTokensParams,\n HoloEmbedParams,\n HoloFinishReason,\n HoloGenerateParams,\n HoloMessage,\n HoloRequest,\n HoloResponse,\n HoloStreamChunk,\n HoloUsage,\n} from \"../holo\";\nimport type {HoloWorkerRequest, WorkerResponseEnvelope} from \"../worker\";\nimport type {ProviderRequest, ProviderResponse} from \"../entities\";\nimport {type IProviderPlugin} from \"../plugin\";\nimport type {ProviderProtocol} from \"./protocol\";\n\nexport const ProviderEventType = {\n STREAM_EVENT: 'stream_event',\n TEXT_DELTA: 'text_delta',\n TOOL_CALL_DELTA: 'tool_call_delta',\n DONE: 'done',\n ERROR: 'error'\n} as const;\n\nexport type ProviderEventType = typeof ProviderEventType[keyof typeof ProviderEventType];\n\nexport interface ProviderEventMetrics {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n timeToFirstToken: number;\n totalProcessingTime: number;\n startTime: number;\n firstTime?: number;\n endTime?: number;\n}\n\nexport type ProviderErrorEvent = {\n type: typeof ProviderEventType.ERROR;\n requestId: string;\n seq: number;\n error: any;\n text?: string;\n acc?: string;\n status?: number;\n headers?: Record<string, string>;\n metrics: ProviderEventMetrics;\n ts: number;\n};\n\nexport type ProviderStreamEvent = {\n type: typeof ProviderEventType.STREAM_EVENT;\n requestId: string;\n seq: number;\n event: any;\n ts: number;\n};\nexport type ProviderDeltaEvent = {\n type: typeof ProviderEventType.TEXT_DELTA;\n requestId: string;\n seq: number;\n text: string;\n ts: number;\n};\n\nexport interface ToolCallDelta {\n id?: string;\n name?: string;\n arguments_delta?: string;\n}\n\nexport type ProviderToolCallDeltaEvent = {\n type: typeof ProviderEventType.TOOL_CALL_DELTA;\n requestId: string;\n seq: number;\n index: number;\n delta: ToolCallDelta;\n ts: number;\n};\n\nexport type ProviderDoneEvent = {\n type: typeof ProviderEventType.DONE;\n requestId: string;\n seq: number;\n message: any;\n text: string;\n holoResponse?: HoloResponse;\n metrics: ProviderEventMetrics;\n ts: number;\n};\n\nexport type ProviderEvent =\n | ProviderStreamEvent\n | ProviderDeltaEvent\n | ProviderToolCallDeltaEvent\n | ProviderDoneEvent\n | ProviderErrorEvent;\n\nexport interface ProviderContext {\n protocol: ProviderProtocol;\n headers?: Record<string, string | string[]>;\n query?: Record<string, string>;\n emitStreamEvent: (event: any) => void;\n emitTextDelta: (text?: string | null) => void;\n emitToolCallDelta: (index: number, delta: ToolCallDelta) => void;\n}\n\nexport interface RunHandle<Final> {\n start: () => Promise<Final>;\n cancel?: () => void;\n}\n\nexport interface ProviderCapabilities {\n streaming: boolean;\n tools: boolean;\n vision: boolean;\n functionCalling: boolean;\n maxTokens: number;\n}\n\nexport interface ModelInfo {\n id: string;\n name?: string;\n description?: string;\n size?: number;\n parameterCount?: string;\n quantization?: string;\n family?: string;\n parentModel?: string;\n format?: string;\n\n [key: string]: any;\n}\n\nexport interface DiscoveredModel {\n name: string;\n accessModel: string;\n description?: string;\n version?: string;\n contextLength?: number;\n inputModalities?: string[];\n outputModalities?: string[];\n metadata?: Record<string, any>;\n}\n\nexport interface IResponseFactory {\n createError(message: string, code?: string): any;\n}\n\nexport const TokenCountType = {\n INPUT: 'input',\n OUTPUT: 'output',\n} as const;\n\nexport type TokenCountType = typeof TokenCountType[keyof typeof TokenCountType];\n\nexport interface TokenCountOptions {\n type?: TokenCountType | undefined;\n model?: string | undefined;\n}\n\nexport interface IAuditor {\n readonly provider: string;\n\n mapFinishReason(nativeResponse: any, protocolName?: string): HoloFinishReason;\n\n mapUsage(nativeResponse: any, protocolName?: string): HoloUsage;\n\n countTokens(text: string, opts?: TokenCountOptions): number;\n\n auditRequest(workerRequest: HoloWorkerRequest): Promise<ProviderRequest>;\n\n createWorkerResponseEnvelope(workerRequest: HoloWorkerRequest, workerId?: string): Promise<WorkerResponseEnvelope>;\n\n auditResponse(\n responseEnvelope: WorkerResponseEnvelope,\n providerEvent: ProviderEvent,\n ): Promise<ProviderResponse>;\n}\n\nexport interface IProviderTranslator {\n toHoloRequest(request: any): Promise<Partial<HoloRequest>>;\n\n fromHoloRequest(request: HoloRequest): Promise<Partial<any>>;\n\n toHoloMessages(messages: any[]): Promise<Partial<HoloMessage>[]>;\n\n fromHoloMessages(messages: HoloMessage[]): Promise<Partial<any>[]>;\n\n toHoloResponse(response: any): Promise<Partial<HoloResponse>>;\n\n fromHoloResponse(response: HoloResponse): Promise<Partial<any>>;\n\n /**\n * Holo→wire streaming. State (open block tracking, lazy prerequisite\n * emission, etc.) lives in the generator's closure — one call per\n * request.\n */\n fromHoloStream(source: AsyncIterable<HoloStreamChunk>): AsyncIterable<unknown>;\n\n /**\n * Optional inverse of {@link fromHoloStream}: convert a stream of native\n * source events into Holo stream chunks. Same closure semantics.\n * Implemented by providers that support cross-provider streaming\n * round-trips.\n */\n toHoloStream?(source: AsyncIterable<any>): AsyncIterable<HoloStreamChunk>;\n\n fromHoloGenerateRequest?(request: HoloGenerateParams): Promise<any>;\n\n fromHoloEmbedRequest?(request: HoloEmbedParams): Promise<any>;\n\n toHoloEmbedResponse?(response: any): Promise<{ model: string; embeddings: number[][]; usage?: any }>;\n\n fromHoloCountTokensRequest?(request: HoloCountTokensParams): Promise<any>;\n}\n\nexport interface TranslateOptions {\n fromHolo?: boolean;\n validateTarget?: boolean;\n failQuietly?: boolean;\n}\n\nexport interface WireChunk {\n requestId: string;\n seq: number;\n eventSeq?: number;\n headers?: Record<string, string>;\n status?: number;\n body: string;\n fullText?: string;\n done?: true;\n}\n\nexport interface IWireAdapter {\n requestId: string;\n isStreaming: boolean;\n\n fromProviderEvent(ev: ProviderEvent): Promise<WireChunk[]>;\n}\n\nexport interface WireAdapterParams {\n requestId: string;\n isStreaming: boolean;\n protocol: string;\n}\n\nexport interface IProvider {\n id: string;\n name: string;\n auditor: IAuditor;\n translator: IProviderTranslator;\n responseFactory: IResponseFactory;\n plugin: IProviderPlugin;\n\n getModels(allowedModels: string[] | true): Promise<any>;\n\n discoverModels(): Promise<DiscoveredModel[]>;\n\n processWorkerRequest(\n request: HoloWorkerRequest,\n opts?: { signal?: AbortSignal }\n ): Promise<AsyncIterable<ProviderEvent>>;\n\n auditRequest(workerRequest: HoloWorkerRequest): Promise<ProviderRequest>;\n\n auditResponse(\n workerEnvelope: WorkerResponseEnvelope,\n providerEvent: ProviderEvent\n ): Promise<ProviderResponse>;\n}\n\nexport interface ProviderRunner<Final = any> {\n start: () => Promise<Final>;\n cancel?: () => void;\n}\n","export * from './protocol';\nexport * from './types';\n","import type {ProviderProtocol} from \"../provider/protocol\";\n\nexport const RouteHandler = {\n MODELS: 'models',\n REQUEST: 'request',\n PASSTHROUGH: 'passthrough',\n NOOP: 'noop',\n} as const;\n\nexport type RouteHandler = typeof RouteHandler[keyof typeof RouteHandler];\n\nexport function isRouteDefinition(value: any): value is RouteDefinition {\n return value && typeof value === 'object' && 'method' in value && 'handler' in value;\n}\n\nexport interface RouteDefinition {\n paths: string[];\n method: 'GET' | 'POST';\n handler: RouteHandler;\n protocol: ProviderProtocol;\n streaming?: boolean;\n}","export * from './routes';\n","import {type Application, type Provider} from \"../entities\";\nimport type {ProviderProtocol} from \"../provider/protocol\";\n\nexport interface WorkerEnvelopeBase {\n request_id: string;\n organization_id: string;\n application?: Application;\n provider: Provider;\n protocol: ProviderProtocol;\n user_id?: string;\n access_model: string;\n thread_id?: string;\n}\n\nexport interface WorkerRequestEnvelope extends WorkerEnvelopeBase {\n request_raw: Record<string, any>;\n last_user_prompt?: string;\n system_prompt?: string;\n created_at: string;\n metadata: Record<string, any>;\n}\n\nexport interface WorkerResponseEnvelope extends WorkerEnvelopeBase {\n source_id: string;\n client_identifier?: string;\n worker_id?: string;\n payload?: any;\n branch_id?: string;\n wire_family?: string;\n wire_protocol_name?: string;\n original_plugin_id?: string;\n}\n","import {type Application, type Prompt, type Provider} from \"../entities\";\nimport type {ProviderDoneEvent, ProviderErrorEvent} from \"../provider/types\";\nimport type {ProviderProtocol} from \"../provider/protocol\";\n\nexport interface GuardResult {\n passed: boolean;\n errors?: string[];\n}\n\nexport interface HttpRequestDetails {\n path: string;\n method: string;\n headers?: Record<string, any>;\n query?: Record<string, any>;\n}\n\nexport interface HoloWorkerRequest {\n // Required\n httpRequestDetails: HttpRequestDetails;\n isStreaming: boolean;\n organizationId: string;\n payload: any;\n protocol: ProviderProtocol;\n provider: Provider;\n requestId: string;\n sourceId: string;\n timestamp: string;\n\n // Optional\n appSlug?: string;\n application?: Application;\n branchId?: string;\n clientIdentifier?: string;\n errors?: string[];\n guardResult?: GuardResult;\n guards?: Prompt[];\n isHoloNative?: boolean;\n isPassthrough?: boolean;\n options?: Record<string, any>;\n passthroughPath?: string;\n providerEvent?: ProviderDoneEvent | ProviderErrorEvent;\n systemPrompt?: Prompt;\n threadId?: string;\n tokenType?: string;\n userId?: string;\n wireFamily?: string;\n wireProtocolName?: string;\n originalRequest?: any;\n originalPluginId?: string;\n workerId?: string;\n}\n","export * from './envelopes';\nexport * from './request';\n","export * from './api';\nexport * from './entities';\nexport * from './holo';\nexport * from './logger';\nexport * from './notification';\nexport * from './plugin';\nexport * from './provider';\nexport * from './routing';\nexport * from './worker';\n","import {\n type HoloWorkerRequest,\n type ProviderDoneEvent,\n type ProviderEnvelope,\n type ProviderErrorEvent,\n ProviderEventType,\n type ProviderRequest,\n type ProviderResponse,\n ProviderResponseStatus,\n type WorkerRequestEnvelope,\n type WorkerResponseEnvelope\n} from \"@holokai/holo-types\";\nimport type {HoloFinishReason, HoloUsage} from \"@holokai/holo-types/holo\";\nimport {ClassLogger, countTokens, pickDefined} from \"../../core\";\nimport type {IAuditor, TokenCountOptions} from \"@holokai/holo-types/provider\";\nimport {type ProviderEvent} from \"@holokai/holo-types/provider\";\nimport type {\n FinishReason,\n ProviderRequestMetadata,\n ProviderResponseMetadata,\n ProviderResponseMetrics\n} from \"@holokai/holo-types/entities\";\n\n// prompt-extraction.ts\n\nexport type PromptRole = \"user\" | \"system\";\n\ntype RoleLike = {\n role?: string;\n};\n\nexport function normalizeText(text: string): string | null {\n const trimmed = text.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\n/**\n * Extract text from OpenAI / Anthropic / Ollama-style `content`.\n * Supports:\n * - string\n * - array of blocks with { type: \"text\" | \"input_text\", text: string }\n * - array of blocks with { text: string }\n */\nexport function extractTextContent(content: unknown): string | null {\n if (typeof content === \"string\") {\n return normalizeText(content);\n }\n\n if (!Array.isArray(content)) return null;\n\n const text = content\n .flatMap((part: any) => {\n if (!part || typeof part !== \"object\") return [];\n\n if (\n (part.type === \"text\" || part.type === \"input_text\") &&\n typeof part.text === \"string\"\n ) {\n return [part.text];\n }\n\n if (typeof part.text === \"string\") {\n return [part.text];\n }\n\n return [];\n })\n .map((s) => s.trim())\n .filter(Boolean)\n .join(\"\\n\");\n\n return normalizeText(text);\n}\n\n/**\n * Find the first/last message with the given role and extract text from it.\n */\nexport function extractPromptByRole<T extends RoleLike>(\n items: T[] | undefined,\n role: PromptRole,\n strategy: \"first\" | \"last\",\n getText: (item: T) => string | null,\n): string | null {\n if (!items || !Array.isArray(items)) return null;\n\n const iterable = strategy === \"last\" ? [...items].reverse() : items;\n\n for (const item of iterable) {\n if (!item || typeof item !== \"object\") continue;\n if (item.role !== role) continue;\n\n const text = getText(item);\n if (text) return text;\n\n return null;\n }\n\n return null;\n}\n\n/**\n * For top-level system prompt-like fields.\n * Returns string as-is, otherwise JSON stringifies structured values.\n */\nexport function extractTopLevelPrompt(value: unknown): string | null {\n if (value == null) return null;\n\n if (typeof value === \"string\") {\n return normalizeText(value);\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nexport abstract class BaseAuditor extends ClassLogger implements IAuditor {\n abstract readonly provider: string;\n\n mapFinishReason(nativeResponse: any, _protocolName?: string): HoloFinishReason {\n if (!nativeResponse) return 'stop';\n const reason = nativeResponse.stop_reason ?? nativeResponse.finish_reason ?? nativeResponse.choices?.[0]?.finish_reason;\n switch (reason) {\n case 'end_turn':\n case 'stop':\n return 'stop';\n case 'max_tokens':\n case 'length':\n return 'length';\n case 'tool_use':\n case 'tool_calls':\n return 'tool_calls';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'stop';\n }\n }\n\n countTokens(text: string, _opts?: TokenCountOptions): number {\n return countTokens(text);\n }\n\n mapUsage(nativeResponse: any, _protocolName?: string): HoloUsage {\n if (!nativeResponse) return {};\n const usage = nativeResponse.usage;\n if (!usage) return {};\n return pickDefined({\n input_tokens: usage.input_tokens ?? usage.prompt_tokens,\n output_tokens: usage.output_tokens ?? usage.completion_tokens,\n total_tokens: usage.total_tokens ?? (((usage.input_tokens ?? usage.prompt_tokens ?? 0) + (usage.output_tokens ?? usage.completion_tokens ?? 0)) || undefined),\n });\n }\n\n async createWorkerRequestEnvelope(workerRequest: HoloWorkerRequest): Promise<WorkerRequestEnvelope> {\n const logger = this.mlog(this.createWorkerRequestEnvelope);\n if (!workerRequest.requestId) {\n logger.error(`No requestId for workerRequest: ${JSON.stringify(workerRequest)}`);\n }\n\n const {access_model, system_prompt, last_user_prompt} = await this.createProviderEnvelope(workerRequest);\n const {httpRequestDetails} = workerRequest;\n\n return pickDefined({\n request_id: workerRequest.requestId,\n organization_id: workerRequest.organizationId,\n application: workerRequest.application,\n provider: workerRequest.provider,\n protocol: workerRequest.protocol,\n user_id: workerRequest.userId,\n thread_id: workerRequest.threadId,\n created_at: new Date(workerRequest.timestamp).toISOString(),\n request_raw: workerRequest.payload,\n access_model,\n system_prompt,\n last_user_prompt,\n metadata: pickDefined({\n source_id: workerRequest.sourceId,\n branch_id: workerRequest.branchId,\n httpRequestDetails,\n is_streaming: workerRequest.isStreaming || undefined,\n is_passthrough: workerRequest.isPassthrough || undefined,\n guard_result: workerRequest.guardResult,\n token_type: workerRequest.tokenType,\n is_translated: workerRequest.wireFamily ? true : undefined,\n original_request: workerRequest.originalRequest,\n original_plugin_id: workerRequest.originalPluginId,\n original_protocol: workerRequest.wireProtocolName,\n })\n }) as WorkerRequestEnvelope;\n }\n\n async createWorkerResponseEnvelope(workerRequest: HoloWorkerRequest, workerId?: string): Promise<WorkerResponseEnvelope> {\n const providerEnvelope = await this.createProviderEnvelope(workerRequest);\n return pickDefined({\n source_id: workerRequest.sourceId,\n request_id: workerRequest.requestId,\n organization_id: workerRequest.organizationId,\n application: workerRequest.application,\n provider: workerRequest.provider,\n protocol: workerRequest.protocol,\n user_id: workerRequest.userId,\n client_identifier: workerRequest.clientIdentifier,\n worker_id: workerId,\n payload: workerRequest.payload,\n thread_id: workerRequest.threadId,\n branch_id: workerRequest.branchId,\n wire_family: workerRequest.wireFamily,\n wire_protocol_name: workerRequest.wireProtocolName,\n original_plugin_id: workerRequest.originalPluginId,\n ...providerEnvelope\n }) as WorkerResponseEnvelope;\n }\n\n async auditRequest(workerRequest: HoloWorkerRequest): Promise<ProviderRequest> {\n const envelope = await this.createWorkerRequestEnvelope(workerRequest);\n\n const metadata: ProviderRequestMetadata = {\n ...envelope.metadata,\n options: await this.extractRequestOptions(workerRequest)\n };\n\n const providerRequest: Omit<ProviderRequest, 'id'> = {\n request_id: envelope.request_id,\n organization_id: envelope.organization_id,\n application_id: envelope.application?.id,\n provider_id: envelope.provider.id,\n protocol_id: envelope.protocol.id,\n protocol_capability: envelope.protocol.capability,\n user_id: envelope.user_id,\n client_identifier: workerRequest.clientIdentifier,\n request_raw: envelope.request_raw,\n access_model: envelope.access_model,\n system_prompt: envelope.system_prompt,\n last_user_prompt: envelope.last_user_prompt,\n has_tools: this.hasTools(workerRequest.payload),\n thread_id: envelope.thread_id,\n created_at: envelope.created_at,\n metadata\n } as Omit<ProviderRequest, 'id'>;\n\n return pickDefined(providerRequest) as ProviderRequest;\n }\n\n async auditResponse(\n envelope: WorkerResponseEnvelope,\n providerEvent: ProviderDoneEvent | ProviderErrorEvent\n ): Promise<ProviderResponse> {\n const metrics = await this.mapResponseMetrics(providerEvent, envelope.protocol.name);\n const responseRaw = providerEvent.type === ProviderEventType.DONE\n ? providerEvent.message\n : providerEvent.type === 'error'\n ? await this.extractNativeError(providerEvent)\n : undefined;\n\n const {\n usage_raw,\n input_tokens,\n output_tokens,\n total_tokens,\n time_to_first_token,\n total_processing_time\n } = metrics;\n\n const metadata: ProviderResponseMetadata = pickDefined({\n worker_id: envelope.worker_id,\n is_translated: envelope.wire_family ? true : undefined,\n original_response: envelope.wire_family && providerEvent.type === ProviderEventType.DONE ? providerEvent.message : undefined,\n original_plugin_id: envelope.original_plugin_id,\n original_protocol: envelope.wire_protocol_name,\n }) as ProviderResponseMetadata;\n\n return pickDefined({\n request_id: envelope.request_id,\n organization_id: envelope.organization_id,\n application_id: envelope.application?.id,\n provider_id: envelope.provider.id,\n protocol_id: envelope.protocol.id,\n capability: envelope.protocol.capability,\n user_id: envelope.user_id,\n client_identifier: envelope.client_identifier,\n access_model: envelope.access_model,\n status: await this.mapResponseStatus(providerEvent, envelope),\n finish_reason: await this.extractFinishReason(providerEvent, envelope),\n response: providerEvent.text,\n response_raw: responseRaw,\n usage_raw,\n input_tokens,\n output_tokens,\n total_tokens,\n time_to_first_token,\n total_processing_time,\n cost: 0,\n created_at: providerEvent.ts ? new Date(providerEvent.ts).toISOString() : new Date().toISOString(),\n metadata,\n }) as ProviderResponse;\n }\n\n protected async mapResponseMetrics(providerEvent: ProviderDoneEvent | ProviderErrorEvent, protocolName: string): Promise<ProviderResponseMetrics> {\n const {metrics} = providerEvent;\n\n const eventMetrics = {\n input_tokens: metrics.inputTokens,\n output_tokens: metrics.outputTokens,\n total_tokens: metrics.inputTokens + metrics.outputTokens,\n time_to_first_token: metrics.timeToFirstToken,\n total_processing_time: metrics.totalProcessingTime,\n };\n\n if (providerEvent.type === ProviderEventType.ERROR) {\n return eventMetrics;\n }\n\n const providerMetrics = await this.mapProviderResponseMetrics(providerEvent, protocolName);\n\n return {\n ...eventMetrics,\n ...providerMetrics\n };\n }\n\n protected abstract mapProviderResponseMetrics(providerEvent: ProviderDoneEvent, protocolName: string): Promise<Partial<ProviderResponseMetrics>>\n\n protected async mapResponseStatus(providerEvent: ProviderEvent, _envelope: WorkerResponseEnvelope): Promise<ProviderResponseStatus> {\n switch (providerEvent.type) {\n case 'done':\n return ProviderResponseStatus.SUCCESS;\n case 'error':\n return ProviderResponseStatus.ERROR;\n default:\n return ProviderResponseStatus.PARTIAL\n }\n }\n\n protected hasTools(payload: any): boolean {\n return Array.isArray(payload?.tools) && payload.tools.length > 0;\n }\n\n protected abstract extractFinishReason(\n providerEvent: ProviderDoneEvent | ProviderErrorEvent,\n envelope: WorkerResponseEnvelope\n ): Promise<FinishReason | undefined>;\n\n protected async extractNativeError(providerEvent: ProviderErrorEvent): Promise<any> {\n const err = providerEvent.error;\n return err?.error ?? err;\n }\n\n protected abstract extractRequestOptions(workerRequest: HoloWorkerRequest): Promise<Record<string, any>>;\n\n protected abstract createProviderEnvelope(\n workerRequest: HoloWorkerRequest\n ): Promise<ProviderEnvelope>;\n}\n","export * from './base';","import type {TranslateOptions} from \"@holokai/holo-types/provider\";\n\nexport abstract class StreamTranslator<THolo, TProvider> {\n /** Validators for single streaming chunks (not full messages) */\n protected abstract providerDefaults: Partial<TProvider>;\n protected abstract holoDefaults: Partial<THolo>;\n\n /**\n * Translate a single streaming chunk to 0..N target chunks.\n * - Validates the source (as a complete chunk of its type).\n * - Does NOT merge defaults (deltas are partial by design).\n * - Optionally validates each emitted target chunk and strips undeclared keys.\n */\n async translateMany<TSource, TTarget>(\n source: TSource,\n options: TranslateOptions\n ): Promise<Partial<TTarget>[]> {\n const {\n fromHolo = true\n } = options;\n\n const defaults = (fromHolo ? this.providerDefaults : this.holoDefaults) ?? {};\n\n // 2) Impl: single → many\n const emitted: Partial<TTarget>[] = fromHolo\n ? await this.fromHoloManyImpl(source as unknown as THolo) as unknown as Partial<TTarget>[]\n : await this.toHoloManyImpl(source as unknown as TProvider) as unknown as Partial<TTarget>[];\n\n if (!Array.isArray(emitted) || emitted.length === 0) return [];\n\n // 3) Apply defaults per item\n const withDefaults = emitted.map(item => ({...defaults, ...(item ?? {})}));\n\n const cleaned: Partial<TTarget>[] = [];\n for (const item of withDefaults) {\n const obj = item as Partial<TTarget>;\n if (obj && Object.keys(obj).length > 0) cleaned.push(obj);\n }\n\n return cleaned;\n }\n\n // Convenience wrappers for one-chunk-in, many-out.\n async fromHoloMany(source: THolo, validateTarget = false): Promise<Partial<TProvider>[]> {\n return this.translateMany<THolo, TProvider>(source, {fromHolo: true, validateTarget});\n }\n\n async toHoloMany(target: TProvider, validateTarget = false): Promise<Partial<THolo>[]> {\n return this.translateMany<TProvider, THolo>(target, {fromHolo: false, validateTarget});\n }\n\n /**\n * Stream Holo chunks → stream wire chunks. Default implementation is\n * per-chunk stateless (delegates to {@link fromHoloMany}). Plugins with\n * cross-chunk synthesis state override this — state lives in the\n * generator's closure for the lifetime of one request.\n */\n async* fromHoloStream(\n source: AsyncIterable<THolo>,\n validateTarget = false,\n ): AsyncIterable<Partial<TProvider>> {\n for await (const chunk of source) {\n const out = await this.fromHoloMany(chunk, validateTarget);\n for (const w of out) {\n if (w && Object.keys(w).length > 0) yield w;\n }\n }\n }\n\n /**\n * Stream native source chunks → stream Holo chunks. Default is per-chunk\n * stateless. Override for cross-chunk state.\n */\n async* toHoloStream(\n source: AsyncIterable<TProvider>,\n validateTarget = false,\n ): AsyncIterable<Partial<THolo>> {\n for await (const chunk of source) {\n const out = await this.toHoloMany(chunk, validateTarget);\n for (const h of out) {\n if (h && Object.keys(h).length > 0) yield h;\n }\n }\n }\n\n // Abstract impls must emit arrays (0..N) for streaming semantics.\n protected abstract fromHoloManyImpl(source: THolo): Promise<Partial<TProvider>[]>;\n\n protected abstract toHoloManyImpl(source: TProvider): Promise<Partial<THolo>[]>;\n}\n","import type {TranslateOptions} from \"@holokai/holo-types/provider\";\nimport {ClassLogger} from \"../../core\";\n\n\nexport abstract class BaseTranslator<THolo, TProvider> extends ClassLogger {\n\n protected abstract holoDefaults: any;\n protected abstract providerDefaults: any;\n\n async translate<TSource, TTarget>(source: TSource, options: TranslateOptions): Promise<Partial<TTarget>> {\n const {fromHolo = true} = options;\n const defaults = fromHolo ? this.providerDefaults : this.holoDefaults;\n\n const partial: Partial<TTarget> = fromHolo\n ? (await this.fromHoloImpl(source as unknown as THolo)) as unknown as Partial<TTarget>\n : (await this.toHoloImpl(source as unknown as TProvider)) as unknown as Partial<TTarget>;\n\n return {\n ...(defaults ?? {}),\n ...(partial ?? {}),\n };\n }\n\n\n async translateArray<TSource, TTarget>(items: TSource[] | undefined, options: TranslateOptions): Promise<TTarget[]> {\n if (!items?.length) return [];\n\n const results = await Promise.all(items.map(item =>\n this.translate(item, options))); // Remove .bind(this)\n\n return results.filter(item => Object.keys(item).length > 0) as TTarget[];\n }\n\n async fromHolo(source: THolo, validateTarget = false): Promise<Partial<TProvider>> {\n return await this.translate<THolo, TProvider>(source, {fromHolo: true, validateTarget});\n }\n\n async fromHoloArray(items: THolo[] | undefined, validateTarget = false): Promise<TProvider[]> {\n return await this.translateArray<THolo, TProvider>(items, {fromHolo: true, validateTarget});\n }\n\n async toHolo(target: TProvider, validateTarget = false): Promise<Partial<THolo>> {\n return await this.translate<TProvider, THolo>(target, {fromHolo: false, validateTarget});\n }\n\n async toHoloArray(items: TProvider[] | undefined, validateTarget = false): Promise<THolo[]> {\n return await this.translateArray(items, {fromHolo: false, validateTarget});\n }\n\n protected abstract fromHoloImpl(source: THolo): Promise<Partial<TProvider>>;\n\n protected abstract toHoloImpl(source: TProvider): Promise<Partial<THolo>>;\n}\n","import type {HoloStreamChunk, HoloStreamingDelta} from \"@holokai/holo-types/holo\";\n\n/**\n * Per-request synthesis state that every wire/source stream translator needs\n * to carry across chunks. Lifted out of the individual plugin translators so\n * they share one definition of \"what was seen so far\" — model, id, usage,\n * finish reason, and which lifecycle markers have flowed through.\n *\n * Plugins extend this with their own translator-specific state (Claude's\n * open-block index map, Ollama's synthetic-message-start latch, etc.).\n */\nexport interface StreamSynthesisState {\n /** Most recent top-level model name from any chunk. */\n lastModel?: string;\n /** Most recent top-level created timestamp (epoch seconds or ms — left to\n * the source convention). */\n lastCreated?: number;\n /** Most recent top-level id from any chunk. */\n lastId?: string;\n /** Most recent top-level usage object. */\n lastUsage?: HoloStreamChunk['usage'];\n /** Most recent delta-level usage (set on `message_start` / `message_delta`\n * chunks that carry inline usage). */\n lastDeltaUsage?: HoloStreamingDelta['usage'];\n /** Most recent top-level finish_reason. */\n lastFinishReason?: HoloStreamChunk['finish_reason'];\n /** True after observing a `message_start` Holo chunk in the input. */\n sawMessageStart: boolean;\n /** True after observing a `message_delta` Holo chunk in the input. */\n sawMessageDelta: boolean;\n /** True after observing a `message_stop` Holo chunk in the input. */\n sawMessageStop: boolean;\n}\n\nexport function createStreamSynthesisState(): StreamSynthesisState {\n return {\n sawMessageStart: false,\n sawMessageDelta: false,\n sawMessageStop: false,\n };\n}\n\n/**\n * Update tracking fields from a Holo chunk. Call once per chunk before\n * dispatching to translator-specific synthesis.\n */\nexport function recordStreamChunk(state: StreamSynthesisState, chunk: HoloStreamChunk): void {\n if (chunk.model) state.lastModel = chunk.model;\n if (typeof chunk.created === 'number') state.lastCreated = chunk.created;\n if (chunk.id) state.lastId = chunk.id;\n if (chunk.usage) state.lastUsage = chunk.usage;\n if (chunk.delta?.usage) state.lastDeltaUsage = chunk.delta.usage;\n if (chunk.finish_reason) state.lastFinishReason = chunk.finish_reason;\n if (chunk.delta?.type === 'message_start') state.sawMessageStart = true;\n if (chunk.delta?.type === 'message_delta') state.sawMessageDelta = true;\n if (chunk.delta?.type === 'message_stop') state.sawMessageStop = true;\n}\n","import type {HoloResponse, HoloStreamChunk, IProviderTranslator, ProviderEvent,} from \"@holokai/holo-types\";\n\n/**\n * Wraps a source-format `AsyncIterable<ProviderEvent>` and yields a\n * wire-format `AsyncIterable<ProviderEvent>` for cross-family streaming.\n *\n * Pipes everything through ONE call to `source.toHoloStream` and ONE call\n * to `wire.fromHoloStream`, so cross-chunk synthesis state lives in each\n * translator's generator closure for the whole request. On the source\n * `done` event, translates `ev.message` via `source.toHoloResponse` →\n * `wire.fromHoloResponse` and yields the done event with the wire-format\n * message. Pass-through events (`text_delta`, `tool_call_delta`, etc.)\n * are emitted after the wire stream finishes.\n */\nexport async function* translateProviderEvents(\n events: AsyncIterable<ProviderEvent>,\n source: IProviderTranslator,\n wire: IProviderTranslator,\n): AsyncIterable<ProviderEvent> {\n if (!source.toHoloStream) {\n for await (const ev of events) yield ev;\n return;\n }\n\n type StreamEvt = Extract<ProviderEvent, { type: 'stream_event' }>;\n const ctx: {\n lastStreamEvent: StreamEvt | null;\n pendingDone: Extract<ProviderEvent, { type: 'done' }> | null;\n pendingError: Extract<ProviderEvent, { type: 'error' }> | null;\n passThrough: ProviderEvent[];\n } = {lastStreamEvent: null, pendingDone: null, pendingError: null, passThrough: []};\n\n const holoIter = source.toHoloStream(\n (async function* () {\n for await (const ev of events) {\n if (ev.type === 'stream_event' && ev.event != null) {\n ctx.lastStreamEvent = ev;\n yield ev.event;\n } else if (ev.type === 'done' && ev.message != null) {\n ctx.pendingDone = ev;\n return;\n } else if (ev.type === 'error') {\n ctx.pendingError = ev;\n return;\n } else {\n ctx.passThrough.push(ev);\n }\n }\n })()\n );\n\n for await (const wireChunk of wire.fromHoloStream(holoIter as AsyncIterable<HoloStreamChunk>)) {\n const ref = ctx.lastStreamEvent;\n if (ref) yield {...ref, event: wireChunk};\n }\n\n for (const ev of ctx.passThrough) yield ev;\n\n const done = ctx.pendingDone;\n if (done) {\n try {\n const baseResp = (done.holoResponse ?? await source.toHoloResponse(done.message)) as HoloResponse;\n // Source streams that don't include usage in the final wire chunk\n // (e.g., OpenAI without stream_options.include_usage) leave\n // HoloResponse.usage empty. The done event's metrics carry\n // worker-computed token counts and timing measurements — merge\n // them so the wire's final message can render real stats.\n const m = (done as {\n metrics?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n timeToFirstToken?: number;\n totalProcessingTime?: number;\n };\n }).metrics;\n let holoResp: HoloResponse = baseResp;\n if (m) {\n const existing = baseResp.usage;\n const usage: Record<string, unknown> = existing ? {...existing} : {};\n // Take the larger of source-reported and worker-computed counts.\n // Sources that don't include usage in streaming mode (OpenAI\n // without `stream_options.include_usage`) often surface a\n // zero-filled usage object on `toHoloResponse`, so a strict\n // \"only fill if missing\" check leaves real worker metrics on\n // the floor. Math.max picks worker counts when the source\n // gave 0, and keeps real upstream numbers when present.\n const maxTokens = (existingVal: unknown, mVal?: number): number | undefined => {\n const e = typeof existingVal === 'number' ? existingVal : 0;\n const w = typeof mVal === 'number' ? mVal : 0;\n if (e === 0 && w === 0) {\n return typeof existingVal === 'number' ? existingVal : undefined;\n }\n return Math.max(e, w);\n };\n const input = maxTokens(usage.input_tokens, m.inputTokens);\n if (input !== undefined) usage.input_tokens = input;\n const output = maxTokens(usage.output_tokens, m.outputTokens);\n if (output !== undefined) usage.output_tokens = output;\n const total = maxTokens(usage.total_tokens, m.totalTokens);\n if (total !== undefined) usage.total_tokens = total;\n // Worker metrics report timings in milliseconds; HoloUsage.timings\n // is wire-format-agnostic (Ollama renders these in nanoseconds via\n // its usage translator). Convert ms → ns here so downstream\n // translators can apply their own scale if needed; Ollama maps\n // 1:1, others can ignore.\n const existingTimings = (existing as { timings?: Record<string, number> } | undefined)?.timings ?? {};\n const timings: Record<string, number> = {...existingTimings};\n const ms2ns = (ms: number) => ms * 1_000_000;\n if (timings.total === undefined && typeof m.totalProcessingTime === 'number') {\n timings.total = ms2ns(m.totalProcessingTime);\n }\n if (timings.prompt_eval === undefined && typeof m.timeToFirstToken === 'number') {\n timings.prompt_eval = ms2ns(m.timeToFirstToken);\n }\n if (timings.eval === undefined\n && typeof m.totalProcessingTime === 'number'\n && typeof m.timeToFirstToken === 'number') {\n timings.eval = ms2ns(Math.max(0, m.totalProcessingTime - m.timeToFirstToken));\n }\n if (Object.keys(timings).length > 0) {\n usage.timings = timings;\n }\n if (Object.keys(usage).length > 0) {\n holoResp = Object.assign({}, baseResp, {usage: usage as HoloResponse['usage']});\n }\n }\n yield {...done, message: await wire.fromHoloResponse(holoResp)};\n } catch {\n yield done;\n }\n }\n const err = ctx.pendingError;\n if (err) yield err;\n}\n","export * from './stream';\nexport * from './base';\nexport * from './stream-state';\nexport * from './translate-provider-events';\n","import type {\n DiscoveredModel,\n IAuditor,\n IProvider,\n IProviderTranslator,\n IResponseFactory,\n ProviderEventMetrics,\n ProviderRunner\n} from \"@holokai/holo-types/provider\";\nimport {type ModelInfo, type ProviderContext, type ProviderEvent, TokenCountType} from \"@holokai/holo-types/provider\";\nimport {type HoloWorkerRequest} from \"@holokai/holo-types/worker\";\nimport {ProtocolCapability, type ProviderRequest, type ProviderResponse} from \"@holokai/holo-types/entities\";\nimport {AsyncEventQueue, ClassLogger, pickDefined} from \"../core\";\nimport {type HoloResponse, type IProviderPlugin, type WorkerResponseEnvelope} from \"@holokai/holo-types\";\n\nexport abstract class BaseProvider<ProviderClient = any, RequestPayload = any, Final = any> extends ClassLogger implements IProvider {\n public readonly auditor: IAuditor;\n public readonly translator: IProviderTranslator;\n public readonly responseFactory: IResponseFactory;\n protected models: Record<string, ModelInfo> = {};\n protected readonly client: ProviderClient;\n\n constructor(\n public readonly id: string,\n public readonly name: string,\n public readonly plugin: IProviderPlugin,\n protected readonly _config: any\n ) {\n super();\n\n this.client = this.createClient();\n this.auditor = this.createAuditor();\n this.translator = this.createTranslator();\n this.responseFactory = this.createResponseFactory();\n }\n\n abstract getModels(allowedModels: string[] | true): Promise<any>;\n\n abstract discoverModels(): Promise<DiscoveredModel[]>;\n\n async auditRequest(workerRequest: HoloWorkerRequest): Promise<ProviderRequest> {\n return this.auditor.auditRequest(workerRequest);\n }\n\n async auditResponse(\n workerEnvelope: WorkerResponseEnvelope,\n providerEvent: ProviderEvent\n ): Promise<ProviderResponse> {\n return this.auditor.auditResponse(workerEnvelope, providerEvent);\n }\n\n async processWorkerRequest(\n request: HoloWorkerRequest,\n _opts?: { signal?: AbortSignal }\n ): Promise<AsyncEventQueue<ProviderEvent>> {\n const q = new AsyncEventQueue<ProviderEvent>();\n\n const {requestId, protocol, payload, httpRequestDetails} = request;\n const requestPayload = request.isHoloNative\n ? await this.translatePayload(protocol?.capability, payload, protocol?.name) as RequestPayload\n : payload as RequestPayload;\n\n let fullText = \"\";\n\n const metrics: ProviderEventMetrics = {\n startTime: Date.now(),\n timeToFirstToken: 0,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n totalProcessingTime: 0,\n };\n\n const push = this.createEventPusher(q, requestId);\n\n const query = {...(httpRequestDetails?.query ?? {})};\n if (request.isHoloNative && request.isStreaming) {\n query.alt = 'sse';\n query.stream = 'true';\n }\n\n const ctx = pickDefined({\n protocol,\n headers: httpRequestDetails?.headers,\n query,\n emitStreamEvent: (event: any) =>\n push({type: \"stream_event\", event} as ProviderEvent),\n emitTextDelta: (text?: string | null) => {\n if (metrics.timeToFirstToken === 0) {\n metrics.firstTime = Date.now();\n metrics.timeToFirstToken = metrics.firstTime - metrics.startTime;\n }\n if (text != null) {\n fullText += text;\n push({type: \"text_delta\", text} as ProviderEvent);\n }\n },\n emitToolCallDelta: (index: number, delta: { id?: string; name?: string; arguments_delta?: string }) =>\n push({type: \"tool_call_delta\", index, delta} as ProviderEvent),\n }) as ProviderContext;\n\n let runner: ProviderRunner<Final>;\n\n try {\n runner = await this.createRequestRunner(requestPayload, ctx);\n } catch (e: any) {\n metrics.endTime = Date.now();\n metrics.totalProcessingTime = metrics.endTime - metrics.startTime;\n metrics.outputTokens = this.auditor.countTokens(fullText, {type: TokenCountType.OUTPUT});\n const handledError = await this.handleError(e);\n push({\n type: \"error\",\n error: handledError,\n text: (e as Error).message,\n status: this.getErrorStatus(e, handledError),\n headers: e?.headers,\n metrics,\n acc: fullText\n } as ProviderEvent);\n q.end();\n return q;\n }\n\n // IMPORTANT: do not await here — return q immediately for streaming\n void (async () => {\n try {\n const final = await runner.start();\n if (metrics.timeToFirstToken === 0) {\n metrics.firstTime = Date.now();\n metrics.timeToFirstToken = metrics.firstTime - metrics.startTime;\n }\n metrics.endTime = Date.now();\n metrics.totalProcessingTime = metrics.endTime - metrics.startTime;\n\n const providerUsage = this.auditor.mapUsage(final, protocol?.name);\n const model = this.plugin.getModelNameFromRequest(requestPayload, protocol?.name);\n metrics.inputTokens = providerUsage.input_tokens ?? metrics.inputTokens;\n metrics.outputTokens = providerUsage.output_tokens ?? this.auditor.countTokens(fullText, {\n type: TokenCountType.OUTPUT,\n model\n });\n metrics.totalTokens = providerUsage.total_tokens ?? (metrics.inputTokens + metrics.outputTokens);\n\n if (request.isHoloNative && protocol?.capability === ProtocolCapability.EMBED && this.translator.toHoloEmbedResponse) {\n const normalized = await this.translator.toHoloEmbedResponse(final);\n push({type: \"done\", message: normalized, text: '', metrics} as ProviderEvent);\n } else {\n if (!fullText && request.isHoloNative && final) {\n try {\n const translated = await this.translator.toHoloResponse(final);\n const extractedText = (translated.output ?? [])\n .filter((m: any) => m.role === 'assistant')\n .map((m: any) => typeof m.content === 'string' ? m.content : '')\n .join('');\n if (extractedText) fullText = extractedText;\n } catch { /* best-effort fallback */\n }\n }\n\n const holoResponse: HoloResponse | undefined = (request.isHoloNative && !request.isStreaming) ? {\n id: requestId,\n model: model ?? '',\n output: fullText ? [{role: 'assistant', content: fullText}] : [],\n created: Date.now(),\n finish_reason: this.auditor.mapFinishReason(final, protocol?.name),\n usage: providerUsage,\n } : undefined;\n\n push({\n type: \"done\",\n message: final,\n text: fullText,\n holoResponse,\n metrics\n } as ProviderEvent);\n }\n } catch (e: any) {\n metrics.endTime = Date.now();\n metrics.totalProcessingTime = metrics.endTime - metrics.startTime;\n metrics.outputTokens = this.auditor.countTokens(fullText, {type: TokenCountType.OUTPUT});\n const handledError = await this.handleError(e);\n push({\n type: \"error\",\n error: handledError,\n text: (e as Error).message,\n status: this.getErrorStatus(e, handledError),\n headers: e?.headers,\n metrics\n } as ProviderEvent);\n } finally {\n q.end();\n }\n })();\n\n return q;\n }\n\n protected abstract createClient(): ProviderClient;\n\n protected abstract createAuditor(): IAuditor;\n\n protected abstract createTranslator(): IProviderTranslator;\n\n protected abstract createResponseFactory(): IResponseFactory\n\n protected abstract handleError(error: any): Promise<any>;\n\n protected getErrorStatus(e: any, handledError: any): number | undefined {\n return e?.status ?? e?.statusCode ?? handledError?.error?.code;\n }\n\n protected abstract createRequestRunner(\n payload: RequestPayload,\n ctx: ProviderContext\n ): Promise<ProviderRunner<Final>>;\n\n protected async translatePayload(capability: ProtocolCapability | undefined, payload: any, _protocolName?: string): Promise<any> {\n switch (capability) {\n case ProtocolCapability.GENERATE:\n if (this.translator.fromHoloGenerateRequest) {\n return this.translator.fromHoloGenerateRequest(payload);\n }\n break;\n case ProtocolCapability.EMBED:\n if (this.translator.fromHoloEmbedRequest) {\n return this.translator.fromHoloEmbedRequest(payload);\n }\n break;\n case ProtocolCapability.METRICS:\n if (this.translator.fromHoloCountTokensRequest) {\n return this.translator.fromHoloCountTokensRequest(payload);\n }\n break;\n }\n return this.translator.fromHoloRequest(payload);\n }\n\n private createEventPusher(q: AsyncEventQueue<ProviderEvent>, requestId: string) {\n let seq = 0;\n return (ev: Omit<ProviderEvent, \"requestId\" | \"seq\" | \"ts\">) => {\n q.push({...ev, requestId, seq: seq++, ts: Date.now()} as ProviderEvent);\n };\n }\n}","import {ClassLogger, pickDefined, stringifyAny} from '../../core';\nimport type {IWireAdapter, ProviderEvent, WireChunk} from '@holokai/holo-types/provider';\n\nexport abstract class BaseWireAdapter extends ClassLogger implements IWireAdapter {\n wireSeq = 0;\n\n constructor(\n public readonly requestId: string,\n public readonly isStreaming: boolean\n ) {\n super();\n }\n\n async fromProviderEvent(ev: ProviderEvent): Promise<WireChunk[]> {\n if (!this.isStreaming) return this.fromNonStreaming(ev);\n return this.fromStreaming(ev);\n }\n\n abstract formatWire(data: any): string;\n\n // --- defaults ---\n protected nonStreamingHeaders(): Record<string, string> {\n return {'Content-Type': 'application/json'};\n }\n\n protected streamingHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n };\n }\n\n protected defaultHeadersForFirst(ev: ProviderEvent): Record<string, string> {\n return (ev.type === 'error' || !this.isStreaming) ? this.nonStreamingHeaders() : this.streamingHeaders();\n }\n\n protected async chunkify(ev: ProviderEvent, bodyFn: (ev: any) => Promise<string>, done?: true, options?: {\n fullText?: string,\n status?: number;\n headers?: Record<string, string>\n }): Promise<WireChunk> {\n const isFirst = this.wireSeq == 0;\n const seq = this.wireSeq++;\n const body = await bodyFn(ev);\n const fullText = options?.fullText;\n\n const chunk = pickDefined({\n fullText,\n requestId: this.requestId,\n seq,\n eventSeq: ev.seq,\n body,\n done,\n }) as WireChunk;\n\n if (isFirst) {\n const status = options?.status ?? (ev.type === 'error' ? (ev.status ?? 400) : 200);\n const headers =\n options?.headers ??\n (ev.type === 'error' && ev.headers ? ev.headers : undefined) ?? this.defaultHeadersForFirst(ev);\n\n chunk.status = status;\n chunk.headers = headers;\n } else {\n // generally do NOT send headers/status after first chunk; allow explicit override if needed\n if (options?.status !== undefined) chunk.status = options.status;\n if (options?.headers) chunk.headers = options.headers;\n }\n\n return chunk;\n }\n\n // --- non-streaming ---\n protected async fromNonStreaming(ev: ProviderEvent): Promise<WireChunk[]> {\n if (ev.type === 'done') {\n return [await this.chunkify(ev, async (ev: Extract<ProviderEvent, {\n type: 'done'\n }>) => stringifyAny(ev.message), true)];\n }\n if (ev.type === 'error') {\n return [await this.chunkify(ev, async (ev: Extract<ProviderEvent, {\n type: 'error'\n }>) => stringifyAny(ev.error), true, pickDefined({status: ev.status ?? 400, headers: ev.headers}))];\n }\n return [];\n }\n\n // --- streaming ---\n protected async fromStreaming(ev: ProviderEvent): Promise<WireChunk[]> {\n switch (ev.type) {\n case 'stream_event':\n return this.onStreamEvent(ev);\n case 'done':\n return this.onDoneStreaming(ev);\n case 'error':\n return this.onErrorStreaming(ev);\n case 'text_delta':\n default:\n return [];\n }\n }\n\n protected async onStreamEvent(ev: Extract<ProviderEvent, { type: 'stream_event' }>): Promise<WireChunk[]> {\n return [await this.chunkify(ev, this.defaultStreamEventFormatter.bind(this))];\n }\n\n protected async onDoneStreaming(ev: Extract<ProviderEvent, { type: 'done' }>): Promise<WireChunk[]> {\n return [await this.chunkify(ev, this.defaultDoneStreamFormatter.bind(this), true, {fullText: ev.text})];\n }\n\n protected async onErrorStreaming(ev: Extract<ProviderEvent, { type: 'error' }>): Promise<WireChunk[]> {\n if (this.wireSeq === 0) {\n return await this.fromNonStreaming(ev);\n }\n // Mid-stream: default behavior (provider adapters should usually override)\n return [await this.chunkify(ev, this.defaultStreamErrorFormatter.bind(this), true)];\n }\n\n protected async defaultDoneStreamFormatter(ev: Extract<ProviderEvent, { type: 'done' }>): Promise<string> {\n return this.formatWire(ev.message);\n }\n\n protected async defaultStreamErrorFormatter(ev: Extract<ProviderEvent, { type: 'error' }>): Promise<string> {\n return stringifyAny(ev.error);\n }\n\n protected async defaultStreamEventFormatter(ev: Extract<ProviderEvent, { type: 'stream_event' }>): Promise<string> {\n return this.formatWire(ev.event);\n }\n}","import type {ProviderEvent, ProviderToolCallDeltaEvent, WireChunk} from '@holokai/holo-types/provider';\nimport type {HoloContent, HoloMessage, HoloStreamEvent, HoloToolCall, HoloUsage} from '@holokai/holo-types/holo';\nimport type {ProtocolCapability} from '@holokai/holo-types/entities';\nimport {BaseWireAdapter} from './base';\nimport {type HoloResponse} from \"@holokai/holo-types\";\nimport {pickDefined} from \"../../core\";\n\nexport class HoloWireAdapter extends BaseWireAdapter {\n private textAccumulator = '';\n private toolCalls: Map<number, { id?: string; name: string; arguments: string }> = new Map();\n private responseId?: string;\n private model?: string;\n private firstEvent = true;\n private readonly capability: ProtocolCapability | undefined;\n\n constructor(requestId: string, isStreaming: boolean, initialModel?: string, capability?: ProtocolCapability) {\n super(requestId, isStreaming);\n if (initialModel) this.model = initialModel;\n this.capability = capability;\n }\n\n formatWire(data: string | HoloStreamEvent): string {\n if (typeof data === 'string') {\n return `event: ${data}\\ndata: {}\\n\\n`;\n }\n return `event: ${data.type}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n }\n\n emitCreated(id: string, model: string): HoloStreamEvent {\n this.responseId = id;\n this.model = model;\n return {\n type: 'response.created',\n response: {id, model, output: [], created: Date.now(), usage: {}, finish_reason: null}\n };\n }\n\n emitTextDelta(index: number, text: string): HoloStreamEvent {\n this.textAccumulator += text;\n return {type: 'response.output_text.delta', index, delta: text};\n }\n\n emitReasoningDelta(index: number, text: string): HoloStreamEvent {\n return {type: 'response.reasoning.delta', index, delta: text};\n }\n\n emitToolCallDelta(index: number, delta: { id?: string; name?: string; arguments_delta?: string }): HoloStreamEvent {\n const existing = this.toolCalls.get(index);\n if (existing) {\n if (delta.id) existing.id = delta.id;\n if (delta.name) existing.name += delta.name;\n if (delta.arguments_delta) existing.arguments += delta.arguments_delta;\n } else {\n const entry: { id?: string; name: string; arguments: string } = {\n name: delta.name ?? '',\n arguments: delta.arguments_delta ?? ''\n };\n if (delta.id) entry.id = delta.id;\n this.toolCalls.set(index, entry);\n }\n return {type: 'response.tool_call.delta', index, tool_call_delta: delta};\n }\n\n async emitHoloEvent(ev: ProviderEvent, holoEvent: HoloStreamEvent): Promise<WireChunk[]> {\n return [await this.chunkify(ev, async () => this.formatWire(holoEvent))];\n }\n\n protected async fromNonStreaming(ev: ProviderEvent): Promise<WireChunk[]> {\n if (ev.type === 'done') {\n if (this.capability === 'embed' || this.capability === 'metrics') {\n return [await this.chunkify(ev, async () => JSON.stringify(ev.message), true)];\n }\n const response = ev.holoResponse ?? this.buildFinalResponse(ev);\n return [await this.chunkify(ev, async () => JSON.stringify(response), true)];\n }\n if (ev.type === 'error') {\n const status = ev.status ?? 500;\n const errorBody = typeof ev.error === 'string'\n ? {message: ev.error}\n : (ev.error ?? {message: ev.text ?? 'Unknown error'});\n const errorEvent: HoloStreamEvent = {\n type: 'response.failed',\n error: {message: errorBody.message ?? ev.text ?? String(ev.error), code: String(status)},\n };\n const opts: { status: number; headers?: Record<string, string> } = {status};\n if (ev.headers) opts.headers = ev.headers;\n return [await this.chunkify(ev, async () => JSON.stringify(errorEvent), true, opts)];\n }\n return [];\n }\n\n protected async fromStreaming(ev: ProviderEvent): Promise<WireChunk[]> {\n const chunks: WireChunk[] = [];\n\n if (this.firstEvent) {\n this.firstEvent = false;\n const createdEvent = this.emitCreated(this.requestId, this.model ?? '');\n chunks.push(await this.chunkify(ev, async () => this.formatWire(createdEvent)));\n }\n\n switch (ev.type) {\n case 'text_delta': {\n const deltaEvent = this.emitTextDelta(0, ev.text);\n chunks.push(await this.chunkify(ev, async () => this.formatWire(deltaEvent)));\n return chunks;\n }\n case 'tool_call_delta': {\n const tcEv = ev as ProviderToolCallDeltaEvent;\n const holoEvent = this.emitToolCallDelta(tcEv.index, tcEv.delta);\n chunks.push(await this.chunkify(ev, async () => this.formatWire(holoEvent)));\n return chunks;\n }\n case 'stream_event':\n return chunks;\n case 'done':\n this.log.debug(`[HoloWireAdapter] done — finish_reason=${JSON.stringify((ev.message as Record<string, unknown>)?.['stop_reason'] ?? (ev.message as Record<string, unknown>)?.['finish_reason'])}, toolCalls=${this.toolCalls.size}`);\n chunks.push(...await this.onDoneStreaming(ev));\n return chunks;\n case 'error':\n chunks.push(...await this.onErrorStreaming(ev));\n return chunks;\n default:\n return chunks;\n }\n }\n\n protected async onDoneStreaming(ev: Extract<ProviderEvent, { type: 'done' }>): Promise<WireChunk[]> {\n const response = ev.holoResponse ?? this.buildFinalResponse(ev);\n const completedEvent: HoloStreamEvent = {\n type: 'response.completed',\n response,\n ...pickDefined({\n usage: response.usage,\n finish_reason: response.finish_reason\n })\n };\n return [await this.chunkify(ev, async () => this.formatWire(completedEvent), true, {fullText: ev.text})];\n }\n\n protected async onErrorStreaming(ev: Extract<ProviderEvent, { type: 'error' }>): Promise<WireChunk[]> {\n if (this.wireSeq === 0) {\n return this.fromNonStreaming(ev);\n }\n const status = ev.status ?? 500;\n const errorBody = typeof ev.error === 'string'\n ? {message: ev.error}\n : (ev.error ?? {message: ev.text ?? 'Unknown error'});\n const errorEvent: HoloStreamEvent = {\n type: 'response.failed',\n error: {message: errorBody.message ?? ev.text ?? String(ev.error), code: String(status)},\n };\n return [await this.chunkify(ev, async () => this.formatWire(errorEvent), true)];\n }\n\n private buildFinalResponse(ev: Extract<ProviderEvent, { type: 'done' }>): HoloResponse {\n const output: HoloMessage[] = [];\n const text = ev.text || this.textAccumulator;\n const hasToolCalls = this.toolCalls.size > 0;\n\n if (hasToolCalls) {\n const sortedCalls = [...this.toolCalls.entries()].sort((a, b) => a[0] - b[0]);\n const contentBlocks: HoloContent[] = [];\n if (text) contentBlocks.push({type: 'text', text});\n for (const [, tc] of sortedCalls) {\n let args: Record<string, unknown> = {};\n try {\n if (tc.arguments) args = JSON.parse(tc.arguments);\n } catch { /* ignore */\n }\n const block: HoloContent = tc.id\n ? {type: 'tool_call', id: tc.id, name: tc.name, arguments: args}\n : {type: 'tool_call', name: tc.name, arguments: args};\n contentBlocks.push(block);\n }\n const toolCallProjections: HoloToolCall[] = sortedCalls.map(([, tc]) => {\n let args: Record<string, unknown> = {};\n try {\n if (tc.arguments) args = JSON.parse(tc.arguments);\n } catch { /* ignore */\n }\n const call: HoloToolCall = {type: 'function', function: {name: tc.name, arguments: args}};\n if (tc.id) call.id = tc.id;\n return call;\n });\n output.push({role: 'assistant', content: contentBlocks, tool_calls: toolCallProjections});\n } else if (text) {\n output.push({role: 'assistant', content: text});\n }\n\n const usage: HoloUsage = {};\n if (ev.metrics.inputTokens) usage.input_tokens = ev.metrics.inputTokens;\n if (ev.metrics.outputTokens) usage.output_tokens = ev.metrics.outputTokens;\n const total = ev.metrics.inputTokens + ev.metrics.outputTokens;\n if (total) usage.total_tokens = total;\n\n return {\n id: this.responseId ?? ev.requestId,\n model: this.model ?? '',\n output,\n created: Date.now(),\n finish_reason: mapFinishReason(ev),\n usage,\n };\n }\n}\n\nfunction mapFinishReason(ev: Extract<ProviderEvent, {\n type: 'done'\n}>): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' | null {\n const msg = ev.message;\n if (!msg) return 'stop';\n const reason = msg.stop_reason ?? msg.finish_reason ?? msg.choices?.[0]?.finish_reason;\n switch (reason) {\n case 'end_turn':\n case 'stop':\n return 'stop';\n case 'max_tokens':\n case 'length':\n return 'length';\n case 'tool_use':\n case 'tool_calls':\n return 'tool_calls';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'stop';\n }\n}\n","export * from './base';\nexport * from './holo.wire.adapter';","import {\n type IWireAdapter,\n type ProviderDoneEvent,\n type ProviderErrorEvent,\n type ProviderEvent,\n ProviderEventType\n} from '@holokai/holo-types/provider';\nimport type {HoloWorkerRequest, WorkerResponseEnvelope} from '@holokai/holo-types/worker';\n\nexport interface ProviderEventResult {\n text: string | undefined;\n final?: HoloWorkerRequest;\n}\n\nexport async function processProviderEvents(\n events: AsyncIterable<ProviderEvent>,\n wireAdapter: IWireAdapter,\n workerRequest: HoloWorkerRequest,\n envelope: WorkerResponseEnvelope,\n publisher: {\n publishChunk(sourceId: string, requestId: string, data: object): Promise<void>,\n publishFinal(final: HoloWorkerRequest & {\n providerEvent: ProviderDoneEvent | ProviderErrorEvent\n }): Promise<void>\n }\n): Promise<ProviderEventResult> {\n const result: ProviderEventResult = {text: ''};\n for await (const evt of events) {\n if (evt.type === ProviderEventType.TEXT_DELTA) result.text += evt.text;\n for (const chunk of await wireAdapter.fromProviderEvent(evt)) {\n await publisher.publishChunk(envelope.source_id, envelope.request_id, chunk);\n }\n if (evt.type === ProviderEventType.DONE || evt.type === ProviderEventType.ERROR) {\n result.text = evt.type === ProviderEventType.DONE ? evt.text : evt.acc;\n const final = {...workerRequest, providerEvent: evt};\n if (envelope.worker_id) final.workerId = envelope.worker_id;\n result.final = final;\n await publisher.publishFinal(final);\n break;\n }\n }\n return result;\n}\n","import type {HoloWorkerRequest, HttpRequestDetails, WorkerResponseEnvelope} from '@holokai/holo-types/worker';\nimport type {Application, Provider} from '@holokai/holo-types/entities';\nimport type {ProviderProtocol} from '@holokai/holo-types/provider';\nimport {pickDefined} from '../core';\nimport {v4 as uuidv4} from 'uuid';\n\nexport interface WorkerRequestParams {\n provider: Provider;\n protocol: ProviderProtocol;\n payload: any;\n sourceId: string;\n isStreaming: boolean;\n requestId?: string | undefined;\n organizationId?: string | undefined;\n httpRequestDetails?: HttpRequestDetails | undefined;\n application?: Application | undefined;\n threadId?: string | undefined;\n branchId?: string | undefined;\n userId?: string | undefined;\n clientIdentifier?: string | undefined;\n tokenType?: string | undefined;\n appSlug?: string | undefined;\n}\n\nexport function createWorkerRequest(params: WorkerRequestParams): HoloWorkerRequest {\n return pickDefined({\n provider: params.provider,\n protocol: params.protocol,\n payload: params.payload,\n sourceId: params.sourceId,\n isStreaming: params.isStreaming,\n requestId: params.requestId ?? uuidv4(),\n organizationId: params.organizationId ?? '',\n timestamp: new Date().toISOString(),\n httpRequestDetails: params.httpRequestDetails ?? {path: '/', method: 'POST'},\n application: params.application,\n threadId: params.threadId,\n branchId: params.branchId,\n userId: params.userId,\n clientIdentifier: params.clientIdentifier,\n tokenType: params.tokenType,\n appSlug: params.appSlug,\n }) as HoloWorkerRequest;\n}\n\nexport function createResponseEnvelope(request: HoloWorkerRequest, accessModel: string, workerId?: string): WorkerResponseEnvelope {\n return pickDefined({\n source_id: request.sourceId,\n request_id: request.requestId,\n organization_id: request.organizationId,\n provider: request.provider,\n protocol: request.protocol,\n application: request.application,\n access_model: accessModel,\n user_id: request.userId,\n thread_id: request.threadId,\n client_identifier: request.clientIdentifier,\n worker_id: workerId,\n }) as WorkerResponseEnvelope;\n}\n","export * from './auditor';\nexport * from './translator';\nexport * from './base';\nexport * from './wire';\nexport * from './event-processor';\nexport * from './worker-request-factory';","import type {\n HoloContent,\n HoloContentFile,\n HoloContentImage,\n HoloContentJson,\n HoloContentProviderExtension,\n HoloContentReasoning,\n HoloContentText,\n HoloContentToolCall,\n HoloContentToolResult,\n} from '@holokai/holo-types/holo';\n\nexport function isTextContent(p: HoloContent): p is HoloContentText {\n return p.type === \"text\";\n}\n\nexport function isImageContent(p: HoloContent): p is HoloContentImage {\n return p.type === \"image\";\n}\n\nexport function isReasoningContent(p: HoloContent): p is HoloContentReasoning {\n return p.type === \"reasoning\";\n}\n\nexport function isToolCallContent(p: HoloContent): p is HoloContentToolCall {\n return p.type === \"tool_call\";\n}\n\nexport function isToolResultContent(p: HoloContent): p is HoloContentToolResult {\n return p.type === \"tool_result\";\n}\n\nexport function isJsonContent(p: HoloContent): p is HoloContentJson {\n return p.type === \"json\";\n}\n\nexport function isFileContent(p: HoloContent): p is HoloContentFile {\n return p.type === \"file\";\n}\n\nexport function isProviderExtensionContent(p: HoloContent): p is HoloContentProviderExtension {\n return p.type === \"provider_extension\";\n}\n","import {type HoloRequest} from \"@holokai/holo-types/holo\";\n\nexport const HoloRequestDefaults: Partial<HoloRequest> = {\n stream: false,\n temperature: 1.0,\n top_p: 1.0,\n tool_choice: {type: 'auto'},\n response_format: {type: 'text'}\n};\n","export * from './request-factory';","export * from './content';\nexport * from './factories';\n","export * from './plugin';\nexport * from './provider';\nexport * from './holo';\nexport * from './core';","import {injectable} from \"tsyringe\";\nimport {AppDB} from \"./app.db\";\nimport {type ProviderRequest} from \"@holokai/holo-types/entities\";\nimport {ClassLogger} from \"@holokai/holo-sdk\";\n\n@injectable()\nexport class RequestDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async getById(id: string): Promise<ProviderRequest | null> {\n return this.db.queryOne<ProviderRequest>(`SELECT *\n FROM provider_requests\n WHERE id = $1`, [id]);\n }\n\n async getByRequestId(requestId: string): Promise<ProviderRequest | null> {\n return this.db.queryOne<ProviderRequest>(`SELECT *\n FROM provider_requests\n WHERE request_id = $1`, [requestId]);\n }\n\n async listPaginated(filters: {\n org_id?: string; application_id?: string; provider_id?: string;\n access_model?: string; user_id?: string; from?: string; to?: string;\n }, limit: number, offset: number, sortBy: string, sortDir: string): Promise<{\n rows: ProviderRequest[];\n total: number\n }> {\n const conditions: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n if (filters.org_id) {\n conditions.push(`organization_id = $${idx++}`);\n params.push(filters.org_id);\n }\n if (filters.application_id) {\n conditions.push(`application_id = $${idx++}`);\n params.push(filters.application_id);\n }\n if (filters.provider_id) {\n conditions.push(`provider_id = $${idx++}`);\n params.push(filters.provider_id);\n }\n if (filters.access_model) {\n conditions.push(`access_model = $${idx++}`);\n params.push(filters.access_model);\n }\n if (filters.user_id) {\n conditions.push(`user_id = $${idx++}`);\n params.push(filters.user_id);\n }\n if (filters.from) {\n conditions.push(`timestamp >= $${idx++}`);\n params.push(filters.from);\n }\n if (filters.to) {\n conditions.push(`timestamp < $${idx++}`);\n params.push(filters.to);\n }\n\n const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';\n const allowedSorts = new Set(['timestamp', 'created_at', 'access_model']);\n const col = allowedSorts.has(sortBy) ? sortBy : 'timestamp';\n const dir = sortDir === 'asc' ? 'ASC' : 'DESC';\n\n const [rows, countResult] = await Promise.all([\n this.db.query<ProviderRequest>(`SELECT *\n FROM provider_requests ${where}\n ORDER BY ${col} ${dir}\n LIMIT $${idx++} OFFSET $${idx++}`, [...params, limit, offset]),\n this.db.queryOne<{ count: string }>(`SELECT COUNT(*)::text as count\n FROM provider_requests ${where}`, params),\n ]);\n return {rows, total: parseInt(countResult?.count ?? '0')};\n }\n\n async insert(request: Omit<ProviderRequest, 'id'>) {\n const {\n organization_id,\n request_id,\n application_id,\n provider_id,\n protocol_id,\n user_id,\n client_identifier,\n access_model,\n has_tools,\n thread_id,\n created_at,\n metadata,\n request_raw,\n system_prompt,\n last_user_prompt\n } = request;\n\n const query = `\n INSERT INTO provider_requests\n (organization_id, request_id, application_id, provider_id, protocol_id, user_id, client_identifier,\n access_model, has_tools, thread_id, created_at, metadata, request_raw, system_prompt, last_user_prompt)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\n `;\n\n await this.db.query(query, [\n organization_id,\n request_id,\n application_id,\n provider_id,\n protocol_id,\n user_id,\n client_identifier,\n access_model,\n has_tools ?? false,\n thread_id,\n created_at,\n metadata,\n request_raw ?? null,\n system_prompt ?? null,\n last_user_prompt ?? null\n ]);\n }\n}\n","import {injectable} from \"tsyringe\";\nimport {AppDB} from \"./app.db\";\nimport {type ProviderResponse, type ProviderResponseView} from \"@holokai/holo-types/entities\";\n\n@injectable()\nexport class ResponseDB {\n constructor(private db: AppDB) {\n\n }\n\n async getById(id: string): Promise<ProviderResponseView | null> {\n return this.db.queryOne<ProviderResponseView>(\n `SELECT pr.*,\n a.name as application_name,\n prov.name as provider_name,\n pl.name as plugin_name,\n pl.version as plugin_version,\n prot.name as protocol_name\n FROM provider_responses pr\n LEFT JOIN applications a ON pr.application_id = a.id\n LEFT JOIN providers prov ON pr.provider_id = prov.id\n LEFT JOIN plugins pl ON prov.plugin_id = pl.id\n LEFT JOIN protocols prot ON pr.protocol_id = prot.id\n WHERE pr.id = $1`, [id]\n );\n }\n\n async listPaginated(filters: {\n org_id?: string; application_id?: string; provider_id?: string;\n access_model?: string; user_id?: string; client_identifier?: string;\n status?: string; from?: string; to?: string;\n }, limit: number, offset: number, sortBy: string, sortDir: string): Promise<{\n rows: ProviderResponseView[];\n total: number\n }> {\n const conditions: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n if (filters.org_id) {\n conditions.push(`pr.organization_id = $${idx++}`);\n params.push(filters.org_id);\n }\n if (filters.application_id) {\n conditions.push(`pr.application_id = $${idx++}`);\n params.push(filters.application_id);\n }\n if (filters.provider_id) {\n conditions.push(`pr.provider_id = $${idx++}`);\n params.push(filters.provider_id);\n }\n if (filters.access_model) {\n conditions.push(`pr.access_model = $${idx++}`);\n params.push(filters.access_model);\n }\n if (filters.user_id) {\n conditions.push(`pr.user_id = $${idx++}`);\n params.push(filters.user_id);\n }\n if (filters.client_identifier) {\n conditions.push(`pr.client_identifier = $${idx++}`);\n params.push(filters.client_identifier);\n }\n if (filters.status) {\n conditions.push(`pr.status = $${idx++}`);\n params.push(filters.status);\n }\n if (filters.from) {\n conditions.push(`pr.created_at >= $${idx++}`);\n params.push(filters.from);\n }\n if (filters.to) {\n conditions.push(`pr.created_at < $${idx++}`);\n params.push(filters.to);\n }\n\n const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';\n const allowedSorts = new Set(['created_at', 'input_tokens', 'output_tokens', 'cost', 'score', 'status', 'access_model', 'total_processing_time']);\n const col = allowedSorts.has(sortBy) ? sortBy : 'created_at';\n const dir = sortDir === 'asc' ? 'ASC' : 'DESC';\n\n const baseQuery = `\n FROM provider_responses pr\n LEFT JOIN applications a ON pr.application_id = a.id\n LEFT JOIN providers prov ON pr.provider_id = prov.id\n ${where}`;\n\n const [rows, countResult] = await Promise.all([\n this.db.query<ProviderResponseView>(\n `SELECT pr.*, a.name as application_name, prov.name as provider_name ${baseQuery} ORDER BY pr.${col} ${dir} LIMIT $${idx++} OFFSET $${idx++}`,\n [...params, limit, offset]\n ),\n this.db.queryOne<{ count: string }>(`SELECT COUNT(*)::text as count ${baseQuery}`, params),\n ]);\n return {rows, total: parseInt(countResult?.count ?? '0')};\n }\n\n async getFilters(orgId?: string): Promise<{\n applications: string[];\n providers: string[];\n models: string[];\n statuses: string[]\n }> {\n const where = orgId ? 'WHERE pr.organization_id = $1' : '';\n const params = orgId ? [orgId] : [];\n\n const [applications, providers, models, statuses] = await Promise.all([\n this.db.query<{ name: string }>(`SELECT DISTINCT a.name\n FROM provider_responses pr\n JOIN applications a ON pr.application_id = a.id ${where}\n ORDER BY a.name`, params),\n this.db.query<{ name: string }>(`SELECT DISTINCT prov.name\n FROM provider_responses pr\n JOIN providers prov ON pr.provider_id = prov.id ${where}\n ORDER BY prov.name`, params),\n this.db.query<{ access_model: string }>(`SELECT DISTINCT pr.access_model\n FROM provider_responses pr ${where}\n ORDER BY pr.access_model`, params),\n this.db.query<{ status: string }>(`SELECT DISTINCT pr.status\n FROM provider_responses pr ${where}\n ORDER BY pr.status`, params),\n ]);\n return {\n applications: applications.map(r => r.name),\n providers: providers.map(r => r.name),\n models: models.map(r => r.access_model),\n statuses: statuses.map(r => r.status),\n };\n }\n\n async insert(response: Omit<ProviderResponse, 'id'>): Promise<{ id: string } | null> {\n const {\n organization_id,\n request_id,\n application_id,\n provider_id,\n protocol_id,\n user_id,\n client_identifier,\n access_model,\n status,\n finish_reason,\n response: responseText,\n response_raw,\n input_tokens,\n output_tokens,\n time_to_first_token,\n total_processing_time,\n cost,\n score,\n created_at,\n metadata,\n usage_raw,\n total_tokens\n } = response;\n\n const query = `\n INSERT INTO provider_responses\n (organization_id, request_id, application_id, provider_id, protocol_id, user_id, client_identifier,\n access_model,\n status, finish_reason, response, response_raw, input_tokens, output_tokens, time_to_first_token,\n total_processing_time,\n cost, score, created_at, metadata, usage_raw, total_tokens)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22)\n RETURNING id\n `;\n\n return this.db.queryOne<{ id: string }>(query, [\n organization_id,\n request_id,\n application_id,\n provider_id,\n protocol_id,\n user_id,\n client_identifier,\n access_model,\n status,\n finish_reason,\n responseText,\n response_raw ?? null,\n input_tokens,\n output_tokens,\n time_to_first_token,\n total_processing_time,\n cost,\n score,\n created_at,\n metadata,\n usage_raw,\n total_tokens\n ]);\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {ClassLogger} from '@holokai/holo-sdk';\n\nexport interface ApiCredential {\n id: string;\n organization_id: string;\n encrypted_value: string;\n initialization_vector: string;\n created_at: Date;\n updated_at: Date;\n}\n\n@injectable()\nexport class ApiCredentialDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async get(id: string): Promise<ApiCredential | null> {\n const query = `\n SELECT id, organization_id, encrypted_value, initialization_vector, created_at, updated_at\n FROM api_credentials\n WHERE id = $1\n `;\n return this.db.queryOne<ApiCredential>(query, [id]);\n }\n\n async getByOrganization(organizationId: string): Promise<ApiCredential[]> {\n const query = `\n SELECT id, organization_id, encrypted_value, initialization_vector, created_at, updated_at\n FROM api_credentials\n WHERE organization_id = $1\n ORDER BY created_at DESC\n `;\n return this.db.query<ApiCredential>(query, [organizationId]);\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport {type HoloToken} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class HoloTokenDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async getById(id: string): Promise<HoloToken | null> {\n const query = `\n SELECT *\n FROM holo_tokens\n WHERE id = $1\n `;\n return this.db.queryOne<HoloToken>(query, [id]);\n }\n\n async getByHash(keyHash: string): Promise<HoloToken | null> {\n const query = `\n SELECT *\n FROM holo_tokens\n WHERE key_hash = $1\n AND active = true\n `;\n return this.db.queryOne<HoloToken>(query, [keyHash]);\n }\n\n async getByUser(userId: string): Promise<HoloToken[]> {\n const query = `\n SELECT *\n FROM holo_tokens\n WHERE user_id = $1\n ORDER BY created_at DESC\n `;\n return this.db.query<HoloToken>(query, [userId]);\n }\n\n async getByApplication(applicationId: string): Promise<HoloToken[]> {\n const query = `\n SELECT *\n FROM holo_tokens\n WHERE application_id = $1\n ORDER BY created_at DESC\n `;\n return this.db.query<HoloToken>(query, [applicationId]);\n }\n\n async getByOrganization(orgId: string): Promise<HoloToken[]> {\n const query = `\n SELECT *\n FROM holo_tokens\n WHERE organization_id = $1\n ORDER BY created_at DESC\n `;\n return this.db.query<HoloToken>(query, [orgId]);\n }\n\n async create(token: Pick<HoloToken, 'organization_id' | 'user_id' | 'application_id' | 'key_hash' | 'key_prefix' | 'key_suffix' | 'name' | 'expires_at'>): Promise<HoloToken> {\n const query = `\n INSERT INTO holo_tokens (organization_id, user_id, application_id, key_hash, key_prefix, key_suffix, name,\n expires_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n RETURNING *\n `;\n\n const result = await this.db.queryOne<HoloToken>(query, [\n token.organization_id,\n token.user_id || null,\n token.application_id || null,\n token.key_hash,\n token.key_prefix,\n token.key_suffix,\n token.name || null,\n token.expires_at || null,\n ]);\n return result!;\n }\n\n async deactivate(id: string): Promise<void> {\n const query = `\n UPDATE holo_tokens\n SET active = false,\n updated_at = now()\n WHERE id = $1\n `;\n await this.db.query(query, [id]);\n }\n\n async updateLastUsed(id: string): Promise<void> {\n const query = `\n UPDATE holo_tokens\n SET last_used_at = now(),\n updated_at = now()\n WHERE id = $1\n `;\n await this.db.query(query, [id]);\n }\n}\n","import 'reflect-metadata';\nimport {AppDB} from \"./app.db\";\nimport {injectable} from \"tsyringe\";\nimport {type Model} from \"@holokai/holo-types/entities\";\n\n@injectable()\nexport class ModelDB {\n constructor(private db: AppDB) {\n }\n\n async list(): Promise<Model[]> {\n return this.db.systemQuery<Model>(\n `SELECT *\n FROM models\n WHERE active = true\n ORDER BY name`\n );\n }\n\n async listWithProvider(): Promise<(Model & { provider_type?: string; plugin_id?: string })[]> {\n return this.db.systemQuery(\n `SELECT m.*, p.type as provider_type, p.plugin_id\n FROM models m\n JOIN providers p ON m.provider_id = p.id\n WHERE m.active = true\n ORDER BY m.name`\n );\n }\n\n async get(name: string): Promise<Model | null> {\n return this.db.systemQueryOne<Model>(\n `SELECT *\n FROM models\n WHERE name = $1\n AND active = true`,\n [name]\n );\n }\n\n async getByAccessModel(accessModel: string, providerId: string): Promise<Model | null> {\n return this.db.systemQueryOne<Model>(\n `SELECT *\n FROM models\n WHERE access_model = $1\n AND provider_id = $2\n AND active = true\n LIMIT 1`,\n [accessModel, providerId]\n );\n }\n\n async getById(id: string): Promise<Model | null> {\n return this.db.systemQueryOne<Model>(\n `SELECT *\n FROM models\n WHERE id = $1\n AND active = true`,\n [id]\n );\n }\n\n async listByProvider(providerId: string): Promise<Model[]> {\n return this.db.systemQuery<Model>(\n `SELECT *\n FROM models\n WHERE provider_id = $1\n AND active = true\n ORDER BY name`,\n [providerId]\n );\n }\n\n async listAllByProvider(providerId: string): Promise<Model[]> {\n return this.db.systemQuery<Model>(\n `SELECT *\n FROM models\n WHERE provider_id = $1\n AND deleted = false\n ORDER BY name`,\n [providerId]\n );\n }\n\n async listUnlinked(): Promise<(Model & { provider_type?: string })[]> {\n return this.db.systemQuery(\n `SELECT m.*, p.type as provider_type\n FROM models m\n JOIN providers p ON m.provider_id = p.id\n WHERE m.active = true\n AND (m.dictionary_id IS NULL OR m.match_status = 'unmatched')\n AND m.access_model IS NOT NULL\n ORDER BY m.name`\n );\n }\n\n async listByOrganization(orgId: string): Promise<Model[]> {\n return this.db.systemQuery<Model>(\n `SELECT *\n FROM models\n WHERE organization_id = $1\n AND active = true\n ORDER BY name`,\n [orgId]\n );\n }\n\n async listPaginated(filters: {\n org_id?: string; provider_id?: string; search?: string;\n }, limit: number, offset: number, sortBy: string, sortDir: string): Promise<{ rows: Model[]; total: number }> {\n const conditions: string[] = ['active = true'];\n const params: any[] = [];\n let idx = 1;\n\n if (filters.org_id) {\n conditions.push(`organization_id = $${idx++}`);\n params.push(filters.org_id);\n }\n if (filters.provider_id) {\n conditions.push(`provider_id = $${idx++}`);\n params.push(filters.provider_id);\n }\n if (filters.search) {\n conditions.push(`(name ILIKE $${idx} OR access_model ILIKE $${idx})`);\n params.push(`%${filters.search}%`);\n idx++;\n }\n\n const where = conditions.join(' AND ');\n const allowedSorts = new Set(['name', 'access_model', 'created_at', 'updated_at']);\n const col = allowedSorts.has(sortBy) ? sortBy : 'created_at';\n const dir = sortDir === 'asc' ? 'ASC' : 'DESC';\n\n const limitIdx = idx++;\n const offsetIdx = idx++;\n return this.db.asSystem(async (client) => {\n const [rowsResult, countResult] = await Promise.all([\n client.query(`SELECT *\n FROM models\n WHERE ${where}\n ORDER BY ${col} ${dir}\n LIMIT $${limitIdx} OFFSET $${offsetIdx}`, [...params, limit, offset]),\n client.query(`SELECT COUNT(*)::text as count\n FROM models\n WHERE ${where}`, params),\n ]);\n return {\n rows: rowsResult.rows as Model[],\n total: parseInt(countResult.rows[0]?.count ?? '0'),\n };\n });\n }\n\n async create(model: Omit<Model, 'id' | 'created_at' | 'updated_at'>): Promise<Model | null> {\n return this.db.systemQueryOne<Model>(\n `INSERT INTO models (name, access_model, provider_id, version, description, context_length,\n modality, input_modalities, output_modalities, supported_parameters,\n parameters, metadata, pricing_per_tokens, benchmarks, customization,\n enabled, available, deleted, dictionary_id,\n raw_name, normalized_name, match_status, match_confidence,\n match_method, match_metadata, matched_at,\n source_type, source_key, family_detected)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19,\n $20, $21, $22, $23, $24, $25, $26, $27, $28, $29)\n RETURNING *`,\n [\n model.name, model.access_model ?? null, model.provider_id, model.version,\n model.description ?? null, model.context_length ?? null, model.modality ?? null,\n JSON.stringify(model.input_modalities ?? []), JSON.stringify(model.output_modalities ?? []),\n JSON.stringify(model.supported_parameters ?? []),\n JSON.stringify(model.parameters ?? {}), JSON.stringify(model.metadata ?? {}),\n JSON.stringify(model.pricing_per_tokens ?? {}), JSON.stringify(model.benchmarks ?? {}),\n JSON.stringify(model.customization ?? {}), model.enabled, model.available, model.deleted,\n model.dictionary_id ?? null,\n model.raw_name ?? null, model.normalized_name ?? null,\n model.match_status ?? 'unmatched', model.match_confidence ?? null,\n model.match_method ?? null,\n model.match_metadata ? JSON.stringify(model.match_metadata) : null,\n model.matched_at ?? null,\n model.source_type ?? null, model.source_key ?? null, model.family_detected ?? null,\n ]\n );\n }\n\n async update(id: string, fields: Partial<Model>): Promise<Model | null> {\n const sets: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n const simple: (keyof Model)[] = [\n 'name', 'access_model', 'version', 'description', 'context_length', 'modality',\n 'enabled', 'available', 'provider_id', 'dictionary_id',\n 'raw_name', 'normalized_name', 'match_status', 'match_confidence', 'match_method',\n 'matched_at', 'source_type', 'source_key', 'family_detected',\n ];\n for (const key of simple) {\n if (fields[key] !== undefined) {\n sets.push(`${key} = $${idx++}`);\n params.push(fields[key]);\n }\n }\n const json: (keyof Model)[] = [\n 'input_modalities', 'output_modalities', 'supported_parameters',\n 'parameters', 'metadata', 'pricing_per_tokens', 'benchmarks', 'customization',\n 'match_metadata',\n ];\n for (const key of json) {\n if (fields[key] !== undefined) {\n sets.push(`${key} = $${idx++}`);\n params.push(JSON.stringify(fields[key]));\n }\n }\n\n if (sets.length === 0) return this.db.systemQueryOne<Model>(`SELECT *\n FROM models\n WHERE id = $1`, [id]);\n\n sets.push(`updated_at = now()`);\n params.push(id);\n return this.db.systemQueryOne<Model>(`UPDATE models\n SET ${sets.join(', ')}\n WHERE id = $${idx} AND active = true RETURNING *`, params);\n }\n\n async updateModalities(id: string, fields: {\n modality?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n supported_parameters?: string[];\n context_length?: number;\n }): Promise<Model | null> {\n const sets: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n if (fields.modality !== undefined) {\n sets.push(`modality = $${idx++}`);\n params.push(fields.modality);\n }\n if (fields.context_length !== undefined) {\n sets.push(`context_length = $${idx++}`);\n params.push(fields.context_length);\n }\n if (fields.input_modalities !== undefined) {\n sets.push(`input_modalities = $${idx++}`);\n params.push(JSON.stringify(fields.input_modalities));\n }\n if (fields.output_modalities !== undefined) {\n sets.push(`output_modalities = $${idx++}`);\n params.push(JSON.stringify(fields.output_modalities));\n }\n if (fields.supported_parameters !== undefined) {\n sets.push(`supported_parameters = $${idx++}`);\n params.push(JSON.stringify(fields.supported_parameters));\n }\n\n if (sets.length === 0) return null;\n\n sets.push(`updated_at = now()`);\n params.push(id);\n return this.db.systemQueryOne<Model>(`UPDATE models\n SET ${sets.join(', ')}\n WHERE id = $${idx} RETURNING *`, params);\n }\n\n async softDelete(id: string): Promise<boolean> {\n const result = await this.db.systemQueryOne<Model>(\n `UPDATE models\n SET deleted = true,\n updated_at = now()\n WHERE id = $1\n RETURNING id`,\n [id]\n );\n return result !== null;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {ClassLogger} from '@holokai/holo-sdk';\n\n@injectable()\nexport class AccessDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async hasAccess(orgId: string, userId: string, applicationId: string): Promise<boolean> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(ACCESS_CHECK_QUERY, [userId, applicationId]);\n return result.rows[0]?.exists ?? false;\n });\n }\n\n async getAccessibleApplicationIds(userId: string, orgId: string): Promise<string[]> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(ACCESSIBLE_APPS_QUERY, [userId, orgId]);\n return result.rows.map((r: { id: string }) => r.id);\n });\n }\n\n async getUserEmailById(orgId: string, userId: string): Promise<string | null> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(\n `SELECT email\n FROM app_users\n WHERE id = $1`, [userId]\n );\n return result.rows[0]?.email ?? null;\n });\n }\n\n async getUserIdByEmail(orgId: string, email: string): Promise<string | null> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(\n `SELECT id\n FROM app_users\n WHERE upper(email) = upper($1)`, [email]\n );\n return result.rows[0]?.id ?? null;\n });\n }\n\n async hasModelAccess(orgId: string, userId: string, applicationId: string, accessModel: string): Promise<boolean> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(MODEL_ACCESS_QUERY, [userId, applicationId, accessModel]);\n return result.rows[0]?.exists ?? false;\n });\n }\n}\n\nconst ACCESS_CHECK_QUERY = `\n SELECT EXISTS (SELECT 1\n FROM user_applications\n WHERE user_id = $1\n AND application_id = $2\n UNION ALL\n SELECT 1\n FROM user_teams ut\n JOIN teams user_team ON ut.team_id = user_team.id\n JOIN team_applications ta ON ta.application_id = $2\n JOIN teams app_team ON ta.team_id = app_team.id\n WHERE ut.user_id = $1\n AND app_team.path <@ user_team.path\n UNION ALL\n SELECT 1\n FROM applications a\n JOIN app_users u ON u.organization_id = a.organization_id\n WHERE a.id = $2\n AND u.id = $1\n AND a.access_level = 'organization'\n UNION ALL\n SELECT 1\n FROM applications\n WHERE id = $2\n AND access_level = 'anonymous')\n`;\n\nconst ACCESSIBLE_APPS_QUERY = `\n SELECT DISTINCT a.id\n FROM applications a\n WHERE a.active = true\n AND a.organization_id = $2\n AND (\n EXISTS (SELECT 1 FROM user_applications ua WHERE ua.user_id = $1 AND ua.application_id = a.id)\n OR EXISTS (SELECT 1\n FROM user_teams ut\n JOIN teams user_team ON ut.team_id = user_team.id\n JOIN team_applications ta ON ta.application_id = a.id\n JOIN teams app_team ON ta.team_id = app_team.id\n WHERE ut.user_id = $1\n AND app_team.path <@ user_team.path)\n OR (a.access_level = 'organization' AND\n EXISTS (SELECT 1 FROM app_users u WHERE u.id = $1 AND u.organization_id = a.organization_id))\n OR a.access_level = 'anonymous'\n )\n`;\n\nconst MODEL_ACCESS_QUERY = `\n SELECT EXISTS (SELECT 1\n FROM applications a\n JOIN application_models am ON am.application_id = a.id\n JOIN models m ON m.id = am.model_id\n WHERE a.id = $2\n AND m.access_model = $3\n AND m.active = true\n AND (\n EXISTS (SELECT 1 FROM user_applications WHERE user_id = $1 AND application_id = a.id)\n OR EXISTS (SELECT 1\n FROM user_teams ut\n JOIN teams user_team ON ut.team_id = user_team.id\n JOIN team_applications ta ON ta.application_id = a.id\n JOIN teams app_team ON ta.team_id = app_team.id\n WHERE ut.user_id = $1\n AND app_team.path <@ user_team.path)\n OR (a.access_level = 'organization' AND EXISTS (SELECT 1\n FROM app_users u\n WHERE u.id = $1\n AND u.organization_id = a.organization_id))\n OR a.access_level = 'anonymous'\n ))\n`;\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport type {Plugin} from '@holokai/holo-types/entities';\nimport {PluginType} from \"@holokai/holo-types/plugin\";\n\nconst PLUGIN_COLS = 'id, family, name, type, version, default_pricing_plan_id, active, sha256, size_bytes, source, installed_by, schema, created_at, updated_at';\n\n@injectable()\nexport class PluginDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async upsert(\n family: string, name: string, version: string, type: PluginType,\n opts?: {\n tarball?: Buffer;\n sha256?: string;\n source?: string;\n installedBy?: string;\n schema?: Record<string, any>\n }\n ): Promise<Plugin | null> {\n const query = `\n INSERT INTO plugins (family, version, name, type, tarball, sha256, size_bytes, source, installed_by, schema)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n ON CONFLICT (family, version) DO UPDATE SET name = EXCLUDED.name,\n active = true,\n tarball = COALESCE(EXCLUDED.tarball, plugins.tarball),\n sha256 = COALESCE(EXCLUDED.sha256, plugins.sha256),\n size_bytes = COALESCE(EXCLUDED.size_bytes, plugins.size_bytes),\n source = COALESCE(EXCLUDED.source, plugins.source),\n schema = COALESCE(EXCLUDED.schema, plugins.schema),\n updated_at = now()\n RETURNING ${PLUGIN_COLS}\n `;\n return this.db.queryOne<Plugin>(query, [\n family.toUpperCase(), version, name, type.toUpperCase(),\n opts?.tarball ?? null, opts?.sha256 ?? null,\n opts?.tarball?.length ?? null, opts?.source ?? null, opts?.installedBy ?? null,\n opts?.schema ? JSON.stringify(opts.schema) : null,\n ]);\n }\n\n async store(\n name: string, version: string, family: string, type: string,\n tarball: Buffer, sha256: string, source: string, installedBy?: string,\n schema?: Record<string, any>,\n ): Promise<Plugin | null> {\n const query = `\n INSERT INTO plugins (family, version, name, type, tarball, sha256, size_bytes, source, installed_by, schema,\n active)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, true)\n ON CONFLICT (family, version) DO UPDATE SET tarball = EXCLUDED.tarball,\n sha256 = EXCLUDED.sha256,\n size_bytes = EXCLUDED.size_bytes,\n source = EXCLUDED.source,\n type = EXCLUDED.type,\n schema = COALESCE(EXCLUDED.schema, plugins.schema),\n active = true,\n updated_at = now()\n RETURNING ${PLUGIN_COLS}\n `;\n return this.db.queryOne<Plugin>(query, [\n family.toUpperCase(), version, name, type.toUpperCase(),\n tarball, sha256, tarball.length, source, installedBy ?? null,\n schema ? JSON.stringify(schema) : null,\n ]);\n }\n\n async updateSchema(pluginId: string, schema: Record<string, any>): Promise<void> {\n await this.db.query(\n `UPDATE plugins\n SET schema = $1,\n updated_at = now()\n WHERE id = $2`,\n [JSON.stringify(schema), pluginId]\n );\n }\n\n async getSha256(family: string, version: string): Promise<string | null> {\n const row = await this.db.queryOne<{ sha256: string }>(\n `SELECT sha256\n FROM plugins\n WHERE family = $1\n AND version = $2\n AND sha256 IS NOT NULL\n AND active = true`,\n [family.toUpperCase(), version]\n );\n return row?.sha256 ?? null;\n }\n\n async getTarball(family: string, version: string): Promise<Buffer | null> {\n const row = await this.db.queryOne<{ tarball: Buffer }>(\n `SELECT tarball\n FROM plugins\n WHERE family = $1\n AND version = $2`,\n [family.toUpperCase(), version]\n );\n return row?.tarball ?? null;\n }\n\n async getTarballById(pluginId: string): Promise<Buffer | null> {\n const row = await this.db.queryOne<{ tarball: Buffer }>(\n `SELECT tarball\n FROM plugins\n WHERE id = $1`,\n [pluginId]\n );\n return row?.tarball ?? null;\n }\n\n async hasVersion(family: string, version: string): Promise<boolean> {\n const count = await this.db.queryScalar<number>(\n `SELECT COUNT(*)\n FROM plugins\n WHERE family = $1\n AND version = $2`,\n [family.toUpperCase(), version]\n );\n return (count ?? 0) > 0;\n }\n\n async listActive(): Promise<Plugin[]> {\n return this.db.query<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE active = true\n ORDER BY family, created_at DESC`\n );\n }\n\n async listAll(): Promise<Plugin[]> {\n return this.db.query<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n ORDER BY family, created_at DESC`\n );\n }\n\n async getByName(name: string): Promise<Plugin | null> {\n return this.db.queryOne<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE name = $1\n ORDER BY created_at DESC\n LIMIT 1`,\n [name]\n );\n }\n\n async getByNameAndVersion(name: string, version: string): Promise<Plugin | null> {\n return this.db.queryOne<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE name = $1\n AND version = $2`,\n [name, version]\n );\n }\n\n async listByType(type: PluginType, active = true): Promise<Plugin[]> {\n return this.db.query(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE type = $1\n AND active = $2`,\n [type, active]\n );\n }\n\n async setDefaultPricingPlan(pluginId: string, planId: string): Promise<void> {\n await this.db.query(\n `UPDATE plugins\n SET default_pricing_plan_id = $1,\n updated_at = now()\n WHERE id = $2`,\n [planId, pluginId]\n );\n }\n\n\n async deactivate(pluginId: string): Promise<void> {\n await this.db.query(\n `UPDATE plugins\n SET active = false,\n updated_at = now()\n WHERE id = $1`,\n [pluginId]\n );\n }\n\n async hardDelete(pluginId: string): Promise<void> {\n await this.db.query(`DELETE\n FROM providers\n WHERE plugin_id = $1`, [pluginId]);\n await this.db.query(`DELETE\n FROM datastores\n WHERE plugin_id = $1`, [pluginId]);\n await this.db.query(`DELETE\n FROM server_plugins\n WHERE plugin_id = $1`, [pluginId]);\n await this.db.query(`DELETE\n FROM protocols\n WHERE plugin_id = $1`, [pluginId]);\n await this.db.query(`DELETE\n FROM plugins\n WHERE id = $1`, [pluginId]);\n }\n\n async getById(id: string): Promise<Plugin | null> {\n return this.db.queryOne<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE id = $1\n AND active = true`,\n [id]\n );\n }\n\n async getByFamilyAndVersion(family: string, version: string): Promise<Plugin | null> {\n return this.db.queryOne<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE family = $1\n AND version = $2`,\n [family.toUpperCase(), version]\n );\n }\n\n async getAvailableVersions(family: string): Promise<Plugin[]> {\n return this.db.query<Plugin>(\n `SELECT ${PLUGIN_COLS}\n FROM plugins\n WHERE family = $1\n AND active = true\n ORDER BY created_at DESC`,\n [family.toUpperCase()]\n );\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport type {Protocol} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class ProtocolDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async upsert(pluginId: string, name: string, capability: string, path?: string): Promise<Protocol> {\n const query = `\n INSERT INTO protocols (plugin_id, name, capability, path)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (plugin_id, name) DO UPDATE SET name = EXCLUDED.name,\n capability = EXCLUDED.capability,\n path = EXCLUDED.path\n RETURNING *\n `;\n const result = await this.db.queryOne<Protocol>(query, [pluginId, name, capability, path || null]);\n return result!;\n }\n\n async getByPluginAndKey(pluginId: string, name: string): Promise<Protocol | null> {\n return this.db.queryOne<Protocol>(\n `SELECT *\n FROM protocols\n WHERE plugin_id = $1\n AND name = $2`,\n [pluginId, name]\n );\n }\n\n async getByPlugin(pluginId: string): Promise<Protocol[]> {\n return this.db.query<Protocol>(\n `SELECT *\n FROM protocols\n WHERE plugin_id = $1\n AND active = true\n ORDER BY name`,\n [pluginId]\n );\n }\n\n async listActiveRoutes(): Promise<Array<{\n family: string;\n protocol_name: string;\n capability: string;\n path: string | null;\n plugin_id: string\n }>> {\n return this.db.query(\n `SELECT DISTINCT pl.family, pr.name AS protocol_name, pr.capability, pr.path, pr.plugin_id\n FROM protocols pr\n JOIN plugins pl ON pr.plugin_id = pl.id\n WHERE pl.active = true\n AND pr.active = true\n ORDER BY pl.family, pr.name`\n );\n }\n\n async listActiveGrouped(): Promise<Map<string, string[]>> {\n const rows = await this.db.query<{ plugin_id: string; capabilities: string[] }>(\n `SELECT plugin_id, array_agg(DISTINCT capability) as capabilities\n FROM protocols\n WHERE active = true\n GROUP BY plugin_id`\n );\n const map = new Map<string, string[]>();\n for (const row of rows) {\n map.set(row.plugin_id, row.capabilities);\n }\n return map;\n }\n}\n","import 'reflect-metadata';\nimport os from 'os';\nimport {injectable} from \"tsyringe\";\nimport {ClassLogger} from \"@holokai/holo-sdk\";\nimport {AppDB} from \"./app.db\";\nimport {type Server, ServerType} from \"@holokai/holo-types/entities\";\n\n@injectable()\nexport class ServerDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async upsert(name: string, type: ServerType): Promise<Server | null> {\n const query = `\n INSERT INTO servers (name, type)\n VALUES ($1, $2)\n ON CONFLICT (name) DO UPDATE SET last_online = now()\n RETURNING *\n `;\n return this.db.queryOne<Server>(query, [name, type]);\n }\n\n async ping(serverId: string): Promise<void> {\n await this.db.query(`UPDATE servers\n SET last_online = now()\n WHERE id = $1`, [serverId]);\n }\n\n async getByName(name: string): Promise<Server | null> {\n return this.db.queryOne<Server>(\n `SELECT *\n FROM servers\n WHERE name = $1`,\n [name]);\n }\n\n async registerPlugin(serverName: string, pluginId: string): Promise<boolean> {\n const query = `\n INSERT INTO server_plugins (server_id, plugin_id)\n SELECT s.id, $2\n FROM servers s\n WHERE s.name = $1\n ON CONFLICT (server_id, plugin_id) DO NOTHING\n RETURNING *\n `;\n const result = await this.db.queryOne<{ server_id: string, plugin_id: string }>(query, [serverName, pluginId]);\n return result != null;\n }\n\n async recordHeartbeat(serverId: string): Promise<void> {\n const nets = os.networkInterfaces();\n const ip = Object.values(nets).flat().find(n => n && !n.internal && n.family === 'IPv4')?.address;\n\n const query = `\n INSERT INTO server_heartbeats\n (server_id, hostname, ip_address, platform, arch, node_version,\n memory_total, memory_free, cpu_count, uptime, pid)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\n `;\n await this.db.query(query, [\n serverId,\n os.hostname(),\n ip || null,\n os.platform(),\n os.arch(),\n process.version,\n os.totalmem(),\n os.freemem(),\n os.cpus().length,\n Math.floor(process.uptime()),\n process.pid,\n ]);\n }\n\n async getPluginsByServer(serverName: string): Promise<any[]> {\n return this.db.query(\n `SELECT p.*\n FROM plugins p\n JOIN server_plugins sp ON sp.plugin_id = p.id\n JOIN servers s ON s.id = sp.server_id\n WHERE s.name = $1\n AND p.active = true`,\n [serverName]\n );\n }\n\n async syncPlugins(serverName: string, activePluginIds: string[]): Promise<number> {\n if (!activePluginIds.length) {\n const result = await this.db.query(\n `DELETE\n FROM server_plugins\n WHERE server_id = (SELECT id FROM servers WHERE name = $1)`,\n [serverName]\n );\n return (result as any).rowCount ?? 0;\n }\n\n const placeholders = activePluginIds.map((_, i) => `$${i + 2}`).join(', ');\n const result = await this.db.query(\n `DELETE\n FROM server_plugins\n WHERE server_id = (SELECT id FROM servers WHERE name = $1)\n AND plugin_id NOT IN (${placeholders})`,\n [serverName, ...activePluginIds]\n );\n return (result as any).rowCount ?? 0;\n }\n\n async deactivateStaleServers(thresholdMinutes: number): Promise<number> {\n const result = await this.db.query(\n `UPDATE servers\n SET active = false,\n updated_at = now()\n WHERE active = true\n AND last_online < NOW() - ($1 || ' minutes')::interval`,\n [thresholdMinutes.toString()]\n );\n const count = (result as any).rowCount ?? 0;\n if (count > 0) {\n await this.db.query(\n `DELETE\n FROM server_plugins\n WHERE server_id IN (SELECT id FROM servers WHERE active = false)`\n );\n }\n return count;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport type {PricingPlan, PricingSheet, PricingSheetModel} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class PricingDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async upsertPlan(\n pluginFamily: string,\n name: string,\n source: string,\n isDefault: boolean,\n readOnly: boolean,\n description?: string,\n currency = 'USD'\n ): Promise<PricingPlan | null> {\n const existing = await this.findDefaultPlan(pluginFamily);\n if (existing) {\n return this.db.queryOne<PricingPlan>(\n `UPDATE pricing_plans\n SET name = $1,\n description = $2,\n currency = $3,\n read_only = $4,\n updated_at = now()\n WHERE id = $5\n RETURNING *`,\n [name, description ?? null, currency, readOnly, existing.id]\n );\n }\n return this.db.queryOne<PricingPlan>(\n `INSERT INTO pricing_plans (plugin_family, name, description, currency, source, is_default, read_only)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n RETURNING *`,\n [pluginFamily.toUpperCase(), name, description ?? null, currency, source, isDefault, readOnly]\n );\n }\n\n async findDefaultPlan(pluginFamily: string): Promise<PricingPlan | null> {\n return this.db.queryOne<PricingPlan>(\n `SELECT *\n FROM pricing_plans\n WHERE plugin_family = $1\n AND is_default = true\n AND active = true`,\n [pluginFamily.toUpperCase()]\n );\n }\n\n async findPlanById(id: string): Promise<PricingPlan | null> {\n return this.db.queryOne<PricingPlan>(\n `SELECT *\n FROM pricing_plans\n WHERE id = $1`, [id]\n );\n }\n\n async upsertSheet(\n planId: string,\n name: string,\n version: string,\n effectiveFrom: string,\n effectiveTo?: string,\n notes?: string\n ): Promise<PricingSheet | null> {\n return this.db.queryOne<PricingSheet>(\n `INSERT INTO pricing_sheets (plan_id, name, version, effective_from, effective_to, notes)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (plan_id, version)\n DO UPDATE SET name = EXCLUDED.name,\n effective_from = EXCLUDED.effective_from,\n effective_to = EXCLUDED.effective_to,\n notes = EXCLUDED.notes,\n updated_at = now()\n RETURNING *`,\n [planId, name, version, effectiveFrom, effectiveTo ?? null, notes ?? null]\n );\n }\n\n async findEffectiveSheet(planId: string, at: Date): Promise<PricingSheet | null> {\n return this.db.queryOne<PricingSheet>(\n `SELECT *\n FROM pricing_sheets\n WHERE plan_id = $1\n AND effective_from <= $2\n AND (effective_to IS NULL OR effective_to > $2)\n ORDER BY effective_from DESC\n LIMIT 1`,\n [planId, at.toISOString()]\n );\n }\n\n async findSheetsByPlanId(planId: string): Promise<PricingSheet[]> {\n return this.db.query<PricingSheet>(\n `SELECT *\n FROM pricing_sheets\n WHERE plan_id = $1\n ORDER BY effective_from DESC`,\n [planId]\n );\n }\n\n async upsertSheetModel(\n sheetId: string,\n modelName: string,\n costs: {\n input_cost: number;\n output_cost: number;\n cache_read_cost?: number;\n cache_write_cost?: number;\n batch_input_cost?: number;\n batch_output_cost?: number;\n context_threshold?: number;\n extended_input_cost?: number;\n extended_output_cost?: number;\n token_costs?: Record<string, number>;\n },\n linkage?: {\n dictionary_id?: string;\n model_id?: string;\n normalized_model_name?: string;\n match_status?: string;\n match_confidence?: number;\n match_method?: string;\n }\n ): Promise<PricingSheetModel | null> {\n return this.db.queryOne<PricingSheetModel>(\n `INSERT INTO pricing_sheet_models\n (sheet_id, model_name, input_cost, output_cost,\n cache_read_cost, cache_write_cost, batch_input_cost, batch_output_cost,\n context_threshold, extended_input_cost, extended_output_cost, token_costs,\n dictionary_id, model_id, normalized_model_name, match_status, match_confidence, match_method)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)\n ON CONFLICT (sheet_id, model_name)\n DO UPDATE SET input_cost = EXCLUDED.input_cost,\n output_cost = EXCLUDED.output_cost,\n cache_read_cost = EXCLUDED.cache_read_cost,\n cache_write_cost = EXCLUDED.cache_write_cost,\n batch_input_cost = EXCLUDED.batch_input_cost,\n batch_output_cost = EXCLUDED.batch_output_cost,\n context_threshold = EXCLUDED.context_threshold,\n extended_input_cost = EXCLUDED.extended_input_cost,\n extended_output_cost = EXCLUDED.extended_output_cost,\n token_costs = EXCLUDED.token_costs,\n dictionary_id = COALESCE(EXCLUDED.dictionary_id, pricing_sheet_models.dictionary_id),\n model_id = COALESCE(EXCLUDED.model_id, pricing_sheet_models.model_id),\n normalized_model_name = COALESCE(EXCLUDED.normalized_model_name,\n pricing_sheet_models.normalized_model_name),\n match_status = COALESCE(EXCLUDED.match_status, pricing_sheet_models.match_status),\n match_confidence = COALESCE(EXCLUDED.match_confidence,\n pricing_sheet_models.match_confidence),\n match_method = COALESCE(EXCLUDED.match_method, pricing_sheet_models.match_method),\n updated_at = now()\n RETURNING *`,\n [\n sheetId, modelName,\n costs.input_cost, costs.output_cost,\n costs.cache_read_cost ?? 0, costs.cache_write_cost ?? 0,\n costs.batch_input_cost ?? 0, costs.batch_output_cost ?? 0,\n costs.context_threshold ?? null, costs.extended_input_cost ?? null,\n costs.extended_output_cost ?? null,\n costs.token_costs ? JSON.stringify(costs.token_costs) : '{}',\n linkage?.dictionary_id ?? null, linkage?.model_id ?? null,\n linkage?.normalized_model_name ?? null, linkage?.match_status ?? null,\n linkage?.match_confidence ?? null, linkage?.match_method ?? null,\n ]\n );\n }\n\n async resolveModelPricing(sheetId: string, accessModel: string, context?: {\n modelId?: string;\n dictionaryId?: string;\n normalizedName?: string;\n }): Promise<PricingSheetModel | null> {\n return this.db.queryOne<PricingSheetModel>(\n `SELECT *\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND id = COALESCE(\n (SELECT id FROM pricing_sheet_models WHERE sheet_id = $1 AND model_id = $2 LIMIT 1),\n (SELECT id\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND dictionary_id = $3\n AND $3 IS NOT NULL\n LIMIT 1),\n (SELECT id\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND normalized_model_name = $4\n AND $4 IS NOT NULL\n LIMIT 1),\n (SELECT id FROM pricing_sheet_models WHERE sheet_id = $1 AND model_name = $5 LIMIT 1)\n )`,\n [sheetId, context?.modelId ?? null, context?.dictionaryId ?? null, context?.normalizedName ?? null, accessModel]\n );\n }\n\n async findModelPricing(sheetId: string, modelName: string): Promise<PricingSheetModel | null> {\n return this.db.queryOne<PricingSheetModel>(\n `SELECT *\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND model_name = $2`,\n [sheetId, modelName]\n );\n }\n\n async findModelPricingByModelId(sheetId: string, modelId: string): Promise<PricingSheetModel | null> {\n return this.db.queryOne<PricingSheetModel>(\n `SELECT *\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND model_id = $2`,\n [sheetId, modelId]\n );\n }\n\n async findModelPricingByDictionaryId(sheetId: string, dictionaryId: string): Promise<PricingSheetModel | null> {\n return this.db.queryOne<PricingSheetModel>(\n `SELECT *\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND dictionary_id = $2`,\n [sheetId, dictionaryId]\n );\n }\n\n async findModelPricingByNormalizedName(sheetId: string, normalizedName: string): Promise<PricingSheetModel | null> {\n return this.db.queryOne<PricingSheetModel>(\n `SELECT *\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND normalized_model_name = $2`,\n [sheetId, normalizedName]\n );\n }\n\n async findModelsBySheetId(sheetId: string): Promise<PricingSheetModel[]> {\n return this.db.query<PricingSheetModel>(\n `SELECT *\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n ORDER BY model_name`,\n [sheetId]\n );\n }\n\n async deleteStaleModels(sheetId: string, currentModelNames: string[]): Promise<number> {\n if (currentModelNames.length === 0) return 0;\n const placeholders = currentModelNames.map((_, i) => `$${i + 2}`).join(', ');\n const result = await this.db.queryResult(\n `DELETE\n FROM pricing_sheet_models\n WHERE sheet_id = $1\n AND model_name NOT IN (${placeholders})`,\n [sheetId, ...currentModelNames]\n );\n return result.rowCount ?? 0;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport type {ProviderResponseCost} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class ProviderResponseCostDB {\n constructor(private db: AppDB) {\n }\n\n async insert(cost: Omit<ProviderResponseCost, 'id' | 'created_at'>): Promise<{ id: string } | null> {\n const query = `\n INSERT INTO provider_response_costs\n (response_id, cost_type, pricing_sheet_id,\n input_tokens, output_tokens, cache_read_tokens, cache_write_tokens,\n input_cost, output_cost, cache_read_cost, cache_write_cost,\n total_cost, currency, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)\n RETURNING id\n `;\n return this.db.queryOne<{ id: string }>(query, [\n cost.response_id,\n cost.cost_type,\n cost.pricing_sheet_id ?? null,\n cost.input_tokens,\n cost.output_tokens,\n cost.cache_read_tokens,\n cost.cache_write_tokens,\n cost.input_cost,\n cost.output_cost,\n cost.cache_read_cost,\n cost.cache_write_cost,\n cost.total_cost,\n cost.currency,\n cost.metadata ? JSON.stringify(cost.metadata) : '{}',\n ]);\n }\n\n async findByResponseId(responseId: string): Promise<ProviderResponseCost[]> {\n return this.db.query<ProviderResponseCost>(\n `SELECT *\n FROM provider_response_costs\n WHERE response_id = $1\n ORDER BY cost_type`,\n [responseId]\n );\n }\n\n async deleteByResponseId(responseId: string): Promise<void> {\n await this.db.query(\n `DELETE\n FROM provider_response_costs\n WHERE response_id = $1`,\n [responseId]\n );\n }\n}\n","import {pickDefined} from '../core/pick-defined';\n\nexport interface NormalizedModel {\n raw: string;\n normalized: string;\n tokens: string[];\n providerHint?: string;\n familyHint?: string;\n versionHint?: string;\n sizeHint?: string;\n variantHint?: string;\n channelHint?: string;\n dateHint?: string;\n kindHint?: string;\n}\n\nconst PROVIDER_PREFIXES = [\n 'anthropic/', 'openai/', 'google/', 'meta-llama/', 'meta/', 'mistralai/',\n 'cohere/', 'deepseek/', 'qwen/',\n 'ollama/', 'lmstudio/', 'openrouter/', 'azure/',\n 'models/',\n];\n\nconst PREFIX_TO_PROVIDER: Record<string, string> = {\n 'anthropic': 'anthropic',\n 'openai': 'openai',\n 'google': 'google',\n 'meta-llama': 'meta',\n 'meta': 'meta',\n 'mistralai': 'mistral',\n 'cohere': 'cohere',\n 'deepseek': 'deepseek',\n 'qwen': 'qwen',\n 'ollama': 'ollama',\n 'lmstudio': 'lmstudio',\n 'openrouter': 'openrouter',\n 'azure': 'azure',\n};\n\nconst PREFIX_TO_FAMILY: Record<string, string> = {\n 'anthropic': 'claude',\n 'google': 'gemini',\n 'meta-llama': 'llama',\n 'meta': 'llama',\n};\n\nconst FAMILY_PATTERNS: Array<[RegExp, string]> = [\n [/\\bclaude/, 'claude'],\n [/\\bgemini/, 'gemini'],\n [/\\bgpt/, 'gpt'],\n [/(?:^|-)o[1-9](?:-|$)/, 'o-series'],\n [/\\bllama/, 'llama'],\n [/\\bqwen/, 'qwen'],\n [/\\bmi[sx]tral/, 'mistral'],\n [/\\bdeepseek/, 'deepseek'],\n [/\\bcohere/, 'cohere'],\n [/\\bcommand/, 'cohere'],\n [/\\bphi/, 'phi'],\n [/\\bgemma/, 'gemma'],\n];\n\nconst SEMANTIC_VARIANTS = ['opus', 'sonnet', 'haiku', 'pro', 'flash', 'mini', 'nano', 'instruct', 'coder', 'turbo'];\nconst CHANNEL_MARKERS = ['latest', 'preview'];\nconst ALL_VARIANT_TOKENS = [...SEMANTIC_VARIANTS, ...CHANNEL_MARKERS];\nconst VARIANT_PATTERN = new RegExp(`\\\\b(${ALL_VARIANT_TOKENS.join('|')})\\\\b`, 'g');\n\nconst VARIANT_PRIORITY = Object.fromEntries(\n SEMANTIC_VARIANTS.map((v, i) => [v, SEMANTIC_VARIANTS.length - i]),\n);\n\nconst SIZE_PATTERN = /\\b(\\d+x\\d+b|\\d+(?:\\.\\d+)?b)\\b/;\nconst DATE_TRAILING_COMPACT = /-(\\d{4})(\\d{2})(\\d{2})$/;\nconst DATE_TRAILING_HYPHEN = /-(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nconst KIND_SIGNALS: Array<[RegExp, string]> = [\n [/\\bembed/, 'embedding'],\n [/\\btts\\b/, 'tts'],\n [/\\bwhisper\\b/, 'transcription'],\n [/\\brerank\\b/, 'rerank'],\n [/\\bmoderat/, 'moderation'],\n [/\\bimage\\b|\\bdall-?e\\b|\\bstable-?diffusion\\b/, 'image'],\n];\n\nexport function normalizeModelName(input: string): NormalizedModel {\n const raw = input;\n let s = input.trim().toLowerCase();\n\n let providerHint: string | undefined;\n let prefixKey: string | undefined;\n for (const prefix of PROVIDER_PREFIXES) {\n if (s.startsWith(prefix)) {\n prefixKey = prefix.slice(0, -1);\n providerHint = PREFIX_TO_PROVIDER[prefixKey];\n s = s.slice(prefix.length);\n break;\n }\n }\n\n s = s.replace(/[_:\\/]/g, '-').replace(/\\s+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n\n let dateHint: string | undefined;\n const compactDate = s.match(DATE_TRAILING_COMPACT);\n if (compactDate) {\n dateHint = `${compactDate[1]}-${compactDate[2]}-${compactDate[3]}`;\n } else {\n const hyphenDate = s.match(DATE_TRAILING_HYPHEN);\n if (hyphenDate) {\n dateHint = `${hyphenDate[1]}-${hyphenDate[2]}-${hyphenDate[3]}`;\n }\n }\n\n let versionHint: string | undefined;\n const versionMatch = s.match(/\\b(\\d+)-(\\d+)\\b/);\n if (versionMatch) {\n versionHint = `${versionMatch[1]}.${versionMatch[2]}`;\n } else {\n const dotVersion = s.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n if (dotVersion) {\n versionHint = dotVersion[1];\n }\n }\n\n let sizeHint: string | undefined;\n const sizeMatch = s.match(SIZE_PATTERN);\n if (sizeMatch) {\n sizeHint = sizeMatch[1];\n }\n\n let variantHint: string | undefined;\n let channelHint: string | undefined;\n const variantMatches = [...s.matchAll(VARIANT_PATTERN)];\n if (variantMatches.length > 0) {\n const semantics: string[] = [];\n for (const m of variantMatches) {\n const v = m[1]!;\n if (CHANNEL_MARKERS.includes(v)) {\n channelHint = v;\n } else {\n semantics.push(v);\n }\n }\n if (semantics.length > 0) {\n variantHint = semantics.sort((a, b) => (VARIANT_PRIORITY[b] ?? 0) - (VARIANT_PRIORITY[a] ?? 0))[0];\n }\n }\n\n let familyHint: string | undefined;\n if (prefixKey) familyHint = PREFIX_TO_FAMILY[prefixKey];\n if (!familyHint) {\n for (const [pattern, family] of FAMILY_PATTERNS) {\n if (pattern.test(s)) {\n familyHint = family;\n break;\n }\n }\n }\n\n let kindHint: string | undefined;\n for (const [pattern, kind] of KIND_SIGNALS) {\n if (pattern.test(s)) {\n kindHint = kind;\n break;\n }\n }\n\n const tokens = s.split('-').filter(t => t.length > 0);\n\n return Object.assign(\n {raw, normalized: s, tokens} as NormalizedModel,\n pickDefined({providerHint, familyHint, versionHint, sizeHint, variantHint, channelHint, dateHint, kindHint}),\n );\n}\n\nexport function stripDate(normalized: string): string | undefined {\n const compact = normalized.match(DATE_TRAILING_COMPACT);\n if (compact) return normalized.slice(0, -compact[0].length);\n const hyphen = normalized.match(DATE_TRAILING_HYPHEN);\n if (hyphen) return normalized.slice(0, -hyphen[0].length);\n return undefined;\n}\n\nconst PROVIDER_REVISION = /-0\\d{2}$|-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|-(0[1-9]|1[0-2])-(\\d{4})$/;\n\nexport function stripProviderRevision(normalized: string): string | undefined {\n const match = normalized.match(PROVIDER_REVISION);\n if (match) return normalized.slice(0, -match[0].length);\n return undefined;\n}\n\nconst QUANTIZATION = /-(q\\d+(-\\d+)?|fp16|fp32|int4|int8|gguf)$/;\n\nexport function stripQuantization(normalized: string): string | undefined {\n const match = normalized.match(QUANTIZATION);\n if (match) return normalized.slice(0, -match[0].length);\n return undefined;\n}\n\nconst CHANNEL_SUFFIX = /-(latest|preview)$/;\n\nexport function stripChannel(normalized: string): string | undefined {\n const match = normalized.match(CHANNEL_SUFFIX);\n if (match) return normalized.slice(0, -match[0].length);\n return undefined;\n}\n","export {normalizeModelName, stripDate, stripProviderRevision, stripQuantization, stripChannel} from './normalize';\nexport type {NormalizedModel} from './normalize';\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {type ModelDictionary} from '@holokai/holo-types/entities';\nimport {normalizeModelName} from '@holokai/holo-sdk/matching';\n\n@injectable()\nexport class ModelDictionaryDB {\n constructor(private db: AppDB) {\n }\n\n /**\n * @deprecated Legacy JSONB alias lookup. Use ModelDictionaryAliasDB.findByNormalized() instead.\n */\n async findByAlias(alias: string): Promise<ModelDictionary | null> {\n return this.db.systemQueryOne<ModelDictionary>(\n `SELECT *\n FROM model_dictionary\n WHERE aliases @> $1::jsonb`,\n [JSON.stringify([alias])]\n );\n }\n\n async findByCanonicalId(canonicalId: string): Promise<ModelDictionary | null> {\n return this.db.systemQueryOne<ModelDictionary>(\n `SELECT *\n FROM model_dictionary\n WHERE canonical_id = $1`,\n [canonicalId]\n );\n }\n\n async findByCanonicalIdNormalized(normalized: string): Promise<ModelDictionary | null> {\n return this.db.systemQueryOne<ModelDictionary>(\n `SELECT *\n FROM model_dictionary\n WHERE canonical_id_normalized = $1`,\n [normalized]\n );\n }\n\n async insert(entry: Omit<ModelDictionary, 'id' | 'created_at' | 'updated_at'>): Promise<ModelDictionary | null> {\n const canonicalNorm = normalizeModelName(entry.canonical_id);\n const nameNorm = normalizeModelName(entry.name);\n\n const params = [\n entry.canonical_id, // $1\n canonicalNorm.normalized, // $2 canonical_id_normalized\n entry.name, // $3\n entry.normalized_name ?? nameNorm.normalized, // $4 normalized_name (from name, NOT canonical_id)\n entry.family ?? null, // $5\n entry.provider_family, // $6\n entry.version_label ?? canonicalNorm.versionHint ?? null, // $7\n entry.variant ?? canonicalNorm.variantHint ?? null, // $8\n entry.size_label ?? canonicalNorm.sizeHint ?? null, // $9\n entry.architecture_family ?? null, // $10\n JSON.stringify(entry.aliases ?? []), // $11 (jsonb)\n entry.description ?? null, // $12\n entry.context_length ?? null, // $13\n entry.modality ?? null, // $14\n JSON.stringify(entry.input_modalities ?? []), // $15\n JSON.stringify(entry.output_modalities ?? []), // $16\n JSON.stringify(entry.supported_parameters ?? []), // $17\n JSON.stringify(entry.default_parameters ?? {}), // $18\n JSON.stringify(entry.capabilities ?? {}), // $19\n entry.tokenizer ?? null, // $20\n entry.kind, // $21\n entry.status ?? 'active', // $22\n entry.is_open_source ?? null, // $23\n entry.release_date ?? null, // $24\n entry.shutdown_date ?? null, // $25\n entry.base_input_cost ?? null, // $26\n entry.base_output_cost ?? null, // $27\n entry.base_cache_read_cost ?? null, // $28\n entry.base_cache_write_cost ?? null, // $29\n JSON.stringify(entry.sources ?? []), // $30\n entry.last_synced_at ?? null, // $31\n ];\n\n return this.db.systemQueryOne<ModelDictionary>(\n `INSERT INTO model_dictionary\n (canonical_id, canonical_id_normalized, name, normalized_name, family, provider_family,\n version_label, variant, size_label, architecture_family,\n aliases, description, context_length, modality,\n input_modalities, output_modalities, supported_parameters, default_parameters,\n capabilities, tokenizer, kind, status, is_open_source,\n release_date, shutdown_date,\n base_input_cost, base_output_cost, base_cache_read_cost, base_cache_write_cost,\n sources, last_synced_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,\n $11::jsonb, $12, $13, $14, $15::jsonb, $16::jsonb, $17::jsonb, $18::jsonb,\n $19::jsonb, $20, $21, $22, $23, $24::date, $25::date,\n $26, $27, $28, $29, $30::jsonb, $31)\n ON CONFLICT (canonical_id) DO UPDATE SET name = COALESCE(EXCLUDED.name, model_dictionary.name),\n normalized_name = COALESCE(EXCLUDED.normalized_name, model_dictionary.normalized_name),\n family = COALESCE(EXCLUDED.family, model_dictionary.family),\n provider_family = COALESCE(EXCLUDED.provider_family, model_dictionary.provider_family),\n version_label = COALESCE(EXCLUDED.version_label, model_dictionary.version_label),\n variant = COALESCE(EXCLUDED.variant, model_dictionary.variant),\n size_label = COALESCE(EXCLUDED.size_label, model_dictionary.size_label),\n architecture_family = COALESCE(EXCLUDED.architecture_family,\n model_dictionary.architecture_family),\n aliases = COALESCE((SELECT jsonb_agg(DISTINCT a)\n FROM jsonb_array_elements_text(model_dictionary.aliases || EXCLUDED.aliases) a),\n '[]'::jsonb),\n description = COALESCE(EXCLUDED.description, model_dictionary.description),\n context_length = COALESCE(EXCLUDED.context_length, model_dictionary.context_length),\n modality = COALESCE(EXCLUDED.modality, model_dictionary.modality),\n input_modalities = CASE\n WHEN EXCLUDED.input_modalities = '[]'::jsonb\n THEN model_dictionary.input_modalities\n ELSE EXCLUDED.input_modalities END,\n output_modalities = CASE\n WHEN EXCLUDED.output_modalities = '[]'::jsonb\n THEN model_dictionary.output_modalities\n ELSE EXCLUDED.output_modalities END,\n supported_parameters = CASE\n WHEN EXCLUDED.supported_parameters = '[]'::jsonb\n THEN model_dictionary.supported_parameters\n ELSE EXCLUDED.supported_parameters END,\n default_parameters = CASE\n WHEN EXCLUDED.default_parameters = '{}'::jsonb\n THEN model_dictionary.default_parameters\n ELSE EXCLUDED.default_parameters END,\n capabilities = CASE\n WHEN EXCLUDED.capabilities = '{}'::jsonb\n THEN model_dictionary.capabilities\n ELSE EXCLUDED.capabilities END,\n tokenizer = COALESCE(EXCLUDED.tokenizer, model_dictionary.tokenizer),\n kind = COALESCE(EXCLUDED.kind, model_dictionary.kind),\n status = COALESCE(EXCLUDED.status, model_dictionary.status),\n is_open_source = COALESCE(EXCLUDED.is_open_source, model_dictionary.is_open_source),\n release_date = COALESCE(EXCLUDED.release_date, model_dictionary.release_date),\n shutdown_date = COALESCE(EXCLUDED.shutdown_date, model_dictionary.shutdown_date),\n base_input_cost = COALESCE(EXCLUDED.base_input_cost, model_dictionary.base_input_cost),\n base_output_cost = COALESCE(EXCLUDED.base_output_cost,\n model_dictionary.base_output_cost),\n base_cache_read_cost = COALESCE(EXCLUDED.base_cache_read_cost,\n model_dictionary.base_cache_read_cost),\n base_cache_write_cost = COALESCE(EXCLUDED.base_cache_write_cost,\n model_dictionary.base_cache_write_cost),\n sources = COALESCE((SELECT jsonb_agg(DISTINCT s)\n FROM jsonb_array_elements(model_dictionary.sources || EXCLUDED.sources) s),\n '[]'::jsonb),\n last_synced_at = COALESCE(EXCLUDED.last_synced_at, model_dictionary.last_synced_at),\n updated_at = now()\n RETURNING *`,\n params\n );\n }\n\n /**\n * @deprecated Legacy JSONB alias upsert. Use ModelDictionaryAliasDB instead.\n */\n async upsertAliases(\n lookupAliases: string[],\n newAliases: string[],\n source: string,\n fields: { family?: string; kind?: string; release_date?: string; shutdown_date?: string },\n ): Promise<ModelDictionary | null> {\n const params = [\n lookupAliases,\n JSON.stringify(newAliases),\n JSON.stringify([source]),\n fields.family ?? null,\n fields.kind ?? null,\n fields.release_date ?? null,\n fields.shutdown_date ?? null,\n new Date().toISOString(),\n ];\n\n return this.db.systemQueryOne<ModelDictionary>(\n `UPDATE model_dictionary md\n SET aliases = COALESCE((SELECT jsonb_agg(DISTINCT a)\n FROM jsonb_array_elements_text(md.aliases || $2::jsonb) a), '[]'::jsonb),\n sources = COALESCE((SELECT jsonb_agg(DISTINCT s)\n FROM jsonb_array_elements(md.sources || $3::jsonb) s), '[]'::jsonb),\n family = COALESCE($4, md.family),\n kind = COALESCE($5, md.kind),\n release_date = COALESCE($6::date, md.release_date),\n shutdown_date = COALESCE($7::date, md.shutdown_date),\n last_synced_at = $8,\n updated_at = now()\n WHERE md.aliases ?| $1::text[]\n RETURNING md.*`,\n params\n );\n }\n\n async upsertCanonical(payload: {\n canonical_id: string;\n canonical_id_normalized: string;\n name: string;\n provider_family: string;\n description?: string;\n context_length?: number;\n modality?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n supported_parameters?: string[];\n default_parameters?: Record<string, any>;\n capabilities?: Record<string, unknown>;\n tokenizer?: string;\n kind?: string;\n is_open_source?: boolean;\n release_date?: string;\n base_input_cost?: number;\n base_output_cost?: number;\n base_cache_read_cost?: number;\n base_cache_write_cost?: number;\n sources: string[];\n }): Promise<{ id: string; canonical_id: string }> {\n const norm = normalizeModelName(payload.canonical_id);\n const nameNorm = normalizeModelName(payload.name);\n\n const params = [\n payload.canonical_id, // $1\n norm.normalized, // $2\n payload.name, // $3\n nameNorm.normalized, // $4\n payload.provider_family, // $5\n norm.versionHint ?? null, // $6\n norm.variantHint ?? null, // $7\n norm.sizeHint ?? null, // $8\n payload.description ?? null, // $9\n payload.context_length ?? null, // $10\n payload.modality ?? null, // $11\n JSON.stringify(payload.input_modalities ?? []), // $12\n JSON.stringify(payload.output_modalities ?? []), // $13\n JSON.stringify(payload.supported_parameters ?? []), // $14\n JSON.stringify(payload.default_parameters ?? {}), // $15\n JSON.stringify(payload.capabilities ?? {}), // $16\n payload.tokenizer ?? null, // $17\n payload.kind ?? 'chat', // $18\n payload.is_open_source ?? null, // $19\n payload.release_date ?? null, // $20\n payload.base_input_cost ?? null, // $21\n payload.base_output_cost ?? null, // $22\n payload.base_cache_read_cost ?? null, // $23\n payload.base_cache_write_cost ?? null, // $24\n JSON.stringify(payload.sources ?? []), // $25\n ];\n\n const row = await this.db.systemQueryOne<{ id: string; canonical_id: string }>(\n `INSERT INTO model_dictionary\n (canonical_id, canonical_id_normalized, name, normalized_name, provider_family,\n version_label, variant, size_label,\n description, context_length, modality,\n input_modalities, output_modalities, supported_parameters, default_parameters,\n capabilities, tokenizer, kind, is_open_source,\n release_date,\n base_input_cost, base_output_cost, base_cache_read_cost, base_cache_write_cost,\n sources, aliases, status, last_synced_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8,\n $9, $10, $11,\n $12::jsonb, $13::jsonb, $14::jsonb, $15::jsonb,\n $16::jsonb, $17, $18, $19,\n $20::date,\n $21, $22, $23, $24,\n $25::jsonb, '[]'::jsonb, 'active', now())\n ON CONFLICT (canonical_id) DO UPDATE SET\n -- Overwrite: ETL-published value wins unconditionally\n name = EXCLUDED.name,\n normalized_name = EXCLUDED.normalized_name,\n provider_family = EXCLUDED.provider_family,\n kind = EXCLUDED.kind,\n status = COALESCE(EXCLUDED.status, model_dictionary.status),\n context_length = EXCLUDED.context_length,\n base_input_cost = EXCLUDED.base_input_cost,\n base_output_cost = EXCLUDED.base_output_cost,\n base_cache_read_cost = EXCLUDED.base_cache_read_cost,\n base_cache_write_cost = EXCLUDED.base_cache_write_cost,\n is_open_source = EXCLUDED.is_open_source,\n release_date = EXCLUDED.release_date,\n -- Fill-only: COALESCE preserves manual edits\n description = COALESCE(EXCLUDED.description, model_dictionary.description),\n version_label = COALESCE(EXCLUDED.version_label, model_dictionary.version_label),\n variant = COALESCE(EXCLUDED.variant, model_dictionary.variant),\n size_label = COALESCE(EXCLUDED.size_label, model_dictionary.size_label),\n tokenizer = COALESCE(EXCLUDED.tokenizer, model_dictionary.tokenizer),\n -- Empty-aware arrays/objects\n input_modalities = CASE\n WHEN EXCLUDED.input_modalities = '[]'::jsonb\n THEN model_dictionary.input_modalities\n ELSE EXCLUDED.input_modalities END,\n output_modalities = CASE\n WHEN EXCLUDED.output_modalities = '[]'::jsonb\n THEN model_dictionary.output_modalities\n ELSE EXCLUDED.output_modalities END,\n supported_parameters = CASE\n WHEN EXCLUDED.supported_parameters = '[]'::jsonb\n THEN model_dictionary.supported_parameters\n ELSE EXCLUDED.supported_parameters END,\n default_parameters = CASE\n WHEN EXCLUDED.default_parameters = '{}'::jsonb\n THEN model_dictionary.default_parameters\n ELSE model_dictionary.default_parameters || EXCLUDED.default_parameters END,\n capabilities = CASE\n WHEN EXCLUDED.capabilities = '{}'::jsonb\n THEN model_dictionary.capabilities\n ELSE model_dictionary.capabilities || EXCLUDED.capabilities END,\n -- Sources: union merge\n sources = COALESCE((SELECT jsonb_agg(DISTINCT s)\n FROM jsonb_array_elements(model_dictionary.sources || EXCLUDED.sources) s),\n '[]'::jsonb),\n -- Always set\n last_synced_at = now(),\n updated_at = now()\n RETURNING id, canonical_id`,\n params,\n );\n\n if (!row) throw new Error(`upsertCanonical failed for ${payload.canonical_id}`);\n return row;\n }\n\n async enrichUpdate(\n id: string,\n fields: {\n contextLength?: number;\n pricing?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n capabilities?: Record<string, unknown>;\n isOpenSource?: boolean;\n releaseDate?: string;\n },\n overwriteKeys: string[],\n source: string,\n ): Promise<void> {\n const setClauses: string[] = [];\n const params: any[] = [id]; // $1\n let idx = 2;\n\n const isOverwrite = (key: string) => overwriteKeys.includes(key);\n\n if (fields.contextLength != null) {\n if (isOverwrite('contextLength')) {\n setClauses.push(`context_length = $${idx++}`);\n } else {\n setClauses.push(`context_length = COALESCE($${idx++}, context_length)`);\n }\n params.push(fields.contextLength);\n }\n\n if (fields.pricing) {\n const p = fields.pricing;\n if (p.input != null) {\n setClauses.push(isOverwrite('pricing') ? `base_input_cost = $${idx++}` : `base_input_cost = COALESCE($${idx++}, base_input_cost)`);\n params.push(p.input);\n }\n if (p.output != null) {\n setClauses.push(isOverwrite('pricing') ? `base_output_cost = $${idx++}` : `base_output_cost = COALESCE($${idx++}, base_output_cost)`);\n params.push(p.output);\n }\n if (p.cacheRead != null) {\n setClauses.push(isOverwrite('pricing') ? `base_cache_read_cost = $${idx++}` : `base_cache_read_cost = COALESCE($${idx++}, base_cache_read_cost)`);\n params.push(p.cacheRead);\n }\n if (p.cacheWrite != null) {\n setClauses.push(isOverwrite('pricing') ? `base_cache_write_cost = $${idx++}` : `base_cache_write_cost = COALESCE($${idx++}, base_cache_write_cost)`);\n params.push(p.cacheWrite);\n }\n }\n\n if (fields.capabilities && Object.keys(fields.capabilities).length > 0) {\n setClauses.push(`capabilities = capabilities || $${idx++}::jsonb`);\n params.push(JSON.stringify(fields.capabilities));\n }\n\n if (fields.isOpenSource != null) {\n if (isOverwrite('isOpenSource')) {\n setClauses.push(`is_open_source = $${idx++}`);\n } else {\n setClauses.push(`is_open_source = COALESCE($${idx++}, is_open_source)`);\n }\n params.push(fields.isOpenSource);\n }\n\n if (fields.releaseDate) {\n if (isOverwrite('releaseDate')) {\n setClauses.push(`release_date = $${idx++}::date`);\n } else {\n setClauses.push(`release_date = COALESCE($${idx++}::date, release_date)`);\n }\n params.push(fields.releaseDate);\n }\n\n if (setClauses.length === 0) return;\n\n setClauses.push(`sources = COALESCE((SELECT jsonb_agg(DISTINCT s) FROM jsonb_array_elements(sources || $${idx++}::jsonb) s), sources)`);\n params.push(JSON.stringify([source]));\n\n setClauses.push('last_synced_at = now()');\n setClauses.push('updated_at = now()');\n\n await this.db.systemQuery(\n `UPDATE model_dictionary\n SET ${setClauses.join(', ')}\n WHERE id = $1`,\n params,\n );\n }\n\n async list(filters?: {\n provider_family?: string;\n family?: string;\n search?: string;\n status?: string;\n }, limit = 100, offset = 0): Promise<{ rows: ModelDictionary[]; total: number }> {\n const conditions: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n if (filters?.provider_family) {\n conditions.push(`provider_family = $${idx++}`);\n params.push(filters.provider_family);\n }\n if (filters?.family) {\n conditions.push(`family = $${idx++}`);\n params.push(filters.family);\n }\n if (filters?.status) {\n conditions.push(`status = $${idx++}`);\n params.push(filters.status);\n }\n if (filters?.search) {\n conditions.push(`(name ILIKE $${idx} OR canonical_id ILIKE $${idx})`);\n params.push(`%${filters.search}%`);\n idx++;\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const limitIdx = idx++;\n const offsetIdx = idx++;\n\n return this.db.asSystem(async (client) => {\n const [rowsResult, countResult] = await Promise.all([\n client.query(`SELECT *\n FROM model_dictionary ${where}\n ORDER BY name\n LIMIT $${limitIdx} OFFSET $${offsetIdx}`, [...params, limit, offset]),\n client.query(`SELECT COUNT(*)::text as count\n FROM model_dictionary ${where}`, params),\n ]);\n return {\n rows: rowsResult.rows as ModelDictionary[],\n total: parseInt(countResult.rows[0]?.count ?? '0'),\n };\n });\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {type ModelDictionaryAlias} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class ModelDictionaryAliasDB {\n constructor(private db: AppDB) {\n }\n\n async findByNormalized(\n normalized: string,\n providerFamily?: string,\n runtimeFamily?: string,\n ): Promise<(ModelDictionaryAlias & { canonical_id: string; dict_status: string })[]> {\n return this.db.systemQuery<ModelDictionaryAlias & { canonical_id: string; dict_status: string }>(\n `SELECT a.*, d.canonical_id, d.status as dict_status\n FROM model_dictionary_aliases a\n JOIN model_dictionary d ON d.id = a.dictionary_id\n WHERE a.alias_normalized = $1\n AND a.active = TRUE\n AND (a.provider_family = $2 OR a.provider_family IS NULL OR $2::varchar IS NULL)\n AND (a.runtime_family = $3 OR a.runtime_family IS NULL OR $3::varchar IS NULL)\n ORDER BY CASE\n WHEN a.provider_family = $2 THEN 0\n WHEN a.provider_family IS NULL THEN 1\n ELSE 2 END,\n CASE\n WHEN a.runtime_family = $3 THEN 0\n WHEN a.runtime_family IS NULL THEN 1\n ELSE 2 END,\n a.weight DESC,\n CASE a.alias_type\n WHEN 'official' THEN 0\n WHEN 'provider_api' THEN 1\n WHEN 'reseller' THEN 2\n WHEN 'runtime' THEN 3\n WHEN 'display' THEN 4\n WHEN 'shorthand' THEN 5\n WHEN 'legacy' THEN 6\n WHEN 'heuristic' THEN 7\n ELSE 8 END,\n d.canonical_id`,\n [normalized, providerFamily ?? null, runtimeFamily ?? null]\n );\n }\n\n async findAllByDictionaryId(dictionaryId: string): Promise<ModelDictionaryAlias[]> {\n return this.db.systemQuery<ModelDictionaryAlias>(\n `SELECT *\n FROM model_dictionary_aliases\n WHERE dictionary_id = $1\n ORDER BY weight DESC, alias_normalized`,\n [dictionaryId]\n );\n }\n\n async upsert(alias: Omit<ModelDictionaryAlias, 'id' | 'created_at' | 'updated_at'>): Promise<ModelDictionaryAlias | null> {\n return this.db.systemQueryOne<ModelDictionaryAlias>(\n `INSERT INTO model_dictionary_aliases\n (dictionary_id, alias, alias_normalized, alias_type, provider_family, runtime_family, source, source_key,\n weight, active)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n ON CONFLICT (dictionary_id, alias_normalized, COALESCE(provider_family, ''), COALESCE(runtime_family, ''), COALESCE(source_key, ''))\n DO UPDATE SET alias_type = CASE\n WHEN EXCLUDED.weight >= model_dictionary_aliases.weight\n THEN EXCLUDED.alias_type\n ELSE model_dictionary_aliases.alias_type END,\n weight = GREATEST(EXCLUDED.weight, model_dictionary_aliases.weight),\n source = COALESCE(EXCLUDED.source, model_dictionary_aliases.source),\n source_key = COALESCE(EXCLUDED.source_key, model_dictionary_aliases.source_key),\n active = EXCLUDED.active,\n updated_at = now()\n RETURNING *`,\n [\n alias.dictionary_id,\n alias.alias,\n alias.alias_normalized,\n alias.alias_type,\n alias.provider_family ?? null,\n alias.runtime_family ?? null,\n alias.source ?? null,\n alias.source_key ?? null,\n alias.weight,\n alias.active,\n ]\n );\n }\n\n async bulkInsert(aliases: Array<Omit<ModelDictionaryAlias, 'id' | 'created_at' | 'updated_at'>>): Promise<number> {\n if (aliases.length === 0) return 0;\n\n const values: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n for (const a of aliases) {\n values.push(`($${idx++}, $${idx++}, $${idx++}, $${idx++}, $${idx++}, $${idx++}, $${idx++}, $${idx++}, $${idx++}, $${idx++})`);\n params.push(\n a.dictionary_id, a.alias, a.alias_normalized, a.alias_type,\n a.provider_family ?? null, a.runtime_family ?? null,\n a.source ?? null, a.source_key ?? null, a.weight, a.active,\n );\n }\n\n const result = await this.db.asSystem(async (client) => {\n const res = await client.query(\n `INSERT INTO model_dictionary_aliases\n (dictionary_id, alias, alias_normalized, alias_type, provider_family, runtime_family, source,\n source_key, weight, active)\n VALUES\n ${values.join(', ')}\n ON CONFLICT (dictionary_id, alias_normalized, COALESCE(provider_family, ''), COALESCE(runtime_family, ''), COALESCE(source_key, ''))\n DO UPDATE SET\n alias_type = CASE WHEN EXCLUDED.weight >= model_dictionary_aliases.weight\n THEN EXCLUDED.alias_type ELSE model_dictionary_aliases.alias_type\n END,\n weight = GREATEST(EXCLUDED.weight, model_dictionary_aliases.weight),\n source = COALESCE(EXCLUDED.source, model_dictionary_aliases.source),\n source_key = COALESCE(EXCLUDED.source_key, model_dictionary_aliases.source_key),\n active = EXCLUDED.active,\n updated_at = now()`,\n params,\n );\n return res.rowCount ?? 0;\n });\n\n return result;\n }\n\n async deactivate(dictionaryId: string, aliasNormalized: string): Promise<void> {\n await this.db.systemQuery(\n `UPDATE model_dictionary_aliases\n SET active = FALSE,\n updated_at = now()\n WHERE dictionary_id = $1\n AND alias_normalized = $2`,\n [dictionaryId, aliasNormalized]\n );\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport {type ModelMatchOverride} from '@holokai/holo-types/entities';\n\ninterface OverrideContext {\n organizationId?: string;\n providerId?: string;\n sourceType: string;\n sourceKey?: string;\n}\n\n@injectable()\nexport class ModelMatchOverrideDB {\n constructor(private db: AppDB) {\n }\n\n async findMatch(normalizedName: string, context: OverrideContext): Promise<(ModelMatchOverride & {\n canonical_id: string\n }) | null> {\n return this.db.systemQueryOne<ModelMatchOverride & { canonical_id: string }>(\n `SELECT mo.*, d.canonical_id\n FROM model_match_overrides mo\n JOIN model_dictionary d ON d.id = mo.dictionary_id\n WHERE mo.normalized_name = $1\n AND mo.active = TRUE\n AND mo.source_type = $4\n AND (mo.organization_id = $2::uuid OR mo.organization_id IS NULL)\n AND (mo.provider_id = $3::uuid OR mo.provider_id IS NULL)\n AND (mo.source_key = $5 OR mo.source_key IS NULL)\n ORDER BY CASE\n WHEN mo.organization_id = $2::uuid THEN 0\n WHEN mo.organization_id IS NULL THEN 1 END,\n CASE\n WHEN mo.provider_id = $3::uuid THEN 0\n WHEN mo.provider_id IS NULL THEN 1 END,\n CASE\n WHEN mo.source_key = $5 THEN 0\n WHEN mo.source_key IS NULL THEN 1 END\n LIMIT 1`,\n [\n normalizedName,\n context.organizationId ?? null,\n context.providerId ?? null,\n context.sourceType,\n context.sourceKey ?? null,\n ]\n );\n }\n\n async upsert(override: Omit<ModelMatchOverride, 'id' | 'created_at' | 'updated_at'>): Promise<ModelMatchOverride | null> {\n return this.db.systemQueryOne<ModelMatchOverride>(\n `INSERT INTO model_match_overrides\n (organization_id, source_type, source_key, provider_id, raw_name, normalized_name, dictionary_id, reason,\n active, created_by)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)\n ON CONFLICT (\n normalized_name,\n COALESCE(organization_id, '00000000-0000-0000-0000-000000000000'::uuid),\n COALESCE(provider_id, '00000000-0000-0000-0000-000000000000'::uuid),\n source_type,\n COALESCE(source_key, ''))\n WHERE active = TRUE\n DO\n UPDATE\n SET dictionary_id = EXCLUDED.dictionary_id,\n reason = COALESCE(EXCLUDED.reason, model_match_overrides.reason),\n created_by = COALESCE(EXCLUDED.created_by, model_match_overrides.created_by),\n updated_at = now()\n RETURNING *`,\n [\n override.organization_id ?? null,\n override.source_type,\n override.source_key ?? null,\n override.provider_id ?? null,\n override.raw_name,\n override.normalized_name,\n override.dictionary_id,\n override.reason ?? null,\n override.active,\n override.created_by ?? null,\n ]\n );\n }\n\n async list(filters?: {\n organizationId?: string;\n sourceType?: string;\n active?: boolean;\n }, limit = 100, offset = 0): Promise<ModelMatchOverride[]> {\n const conditions: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n if (filters?.organizationId) {\n conditions.push(`organization_id = $${idx++}`);\n params.push(filters.organizationId);\n }\n if (filters?.sourceType) {\n conditions.push(`source_type = $${idx++}`);\n params.push(filters.sourceType);\n }\n if (filters?.active !== undefined) {\n conditions.push(`active = $${idx++}`);\n params.push(filters.active);\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n return this.db.systemQuery<ModelMatchOverride>(\n `SELECT *\n FROM model_match_overrides ${where}\n ORDER BY created_at DESC\n LIMIT $${idx++} OFFSET $${idx++}`,\n [...params, limit, offset]\n );\n }\n}\n","import {injectable} from 'tsyringe';\nimport {AppDB} from './app.db';\nimport type {Datastore} from '@holokai/holo-types/entities';\nimport {ClassLogger} from '@holokai/holo-sdk';\n\nexport interface DatastoreWithCredential extends Datastore {\n encrypted_value?: string;\n initialization_vector?: string;\n}\n\n@injectable()\nexport class DatastoreDB extends ClassLogger {\n constructor(private db: AppDB) {\n super();\n }\n\n async getAll(): Promise<Datastore[]> {\n return this.db.systemQuery<Datastore>('SELECT * FROM datastores ORDER BY created_at');\n }\n\n async getEnabled(): Promise<DatastoreWithCredential[]> {\n return this.db.systemQuery<DatastoreWithCredential>(\n `SELECT d.*, ac.encrypted_value, ac.initialization_vector\n FROM datastores d\n LEFT JOIN api_credentials ac ON d.api_credential_id = ac.id\n WHERE d.active = true\n AND d.enabled = true\n ORDER BY d.created_at`\n );\n }\n\n async getById(id: string): Promise<DatastoreWithCredential | null> {\n return this.db.systemQueryOne<DatastoreWithCredential>(\n `SELECT d.*, ac.encrypted_value, ac.initialization_vector\n FROM datastores d\n LEFT JOIN api_credentials ac ON d.api_credential_id = ac.id\n WHERE d.id = $1\n AND d.active = true`,\n [id]\n );\n }\n\n async getByOrg(orgId: string): Promise<Datastore[]> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(\n 'SELECT * FROM datastores WHERE active = true AND (organization_id = $1 OR organization_id IS NULL) ORDER BY created_at',\n [orgId]\n );\n return result.rows as Datastore[];\n });\n }\n\n async getByIdAndOrg(id: string, orgId: string): Promise<Datastore | null> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(\n 'SELECT * FROM datastores WHERE id = $1 AND active = true AND (organization_id = $2 OR organization_id IS NULL)',\n [id, orgId]\n );\n return (result.rows[0] as Datastore) ?? null;\n });\n }\n\n async insert(orgId: string, datastore: Omit<Datastore, 'id' | 'active' | 'created_at' | 'updated_at'>): Promise<Datastore | null> {\n return this.db.asUser(orgId, async (client) => {\n const result = await client.query(\n `INSERT INTO datastores (name, plugin_id, organization_id, api_credential_id, connection_config, mapping, enabled, active)\n VALUES ($1, $2, $3, $4, $5, $6, $7, true)\n RETURNING *`,\n [\n datastore.name,\n datastore.plugin_id,\n datastore.organization_id ?? null,\n datastore.api_credential_id ?? null,\n JSON.stringify(datastore.connection_config),\n JSON.stringify(datastore.mapping),\n datastore.enabled,\n ],\n );\n return (result.rows[0] as Datastore) ?? null;\n });\n }\n\n async update(orgId: string, id: string, updates: Partial<Pick<Datastore, 'name' | 'connection_config' | 'mapping' | 'enabled' | 'api_credential_id'>>): Promise<Datastore | null> {\n return this.db.asUser(orgId, async (client) => {\n const sets: string[] = [];\n const params: any[] = [];\n let idx = 1;\n\n if (updates.name !== undefined) {\n sets.push(`name = $${idx++}`);\n params.push(updates.name);\n }\n if (updates.connection_config !== undefined) {\n sets.push(`connection_config = $${idx++}`);\n params.push(JSON.stringify(updates.connection_config));\n }\n if (updates.mapping !== undefined) {\n sets.push(`mapping = $${idx++}`);\n params.push(JSON.stringify(updates.mapping));\n }\n if (updates.enabled !== undefined) {\n sets.push(`enabled = $${idx++}`);\n params.push(updates.enabled);\n }\n if (updates.api_credential_id !== undefined) {\n sets.push(`api_credential_id = $${idx++}`);\n params.push(updates.api_credential_id);\n }\n\n if (sets.length === 0) return this.getById(id);\n\n sets.push(`updated_at = now()`);\n params.push(id);\n\n const result = await client.query(\n `UPDATE datastores\n SET ${sets.join(', ')}\n WHERE id = $${idx} RETURNING *`,\n params,\n );\n return (result.rows[0] as Datastore) ?? null;\n });\n }\n\n async deactivate(orgId: string, id: string): Promise<void> {\n await this.db.asUser(orgId, async (client) => {\n await client.query('UPDATE datastores SET active = false, updated_at = now() WHERE id = $1', [id]);\n });\n }\n\n async delete(id: string): Promise<void> {\n await this.db.query('DELETE FROM datastores WHERE id = $1', [id]);\n }\n}\n","export {AppDB} from './app.db';\nexport {ApplicationDB} from './application.db';\nexport {ProviderDB} from './provider.db';\nexport {RequestDB} from './request.db';\nexport {ResponseDB} from './response.db';\nexport {ApiCredentialDB} from './api.credential.db';\nexport {HoloTokenDB} from './holo.token.db';\nexport {ModelDB} from './model.db';\nexport {AccessDB} from './access.db';\nexport {PluginDB} from './plugin.db';\nexport {ProtocolDB} from './protocol.db';\nexport {ServerDB} from './server.db';\nexport {PricingDB} from './pricing.db';\nexport {ProviderResponseCostDB} from './provider.response.cost.db';\nexport {ModelDictionaryDB} from './model-dictionary.db';\nexport {ModelDictionaryAliasDB} from './model-dictionary-alias.db';\nexport {ModelMatchOverrideDB} from './model-match-override.db';\nexport {DatastoreDB} from './datastore.db';\n","export const NotificationServiceToken = Symbol(\"NotificationService\");\n\nexport class NotificationTopic {\n\n static userKey(orgId: string, userId: string) {\n return `${orgId}.${userId}`;\n }\n\n static userApp(orgId: string, userId: string, appSlug: string = '*') {\n return `org.${orgId}.user.${userId}.app.${appSlug}`;\n }\n\n static publishKey(orgId: string, userId: string = 'all', appSlug: string = 'all') {\n return `org.${orgId}.user.${userId}.app.${appSlug}`;\n }\n\n static broadcastApp(orgId: string, appSlug: string) {\n return `org.${orgId}.user.all.app.${appSlug}`;\n }\n}\n","export const NotificationStoreToken = Symbol(\"NotificationStore\");\n","import type {NotificationEvent, NotificationSeverity} from '@holokai/holo-types/notification';\nimport {NotificationEventType} from \"@holokai/holo-types/notification\";\nimport type {Auth} from '@holokai/holo-types/api';\nimport type {HoloWorkerRequest} from '@holokai/holo-types/worker';\nimport {pickDefined} from \"../core\";\nimport {v4 as uuidv4} from \"uuid\";\nimport {type ProviderDoneEvent, type ProviderErrorEvent, ProviderEventType, type WorkerResponseEnvelope} from \"@holokai/holo-types\";\n\nexport class NotificationEventFactory {\n static fromAuthAndRequest(type: NotificationEventType, auth: Auth, request: HoloWorkerRequest, message: string, payload?: any, severity: NotificationSeverity = \"info\"): NotificationEvent {\n const {organizationId, application, userId} = auth;\n const {requestId, threadId, branchId} = request;\n const appSlug = application?.url_slug;\n return pickDefined({\n id: uuidv4(),\n ts: Date.now(),\n organizationId,\n userId,\n appSlug,\n type,\n severity,\n message,\n requestId,\n payload,\n threadId: threadId,\n branchId: branchId,\n }) as NotificationEvent;\n }\n\n static fromRequest(type: NotificationEventType, request: HoloWorkerRequest, message: string, payload?: any, severity: NotificationSeverity = \"info\"): NotificationEvent {\n const {organizationId, userId, appSlug, requestId, threadId, branchId} = request;\n return pickDefined({\n id: uuidv4(),\n ts: Date.now(),\n organizationId,\n userId,\n appSlug,\n type,\n severity,\n message,\n requestId,\n payload,\n threadId: threadId,\n branchId: branchId,\n }) as NotificationEvent;\n }\n\n static fromProviderEvent(envelope: WorkerResponseEnvelope, event: ProviderDoneEvent | ProviderErrorEvent): NotificationEvent {\n\n return pickDefined({\n type: NotificationEventType.RESPONSE_COMPLETED,\n id: uuidv4(),\n ts: Date.now(),\n organizationId: envelope.organization_id,\n userId: envelope.user_id,\n appSlug: envelope.application?.url_slug,\n severity: event.type === ProviderEventType.ERROR ? 'error' : 'info',\n message: NotificationEventType.RESPONSE_COMPLETED,\n requestId: envelope.request_id,\n payload: pickDefined({\n status: event.type === ProviderEventType.DONE ? 'success' : 'error',\n eventType: event.type,\n error: event.type === ProviderEventType.ERROR ? event.error : undefined\n }),\n threadId: envelope.thread_id,\n branchId: envelope.branch_id\n }) as NotificationEvent;\n }\n}\n","export * from './service';\nexport * from './store';\nexport * from './types';","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {pickDefined} from \"@holokai/holo-sdk\";\nimport type {INotificationStore, NotificationEvent, NotificationQuery} from '@holokai/holo-types/notification';\nimport {AppDB} from \"./app.db\";\n\n@injectable()\nexport class PostgresNotificationStore implements INotificationStore {\n constructor(private readonly db: AppDB) {\n }\n\n async insert(event: NotificationEvent): Promise<void> {\n const {\n id,\n ts,\n organizationId,\n appSlug,\n userId,\n threadId,\n requestId,\n branchId,\n type,\n severity,\n message,\n payload,\n } = event;\n\n const query = `\n INSERT INTO notifications\n (id, ts, organization_id, app_slug, user_id, thread_id, request_id, branch_id, type, severity, message,\n payload)\n VALUES ($1, $2, $3::uuid, $4, $5, $6::uuid, $7::uuid, $8, $9, $10, $11, $12::jsonb)\n ON CONFLICT (id) DO NOTHING\n `;\n\n await this.db.query(query, [\n id,\n ts,\n organizationId,\n appSlug,\n userId,\n threadId,\n requestId,\n branchId,\n type,\n severity,\n message,\n JSON.stringify(payload),\n ]);\n }\n\n async query(params: NotificationQuery): Promise<NotificationEvent[]> {\n const {\n organizationId,\n appSlug,\n threadIds,\n requestIds,\n branchIds,\n types,\n afterId,\n limit,\n } = params;\n\n // Cursor: resolve afterId -> (ts,id) for stable pagination\n let afterTs: number | null = null;\n if (afterId) {\n const row = await this.db.queryOne<{ ts: number }>(\n `SELECT ts\n FROM notifications\n WHERE id = $1\n AND organization_id = $2::uuid\n AND app_slug = $3`,\n [afterId, organizationId, appSlug]\n );\n afterTs = row?.ts ?? null;\n }\n\n const where: string[] = [`organization_id = $1::uuid`, `app_slug = $2`];\n const values: any[] = [organizationId, appSlug];\n let i = values.length;\n\n if (threadIds?.length) {\n where.push(`thread_id = ANY($${++i}::uuid[])`);\n values.push(threadIds);\n }\n\n if (requestIds?.length) {\n where.push(`request_id = ANY($${++i}::uuid[])`);\n values.push(requestIds);\n }\n\n if (branchIds?.length) {\n where.push(`branch_id = ANY($${++i}::text[])`);\n values.push(branchIds);\n }\n\n if (types?.length) {\n where.push(`type = ANY($${++i}::text[])`);\n values.push(types);\n }\n\n // Exclusive cursor (DESC order): (ts,id) strictly less than cursor\n if (afterId && afterTs !== null) {\n where.push(`(ts < $${++i} OR (ts = $${i} AND id < $${++i}))`);\n values.push(afterTs, afterId);\n }\n\n values.push(Math.max(1, limit));\n\n const query = `\n SELECT id,\n ts,\n organization_id,\n app_slug,\n user_id,\n thread_id,\n request_id,\n branch_id,\n type,\n severity,\n message,\n payload\n FROM notifications\n WHERE ${where.join(\" AND \")}\n ORDER BY ts DESC, id DESC\n LIMIT $${++i}\n `;\n\n const rows = await this.db.query<any>(query, values);\n\n return rows.map((r) => (pickDefined({\n id: r.id,\n ts: Number(r.ts),\n organizationId: r.organization_id,\n appSlug: r.app_slug,\n userId: r.user_id,\n threadId: r.thread_id,\n requestId: r.request_id,\n branchId: r.branch_id,\n type: r.type,\n severity: r.severity,\n message: r.message,\n payload: r.payload,\n }) as NotificationEvent));\n }\n}","import {injectable} from 'tsyringe';\nimport {promises as fs} from 'fs';\nimport path from 'path';\nimport {PluginType} from '@holokai/holo-types/plugin';\nimport {ClassLogger} from \"@holokai/holo-sdk\";\nimport {env} from \"../../env\";\n\nexport interface DiscoveredPlugin {\n packageName: string;\n version: string;\n entryPoint: string;\n pluginType: PluginType;\n packagePath: string;\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n main?: string;\n}\n\n@injectable()\nexport class PluginDiscoveryService extends ClassLogger {\n private pluginsDir: string;\n\n constructor() {\n super();\n this.pluginsDir = path.resolve(env.api.pluginsDir);\n }\n\n static create(pluginsDir: string): PluginDiscoveryService {\n const instance = new PluginDiscoveryService();\n instance.pluginsDir = path.resolve(pluginsDir);\n return instance;\n }\n\n async discoverPlugins(): Promise<DiscoveredPlugin[]> {\n const logger = this.mlog(this.discoverPlugins);\n try {\n const discovered = await this.scanHotPlugins();\n\n if (discovered.length > 0) {\n const pluginNames = discovered.map(p => p.packageName).join(', ');\n logger.debug(`Found ${discovered.length} plugins: ${pluginNames}`);\n }\n\n return discovered;\n } catch (error) {\n logger.error('Failed to discover plugins', {error});\n return [];\n }\n }\n\n async discoverSingle(packagePath: string): Promise<DiscoveredPlugin | null> {\n const packageDir = path.basename(packagePath);\n return this.parsePackage(packageDir, packagePath);\n }\n\n async discoverPluginsByType(pluginType: PluginType): Promise<DiscoveredPlugin[]> {\n const allPlugins = await this.discoverPlugins();\n return allPlugins.filter(plugin => plugin.pluginType === pluginType);\n }\n\n private async scanHotPlugins(): Promise<DiscoveredPlugin[]> {\n const results: DiscoveredPlugin[] = [];\n\n let topEntries;\n try {\n topEntries = await fs.readdir(this.pluginsDir, {withFileTypes: true});\n } catch {\n return results;\n }\n\n const scanVersions = async (pkgDir: string) => {\n const subEntries = await fs.readdir(pkgDir, {withFileTypes: true}).catch(() => []);\n for (const sub of subEntries) {\n if (!sub.isDirectory() && !sub.isSymbolicLink()) continue;\n const versionDir = path.join(pkgDir, sub.name);\n const plugin = await this.parsePackage(sub.name, versionDir);\n if (plugin) results.push(plugin);\n }\n };\n\n for (const entry of topEntries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) continue;\n const entryPath = path.join(this.pluginsDir, entry.name);\n\n if (entry.name.startsWith('@')) {\n const scopeEntries = await fs.readdir(entryPath, {withFileTypes: true}).catch(() => []);\n for (const scopeEntry of scopeEntries) {\n if (!scopeEntry.isDirectory() && !scopeEntry.isSymbolicLink()) continue;\n await scanVersions(path.join(entryPath, scopeEntry.name));\n }\n } else {\n await scanVersions(entryPath);\n }\n }\n\n return results;\n }\n\n private async parsePackage(packageDir: string, packagePath: string): Promise<DiscoveredPlugin | null> {\n const logger = this.mlog(this.parsePackage);\n\n try {\n const packageJsonPath = path.join(packagePath, 'package.json');\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson: PackageJson = JSON.parse(packageJsonContent);\n\n if (!packageJson.name || !packageJson.version) {\n logger.warn('Package missing required fields', {\n packageDir,\n hasName: !!packageJson.name,\n hasVersion: !!packageJson.version\n });\n return null;\n }\n\n const pluginType = this.inferPluginType(packageJson.name, packageJson);\n if (!pluginType) return null;\n\n return {\n packageName: packageJson.name,\n version: packageJson.version,\n entryPoint: packageJson.main || 'index.js',\n pluginType,\n packagePath,\n };\n } catch (error) {\n logger.warn('Failed to parse package', {\n packageDir,\n error: error instanceof Error ? error.message : String(error)\n });\n return null;\n }\n }\n\n private inferPluginType(packageName: string, packageJson?: PackageJson & Record<string, any>): PluginType | null {\n if (packageJson?.holoPlugin?.type) {\n const t = packageJson.holoPlugin.type.toUpperCase();\n if (t === 'PROVIDER') return PluginType.PROVIDER;\n if (t === 'DATASTORE') return PluginType.DATASTORE;\n }\n // Fallback: infer from name for backwards compat with plugins that don't have holoPlugin field\n if (/datastore-/i.test(packageName)) return PluginType.DATASTORE;\n if (/provider-/i.test(packageName)) return PluginType.PROVIDER;\n return null;\n }\n\n\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport Redis from 'ioredis';\nimport {env} from '../env';\nimport {ClassLogger} from \"@holokai/holo-sdk\";\n\n@injectable()\nexport class RedisService extends ClassLogger {\n private readonly client: Redis;\n\n constructor() {\n super();\n const logger = this.mlog(this.constructor);\n this.client = new Redis(env.redis.url, {\n lazyConnect: true,\n maxRetriesPerRequest: 3,\n retryStrategy(times: number) {\n return Math.min(times * 200, 5000);\n },\n });\n\n this.client.on('error', (err) => logger.error('Redis connection error', {error: err.message}));\n this.client.on('connect', () => logger.info('Redis connected'));\n }\n\n async connect(): Promise<void> {\n await this.client.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.client.quit();\n }\n\n async get<T>(key: string): Promise<T | null> {\n const raw = await this.client.get(key);\n if (raw === null) return null;\n return JSON.parse(raw) as T;\n }\n\n async set(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n const serialized = JSON.stringify(value);\n if (ttlSeconds !== undefined) {\n await this.client.set(key, serialized, 'EX', ttlSeconds);\n } else {\n await this.client.set(key, serialized);\n }\n }\n\n async del(key: string): Promise<boolean> {\n const count = await this.client.del(key);\n return count > 0;\n }\n\n async keys(pattern: string): Promise<string[]> {\n const result: string[] = [];\n let cursor = '0';\n do {\n const [nextCursor, batch] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n result.push(...batch);\n } while (cursor !== '0');\n return result;\n }\n}\n","import {injectable} from 'tsyringe';\nimport {EventEmitter} from 'events';\nimport {pathToFileURL} from 'url';\nimport type {IPlugin} from '@holokai/holo-types/plugin';\nimport type {DiscoveredPlugin} from './discovery.service';\nimport {withClassLogger} from \"@holokai/holo-sdk\";\n\nexport interface LoadedPlugin {\n plugin: IPlugin;\n discoveryInfo: DiscoveredPlugin;\n}\n\ninterface PluginLoadedEvent {\n plugin: IPlugin;\n packageName: string;\n}\n\ninterface PluginFailedEvent {\n packageName: string;\n error: Error;\n}\n\n@injectable()\nexport class PluginLoaderService extends withClassLogger(EventEmitter) {\n\n constructor() {\n super();\n }\n\n async loadPlugins(discovered: DiscoveredPlugin[]): Promise<LoadedPlugin[]> {\n const loaded: LoadedPlugin[] = [];\n\n for (const discoveryInfo of discovered) {\n const result = await this.loadPlugin(discoveryInfo);\n if (result) {\n loaded.push(result);\n }\n }\n\n return loaded;\n }\n\n async loadPlugin(discovered: DiscoveredPlugin): Promise<LoadedPlugin | null> {\n try {\n // Import from package path instead of package name to handle workspace packages\n let modulePath = `${discovered.packagePath}/${discovered.entryPoint}`;\n\n // Check if running in WSL (Linux platform but Windows-style paths)\n const isWindowsPath = /^[A-Z]:[\\\\\\/]/i.test(modulePath);\n if (isWindowsPath && process.platform === 'linux') {\n // Convert Windows path to WSL mount path: C:\\... -> /mnt/c/...\n modulePath = modulePath.replace(/^([A-Z]):[\\\\\\/]/i, (_match, drive) => {\n return `/mnt/${drive.toLowerCase()}/`;\n }).replace(/\\\\/g, '/');\n }\n\n // Convert to file:// URL for ESM import (cache bust for hot-reload support)\n const moduleURL = pathToFileURL(modulePath).href + '?v=' + Date.now();\n const module = await import(moduleURL);\n\n if (!module.default || typeof module.default !== 'object') {\n throw new Error('Plugin must export a default object');\n }\n\n const plugin = module.default as IPlugin;\n\n if (!plugin.manifest) {\n throw new Error('Plugin missing manifest property');\n }\n\n if (!plugin.manifest.name || !plugin.manifest.version || !plugin.manifest.pluginType) {\n throw new Error('Plugin manifest missing required fields');\n }\n\n console.log(`[Plugin] Loaded ${discovered.packageName} v${plugin.manifest.version}`);\n this.emit('plugin:loaded', {plugin, packageName: discovered.packageName} as PluginLoadedEvent);\n\n return {\n plugin,\n discoveryInfo: discovered\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.warn(`[Plugin] Failed to load ${discovered.packageName}: ${err.message}`);\n this.emit('plugin:failed', {packageName: discovered.packageName, error: err} as PluginFailedEvent);\n return null;\n }\n }\n}\n","import {type, type Type} from 'arktype';\nimport type {PluginType} from '@holokai/holo-types/plugin';\n\nexport interface HoloPluginPackageJson {\n name: string;\n version: string;\n main?: string;\n type?: string;\n holoPlugin: {\n type: PluginType;\n };\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nexport const HoloPluginPackageJson = type({\n name: 'string',\n version: 'string',\n 'main?': 'string',\n 'type?': 'string',\n holoPlugin: {\n type: \"'PROVIDER' | 'DATASTORE'\",\n },\n 'dependencies?': 'Record<string, string>',\n 'peerDependencies?': 'Record<string, string>',\n 'scripts?': 'Record<string, string>',\n}) satisfies Type<HoloPluginPackageJson>;\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {execFile} from 'child_process';\nimport {promisify} from 'util';\nimport {createHash} from 'crypto';\nimport {existsSync, promises as fs} from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport {ClassLogger, HoloError} from '@holokai/holo-sdk';\nimport {env} from '../../env';\nimport {RedisService} from '../redis.service';\nimport {PluginDB} from '../../db';\nimport {PluginDiscoveryService} from './discovery.service';\nimport {PluginLoaderService} from './loader.service';\nimport type {Plugin} from '@holokai/holo-types/entities';\nimport type {IProviderPlugin, PluginSchema} from '@holokai/holo-types/plugin';\nimport {type PluginContext, PluginState, PluginType} from '@holokai/holo-types/plugin';\nimport type {HoloLogger} from '@holokai/holo-types/logger';\nimport logger from '../../utils/logger';\nimport {ArkErrors} from 'arktype';\nimport {HoloPluginPackageJson} from '../../types/plugin.types';\n\nconst execFileAsync = promisify(execFile);\nconst REDIS_TARBALL_PREFIX = 'plugin:tarball:';\n\ntype PluginSource = 'filesystem' | 'upload' | 'npm';\n\ninterface PluginValidationResult {\n family: string;\n type: PluginType;\n schema?: PluginSchema | undefined;\n}\n\n@injectable()\nexport class PluginInstallerService extends ClassLogger {\n private pluginsDir: string;\n private appModulesDir: string;\n private installLock: Promise<void> = Promise.resolve();\n\n constructor(\n private redis: RedisService,\n private pluginDB: PluginDB,\n private discovery: PluginDiscoveryService,\n private loader: PluginLoaderService,\n ) {\n super();\n this.pluginsDir = path.resolve(env.api.pluginsDir);\n this.appModulesDir = path.resolve(env.api.appModulesDir);\n }\n\n static create(\n redis: RedisService, db: PluginDB,\n pluginsDir: string, appModulesDir: string,\n discovery?: PluginDiscoveryService, loader?: PluginLoaderService,\n ): PluginInstallerService {\n const d = discovery ?? PluginDiscoveryService.create(pluginsDir);\n const l = loader ?? new PluginLoaderService();\n const instance = new PluginInstallerService(redis, db, d, l);\n instance.pluginsDir = path.resolve(pluginsDir);\n instance.appModulesDir = path.resolve(appModulesDir);\n return instance;\n }\n\n setPluginsDir(dir: string): void {\n this.pluginsDir = path.resolve(dir);\n }\n\n async ensurePluginsDir(): Promise<void> {\n const log = this.mlog(this.ensurePluginsDir);\n await fs.mkdir(this.pluginsDir, {recursive: true});\n await this.cleanStaleDownloads(this.pluginsDir);\n log.info(`Plugins directory: ${this.pluginsDir}`);\n }\n\n // ─── THE FUNNEL: every install path ends here ────────────────────────\n\n async registerFromDir(\n sourceDir: string,\n source: PluginSource,\n installedBy?: string,\n ): Promise<Plugin> {\n const log = this.mlog(this.registerFromDir);\n\n const pkg = JSON.parse(await fs.readFile(path.join(sourceDir, 'package.json'), 'utf-8'));\n const {name, version} = pkg;\n if (!name || !version) throw new Error('package.json missing name or version');\n\n // 1. Install runtime deps (upload/npm only — filesystem uses workspace deps)\n if (source !== 'filesystem') {\n await this.installDeps(sourceDir);\n }\n\n // 2. Validate (static checks + dry-run load) → returns family, type, schema from plugin manifest\n const validated = await this.validatePlugin(sourceDir, pkg);\n const {family, type, schema} = validated;\n\n // Check for duplicates (upload/npm only — filesystem re-seeds are allowed)\n if (source !== 'filesystem') {\n const existingSha = await this.pluginDB.getSha256(family, version);\n if (existingSha) {\n throw HoloError.badRequest(\n `Plugin ${name}@${version} already installed (sha256: ${existingSha.slice(0, 12)}). Disable and uninstall first, or use a new version.`\n );\n }\n }\n\n // 3. Pack tarball from source\n const tarball = await this.packPlugin(sourceDir);\n const sha256 = this.hash(tarball);\n\n // 4. Copy to holo-plugins/{scope}/{name}/{version}/ (safe for concurrent access)\n const versionedDir = path.join(this.pluginsDir, ...name.split('/'), version);\n await this.safeWriteDir(sourceDir, versionedDir);\n\n // 5. Store in DB\n const meta = await this.pluginDB.store(\n name, version, family, type, tarball, sha256, source, installedBy, schema\n );\n await this.cacheTarball(name, version, tarball);\n\n if (!meta) throw new Error(`Failed to store plugin ${name}@${version}`);\n log.info(`Registered ${name}@${version} (source=${source}, ${tarball.length} bytes)`);\n return meta;\n }\n\n // ─── SOURCE: filesystem (node_modules builtins) ──────────────────────\n\n async seedAppModules(): Promise<Plugin[]> {\n const log = this.mlog(this.seedAppModules);\n if (env.api.skipInitialPlugins) {\n log.info('SKIP_INITIAL_PLUGINS is set, skipping builtin seed');\n return [];\n }\n\n const packages = await this.scanAppModulePackages();\n const seeded: Plugin[] = [];\n\n for (const {packageDir, pkg} of packages) {\n const discovered = await this.discovery.discoverSingle(packageDir);\n if (!discovered) continue;\n\n try {\n const meta = await this.registerFromDir(packageDir, 'filesystem');\n seeded.push(meta);\n } catch (e) {\n log.error(`Failed to seed ${pkg.name}@${pkg.version}: ${(e as Error).message}`);\n }\n }\n\n return seeded;\n }\n\n // ─── SOURCE: tarball upload ──────────────────────────────────────────\n\n async installFromTarball(tarball: Buffer, installedBy?: string): Promise<Plugin> {\n return this.withLock(async () => {\n const tmpDir = path.join(os.tmpdir(), `holo-plugin-upload-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);\n try {\n await this.extractTarball(tarball, tmpDir);\n return await this.registerFromDir(tmpDir, 'upload', installedBy);\n } finally {\n await fs.rm(tmpDir, {recursive: true, force: true}).catch(() => {\n });\n }\n });\n }\n\n // ─── SOURCE: npm registry ───────────────────────────────────────────\n\n async installFromRegistry(packageName: string, version?: string, installedBy?: string): Promise<Plugin> {\n if (!packageName) throw new Error('Plugin package name is required');\n\n return this.withLock(async () => {\n const log = this.mlog(this.installFromRegistry);\n const spec = version ? `${packageName}@${version}` : packageName;\n log.info(`Installing ${spec} from registry`);\n\n const tmpDir = path.join(this.pluginsDir, '.tmp-install');\n await fs.mkdir(tmpDir, {recursive: true});\n await fs.writeFile(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'holo-plugin-install',\n private: true,\n type: 'module'\n }));\n await this.npmCommand(['install', spec], tmpDir);\n\n const installedPkgPath = path.join(tmpDir, 'node_modules', ...packageName.split('/'), 'package.json');\n const installedDir = path.dirname(installedPkgPath);\n\n try {\n return await this.registerFromDir(installedDir, 'npm', installedBy);\n } finally {\n await fs.rm(tmpDir, {recursive: true, force: true}).catch(() => {\n });\n }\n });\n }\n\n // ─── Utilities ──────────────────────────────────────────────────────\n\n async extractTarball(tarball: Buffer, targetDir: string): Promise<void> {\n if (existsSync(path.join(targetDir, 'package.json'))) return;\n\n const suffix = Math.random().toString(36).slice(2, 8);\n const downloadingDir = `${targetDir}.downloading.${suffix}`;\n await fs.mkdir(downloadingDir, {recursive: true});\n\n const tmpFile = path.join(os.tmpdir(), `holo-plugin-${Date.now()}-${suffix}.tgz`);\n try {\n await fs.writeFile(tmpFile, tarball);\n await execFileAsync('tar', ['xzf', tmpFile, '--strip-components=1', '-C', downloadingDir]);\n } finally {\n await fs.unlink(tmpFile).catch(() => {\n });\n }\n\n try {\n await fs.rename(downloadingDir, targetDir);\n } catch (e: any) {\n await fs.rm(downloadingDir, {recursive: true, force: true}).catch(() => {\n });\n if (e.code === 'ENOTEMPTY' || existsSync(targetDir)) return;\n throw e;\n }\n }\n\n async uninstall(packageName: string): Promise<void> {\n if (!packageName) throw new Error('Plugin package name is required');\n return this.withLock(async () => {\n const log = this.mlog(this.uninstall);\n log.info(`Uninstalling ${packageName}`);\n const pkg = await this.pluginDB.getByName(packageName);\n if (pkg) {\n await this.pluginDB.deactivate(pkg.id);\n await this.redis.del(`${REDIS_TARBALL_PREFIX}${packageName}:${pkg.version}`);\n }\n });\n }\n\n async ensurePluginById(pluginId: string, packageName: string, version: string, sha256: string): Promise<string> {\n const log = this.mlog(this.ensurePluginById);\n const dir = await this.findOnDisk(packageName, version);\n if (dir) return dir;\n\n const versionedDir = path.join(this.pluginsDir, ...packageName.split('/'), version);\n log.info(`Plugin ${packageName}@${version} not found locally, fetching...`);\n\n let tarball = await this.getCachedTarball(packageName, version);\n if (!tarball) {\n log.info(`Redis miss for ${packageName}@${version}, fetching from Postgres by ID`);\n tarball = await this.pluginDB.getTarballById(pluginId);\n }\n if (!tarball) throw new Error(`Tarball not found for ${packageName}@${version} (${pluginId})`);\n\n if (sha256) {\n const actualHash = this.hash(tarball);\n if (actualHash !== sha256) {\n throw new Error(`Integrity check failed for ${packageName}@${version}: expected ${sha256.slice(0, 12)}, got ${actualHash.slice(0, 12)}`);\n }\n }\n\n await this.extractTarball(tarball, versionedDir);\n await this.installDeps(versionedDir);\n await this.cacheTarball(packageName, version, tarball);\n return versionedDir;\n }\n\n async ensurePlugin(packageName: string, version: string, sha256: string): Promise<string> {\n const log = this.mlog(this.ensurePlugin);\n const dir = await this.findOnDisk(packageName, version);\n if (dir) return dir;\n\n const versionedDir = path.join(this.pluginsDir, ...packageName.split('/'), version);\n log.info(`Plugin ${packageName}@${version} not found locally, fetching...`);\n\n let tarball = await this.getCachedTarball(packageName, version);\n if (!tarball) {\n log.info(`Redis miss for ${packageName}@${version}, fetching from Postgres`);\n const row = await this.pluginDB.getByNameAndVersion(packageName, version);\n tarball = row ? await this.pluginDB.getTarballById(row.id) : null;\n }\n if (!tarball) throw new Error(`Tarball not found for ${packageName}@${version}`);\n\n const actualHash = this.hash(tarball);\n if (actualHash !== sha256) {\n throw new Error(`Integrity check failed: expected ${sha256.slice(0, 12)}, got ${actualHash.slice(0, 12)}`);\n }\n\n await this.extractTarball(tarball, versionedDir);\n await this.installDeps(versionedDir);\n return versionedDir;\n }\n\n getPluginsDir(): string {\n return this.pluginsDir;\n }\n\n\n async packPlugin(packageDir: string): Promise<Buffer> {\n const {stdout} = await execFileAsync('pnpm', ['pack', '--pack-destination', os.tmpdir()], {cwd: packageDir});\n // pnpm pack emits the absolute path of the created tarball on the last line;\n // npm pack emits just the basename. Handle either.\n const last = stdout.trim().split('\\n').pop()!.trim();\n const tarballPath = path.isAbsolute(last) ? last : path.join(os.tmpdir(), last);\n const tarball = await fs.readFile(tarballPath);\n await fs.unlink(tarballPath).catch(() => {\n });\n return tarball;\n }\n\n async cacheTarball(packageName: string, version: string, tarball: Buffer): Promise<void> {\n const key = `${REDIS_TARBALL_PREFIX}${packageName}:${version}`;\n await this.redis.set(key, tarball.toString('base64'));\n }\n\n async validatePlugin(\n packageDir: string,\n providedPkgJson?: Record<string, any>,\n ): Promise<PluginValidationResult> {\n const log = this.mlog(this.validatePlugin);\n\n const raw = providedPkgJson ??\n JSON.parse(await fs.readFile(path.join(packageDir, 'package.json'), 'utf-8'));\n\n const parsed = HoloPluginPackageJson(raw);\n if (parsed instanceof ArkErrors) {\n throw new Error(`Invalid plugin package.json: ${parsed.summary}`);\n }\n const pkgJson = parsed;\n const {name, version, main} = pkgJson;\n\n const entryPoint = main || 'index.js';\n try {\n await fs.access(path.join(packageDir, entryPoint));\n } catch {\n throw new Error(`Entry point \"${entryPoint}\" not found in package`);\n }\n\n const lifecycleScripts = ['postinstall', 'preinstall', 'install', 'prepare'];\n const scripts = pkgJson.scripts || {};\n for (const script of lifecycleScripts) {\n if (scripts[script]) throw new Error(`Blocked: package.json contains lifecycle script \"${script}\"`);\n }\n\n const dangerousExts = new Set(['.sh', '.bash', '.node', '.dylib', '.so', '.exe', '.bat', '.cmd']);\n const files = await this.walkDir(packageDir);\n let totalSize = 0;\n for (const file of files) {\n const ext = path.extname(file).toLowerCase();\n if (dangerousExts.has(ext)) throw new Error(`Blocked: dangerous file type \"${ext}\": ${path.relative(packageDir, file)}`);\n const stat = await fs.stat(file);\n totalSize += stat.size;\n }\n if (totalSize > 50 * 1024 * 1024) throw new Error(`Package too large: ${(totalSize / 1024 / 1024).toFixed(1)}MB exceeds 50MB limit`);\n\n log.info(`Static checks passed for ${name}@${version} (${files.length} files, ${(totalSize / 1024).toFixed(0)}KB)`);\n\n const discovered = await this.discovery.discoverSingle(packageDir);\n if (!discovered) throw new Error(`Failed to discover plugin at ${packageDir}`);\n\n const loaded = await this.loader.loadPlugin(discovered);\n if (!loaded) throw new Error(`Failed to load plugin: module did not export valid plugin interface`);\n\n const plugin = loaded.plugin as IProviderPlugin;\n try {\n const pluginContext: PluginContext = {logger: logger as HoloLogger, config: {}, env: process.env};\n await plugin.initialize(pluginContext);\n if (plugin.getState() !== PluginState.READY) {\n throw new Error(`Plugin did not reach READY state: ${plugin.getState()}`);\n }\n log.info(`Dry-run load passed for ${name}@${version}`);\n if (!plugin.family) throw new Error(`Plugin ${name}@${version} has no family defined`);\n if (!plugin.type) throw new Error(`Plugin ${name}@${version} has no type defined`);\n return {\n family: plugin.family,\n type: plugin.type,\n schema: plugin.getSchema?.() ?? undefined,\n };\n } finally {\n try {\n await plugin.destroy();\n } catch {\n }\n }\n }\n\n // ─── Private helpers ────────────────────────────────────────────────\n\n private async findOnDisk(packageName: string, version: string): Promise<string | null> {\n // Prefer the live source in appModulesDir (node_modules/@holokai/<name>) when the\n // version matches. Loading from there means peer deps (@holokai/holo-sdk,\n // @holokai/holo-types) resolve via standard node_modules walk-up, and dev edits\n // are picked up without re-extracting. Only fall back to ~/.holokai/plugins/ for\n // plugins that aren't present in appModulesDir (e.g., uploaded via API).\n const appModulePath = path.join(this.appModulesDir, ...packageName.split('/'));\n try {\n const pkg = JSON.parse(await fs.readFile(path.join(appModulePath, 'package.json'), 'utf-8'));\n if (pkg.version === version) return appModulePath;\n } catch {\n }\n\n const versionedDir = path.join(this.pluginsDir, ...packageName.split('/'), version);\n\n // Already extracted to the plugins dir\n try {\n const pkg = JSON.parse(await fs.readFile(path.join(versionedDir, 'package.json'), 'utf-8'));\n if (pkg.version === version) return versionedDir;\n } catch {\n }\n\n // Another server is downloading the same version — wait for it to finish\n const parentDir = path.dirname(versionedDir);\n try {\n const entries = await fs.readdir(parentDir);\n const downloading = entries.find(e => e.startsWith(`${version}.downloading.`));\n if (downloading) {\n for (let i = 0; i < 60; i++) {\n await new Promise(r => setTimeout(r, 500));\n try {\n await fs.access(path.join(versionedDir, 'package.json'));\n return versionedDir;\n } catch {\n }\n }\n }\n } catch {\n }\n\n return null;\n }\n\n private async safeWriteDir(sourceDir: string, finalDir: string): Promise<void> {\n const suffix = Math.random().toString(36).slice(2, 8);\n const downloadingDir = `${finalDir}.downloading.${suffix}`;\n\n await fs.mkdir(path.dirname(finalDir), {recursive: true});\n await fs.cp(sourceDir, downloadingDir, {\n recursive: true,\n filter: (src) => !path.basename(src).startsWith('tsconfig'),\n });\n\n try {\n if (existsSync(finalDir)) {\n await fs.rm(finalDir, {recursive: true, force: true});\n }\n await fs.rename(downloadingDir, finalDir);\n } catch (e: any) {\n await fs.rm(downloadingDir, {recursive: true, force: true}).catch(() => {\n });\n if (existsSync(finalDir)) return;\n throw e;\n }\n }\n\n private async cleanStaleDownloads(baseDir: string): Promise<void> {\n const log = this.mlog(this.cleanStaleDownloads);\n try {\n const entries = await fs.readdir(baseDir, {withFileTypes: true});\n for (const entry of entries) {\n if (entry.name.includes('.downloading.')) {\n const fullPath = path.join(baseDir, entry.name);\n await fs.rm(fullPath, {recursive: true, force: true}).catch(() => {\n });\n log.info(`Cleaned stale download: ${entry.name}`);\n } else if (entry.isDirectory()) {\n await this.cleanStaleDownloads(path.join(baseDir, entry.name));\n }\n }\n } catch {\n }\n }\n\n private async installDeps(pluginDir: string): Promise<number> {\n const pkgPath = path.join(pluginDir, 'package.json');\n const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));\n const deps = pkg.dependencies;\n if (!deps || Object.keys(deps).length === 0) return 0;\n if (existsSync(path.join(pluginDir, 'node_modules'))) return 0;\n\n // Only install deps not already resolvable from ancestor node_modules.\n // Duplicating shared packages (tsyringe, @holokai/*, express, etc.) creates\n // separate module instances that break singleton DI containers.\n const missing: string[] = [];\n for (const [name, version] of Object.entries(deps)) {\n try {\n require.resolve(name, {paths: [pluginDir]});\n } catch {\n missing.push(`${name}@${version}`);\n }\n }\n\n if (missing.length === 0) return 0;\n\n const log = this.mlog(this.installDeps);\n log.info(`Installing ${missing.length} dep(s) for ${pkg.name}@${pkg.version}: ${missing.join(', ')}`);\n await this.npmCommand(['add', '--prod', '--ignore-scripts', '--config.auto-install-peers=false', ...missing], pluginDir);\n log.info(`Installed deps for ${pkg.name}@${pkg.version}`);\n return missing.length;\n }\n\n private async walkDir(dir: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdir(dir, {withFileTypes: true});\n for (const entry of entries) {\n if (entry.name === 'node_modules') continue;\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) results.push(...await this.walkDir(full));\n else results.push(full);\n }\n return results;\n }\n\n private async scanAppModulePackages(): Promise<Array<{ packageDir: string; pkg: Record<string, any> }>> {\n const results: Array<{ packageDir: string; pkg: Record<string, any> }> = [];\n const scopeDirs = await fs.readdir(this.appModulesDir).catch(() => [] as string[]);\n for (const entry of scopeDirs) {\n const entryPath = path.join(this.appModulesDir, entry);\n if (!entry.startsWith('@')) continue;\n const scopeEntries = await fs.readdir(entryPath).catch(() => [] as string[]);\n for (const pkg of scopeEntries) {\n const pkgDir = await fs.realpath(path.join(entryPath, pkg)).catch(() => null);\n if (!pkgDir) continue;\n try {\n const pkgJson = JSON.parse(await fs.readFile(path.join(pkgDir, 'package.json'), 'utf-8'));\n if (pkgJson.name && pkgJson.version && pkgJson.holoPlugin?.type) {\n results.push({packageDir: pkgDir, pkg: pkgJson});\n }\n } catch {\n }\n }\n }\n return results;\n }\n\n private hash(data: Buffer): string {\n return createHash('sha256').update(data).digest('hex');\n }\n\n private async getCachedTarball(packageName: string, version: string): Promise<Buffer | null> {\n const key = `${REDIS_TARBALL_PREFIX}${packageName}:${version}`;\n const data = await this.redis.get<string>(key);\n return data ? Buffer.from(data, 'base64') : null;\n }\n\n private async npmCommand(args: string[], cwd: string): Promise<string> {\n const {stdout, stderr} = await execFileAsync('pnpm', args, {cwd, timeout: 120000});\n if (stderr && !stderr.includes('WARN')) this.log.warn(`pnpm stderr: ${stderr.slice(0, 500)}`);\n return stdout;\n }\n\n private withLock<T>(fn: () => Promise<T>): Promise<T> {\n const prev = this.installLock;\n let resolve: () => void;\n this.installLock = new Promise<void>(r => resolve = r);\n return prev.then(fn).finally(() => resolve!());\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport {type RouteDefinition} from \"@holokai/holo-types/routing\";\nimport {ProtocolDB} from '../../db';\nimport {type Protocol} from \"@holokai/holo-types/entities\";\n\n@injectable()\nexport class ProviderPluginService extends ClassLogger {\n\n private readonly pluginProtocols: Map<string, Map<string, Protocol>> = new Map();\n\n constructor(\n private protocolDB: ProtocolDB,\n ) {\n super();\n }\n\n async registerProtocols(pluginId: string, routes: RouteDefinition[]): Promise<void> {\n const logger = this.mlog(this.registerProtocols);\n let protocols = this.pluginProtocols.get(pluginId);\n if (!protocols) {\n protocols = new Map();\n this.pluginProtocols.set(pluginId, protocols);\n }\n for (const routeDef of routes) {\n const {protocol} = routeDef;\n const path = routeDef.paths.join(',');\n const dbProtocol = await this.protocolDB.upsert(pluginId, protocol.name, protocol.capability, path);\n\n if (!dbProtocol) {\n logger.warn(`Unable to upsert protocol ${protocol.name}`);\n } else {\n protocols.set(dbProtocol.name, dbProtocol);\n }\n }\n }\n\n\n async loadProtocolsFromDB(pluginId: string): Promise<void> {\n const protocols = await this.protocolDB.getByPlugin(pluginId);\n const map = new Map<string, Protocol>();\n for (const p of protocols) {\n map.set(p.name, p);\n }\n this.pluginProtocols.set(pluginId, map);\n }\n\n removeProtocols(pluginId: string): void {\n this.pluginProtocols.delete(pluginId);\n }\n\n async getProtocol(pluginId: string, protocolName: string): Promise<Protocol> {\n return this.pluginProtocols.get(pluginId)?.get(protocolName)!;\n }\n\n getProtocolByCapability(pluginId: string, capability: string): Protocol | undefined {\n const protocols = this.pluginProtocols.get(pluginId);\n if (!protocols) return undefined;\n for (const protocol of protocols.values()) {\n if (protocol.capability === capability) return protocol;\n }\n return undefined;\n }\n}\n","import 'reflect-metadata';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport {RedisService} from \"../redis.service\";\n\n\nexport interface EntityCacheConfig {\n prefix: string;\n ttl: number;\n}\n\nexport abstract class BaseEntityService<T> extends ClassLogger {\n protected constructor(\n protected redis: RedisService,\n protected config: EntityCacheConfig,\n ) {\n super();\n }\n\n async invalidate(id: string, orgId: string): Promise<void> {\n const logger = this.mlog(this.invalidate);\n logger.info(`Invalidating ${this.config.prefix}:${id} for org ${orgId}`);\n await this.redis.del(this.key(orgId, id));\n }\n\n async invalidateByOrg(orgId: string): Promise<void> {\n const keys = await this.redis.keys(this.key(orgId, '*'));\n for (const key of keys) await this.redis.del(key);\n }\n\n protected async cached(key: string, query: () => Promise<T | null>): Promise<T | null> {\n const cached = await this.redis.get<T>(key);\n if (cached) {\n this.log.info(`Cache ${key}: true`);\n return cached;\n }\n\n const result = await query();\n if (!result) return null;\n\n await this.redis.set(key, result, this.config.ttl);\n return result;\n }\n\n protected key(orgId: string, suffix: string): string {\n return `org:${orgId}:${this.config.prefix}:${suffix}`;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ApplicationDB} from '../../db';\nimport {BaseEntityService} from './base.entity.service';\nimport type {Application} from '@holokai/holo-types/entities';\nimport {RedisService} from \"../redis.service\";\n\n@injectable()\nexport class ApplicationService extends BaseEntityService<Application> {\n constructor(\n redis: RedisService,\n private applicationDB: ApplicationDB,\n ) {\n super(redis, {prefix: 'application', ttl: 120});\n }\n\n async getBySlug(orgId: string, urlSlug: string): Promise<Application | null> {\n return this.cached(this.key(orgId, urlSlug), () => this.applicationDB.getBySlug(orgId, urlSlug));\n }\n\n async getBySlugs(orgId: string, slugs: string[]): Promise<Application[]> {\n const results: Application[] = [];\n for (const slug of slugs) {\n const app = await this.getBySlug(orgId, slug);\n if (app) results.push(app);\n }\n return results;\n }\n\n async getById(applicationId: string): Promise<Application | null> {\n return this.cached(`app:id:${applicationId}`, () => this.applicationDB.getById(applicationId));\n }\n\n async getBySlugUnscoped(urlSlug: string): Promise<Application | null> {\n return this.cached(`app:slug:${urlSlug}`, () => this.applicationDB.getBySlugUnscoped(urlSlug));\n }\n\n override async invalidate(id: string, orgId: string): Promise<void> {\n await super.invalidate(id, orgId);\n const authKeys = await this.redis.keys(`auth:*:${id}`);\n for (const key of authKeys) await this.redis.del(key);\n }\n\n async getAllByOrg(orgId: string): Promise<Application[]> {\n return this.applicationDB.getAllByOrg(orgId);\n }\n}\n","import 'reflect-metadata';\nimport {ProviderDB, type ProviderWithCredential} from \"../../db/provider.db\";\nimport {injectable} from \"tsyringe\";\nimport {BaseEntityService} from \"./base.entity.service\";\nimport {type Provider} from \"@holokai/holo-types\";\nimport {RedisService} from \"../redis.service\";\n\n@injectable()\nexport class ProviderService extends BaseEntityService<Provider> {\n serverId: string | undefined;\n\n constructor(\n private providerDB: ProviderDB,\n redis: RedisService,\n ) {\n super(redis, {prefix: 'provider', ttl: 300});\n }\n\n async getProviders(): Promise<ProviderWithCredential[]> {\n return this.providerDB.list();\n }\n\n async getByName(orgId: string, providerName: string): Promise<Provider | null> {\n return this.cached(this.key(orgId, `name:${providerName}`), async () => {\n const provider = await this.providerDB.get(providerName);\n return (provider && provider.organization_id === orgId) ? provider : null;\n });\n }\n\n async getById(id: string): Promise<Provider | null> {\n return this.cached(`provider:${id}`, () => this.providerDB.getById(id));\n }\n\n async findByPluginId(pluginId: string): Promise<ProviderWithCredential[]> {\n return this.providerDB.findByPluginId(pluginId);\n }\n\n async migrateToLatestPlugin(family: string, latestPluginId: string): Promise<number> {\n return this.providerDB.migrateToLatestPlugin(family, latestPluginId);\n }\n\n async updatePluginId(providerId: string, pluginId: string): Promise<void> {\n await this.providerDB.update(providerId, {plugin_id: pluginId} as any);\n }\n\n async findByPluginFamily(family: string, excludePluginId?: string): Promise<ProviderWithCredential[]> {\n return this.providerDB.findByPluginFamily(family, excludePluginId);\n }\n}\n","export {ApplicationService} from './application.service';\nexport {BaseEntityService} from './base.entity.service';\nexport {ProviderService} from './provider.service';\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport type {IPlugin, IProviderPlugin, PluginContext} from '@holokai/holo-types/plugin';\nimport {PluginState, PluginType} from '@holokai/holo-types/plugin';\nimport type {HoloLogger} from '@holokai/holo-types/logger';\nimport logger from '../../utils/logger';\nimport {PluginInstallerService} from './plugin.installer.service';\nimport {PluginDiscoveryService} from './discovery.service';\nimport {PluginLoaderService} from './loader.service';\nimport {PluginDB} from '../../db';\n\n@injectable()\nexport class PluginRegistry extends ClassLogger {\n private plugins = new Map<string, IPlugin>();\n private loading = new Map<string, Promise<IPlugin>>();\n\n constructor(\n private installer: PluginInstallerService,\n private discovery: PluginDiscoveryService,\n private loader: PluginLoaderService,\n private pluginDB: PluginDB,\n ) {\n super();\n }\n\n async getOrLoad(pluginId: string): Promise<IPlugin> {\n const existing = this.plugins.get(pluginId);\n if (existing) return existing;\n\n const inflight = this.loading.get(pluginId);\n if (inflight) return inflight;\n\n const promise = this.loadPlugin(pluginId);\n this.loading.set(pluginId, promise);\n try {\n const plugin = await promise;\n return plugin;\n } finally {\n this.loading.delete(pluginId);\n }\n }\n\n get(pluginId: string): IPlugin | undefined {\n return this.plugins.get(pluginId);\n }\n\n has(pluginId: string): boolean {\n return this.plugins.has(pluginId);\n }\n\n getAsProvider(pluginId: string): IProviderPlugin | undefined {\n return this.plugins.get(pluginId) as IProviderPlugin | undefined;\n }\n\n findByFamily(family: string): IProviderPlugin {\n const wanted = family.toLowerCase();\n const candidates: IProviderPlugin[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.type !== PluginType.PROVIDER) continue;\n if (plugin.family.toLowerCase() !== wanted) continue;\n candidates.push(plugin as IProviderPlugin);\n }\n if (candidates.length === 0) {\n throw new Error(`No active provider plugin loaded for family: ${family}`);\n }\n if (candidates.length === 1) return candidates[0];\n candidates.sort((a, b) => b.version.localeCompare(a.version, undefined, {numeric: true}));\n return candidates[0];\n }\n\n remove(pluginId: string): void {\n const plugin = this.plugins.get(pluginId);\n if (plugin) {\n plugin.destroy().catch(() => {\n });\n this.plugins.delete(pluginId);\n }\n }\n\n async loadAllActive(): Promise<void> {\n const log = this.mlog(this.loadAllActive);\n const active = await this.pluginDB.listActive();\n log.info(`Loading ${active.length} active plugin(s) from DB...`);\n\n for (const row of active) {\n if (this.has(row.id)) continue;\n try {\n await this.getOrLoad(row.id);\n } catch (e) {\n log.warn(`Failed to load ${row.name}@${row.version}: ${(e as Error).message}`);\n }\n }\n\n log.info(`Registry has ${this.plugins.size} plugin(s) loaded`);\n }\n\n allLoaded(): Map<string, IPlugin> {\n return new Map(this.plugins);\n }\n\n private async loadPlugin(pluginId: string): Promise<IPlugin> {\n const log = this.mlog(this.loadPlugin);\n\n const row = await this.pluginDB.getById(pluginId);\n if (!row) throw new Error(`Plugin ${pluginId} not found in DB`);\n\n log.info(`Loading plugin ${row.name}@${row.version} (${pluginId})`);\n\n const dir = await this.installer.ensurePluginById(pluginId, row.name, row.version, row.sha256 ?? '');\n\n const discovered = await this.discovery.discoverSingle(dir);\n if (!discovered) throw new Error(`Failed to discover plugin at ${dir}`);\n\n const loaded = await this.loader.loadPlugin(discovered);\n if (!loaded) throw new Error(`Failed to load plugin module for ${row.name}@${row.version}`);\n\n const plugin = loaded.plugin;\n const pluginContext: PluginContext = {\n logger: logger as HoloLogger,\n config: {},\n env: process.env\n };\n\n await plugin.initialize(pluginContext);\n if (plugin.getState() !== PluginState.READY) {\n try {\n await plugin.destroy();\n } catch {\n }\n throw new Error(`Plugin ${row.name}@${row.version} did not reach READY state: ${plugin.getState()}`);\n }\n\n (plugin as any).id = pluginId;\n this.plugins.set(pluginId, plugin);\n log.info(`Plugin ${row.name}@${row.version} loaded and ready (${pluginId})`);\n return plugin;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {AccessDB} from '../../db';\nimport {RedisService} from \"../redis.service\";\nimport {BaseEntityService} from \"../entities\";\n\n@injectable()\nexport class AccessService extends BaseEntityService<any> {\n constructor(\n private accessDB: AccessDB,\n redis: RedisService,\n ) {\n super(redis, {prefix: 'access', ttl: 120});\n }\n\n async hasAccess(orgId: string, userId: string, applicationId: string): Promise<boolean> {\n const key = `${this.config.prefix}:${userId}:${applicationId}`;\n const cached = await this.redis.get<boolean>(key);\n if (cached !== null) return cached;\n\n const result = await this.accessDB.hasAccess(orgId, userId, applicationId);\n await this.redis.set(key, result, this.config.ttl);\n return result;\n }\n\n async hasModelAccess(orgId: string, userId: string, applicationId: string, accessModel: string): Promise<boolean> {\n const key = `${this.config.prefix}:model:${userId}:${applicationId}:${accessModel}`;\n const cached = await this.redis.get<boolean>(key);\n if (cached !== null) return cached;\n\n const result = await this.accessDB.hasModelAccess(orgId, userId, applicationId, accessModel);\n await this.redis.set(key, result, this.config.ttl);\n return result;\n }\n\n async getAccessibleApplicationIds(userId: string, orgId: string): Promise<string[]> {\n return await this.cached(`${this.config.prefix}:${userId}:org:${orgId}`,\n () => this.accessDB.getAccessibleApplicationIds(userId, orgId)) ?? [];\n }\n\n async getUserEmailById(orgId: string, userId: string): Promise<string | null> {\n return this.cached(`${this.config.prefix}:userId:${userId}`,\n () => this.accessDB.getUserEmailById(orgId, userId));\n }\n\n async getUserIdByEmail(orgId: string, email: string): Promise<string | null> {\n return this.cached(`${this.config.prefix}:email:${email.trim().toLowerCase()}`,\n () => this.accessDB.getUserIdByEmail(orgId, email.trim()));\n }\n\n async invalidateUser(userId: string): Promise<void> {\n const keys = await this.redis.keys(`${this.config.prefix}:${userId}:*`);\n for (const key of keys) await this.redis.del(key);\n }\n\n async invalidateEmail(email: string): Promise<void> {\n await this.redis.del(`${this.config.prefix}:email:${email.trim().toLowerCase()}`);\n }\n}\n","export class MokuApiError extends Error {\n readonly status: number;\n readonly body?: unknown;\n\n constructor(message: string, status: number, body?: unknown) {\n super(message);\n this.name = 'MokuApiError';\n this.status = status;\n this.body = body;\n }\n}\n\nexport class MokuTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'MokuTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n","import {MokuApiError, MokuTimeoutError} from './errors';\nimport type {MokuClientOptions} from './types';\n\ninterface RequestOptions {\n method: string;\n path: string;\n body?: unknown;\n query?: Record<string, unknown>;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\nfunction toQueryString(params?: Record<string, unknown>): string {\n if (!params) return '';\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return '';\n return '?' + entries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`).join('&');\n}\n\nexport class MokuFetchTransport {\n private readonly baseUrl: string;\n private readonly tokenSource?: string | (() => string | Promise<string>);\n private readonly _fetch: typeof globalThis.fetch;\n private readonly timeout: number;\n\n constructor(options: MokuClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.tokenSource = options.token;\n this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.timeout = options.timeout ?? 10_000;\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const url = `${this.baseUrl}${options.path}${toQueryString(options.query)}`;\n\n const headers: Record<string, string> = {...options.headers};\n\n const token = await this.resolveToken();\n if (token) headers['Authorization'] = `Bearer ${token}`;\n if (options.body !== undefined) headers['Content-Type'] = 'application/json';\n\n const init: RequestInit = {method: options.method, headers};\n if (options.body !== undefined) init.body = JSON.stringify(options.body);\n\n const effectiveSignal = this.applyTimeout(options.signal);\n if (effectiveSignal) init.signal = effectiveSignal;\n\n try {\n const response = await this._fetch(url, init);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n } catch (e) {\n throw this.classifyError(e, options.signal);\n }\n }\n\n private async resolveToken(): Promise<string | undefined> {\n if (!this.tokenSource) return undefined;\n if (typeof this.tokenSource === 'string') return this.tokenSource;\n return this.tokenSource();\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let body: unknown;\n const text = await response.text();\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n throw new MokuApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n body,\n );\n }\n\n private applyTimeout(externalSignal?: AbortSignal): AbortSignal | undefined {\n const timeoutSignal = AbortSignal.timeout(this.timeout);\n if (!externalSignal) return timeoutSignal;\n return AbortSignal.any([externalSignal, timeoutSignal]);\n }\n\n private classifyError(e: unknown, externalSignal?: AbortSignal): unknown {\n if (e instanceof MokuApiError || e instanceof MokuTimeoutError) return e;\n\n if (e instanceof DOMException && e.name === 'AbortError') {\n if (externalSignal?.aborted) return e;\n return new MokuTimeoutError(this.timeout);\n }\n if (e instanceof DOMException && e.name === 'TimeoutError') {\n return new MokuTimeoutError(this.timeout);\n }\n\n return e;\n }\n}\n","export interface MokuRequestable {\n request<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T>;\n}\n\nexport class BaseNamespace {\n constructor(protected readonly client: MokuRequestable) {\n }\n\n protected get<T>(path: string, query?: Record<string, unknown>): Promise<T> {\n return this.client.request('GET', path, undefined, query);\n }\n\n protected post<T>(path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.client.request('POST', path, body, query);\n }\n\n protected put<T>(path: string, body?: unknown): Promise<T> {\n return this.client.request('PUT', path, body);\n }\n\n protected patch<T>(path: string, body?: unknown): Promise<T> {\n return this.client.request('PATCH', path, body);\n }\n\n protected del<T = void>(path: string): Promise<T> {\n return this.client.request('DELETE', path);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {AuthProviderListItem, OAuth2ClientRegistration, UserDetail,} from '@holokai/moku-types';\n\nexport interface ClientCredentialsBody {\n clientId: string;\n clientSecret: string;\n}\n\nexport class AuthNamespace extends BaseNamespace {\n validateApiKey(apiKey: string): Promise<Record<string, unknown>> {\n return this.post('/api/auth/token/refresh', {apiKey});\n }\n\n exchangeCode(body: { code: string }): Promise<Record<string, unknown>> {\n return this.post('/api/auth/exchange-code', body);\n }\n\n me(): Promise<Record<string, unknown>> {\n return this.get('/api/auth/me');\n }\n\n test(): Promise<string> {\n return this.get('/api/auth/test');\n }\n\n getUser(): Promise<Record<string, unknown>> {\n return this.get('/api/auth/user');\n }\n\n loginSuccess(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.get('/api/auth/login/success', params);\n }\n\n generateUser(body: Record<string, unknown>): Promise<UserDetail> {\n return this.post('/api/dev/users', body);\n }\n\n generateToken(userId: string): Promise<string> {\n return this.post(`/api/dev/users/${encodeURIComponent(userId)}/generate-token`);\n }\n\n getAuthProviders(): Promise<AuthProviderListItem[]> {\n return this.get('/api/public/auth/providers');\n }\n\n listRegistrations(): Promise<OAuth2ClientRegistration[]> {\n return this.get('/api/admin/oauth2/client-registrations');\n }\n\n updateCredentials(registrationId: string, body: ClientCredentialsBody): Promise<Record<string, unknown>> {\n return this.put(`/api/admin/oauth2/client-registrations/${encodeURIComponent(registrationId)}/credentials`, body);\n }\n\n refreshRegistrations(): Promise<Record<string, unknown>> {\n return this.post('/api/admin/oauth2/refresh');\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ApplicationCreateRequest,\n ApplicationDetail,\n ApplicationSummary,\n ApplicationUpdateRequest,\n AuditHistoryApplicationDetail,\n FilterOptionsDto,\n PagedResponse,\n UrlSlugValidation,\n} from '@holokai/moku-types';\n\nexport interface ApplicationListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n providerId?: string;\n status?: string;\n}\n\nexport interface ApplicationHistoryParams {\n page?: number;\n size?: number;\n}\n\nexport interface ApplicationsByTeamParams {\n teamId: string;\n page?: number;\n size?: number;\n}\n\nexport interface ApplicationsByTeamPathParams {\n page?: number;\n size?: number;\n}\n\nexport class ApplicationsNamespace extends BaseNamespace {\n list(params?: ApplicationListParams): Promise<PagedResponse<ApplicationSummary>> {\n return this.get('/api/applications', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<ApplicationDetail> {\n return this.get(`/api/applications/${encodeURIComponent(id)}`);\n }\n\n create(body: ApplicationCreateRequest): Promise<ApplicationDetail> {\n return this.post('/api/applications', body);\n }\n\n update(id: string, body: ApplicationUpdateRequest): Promise<ApplicationDetail> {\n return this.put(`/api/applications/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/applications/${encodeURIComponent(id)}`);\n }\n\n history(id: string, params?: ApplicationHistoryParams): Promise<AuditHistoryApplicationDetail[]> {\n return this.get(`/api/applications/${encodeURIComponent(id)}/history`, params as Record<string, unknown>);\n }\n\n filters(): Promise<FilterOptionsDto> {\n return this.get('/api/applications/filters');\n }\n\n validateSlug(slug: string): Promise<UrlSlugValidation> {\n return this.get(`/api/applications/validate/slug/${encodeURIComponent(slug)}`);\n }\n\n byTeam(params: ApplicationsByTeamParams): Promise<ApplicationSummary[]> {\n return this.get('/api/applications/by-team', params as unknown as Record<string, unknown>);\n }\n\n byTeamPath(path: string, params?: ApplicationsByTeamPathParams): Promise<ApplicationSummary[]> {\n return this.get(`/api/applications/by-team-path/${encodeURIComponent(path)}`, params as Record<string, unknown>);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ConnectivityTestResult,\n ModelSyncResult,\n PagedResponse,\n ProviderCreateRequest,\n ProviderDetail,\n ProviderSummary,\n ProviderUpdateRequest,\n} from '@holokai/moku-types';\n\nexport interface ProviderListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n enabled?: boolean;\n}\n\nexport class ProvidersNamespace extends BaseNamespace {\n list(params?: ProviderListParams): Promise<PagedResponse<ProviderSummary>> {\n return this.get('/api/v1/providers', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<ProviderDetail> {\n return this.get(`/api/v1/providers/${encodeURIComponent(id)}`);\n }\n\n create(body: ProviderCreateRequest): Promise<ProviderDetail> {\n return this.post('/api/v1/providers', body);\n }\n\n update(id: string, body: ProviderUpdateRequest): Promise<ProviderDetail> {\n return this.put(`/api/v1/providers/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/v1/providers/${encodeURIComponent(id)}`);\n }\n\n testConnectivity(id: string): Promise<ConnectivityTestResult> {\n return this.post(`/api/v1/providers/${encodeURIComponent(id)}/test-connectivity`);\n }\n\n testConfig(body: Record<string, unknown>): Promise<ConnectivityTestResult> {\n return this.post('/api/v1/providers/test-connectivity', body);\n }\n\n syncModels(id: string): Promise<ModelSyncResult> {\n return this.post(`/api/v1/providers/${encodeURIComponent(id)}/sync-models`);\n }\n\n setEnabled(id: string, enabled: boolean): Promise<ProviderDetail> {\n return this.patch(`/api/v1/providers/${encodeURIComponent(id)}/enabled`, {enabled});\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ModelCreateRequest,\n ModelDetail,\n ModelSummary,\n ModelUpdateRequest,\n PagedResponse,\n} from '@holokai/moku-types';\n\nexport interface ModelListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n providerId?: string;\n enabled?: boolean;\n}\n\nexport class ModelsNamespace extends BaseNamespace {\n list(params?: ModelListParams): Promise<PagedResponse<ModelSummary>> {\n return this.get('/api/v1/models', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<ModelDetail> {\n return this.get(`/api/v1/models/${encodeURIComponent(id)}`);\n }\n\n create(body: ModelCreateRequest): Promise<ModelDetail> {\n return this.post('/api/v1/models', body);\n }\n\n update(id: string, body: ModelUpdateRequest): Promise<ModelDetail> {\n return this.put(`/api/v1/models/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/v1/models/${encodeURIComponent(id)}`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ByokToggleRequest,\n OrganizationCreateRequest,\n OrganizationDetail,\n OrganizationListItem,\n OrganizationUpdateRequest,\n PagedResponse,\n SegmentCreateRequest,\n SegmentDetail,\n} from '@holokai/moku-types';\n\nexport interface OrganizationListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n active?: boolean;\n}\n\nexport interface SegmentListParams {\n page?: number;\n size?: number;\n}\n\nexport class OrganizationsNamespace extends BaseNamespace {\n list(params?: OrganizationListParams): Promise<PagedResponse<OrganizationListItem>> {\n return this.get('/api/organizations', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<OrganizationDetail> {\n return this.get(`/api/organizations/${encodeURIComponent(id)}`);\n }\n\n create(body: OrganizationCreateRequest): Promise<OrganizationDetail> {\n return this.post('/api/organizations', body);\n }\n\n update(id: string, body: OrganizationUpdateRequest): Promise<OrganizationDetail> {\n return this.put(`/api/organizations/${encodeURIComponent(id)}`, body);\n }\n\n toggleByok(organizationId: string, body: ByokToggleRequest): Promise<OrganizationDetail> {\n return this.patch(`/api/organizations/${encodeURIComponent(organizationId)}/byok`, body);\n }\n\n getSegments(organizationId: string, params?: SegmentListParams): Promise<SegmentDetail[]> {\n return this.get(`/api/organizations/${encodeURIComponent(organizationId)}/segments`, params as Record<string, unknown>);\n }\n\n createSegment(organizationId: string, body: SegmentCreateRequest): Promise<SegmentDetail> {\n return this.post(`/api/organizations/${encodeURIComponent(organizationId)}/segments`, body);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ApplicationSummary,\n PagedResponse,\n TeamCreateRequest,\n TeamDetail,\n TeamSummary,\n TeamUpdateRequest,\n TreeNode,\n UserSummary,\n} from '@holokai/moku-types';\n\nexport interface TeamListParams {\n page?: number;\n size?: number;\n sort?: string;\n nameFilter?: string;\n pathFilter?: string;\n}\n\nexport interface TeamUsersParams {\n page?: number;\n size?: number;\n}\n\nexport interface TeamApplicationsParams {\n page?: number;\n size?: number;\n}\n\nexport interface TeamSearchParams {\n pattern: string;\n}\n\nexport class TeamsNamespace extends BaseNamespace {\n list(params?: TeamListParams): Promise<PagedResponse<TeamSummary>> {\n return this.get('/api/v1/teams', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<TeamDetail> {\n return this.get(`/api/v1/teams/${encodeURIComponent(id)}`);\n }\n\n create(body: TeamCreateRequest): Promise<TeamDetail> {\n return this.post('/api/v1/teams', body);\n }\n\n update(id: string, body: TeamUpdateRequest): Promise<TeamDetail> {\n return this.put(`/api/v1/teams/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/v1/teams/${encodeURIComponent(id)}`);\n }\n\n addUser(teamId: string, userId: string): Promise<void> {\n return this.post(`/api/v1/teams/${encodeURIComponent(teamId)}/users/${encodeURIComponent(userId)}`);\n }\n\n removeUser(teamId: string, userId: string): Promise<void> {\n return this.del(`/api/v1/teams/${encodeURIComponent(teamId)}/users/${encodeURIComponent(userId)}`);\n }\n\n getUsers(id: string, params?: TeamUsersParams): Promise<UserSummary[]> {\n return this.get(`/api/v1/teams/${encodeURIComponent(id)}/users`, params as Record<string, unknown>);\n }\n\n getApplications(id: string, params?: TeamApplicationsParams): Promise<ApplicationSummary[]> {\n return this.get(`/api/v1/teams/${encodeURIComponent(id)}/applications`, params as Record<string, unknown>);\n }\n\n search(params: TeamSearchParams): Promise<TeamSummary[]> {\n return this.get('/api/v1/teams/search', params as unknown as Record<string, unknown>);\n }\n\n byPath(path: string): Promise<TeamDetail> {\n return this.get(`/api/v1/teams/path/${encodeURIComponent(path)}`);\n }\n\n descendants(path: string): Promise<TeamSummary[]> {\n return this.get(`/api/v1/teams/path/${encodeURIComponent(path)}/descendants`);\n }\n\n children(path: string): Promise<TeamSummary[]> {\n return this.get(`/api/v1/teams/path/${encodeURIComponent(path)}/children`);\n }\n\n allUsers(path: string): Promise<UserSummary[]> {\n return this.get(`/api/v1/teams/path/${encodeURIComponent(path)}/all-users`);\n }\n\n byLevel(level: number): Promise<TeamSummary[]> {\n return this.get(`/api/v1/teams/level/${level}`);\n }\n\n hierarchy(): Promise<TreeNode[]> {\n return this.get('/api/v1/teams/hierarchy');\n }\n\n hierarchyFromTeam(teamId: string): Promise<TreeNode> {\n return this.get(`/api/v1/teams/hierarchy/${encodeURIComponent(teamId)}`);\n }\n\n userTeams(userId: string): Promise<TeamSummary[]> {\n return this.get(`/api/v1/teams/users/${encodeURIComponent(userId)}/teams`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n PagedResponse,\n UserCreateRequest,\n UserDetail,\n UserRolesUpdateRequest,\n UserStatusUpdateRequest,\n UserSummary,\n UserUpdateRequest,\n} from '@holokai/moku-types';\n\nexport interface UserListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n active?: boolean;\n}\n\nexport class UsersNamespace extends BaseNamespace {\n list(params?: UserListParams): Promise<PagedResponse<UserSummary>> {\n return this.get('/api/admin/users', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<UserDetail> {\n return this.get(`/api/admin/users/${encodeURIComponent(id)}`);\n }\n\n create(body: UserCreateRequest): Promise<UserDetail> {\n return this.post('/api/admin/users', body);\n }\n\n update(id: string, body: UserUpdateRequest): Promise<UserDetail> {\n return this.put(`/api/admin/users/${encodeURIComponent(id)}`, body);\n }\n\n updateStatus(id: string, body: UserStatusUpdateRequest): Promise<UserDetail> {\n return this.patch(`/api/admin/users/${encodeURIComponent(id)}/status`, body);\n }\n\n updateRoles(id: string, body: UserRolesUpdateRequest): Promise<UserDetail> {\n return this.patch(`/api/admin/users/${encodeURIComponent(id)}/roles`, body);\n }\n\n checkEmail(email: string): Promise<Record<string, boolean>> {\n return this.get('/api/admin/users/check-email', {email});\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ApiCredentialCreateRequest,\n ApiCredentialDetail,\n ApiCredentialListItem,\n ApiCredentialUpdateRequest,\n PagedResponse,\n VaultResponse,\n} from '@holokai/moku-types';\n\nexport interface CredentialListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n}\n\nexport interface AvailableCredentialsParams {\n providerType: string;\n}\n\nexport class CredentialsNamespace extends BaseNamespace {\n list(params?: CredentialListParams): Promise<PagedResponse<ApiCredentialListItem>> {\n return this.get('/api/v1/credentials', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<ApiCredentialDetail> {\n return this.get(`/api/v1/credentials/${encodeURIComponent(id)}`);\n }\n\n create(body: ApiCredentialCreateRequest): Promise<ApiCredentialDetail> {\n return this.post('/api/v1/credentials', body);\n }\n\n update(id: string, body: ApiCredentialUpdateRequest): Promise<ApiCredentialDetail> {\n return this.put(`/api/v1/credentials/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/v1/credentials/${encodeURIComponent(id)}`);\n }\n\n system(): Promise<PagedResponse<unknown>> {\n return this.get('/api/v1/credentials/system');\n }\n\n availableForProvider(params: AvailableCredentialsParams): Promise<ApiCredentialListItem[]> {\n return this.get('/api/v1/credentials/available-for-provider', params as unknown as Record<string, unknown>);\n }\n\n listSecrets(path: string): Promise<VaultResponse> {\n return this.get(`/api/secrets/list/${encodeURIComponent(path)}`);\n }\n\n getSecret(path: string): Promise<VaultResponse> {\n return this.get(`/api/secrets/${encodeURIComponent(path)}`);\n }\n\n createOrUpdateSecret(path: string, body: Record<string, unknown>): Promise<void> {\n return this.post(`/api/secrets/${encodeURIComponent(path)}`, body);\n }\n\n deleteSecret(path: string): Promise<void> {\n return this.del(`/api/secrets/${encodeURIComponent(path)}`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n FilterOptions,\n PagedResponse,\n PromptAuditEntry,\n PromptCreateRequest,\n PromptDetail,\n PromptReference,\n PromptSummary,\n PromptUpdateRequest,\n} from '@holokai/moku-types';\n\nexport interface PromptListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n providerId?: string;\n promptType?: string;\n model?: string;\n tag?: string;\n}\n\nexport interface PromptHistoryParams {\n page?: number;\n size?: number;\n}\n\nexport interface PromptReferencesParams {\n promptType?: string;\n}\n\nexport class PromptsNamespace extends BaseNamespace {\n list(params?: PromptListParams): Promise<PagedResponse<PromptSummary>> {\n return this.get('/api/prompts', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<PromptDetail> {\n return this.get(`/api/prompts/${encodeURIComponent(id)}`);\n }\n\n create(body: PromptCreateRequest): Promise<PromptDetail> {\n return this.post('/api/prompts', body);\n }\n\n update(id: string, body: PromptUpdateRequest): Promise<PromptDetail> {\n return this.put(`/api/prompts/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/prompts/${encodeURIComponent(id)}`);\n }\n\n history(id: string, params?: PromptHistoryParams): Promise<PromptAuditEntry[]> {\n return this.get(`/api/prompts/${encodeURIComponent(id)}/history`, params as Record<string, unknown>);\n }\n\n references(params?: PromptReferencesParams): Promise<PromptReference[]> {\n return this.get('/api/prompts/references', params as Record<string, unknown>);\n }\n\n byTag(tag: string, params?: PromptListParams): Promise<PromptSummary[]> {\n return this.get(`/api/prompts/by-tag/${encodeURIComponent(tag)}`, params as Record<string, unknown>);\n }\n\n filters(): Promise<FilterOptions> {\n return this.get('/api/prompts/filters');\n }\n\n applicationsUsing(id: string): Promise<string[]> {\n return this.get(`/api/prompts/${encodeURIComponent(id)}/applications`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n MemberCreateRequest,\n MemberDto,\n MemberUpdateRequest,\n PagedResponse,\n ProjectCreateRequest,\n ProjectDetailDto,\n ProjectDto,\n ProjectUpdateRequest,\n} from '@holokai/moku-types';\n\nexport interface ProjectListParams {\n page?: number;\n size?: number;\n sort?: string;\n}\n\nexport class ProjectsNamespace extends BaseNamespace {\n list(params?: ProjectListParams): Promise<PagedResponse<ProjectDto>> {\n return this.get('/api/v1/projects', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<ProjectDetailDto> {\n return this.get(`/api/v1/projects/${encodeURIComponent(id)}`);\n }\n\n create(body: ProjectCreateRequest): Promise<ProjectDetailDto> {\n return this.post('/api/v1/projects', body);\n }\n\n update(id: string, body: ProjectUpdateRequest): Promise<ProjectDetailDto> {\n return this.patch(`/api/v1/projects/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/v1/projects/${encodeURIComponent(id)}`);\n }\n\n getMembers(id: string): Promise<MemberDto[]> {\n return this.get(`/api/v1/projects/${encodeURIComponent(id)}/members`);\n }\n\n addMember(projectId: string, body: MemberCreateRequest): Promise<MemberDto> {\n return this.post(`/api/v1/projects/${encodeURIComponent(projectId)}/members`, body);\n }\n\n removeMember(projectId: string, memberId: string): Promise<void> {\n return this.del(`/api/v1/projects/${encodeURIComponent(projectId)}/members/${encodeURIComponent(memberId)}`);\n }\n\n updateMemberRole(projectId: string, memberId: string, body: MemberUpdateRequest): Promise<MemberDto> {\n return this.patch(`/api/v1/projects/${encodeURIComponent(projectId)}/members/${encodeURIComponent(memberId)}`, body);\n }\n\n getUpdates(id: string): Promise<Record<string, unknown>> {\n return this.get(`/api/v1/projects/${encodeURIComponent(id)}/updates`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n PagedResponse,\n PricingPlanCreateRequest,\n PricingPlanDetail,\n PricingPlanListItem,\n PricingPlanUpdateRequest,\n PricingSheetCreateRequest,\n PricingSheetDetail,\n PricingSheetListItem,\n PricingSheetModelCreateRequest,\n PricingSheetUpdateRequest,\n} from '@holokai/moku-types';\n\nexport interface PricingPlanListParams {\n page?: number;\n size?: number;\n sort?: string;\n}\n\nexport class PricingNamespace extends BaseNamespace {\n listPlans(params?: PricingPlanListParams): Promise<PagedResponse<PricingPlanListItem>> {\n return this.get('/api/v1/pricing-plans', params as Record<string, unknown>);\n }\n\n getPlan(id: string): Promise<PricingPlanDetail> {\n return this.get(`/api/v1/pricing-plans/${encodeURIComponent(id)}`);\n }\n\n createPlan(body: PricingPlanCreateRequest): Promise<PricingPlanDetail> {\n return this.post('/api/v1/pricing-plans', body);\n }\n\n updatePlan(id: string, body: PricingPlanUpdateRequest): Promise<PricingPlanDetail> {\n return this.put(`/api/v1/pricing-plans/${encodeURIComponent(id)}`, body);\n }\n\n deletePlan(id: string): Promise<void> {\n return this.del(`/api/v1/pricing-plans/${encodeURIComponent(id)}`);\n }\n\n plansByFamily(family: string): Promise<PricingPlanListItem[]> {\n return this.get(`/api/v1/pricing-plans/by-family/${encodeURIComponent(family)}`);\n }\n\n listSheets(planId: string): Promise<PricingSheetListItem[]> {\n return this.get(`/api/v1/pricing-plans/${encodeURIComponent(planId)}/sheets`);\n }\n\n getSheet(planId: string, sheetId: string): Promise<PricingSheetDetail> {\n return this.get(`/api/v1/pricing-plans/${encodeURIComponent(planId)}/sheets/${encodeURIComponent(sheetId)}`);\n }\n\n createSheet(planId: string, body: PricingSheetCreateRequest): Promise<PricingSheetDetail> {\n return this.post(`/api/v1/pricing-plans/${encodeURIComponent(planId)}/sheets`, body);\n }\n\n updateSheet(planId: string, sheetId: string, body: PricingSheetUpdateRequest): Promise<PricingSheetDetail> {\n return this.put(`/api/v1/pricing-plans/${encodeURIComponent(planId)}/sheets/${encodeURIComponent(sheetId)}`, body);\n }\n\n deleteSheet(planId: string, sheetId: string): Promise<void> {\n return this.del(`/api/v1/pricing-plans/${encodeURIComponent(planId)}/sheets/${encodeURIComponent(sheetId)}`);\n }\n\n updateSheetModels(planId: string, sheetId: string, body: PricingSheetModelCreateRequest[]): Promise<PricingSheetDetail> {\n return this.post(`/api/v1/pricing-plans/${encodeURIComponent(planId)}/sheets/${encodeURIComponent(sheetId)}/models`, body);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {PluginDetail, PluginListItem,} from '@holokai/moku-types';\n\nexport class PluginsNamespace extends BaseNamespace {\n list(): Promise<PluginListItem[]> {\n return this.get('/api/v1/plugins');\n }\n\n getById(id: string): Promise<PluginDetail> {\n return this.get(`/api/v1/plugins/${encodeURIComponent(id)}`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n DatasetCreateRequest,\n DatasetDetail,\n DatasetListItem,\n DatasetReference,\n DatasetSampleCreateRequest,\n DatasetSampleDetail,\n DatasetUpdateRequest,\n PagedResponse,\n} from '@holokai/moku-types';\n\nexport interface DatasetListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n}\n\nexport interface DatasetSamplesParams {\n page?: number;\n size?: number;\n}\n\nexport interface DatasetExistsParams {\n name: string;\n}\n\nexport class DatasetsNamespace extends BaseNamespace {\n list(params?: DatasetListParams): Promise<PagedResponse<DatasetListItem>> {\n return this.get('/api/datasets', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<DatasetDetail> {\n return this.get(`/api/datasets/${encodeURIComponent(id)}`);\n }\n\n create(body: DatasetCreateRequest): Promise<DatasetDetail> {\n return this.post('/api/datasets', body);\n }\n\n update(id: string, body: DatasetUpdateRequest): Promise<DatasetDetail> {\n return this.put(`/api/datasets/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/datasets/${encodeURIComponent(id)}`);\n }\n\n getSamples(id: string, params?: DatasetSamplesParams): Promise<DatasetSampleDetail[]> {\n return this.get(`/api/datasets/${encodeURIComponent(id)}/samples`, params as Record<string, unknown>);\n }\n\n addSamples(id: string, body: DatasetSampleCreateRequest[]): Promise<void> {\n return this.post(`/api/datasets/${encodeURIComponent(id)}/samples`, body);\n }\n\n clearSamples(id: string): Promise<void> {\n return this.del(`/api/datasets/${encodeURIComponent(id)}/samples`);\n }\n\n getReference(id: string): Promise<DatasetReference> {\n return this.get(`/api/datasets/${encodeURIComponent(id)}/reference`);\n }\n\n getReferences(): Promise<DatasetReference[]> {\n return this.get('/api/datasets/references');\n }\n\n exists(params: DatasetExistsParams): Promise<boolean> {\n return this.get('/api/datasets/exists', params as unknown as Record<string, unknown>);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n DatasetResultsDetail,\n EvaluationPlanCreateRequest,\n EvaluationPlanDetail,\n EvaluationPlanListItem,\n EvaluationPlanReference,\n EvaluationPlanUpdateRequest,\n EvaluationResultDetail,\n EvaluationResultListItem,\n EvaluationSessionCreateRequest,\n EvaluationSessionDetail,\n EvaluationSessionListItem,\n EvaluationSessionReference,\n EvaluatorAnalysisDetail,\n ModelAnalyticsItem,\n PagedResponse,\n SessionOverviewDetail,\n SessionSummary,\n} from '@holokai/moku-types';\n\nexport interface EvaluationPlanListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n}\n\nexport interface EvaluationPlanExistsParams {\n name: string;\n}\n\nexport interface EvaluationSessionListParams {\n page?: number;\n size?: number;\n sort?: string;\n planId?: string;\n status?: string;\n}\n\nexport interface SessionResultsParams {\n page?: number;\n size?: number;\n sort?: string;\n}\n\n\nexport class EvaluationsNamespace extends BaseNamespace {\n listPlans(params?: EvaluationPlanListParams): Promise<PagedResponse<EvaluationPlanListItem>> {\n return this.get('/api/evaluation-plans', params as Record<string, unknown>);\n }\n\n getPlan(id: string): Promise<EvaluationPlanDetail> {\n return this.get(`/api/evaluation-plans/${encodeURIComponent(id)}`);\n }\n\n createPlan(body: EvaluationPlanCreateRequest): Promise<EvaluationPlanDetail> {\n return this.post('/api/evaluation-plans', body);\n }\n\n updatePlan(id: string, body: EvaluationPlanUpdateRequest): Promise<EvaluationPlanDetail> {\n return this.put(`/api/evaluation-plans/${encodeURIComponent(id)}`, body);\n }\n\n deletePlan(id: string): Promise<void> {\n return this.del(`/api/evaluation-plans/${encodeURIComponent(id)}`);\n }\n\n planReference(id: string): Promise<EvaluationPlanReference> {\n return this.get(`/api/evaluation-plans/${encodeURIComponent(id)}/reference`);\n }\n\n planReferences(): Promise<EvaluationPlanReference[]> {\n return this.get('/api/evaluation-plans/references');\n }\n\n planExists(params: EvaluationPlanExistsParams): Promise<boolean> {\n return this.get('/api/evaluation-plans/exists', params as unknown as Record<string, unknown>);\n }\n\n plansByEvaluatorPrompt(promptId: string): Promise<EvaluationPlanListItem[]> {\n return this.get(`/api/evaluation-plans/by-evaluator-prompt/${encodeURIComponent(promptId)}`);\n }\n\n listSessions(params?: EvaluationSessionListParams): Promise<PagedResponse<EvaluationSessionListItem>> {\n return this.get('/api/evaluation-sessions', params as Record<string, unknown>);\n }\n\n getSession(id: string): Promise<EvaluationSessionDetail> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}`);\n }\n\n createSession(planId: string, body: EvaluationSessionCreateRequest): Promise<EvaluationSessionDetail> {\n return this.post(`/api/evaluation-sessions/plans/${encodeURIComponent(planId)}`, body);\n }\n\n startSession(id: string): Promise<void> {\n return this.post(`/api/evaluation-sessions/${encodeURIComponent(id)}/start`);\n }\n\n cancelSession(id: string): Promise<void> {\n return this.post(`/api/evaluation-sessions/${encodeURIComponent(id)}/cancel`);\n }\n\n sessionSummary(id: string): Promise<SessionSummary> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/summary`);\n }\n\n sessionResults(id: string, params?: SessionResultsParams): Promise<PagedResponse<EvaluationResultListItem>> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/results`, params as Record<string, unknown>);\n }\n\n sessionOverview(id: string): Promise<SessionOverviewDetail> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/results-v2/overview`);\n }\n\n modelAnalytics(id: string): Promise<ModelAnalyticsItem[]> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/results-v2/model-analytics`);\n }\n\n evaluatorAnalysis(id: string): Promise<EvaluatorAnalysisDetail> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/results-v2/evaluator-analysis`);\n }\n\n datasetResults(id: string): Promise<PagedResponse<DatasetResultsDetail>> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/results-v2/dataset-results`);\n }\n\n getResult(resultId: string): Promise<EvaluationResultDetail> {\n return this.get(`/api/evaluation-sessions/results/${encodeURIComponent(resultId)}`);\n }\n\n sessionReferences(): Promise<EvaluationSessionReference[]> {\n return this.get('/api/evaluation-sessions/references');\n }\n\n sessionsForComparison(planId: string): Promise<EvaluationSessionListItem[]> {\n return this.get(`/api/evaluation-sessions/plans/${encodeURIComponent(planId)}/sessions`);\n }\n\n exportDatasetResults(id: string, params?: Record<string, unknown>): Promise<unknown> {\n return this.get(`/api/evaluation-sessions/${encodeURIComponent(id)}/results-v2/export`, params);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {GenerateDashboardRequest, GenerateDashboardResponse,} from '@holokai/moku-types';\n\nexport class DashboardsNamespace extends BaseNamespace {\n list(): Promise<unknown> {\n return this.get('/api/dashboards');\n }\n\n getById(id: string): Promise<unknown> {\n return this.get(`/api/dashboards/${encodeURIComponent(id)}`);\n }\n\n save(body: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.post('/api/dashboards', body);\n }\n\n update(id: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.put(`/api/dashboards/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/dashboards/${encodeURIComponent(id)}`);\n }\n\n refresh(id: string): Promise<Record<string, unknown>> {\n return this.post(`/api/dashboards/${encodeURIComponent(id)}/refresh`);\n }\n\n generate(body: GenerateDashboardRequest): Promise<GenerateDashboardResponse> {\n return this.post('/api/dashboards/generate', body);\n }\n\n getSettings(): Promise<Record<string, unknown>> {\n return this.get('/api/dashboards/settings');\n }\n\n saveSettings(body: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.post('/api/dashboards/settings', body);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n AnalyticsQueryRequest,\n AnalyticsQueryResult,\n QueryGenerationRequest,\n QueryGenerationResponse,\n WidgetGenerationRequest,\n WidgetGenerationResponse,\n} from '@holokai/moku-types';\n\nexport class AnalyticsNamespace extends BaseNamespace {\n query(body: AnalyticsQueryRequest): Promise<AnalyticsQueryResult> {\n return this.post('/api/v1/analytics/query', body);\n }\n\n generateQuery(body: QueryGenerationRequest): Promise<QueryGenerationResponse> {\n return this.post('/api/v1/analytics/generate-query', body);\n }\n\n generateWidget(body: WidgetGenerationRequest): Promise<WidgetGenerationResponse> {\n return this.post('/api/v1/analytics/generate-widget', body);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {ServerDetail, ServerInfo, ServerListItem,} from '@holokai/moku-types';\n\nexport class ServersNamespace extends BaseNamespace {\n list(): Promise<ServerListItem[]> {\n return this.get('/api/v1/servers');\n }\n\n getById(id: string): Promise<ServerDetail> {\n return this.get(`/api/v1/servers/${encodeURIComponent(id)}`);\n }\n\n proxies(): Promise<ServerInfo[]> {\n return this.get('/api/v1/support/proxies');\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n ConnectivityTestDto,\n CurrentExchangeMetricsDto,\n CurrentQueueMetricsDto,\n HealthStatusDto,\n MetricsSummaryDto,\n MonitoringFilterOptions,\n ProviderRequestWithResponse,\n RabbitMqMetrics,\n SchedulerStats,\n SpringPage,\n} from '@holokai/moku-types';\n\nexport interface MonitoringRequestsParams {\n page?: number;\n size?: number;\n sort?: string;\n applicationId?: string;\n providerId?: string;\n model?: string;\n status?: string;\n from?: string;\n to?: string;\n search?: string;\n}\n\nexport class MonitoringNamespace extends BaseNamespace {\n getRequests(params?: MonitoringRequestsParams): Promise<SpringPage<ProviderRequestWithResponse>> {\n return this.get('/api/v2/monitoring/requests', params as Record<string, unknown>);\n }\n\n getFilters(): Promise<MonitoringFilterOptions> {\n return this.get('/api/v2/monitoring/requests/filters');\n }\n\n getSummary(): Promise<MetricsSummaryDto> {\n return this.get('/api/rabbitmq/monitoring/summary');\n }\n\n getSchedulerStats(): Promise<SchedulerStats> {\n return this.get('/api/rabbitmq/monitoring/scheduler/stats');\n }\n\n listQueues(): Promise<string[]> {\n return this.get('/api/rabbitmq/monitoring/queues');\n }\n\n queueHistory(name: string): Promise<RabbitMqMetrics[]> {\n return this.get(`/api/rabbitmq/monitoring/queues/${encodeURIComponent(name)}/history`);\n }\n\n queueMetrics(): Promise<CurrentQueueMetricsDto> {\n return this.get('/api/rabbitmq/monitoring/queues/current');\n }\n\n queueMetricsByName(name: string): Promise<CurrentQueueMetricsDto[]> {\n return this.get(`/api/rabbitmq/monitoring/queues/${encodeURIComponent(name)}/current`);\n }\n\n listExchanges(): Promise<string[]> {\n return this.get('/api/rabbitmq/monitoring/exchanges');\n }\n\n exchangeHistory(name: string): Promise<RabbitMqMetrics[]> {\n return this.get(`/api/rabbitmq/monitoring/exchanges/${encodeURIComponent(name)}/history`);\n }\n\n exchangeMetrics(name: string): Promise<CurrentExchangeMetricsDto[]> {\n return this.get(`/api/rabbitmq/monitoring/exchanges/${encodeURIComponent(name)}/current`);\n }\n\n healthStatus(): Promise<HealthStatusDto> {\n return this.get('/api/rabbitmq/monitoring/health');\n }\n\n testConnectivity(): Promise<ConnectivityTestDto> {\n return this.get('/api/rabbitmq/monitoring/connectivity/test');\n }\n\n forceCollection(): Promise<string> {\n return this.post('/api/rabbitmq/monitoring/collect');\n }\n}\n","import {BaseNamespace} from './base';\nimport type {AuditEntry, AuditHealthStatus, SpringPage,} from '@holokai/moku-types';\n\nexport interface AuditRecentChangesParams {\n page?: number;\n size?: number;\n sort?: string;\n entityType?: string;\n}\n\nexport interface AuditChangesByUserParams {\n page?: number;\n size?: number;\n}\n\nexport interface AuditUserAtDateParams {\n date: string;\n}\n\nexport class AuditNamespace extends BaseNamespace {\n health(): Promise<AuditHealthStatus> {\n return this.get('/api/audit/health');\n }\n\n recentChanges(params?: AuditRecentChangesParams): Promise<SpringPage<AuditEntry>> {\n return this.get('/api/audit/changes/recent', params as Record<string, unknown>);\n }\n\n changesByUser(username: string, params?: AuditChangesByUserParams): Promise<AuditEntry[]> {\n return this.get(`/api/audit/changes/by-user/${encodeURIComponent(username)}`, params as Record<string, unknown>);\n }\n\n userRevisions(userId: string): Promise<unknown[]> {\n return this.get(`/api/audit/users/${encodeURIComponent(userId)}/revisions`);\n }\n\n userAtDate(userId: string, params: AuditUserAtDateParams): Promise<unknown> {\n return this.get(`/api/audit/users/${encodeURIComponent(userId)}/at-date`, params as unknown as Record<string, unknown>);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n AffectedPrompt,\n MigrationDetail,\n MigrationHistory,\n SchemaCompatibilityValidationRequest,\n SchemaCompatibilityValidationResponse,\n SchemaCreateRequest,\n SchemaDetail,\n SchemaGenerationRequest,\n SchemaGenerationResponse,\n SchemaSummary,\n SchemaUpdateRequest,\n SchemaVersionCreateWithMigrationRequest,\n SchemaVersionHistory,\n SchemaVersionWithMigrationResult,\n SpringPage,\n VersionSuggestion,\n} from '@holokai/moku-types';\n\nexport interface SchemaListParams {\n page?: number;\n size?: number;\n sort?: string;\n search?: string;\n}\n\nexport interface SuggestVersionParams {\n schemaId?: string;\n changeType?: string;\n}\n\nexport interface ValidateCompatibilityParams {\n schemaId?: string;\n}\n\nexport interface MigrationHistoryParams {\n page?: number;\n size?: number;\n}\n\nexport interface SchemaPreviewParams {\n entity: string;\n}\n\nexport interface RollbackMigrationBody {\n targetVersionId?: string;\n reason?: string;\n}\n\nexport interface ReviewPerPromptParams {\n schemaId?: string;\n versionId?: string;\n}\n\nexport class SchemasNamespace extends BaseNamespace {\n list(params?: SchemaListParams): Promise<SpringPage<SchemaSummary>> {\n return this.get('/api/schemas', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<SchemaDetail> {\n return this.get(`/api/schemas/${encodeURIComponent(id)}`);\n }\n\n create(body: SchemaCreateRequest): Promise<SchemaDetail> {\n return this.post('/api/schemas', body);\n }\n\n update(id: string, body: SchemaUpdateRequest): Promise<SchemaDetail> {\n return this.put(`/api/schemas/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/schemas/${encodeURIComponent(id)}`);\n }\n\n restore(id: string): Promise<void> {\n return this.put(`/api/schemas/${encodeURIComponent(id)}/restore`);\n }\n\n getVersions(id: string): Promise<SchemaVersionHistory> {\n return this.get(`/api/schemas/${encodeURIComponent(id)}/versions`);\n }\n\n getVersion(id: string, versionId: string): Promise<SchemaDetail> {\n return this.get(`/api/schemas/${encodeURIComponent(id)}/versions/${encodeURIComponent(versionId)}`);\n }\n\n getVersionById(versionId: string): Promise<SchemaDetail> {\n return this.get(`/api/schemas/versions/${encodeURIComponent(versionId)}`);\n }\n\n createVersionWithMigration(id: string, body: SchemaVersionCreateWithMigrationRequest): Promise<SchemaVersionWithMigrationResult> {\n return this.post(`/api/schemas/${encodeURIComponent(id)}/versions/with-migration`, body);\n }\n\n suggestNextVersion(params?: SuggestVersionParams): Promise<VersionSuggestion> {\n return this.get('/api/schemas/suggest-version', params as Record<string, unknown>);\n }\n\n validateCompatibility(body: SchemaCompatibilityValidationRequest, params?: ValidateCompatibilityParams): Promise<SchemaCompatibilityValidationResponse> {\n return this.post('/api/schemas/validate-compatibility', body, params as Record<string, unknown>);\n }\n\n generate(body: SchemaGenerationRequest): Promise<SchemaGenerationResponse> {\n return this.post('/api/schemas/generate', body);\n }\n\n getMigrationHistory(schemaId: string, params?: MigrationHistoryParams): Promise<SpringPage<MigrationHistory>> {\n return this.get(`/api/schemas/${encodeURIComponent(schemaId)}/migrations`, params as Record<string, unknown>);\n }\n\n getMigrationDetail(schemaId: string, migrationId: string): Promise<MigrationDetail> {\n return this.get(`/api/schemas/${encodeURIComponent(schemaId)}/migrations/${encodeURIComponent(migrationId)}`);\n }\n\n rollbackMigration(schemaId: string, migrationId: string, body: RollbackMigrationBody): Promise<MigrationDetail> {\n return this.post(`/api/schemas/${encodeURIComponent(schemaId)}/migrations/${encodeURIComponent(migrationId)}/rollback`, body);\n }\n\n reviewPerPrompt(parentId: string, params?: ReviewPerPromptParams): Promise<AffectedPrompt[]> {\n return this.get(`/api/schemas/${encodeURIComponent(parentId)}/versions/review-per-prompt`, params as Record<string, unknown>);\n }\n\n preview(params: SchemaPreviewParams): Promise<string> {\n return this.get('/api/admin/schema-config/preview', params as unknown as Record<string, unknown>);\n }\n\n getAvailableEntities(): Promise<string[]> {\n return this.get('/api/admin/schema-config/available-entities');\n }\n}\n","import {BaseNamespace} from './base';\nimport type {\n MessageDto,\n PagedResponse,\n ThreadCreateRequest,\n ThreadDto,\n ThreadUpdateRequest,\n} from '@holokai/moku-types';\n\nexport interface ThreadListParams {\n page?: number;\n size?: number;\n sort?: string;\n projectId?: string;\n type?: 'personal' | 'project';\n}\n\nexport interface MessageListParams {\n page?: number;\n size?: number;\n}\n\nexport class ThreadsNamespace extends BaseNamespace {\n list(params?: ThreadListParams): Promise<PagedResponse<ThreadDto>> {\n return this.get('/api/threads', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<ThreadDto> {\n return this.get(`/api/threads/${encodeURIComponent(id)}`);\n }\n\n create(body: ThreadCreateRequest): Promise<ThreadDto> {\n return this.post('/api/threads', body);\n }\n\n update(id: string, body: Partial<ThreadUpdateRequest>): Promise<ThreadDto> {\n return this.patch(`/api/threads/${encodeURIComponent(id)}`, body);\n }\n\n remove(id: string): Promise<void> {\n return this.del(`/api/threads/${encodeURIComponent(id)}`);\n }\n\n getMessages(id: string, params?: MessageListParams): Promise<PagedResponse<MessageDto>> {\n return this.get(`/api/threads/${encodeURIComponent(id)}/messages`, params as Record<string, unknown>);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {AgentChatConfig, AgentListItem} from '@holokai/moku-types';\n\nexport interface AgentListParams {\n page?: number;\n size?: number;\n search?: string;\n}\n\nexport class AgentsNamespace extends BaseNamespace {\n list(params?: AgentListParams): Promise<AgentListItem[]> {\n return this.get('/api/v1/agents', params as Record<string, unknown>);\n }\n\n getById(id: string): Promise<AgentChatConfig> {\n return this.get(`/api/v1/agents/${encodeURIComponent(id)}`);\n }\n}\n","import {BaseNamespace} from './base';\nimport type {RoleHierarchy, RoleOption, SchemaOption, SelectItem, SelectItemExtraData,} from '@holokai/moku-types';\n\nexport class RefNamespace extends BaseNamespace {\n teams(): Promise<SelectItem[]> {\n return this.get('/api/ref/teams');\n }\n\n roles(): Promise<RoleOption[]> {\n return this.get('/api/ref/roles');\n }\n\n roleHierarchy(): Promise<RoleHierarchy> {\n return this.get('/api/ref/role-hierarchy');\n }\n\n providers(): Promise<SelectItem[]> {\n return this.get('/api/ref/providers');\n }\n\n modelsByProvider(providerId: string): Promise<SelectItemExtraData[]> {\n return this.get(`/api/ref/providers/${encodeURIComponent(providerId)}/models`);\n }\n\n prompts(): Promise<SelectItem[]> {\n return this.get('/api/ref/prompts');\n }\n\n models(): Promise<SelectItemExtraData[]> {\n return this.get('/api/ref/models');\n }\n\n schemas(): Promise<SchemaOption[]> {\n return this.get('/api/ref/schemas');\n }\n}\n","export {BaseNamespace} from './base';\nexport type {MokuRequestable} from './base';\nexport {AuthNamespace} from './auth';\nexport {ApplicationsNamespace} from './applications';\nexport {ProvidersNamespace} from './providers';\nexport {ModelsNamespace} from './models';\nexport {OrganizationsNamespace} from './organizations';\nexport {TeamsNamespace} from './teams';\nexport {UsersNamespace} from './users';\nexport {CredentialsNamespace} from './credentials';\nexport {PromptsNamespace} from './prompts';\nexport {ProjectsNamespace} from './projects';\nexport {PricingNamespace} from './pricing';\nexport {PluginsNamespace} from './plugins';\nexport {DatasetsNamespace} from './datasets';\nexport {EvaluationsNamespace} from './evaluations';\nexport {DashboardsNamespace} from './dashboards';\nexport {AnalyticsNamespace} from './analytics';\nexport {ServersNamespace} from './servers';\nexport {MonitoringNamespace} from './monitoring';\nexport {AuditNamespace} from './audit';\nexport {SchemasNamespace} from './schemas';\nexport {ThreadsNamespace} from './threads';\nexport {AgentsNamespace} from './agents';\nexport {RefNamespace} from './ref';\n","import type {MokuClientOptions} from './types';\nimport {MokuFetchTransport} from './transport';\nimport {\n AgentsNamespace,\n AnalyticsNamespace,\n ApplicationsNamespace,\n AuditNamespace,\n AuthNamespace,\n CredentialsNamespace,\n DashboardsNamespace,\n DatasetsNamespace,\n EvaluationsNamespace,\n ModelsNamespace,\n MonitoringNamespace,\n OrganizationsNamespace,\n PluginsNamespace,\n PricingNamespace,\n ProjectsNamespace,\n PromptsNamespace,\n ProvidersNamespace,\n RefNamespace,\n SchemasNamespace,\n ServersNamespace,\n TeamsNamespace,\n ThreadsNamespace,\n UsersNamespace,\n} from './namespaces';\n\nexport class MokuClient {\n readonly auth: AuthNamespace;\n readonly applications: ApplicationsNamespace;\n readonly providers: ProvidersNamespace;\n readonly models: ModelsNamespace;\n readonly organizations: OrganizationsNamespace;\n readonly teams: TeamsNamespace;\n readonly users: UsersNamespace;\n readonly credentials: CredentialsNamespace;\n readonly prompts: PromptsNamespace;\n readonly projects: ProjectsNamespace;\n readonly pricing: PricingNamespace;\n readonly plugins: PluginsNamespace;\n readonly datasets: DatasetsNamespace;\n readonly evaluations: EvaluationsNamespace;\n readonly dashboards: DashboardsNamespace;\n readonly analytics: AnalyticsNamespace;\n readonly servers: ServersNamespace;\n readonly monitoring: MonitoringNamespace;\n readonly audit: AuditNamespace;\n readonly schemas: SchemasNamespace;\n readonly threads: ThreadsNamespace;\n readonly agents: AgentsNamespace;\n readonly ref: RefNamespace;\n\n private readonly transport: MokuFetchTransport;\n\n constructor(options: MokuClientOptions) {\n this.transport = new MokuFetchTransport(options);\n\n this.auth = new AuthNamespace(this);\n this.applications = new ApplicationsNamespace(this);\n this.providers = new ProvidersNamespace(this);\n this.models = new ModelsNamespace(this);\n this.organizations = new OrganizationsNamespace(this);\n this.teams = new TeamsNamespace(this);\n this.users = new UsersNamespace(this);\n this.credentials = new CredentialsNamespace(this);\n this.prompts = new PromptsNamespace(this);\n this.projects = new ProjectsNamespace(this);\n this.pricing = new PricingNamespace(this);\n this.plugins = new PluginsNamespace(this);\n this.datasets = new DatasetsNamespace(this);\n this.evaluations = new EvaluationsNamespace(this);\n this.dashboards = new DashboardsNamespace(this);\n this.analytics = new AnalyticsNamespace(this);\n this.servers = new ServersNamespace(this);\n this.monitoring = new MonitoringNamespace(this);\n this.audit = new AuditNamespace(this);\n this.schemas = new SchemasNamespace(this);\n this.threads = new ThreadsNamespace(this);\n this.agents = new AgentsNamespace(this);\n this.ref = new RefNamespace(this);\n }\n\n request<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.transport.request<T>({method, path, body, query});\n }\n}\n","export {MokuClient} from './client';\nexport {MokuApiError, MokuTimeoutError} from './errors';\nexport type {MokuClientOptions} from './types';\nexport type {PagedResponse} from '@holokai/moku-types';\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport jwt from 'jsonwebtoken';\nimport {env} from '../../env';\nimport {type JWTPayload} from '../../types';\nimport logger from '../../utils/logger';\nimport {RedisService} from \"../redis.service\";\nimport {MokuApiError, MokuClient} from '@holokai/moku-sdk';\n\nconst DEFAULT_TTL = 3600;\n\n@injectable()\nexport class TokenService {\n\n private readonly inFlight = new Map<string, Promise<string[] | null>>();\n private readonly moku?: MokuClient;\n\n constructor(private readonly redis: RedisService) {\n if (env.mokuUrl) {\n this.moku = new MokuClient({baseUrl: env.mokuUrl});\n }\n }\n\n async getAppSlugs(token: string, useCache = true): Promise<string[] | null> {\n if (useCache) {\n const hit = await this.redis.get<string[]>(token);\n logger.debug(`Cache hit: ${!!hit}`);\n if (hit) return hit;\n }\n\n const existing = this.inFlight.get(token);\n if (existing) return existing;\n\n const p = this.refreshToken(token)\n .then((accessToken) => accessToken ? this.extractAppSlugs(accessToken) : [])\n .then(async (slugs) => {\n if (slugs?.length) await this.redis.set(token, slugs, DEFAULT_TTL);\n return slugs;\n })\n .finally(() => this.inFlight.delete(token));\n\n this.inFlight.set(token, p);\n return p;\n }\n\n async invalidate(token: string) {\n await this.redis.del(token);\n this.inFlight.delete(token);\n }\n\n decodeToken(token: string): JWTPayload {\n return jwt.verify(token, env.jwtConfig.secret, {\n algorithms: [env.jwtConfig.algorithm],\n clockTolerance: 5,\n }) as JWTPayload;\n }\n\n async refreshToken(originalToken: string): Promise<string | null> {\n if (!this.moku) {\n logger.error('MOKU_URL not configured for token refresh');\n return null;\n }\n\n try {\n const data = await this.moku.auth.validateApiKey(originalToken);\n\n const accessToken = (data as Record<string, unknown>)?.accessToken as string | undefined;\n if (!accessToken) {\n logger.warn('Token refresh response missing accessToken');\n return null;\n }\n\n return accessToken;\n } catch (e) {\n if (e instanceof MokuApiError) {\n logger.warn('Token refresh failed', {status: e.status, body: e.body});\n } else {\n logger.error('Token refresh error', {name: (e as Error).name, error: (e as Error).message});\n }\n return null;\n }\n }\n\n private async extractAppSlugs(accessToken: string): Promise<string[] | null> {\n try {\n const auth = this.decodeToken(accessToken);\n\n const slugs = auth?.appSlugs;\n if (!Array.isArray(slugs)) {\n logger.debug('JWT missing appSlugs - user can only access direct provider endpoints', {\n hasAppSlugs: !!slugs,\n appSlugsType: typeof slugs,\n });\n return null;\n }\n\n const ttl = Math.max(1, auth.exp - Math.floor(Date.now() / 1000));\n await this.redis.set(accessToken, slugs, ttl);\n return slugs;\n } catch (e) {\n const err = e as Error;\n const kind =\n e instanceof jwt.TokenExpiredError ? 'expired' :\n e instanceof jwt.JsonWebTokenError ? 'invalid' : 'verify_error';\n logger.warn('Failed to extract appSlugs from access token', {\n kind,\n msg: err.message,\n tokenLen: accessToken.length\n });\n return null;\n }\n }\n}\n","import 'reflect-metadata';\nimport crypto from 'crypto';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger, pickDefined} from '@holokai/holo-sdk';\nimport {HoloTokenDB} from '../../db';\nimport {type HoloToken} from '@holokai/holo-types/entities';\nimport {RedisService} from \"../redis.service\";\n\nconst TOKEN_PREFIX = 'holo_';\nconst REDIS_KEY_PREFIX = 'holo_token:';\nconst REDIS_TTL_SECONDS = 300;\n\ninterface GenerateOptions {\n user_id?: string;\n application_id?: string;\n name?: string;\n expires_at?: Date;\n}\n\n@injectable()\nexport class HoloTokenService extends ClassLogger {\n constructor(\n private holoTokenDB: HoloTokenDB,\n private redisService: RedisService,\n ) {\n super();\n }\n\n async deactivate(id: string, keyHash: string): Promise<void> {\n await this.holoTokenDB.deactivate(id);\n await this.redisService.del(`${REDIS_KEY_PREFIX}${keyHash}`);\n const authKeys = await this.redisService.keys(`auth:${keyHash}:*`);\n for (const key of authKeys) await this.redisService.del(key);\n }\n\n async generate(organizationId: string, opts: GenerateOptions): Promise<{ token: string; record: HoloToken }> {\n const rawToken = TOKEN_PREFIX + crypto.randomBytes(32).toString('base64url');\n const keyHash = crypto.createHash('sha256').update(rawToken).digest('hex');\n const keySuffix = rawToken.slice(-4);\n\n const record = await this.holoTokenDB.create({\n organization_id: organizationId,\n key_hash: keyHash,\n key_prefix: TOKEN_PREFIX,\n key_suffix: keySuffix,\n ...pickDefined(opts),\n });\n\n return {token: rawToken, record};\n }\n\n async verify(rawToken: string): Promise<HoloToken | null> {\n const logger = this.mlog(this.verify);\n const keyHash = crypto.createHash('sha256').update(rawToken).digest('hex');\n\n const cached = await this.redisService.get<HoloToken>(`${REDIS_KEY_PREFIX}${keyHash}`);\n if (cached) {\n if (cached.expires_at && new Date(cached.expires_at) < new Date()) {\n return null;\n }\n this.holoTokenDB.updateLastUsed(cached.id).catch(err =>\n logger.error(`Failed to update last_used_at: ${err.message}`)\n );\n return cached;\n }\n\n const record = await this.holoTokenDB.getByHash(keyHash);\n if (!record || !record.active) {\n return null;\n }\n\n if (record.expires_at && new Date(record.expires_at) < new Date()) {\n return null;\n }\n\n this.redisService.set(`${REDIS_KEY_PREFIX}${keyHash}`, record, REDIS_TTL_SECONDS).catch(err =>\n logger.error(`Failed to cache token in Redis: ${err.message}`)\n );\n\n this.holoTokenDB.updateLastUsed(record.id).catch(err =>\n logger.error(`Failed to update last_used_at: ${err.message}`)\n );\n\n return record;\n }\n}\n","import 'reflect-metadata';\nimport crypto from 'crypto';\nimport {ClassLogger, pickDefined} from \"@holokai/holo-sdk\";\nimport type {Auth} from \"@holokai/holo-types/api\";\nimport type {Application, HoloToken} from \"@holokai/holo-types/entities\";\nimport {injectable} from \"tsyringe\";\nimport {TokenService} from \"./token.service\";\nimport {type HoloApiRequest} from \"../../api/types\";\nimport {UnauthorizedError} from \"express-jwt\";\nimport {HoloTokenService} from \"./holo.token.service\";\nimport {ApplicationService} from \"../entities\";\nimport {AccessService} from \"./access.service\";\nimport {RedisService} from \"../redis.service\";\n\nconst AUTH_CACHE_TTL = 120;\n\nfunction buildAuth(\n tokenType: Auth['tokenType'],\n organizationId: string,\n applications: Application[],\n application?: Application,\n userId?: string,\n clientIdentifier?: string,\n): Auth {\n return pickDefined({\n organizationId,\n userId,\n tokenType,\n application,\n applications,\n clientIdentifier,\n }) as Auth;\n}\n\nexport function extractToken(req: HoloApiRequest): string | undefined {\n let token = req.headers['x-api-key'] as string | undefined;\n if (!token) {\n const h = req.headers.authorization;\n if (h?.startsWith('Bearer ')) token = h.slice(7).trim();\n }\n return token;\n}\n\nexport function extractAppSlug(req: HoloApiRequest): string | undefined {\n const {appSlug: paramsAppSlug} = req.params;\n return (req as any).appSlug || paramsAppSlug;\n}\n\n@injectable()\nexport class AuthService extends ClassLogger {\n\n constructor(\n private tokenService: TokenService,\n private holoTokenService: HoloTokenService,\n private applicationService: ApplicationService,\n private accessService: AccessService,\n private redis: RedisService,\n ) {\n super();\n }\n\n async authenticateHoloToken(rawToken: string, appSlug?: string, provider?: string): Promise<Auth> {\n const tokenHash = crypto.createHash('sha256').update(rawToken).digest('hex');\n const cacheKey = `auth:${tokenHash}:${appSlug || '*'}`;\n\n const cached = await this.redis.get<Auth>(cacheKey);\n if (cached) return cached;\n\n const holoToken = await this.holoTokenService.verify(rawToken);\n if (!holoToken) {\n throw new UnauthorizedError('invalid_token', {message: 'Authentication failed: Invalid or expired token.'});\n }\n\n let auth: Auth;\n if (holoToken.application_id) {\n auth = await this.resolveAppToken(holoToken, appSlug, provider);\n } else if (holoToken.user_id) {\n auth = await this.resolveUserToken(holoToken, appSlug, provider);\n } else {\n throw new UnauthorizedError('invalid_token', {message: 'Token has neither user_id nor application_id.'});\n }\n\n this.redis.set(cacheKey, auth, AUTH_CACHE_TTL).catch(err =>\n this.log.error(`Failed to cache auth result: ${err.message}`)\n );\n\n return auth;\n }\n\n async authenticateJwt(token: string, appSlug?: string, provider?: string, useCache: boolean = true): Promise<Auth> {\n const logger = this.mlog(this.authenticateJwt);\n const appSlugs = await this.tokenService.getAppSlugs(token, useCache);\n if (!appSlugs) {\n return Promise.reject('User is not provisioned with any applications.');\n }\n\n if (appSlug && !appSlugs.includes(appSlug)) {\n return Promise.reject('User is not authorized for application.');\n }\n\n const decodedToken = this.tokenService.decodeToken(token);\n const {organizationId, sub: userId, email} = decodedToken;\n\n let clientIdentifier = email ?? await this.accessService.getUserEmailById(organizationId, userId);\n\n if (!clientIdentifier) {\n return Promise.reject('User no longer exists.');\n }\n\n logger.info(`User [${clientIdentifier}] logged in via JWT Token.`);\n\n const allApplications = await this.applicationService.getBySlugs(organizationId, appSlugs);\n\n let application: Application | undefined;\n if (appSlug) {\n application = allApplications.find(a => a.url_slug === appSlug);\n if (!application) {\n return Promise.reject(`Application ${appSlug} no longer available.`);\n }\n if (provider && application.provider!.type.toUpperCase() !== provider.toUpperCase()) {\n return Promise.reject(`Application ${appSlug} supports ${application.provider!.type}, not ${provider}`);\n }\n }\n\n let filtered = allApplications;\n if (provider) {\n filtered = allApplications.filter(a => a.provider!.type.toUpperCase() === provider.toUpperCase());\n if (!filtered.length) {\n return Promise.reject(`User is not authorized for this provider: ${provider}.`);\n }\n }\n\n if (!application && !filtered.length) {\n return Promise.reject('User is not authorized for any providers.');\n }\n\n return buildAuth('jwt', organizationId, filtered, application, userId, clientIdentifier);\n }\n\n async authenticateAnonymous(appSlug: string, provider?: string): Promise<Auth> {\n const application = await this.applicationService.getBySlugUnscoped(appSlug);\n if (!application || application.access_level !== 'anonymous') {\n throw new UnauthorizedError('credentials_required', {message: 'Authentication failed: No token provided.'});\n }\n if (provider && application.provider!.type.toUpperCase() !== provider.toUpperCase()) {\n return Promise.reject(`Application ${appSlug} supports ${application.provider!.type}, not ${provider}`);\n }\n return buildAuth('anonymous', application.organization_id, [application], application);\n }\n\n async invalidateByTokenHash(tokenHash: string): Promise<void> {\n const keys = await this.redis.keys(`auth:${tokenHash}:*`);\n for (const key of keys) await this.redis.del(key);\n }\n\n async invalidateByAppSlug(appSlug: string): Promise<void> {\n const keys = await this.redis.keys(`auth:*:${appSlug}`);\n for (const key of keys) await this.redis.del(key);\n }\n\n private async resolveAppToken(holoToken: HoloToken, appSlug?: string, provider?: string): Promise<Auth> {\n if (!appSlug) {\n return Promise.reject('Application tokens can only access app-specific endpoints.');\n }\n\n const application = await this.applicationService.getById(holoToken.application_id!);\n if (!application) {\n return Promise.reject('Token application no longer available.');\n }\n\n if (application.url_slug !== appSlug) {\n return Promise.reject('Application token is not authorized for this application.');\n }\n\n if (provider && application.provider!.type.toUpperCase() !== provider.toUpperCase()) {\n return Promise.reject(`Application supports ${application.provider!.type}, not ${provider}`);\n }\n\n return buildAuth('holo_application', holoToken.organization_id, [application], application);\n }\n\n private async resolveUserToken(holoToken: HoloToken, appSlug?: string, provider?: string): Promise<Auth> {\n const orgId = holoToken.organization_id;\n const userId = holoToken.user_id!;\n\n if (appSlug) {\n const application = await this.applicationService.getBySlug(orgId, appSlug);\n if (!application) {\n return Promise.reject(`Application ${appSlug} not found.`);\n }\n\n const allowed = await this.accessService.hasAccess(orgId, userId, application.id);\n if (!allowed) {\n return Promise.reject('User is not authorized for this application.');\n }\n\n if (provider && application.provider!.type.toUpperCase() !== provider.toUpperCase()) {\n return Promise.reject(`Application ${appSlug} supports ${application.provider!.type}, not ${provider}`);\n }\n\n return buildAuth('holo_user', orgId, [application], application, userId);\n }\n\n const accessibleIds = await this.accessService.getAccessibleApplicationIds(userId, orgId);\n const allApps = await this.applicationService.getAllByOrg(orgId);\n let accessible = allApps.filter(a => accessibleIds.includes(a.id));\n\n if (provider) {\n accessible = accessible.filter(a => a.provider!.type.toUpperCase() === provider.toUpperCase());\n if (!accessible.length) {\n return Promise.reject(`User is not authorized for this provider: ${provider}.`);\n }\n }\n\n if (!accessible.length) {\n return Promise.reject('User is not authorized for any applications.');\n }\n\n return buildAuth('holo_user', orgId, accessible, undefined, userId);\n }\n}\n","import {injectable} from 'tsyringe';\nimport {createDecipheriv} from 'crypto';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport {env} from '../../env';\n\n@injectable()\nexport class CryptoService extends ClassLogger {\n private readonly algorithm = 'aes-256-gcm';\n private readonly tagLength = 16;\n private readonly encryptionKey: Buffer;\n\n constructor() {\n super();\n const key = env.security.encryptionKey;\n if (!key) {\n throw new Error('ENCRYPTION_KEY not found in environment variables');\n }\n\n this.encryptionKey = Buffer.from(key, 'base64');\n\n if (this.encryptionKey.length !== 32) {\n throw new Error('ENCRYPTION_KEY must be 32 bytes (44 base64 characters)');\n }\n }\n\n decrypt(encryptedValue: string, initializationVector: string): string {\n const logger = this.mlog(this.decrypt);\n\n try {\n const iv = Buffer.from(initializationVector, 'base64');\n const encryptedData = Buffer.from(encryptedValue, 'base64');\n\n if (iv.length !== 12) {\n throw new Error('Invalid IV length. Expected 12 bytes.');\n }\n\n const authTag = encryptedData.subarray(-this.tagLength);\n const ciphertext = encryptedData.subarray(0, -this.tagLength);\n\n const decipher = createDecipheriv(this.algorithm, this.encryptionKey, iv);\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(ciphertext);\n decrypted = Buffer.concat([decrypted, decipher.final()]);\n\n return decrypted.toString('utf8');\n } catch (error) {\n logger.error(`Decryption failed: ${(error as Error).message}`);\n throw new Error('Failed to decrypt credential');\n }\n }\n}\n","export {AccessService} from './access.service';\nexport {AuthService} from \"./auth.service\";\nexport {CryptoService} from './crypto.service';\nexport {HoloTokenService} from './holo.token.service';\nexport {TokenService} from './token.service';","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger, setByPath} from '@holokai/holo-sdk';\nimport type {IDatastoreInstance, IDatastorePlugin} from '@holokai/holo-types/plugin';\nimport {PluginType} from '@holokai/holo-types/plugin';\nimport type {Datastore} from '@holokai/holo-types/entities';\nimport {DatastoreDB, type DatastoreWithCredential} from '../../db/datastore.db';\nimport {CryptoService} from '../auth';\nimport {PluginRegistry} from './plugin.registry';\n\nexport interface DatastoreImpl {\n datastore: Datastore;\n instance: IDatastoreInstance;\n}\n\n/**\n * Runtime registry for datastore plugins and connected instances.\n *\n * Holds two concerns (acceptable for v1, may be split later):\n * - Plugin definitions by plugin ID (loaded once from package)\n * - Connected datastore impls by Datastore entity ID (one per configured entity)\n */\n@injectable()\nexport class DatastorePluginService extends ClassLogger {\n private pluginDefinitions = new Map<string, IDatastorePlugin>();\n private connectedImpls = new Map<string, DatastoreImpl>();\n\n constructor(\n private readonly datastoreDB: DatastoreDB,\n private readonly cryptoService: CryptoService,\n private readonly pluginRegistry: PluginRegistry,\n ) {\n super();\n }\n\n registerPluginDefinition(pluginId: string, plugin: IDatastorePlugin): void {\n this.pluginDefinitions.set(pluginId, plugin);\n }\n\n getPluginDefinition(pluginId: string): IDatastorePlugin | undefined {\n return this.pluginDefinitions.get(pluginId);\n }\n\n getAllPluginDefinitions(): Map<string, IDatastorePlugin> {\n return new Map(this.pluginDefinitions);\n }\n\n async createDatastoreImpls(pluginId: string, _plugin: IDatastorePlugin): Promise<void> {\n const logger = this.mlog(this.createDatastoreImpls);\n let datastores: DatastoreWithCredential[];\n try {\n datastores = await this.datastoreDB.getEnabled();\n } catch (error) {\n logger.error(`Failed to query enabled datastores: ${(error as Error).message}`, {stack: (error as Error).stack});\n return;\n }\n\n for (const ds of datastores) {\n if (ds.plugin_id !== pluginId) continue;\n try {\n await this.refreshDatastore(ds.id);\n logger.info(`Created datastore impl for ${ds.name} (${ds.id})`);\n } catch (error) {\n logger.error(`Failed to create datastore impl for ${ds.name}: ${(error as Error).message}`, {\n datastoreId: ds.id,\n pluginId: ds.plugin_id,\n stack: (error as Error).stack\n });\n }\n }\n }\n\n async refreshDatastore(datastoreId: string): Promise<void> {\n const logger = this.mlog(this.refreshDatastore);\n\n const existing = this.connectedImpls.get(datastoreId);\n if (existing) {\n try {\n await existing.instance.disconnect();\n } catch (e) {\n logger.warn(`Error disconnecting old impl for ${datastoreId}: ${(e as Error).message}`);\n }\n this.connectedImpls.delete(datastoreId);\n }\n\n const datastore = await this.datastoreDB.getById(datastoreId);\n if (!datastore || !datastore.enabled) return;\n\n let plugin = this.pluginDefinitions.get(datastore.plugin_id);\n if (!plugin) {\n const loaded = this.pluginRegistry.get(datastore.plugin_id);\n if (loaded && loaded.type === PluginType.DATASTORE) {\n plugin = loaded as IDatastorePlugin;\n this.pluginDefinitions.set(datastore.plugin_id, plugin);\n }\n }\n if (!plugin) {\n throw new Error(`No plugin definition found for plugin_id=${datastore.plugin_id}`);\n }\n\n const config = this.decryptAndInjectCredential(datastore, plugin);\n const instance = await plugin.createInstance(config);\n await instance.connect();\n\n this.connectedImpls.set(datastoreId, {datastore, instance});\n }\n\n async removeImpl(datastoreId: string): Promise<void> {\n const existing = this.connectedImpls.get(datastoreId);\n if (existing) {\n await existing.instance.disconnect();\n this.connectedImpls.delete(datastoreId);\n }\n }\n\n async getOrCreate(datastoreId: string): Promise<DatastoreImpl> {\n const existing = this.connectedImpls.get(datastoreId);\n if (existing) return existing;\n\n await this.refreshDatastore(datastoreId);\n\n const impl = this.connectedImpls.get(datastoreId);\n if (!impl) throw new Error(`Datastore ${datastoreId} not found or plugin not loaded`);\n return impl;\n }\n\n getImplById(datastoreId: string): DatastoreImpl | undefined {\n return this.connectedImpls.get(datastoreId);\n }\n\n async getAllActiveImpls(): Promise<DatastoreImpl[]> {\n const enabled = await this.datastoreDB.getEnabled();\n for (const ds of enabled) {\n if (!this.connectedImpls.has(ds.id)) {\n try {\n await this.getOrCreate(ds.id);\n } catch (error) {\n const log = this.mlog(this.getAllActiveImpls);\n log.warn(`Failed to load datastore ${ds.id} (plugin=${ds.plugin_id}): ${(error as Error).message}`);\n }\n }\n }\n return Array.from(this.connectedImpls.values());\n }\n\n async removeAllImpls(): Promise<void> {\n for (const [id] of this.connectedImpls) {\n await this.removeImpl(id);\n }\n }\n\n private decryptAndInjectCredential(\n datastore: DatastoreWithCredential,\n plugin: IDatastorePlugin,\n ): Record<string, any> {\n const config = {...datastore.connection_config};\n if (!datastore.encrypted_value || !datastore.initialization_vector) return config;\n\n const fieldPath = plugin.getSchema?.()?.connection?.encrypted?.[0];\n if (!fieldPath) return config;\n\n const decrypted = this.cryptoService.decrypt(\n datastore.encrypted_value,\n datastore.initialization_vector,\n );\n return setByPath(config, fieldPath, decrypted);\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger, pickDefined} from '@holokai/holo-sdk';\nimport {\n normalizeModelName,\n stripChannel,\n stripDate,\n stripProviderRevision,\n stripQuantization\n} from '@holokai/holo-sdk/matching';\nimport {ModelDictionaryAliasDB, ModelDictionaryDB, ModelMatchOverrideDB} from '../db';\nimport type {MatchMethod} from '@holokai/holo-types/entities';\nimport {type ModelMatchResult} from '@holokai/holo-types/entities';\n\ninterface ResolveContext {\n organizationId?: string;\n providerId?: string;\n providerFamily?: string;\n sourceType?: string;\n sourceKey?: string;\n runtimeFamily?: string;\n kind?: string;\n}\n\n@injectable()\nexport class ModelMatchingService extends ClassLogger {\n constructor(\n private aliasDB: ModelDictionaryAliasDB,\n private dictionaryDB: ModelDictionaryDB,\n private overrideDB: ModelMatchOverrideDB,\n ) {\n super();\n }\n\n async resolve(input: string, context?: ResolveContext): Promise<ModelMatchResult> {\n const norm = normalizeModelName(input);\n const normalized = norm.normalized;\n\n const unmatched = (): ModelMatchResult => ({\n status: 'unmatched',\n method: 'none',\n confidence: 0,\n normalizedInput: normalized,\n candidateIds: [],\n });\n\n if (!normalized || normalized.length < 1) return unmatched();\n\n // 1. Override check\n if (context?.sourceType) {\n const override = await this.overrideDB.findMatch(normalized, {\n sourceType: context.sourceType,\n ...pickDefined({\n organizationId: context.organizationId,\n providerId: context.providerId,\n sourceKey: context.sourceKey\n }),\n });\n if (override) {\n return {\n dictionaryId: override.dictionary_id,\n canonicalId: override.canonical_id,\n status: 'manual',\n method: 'override',\n confidence: 1.0,\n normalizedInput: normalized,\n candidateIds: [override.dictionary_id],\n matchMetadata: {overrideId: override.id},\n };\n }\n }\n\n // 2. Canonical ID exact match\n const canonicalMatch = await this.dictionaryDB.findByCanonicalIdNormalized(normalized);\n if (canonicalMatch) {\n return {\n dictionaryId: canonicalMatch.id,\n canonicalId: canonicalMatch.canonical_id,\n status: 'exact',\n method: 'canonical_id',\n confidence: 1.0,\n normalizedInput: normalized,\n candidateIds: [canonicalMatch.id],\n };\n }\n\n // 3-6. Alias lookups with scoping\n const aliasResult = await this.resolveByAlias(normalized, context);\n if (aliasResult) return aliasResult;\n\n // 7. Date-stripped retry\n const dateStripped = stripDate(normalized);\n if (dateStripped) {\n const strippedResult = await this.resolveByAlias(dateStripped, context);\n if (strippedResult) {\n const confidence = Math.min(strippedResult.confidence, 0.88);\n const dateMetadata = {\n dateStripped: true as const,\n hints: {original: normalized, stripped: dateStripped}\n };\n\n if (strippedResult.status === 'ambiguous') {\n return {\n ...strippedResult,\n status: 'ambiguous',\n method: 'date_stripped' as const,\n confidence,\n normalizedInput: normalized,\n matchMetadata: {...strippedResult.matchMetadata, ...dateMetadata},\n };\n }\n return {\n ...strippedResult,\n status: 'heuristic' as const,\n method: 'date_stripped' as const,\n confidence,\n normalizedInput: normalized,\n matchMetadata: {...strippedResult.matchMetadata, ...dateMetadata},\n };\n }\n\n // Also try canonical ID with stripped date\n const canonicalStripped = await this.dictionaryDB.findByCanonicalIdNormalized(dateStripped);\n if (canonicalStripped) {\n return {\n dictionaryId: canonicalStripped.id,\n canonicalId: canonicalStripped.canonical_id,\n status: 'heuristic',\n method: 'date_stripped',\n confidence: 0.88,\n normalizedInput: normalized,\n candidateIds: [canonicalStripped.id],\n matchMetadata: {dateStripped: true},\n };\n }\n }\n\n // 7b. Revision-stripped\n const revisionResult = await this.tryStrippedLookup(\n stripProviderRevision(normalized), normalized, 'revision_stripped', 0.85, context,\n );\n if (revisionResult) return revisionResult;\n\n // 7c. Quantization-stripped\n const quantResult = await this.tryStrippedLookup(\n stripQuantization(normalized), normalized, 'quantization_stripped', 0.82, context,\n );\n if (quantResult) return quantResult;\n\n // 7d. Channel-stripped\n const channelResult = await this.tryStrippedLookup(\n stripChannel(normalized), normalized, 'channel_stripped', 0.80, context,\n );\n if (channelResult) return channelResult;\n\n // 7e. Chained fallbacks\n const chainedCandidates = new Set<string>();\n const chainedStrips: Array<[string | undefined, MatchMethod]> = [\n [stripDate(stripQuantization(normalized) ?? ''), 'quantization_stripped'],\n [stripProviderRevision(stripQuantization(normalized) ?? ''), 'quantization_stripped'],\n [stripChannel(stripProviderRevision(normalized) ?? ''), 'channel_stripped'],\n [stripChannel(stripDate(normalized) ?? ''), 'channel_stripped'],\n ];\n for (const [stripped, method] of chainedStrips) {\n if (!stripped || stripped === normalized || chainedCandidates.has(stripped)) continue;\n chainedCandidates.add(stripped);\n const chainedResult = await this.tryStrippedLookup(\n stripped, normalized, method, 0.78, context,\n );\n if (chainedResult) return chainedResult;\n }\n\n // 8. Structured query: family + variant + version + size + kind\n const structuredResult = await this.resolveByStructuredQuery(norm, context);\n if (structuredResult) return structuredResult;\n\n // 9. Unresolved\n return unmatched();\n }\n\n private async resolveByAlias(\n normalized: string,\n context?: ResolveContext,\n ): Promise<ModelMatchResult | null> {\n // Provider-scoped\n if (context?.providerFamily) {\n const result = await this.checkAliasHits(\n normalized,\n context.providerFamily,\n undefined,\n 'alias_provider_scoped',\n 0.99,\n );\n if (result) return result;\n }\n\n // Runtime-scoped\n if (context?.runtimeFamily) {\n const result = await this.checkAliasHits(\n normalized,\n undefined,\n context.runtimeFamily,\n 'alias_runtime_scoped',\n 0.99,\n );\n if (result) return result;\n }\n\n // Global\n const result = await this.checkAliasHits(\n normalized,\n undefined,\n undefined,\n 'alias_exact',\n 0.96,\n );\n return result;\n }\n\n private async checkAliasHits(\n normalized: string,\n providerFamily: string | undefined,\n runtimeFamily: string | undefined,\n method: MatchMethod,\n confidence: number,\n ): Promise<ModelMatchResult | null> {\n const hits = await this.aliasDB.findByNormalized(normalized, providerFamily, runtimeFamily);\n if (hits.length === 0) return null;\n\n const effective = hits;\n\n const distinctDictIds = [...new Set(effective.map(h => h.dictionary_id))];\n\n if (distinctDictIds.length === 1) {\n const best = effective[0]!;\n return {\n dictionaryId: best.dictionary_id,\n canonicalId: best.canonical_id,\n status: 'exact',\n method,\n confidence,\n normalizedInput: normalized,\n candidateIds: [best.dictionary_id],\n matchMetadata: {aliasId: best.id},\n };\n }\n\n const candidates = distinctDictIds.map(did => {\n const hit = effective.find(h => h.dictionary_id === did)!;\n return {dictionaryId: did, canonicalId: hit.canonical_id, score: confidence};\n });\n\n return {\n status: 'ambiguous',\n method,\n confidence,\n normalizedInput: normalized,\n candidateIds: distinctDictIds,\n explanation: `Multiple dictionary entries match alias \"${normalized}\"`,\n matchMetadata: {competingCandidates: candidates},\n };\n }\n\n private async tryStrippedLookup(\n stripped: string | undefined,\n original: string,\n method: MatchMethod,\n maxConfidence: number,\n context?: ResolveContext,\n ): Promise<ModelMatchResult | null> {\n if (!stripped || stripped === original) return null;\n const logger = this.mlog(this.tryStrippedLookup);\n\n const aliasResult = await this.resolveByAlias(stripped, context);\n if (aliasResult) {\n const confidence = Math.min(aliasResult.confidence, maxConfidence);\n logger.debug(`matched via ${method}: ${original} → ${stripped}`);\n return {\n ...aliasResult,\n status: aliasResult.status === 'ambiguous' ? 'ambiguous' : 'heuristic',\n method,\n confidence,\n normalizedInput: original,\n matchMetadata: {...aliasResult.matchMetadata, hints: {original, stripped}},\n } as ModelMatchResult;\n }\n\n const canonicalMatch = await this.dictionaryDB.findByCanonicalIdNormalized(stripped);\n if (canonicalMatch) {\n logger.debug(`matched via ${method} (canonical): ${original} → ${stripped}`);\n return {\n dictionaryId: canonicalMatch.id,\n canonicalId: canonicalMatch.canonical_id,\n status: 'heuristic',\n method,\n confidence: maxConfidence,\n normalizedInput: original,\n candidateIds: [canonicalMatch.id],\n matchMetadata: {hints: {original, stripped}},\n };\n }\n\n return null;\n }\n\n private async resolveByStructuredQuery(\n norm: ReturnType<typeof normalizeModelName>,\n context?: ResolveContext,\n ): Promise<ModelMatchResult | null> {\n const providerFamily = context?.providerFamily;\n const semanticFamily = norm.familyHint;\n if (!providerFamily && !semanticFamily) return null;\n\n const conditions: string[] = [];\n const params: any[] = [];\n let idx = 1;\n let specificity = 0;\n\n if (providerFamily) {\n conditions.push(`provider_family = $${idx++}`);\n params.push(providerFamily);\n }\n if (semanticFamily) {\n conditions.push(`(family ILIKE $${idx} OR normalized_name ILIKE $${idx})`);\n params.push(`%${semanticFamily}%`);\n idx++;\n specificity += 1;\n }\n\n if (norm.variantHint) {\n conditions.push(`variant = $${idx++}`);\n params.push(norm.variantHint);\n specificity += 3;\n }\n if (norm.versionHint) {\n conditions.push(`version_label = $${idx++}`);\n params.push(norm.versionHint);\n specificity += 2;\n }\n if (norm.sizeHint) {\n conditions.push(`size_label = $${idx++}`);\n params.push(norm.sizeHint);\n specificity += 2;\n }\n if (context?.kind || norm.kindHint) {\n conditions.push(`kind = $${idx++}`);\n params.push(context?.kind ?? norm.kindHint);\n specificity += 1;\n }\n\n if (specificity < 2) return null;\n\n const rows = await this.dictionaryDB['db'].systemQuery<{ id: string; canonical_id: string }>(\n `SELECT id, canonical_id\n FROM model_dictionary\n WHERE ${conditions.join(' AND ')}\n ORDER BY canonical_id\n LIMIT 5`,\n params\n );\n\n if (rows.length === 0) return null;\n\n const baseConfidence = 0.72 + Math.min(specificity * 0.03, 0.12);\n\n if (rows.length === 1) {\n return {\n dictionaryId: rows[0]!.id,\n canonicalId: rows[0]!.canonical_id,\n status: 'heuristic',\n method: 'structured_query',\n confidence: baseConfidence,\n normalizedInput: norm.normalized,\n candidateIds: [rows[0]!.id],\n matchMetadata: {\n hints: {\n ...(norm.familyHint ? {family: norm.familyHint} : {}),\n ...(norm.variantHint ? {variant: norm.variantHint} : {}),\n ...(norm.versionHint ? {version: norm.versionHint} : {}),\n ...(norm.sizeHint ? {size: norm.sizeHint} : {}),\n },\n },\n };\n }\n\n // Multiple results — check if top two are close enough to be ambiguous\n const candidates = rows.map(r => ({\n dictionaryId: r.id,\n canonicalId: r.canonical_id,\n score: baseConfidence,\n }));\n\n return {\n status: 'ambiguous',\n method: 'structured_query',\n confidence: baseConfidence,\n normalizedInput: norm.normalized,\n candidateIds: rows.map(r => r.id),\n explanation: `Multiple dictionary entries match structured query for family \"${semanticFamily ?? providerFamily}\"`,\n matchMetadata: {competingCandidates: candidates},\n };\n }\n}\n","import {injectable} from 'tsyringe';\nimport {PluginDiscoveryService} from './discovery.service';\nimport {PluginLoaderService} from './loader.service';\nimport {ProviderPluginService} from './provider.plugin.service';\nimport {\n type IDatastorePlugin,\n type IPlugin,\n type IPluginRegistry,\n type IProviderPlugin,\n type PluginContext,\n PluginState,\n PluginType\n} from '@holokai/holo-types/plugin';\nimport type {HoloLogger} from \"@holokai/holo-types/logger\";\nimport logger from \"../../utils/logger\";\nimport {ModelDictionaryAliasDB, PluginDB, PricingDB, ServerDB} from \"../../db\";\nimport {BaseEntityService} from \"../entities\";\nimport {type Plugin} from \"@holokai/holo-types/entities\";\nimport {RedisService} from \"../redis.service\";\nimport {PluginRegistry} from \"./plugin.registry\";\nimport {DatastorePluginService} from \"./datastore.plugin.service\";\nimport {pickDefined} from \"@holokai/holo-sdk\";\nimport {stripDate} from \"@holokai/holo-sdk/matching\";\nimport {ModelMatchingService} from \"../model-matching.service\";\n\n/**\n * Service responsible for initializing and managing the plugin system\n * Orchestrates plugin discovery, loading, initialization, and registration\n */\n@injectable()\nexport class PluginService extends BaseEntityService<Plugin> implements IPluginRegistry<IPlugin> {\n\n private readonly versionedPlugins: Map<string, Map<string, Plugin>> = new Map();\n private readonly pluginImpls: Map<string, IPlugin> = new Map();\n\n constructor(\n private readonly pluginDB: PluginDB,\n private readonly serverDB: ServerDB,\n private readonly pricingDB: PricingDB,\n private readonly aliasDB: ModelDictionaryAliasDB,\n private readonly matchingService: ModelMatchingService,\n private readonly discovery: PluginDiscoveryService,\n private readonly loader: PluginLoaderService,\n private readonly providerPluginService: ProviderPluginService,\n private readonly pluginRegistry: PluginRegistry,\n private readonly datastorePluginService: DatastorePluginService,\n redis: RedisService,\n ) {\n super(redis, {prefix: 'plugin', ttl: 300});\n }\n\n /**\n * Initialize the plugin system by discovering, loading, and registering plugins\n * @returns Promise that resolves when all plugins are initialized\n */\n async initializePluginSystem(serverName: string): Promise<void> {\n const log = this.mlog(this.initializePluginSystem);\n log.info('Initializing plugin system...');\n\n // Discover provider plugins\n const discovered = await this.discovery.discoverPluginsByType(PluginType.PROVIDER);\n log.info(`Discovered ${discovered.length} provider plugins`);\n\n // Load plugins\n const loaded = await this.loader.loadPlugins(discovered);\n log.info(`Loaded ${loaded.length} provider plugins`);\n\n // Initialize and register each provider plugin\n for (const {plugin, discoveryInfo} of loaded) {\n\n //register plugin\n await this.registerPlugin(\n serverName,\n plugin as IProviderPlugin,\n false,\n discoveryInfo.packageName\n );\n\n // Create plugin context\n const pluginContext: PluginContext = {\n logger: logger as HoloLogger,\n config: {},\n env: process.env\n };\n\n // Initialize plugin\n await plugin.initialize(pluginContext);\n\n if (plugin.getState() === PluginState.READY) {\n log.info(`Registered provider plugin: ${plugin.manifest.name}@${discoveryInfo.version}`);\n } else {\n log.warn(`Plugin ${plugin.manifest.name} not ready, state: ${plugin.getState()}`);\n }\n }\n\n // Discover and load datastore plugins\n const discoveredDatastores = await this.discovery.discoverPluginsByType(PluginType.DATASTORE);\n if (discoveredDatastores.length > 0) {\n log.info(`Discovered ${discoveredDatastores.length} datastore plugins`);\n const loadedDatastores = await this.loader.loadPlugins(discoveredDatastores);\n\n for (const {plugin, discoveryInfo} of loadedDatastores) {\n await this.registerPlugin(serverName, plugin, false, discoveryInfo.packageName);\n\n const pluginContext: PluginContext = {\n logger: logger as HoloLogger,\n config: {},\n env: process.env,\n };\n await plugin.initialize(pluginContext);\n\n if (plugin.getState() === PluginState.READY) {\n log.info(`Registered datastore plugin: ${plugin.manifest.name}@${discoveryInfo.version}`);\n }\n }\n }\n\n const registeredIds = Array.from(this.pluginImpls.keys());\n const removed = await this.serverDB.syncPlugins(serverName, registeredIds);\n if (removed > 0) {\n log.info(`Removed ${removed} stale plugin(s) from server ${serverName}`);\n }\n\n log.info('Plugin system initialized successfully');\n }\n\n async registerPluginProtocols(serverName: string): Promise<void> {\n const log = this.mlog(this.registerPluginProtocols);\n let registered = 0;\n\n for (const [pluginId, plugin] of this.pluginRegistry.allLoaded()) {\n try {\n const pluginRow = await this.pluginDB.getById(pluginId);\n if (!pluginRow) continue;\n\n await this.serverDB.registerPlugin(serverName, pluginId);\n this.pluginImpls.set(pluginId, plugin);\n\n if (!pluginRow.schema && plugin.getSchema) {\n const schema = plugin.getSchema();\n if (schema) {\n await this.pluginDB.updateSchema(pluginId, schema);\n pluginRow.schema = schema;\n }\n }\n\n const family = pluginRow.family.toUpperCase();\n if (!this.versionedPlugins.has(family)) {\n this.versionedPlugins.set(family, new Map());\n }\n this.versionedPlugins.get(family)!.set(pluginRow.version, pluginRow);\n\n const pluginType = plugin.type?.toUpperCase() ?? pluginRow.type;\n const tag = `${family}@${pluginRow.version}`;\n switch (pluginType) {\n case PluginType.PROVIDER: {\n const providerPlugin = plugin as IProviderPlugin;\n const routes = providerPlugin.getRoutes();\n await this.providerPluginService.registerProtocols(pluginId, routes);\n const pricingResult = await this.registerDefaultPricing(providerPlugin, family, pluginId);\n log.info(`${tag}: ${routes.length} route(s), ${pricingResult}`);\n break;\n }\n case PluginType.DATASTORE: {\n const datastorePlugin = plugin as IDatastorePlugin;\n this.datastorePluginService.registerPluginDefinition(pluginId, datastorePlugin);\n await this.datastorePluginService.createDatastoreImpls(pluginId, datastorePlugin);\n log.info(`${tag}: datastore registered`);\n break;\n }\n }\n registered++;\n } catch (error) {\n log.error(`Failed to register plugin ${pluginId}: ${(error as Error).message}`);\n }\n }\n\n log.info(`Registered ${registered} plugin(s)`);\n }\n\n async registerPlugin(serverName: string, plugin: IPlugin, _isLatest: boolean = false, packageName?: string): Promise<void> {\n const logger = this.mlog(this.registerPlugin);\n const npmName = packageName ?? plugin.manifest.name;\n logger.info(`Registering plugin: ${npmName} with server: ${serverName}`);\n if (!plugin.family) {\n throw new Error(`Plugin ${npmName} has no family defined`);\n }\n const family = plugin.family.toUpperCase();\n const pluginVersion = plugin.version;\n\n const pluginRow = await this.pluginDB.upsert(family, npmName, pluginVersion, plugin.type);\n if (!pluginRow) throw new Error(`Error registering plugin ${npmName}@${pluginVersion}`);\n\n await this.serverDB.registerPlugin(serverName, pluginRow.id);\n\n this.pluginImpls.set(pluginRow.id, plugin);\n if (!this.versionedPlugins.has(family)) {\n this.versionedPlugins.set(family, new Map());\n }\n this.versionedPlugins.get(family)!.set(pluginVersion, pluginRow);\n\n switch (plugin.type) {\n case PluginType.PROVIDER: {\n const providerPlugin = plugin as IProviderPlugin;\n const routes = providerPlugin.getRoutes();\n await this.providerPluginService.registerProtocols(pluginRow.id, routes);\n await this.registerDefaultPricing(providerPlugin, family, pluginRow.id);\n break;\n }\n case PluginType.DATASTORE: {\n const datastorePlugin = plugin as IDatastorePlugin;\n this.datastorePluginService.registerPluginDefinition(pluginRow.id, datastorePlugin);\n await this.datastorePluginService.createDatastoreImpls(pluginRow.id, datastorePlugin);\n break;\n }\n default:\n throw new Error(`Unsupported plugin type ${plugin.type}`);\n }\n\n }\n\n async loadPluginLocally(\n serverName: string,\n plugin: IPlugin,\n pluginId: string,\n family: string,\n ): Promise<void> {\n const log = this.mlog(this.loadPluginLocally);\n const familyKey = family.toUpperCase();\n\n const pluginRow = await this.pluginDB.getById(pluginId);\n if (!pluginRow) {\n throw new Error(`Plugin ${pluginId} not found in DB. API server may not have registered it yet.`);\n }\n\n await this.serverDB.registerPlugin(serverName, pluginId);\n\n this.pluginImpls.set(pluginId, plugin);\n if (!this.versionedPlugins.has(familyKey)) {\n this.versionedPlugins.set(familyKey, new Map());\n }\n this.versionedPlugins.get(familyKey)!.set(pluginRow.version, pluginRow);\n\n switch (plugin.type) {\n case PluginType.PROVIDER: {\n await this.providerPluginService.loadProtocolsFromDB(pluginId);\n break;\n }\n case PluginType.DATASTORE: {\n const datastorePlugin = plugin as IDatastorePlugin;\n this.datastorePluginService.registerPluginDefinition(pluginId, datastorePlugin);\n await this.datastorePluginService.createDatastoreImpls(pluginId, datastorePlugin);\n break;\n }\n }\n\n log.info(`Loaded plugin locally: ${plugin.name} (${pluginId})`);\n }\n\n async registerServerAssociation(serverName: string, pluginId: string): Promise<void> {\n await this.serverDB.registerPlugin(serverName, pluginId);\n }\n\n async removePlugin(pluginId: string): Promise<void> {\n const logger = this.mlog(this.removePlugin);\n\n const impl = this.pluginImpls.get(pluginId);\n if (impl) {\n try {\n await impl.destroy();\n } catch (e) {\n logger.warn(`Error destroying plugin ${pluginId}: ${(e as Error).message}`);\n }\n this.pluginImpls.delete(pluginId);\n }\n\n for (const [, versions] of this.versionedPlugins) {\n for (const [version, plugin] of versions) {\n if (plugin.id === pluginId) {\n versions.delete(version);\n break;\n }\n }\n }\n\n await this.pluginDB.deactivate(pluginId);\n logger.info(`Removed plugin ${pluginId}`);\n }\n\n async unregisterPlugin(family: string, version?: string): Promise<void> {\n const familyKey = family.toUpperCase();\n\n if (!version) {\n this.versionedPlugins.delete(familyKey);\n } else {\n const versions = this.versionedPlugins.get(familyKey);\n if (versions) {\n versions.delete(version);\n if (versions.size === 0) {\n this.versionedPlugins.delete(familyKey);\n }\n }\n }\n }\n\n async getPlugins(filter?: (plugin: Plugin) => boolean): Promise<Plugin[]> {\n const result: Plugin[] = [];\n for (const versionMap of this.versionedPlugins.values()) {\n for (const plugin of versionMap.values()) {\n if (!filter || filter(plugin)) {\n result.push(plugin);\n }\n }\n }\n return result;\n }\n\n async getImpls(filter?: (plugin: Plugin) => boolean): Promise<IPlugin[]> {\n const result: IPlugin[] = [];\n for (const versionMap of this.versionedPlugins.values()) {\n for (const plugin of versionMap.values()) {\n if (!filter || filter(plugin)) {\n const impl = this.pluginImpls.get(plugin.id);\n if (impl) result.push(impl);\n }\n }\n }\n return result;\n }\n\n async getImplById(id: string): Promise<IPlugin | null> {\n return this.pluginImpls.get(id) || null;\n }\n\n async getImplByFamily(family: string, version?: string): Promise<IPlugin | null> {\n const familyKey = family.toUpperCase();\n const impls = await this.getImpls(p =>\n p.family === familyKey && (version ? p.version === version : true));\n return impls.length > 0 ? impls[0] : null;\n }\n\n private async registerDefaultPricing(plugin: IProviderPlugin, family: string, pluginId: string): Promise<string> {\n const sheets = plugin.getPricingSheets?.();\n const fallbackSheet = !sheets ? plugin.getDefaultPricing?.() : undefined;\n if (!sheets && !fallbackSheet) return 'no pricing';\n\n const sheetMap: Map<string, import('@holokai/holo-types/plugin').PluginPricingSheet> =\n sheets ?? new Map([[fallbackSheet!.version, fallbackSheet!]]);\n\n const sorted = Array.from(sheetMap.values()).sort(\n (a, b) => b.effective_from.localeCompare(a.effective_from)\n );\n const latestSheet = sorted[0];\n\n const logger = this.mlog(this.registerDefaultPricing);\n const plan = await this.pricingDB.upsertPlan(\n family,\n latestSheet.name,\n 'plugin',\n true,\n true,\n );\n if (!plan) {\n logger.warn(`Failed to upsert default pricing plan for ${family}`);\n return 'pricing plan failed';\n }\n\n await this.pluginDB.setDefaultPricingPlan(pluginId, plan.id);\n\n let totalModels = 0;\n for (const pricingData of sheetMap.values()) {\n const sheet = await this.pricingDB.upsertSheet(\n plan.id,\n pricingData.name,\n pricingData.version,\n pricingData.effective_from,\n pricingData.effective_to,\n );\n if (!sheet) {\n logger.warn(`Failed to upsert pricing sheet ${pricingData.version} for ${family}`);\n continue;\n }\n\n for (const model of pricingData.models) {\n await this.pricingDB.upsertSheetModel(sheet.id, model.model_name, pickDefined({\n input_cost: model.input_cost,\n output_cost: model.output_cost,\n cache_read_cost: model.cache_read_cost,\n cache_write_cost: model.cache_write_cost,\n batch_input_cost: model.batch_input_cost,\n batch_output_cost: model.batch_output_cost,\n context_threshold: model.context_threshold,\n extended_input_cost: model.extended_input_cost,\n extended_output_cost: model.extended_output_cost,\n token_costs: model.token_costs,\n }) as {\n input_cost: number;\n output_cost: number;\n cache_read_cost?: number;\n cache_write_cost?: number;\n batch_input_cost?: number;\n batch_output_cost?: number;\n context_threshold?: number;\n extended_input_cost?: number;\n extended_output_cost?: number;\n token_costs?: Record<string, number>;\n });\n }\n\n // Only delete stale models on the latest sheet\n if (pricingData === latestSheet) {\n const currentModelNames = pricingData.models.map(m => m.model_name);\n await this.pricingDB.deleteStaleModels(sheet.id, currentModelNames);\n }\n\n totalModels += pricingData.models.length;\n }\n\n const dictResult = await this.registerModelIdsInDictionary(plugin, family);\n return `${sheetMap.size} sheet(s), ${totalModels} models, ${dictResult}`;\n }\n\n private async registerModelIdsInDictionary(\n plugin: IProviderPlugin,\n family: string,\n ): Promise<string> {\n const modelIds = plugin.getPricingModelIds?.();\n if (!modelIds || modelIds.length === 0) return 'no model IDs';\n\n const logger = this.mlog(this.registerModelIdsInDictionary);\n const providerFamily = family.toLowerCase();\n let matched = 0;\n let unmatched = 0;\n\n for (const mid of modelIds) {\n if (mid.shutdown_date && new Date(mid.shutdown_date) < new Date()) continue;\n\n try {\n const result = await this.matchingService.resolve(mid.model_id, {\n providerFamily,\n sourceType: 'plugin_registration',\n });\n\n if (result.status === 'exact' || result.status === 'heuristic' || result.status === 'manual') {\n matched++;\n if (result.dictionaryId) {\n await this.insertPluginAliases(result.dictionaryId, mid.model_id, result.normalizedInput, providerFamily);\n }\n } else {\n unmatched++;\n }\n } catch (err) {\n logger.warn(`Failed to register model_id ${mid.model_id}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return `dict ${matched}/${matched + unmatched} matched`;\n }\n\n private async insertPluginAliases(\n dictionaryId: string,\n rawModelId: string,\n normalized: string,\n providerFamily: string,\n ): Promise<void> {\n const baseAlias = {\n dictionary_id: dictionaryId,\n provider_family: providerFamily,\n source: 'plugin_registration' as const,\n source_key: providerFamily,\n active: true as const,\n };\n\n await this.aliasDB.upsert({\n ...baseAlias,\n alias: rawModelId,\n alias_normalized: normalized,\n alias_type: 'provider_api',\n weight: 95,\n });\n\n const dateStripped = stripDate(normalized);\n if (dateStripped && dateStripped !== normalized) {\n await this.aliasDB.upsert({\n ...baseAlias,\n alias: dateStripped,\n alias_normalized: dateStripped,\n alias_type: 'shorthand',\n weight: 85,\n });\n }\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {randomUUID} from \"crypto\";\nimport {ClassLogger, sanitizeObject, setByPath} from \"@holokai/holo-sdk\";\nimport {type IProvider, type IProviderPlugin} from \"@holokai/holo-types\";\nimport {ProviderService} from \"../entities\";\nimport {ProviderDB, type ProviderWithCredential} from \"../../db/provider.db\";\nimport {CryptoService} from \"../auth\";\nimport {PluginRegistry} from \"./plugin.registry\";\n\n@injectable()\nexport class ProviderImplService extends ClassLogger {\n\n private providerImpls: Map<string, IProvider> = new Map();\n\n constructor(\n private providerService: ProviderService,\n private cryptoService: CryptoService,\n private pluginRegistry: PluginRegistry,\n private providerDB: ProviderDB,\n ) {\n super();\n }\n\n async getOrCreate(providerId: string): Promise<IProvider> {\n const existing = this.providerImpls.get(providerId);\n if (existing) return existing;\n\n const log = this.mlog(this.getOrCreate);\n const provider = await this.providerService.getById(providerId);\n if (!provider) throw new Error(`Provider ${providerId} not found`);\n if (!provider.plugin_id) throw new Error(`Provider ${providerId} has no plugin_id`);\n\n const plugin = await this.pluginRegistry.getOrLoad(provider.plugin_id) as IProviderPlugin;\n\n const config = await this.decryptAndInjectCredential(provider, plugin);\n const impl = await plugin.createProvider(provider.id, provider.name, config);\n this.providerImpls.set(providerId, impl);\n\n log.info(`Created provider impl: ${provider.name} (${providerId}) using plugin ${provider.plugin_id}`);\n return impl;\n }\n\n async getProviderImplById(id: string): Promise<IProvider> {\n return this.getOrCreate(id);\n }\n\n async warmAll(): Promise<void> {\n const log = this.mlog(this.warmAll);\n const providers = await this.providerDB.list();\n log.info(`Warming ${providers.length} provider(s)...`);\n\n const pluginIds = new Set(providers.map(p => p.plugin_id));\n for (const pluginId of pluginIds) {\n try {\n await this.pluginRegistry.getOrLoad(pluginId);\n } catch (e) {\n log.error(`Failed to load plugin ${pluginId}: ${(e as Error).message}`);\n }\n }\n\n for (const provider of providers) {\n if (!this.pluginRegistry.has(provider.plugin_id)) {\n log.error(`Provider ${provider.name} references missing plugin ${provider.plugin_id} — cannot serve requests`);\n continue;\n }\n try {\n await this.getOrCreate(provider.id);\n } catch (e) {\n log.error(`Failed to warm provider ${provider.name}: ${(e as Error).message}`);\n }\n }\n\n log.info(`Warmed ${this.providerImpls.size} provider impl(s)`);\n }\n\n getAllProviderImpls(): Map<string, IProvider> {\n return this.providerImpls;\n }\n\n async refreshProvider(providerId: string): Promise<void> {\n const log = this.mlog(this.refreshProvider);\n await this.removeImpl(providerId);\n\n const provider = await this.providerService.getById(providerId);\n if (!provider) {\n log.debug(`Provider ${providerId} not found or inactive, removed impl`);\n return;\n }\n\n await this.getOrCreate(providerId);\n }\n\n async removeImpl(providerId: string): Promise<void> {\n const impl = this.providerImpls.get(providerId);\n if (impl && typeof (impl as any).dispose === 'function') {\n await (impl as any).dispose();\n }\n this.providerImpls.delete(providerId);\n }\n\n async removeImplsByPluginId(pluginId: string): Promise<number> {\n const toRemove: string[] = [];\n for (const [providerId, impl] of this.providerImpls) {\n if ((impl as any).pluginId === pluginId) {\n toRemove.push(providerId);\n }\n }\n for (const id of toRemove) {\n await this.removeImpl(id);\n }\n return toRemove.length;\n }\n\n async removeImplsByProviderIds(providerIds: string[]): Promise<void> {\n for (const id of providerIds) {\n await this.removeImpl(id);\n }\n }\n\n async upgradeProviderPlugin(providerId: string, targetPluginId: string): Promise<void> {\n const log = this.mlog(this.upgradeProviderPlugin);\n await this.providerService.updatePluginId(providerId, targetPluginId);\n await this.removeImpl(providerId);\n await this.getOrCreate(providerId);\n log.info(`Upgraded provider ${providerId} to plugin ${targetPluginId}`);\n }\n\n async testConnection(providerId: string): Promise<{ ok: boolean; error?: string }> {\n try {\n const impl = await this.getOrCreate(providerId);\n await impl.discoverModels();\n return {ok: true};\n } catch (error) {\n return {ok: false, error: error instanceof Error ? error.message : String(error)};\n }\n }\n\n async testConnectionWithConfig(pluginId: string, config: Record<string, any>): Promise<{\n ok: boolean;\n error?: string\n }> {\n let impl: IProvider | null = null;\n try {\n const plugin = await this.pluginRegistry.getOrLoad(pluginId) as IProviderPlugin;\n impl = await plugin.createProvider(randomUUID(), 'test', config);\n await impl.discoverModels();\n return {ok: true};\n } catch (error) {\n return {ok: false, error: error instanceof Error ? error.message : String(error)};\n } finally {\n if (impl && typeof (impl as any).dispose === 'function') {\n try {\n await (impl as any).dispose();\n } catch { /* ignore cleanup errors */\n }\n }\n }\n }\n\n private async decryptAndInjectCredential(\n provider: ProviderWithCredential,\n plugin: IProviderPlugin,\n ): Promise<Record<string, any>> {\n const log = this.mlog(this.decryptAndInjectCredential);\n let config = sanitizeObject(provider.config);\n\n if (!provider.encrypted_value || !provider.initialization_vector) {\n log.debug(`No encrypted credentials for provider ${provider.name}`);\n const schema = plugin.getSchema?.()?.connection;\n if (schema?.encrypted?.length && schema.properties) {\n for (const field of schema.encrypted) {\n const prop = schema.properties[field];\n if (prop && typeof prop === 'object' && prop.default !== undefined && config[field] === undefined) {\n config = setByPath(config, field, prop.default);\n }\n }\n }\n return config;\n }\n\n try {\n const fieldPath = plugin.getSchema?.()?.connection?.encrypted?.[0] ?? 'apiKey';\n const decrypted = this.cryptoService.decrypt(\n provider.encrypted_value,\n provider.initialization_vector\n );\n return setByPath(config, fieldPath, decrypted);\n } catch (error) {\n log.error(`Failed to decrypt credential for provider ${provider.name}: ${(error as Error).message}`);\n throw new Error(`Failed to decrypt credential for provider ${provider.name}`);\n }\n }\n}\n","import \"reflect-metadata\";\nimport {type Channel, type ChannelModel, connect, type ConsumeMessage, type Replies} from 'amqplib';\nimport {EventEmitter} from 'events';\nimport {type RabbitConfig} from \"../types\";\nimport {env} from \"../env\";\nimport {injectable} from \"tsyringe\";\nimport {withClassLogger} from \"@holokai/holo-sdk\";\nimport Consume = Replies.Consume;\n\n/**\n * RabbitMQ queue management service\n */\n@injectable()\nexport class QueueService extends withClassLogger(EventEmitter) {\n public isConnected: boolean = false;\n public reconnectAttempts = 0;\n private readonly config: RabbitConfig = env.queue.config\n private connection: ChannelModel | null = null;\n private channel: Channel | null = null;\n private recreatingChannel = false;\n private reconnectCallbacks: Array<() => Promise<void>> = [];\n\n constructor() {\n super();\n }\n\n onReconnect(callback: () => Promise<void>): void {\n this.reconnectCallbacks.push(callback);\n }\n\n public async connect(): Promise<void> {\n const logger = this.mlog(this.connect);\n try {\n if (this.connection && this.channel) {\n this.isConnected = true;\n return;\n }\n\n if (this.connection && !this.channel) {\n await this.recreateChannel();\n return;\n }\n\n const loggedUrl = new URL(this.config.url);\n if (loggedUrl.password) loggedUrl.password = '***';\n logger.info(`Connecting to RabbitMQ on: ${loggedUrl.toString()}`);\n this.connection = await connect(this.config.url);\n logger.info('Successfully connected to RabbitMQ');\n\n await this.createChannel();\n\n this.connection.on('error', (err) => {\n logger.error(`RabbitMQ connection error: ${err.message}`);\n this.isConnected = false;\n this.channel = null;\n this.connection = null;\n this.emit('channel:lost');\n this.reconnect();\n });\n\n this.connection.on('close', () => {\n if (this.isConnected) {\n logger.warn('RabbitMQ connection closed unexpectedly');\n this.isConnected = false;\n this.channel = null;\n this.connection = null;\n this.emit('channel:lost');\n this.reconnect();\n }\n });\n\n this.isConnected = true;\n } catch (error) {\n logger.error(`Failed to connect to RabbitMQ: ${(error as Error).message}`);\n throw error;\n }\n }\n\n public async reconnect(): Promise<void> {\n const logger = this.mlog(this.reconnect);\n if (!this.isConnected) {\n if (this.reconnectAttempts >= this.config.reconnectAttempts) {\n logger.error(`Failed to reconnect to RabbitMQ after ${this.reconnectAttempts} attempts`);\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.config.reconnectDelayMs * Math.pow(2, this.reconnectAttempts - 1);\n\n logger.info(`Attempting to reconnect to RabbitMQ in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n this.channel = null;\n this.connection = null;\n\n setTimeout(async () => {\n try {\n await this.connect();\n if (this.isConnected) {\n for (const cb of this.reconnectCallbacks) {\n try {\n await cb();\n } catch (e) {\n logger.error(`Reconnect callback error: ${(e as Error).message}`);\n }\n }\n }\n } catch (error) {\n // Error handling is done in the connect method\n }\n }, delay);\n }\n }\n\n public async closeChannel(): Promise<void> {\n if (this.channel) {\n const ch = this.channel;\n this.channel = null;\n this.isConnected = false;\n this.emit('channel:lost');\n await ch.close();\n }\n }\n\n public async disconnect() {\n const logger = this.mlog(this.disconnect);\n if (!this.isConnected && !this.connection) return;\n\n await this.closeChannel();\n\n if (this.connection) {\n const conn = this.connection;\n this.connection = null as any;\n await conn.close();\n }\n\n this.isConnected = false;\n logger.info('Disconnected from RabbitMQ');\n }\n\n public async consume(queueName: string, callback: (messageId: string, content: any, message: ConsumeMessage) => Promise<void>, ignoreErrors: boolean = false, options = {noAck: false}): Promise<Consume> {\n const logger = this.mlog(this.connect);\n if (!this.isConnected) {\n await this.connect();\n }\n // logger.debug(`Consuming messages from queue: ${queueName}`);\n\n try {\n return this.channel!.consume(queueName, async (message) => {\n if (!message) {\n logger.warn(`Received null message from queue: ${queueName}`);\n return;\n }\n try {\n const content = JSON.parse(message.content.toString());\n const {requestId} = content;\n await callback(requestId, content, message);\n this.channel?.ack(message);\n\n } catch (error) {\n logger.error(`Error processing message from queue: ${queueName}: ${(error as Error).message}`);\n\n if (!this.channel) return;\n\n if (ignoreErrors) {\n this.channel.ack(message);\n } else {\n if (message.fields.redelivered) {\n this.channel.nack(message, false, false);\n logger.warn('Rejected problematic message after redelivery');\n } else {\n this.channel.nack(message, false, true);\n logger.info('Message re-queued for retry');\n }\n }\n }\n\n }, options);\n } catch (error) {\n logger.error(`Error setting up consumer for queue ${queueName}: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * Send a message to a queue\n * @param {string} queue - Queue name\n * @param {object} message - Message to send\n * @param {object} options - Message options\n */\n async sendToQueue(queue: string, message: { id: string }, options: object = {}): Promise<boolean> {\n const logger = this.mlog(this.sendToQueue);\n if (!this.isConnected) {\n await this.connect();\n }\n\n try {\n // Convert message to buffer\n const buffer = Buffer.from(JSON.stringify(message));\n\n // Default options\n const defaultOptions = {\n persistent: true,\n contentType: 'application/json'\n };\n\n // Merge options\n const messageOptions = {...defaultOptions, ...options};\n\n // Send to queue\n const sent = this.channel!.sendToQueue(queue, buffer, messageOptions);\n\n if (sent) {\n logger.debug(`Message sent to queue ${queue} with ID: ${message.id}`);\n } else {\n logger.warn(`Failed to send message to queue ${queue}, channel back-pressured`);\n // Handle back-pressure, perhaps by implementing a retry mechanism\n }\n\n return sent;\n } catch (error) {\n logger.error(`Error sending message to queue ${queue}: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * Send a message to an exchange\n * @param {string} exchange - Exchange name\n * @param {string} routingKey - Routing key\n * @param {object} message - Message to send\n * @param {object} options - Message options\n */\n async sendToExchange(exchange: string, routingKey: string, message: {}, options: object = {}): Promise<boolean> {\n const logger = this.mlog(this.sendToExchange);\n if (!this.isConnected) {\n await this.connect();\n }\n\n try {\n // Convert message to buffer\n const buffer = Buffer.from(JSON.stringify(message));\n\n // Default options\n const defaultOptions = {\n persistent: true,\n contentType: 'application/json'\n };\n\n // Merge options\n const messageOptions = {...defaultOptions, ...options};\n\n // Send to exchange\n const sent = this.channel!.publish(exchange, routingKey, buffer, messageOptions);\n\n if (!sent) {\n logger.warn(`Failed to publish message to exchange ${exchange}, channel back-pressured`);\n // Handle back-pressure\n }\n\n return sent;\n } catch (error) {\n logger.error(`Error publishing message to exchange ${exchange}: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * Stop consuming messages\n */\n async stop() {\n const logger = this.mlog(this.stop);\n if (this.channel) {\n try {\n await this.channel.cancel('Stopping consumer');\n logger.info('Stopped consuming messages');\n } catch (error) {\n logger.error(`Error stopping consumer: ${(error as Error).message}`);\n }\n }\n }\n\n async assertExchange(exchange: string, type: string, options: object = {durable: true}) {\n const logger = this.mlog(this.assertExchange);\n if (!this.isConnected) {\n await this.connect();\n }\n\n logger.debug(`Asserting exchange ${exchange} with type ${type}`);\n await this.channel!.assertExchange(exchange, type, options);\n }\n\n async assertQueue(queue: string, options: object = {durable: true}, exchange?: string, pattern?: string) {\n const logger = this.mlog(this.assertQueue);\n if (!this.isConnected) {\n await this.connect();\n }\n logger.debug(`Asserting queue ${queue}`);\n await this.channel!.assertQueue(queue, options);\n\n if (exchange) {\n await this.bindQueue(queue, exchange, pattern || '');\n }\n }\n\n async bindQueue(queue: string, exchange: string, pattern: string) {\n const logger = this.mlog(this.bindQueue);\n if (!this.isConnected) {\n await this.connect();\n }\n if (pattern) {\n logger.debug(`Binding queue ${queue} to exchange ${exchange} with pattern ${pattern}`);\n } else {\n logger.debug(`Binding queue ${queue} to exchange ${exchange} directly`);\n\n }\n await this.channel!.bindQueue(queue, exchange, pattern);\n }\n\n async unbindQueue(queue: string, exchange: string, pattern: string) {\n const logger = this.mlog(this.unbindQueue);\n if (!this.isConnected) await this.connect();\n logger.debug(`Unbinding queue ${queue} from exchange ${exchange} with pattern ${pattern}`);\n await this.channel!.unbindQueue(queue, exchange, pattern);\n }\n\n async deleteQueue(queue: string, options: object = {}) {\n const logger = this.mlog(this.deleteQueue);\n if (!this.isConnected) await this.connect();\n logger.debug(`Deleting queue ${queue}`);\n await this.channel!.deleteQueue(queue, options as any);\n }\n\n private async createChannel(): Promise<void> {\n const logger = this.mlog(this.createChannel);\n this.channel = await this.connection!.createChannel();\n logger.info('Successfully created RabbitMQ channel');\n\n this.channel.on('error', (err) => {\n logger.error(`RabbitMQ channel error: ${err.message}`);\n this.channel = null;\n this.isConnected = false;\n this.emit('channel:lost');\n this.recreateChannel().catch(e =>\n logger.error(`Failed to recreate channel: ${e.message}`)\n );\n });\n\n this.isConnected = true;\n }\n\n private async recreateChannel(): Promise<void> {\n const logger = this.mlog(this.recreateChannel);\n if (this.recreatingChannel) return;\n this.recreatingChannel = true;\n try {\n if (!this.connection) {\n await this.connect();\n return;\n }\n logger.info('Recreating RabbitMQ channel on existing connection');\n await this.createChannel();\n this.reconnectAttempts = 0;\n } finally {\n this.recreatingChannel = false;\n }\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger} from '@holokai/holo-sdk';\n\nimport {PluginInstallerService} from './plugin.installer.service';\nimport {PluginService} from './plugin.service';\nimport {PluginRegistry} from './plugin.registry';\nimport {ProviderImplService} from './provider.impl.service';\nimport {ProviderPluginService} from './provider.plugin.service';\nimport {DatastorePluginService} from './datastore.plugin.service';\nimport {PluginDB} from '../../db';\nimport type {Plugin} from '@holokai/holo-types/entities';\nimport {QueueService} from '../queue.service';\nimport {env} from '../../env';\n\ninterface PluginEventPayload {\n action: string;\n pluginId: string;\n packageName: string;\n version: string;\n family: string;\n sha256: string;\n serverId: string;\n timestamp: number;\n}\n\nexport interface PluginUpdatedEvent {\n action: 'plugin.updated';\n pluginId: string;\n family: string;\n version: string;\n sha256: string;\n packageName: string;\n serverId: string;\n ts: number;\n}\n\nexport interface EntityChangedEvent {\n action: 'provider.changed' | 'datastore.changed';\n mutation: 'created' | 'updated' | 'deleted';\n entityId: string;\n pluginId: string;\n family: string;\n serverId: string;\n ts: number;\n}\n\ninterface LoadedPluginState {\n pluginId: string;\n family: string;\n version: string;\n sha256: string;\n packageName: string;\n packageDir: string;\n loadedAt: number;\n}\n\n@injectable()\nexport class PluginLifecycleService extends ClassLogger {\n private serverId: string = '';\n private readonly loadedState: Map<string, LoadedPluginState> = new Map();\n private reconcileTimer: NodeJS.Timeout | null = null;\n\n constructor(\n private installer: PluginInstallerService,\n private pluginDB: PluginDB,\n private pluginService: PluginService,\n private pluginRegistry: PluginRegistry,\n private providerImplService: ProviderImplService,\n private providerPluginService: ProviderPluginService,\n private datastorePluginService: DatastorePluginService,\n private queueService: QueueService,\n ) {\n super();\n }\n\n setServerId(serverId: string): void {\n this.serverId = serverId;\n }\n\n setPluginsDir(dir: string): void {\n this.installer.setPluginsDir(dir);\n }\n\n async install(packageName: string, version?: string, installedBy?: string): Promise<Plugin> {\n const log = this.mlog(this.install);\n log.info(`Installing ${packageName}${version ? '@' + version : ''}`);\n const meta = await this.installer.installFromRegistry(packageName, version, installedBy);\n await this.enable(meta.name, installedBy);\n return meta;\n }\n\n async installFromTarball(tarball: Buffer, installedBy?: string): Promise<Plugin> {\n const log = this.mlog(this.installFromTarball);\n log.info(`Installing plugin from tarball (${tarball.length} bytes)`);\n const meta = await this.installer.installFromTarball(tarball, installedBy);\n await this.enable(meta.name, installedBy);\n return meta;\n }\n\n async enable(packageName: string, _enabledBy?: string): Promise<void> {\n const log = this.mlog(this.enable);\n const pkg = await this.pluginDB.getByName(packageName);\n if (!pkg) throw new Error(`Package ${packageName} not found. Install it first.`);\n\n log.info(`Enabling ${packageName}@${pkg.version}...`);\n\n const plugin = await this.pluginRegistry.getOrLoad(pkg.id);\n await this.pluginService.registerPlugin(this.serverId, plugin, true, packageName);\n\n await this.broadcast('plugin.enabled', {\n pluginId: pkg.id, packageName, version: pkg.version, family: pkg.family, sha256: pkg.sha256 ?? ''\n });\n }\n\n async disable(packageName: string): Promise<void> {\n const log = this.mlog(this.disable);\n const pkg = await this.pluginDB.getByName(packageName);\n if (!pkg || !pkg.active) {\n log.info(`${packageName} not enabled`);\n return;\n }\n\n await this.providerImplService.removeImplsByPluginId(pkg.id);\n this.providerPluginService.removeProtocols(pkg.id);\n await this.pluginService.removePlugin(pkg.id);\n\n await this.broadcast('plugin.disabled', {\n pluginId: pkg.id, packageName, version: pkg.version, family: pkg.family, sha256: pkg.sha256 ?? ''\n });\n\n log.info(`Disabled ${packageName}`);\n }\n\n async uninstall(packageName: string, opts: { force?: boolean } = {}): Promise<void> {\n const log = this.mlog(this.uninstall);\n const pkg = await this.pluginDB.getByName(packageName);\n if (!pkg) return;\n\n if (!opts.force) {\n if (pkg.active) {\n throw new Error(`Cannot uninstall ${packageName} while enabled. Disable it first.`);\n }\n if (pkg.source === 'builtin') {\n throw new Error(`Cannot uninstall builtin plugin ${packageName}`);\n }\n }\n\n if (pkg.active) {\n await this.unloadPlugin(pkg.id).catch(e =>\n log.warn(`Error unloading ${pkg.name} during uninstall: ${(e as Error).message}`)\n );\n }\n\n await this.pluginDB.hardDelete(pkg.id);\n log.info(`Uninstalled ${packageName} (hard delete)`);\n }\n\n async reload(packageName: string, enabledBy: string): Promise<void> {\n const log = this.mlog(this.reload);\n log.info(`Reloading ${packageName}`);\n await this.disable(packageName);\n await this.enable(packageName, enabledBy);\n }\n\n async handleRemoteEnable(payload: PluginEventPayload): Promise<void> {\n if (payload.serverId === this.serverId) return;\n const log = this.mlog(this.handleRemoteEnable);\n\n // Ensure plugin is on disk (for this server's plugins dir)\n await this.installer.ensurePluginById(\n payload.pluginId, payload.packageName, payload.version, payload.sha256\n );\n\n // Load into registry and register with plugin service\n if (!this.pluginRegistry.has(payload.pluginId)) {\n log.info(`Remote enable: loading ${payload.packageName}@${payload.version} from ${payload.serverId}`);\n const plugin = await this.pluginRegistry.getOrLoad(payload.pluginId);\n await this.pluginService.loadPluginLocally(\n this.serverId, plugin, payload.pluginId, payload.family\n );\n } else {\n log.debug(`${payload.family} already loaded, extracted to local dir`);\n }\n }\n\n async handleRemoteDisable(payload: PluginEventPayload): Promise<void> {\n if (payload.serverId === this.serverId) return;\n const log = this.mlog(this.handleRemoteDisable);\n log.info(`Remote disable: ${payload.pluginId} from ${payload.serverId}`);\n await this.unloadPlugin(payload.pluginId);\n }\n\n async syncEnabledPlugins(serverName?: string): Promise<void> {\n const log = this.mlog(this.syncEnabledPlugins);\n if (serverName) this.serverId = serverName;\n await this.installer.ensurePluginsDir();\n\n const enabled = await this.pluginDB.listActive();\n if (enabled.length === 0) {\n log.warn('No enabled plugins found. Will load when notified or on reconciliation.');\n return;\n }\n log.info(`Syncing ${enabled.length} enabled plugin(s)`);\n\n for (const pluginRow of enabled) {\n if (this.pluginRegistry.has(pluginRow.id)) {\n await this.pluginService.registerServerAssociation(this.serverId, pluginRow.id);\n log.debug(`${pluginRow.name} already loaded, registered server association`);\n continue;\n }\n\n try {\n const plugin = await this.pluginRegistry.getOrLoad(pluginRow.id);\n await this.pluginService.loadPluginLocally(\n this.serverId, plugin, pluginRow.id, pluginRow.family\n );\n } catch (e) {\n log.error(`Failed to sync ${pluginRow.name}: ${(e as Error).message}`);\n }\n }\n }\n\n async handleRemoteUpdate(event: PluginUpdatedEvent): Promise<void> {\n if (event.serverId === this.serverId) return;\n const log = this.mlog(this.handleRemoteUpdate);\n\n const current = this.loadedState.get(event.family.toUpperCase());\n if (current?.sha256 === event.sha256) {\n log.debug(`${event.family} already at hash ${event.sha256.slice(0, 12)}, skipping`);\n return;\n }\n\n log.info(`Remote update: ${event.packageName}@${event.version} sha256=${event.sha256.slice(0, 12)}`);\n\n this.pluginRegistry.remove(event.pluginId);\n await this.installer.ensurePluginById(\n event.pluginId, event.packageName, event.version, event.sha256\n );\n }\n\n async handleEntityChanged(event: EntityChangedEvent): Promise<void> {\n const log = this.mlog(this.handleEntityChanged);\n log.info(`${event.action} ${event.mutation}: ${event.entityId} (plugin: ${event.pluginId})`);\n\n if (event.action === 'provider.changed') {\n switch (event.mutation) {\n case 'created':\n case 'updated':\n await this.providerImplService.refreshProvider(event.entityId);\n break;\n case 'deleted':\n await this.providerImplService.removeImpl(event.entityId);\n break;\n }\n } else if (event.action === 'datastore.changed') {\n switch (event.mutation) {\n case 'created':\n case 'updated':\n await this.datastorePluginService.refreshDatastore(event.entityId);\n break;\n case 'deleted':\n await this.datastorePluginService.removeImpl(event.entityId);\n break;\n }\n }\n }\n\n async reconcilePlugins(): Promise<void> {\n const log = this.mlog(this.reconcilePlugins);\n const enabled = await this.pluginDB.listActive();\n const enabledFamilies = new Set<string>();\n\n for (const pluginRow of enabled) {\n const family = pluginRow.family.toUpperCase();\n enabledFamilies.add(family);\n\n const current = this.loadedState.get(family);\n if (current?.sha256 === pluginRow.sha256) continue;\n\n try {\n if (current) {\n log.info(`Reconcile: ${family} hash mismatch, reloading`);\n this.pluginRegistry.remove(pluginRow.id);\n } else {\n log.info(`Reconcile: ${family} not loaded, loading`);\n }\n const plugin = await this.pluginRegistry.getOrLoad(pluginRow.id);\n await this.pluginService.loadPluginLocally(\n this.serverId, plugin, pluginRow.id, pluginRow.family\n );\n this.loadedState.set(family, {\n pluginId: pluginRow.id, family, version: pluginRow.version,\n sha256: pluginRow.sha256 ?? '', packageName: pluginRow.name,\n packageDir: '', loadedAt: Date.now()\n });\n } catch (e) {\n log.error(`Reconcile failed for ${pluginRow.name}: ${(e as Error).message}`);\n }\n }\n\n for (const [family] of this.loadedState) {\n if (!enabledFamilies.has(family)) {\n log.info(`Reconcile: ${family} no longer enabled, unloading from memory`);\n this.loadedState.delete(family);\n }\n }\n }\n\n startPeriodicReconciliation(intervalMs: number): void {\n if (intervalMs <= 0 || this.reconcileTimer) return;\n const log = this.mlog(this.startPeriodicReconciliation);\n log.info(`Starting periodic plugin reconciliation every ${intervalMs}ms`);\n this.reconcileTimer = setInterval(() => {\n this.reconcilePlugins().catch(e =>\n log.error(`Periodic reconciliation failed: ${(e as Error).message}`)\n );\n }, intervalMs);\n }\n\n stopPeriodicReconciliation(): void {\n if (this.reconcileTimer) {\n clearInterval(this.reconcileTimer);\n this.reconcileTimer = null;\n }\n }\n\n\n private async unloadPlugin(pluginId: string): Promise<void> {\n await this.providerImplService.removeImplsByPluginId(pluginId);\n this.providerPluginService.removeProtocols(pluginId);\n await this.pluginService.removePlugin(pluginId);\n }\n\n private async broadcast(action: string, data: Omit<PluginEventPayload, 'action' | 'serverId' | 'timestamp'>): Promise<void> {\n try {\n await this.queueService.sendToExchange(env.queue.adminExchange, action, {\n action,\n ...data,\n serverId: this.serverId,\n timestamp: Date.now()\n });\n } catch (e) {\n this.log.warn(`Failed to broadcast ${action}: ${(e as Error).message}`);\n }\n }\n}\n","import 'reflect-metadata';\nimport {container, injectable} from 'tsyringe';\nimport {createHash} from 'crypto';\nimport {type FSWatcher, promises as fs, watch} from 'fs';\nimport path from 'path';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport {PluginInstallerService} from './plugin.installer.service';\nimport {PluginDiscoveryService} from './discovery.service';\nimport {PluginDB} from '../../db';\nimport {LoggerFactoryToken} from '../../utils/logger';\nimport {env} from '../../env';\n\nconst RELOAD_TIMEOUT_MS = 60_000;\n\n@injectable()\nexport class PluginWatcherService extends ClassLogger {\n private watcher: FSWatcher | null = null;\n private knownHashes: Map<string, string> = new Map();\n private reloadInFlight: Set<string> = new Set();\n private reloadTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n private debounceMs = 2000;\n private pluginsDir: string;\n\n constructor(\n private installer: PluginInstallerService,\n private discovery: PluginDiscoveryService,\n private pluginDB: PluginDB,\n ) {\n super();\n this.pluginsDir = path.resolve(env.api.pluginsDir);\n }\n\n static create(\n installer: PluginInstallerService, discovery: PluginDiscoveryService,\n pluginDB: PluginDB, pluginsDir: string,\n ): PluginWatcherService {\n const instance = new PluginWatcherService(installer, discovery, pluginDB);\n instance.pluginsDir = path.resolve(pluginsDir);\n return instance;\n }\n\n async startWatching(): Promise<void> {\n const log = this.mlog(this.startWatching);\n\n try {\n await fs.access(this.pluginsDir);\n } catch {\n log.warn(`Plugins directory ${this.pluginsDir} does not exist, skipping watch`);\n return;\n }\n\n const pluginDirs = await this.scanPluginDirs();\n for (const dir of pluginDirs) {\n try {\n const hash = await this.hashDistContents(dir.path);\n this.knownHashes.set(dir.key, hash);\n } catch {\n }\n }\n\n this.watcher = watch(this.pluginsDir, {recursive: true}, (_event, filename) => {\n if (!filename) return;\n this.onFileChange(filename);\n });\n\n log.info(`Plugin watcher started (fs.watch on ${this.pluginsDir}, tracking ${pluginDirs.length} plugin(s))`);\n }\n\n stopWatching(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n for (const timer of this.debounceTimers.values()) clearTimeout(timer);\n this.debounceTimers.clear();\n for (const timeout of this.reloadTimeouts.values()) clearTimeout(timeout);\n this.reloadTimeouts.clear();\n }\n\n private onFileChange(filename: string): void {\n if (filename.includes('node_modules') || filename.startsWith('.')) return;\n const fullPath = path.join(this.pluginsDir, filename);\n this.findPluginDir(fullPath).then(pluginDir => {\n if (pluginDir) {\n const key = path.relative(this.pluginsDir, pluginDir);\n if (this.reloadInFlight.has(key)) return;\n this.debounce(key, () => this.handleChange(pluginDir, key));\n return;\n }\n\n for (const [key] of this.knownHashes) {\n const knownDir = path.join(this.pluginsDir, key);\n if (fullPath.startsWith(knownDir)) {\n this.debounce(key, () => this.handleRemoval(knownDir, key));\n break;\n }\n }\n }).catch(e => this.log.debug(`onFileChange error: ${(e as Error).message}`));\n }\n\n private debounce(key: string, fn: () => Promise<void>): void {\n const existing = this.debounceTimers.get(key);\n if (existing) clearTimeout(existing);\n\n this.debounceTimers.set(key, setTimeout(() => {\n this.debounceTimers.delete(key);\n fn().catch(e => this.log.error(`Plugin watcher error for ${key}: ${(e as Error).message}`));\n }, this.debounceMs));\n }\n\n private async handleChange(pluginDir: string, key: string): Promise<void> {\n const log = this.mlog(this.handleChange);\n this.reloadInFlight.add(key);\n\n const timeout = setTimeout(() => {\n log.warn(`Reload timeout for ${key}, clearing in-flight flag`);\n this.reloadInFlight.delete(key);\n this.reloadTimeouts.delete(key);\n }, RELOAD_TIMEOUT_MS);\n this.reloadTimeouts.set(key, timeout);\n\n try {\n const discovered = await this.discovery.discoverSingle(pluginDir);\n if (!discovered) return;\n\n const newHash = await this.hashDistContents(pluginDir);\n const previousHash = this.knownHashes.get(key);\n if (previousHash === newHash) return;\n\n const isNewVersion = !previousHash;\n const meta = await this.installer.registerFromDir(pluginDir, 'filesystem');\n this.knownHashes.set(key, newHash);\n\n if (!container.isRegistered(LoggerFactoryToken)) {\n log.warn(`LoggerFactory not registered, skipping reload for ${meta.family}`);\n return;\n }\n\n const {PluginLifecycleService} = await import('./plugin.lifecycle.service');\n const lifecycle = container.resolve(PluginLifecycleService);\n\n if (isNewVersion) {\n log.info(`New plugin detected: ${discovered.packageName}@${discovered.version}, enabling...`);\n await lifecycle.enable(discovered.packageName, 'watcher');\n } else {\n log.info(`Plugin ${discovered.packageName}@${discovered.version} changed, reloading...`);\n await lifecycle.reload(discovered.packageName, 'watcher');\n }\n } finally {\n this.reloadInFlight.delete(key);\n const t = this.reloadTimeouts.get(key);\n if (t) {\n clearTimeout(t);\n this.reloadTimeouts.delete(key);\n }\n }\n }\n\n private async handleRemoval(pluginDir: string, key: string): Promise<void> {\n const log = this.mlog(this.handleRemoval);\n try {\n await fs.access(pluginDir);\n return;\n } catch {\n }\n\n log.info(`Plugin removed: ${key}`);\n this.knownHashes.delete(key);\n\n const parts = key.split('/');\n const version = parts.pop()!;\n const packageName = parts.join('/');\n\n const pluginRow = await this.pluginDB.getByNameAndVersion(packageName, version);\n if (pluginRow) {\n await this.pluginDB.deactivate(pluginRow.id);\n log.info(`Deactivated plugin ${packageName}@${version}`);\n }\n }\n\n private async findPluginDir(changedPath: string): Promise<string | null> {\n let dir = changedPath;\n\n for (let i = 0; i < 10; i++) {\n try {\n const stat = await fs.stat(dir);\n if (!stat.isDirectory()) {\n dir = path.dirname(dir);\n continue;\n }\n } catch {\n dir = path.dirname(dir);\n continue;\n }\n\n if (dir === this.pluginsDir || !dir.startsWith(this.pluginsDir)) return null;\n\n try {\n await fs.access(path.join(dir, 'package.json'));\n return dir;\n } catch {\n }\n dir = path.dirname(dir);\n }\n return null;\n }\n\n private async scanPluginDirs(): Promise<Array<{ path: string; key: string }>> {\n const results: Array<{ path: string; key: string }> = [];\n\n const scanVersions = async (pkgDir: string) => {\n const subEntries = await fs.readdir(pkgDir, {withFileTypes: true}).catch(() => []);\n for (const sub of subEntries) {\n if (!sub.isDirectory() && !sub.isSymbolicLink()) continue;\n const versionDir = path.join(pkgDir, sub.name);\n const discovered = await this.discovery.discoverSingle(versionDir);\n if (discovered) {\n results.push({path: versionDir, key: path.relative(this.pluginsDir, versionDir)});\n }\n }\n };\n\n let topEntries;\n try {\n topEntries = await fs.readdir(this.pluginsDir, {withFileTypes: true});\n } catch {\n return results;\n }\n\n for (const entry of topEntries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) continue;\n const entryPath = path.join(this.pluginsDir, entry.name);\n\n if (entry.name.startsWith('@')) {\n const scopeEntries = await fs.readdir(entryPath, {withFileTypes: true}).catch(() => []);\n for (const scopeEntry of scopeEntries) {\n if (!scopeEntry.isDirectory() && !scopeEntry.isSymbolicLink()) continue;\n await scanVersions(path.join(entryPath, scopeEntry.name));\n }\n } else {\n await scanVersions(entryPath);\n }\n }\n\n return results;\n }\n\n private async hashDistContents(pluginDir: string): Promise<string> {\n const distDir = path.join(pluginDir, 'dist');\n const hash = createHash('sha256');\n const files = await this.walkDir(distDir);\n files.sort();\n for (const file of files) {\n const content = await fs.readFile(file);\n hash.update(file.slice(distDir.length));\n hash.update(content);\n }\n return hash.digest('hex');\n }\n\n private async walkDir(dir: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdir(dir, {withFileTypes: true});\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...await this.walkDir(full));\n } else {\n results.push(full);\n }\n }\n return results;\n }\n}\n","export {PluginDiscoveryService} from './discovery.service'\nexport {PluginInstallerService} from './plugin.installer.service';\nexport {PluginLoaderService} from './loader.service';\nexport {PluginLifecycleService} from './plugin.lifecycle.service';\nexport {PluginService} from './plugin.service';\nexport {PluginWatcherService} from './plugin.watcher.service';\nexport {PluginRegistry} from './plugin.registry';\nexport {ProviderImplService} from './provider.impl.service';\nexport {ProviderPluginService} from './provider.plugin.service';\nexport {DatastorePluginService} from './datastore.plugin.service';","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger, pickDefined} from '@holokai/holo-sdk';\nimport {normalizeModelName} from '@holokai/holo-sdk/matching';\nimport {AppDB, ModelDB, ModelDictionaryDB, PluginDB, PricingDB, ProviderDB, ProviderResponseCostDB} from '../db';\nimport type {PricingSheetModel, ProviderResponse, ProviderResponseCost} from '@holokai/holo-types/entities';\nimport {CostType} from '@holokai/holo-types/entities';\nimport type {IProviderPlugin} from '@holokai/holo-types/plugin';\nimport {PluginService} from './plugin/plugin.service';\nimport {RedisService} from './redis.service';\n\nconst PRICING_CACHE_TTL = 600;\n\n@injectable()\nexport class PricingService extends ClassLogger {\n constructor(\n private readonly pricingDB: PricingDB,\n private readonly costDB: ProviderResponseCostDB,\n private readonly providerDB: ProviderDB,\n private readonly pluginDB: PluginDB,\n private readonly pluginService: PluginService,\n private readonly db: AppDB,\n private readonly dictionaryDB: ModelDictionaryDB,\n private readonly modelDB: ModelDB,\n private readonly redis: RedisService,\n ) {\n super();\n }\n\n async calculateAndInsertCosts(responseId: string, response: ProviderResponse): Promise<number> {\n const logger = this.mlog(this.calculateAndInsertCosts);\n\n const provider = await this.providerDB.getById(response.provider_id);\n if (!provider) {\n logger.warn(`Provider ${response.provider_id} not found, skipping cost calculation`);\n return 0;\n }\n\n let plan = provider.pricing_plan_id\n ? await this.cachedPlan(provider.pricing_plan_id)\n : null;\n\n if (!plan && provider.plugin_id) {\n const plugin = await this.pluginDB.getById(provider.plugin_id);\n if (plugin?.default_pricing_plan_id) {\n plan = await this.cachedPlan(plugin.default_pricing_plan_id);\n }\n }\n\n if (!plan) {\n logger.debug(`No pricing plan found for provider ${provider.name} (family=${provider.type})`);\n return 0;\n }\n\n const responseTime = new Date(response.created_at);\n const sheet = await this.cachedSheet(plan.id, responseTime);\n if (!sheet) {\n logger.debug(`No effective pricing sheet for plan ${plan.name} at ${response.created_at}`);\n return 0;\n }\n\n const modelPricing = await this.resolveModelPricing(sheet.id, response.access_model, response.provider_id);\n if (!modelPricing) {\n logger.debug(`No pricing for model ${response.access_model} in sheet ${sheet.name}`);\n return 0;\n }\n\n const tokenBreakdown = response.metadata?.token_breakdown;\n\n if (tokenBreakdown) {\n const pluginImpl = await this.pluginService.getImplByFamily(provider.type) as IProviderPlugin | null;\n if (pluginImpl) {\n const costResult = pluginImpl.calculateCost(tokenBreakdown, modelPricing);\n\n const costRecord: Omit<ProviderResponseCost, 'id' | 'created_at'> = {\n response_id: responseId,\n cost_type: CostType.PROVIDER,\n pricing_sheet_id: sheet.id,\n input_tokens: tokenBreakdown.input ?? 0,\n output_tokens: tokenBreakdown.output ?? 0,\n cache_read_tokens: tokenBreakdown.cache_read ?? 0,\n cache_write_tokens: tokenBreakdown.cache_write ?? 0,\n input_cost: costResult.input_cost,\n output_cost: costResult.output_cost,\n cache_read_cost: costResult.detail.cache_read?.cost ?? 0,\n cache_write_cost: costResult.detail.cache_write?.cost ?? 0,\n total_cost: costResult.total_cost,\n currency: plan.currency,\n metadata: costResult.detail,\n };\n\n await this.costDB.insert(costRecord);\n await this.updateResponseCost(responseId, costResult.total_cost);\n\n logger.debug(`Calculated cost for response ${responseId}: $${costResult.total_cost.toFixed(8)} (${response.access_model})`);\n return costResult.total_cost;\n }\n }\n\n const tokens = this.extractTokens(response);\n const cost = this.computeCost(modelPricing, tokens);\n\n const costRecord: Omit<ProviderResponseCost, 'id' | 'created_at'> = {\n response_id: responseId,\n cost_type: CostType.PROVIDER,\n pricing_sheet_id: sheet.id,\n input_tokens: tokens.input,\n output_tokens: tokens.output,\n cache_read_tokens: tokens.cacheRead,\n cache_write_tokens: tokens.cacheWrite,\n input_cost: cost.inputCost,\n output_cost: cost.outputCost,\n cache_read_cost: cost.cacheReadCost,\n cache_write_cost: cost.cacheWriteCost,\n total_cost: cost.totalCost,\n currency: plan.currency,\n };\n\n await this.costDB.insert(costRecord);\n\n await this.updateResponseCost(responseId, cost.totalCost);\n\n logger.debug(`Calculated cost for response ${responseId}: $${cost.totalCost.toFixed(8)} (${response.access_model})`);\n return cost.totalCost;\n }\n\n async calculateCosts(response: ProviderResponse): Promise<Record<string, any> | null> {\n const provider = await this.providerDB.getById(response.provider_id);\n if (!provider) return null;\n\n let plan = provider.pricing_plan_id\n ? await this.pricingDB.findPlanById(provider.pricing_plan_id)\n : null;\n\n if (!plan && provider.plugin_id) {\n const plugin = await this.pluginDB.getById(provider.plugin_id);\n if (plugin?.default_pricing_plan_id) {\n plan = await this.pricingDB.findPlanById(plugin.default_pricing_plan_id);\n }\n }\n\n if (!plan) return null;\n\n const responseTime = new Date(response.created_at);\n const sheet = await this.pricingDB.findEffectiveSheet(plan.id, responseTime);\n if (!sheet) return null;\n\n const modelPricing = await this.resolveModelPricing(sheet.id, response.access_model, response.provider_id);\n if (!modelPricing) return null;\n\n const tokenBreakdown = response.metadata?.token_breakdown;\n\n if (tokenBreakdown) {\n const pluginImpl = await this.pluginService.getImplByFamily(provider.type) as IProviderPlugin | null;\n if (pluginImpl) {\n const costResult = pluginImpl.calculateCost(tokenBreakdown, modelPricing);\n return {\n cost_type: CostType.PROVIDER,\n pricing_sheet_id: sheet.id,\n input_tokens: tokenBreakdown.input ?? 0,\n output_tokens: tokenBreakdown.output ?? 0,\n cache_read_tokens: tokenBreakdown.cache_read ?? 0,\n cache_write_tokens: tokenBreakdown.cache_write ?? 0,\n input_cost: costResult.input_cost,\n output_cost: costResult.output_cost,\n cache_read_cost: costResult.detail.cache_read?.cost ?? 0,\n cache_write_cost: costResult.detail.cache_write?.cost ?? 0,\n total_cost: costResult.total_cost,\n currency: plan.currency,\n metadata: costResult.detail,\n };\n }\n }\n\n const tokens = this.extractTokens(response);\n const cost = this.computeCost(modelPricing, tokens);\n return {\n cost_type: CostType.PROVIDER,\n pricing_sheet_id: sheet.id,\n input_tokens: tokens.input,\n output_tokens: tokens.output,\n cache_read_tokens: tokens.cacheRead,\n cache_write_tokens: tokens.cacheWrite,\n input_cost: cost.inputCost,\n output_cost: cost.outputCost,\n cache_read_cost: cost.cacheReadCost,\n cache_write_cost: cost.cacheWriteCost,\n total_cost: cost.totalCost,\n currency: plan.currency,\n };\n }\n\n async recalculateCosts(responseId: string): Promise<number> {\n const result = await this.bulkRecalculate(\n `pr.id = $1`, [responseId]\n );\n return result.totalCost;\n }\n\n async recalculateCostsForDateRange(from: Date, to: Date, providerId?: string): Promise<{\n rowCount: number;\n totalCost: number\n }> {\n const logger = this.mlog(this.recalculateCostsForDateRange);\n\n const conditions = [`pr.created_at >= $1`, `pr.created_at < $2`];\n const params: any[] = [from.toISOString(), to.toISOString()];\n\n if (providerId) {\n conditions.push(`pr.provider_id = $${params.length + 1}`);\n params.push(providerId);\n }\n\n logger.info(`Recalculating costs: ${from.toISOString()} to ${to.toISOString()}${providerId ? ` provider=${providerId}` : ''}`);\n\n const result = await this.bulkRecalculate(conditions.join(' AND '), params);\n\n logger.info(`Recalculated ${result.rowCount} responses, total cost: $${result.totalCost.toFixed(6)}`);\n return result;\n }\n\n private async cachedPlan<T = any>(planId: string): Promise<T | null> {\n const key = `pricing:plan:${planId}`;\n const cached = await this.redis.get<T>(key);\n if (cached) return cached;\n const plan = await this.pricingDB.findPlanById(planId) as T | null;\n if (plan) await this.redis.set(key, plan, PRICING_CACHE_TTL);\n return plan;\n }\n\n private async cachedSheet<T = any>(planId: string, date: Date): Promise<T | null> {\n const dateStr = date.toISOString().slice(0, 10);\n const key = `pricing:sheet:${planId}:${dateStr}`;\n const cached = await this.redis.get<T>(key);\n if (cached) return cached;\n const sheet = await this.pricingDB.findEffectiveSheet(planId, date) as T | null;\n if (sheet) await this.redis.set(key, sheet, PRICING_CACHE_TTL);\n return sheet;\n }\n\n private async bulkRecalculate(whereClause: string, params: any[]): Promise<{\n rowCount: number;\n totalCost: number\n }> {\n const logger = this.mlog(this.bulkRecalculate);\n\n return this.db.asSystem(async (client) => {\n // Delete existing cost records for the matching responses\n await client.query(\n `DELETE\n FROM provider_response_costs\n WHERE response_id IN (SELECT pr.id FROM provider_responses pr WHERE ${whereClause})`,\n params\n );\n\n // Single query: join responses → providers → plugins → pricing plans → sheets → model costs\n // Reads token_breakdown JSONB first, falls back to usage_raw for legacy records\n const insertQuery = `\n WITH matched AS (SELECT pr.id AS response_id,\n ps.id AS pricing_sheet_id,\n pp.currency,\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'input')::int, pr.input_tokens,\n 0) AS input_tokens,\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'output')::int, pr.output_tokens,\n 0) AS output_tokens,\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'cache_read')::int,\n (pr.metadata -> 'usage_raw' ->> 'cache_read_input_tokens')::int,\n (pr.metadata -> 'usage_raw' ->> 'cached_tokens')::int,\n 0) AS cache_read_tokens,\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'cache_write')::int,\n (pr.metadata -> 'usage_raw' ->> 'cache_creation_input_tokens')::int,\n 0) AS cache_write_tokens,\n CASE\n WHEN psm.context_threshold IS NOT NULL\n AND psm.extended_input_cost IS NOT NULL\n AND (COALESCE((pr.metadata -> 'token_breakdown' ->> 'input')::int,\n pr.input_tokens, 0)\n + COALESCE((pr.metadata -> 'token_breakdown' ->> 'cache_read')::int,\n (pr.metadata -> 'usage_raw' ->> 'cache_read_input_tokens')::int,\n (pr.metadata -> 'usage_raw' ->> 'cached_tokens')::int, 0)\n +\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'cache_write')::int,\n (pr.metadata -> 'usage_raw' ->> 'cache_creation_input_tokens')::int,\n 0))\n > psm.context_threshold\n THEN psm.extended_input_cost\n ELSE psm.input_cost\n END AS effective_input_cost,\n CASE\n WHEN psm.context_threshold IS NOT NULL\n AND psm.extended_output_cost IS NOT NULL\n AND (COALESCE((pr.metadata -> 'token_breakdown' ->> 'input')::int,\n pr.input_tokens, 0)\n + COALESCE((pr.metadata -> 'token_breakdown' ->> 'cache_read')::int,\n (pr.metadata -> 'usage_raw' ->> 'cache_read_input_tokens')::int,\n (pr.metadata -> 'usage_raw' ->> 'cached_tokens')::int, 0)\n +\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'cache_write')::int,\n (pr.metadata -> 'usage_raw' ->> 'cache_creation_input_tokens')::int,\n 0))\n > psm.context_threshold\n THEN psm.extended_output_cost\n ELSE psm.output_cost\n END AS effective_output_cost,\n psm.cache_read_cost AS cache_read_cost_per_token,\n psm.cache_write_cost AS cache_write_cost_per_token,\n COALESCE((pr.metadata -> 'token_breakdown' ->> 'thinking')::int, 0) AS thinking_tokens,\n COALESCE((psm.token_costs ->> 'thinking')::numeric, 0) AS thinking_cost_per_token\n FROM provider_responses pr\n JOIN providers prov ON pr.provider_id = prov.id\n JOIN plugins pl ON prov.plugin_id = pl.id\n LEFT JOIN pricing_plans pp\n ON pp.id = COALESCE(prov.pricing_plan_id, pl.default_pricing_plan_id)\n LEFT JOIN pricing_sheets ps ON ps.plan_id = pp.id\n AND ps.effective_from <= pr.created_at\n AND (ps.effective_to IS NULL OR ps.effective_to > pr.created_at)\n LEFT JOIN models m ON m.access_model = pr.access_model\n AND m.provider_id = prov.id AND m.active = true\n LEFT JOIN model_dictionary md ON md.aliases @> to_jsonb(pr.access_model)\n LEFT JOIN pricing_sheet_models psm ON psm.sheet_id = ps.id\n AND psm.id = COALESCE(\n (SELECT p1.id\n FROM pricing_sheet_models p1\n WHERE p1.sheet_id = ps.id\n AND p1.model_id = m.id\n LIMIT 1),\n (SELECT p2.id\n FROM pricing_sheet_models p2\n WHERE p2.sheet_id = ps.id\n AND p2.dictionary_id = m.dictionary_id\n AND m.dictionary_id IS NOT NULL\n LIMIT 1),\n (SELECT p3.id\n FROM pricing_sheet_models p3\n WHERE p3.sheet_id = ps.id\n AND p3.normalized_model_name = m.normalized_name\n AND m.normalized_name IS NOT NULL\n LIMIT 1),\n (SELECT p4.id\n FROM pricing_sheet_models p4\n WHERE p4.sheet_id = ps.id\n AND p4.model_name = pr.access_model\n LIMIT 1),\n (SELECT p5.id\n FROM pricing_sheet_models p5\n WHERE p5.sheet_id = ps.id\n AND p5.model_name = md.family\n AND md.family IS NOT NULL\n LIMIT 1)\n )\n WHERE ${whereClause}\n AND pp.id IS NOT NULL\n AND ps.id IS NOT NULL\n AND psm.id IS NOT NULL),\n inserted AS (\n INSERT INTO provider_response_costs\n (response_id, cost_type, pricing_sheet_id,\n input_tokens, output_tokens, cache_read_tokens, cache_write_tokens,\n input_cost, output_cost, cache_read_cost, cache_write_cost,\n total_cost, currency)\n SELECT response_id,\n 'provider',\n pricing_sheet_id,\n input_tokens,\n output_tokens,\n cache_read_tokens,\n cache_write_tokens,\n input_tokens * effective_input_cost,\n output_tokens * effective_output_cost,\n cache_read_tokens * cache_read_cost_per_token,\n cache_write_tokens * cache_write_cost_per_token,\n (input_tokens * effective_input_cost)\n + (output_tokens * effective_output_cost)\n + (cache_read_tokens * cache_read_cost_per_token)\n + (cache_write_tokens * cache_write_cost_per_token)\n + (thinking_tokens * thinking_cost_per_token),\n currency\n FROM matched\n RETURNING response_id, total_cost)\n SELECT COUNT(*)::int AS row_count, COALESCE(SUM(total_cost), 0)::float AS total_cost\n FROM inserted\n `;\n\n const insertResult = await client.query(insertQuery, params);\n const result = insertResult.rows[0] ?? {row_count: 0, total_cost: 0};\n\n // Update denormalized cost on provider_responses\n await client.query(\n `UPDATE provider_responses pr\n SET cost = prc.total_cost\n FROM provider_response_costs prc\n WHERE prc.response_id = pr.id\n AND prc.cost_type = 'provider'\n AND pr.id IN (SELECT pr2.id FROM provider_responses pr2 WHERE ${whereClause})`,\n params\n );\n\n logger.info(`Bulk recalculated ${result.row_count} cost records`);\n return {rowCount: result.row_count, totalCost: result.total_cost};\n });\n }\n\n private async resolveModelPricing(sheetId: string, accessModel: string, providerId: string): Promise<PricingSheetModel | null> {\n const model = await this.modelDB.getByAccessModel(accessModel, providerId);\n const normalized = normalizeModelName(accessModel).normalized;\n\n const result = await this.pricingDB.resolveModelPricing(sheetId, accessModel, {\n ...pickDefined({modelId: model?.id, dictionaryId: model?.dictionary_id}),\n normalizedName: normalized,\n } as Parameters<PricingDB['resolveModelPricing']>[2]);\n if (result) return result;\n\n // Legacy fallback: dictionary family as model_name\n const dictEntry = await this.dictionaryDB.findByAlias(accessModel);\n if (dictEntry?.family) {\n return this.pricingDB.findModelPricing(sheetId, dictEntry.family);\n }\n\n return null;\n }\n\n private extractTokens(response: ProviderResponse): LegacyTokenBreakdown {\n const usageRaw = response.metadata?.usage_raw;\n\n return {\n input: response.input_tokens ?? 0,\n output: response.output_tokens ?? 0,\n cacheRead: usageRaw?.cache_read_input_tokens ?? usageRaw?.cached_tokens ?? 0,\n cacheWrite: usageRaw?.cache_creation_input_tokens ?? 0,\n };\n }\n\n private computeCost(pricing: PricingSheetModel, tokens: LegacyTokenBreakdown): LegacyCostBreakdown {\n let inputCostPerToken = Number(pricing.input_cost);\n let outputCostPerToken = Number(pricing.output_cost);\n\n if (pricing.context_threshold && pricing.extended_input_cost && pricing.extended_output_cost) {\n const totalInput = tokens.input + tokens.cacheRead + tokens.cacheWrite;\n if (totalInput > pricing.context_threshold) {\n inputCostPerToken = Number(pricing.extended_input_cost);\n outputCostPerToken = Number(pricing.extended_output_cost);\n }\n }\n\n const inputCost = tokens.input * inputCostPerToken;\n const outputCost = tokens.output * outputCostPerToken;\n const cacheReadCost = tokens.cacheRead * Number(pricing.cache_read_cost);\n const cacheWriteCost = tokens.cacheWrite * Number(pricing.cache_write_cost);\n\n return {\n inputCost,\n outputCost,\n cacheReadCost,\n cacheWriteCost,\n totalCost: inputCost + outputCost + cacheReadCost + cacheWriteCost,\n };\n }\n\n private async updateResponseCost(responseId: string, cost: number): Promise<void> {\n await this.db.query(\n `UPDATE provider_responses\n SET cost = $1\n WHERE id = $2`,\n [cost, responseId]\n );\n }\n}\n\ninterface LegacyTokenBreakdown {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n}\n\ninterface LegacyCostBreakdown {\n inputCost: number;\n outputCost: number;\n cacheReadCost: number;\n cacheWriteCost: number;\n totalCost: number;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport type {AuditFieldMapping, IDatastoreInstance} from '@holokai/holo-types/plugin';\nimport type {Datastore} from '@holokai/holo-types/entities';\n\nimport {DatastorePluginService} from './plugin/datastore.plugin.service';\n\n\nconst IDENTIFIER_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nconst CANONICAL_REQUEST_KEYS = new Set([\n 'request_id', 'organization_id', 'application_id', 'provider_id', 'protocol_id',\n 'protocol_capability', 'user_id', 'client_identifier', 'access_model', 'has_tools',\n 'thread_id', 'created_at', 'system_prompt', 'last_user_prompt', 'request_raw', 'metadata',\n]);\n\nconst CANONICAL_RESPONSE_KEYS = new Set([\n 'organization_id', 'request_id', 'application_id', 'provider_id', 'protocol_id',\n 'user_id', 'client_identifier', 'access_model',\n 'status', 'response', 'response_raw', 'usage_raw', 'input_tokens', 'output_tokens',\n 'total_tokens', 'time_to_first_token', 'total_processing_time', 'finish_reason',\n 'cost', 'score', 'created_at', 'metadata',\n]);\n\nconst CANONICAL_COST_KEYS = new Set([\n 'response_id', 'cost_type', 'pricing_sheet_id', 'input_tokens', 'output_tokens',\n 'cache_read_tokens', 'cache_write_tokens', 'input_cost', 'output_cost',\n 'cache_read_cost', 'cache_write_cost', 'total_cost', 'currency', 'metadata',\n]);\n\nexport interface ActiveDatastore {\n datastore: Datastore;\n impl: IDatastoreInstance;\n mapping: AuditFieldMapping;\n}\n\n@injectable()\nexport class DatastoreService extends ClassLogger {\n\n constructor(\n private readonly datastorePluginService: DatastorePluginService,\n ) {\n super();\n }\n\n async getActiveDatastores(): Promise<ActiveDatastore[]> {\n const impls = await this.datastorePluginService.getAllActiveImpls();\n return impls.map(({datastore, instance}) => ({\n datastore,\n impl: instance,\n mapping: datastore.mapping,\n }));\n }\n\n async testConnection(datastoreId: string): Promise<{ ok: boolean; error?: string }> {\n try {\n const impl = await this.datastorePluginService.getOrCreate(datastoreId);\n return impl.instance.testConnection();\n } catch (error) {\n return {ok: false, error: error instanceof Error ? error.message : String(error)};\n }\n }\n\n async testConnectionWithConfig(pluginId: string, config: Record<string, any>): Promise<{\n ok: boolean;\n error?: string\n }> {\n const plugin = this.datastorePluginService.getPluginDefinition(pluginId);\n if (!plugin) return {ok: false, error: 'Plugin not found'};\n\n let instance: IDatastoreInstance | null = null;\n try {\n instance = await plugin.createInstance(config);\n await instance.connect();\n const result = await instance.testConnection();\n return result;\n } catch (error) {\n return {ok: false, error: error instanceof Error ? error.message : String(error)};\n } finally {\n if (instance) {\n try {\n await instance.disconnect();\n } catch { /* ignore cleanup errors */\n }\n }\n }\n }\n\n validateMapping(mapping: AuditFieldMapping): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n for (const section of ['request', 'response', 'cost'] as const) {\n const m = mapping[section];\n if (!m) continue;\n\n if (!IDENTIFIER_RE.test(m.table)) {\n errors.push(`${section}.table '${m.table}' is not a valid SQL identifier`);\n }\n\n const canonicalKeys = section === 'request' ? CANONICAL_REQUEST_KEYS\n : section === 'response' ? CANONICAL_RESPONSE_KEYS\n : CANONICAL_COST_KEYS;\n\n for (const [targetCol, sourceField] of Object.entries(m.fields)) {\n if (!IDENTIFIER_RE.test(targetCol)) {\n errors.push(`${section}.fields: target column '${targetCol}' is not a valid SQL identifier`);\n }\n if (!sourceField.startsWith('_raw.') && !canonicalKeys.has(sourceField)) {\n errors.push(`${section}.fields: source '${sourceField}' is not a canonical key or _raw.* path`);\n }\n }\n }\n\n return {valid: errors.length === 0, errors};\n }\n\n validateConfig(pluginId: string, config: Record<string, any>, apiCredentialId?: string): {\n valid: boolean;\n errors: string[]\n } {\n const plugin = this.datastorePluginService.getPluginDefinition(pluginId);\n if (!plugin) return {valid: false, errors: ['Plugin not found']};\n\n const schema = plugin.getSchema?.();\n const errors: string[] = [];\n\n const required = (schema?.connection?.required as string[]) ?? [];\n const encrypted = new Set(schema?.connection?.encrypted ?? []);\n for (const field of required) {\n if (apiCredentialId && encrypted.has(field)) continue;\n if (config[field] === undefined || config[field] === null || config[field] === '') {\n errors.push(`Required field '${field}' is missing`);\n }\n }\n\n return {valid: errors.length === 0, errors};\n }\n\n maskEncryptedFields(datastore: Datastore, pluginId: string): Datastore {\n const plugin = this.datastorePluginService.getPluginDefinition(pluginId);\n if (!plugin) return datastore;\n\n const encrypted = new Set(plugin.getSchema?.()?.connection?.encrypted ?? []);\n const maskedConfig = {...datastore.connection_config};\n\n for (const key of Object.keys(maskedConfig)) {\n if (encrypted.has(key) && maskedConfig[key] != null) {\n maskedConfig[key] = {masked: true};\n }\n }\n\n return {...datastore, connection_config: maskedConfig};\n }\n\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport type {AuditFieldMapping, NormalizedAuditData} from '@holokai/holo-types/plugin';\n\n@injectable()\nexport class AuditMappingService extends ClassLogger {\n\n constructor() {\n super();\n }\n\n applyRequestMapping(\n mappingSection: NonNullable<AuditFieldMapping['request']>,\n data: NormalizedAuditData,\n ): Record<string, any> {\n return this.applyFields(mappingSection.fields, data.request ?? {}, data);\n }\n\n applyResponseMapping(\n mappingSection: NonNullable<AuditFieldMapping['response']>,\n data: NormalizedAuditData,\n ): Record<string, any> {\n return this.applyFields(mappingSection.fields, data.response ?? {}, data);\n }\n\n applyCostMapping(\n mappingSection: NonNullable<AuditFieldMapping['cost']>,\n data: NormalizedAuditData,\n responseId: string,\n ): Record<string, any> {\n const costSource = {...(data.cost ?? {}), response_id: responseId};\n return this.applyFields(mappingSection.fields, costSource, data);\n }\n\n private applyFields(\n fields: Record<string, string>,\n primarySource: Record<string, any>,\n data: NormalizedAuditData,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [targetColumn, sourceField] of Object.entries(fields)) {\n if (sourceField.startsWith('_raw.')) {\n result[targetColumn] = this.getNestedValue(data._raw, sourceField.slice(5));\n } else {\n result[targetColumn] = primarySource[sourceField] ?? null;\n }\n }\n\n return result;\n }\n\n private getNestedValue(obj: any, path: string): any {\n const parts = path.split('.');\n let current = obj;\n for (const part of parts) {\n if (current == null) return null;\n current = current[part];\n }\n return current ?? null;\n }\n}\n","import 'reflect-metadata';\nimport {inject, injectable} from \"tsyringe\";\nimport {RequestDB, ResponseDB} from \"../db\";\nimport {ClassLogger} from \"@holokai/holo-sdk\";\nimport type {HoloWorkerRequest} from \"@holokai/holo-types/worker\";\nimport {type ProviderResponse} from \"@holokai/holo-types/entities\";\nimport {NotificationStoreToken} from \"@holokai/holo-sdk/notification\";\nimport type {NotificationEvent} from \"@holokai/holo-types/notification\";\nimport {PostgresNotificationStore} from \"../db/notification.db\";\nimport {ProviderImplService} from \"./plugin\";\nimport {PricingService} from \"./pricing.service\";\nimport {DatastoreService} from \"./datastore.service\";\nimport {AuditMappingService} from \"./audit.mapping.service\";\nimport type {AuditFieldMapping, IDatastoreInstance, NormalizedAuditData} from \"@holokai/holo-types/plugin\";\n\n@injectable()\nexport class AuditService extends ClassLogger {\n\n constructor(\n private readonly providerImplService: ProviderImplService,\n @inject(NotificationStoreToken) private readonly notificationDB: PostgresNotificationStore,\n private requestDB: RequestDB,\n private responseDB: ResponseDB,\n private pricingService: PricingService,\n private datastoreService: DatastoreService,\n private mappingService: AuditMappingService,\n ) {\n super();\n this.log.info('AuditService initialized');\n }\n\n async logRequest(record: HoloWorkerRequest): Promise<void> {\n const logger = this.mlog(this.logRequest);\n const startTime = Date.now();\n\n try {\n const ai = await this.providerImplService.getProviderImplById(record.provider.id);\n const normalizedRequest = await ai.auditRequest(record);\n\n const auditData: NormalizedAuditData = {\n request: normalizedRequest as unknown as Record<string, any>,\n _raw: record,\n };\n\n // always internally log (for Holokai)\n await this.requestDB.insert(normalizedRequest);\n logger.info(`Logged request ${normalizedRequest.request_id} in ${Date.now() - startTime}ms`);\n\n const datastores = await this.datastoreService.getActiveDatastores();\n if (datastores.length > 0) {\n await this.fanOutToDatastores(datastores, auditData, record.requestId, startTime);\n }\n } catch (error) {\n logger.error(`Failed to log request: ${error instanceof Error ? error.message : 'Unknown error'}`, {\n requestId: record.requestId,\n error,\n duration: Date.now() - startTime\n });\n throw error;\n }\n }\n\n async logResponse(record: HoloWorkerRequest): Promise<void> {\n const logger = this.mlog(this.logResponse);\n const startTime = Date.now();\n\n try {\n const ai = await this.providerImplService.getProviderImplById(record.provider.id);\n const envelope = await ai.auditor.createWorkerResponseEnvelope(record, record.workerId);\n const normalizedResponse = await ai.auditResponse(envelope, record.providerEvent!);\n\n let costData: Record<string, any> | null = null;\n try {\n costData = await this.pricingService.calculateCosts({\n ...normalizedResponse,\n id: 'pending'\n } as ProviderResponse);\n } catch (pricingError) {\n logger.warn(`Cost calculation failed: ${pricingError instanceof Error ? pricingError.message : 'Unknown error'}`);\n }\n\n const auditData: NormalizedAuditData = {\n _raw: record,\n response: normalizedResponse as unknown as Record<string, any>,\n };\n if (costData) {\n auditData.cost = costData;\n }\n\n const result = await this.responseDB.insert(normalizedResponse);\n logger.debug(`Logged response ${normalizedResponse.request_id} (id: ${result?.id}) in ${Date.now() - startTime}ms`);\n\n if (result?.id) {\n try {\n await this.pricingService.calculateAndInsertCosts(result.id, {\n ...normalizedResponse,\n id: result.id\n });\n } catch (pricingError) {\n logger.warn(`Cost insert failed for response ${result.id}: ${pricingError instanceof Error ? pricingError.message : 'Unknown error'}`);\n }\n }\n\n const datastores = await this.datastoreService.getActiveDatastores();\n if (datastores.length > 0) {\n await this.fanOutToDatastores(datastores, auditData, record.requestId, startTime);\n }\n } catch (error) {\n logger.error(`Failed to log response: ${error instanceof Error ? error.message : 'Unknown error'}`, {\n requestId: record.requestId,\n error,\n duration: Date.now() - startTime\n });\n throw error;\n }\n }\n\n async logNotification(content: NotificationEvent): Promise<void> {\n const logger = this.mlog(this.logNotification);\n logger.debug(`Logging notification: ${JSON.stringify(content)}`);\n const startTime = Date.now();\n try {\n await this.notificationDB.insert(content);\n } catch (error) {\n logger.error(`Failed to log notification: ${error instanceof Error ? error.message : 'Unknown error'}`, {\n error: error,\n duration: Date.now() - startTime\n });\n throw error;\n }\n }\n\n private async fanOutToDatastores(\n datastores: Awaited<ReturnType<DatastoreService['getActiveDatastores']>>,\n auditData: NormalizedAuditData,\n requestId: string,\n startTime: number,\n ): Promise<void> {\n const logger = this.mlog(this.fanOutToDatastores);\n const results = await Promise.allSettled(\n datastores.map(({impl, mapping}) =>\n this.writeToDatastore(impl, mapping, auditData)\n )\n );\n\n for (const [i, result] of results.entries()) {\n const ds = datastores[i].datastore;\n const fields = {\n datastoreId: ds.id,\n datastoreName: ds.name,\n pluginId: ds.plugin_id,\n requestId,\n duration: Date.now() - startTime,\n };\n if (result.status === 'rejected') {\n logger.error('Audit write failed', {...fields, error: result.reason});\n } else {\n logger.debug('Audit write succeeded', fields);\n }\n }\n }\n\n private async writeToDatastore(\n impl: IDatastoreInstance,\n mapping: AuditFieldMapping,\n data: NormalizedAuditData,\n ): Promise<void> {\n if (mapping.request && data.request) {\n const record = this.mappingService.applyRequestMapping(mapping.request, data);\n await impl.write(mapping.request.table, record);\n }\n\n if (mapping.response && data.response) {\n const responseRecord = this.mappingService.applyResponseMapping(mapping.response, data);\n if (data.cost) {\n responseRecord.cost = data.cost.total_cost ?? 0;\n }\n const result = await impl.write(mapping.response.table, responseRecord);\n\n if (mapping.cost && data.cost && result.id) {\n const costRecord = this.mappingService.applyCostMapping(mapping.cost, data, result.id);\n await impl.write(mapping.cost.table, costRecord);\n if (impl.updateResponseCost) {\n await impl.updateResponseCost(mapping.response.table, result.id, data.cost.total_cost ?? 0);\n }\n }\n }\n }\n\n}\n","export enum AnnouncementType {\n PROXY = 'PROXY',\n WORKER = 'WORKER',\n AUDIT = 'AUDIT'\n}\n\nexport interface AnnouncementMessage {\n type: AnnouncementType;\n serverId: string;\n timestamp: string;\n}\n","export interface JWTPayload {\n userId?: string;\n email?: string;\n appSlugs?: string[];\n organizationId: string;\n sub: string;\n iss: string;\n iat: number;\n exp: number;\n}\n\nexport interface TokenRefreshRequest {\n apiKey: string;\n}\n\nexport interface TokenRefreshResponse {\n accessToken: string;\n}","export interface DatabaseConfig {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number;\n idleTimeoutMillis?: number;\n}\n\nexport interface RabbitConfig {\n url: string;\n reconnectAttempts: number;\n reconnectDelayMs: number;\n}\n\n","import logger from \"../utils/logger\";\nimport {ArkErrors} from \"arktype\";\n\nexport class AdminConfigError extends Error {\n constructor(message: string, errors: ArkErrors) {\n super(message);\n\n logger.error(errors.summary);\n }\n}\n","import {type} from \"arktype\";\n\nexport interface GuardResultPass {\n passed: true;\n}\n\nexport interface GuardResultFail {\n passed: false;\n errors: string[];\n}\n\nexport type GuardResult = GuardResultPass | GuardResultFail;\n\nexport const GuardResultPassValidator = type({passed: 'true'}).brand('GuardResultPassValidator') satisfies type<GuardResultPass>;\n\nexport const GuardResultFailValidator = type({\n passed: 'false', errors: 'string[]'\n}).brand('GuardResultFailValidator') satisfies type<GuardResultFail>;\n\nexport const GuardResultValidator = GuardResultPassValidator.or(GuardResultFailValidator).brand('GuardResultValidator') satisfies type<GuardResult>;\n\nexport const GuardResultSchema = {\n \"type\": \"object\",\n \"properties\": {\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"errors\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\"passed\", \"errors\"],\n \"additionalProperties\": false\n};\n","export * from './announcement.types';\nexport * from './auth.types';\nexport * from './config.types';\nexport * from './errors';\nexport * from './guard.types';\n","import {type NextFunction, type RequestHandler, type Response} from 'express';\nimport {ClassLogger} from \"@holokai/holo-sdk\";\nimport type {WireChunk} from '@holokai/holo-types/provider';\nimport {type HoloApiRequest} from '../api/types';\n\nexport interface ApiResponse<T = any> extends Response {\n json: (body: T) => this;\n}\n\nexport function asyncHandler(\n fn: (req: HoloApiRequest, res: ApiResponse, next: NextFunction) => Promise<void>\n): RequestHandler {\n return (req, res, next) => {\n fn(req as HoloApiRequest, res as ApiResponse, next).catch(next);\n };\n}\n\nexport abstract class BaseController extends ClassLogger {\n protected handleError(\n res: ApiResponse,\n error: Error,\n message: string = 'Internal server error',\n statusCode: number = 500\n ): void {\n const logger = this.mlog(this.handleError);\n logger.error(`${message}: ${JSON.stringify(error.message, null, 2)}`, {\n methodName: 'handleError'\n });\n res.status(statusCode).json({\n success: false,\n error: {\n message,\n code: error.name || 'INTERNAL_ERROR',\n ...(process.env.NODE_ENV === 'development' && {stack: error.stack})\n },\n timestamp: new Date().toISOString()\n });\n }\n}\n\nexport async function writeWireToResponse(\n chunks: AsyncIterable<WireChunk>,\n res: Response\n): Promise<void> {\n let headersSent = false;\n for await (const wire of chunks) {\n if (wire.headers && !headersSent) {\n if (wire.status) res.status(wire.status);\n Object.entries(wire.headers).forEach(([k, v]) => res.setHeader(k, v));\n headersSent = true;\n }\n\n if (wire.body) {\n if (!res.write(wire.body)) {\n await new Promise<void>(resolve => res.once('drain', resolve));\n }\n }\n\n if (wire.done) {\n res.end();\n }\n }\n}\n","import type {Request} from 'express';\n\nexport interface PaginationParams {\n page: number;\n limit: number;\n offset: number;\n sort_by: string;\n sort_dir: 'asc' | 'desc';\n}\n\nexport interface PaginatedResponse<T> {\n success: true;\n data: T[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n total_pages: number;\n };\n timestamp: string;\n}\n\nconst ALLOWED_SORT_DIRS = new Set(['asc', 'desc']);\nconst MAX_LIMIT = 100;\nconst DEFAULT_LIMIT = 25;\n\nexport function parsePagination(req: Request, defaultSort = 'created_at'): PaginationParams {\n const page = Math.max(1, parseInt(req.query.page as string) || 1);\n const limit = Math.min(MAX_LIMIT, Math.max(1, parseInt(req.query.limit as string) || DEFAULT_LIMIT));\n const sort_by = (req.query.sort_by as string) || defaultSort;\n const rawDir = (req.query.sort_dir as string)?.toLowerCase();\n const sort_dir = ALLOWED_SORT_DIRS.has(rawDir!) ? rawDir as 'asc' | 'desc' : 'desc';\n\n return {page, limit, offset: (page - 1) * limit, sort_by, sort_dir};\n}\n\nexport function paginatedResponse<T>(data: T[], total: number, params: PaginationParams): PaginatedResponse<T> {\n return {\n success: true,\n data,\n pagination: {\n page: params.page,\n limit: params.limit,\n total,\n total_pages: Math.ceil(total / params.limit),\n },\n timestamp: new Date().toISOString(),\n };\n}\n","export type Constructor<T = {}> = new (...args: any[]) => T;\n","import {pickDefined} from \"@holokai/holo-sdk\";\n\nexport const SEP = \"\\x1F\";\n\nexport function ixKey(...parts: Array<string | number | undefined | null>): string {\n return parts.map((p) => (p === undefined || p === null ? \"\" : String(p))).join(SEP);\n}\n\nexport class IndexMap {\n private static readonly EMPTY: ReadonlySet<string> = new Set();\n private readonly map = new Map<string, Set<string>>();\n\n add(indexKey: string, id: string): void {\n let set = this.map.get(indexKey);\n if (!set) this.map.set(indexKey, (set = new Set()));\n set.add(id);\n }\n\n remove(indexKey: string, id: string): void {\n const set = this.map.get(indexKey);\n if (!set) return;\n set.delete(id);\n if (set.size === 0) this.map.delete(indexKey);\n }\n\n get(indexKey: string): ReadonlySet<string> {\n return this.map.get(indexKey) ?? IndexMap.EMPTY;\n }\n\n delete(indexKey: string): void {\n this.map.delete(indexKey);\n }\n\n clear(): void {\n this.map.clear();\n }\n\n size(): number {\n return this.map.size;\n }\n}\n\nexport interface CacheFieldIndex<T> {\n field: Keyable<T>;\n multi?: boolean;\n name?: string;\n}\n\nexport interface CacheIndex<T> {\n name: string;\n multi?: boolean;\n fn: (val: T) => string | undefined | null;\n}\n\nexport function createCacheIndex<T>(def: CacheFieldIndex<T>): CacheIndex<T> {\n const {field, name, multi} = def;\n return pickDefined({\n name: name || field,\n multi,\n fn: (val: T) => (val as any)?.[field] as any,\n }) as CacheIndex<T>;\n}\n\nexport type Keyable<T> = {\n [K in keyof T]-?: T[K] extends string | number ? K : never\n}[keyof T] & string;\n","export function findLast<T>(arr: readonly T[], pred: (v: T) => boolean): T | undefined {\n for (let i = arr.length - 1; i >= 0; i--) {\n const v = arr[i];\n if (pred(v)) return v;\n }\n return undefined;\n}\n\nexport function filterJoin<T>(\n items: readonly T[],\n predicate: (item: T) => boolean,\n toString: (item: T) => string,\n separator = \"\\n\"\n): string {\n let out = \"\";\n for (const item of items) {\n if (!predicate(item)) continue;\n const s = toString(item);\n if (!out) out = s;\n else out += separator + s;\n }\n return out;\n}\n","import {clamp, parseNumber} from \"./env.parsers\";\n\nexport function parseRepeatableParam(q: unknown): string | undefined {\n if (Array.isArray(q)) return q.join(\",\");\n if (typeof q === \"string\") return q;\n return undefined;\n}\n\nexport function parseLimit(q: unknown, def = 250): number {\n const n = parseNumber(parseRepeatableParam(q), def);\n return clamp(n, 1, 1000);\n}\n","export * from './logger';\nexport * from './api';\nexport * from './pagination';\nexport * from './mixins';\nexport * from './indexing';\nexport * from './env.parsers';\nexport * from './collection';\nexport * from './http.parsers';\n","import 'reflect-metadata';\nimport {QueueService} from \"./queue.service\";\nimport {injectable} from \"tsyringe\";\nimport {type HoloApiRequest} from \"../api/types\";\nimport {type Response} from \"express\";\nimport {env} from \"../env\";\nimport {AsyncEventQueue, ClassLogger} from \"@holokai/holo-sdk\";\nimport type {WireChunk} from \"@holokai/holo-types/provider\";\nimport type {HoloWorkerRequest} from \"@holokai/holo-types/worker\";\nimport {writeWireToResponse} from \"../utils/api\";\n\n@injectable()\nexport class ResponseService extends ClassLogger {\n private serverId: string = env.api.apiServerId;\n private readonly responseQueue = env.queue.responseQueue;\n private readonly requestExchange = env.queue.requestExchange;\n private readonly queues = new Map<string, AsyncEventQueue<WireChunk>>();\n\n constructor(\n private queueService: QueueService\n ) {\n super();\n }\n\n async startLLMResponseConsumer(serverId?: string) {\n this.serverId = serverId || this.serverId;\n const queueName = `${this.responseQueue}.${this.serverId}`;\n\n await this.queueService.consume(\n queueName,\n async (id: string, content: any) => this.processWireChunk(id, content),\n true\n );\n }\n\n async processWireChunk(_id: string, wire: WireChunk) {\n const logger = this.mlog(this.processWireChunk);\n\n const {requestId} = wire;\n const queue = this.queues.get(requestId);\n\n if (!queue) {\n logger.warn(`Received response for unknown request: ${requestId}`);\n return;\n }\n\n queue.push(wire);\n if (wire.done) {\n logger.debug(`Finished processing wire: ${wire.fullText ?? wire.body}`);\n queue.end();\n this.queues.delete(requestId);\n }\n }\n\n async sendRequest(req: HoloApiRequest, res: Response, request: HoloWorkerRequest) {\n const logger = this.mlog(this.sendRequest);\n const {requestId} = request;\n\n const queue = new AsyncEventQueue<WireChunk>();\n this.queues.set(requestId, queue);\n\n req.on('close', () => {\n logger.info(`Client disconnected from request: ${requestId}`);\n queue.end();\n this.queues.delete(requestId);\n });\n\n await this.sendRequestToExchange(request, requestId);\n\n try {\n await writeWireToResponse(queue, res);\n } catch (error) {\n logger.error(`Error streaming response: ${(error as Error).message}`);\n if (!res.headersSent) {\n res.status(500).end();\n }\n } finally {\n this.queues.delete(requestId);\n }\n }\n\n async requestOnce<T = string>(request: HoloWorkerRequest, timeoutMs = 60000): Promise<T> {\n const {requestId} = request;\n\n const queue = new AsyncEventQueue<WireChunk>();\n this.queues.set(requestId, queue);\n\n await this.sendRequestToExchange(request, requestId);\n\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`Response timed out after ${timeoutMs}ms (requestId=${requestId})`)), timeoutMs)\n );\n\n try {\n let acc = \"\";\n\n return await Promise.race([\n (async () => {\n for await (const wire of queue) {\n if (wire.body) acc += wire.body;\n if (wire.done) break;\n }\n return acc as unknown as T;\n })(),\n timeout\n ]);\n } finally {\n this.queues.delete(requestId);\n }\n }\n\n async sendRequestToExchange(request: HoloWorkerRequest, correlationId: string, exchange: string = this.requestExchange) {\n await this.queueService.sendToExchange(exchange, \"\", request, {correlationId});\n }\n\n async sendResponseChunk(sourceId: string, requestId: string, data: object) {\n await this.queueService.sendToExchange(env.queue.responseExchange, sourceId, data, {correlationId: requestId});\n }\n\n async sendToAudit(data: HoloWorkerRequest) {\n await this.queueService.sendToExchange(env.queue.responseExchange, \"audit\", data, {correlationId: data.requestId});\n }\n}\n","import {type HoloApiRequest} from \"../api/types\";\nimport logger from \"../utils/logger\";\nimport {pickDefined} from \"@holokai/holo-sdk\";\nimport {createWorkerRequest} from \"@holokai/holo-sdk/provider\";\nimport type {Auth} from \"@holokai/holo-types/api\";\nimport type {HoloWorkerRequest, HttpRequestDetails} from \"@holokai/holo-types/worker\";\nimport {type Application, type Provider} from \"@holokai/holo-types/entities\";\nimport type {ProviderProtocol} from \"@holokai/holo-types/provider\";\n\nexport class WorkerRequestFactory {\n static logger = logger.child({className: 'WorkerRequestFactory'});\n\n static fromRequest(\n provider: Provider,\n protocol: ProviderProtocol,\n req: HoloApiRequest,\n sourceId: string,\n application?: Application,\n isPassthrough: boolean = false\n ): HoloWorkerRequest {\n const {auth, body, headers, query, path, method} = req;\n\n if (!provider) throw new Error(\"No provider provided\");\n\n const {thread_id, branch_id, ...payload} = body;\n\n const workerRequest = this.create(\n provider,\n protocol,\n payload,\n sourceId,\n auth,\n pickDefined({path, method, headers, query}) as HttpRequestDetails,\n thread_id,\n branch_id,\n application\n );\n\n if (isPassthrough) {\n workerRequest.isPassthrough = true;\n workerRequest.passthroughPath = path.replace(`/api/${provider.type}`, '');\n }\n\n return workerRequest;\n }\n\n static create(\n provider: Provider,\n protocol: ProviderProtocol,\n payload: any,\n sourceId: string,\n auth?: Auth,\n httpRequestDetails?: HttpRequestDetails,\n thread_id?: string,\n branch_id?: string,\n application?: Application\n ) {\n let authFields: Record<string, any> = {};\n if (auth) {\n const {organizationId, userId, tokenType, clientIdentifier} = auth;\n const appSlug = application?.url_slug || provider.name;\n authFields = {\n organizationId,\n userId,\n appSlug,\n clientIdentifier,\n tokenType,\n };\n }\n\n return createWorkerRequest({\n provider,\n protocol,\n payload,\n sourceId,\n isStreaming: payload.stream === true,\n httpRequestDetails,\n application,\n threadId: thread_id,\n branchId: branch_id,\n ...authFields,\n });\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {type GuardResult, GuardResultSchema} from \"../types\";\nimport {env} from \"../env\";\nimport {ClassLogger, pickDefined} from \"@holokai/holo-sdk\";\nimport {filterJoin, findLast} from \"../utils\";\nimport {type HoloContent, type HoloContentText, type HoloRequest} from \"@holokai/holo-types/holo\";\nimport type {HoloWorkerRequest} from \"@holokai/holo-types/worker\";\nimport type {Auth} from \"@holokai/holo-types/api\";\nimport type {Prompt} from \"@holokai/holo-types/entities\";\nimport {ProtocolCapability} from \"@holokai/holo-types/entities\";\nimport {PluginService, ProviderPluginService} from \"./plugin\";\nimport {ResponseService} from \"./response.service\";\nimport {WorkerRequestFactory} from \"./worker.request.factory\";\nimport {ProviderService} from \"./entities\";\nimport {type IProviderPlugin} from \"@holokai/holo-types/plugin\";\nimport {type IProvider} from \"@holokai/holo-types\";\n\n\n@injectable()\nexport class GuardService extends ClassLogger {\n private serverId: string = env.api.apiServerId;\n\n constructor(\n private responseService: ResponseService,\n private providerService: ProviderService,\n private pluginService: PluginService,\n private providerPluginService: ProviderPluginService\n ) {\n super();\n }\n\n async guard(provider: IProvider, workerRequest: HoloWorkerRequest, guards: Prompt[], auth: Auth) {\n const logger = this.mlog(this.guard);\n\n logger.debug(`Guard service invoked: guards.length=${guards?.length || 0}, requestId=${workerRequest.requestId}, requestType=${workerRequest}`);\n\n if (!guards || !guards.length) {\n logger.debug(`No guards to execute - returning early`);\n return;\n }\n\n const requestPlugin = provider.plugin;\n if (!requestPlugin) {\n throw new Error(`No plugin found for provider: ${workerRequest.provider.name}`);\n }\n\n const request = await requestPlugin.translator.toHoloRequest(workerRequest.payload);\n\n const holoMessages = request.messages;\n if (!holoMessages || !holoMessages.length) return;\n\n const lastMessage = findLast(holoMessages, m => {\n if (m === undefined || m === null) {\n logger.warn(`Encountered ${m === null ? 'null' : 'undefined'} message in holoMessages`, {requestId: workerRequest.requestId});\n return false;\n }\n return m.role === 'user';\n });\n\n if (!lastMessage) {\n logger.warn(`No user message to guard`, {methodName: 'guard', requestId: workerRequest.requestId});\n return;\n }\n\n const lastContent = Array.isArray(lastMessage.content) ?\n filterJoin<HoloContent>(lastMessage.content, x => x.type === 'text', x => (x as HoloContentText).text, '\\n\\n') :\n lastMessage.content;\n\n if (!lastContent.length) return;\n\n try {\n workerRequest.guards = guards;\n logger.debug(`Executing ${guards.length} guard check(s) in parallel`);\n const results = await Promise.all(\n guards.map(async (guard, index) => {\n logger.debug(`Starting guard check ${index + 1}/${guards.length}: id=${guard.id}, model=${guard.model}, provider=${guard.provider}`);\n const startTime = Date.now();\n try {\n if (!guard.provider_id) {\n logger.warn(`Guard ${guard.id} has no provider_id`);\n return {passed: true};\n }\n const guardProvider = await this.providerService.getById(guard.provider_id);\n if (!guardProvider) {\n logger.warn(`Guard provider not found: ${guard.provider_id}`);\n return {passed: true};\n }\n const guardPlugin = await this.pluginService.getImplById(guardProvider.plugin_id) as IProviderPlugin;\n if (!guardPlugin) {\n logger.warn(`No plugin for guard provider: ${guardProvider.name}`);\n return {passed: true};\n }\n\n const guardProtocol = this.providerPluginService.getProtocolByCapability(guardProvider.plugin_id, ProtocolCapability.CHAT)\n ?? await this.providerPluginService.getProtocol(guardProvider.plugin_id, guardPlugin.defaultProtocol);\n\n const holoRequest: HoloRequest = pickDefined({\n model: guard.model,\n messages: [{\n role: \"user\",\n content: guard.user_prompt + \"\\n\\n\" + lastContent\n }],\n response_format: {type: \"json_schema\", schema: GuardResultSchema, strict: true},\n stream: false,\n ...(guard.system_prompt && {system: guard.system_prompt}),\n }) as HoloRequest;\n\n const payload = await guardPlugin.translator.fromHoloRequest(holoRequest);\n const guardRequest = WorkerRequestFactory.create(\n guardProvider,\n guardProtocol,\n payload,\n this.serverId,\n auth,\n undefined,\n workerRequest.threadId,\n workerRequest.branchId\n );\n logger.info(JSON.stringify(guardRequest));\n const response = await this.responseService.requestOnce<string>(guardRequest);\n\n const raw = JSON.parse(response as string);\n logger.debug(`Guard raw response: ${JSON.stringify(raw)}`, {requestId: workerRequest.requestId});\n const holoResponse = await guardPlugin.translator.toHoloResponse(raw);\n if (!holoResponse.output?.length) return {\n passed: false,\n errors: [\"Guard response is missing output\"]\n };\n\n const guardResponse = holoResponse.output[0].content as string;\n if (!guardResponse) {\n logger.warn(`Guard returned empty content`);\n return {passed: true, errors: ['Guard returned empty response']};\n }\n const result = JSON.parse(guardResponse);\n const duration = Date.now() - startTime;\n logger.debug(`Guard check ${index + 1}/${guards.length} completed: id=${guard.id}, passed=${result.passed}, duration=${duration}ms`);\n return result;\n } catch (e: any) {\n const duration = Date.now() - startTime;\n logger.error(`Guard check ${index + 1}/${guards.length} failed: id=${guard.id}, error=${e?.message ?? String(e)}, duration=${duration}ms`, {requestId: workerRequest.requestId});\n return {passed: true, errors: [e?.message ?? String(e)]};\n }\n })\n );\n\n logger.debug(`All ${guards.length} guard checks completed - aggregating results`);\n\n const reduced = results.reduce<GuardResult>(\n (acc, r: any) => {\n acc.passed = acc.passed && !!r.passed;\n if (!acc.passed && r?.passed === false && r.errors?.length) {\n if (!acc.errors) acc.errors = [];\n acc.errors.push(...r.errors);\n }\n return acc;\n },\n {passed: true} as any\n );\n\n workerRequest.guardResult = reduced;\n if (reduced.passed) {\n logger.debug(`Guard result summary: passed=true`);\n } else {\n const errorCount = reduced.errors?.length || 0;\n logger.debug(`Guard result summary: passed=false, errorCount=${errorCount}`);\n if (reduced.errors?.length) {\n logger.warn(`Guards BLOCKED request: ${reduced.errors.join('; ')}`);\n }\n }\n return reduced;\n } catch (e) {\n logger.error(`Failed to process guards: ${(e as Error).message}`, {\n methodName: 'guard',\n requestId: workerRequest.requestId,\n stack: (e as Error).stack\n });\n return {passed: false, errors: [(e as Error).message]};\n }\n }\n}\n","import \"reflect-metadata\";\nimport {QueueService} from \"./queue.service\";\nimport {injectable} from \"tsyringe\";\nimport {env} from \"../env\";\nimport logger from \"../utils/logger\";\nimport {\n PluginInstallerService,\n PluginLifecycleService,\n PluginRegistry,\n PluginService,\n PluginWatcherService,\n ProviderImplService,\n} from \"./plugin\";\nimport {ResponseService} from \"./response.service\";\nimport {RedisService} from \"./redis.service\";\nimport {ServerDB} from \"../db\";\n\n@injectable()\nexport class InitService {\n private serverId: string = env.api.apiServerId;\n\n constructor(\n private pluginService: PluginService,\n private pluginInstallerService: PluginInstallerService,\n private pluginLifecycleService: PluginLifecycleService,\n private pluginRegistry: PluginRegistry,\n private pluginWatcherService: PluginWatcherService,\n private providerImplService: ProviderImplService,\n private responseService: ResponseService,\n private queueService: QueueService,\n private redisService: RedisService,\n private serverDB: ServerDB,\n ) {\n\n }\n\n async init(serverId: string): Promise<void> {\n this.serverId = serverId;\n await this.redisService.connect();\n\n const staleCount = await this.serverDB.deactivateStaleServers(60);\n if (staleCount > 0) {\n logger.info(`Deactivated ${staleCount} stale server(s)`);\n }\n\n // 1. Ensure plugin directory and seed app modules (node_modules is canonical)\n await this.pluginInstallerService.ensurePluginsDir();\n await this.pluginInstallerService.seedAppModules();\n\n // 2. Load ALL active plugins from DB (extracts tarballs to disk if not present)\n await this.pluginRegistry.loadAllActive();\n\n // 3. Warm provider impls (plugins already in registry)\n this.pluginLifecycleService.setServerId(serverId);\n await this.providerImplService.warmAll();\n\n // 4. Register protocols + pricing from loaded plugins (needed for route registration)\n await this.pluginService.registerPluginProtocols(serverId);\n\n // 4. Setup queues and response consumer\n await this.setupQueues(serverId);\n await this.responseService.startLLMResponseConsumer();\n\n // 5. Start plugin watcher for hot-reload (dev mode)\n if (env.api.pluginWatchEnabled) {\n await this.pluginWatcherService.startWatching();\n }\n }\n\n async setupQueues(serverId?: string) {\n logger.debug(`setupQueues called with ${serverId}`);\n this.serverId = serverId || this.serverId;\n await this._setupGlobalExchanges();\n await this._setupRequestQueues();\n await this._setupResponseQueues();\n await this._setupNotificationQueues();\n }\n\n async _setupGlobalExchanges() {\n await this.queueService.assertExchange(env.queue.requestExchange, 'fanout');\n await this.queueService.assertExchange(env.queue.responseExchange, 'direct');\n await this.queueService.assertExchange(env.queue.notificationExchange, \"topic\");\n await this.queueService.assertExchange(env.queue.adminExchange, 'topic');\n await this.queueService.assertExchange(env.queue.adminResponseExchange, 'direct');\n await this.queueService.assertExchange(env.queue.directExchange, 'direct');\n }\n\n async _setupRequestQueues() {\n await this.queueService.assertQueue(env.queue.requestQueue, {durable: true}, env.queue.requestExchange);\n await this.queueService.assertQueue(env.queue.auditRequestQueue, {durable: true}, env.queue.requestExchange);\n }\n\n async _setupResponseQueues() {\n const responseQueueName = `${env.queue.responseQueue}.${this.serverId}`;\n await this.queueService.assertQueue(\n responseQueueName,\n {\n durable: true,\n arguments: {\n 'x-expires': env.queue.queueExpiration\n }\n },\n env.queue.responseExchange,\n this.serverId);\n\n await this.queueService.assertQueue(\n env.queue.auditResponseQueue,\n {\n durable: true\n },\n env.queue.responseExchange,\n env.queue.auditRoutingKey);\n }\n\n async _setupNotificationQueues() {\n await this.queueService.assertQueue(env.queue.auditNotificationQueue, {durable: true}, env.queue.notificationExchange, '#');\n }\n\n}\n","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {ClassLogger, pickDefined,} from \"@holokai/holo-sdk\";\nimport type {\n INotificationService,\n INotificationSub,\n NotificationEvent,\n NotificationSubscribeFilter\n} from '@holokai/holo-types/notification';\nimport {NotificationTopic} from '@holokai/holo-sdk/notification';\nimport {QueueService} from \"./queue.service\";\nimport {env} from \"../env\";\nimport {AsyncEventQueue} from \"@holokai/holo-sdk/core\";\nimport {randomUUID} from \"node:crypto\";\n\ninterface InternalNotificationSub extends INotificationSub {\n q: AsyncEventQueue<NotificationEvent>;\n}\n\n@injectable()\nexport class NotificationService extends ClassLogger implements INotificationService {\n private readonly exchange = env.queue.notificationExchange;\n private readonly queuePrefix = env.queue.notificationQueue;\n\n private consumers = new Map<string, { queueName: string; started: boolean }>();\n\n private bindingRefs = new Map<string, Map<string, number>>();\n\n private subs = new Map<string, Map<string, InternalNotificationSub>>();\n\n constructor(private readonly queueService: QueueService) {\n super();\n this.queueService.on('channel:lost', () => this.handleChannelLost());\n }\n\n async publish(event: NotificationEvent): Promise<void> {\n const rk = NotificationTopic.publishKey(event.organizationId, event.userId, event.appSlug);\n await this.queueService.sendToExchange(this.exchange, rk, event, {\n correlationId: event.id,\n });\n }\n\n async subscribe(filter: NotificationSubscribeFilter): Promise<INotificationSub> {\n const {organizationId, userId, appSlug} = filter;\n\n if (!organizationId || !userId) {\n throw new Error('Notification subscription requires organizationId and userId');\n }\n\n\n const userKey = NotificationTopic.userKey(organizationId, userId);\n const id = randomUUID();\n const q = new AsyncEventQueue<NotificationEvent>();\n\n await this.ensureUserQueueConsumer(userKey);\n\n const bindingKey = NotificationTopic.userApp(organizationId, '*', appSlug);\n await this.addBindingRef(userKey, bindingKey);\n\n let m = this.subs.get(userKey);\n if (!m) this.subs.set(userKey, (m = new Map()));\n\n const sub = pickDefined({id, filter, q, appSlug}) as InternalNotificationSub;\n m.set(id, sub);\n return sub;\n }\n\n\n async unsubscribe(id: string): Promise<boolean> {\n for (const [userKey, subs] of this.subs.entries()) {\n const sub = subs.get(id);\n if (!sub) continue;\n\n subs.delete(id);\n sub.q.end();\n\n const {organizationId, appSlug} = sub.filter;\n await this.releaseBindingRef(userKey, NotificationTopic.userApp(organizationId, '*', appSlug));\n\n if (subs.size === 0) {\n this.subs.delete(userKey);\n }\n\n return true;\n }\n return false;\n }\n\n private async ensureUserQueueConsumer(userKey: string) {\n const existing = this.consumers.get(userKey);\n if (existing?.started) return;\n\n const queueName = `${this.queuePrefix}.${userKey}.${env.api.apiServerId}`;\n\n await this.queueService.assertQueue(\n queueName,\n {\n durable: true,\n arguments: {\"x-expires\": env.queue.queueExpiration},\n }\n );\n\n await this.queueService.consume(\n queueName,\n async (_id: string, content: any) => this.fanoutToUser(userKey, content as NotificationEvent),\n true\n );\n\n this.consumers.set(userKey, {queueName, started: true});\n }\n\n private async addBindingRef(userKey: string, binding: string) {\n let m = this.bindingRefs.get(userKey);\n if (!m) this.bindingRefs.set(userKey, (m = new Map()));\n\n const n = (m.get(binding) ?? 0) + 1;\n m.set(binding, n);\n if (n > 1) return;\n\n const c = this.consumers.get(userKey);\n if (!c) throw new Error(`No queue for ${userKey}`);\n\n await this.queueService.bindQueue(c.queueName, this.exchange, binding);\n }\n\n private async releaseBindingRef(userKey: string, binding: string) {\n const m = this.bindingRefs.get(userKey);\n if (!m) return;\n\n const n = (m.get(binding) ?? 0) - 1;\n if (n > 0) {\n m.set(binding, n);\n return;\n }\n\n m.delete(binding);\n if (m.size === 0) this.bindingRefs.delete(userKey);\n\n const c = this.consumers.get(userKey);\n if (!c) return;\n\n await this.queueService.unbindQueue(c.queueName, this.exchange, binding);\n }\n\n private fanoutToUser(userKey: string, ev: NotificationEvent) {\n const logger = this.mlog(this.fanoutToUser);\n const subs = this.subs.get(userKey);\n if (!subs || subs.size === 0) return;\n\n let notified = 0;\n for (const sub of subs.values()) {\n if (!this.matchesFilter(sub.filter, ev)) continue;\n sub.q.push(ev);\n notified++;\n }\n logger.info(`Fanout: type=${ev.type}, userKey=${userKey}, totalSubs=${subs.size}, notified=${notified}`);\n }\n\n private handleChannelLost(): void {\n const logger = this.mlog(this.handleChannelLost);\n const err = new Error('Channel closed');\n let failed = 0;\n\n for (const subs of this.subs.values()) {\n for (const sub of subs.values()) {\n sub.q.fail(err);\n failed++;\n }\n }\n\n this.subs.clear();\n this.consumers.clear();\n this.bindingRefs.clear();\n\n logger.warn(`Channel lost: failed ${failed} subscription(s), cleared all consumer state`);\n }\n\n private matchesFilter(filter: NotificationSubscribeFilter, ev: NotificationEvent): boolean {\n if (ev.organizationId !== filter.organizationId) return false;\n if (filter.appSlug && ev.appSlug !== filter.appSlug) return false;\n\n const matchesUser = filter.userId ? ev.userId === filter.userId : false;\n if (matchesUser) return true;\n\n const matchesThread = !!ev.threadId && !!filter.threadIds?.includes(ev.threadId);\n if (!matchesThread) return false;\n if (filter.requestIds?.length && (!ev.requestId || !filter.requestIds.includes(ev.requestId))) return false;\n if (filter.branchIds?.length && (!ev.branchId || !filter.branchIds.includes(ev.branchId))) return false;\n if (filter.types?.length && !filter.types.includes(ev.type)) return false;\n\n return true;\n }\n\n}\n","import 'reflect-metadata';\nimport {inject, injectable} from 'tsyringe';\nimport {type HoloApiRequest} from \"../api/types\";\nimport {type Response} from \"express\";\nimport {ResponseService} from \"./response.service\";\nimport {env} from \"../env\";\nimport {GuardService} from \"./guard.service\";\nimport {WorkerRequestFactory} from \"./worker.request.factory\";\nimport {ClassLogger, HoloError} from \"@holokai/holo-sdk\";\nimport type {INotificationService} from '@holokai/holo-types/notification';\nimport {NotificationEventFactory, NotificationServiceToken} from \"@holokai/holo-sdk/notification\";\nimport {type Application, type Model, type Protocol, type Provider} from \"@holokai/holo-types/entities\";\nimport type {RouteDefinition} from \"@holokai/holo-types/routing\";\nimport {PluginRegistry, ProviderImplService, ProviderPluginService} from \"./plugin\";\nimport {ProviderService} from \"./entities\";\nimport {AccessService} from \"./auth\";\nimport {PluginDB} from \"../db\";\n\n\n@injectable()\nexport class RequestService extends ClassLogger {\n private serverId: string = env.api.apiServerId;\n\n constructor(\n private readonly responseService: ResponseService,\n private readonly guardService: GuardService,\n private readonly providerImplService: ProviderImplService,\n private readonly providerPluginService: ProviderPluginService,\n private readonly accessService: AccessService,\n private readonly pluginDB: PluginDB,\n private readonly pluginRegistry: PluginRegistry,\n private readonly providerService: ProviderService,\n @inject(NotificationServiceToken) readonly notificationService: INotificationService\n ) {\n super();\n }\n\n async processCustomRequest(\n wireFamily: string,\n appSlug: string,\n nativePath: string,\n req: HoloApiRequest,\n res: Response\n ) {\n const logger = this.mlog(this.processCustomRequest);\n req.appSlug = appSlug;\n\n const wirePlugin = this.pluginRegistry.findByFamily(wireFamily);\n const route = matchRoute(wirePlugin.getRoutes(), req.method, nativePath);\n if (!route) {\n throw HoloError.notFound(`No protocol found for ${req.method} /${nativePath} on family ${wireFamily}`);\n }\n\n if (route.streaming) req.body.stream = true;\n if (req.query.alt === 'sse') req.body.stream = true;\n\n const protocolName = route.protocol.name;\n logger.debug(`Custom route resolved: family=${wireFamily} app=${appSlug} protocol=${protocolName}`);\n\n const auth = req.auth;\n if (!auth) throw new Error('Unauthorized request. No auth object found.');\n\n const application = auth.application;\n if (!application) {\n throw HoloError.unauthorized(`Application \"${appSlug}\" not found or not accessible`);\n }\n\n // List-models endpoint: no `model` field in body. Aggregate the\n // application's allowed models, scoped to this app, rendered in\n // the wire family's native list-models shape.\n if (route.protocol.capability === 'models') {\n res.status(200).json(await this.listModelsForApps([application], wireFamily));\n return;\n }\n\n // Other no-model capabilities (e.g., metrics) pass through to same-family.\n if (route.protocol.capability === 'metrics') {\n return this.processRequest(wireFamily, protocolName, req, res);\n }\n\n const modelName = wirePlugin.getModelNameFromRequest(req.body, protocolName);\n if (!modelName) {\n throw HoloError.badRequest(`Request body does not contain a model for protocol ${protocolName}`);\n }\n\n const {model, provider: targetProvider} = await this.resolveModelProvider(application, modelName);\n if (auth.userId && !(await this.accessService.hasModelAccess(auth.organizationId, auth.userId, application.id, modelName))) {\n throw HoloError.forbidden(`User does not have access to model \"${modelName}\" in application \"${appSlug}\"`);\n }\n\n const targetPluginRow = await this.pluginDB.getById(targetProvider.plugin_id);\n const targetFamily = targetPluginRow?.family.toLowerCase() ?? '';\n\n const wireFamilyLower = wireFamily.toLowerCase();\n const sameProviderAsApp = application.provider && model.provider_id === application.provider.id;\n\n if (targetFamily === wireFamilyLower && sameProviderAsApp) {\n return this.processRequest(wireFamily, protocolName, req, res);\n }\n\n const targetPlugin = await this.pluginRegistry.getOrLoad(targetProvider.plugin_id);\n const targetProtocolName = (targetPlugin as any).getProtocolByCapability?.(route.protocol.capability);\n if (!targetProtocolName) {\n throw HoloError.badRequest(`Target plugin ${targetFamily} does not declare a protocol for capability ${route.protocol.capability}`);\n }\n const targetProtocol = await this.providerPluginService.getProtocol(targetProvider.plugin_id, targetProtocolName);\n if (!targetProtocol) {\n throw HoloError.notFound(`Target protocol ${targetProtocolName} not registered for plugin ${targetProvider.plugin_id}`);\n }\n\n logger.info(`Cross-translation: wire=${wireFamily}/${protocolName} → target=${targetFamily}/${targetProtocolName}`);\n\n const workerRequest = await this.parseRequest(targetProvider, targetProtocol, req, application);\n workerRequest.isHoloNative = true;\n workerRequest.wireFamily = wireFamilyLower;\n workerRequest.wireProtocolName = protocolName;\n\n await this.notificationService.publish(NotificationEventFactory.fromAuthAndRequest('request_started', auth, workerRequest, 'Request started'));\n await this.responseService.sendRequest(req, res, workerRequest);\n\n logger.info(`Cross-translation request dispatched: ${workerRequest.requestId}`);\n }\n\n /**\n * Aggregate the union of models declared by the given applications and\n * render them in the wire family's native /v1/models shape. Used by both\n * the family-level `/v1/models` route handler and the per-app\n * `/api/custom/{family}/{appSlug}/v1/models` route.\n *\n * Each backing provider returns canonical {@link DiscoveredModel}s\n * filtered to the app-allowed names; the wire family's plugin then\n * renders the combined list in its own response shape so a client\n * calling /api/custom/openai/{app}/v1/models always sees an OpenAI list,\n * even when the app's models live on a different provider family.\n */\n async listModelsForApps(apps: Application[], wireFamily: string): Promise<unknown> {\n const providerToNames = new Map<string, Set<string>>();\n for (const a of apps) {\n for (const m of (a.models ?? [])) {\n if (!m.provider_id) continue;\n let names = providerToNames.get(m.provider_id);\n if (!names) providerToNames.set(m.provider_id, names = new Set());\n names.add(m.name);\n }\n }\n\n const canonicalGroups = await Promise.all(\n Array.from(providerToNames.entries()).map(async ([providerId, names]) => {\n const impl = await this.providerImplService.getProviderImplById(providerId);\n const all = await impl.discoverModels();\n return all.filter(m => names.has(m.name) || names.has(m.accessModel));\n })\n );\n const canonical = canonicalGroups.flat();\n\n const wirePlugin = this.pluginRegistry.findByFamily(wireFamily);\n return wirePlugin.formatModelsResponse(canonical);\n }\n\n async resolveModelProvider(application: Application, modelName: string): Promise<{\n model: Model,\n provider: Provider\n }> {\n const model = (application.models ?? []).find(m => m.access_model === modelName || m.name === modelName);\n if (!model) {\n throw HoloError.forbidden(`Model \"${modelName}\" not available in application \"${application.url_slug}\"`);\n }\n if (!model.provider_id) {\n throw HoloError.notFound(`Model \"${modelName}\" has no provider configured`);\n }\n if (application.provider && model.provider_id === application.provider.id) {\n return {model, provider: application.provider};\n }\n const provider = await this.providerService.getById(model.provider_id);\n if (!provider) {\n throw HoloError.notFound(`Provider ${model.provider_id} for model \"${modelName}\" not found`);\n }\n return {model, provider};\n }\n\n async processRequest(family: string, protocolName: string, req: HoloApiRequest, res: Response, isPassthrough: boolean = false) {\n const logger = this.mlog(this.processRequest);\n const {auth} = req;\n\n if (!auth) {\n throw new Error('Unauthorized request. No auth object found.');\n }\n\n let {application, applications} = auth;\n let provider = null;\n const familyLower = family.toLowerCase();\n\n if (!application) {\n if (!applications.length) {\n throw new Error('Unauthorized request. No app or available apps found.');\n }\n logger.debug(`No app defined, finding ${family} in applications`);\n for (const candidate of applications) {\n const candidateProvider = candidate.provider!;\n const candidatePlugin = await this.pluginDB.getById(candidateProvider.plugin_id);\n if (candidatePlugin?.family.toLowerCase() !== familyLower) continue;\n\n provider = await this.providerImplService.getProviderImplById(candidateProvider.id);\n const modelName = provider.plugin.getModelNameFromRequest(req.body, protocolName);\n if (modelName && auth.userId && await this.accessService.hasModelAccess(auth.organizationId, auth.userId, candidate.id, modelName)) {\n logger.debug(`No app declared. Defaulting to: ${candidate.url_slug}`);\n application = candidate;\n break;\n }\n }\n\n if (!application) {\n throw new Error('Unauthorized request. No authorized apps have the model requested.');\n }\n }\n\n req.auth!.application = application;\n const protocol = await this.providerPluginService.getProtocol(application.provider!.plugin_id, protocolName);\n if (!protocol) {\n throw new Error(`Plugin ${application.provider!.plugin_id} does not declare protocol ${protocolName}`);\n }\n\n logger.info(`Creating request for application: ${application.name} and provider: ${application.provider!.name}`);\n const workerRequest = await this.parseRequest(application.provider!, protocol, req, application, isPassthrough);\n\n if (application.guards?.length) {\n if (!provider) {\n provider = await this.providerImplService.getProviderImplById(application.provider!.id);\n }\n const guardDetails = application.guards.map(g => ({\n id: g.id,\n name: g.model,\n provider: g.provider\n }));\n logger.debug(`Executing ${application.guards.length} guard(s) for request: ${JSON.stringify(guardDetails)}`);\n await this.notificationService.publish(NotificationEventFactory.fromAuthAndRequest('guard_started', auth, workerRequest, 'Running guards'));\n const results = await this.guardService.guard(provider, workerRequest, application.guards, auth);\n await this.notificationService.publish(NotificationEventFactory.fromAuthAndRequest(results?.passed ? 'guard_passed' : 'guard_failed', auth, workerRequest, 'Running guards'));\n }\n\n await this.notificationService.publish(NotificationEventFactory.fromAuthAndRequest('request_started', auth, workerRequest, 'Request started'));\n await this.responseService.sendRequest(req, res, workerRequest);\n\n logger.info(`Request processed: ${protocol.name}`, {\n requestId: workerRequest.requestId\n });\n }\n\n async parseRequest(provider: Provider, protocol: Protocol, req: HoloApiRequest, application: Application, isPassthrough: boolean = false) {\n return WorkerRequestFactory.fromRequest(provider, protocol, req, this.serverId, application, isPassthrough);\n }\n}\n\nfunction matchRoute(routes: RouteDefinition[], method: string, nativePath: string): RouteDefinition | undefined {\n const wantMethod = method.toLowerCase();\n const requestSegments = nativePath.split('/').filter(s => s.length > 0);\n for (const route of routes) {\n if (route.method.toLowerCase() !== wantMethod) continue;\n for (const path of route.paths) {\n const routeSegments = path.split('/').filter(s => s.length > 0);\n if (routeSegments.length !== requestSegments.length) continue;\n let match = true;\n for (let i = 0; i < routeSegments.length; i++) {\n if (routeSegments[i].startsWith(':')) continue;\n if (routeSegments[i] !== requestSegments[i]) {\n match = false;\n break;\n }\n }\n if (match) return route;\n }\n }\n return undefined;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {QueueService} from \"./index\";\nimport {env} from '../env';\nimport logger from \"../utils/logger\";\nimport {ServerDB} from \"../db\";\nimport {ServerType} from \"@holokai/holo-types/entities\";\n\n@injectable()\nexport class AdminService {\n\n constructor(\n private queueService: QueueService,\n private readonly serverDB: ServerDB\n ) {\n }\n\n async registerServer(name: string, type: ServerType) {\n const server = await this.serverDB.upsert(name, type);\n\n if (!server) {\n throw new Error(`Unable to register server.`);\n }\n }\n\n async restartWorker(workerId: string, _payload: object) {\n try {\n logger.info(`Received restart command for worker ${workerId}`);\n\n // Send success response before shutting down\n const response: { workerId: string; status: string } = {\n workerId: workerId,\n status: 'restarting'\n };\n\n // Schedule shutdown after response is sent\n setTimeout(() => {\n logger.info(`Worker ${workerId} shutting down after restart command`);\n process.exit(0);\n }, 1000);\n\n return response;\n } catch (error: any) {\n logger.error(`Error handling restart command: ${error.message}`);\n throw error;\n }\n }\n\n async sendAdminResponse(workerId: string, routingKey: string, messageId: string, data: object) {\n await this.queueService.sendToExchange(\n env.queue.adminResponseExchange,\n routingKey,\n {\n messageId,\n workerId,\n timestamp: Date.now(),\n ...data\n }\n );\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {v4 as uuidv4, validate as isUUID} from 'uuid';\nimport {ClassLogger, HoloError, pickDefined} from '@holokai/holo-sdk';\nimport {ApplicationDB, ModelDB, ProtocolDB, ProviderDB} from '../db';\nimport {ProviderPluginService} from './plugin';\nimport type {HoloWorkerRequest} from '@holokai/holo-types/worker';\nimport type {HoloRequest} from '@holokai/holo-types/holo';\nimport type {Auth} from '@holokai/holo-types/api';\nimport type {Application, Protocol, Provider} from '@holokai/holo-types/entities';\nimport {ProtocolCapability} from '@holokai/holo-types/entities';\nimport {env} from '../env';\n\nexport interface HoloResolvedTarget {\n provider: Provider;\n protocol: Protocol;\n application?: Application;\n model: string;\n}\n\n@injectable()\nexport class HoloRequestService extends ClassLogger {\n private serverId: string = env.api.apiServerId;\n\n constructor(\n private readonly modelDB: ModelDB,\n private readonly providerDB: ProviderDB,\n private readonly applicationDB: ApplicationDB,\n private readonly protocolDB: ProtocolDB,\n private readonly providerPluginService: ProviderPluginService,\n ) {\n super();\n }\n\n async resolveTarget(auth: Auth, request: HoloRequest): Promise<HoloResolvedTarget> {\n if (request.application) {\n return this.resolveFromApplication(auth, request);\n }\n\n if (request.model) {\n return this.resolveFromModel(auth, request);\n }\n\n throw HoloError.badRequest('Either model or application must be specified');\n }\n\n async resolveTargetForCapability(\n auth: Auth,\n request: HoloRequest,\n capability: ProtocolCapability,\n protocolName?: string,\n ): Promise<HoloResolvedTarget> {\n if (request.provider) {\n const provider = await this.resolveProvider(request.provider);\n const protocol = await this.resolveProtocol(provider.plugin_id, protocolName, capability);\n return {provider, protocol, model: ''};\n }\n const target = await this.resolveTarget(auth, request);\n target.protocol = await this.resolveProtocol(target.provider.plugin_id, protocolName, capability);\n return target;\n }\n\n async findProtocolByCapability(pluginId: string, capability: ProtocolCapability): Promise<Protocol> {\n const cached = this.providerPluginService.getProtocolByCapability(pluginId, capability);\n if (cached) return cached;\n\n const protocols = await this.protocolDB.getByPlugin(pluginId);\n const protocol = protocols.find(p => p.capability === capability);\n if (!protocol) {\n throw HoloError.badRequest(`No ${capability} protocol found for plugin: ${pluginId}`);\n }\n return protocol;\n }\n\n async resolveProtocol(pluginId: string, protocolName?: string, fallbackCapability: ProtocolCapability = ProtocolCapability.CHAT): Promise<Protocol> {\n if (!protocolName) {\n return this.findProtocolByCapability(pluginId, fallbackCapability);\n }\n\n const protocols = await this.protocolDB.getByPlugin(pluginId);\n const protocol = protocols.find(p => p.name === protocolName);\n if (!protocol) {\n throw HoloError.badRequest(`Protocol '${protocolName}' not found for plugin: ${pluginId}`);\n }\n return protocol;\n }\n\n buildWorkerRequest(\n auth: Auth,\n target: HoloResolvedTarget,\n request: HoloRequest,\n rawRequest: { path: string; method: string; headers: Record<string, any>; query: Record<string, any> },\n ): HoloWorkerRequest {\n const {provider, protocol, application} = target;\n\n return pickDefined({\n organizationId: auth.organizationId,\n application,\n provider,\n protocol,\n sourceId: this.serverId,\n appSlug: application?.url_slug,\n userId: auth.userId,\n clientIdentifier: auth.clientIdentifier,\n tokenType: auth.tokenType,\n requestId: uuidv4(),\n payload: request,\n timestamp: new Date().toISOString(),\n isStreaming: request.stream === true,\n threadId: request.thread_id,\n branchId: request.branch,\n httpRequestDetails: rawRequest,\n isHoloNative: true,\n guards: application?.guards,\n systemPrompt: application?.system_prompt,\n }) as HoloWorkerRequest;\n }\n\n private async resolveFromApplication(auth: Auth, request: HoloRequest): Promise<HoloResolvedTarget> {\n const logger = this.mlog(this.resolveFromApplication);\n const slug = request.application!;\n\n const application = await this.applicationDB.getBySlug(auth.organizationId, slug);\n if (!application) {\n throw HoloError.notFound(`Application '${slug}'`);\n }\n\n const provider = application.provider!;\n const protocol = await this.findChatProtocol(provider.plugin_id);\n\n const model = request.model || this.getDefaultModel(application);\n\n logger.info(`Resolved application ${slug} → provider ${provider.name}, model ${model}`);\n return {provider, protocol, application, model};\n }\n\n private async resolveFromModel(auth: Auth, request: HoloRequest): Promise<HoloResolvedTarget> {\n const logger = this.mlog(this.resolveFromModel);\n const modelRef = request.model;\n\n if (isUUID(modelRef)) {\n const model = await this.modelDB.getById(modelRef);\n if (!model) {\n throw HoloError.notFound(`Model '${modelRef}'`);\n }\n const provider = await this.providerDB.getById(model.provider_id);\n if (!provider) {\n throw HoloError.notFound(`Provider for model '${modelRef}'`);\n }\n const protocol = await this.findChatProtocol(provider.plugin_id);\n logger.info(`Resolved model UUID ${modelRef} → provider ${provider.name}`);\n return {provider, protocol, model: model.access_model || model.name};\n }\n\n if (request.provider) {\n const provider = await this.resolveProvider(request.provider);\n const models = await this.modelDB.listByProvider(provider.id);\n const model = models.find(m => m.access_model === modelRef || m.name === modelRef);\n if (!model) {\n throw HoloError.notFound(`Model '${modelRef}' for provider '${provider.name}'`);\n }\n const protocol = await this.findChatProtocol(provider.plugin_id);\n logger.info(`Resolved model ${modelRef} → provider ${provider.name} (provider-scoped)`);\n return {provider, protocol, model: modelRef};\n }\n\n const models = await this.modelDB.list();\n const model = models.find(m => m.access_model === modelRef || m.name === modelRef);\n if (!model) {\n throw HoloError.notFound(`Model '${modelRef}'`);\n }\n\n const provider = await this.providerDB.getById(model.provider_id);\n if (!provider) {\n throw HoloError.notFound(`Provider for model '${modelRef}'`);\n }\n\n if (auth.userId) {\n const apps = auth.applications || [];\n const hasAccess = apps.some(app =>\n app.provider_id === provider.id\n );\n if (!hasAccess) {\n throw HoloError.forbidden(`No access to model: ${modelRef}`);\n }\n }\n\n const protocol = await this.findChatProtocol(provider.plugin_id);\n\n logger.info(`Resolved model ${modelRef} → provider ${provider.name}`);\n return {provider, protocol, model: modelRef};\n }\n\n private async resolveProvider(ref: string): Promise<Provider> {\n if (isUUID(ref)) {\n const provider = await this.providerDB.getById(ref);\n if (!provider) throw HoloError.notFound(`Provider '${ref}'`);\n return provider;\n }\n const provider = await this.providerDB.get(ref);\n if (!provider) throw HoloError.notFound(`Provider '${ref}'`);\n return provider;\n }\n\n private async findChatProtocol(pluginId: string): Promise<Protocol> {\n return this.findProtocolByCapability(pluginId, ProtocolCapability.CHAT);\n }\n\n private getDefaultModel(application: Application): string {\n const models = application.models || [];\n if (models.length > 0) {\n return models[0].access_model || models[0].name;\n }\n throw HoloError.badRequest(`Application '${application.name}' has no models configured`);\n }\n}\n","export {AuditService} from './audit.service';\nexport {GuardService} from './guard.service';\nexport {InitService} from './init.service';\nexport {QueueService} from './queue.service';\nexport {NotificationService} from './notification.service';\nexport {RedisService} from './redis.service';\nexport {RequestService} from './request.service';\nexport {ResponseService} from './response.service';\nexport {WorkerRequestFactory} from './worker.request.factory';\nexport * from './auth';\nexport * from './entities';\nexport * from './plugin';\nexport {AdminService} from \"./admin.service\";\nexport {PricingService} from \"./pricing.service\";\nexport {HoloRequestService} from \"./holo.request.service\";\nexport {DatastoreService} from \"./datastore.service\";\nexport {AuditMappingService} from \"./audit.mapping.service\";\n","import {type NextFunction, type Request, type Response} from \"express\";\nimport logger from \"../../utils/logger\";\nimport {HoloError} from '@holokai/holo-sdk';\n\nexport const errorMiddleware = async (\n err: Error,\n req: Request,\n res: Response,\n _next: NextFunction\n): Promise<void> => {\n const isHoloError = err instanceof HoloError;\n const statusCode = isHoloError ? err.statusCode : 500;\n const code = isHoloError ? err.code : 'internal_error';\n\n const logFn = statusCode < 500 ? logger.warn : logger.error;\n logFn(`${err.message}`, {\n stack: err.stack,\n url: req.url,\n method: req.method,\n statusCode,\n code,\n });\n\n res.status(statusCode).json({\n success: false,\n error: {\n message: err.message || 'Internal Server Error',\n code,\n ...(process.env.NODE_ENV === 'development' && {stack: err.stack})\n },\n timestamp: new Date().toISOString()\n });\n};\n","import {type NextFunction, type Request, type Response} from 'express';\nimport {env} from '../../env';\n\nfunction matchesPattern(origin: string, pattern: string): boolean {\n if (!pattern.includes('*')) return pattern === origin;\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n return new RegExp(`^${escaped}$`).test(origin);\n}\n\nfunction isOriginAllowed(origin: string | undefined): origin is string {\n return !!origin && env.security.corsAllowedOrigins.some(p => matchesPattern(origin, p));\n}\n\nexport const corsMiddleware = async (\n req: Request,\n res: Response,\n next: NextFunction,\n): Promise<void> => {\n const origin = req.headers.origin;\n if (isOriginAllowed(origin)) {\n res.header('Access-Control-Allow-Origin', origin);\n res.header('Vary', 'Origin');\n res.header('Access-Control-Allow-Headers', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(isOriginAllowed(origin) ? 204 : 403).end();\n return;\n }\n\n next();\n};\n","import {type NextFunction, type RequestHandler, type Response} from 'express';\nimport {type HoloApiRequest} from '../types';\nimport {AuthService, extractAppSlug, extractToken} from \"../../services/auth/auth.service\";\nimport {HoloError} from '@holokai/holo-sdk';\n\ntype AuthOptions = {\n useCache?: boolean;\n optional?: boolean;\n allowJwt?: boolean;\n allowHoloToken?: boolean;\n allowAnonymous?: boolean;\n providerFamily?: string;\n};\n\nexport function makeAuthMiddleware(authService: AuthService, opts: AuthOptions = {}): RequestHandler {\n const {\n useCache = true,\n optional = false,\n allowJwt = true,\n allowHoloToken = true,\n allowAnonymous = false,\n providerFamily,\n } = opts;\n\n return async function authenticate(req: HoloApiRequest, _res: Response, next: NextFunction): Promise<void> {\n const token = extractToken(req);\n const clientIdentifier = req.headers['x-client-user'] as string | undefined;\n const appSlug = extractAppSlug(req);\n\n try {\n if (token?.startsWith('holo_') && allowHoloToken) {\n req.auth = await authService.authenticateHoloToken(token, appSlug, providerFamily);\n } else if (token && !token.startsWith('holo_') && allowJwt) {\n req.auth = await authService.authenticateJwt(token, appSlug, providerFamily, useCache);\n } else if (appSlug && allowAnonymous) {\n req.auth = await authService.authenticateAnonymous(appSlug, providerFamily);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n next(HoloError.forbidden(errorMessage));\n return;\n }\n\n if (!req.auth && !optional) {\n next(HoloError.unauthorized('Authentication required'));\n return;\n }\n\n if (req.auth && clientIdentifier) {\n req.auth.clientIdentifier = clientIdentifier;\n }\n\n next();\n };\n}\n","export * from './error.middleware';\nexport * from './cors.middleware';\nexport * from './auth.middleware';\n","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {ClassLogger} from \"@holokai/holo-sdk\";\nimport {RequestService} from \"../request.service\";\nimport {type IProviderPlugin, PluginType, type RouteDefinition, RouteHandler} from \"@holokai/holo-types\";\nimport {type NextFunction, Router} from \"express\";\nimport {type Plugin} from \"@holokai/holo-types/entities\";\nimport {type HoloApiRequest} from \"../../api/types\";\nimport {type ApiResponse} from \"../../utils\";\nimport {makeAuthMiddleware} from \"../../api/middleware\";\nimport {PluginRegistry} from \"./plugin.registry\";\nimport {AuthService} from \"../auth\";\nimport {PluginDB} from \"../../db\";\n\n@injectable()\nexport class PluginRouteService extends ClassLogger {\n private apiRouter: Router | null = null;\n\n constructor(\n private authService: AuthService,\n private pluginRegistry: PluginRegistry,\n private requestService: RequestService,\n private pluginDB: PluginDB,\n ) {\n super();\n }\n\n async registerRoutes(router: Router): Promise<void> {\n this.apiRouter = router;\n const log = this.mlog(this.registerRoutes);\n log.info('Registering plugin routes...');\n\n const registeredFamilies = new Set<string>();\n\n for (const [pluginId, plugin] of this.pluginRegistry.allLoaded()) {\n if (plugin.type !== PluginType.PROVIDER) continue;\n\n const family = plugin.family?.toUpperCase();\n if (!family || registeredFamilies.has(family)) continue;\n registeredFamilies.add(family);\n\n const pluginRow = await this.pluginDB.getById(pluginId);\n if (!pluginRow) continue;\n\n await this.registerPluginRoute(pluginRow, plugin as IProviderPlugin, router);\n }\n }\n\n async registerPluginRoute(plugin: Plugin, pluginImpl: IProviderPlugin, router?: Router): Promise<void> {\n const log = this.mlog(this.registerPluginRoute);\n const target = router ?? this.apiRouter;\n if (!target) {\n log.warn('No API router available for route registration');\n return;\n }\n\n const family = plugin.family.toLowerCase();\n log.info(`Registering routes for family: ${family} (route shape from plugin ${pluginImpl.name})`);\n\n const pluginRouter = Router();\n const authMiddleware = makeAuthMiddleware(this.authService, {useCache: true, providerFamily: family});\n\n // Routes are family-stable: HTTP paths and protocol names don't drift between plugin\n // versions. Bind the route shape from any version's `getRoutes()`, but DO NOT capture a\n // specific Plugin/Protocol entity in the handler — the handler resolves the right plugin\n // version per-request from the authenticated app's provider.plugin_id.\n for (const route of pluginImpl.getRoutes()) {\n let handler;\n switch (route.handler) {\n case RouteHandler.MODELS:\n handler = this.createModelsHandler(family);\n break;\n case RouteHandler.REQUEST: {\n handler = this.createRequestHandler(family, route.protocol.name);\n break;\n }\n default:\n handler = this.createNoOpHandler(family);\n break;\n }\n\n const method = route.method.toLowerCase() as 'get' | 'post';\n const paramInjector = this.createParamInjector(route);\n for (const path of route.paths) {\n pluginRouter[method](`${path}`, authMiddleware, paramInjector, handler);\n }\n }\n\n if (plugin.active) {\n target.use(`/${family}`, pluginRouter);\n }\n }\n\n private createParamInjector(route: RouteDefinition) {\n return (req: HoloApiRequest, _res: ApiResponse, next: NextFunction) => {\n if (req.params) {\n for (const [key, value] of Object.entries(req.params)) {\n if (req.body[key] === undefined) {\n req.body[key] = value;\n }\n }\n }\n if (route.streaming) {\n req.body.stream = true;\n }\n if (req.query.alt === 'sse') {\n req.body.stream = true;\n }\n next();\n };\n }\n\n private createModelsHandler(family: string) {\n return async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {auth} = req;\n if (!auth) {\n res.status(401).json({error: 'Unauthorized'});\n return;\n }\n try {\n const apps = auth.application ? [auth.application] : auth.applications;\n res.status(200).json(await this.requestService.listModelsForApps(apps, family));\n } catch (error) {\n res.status(500).json({error: (error as Error).message});\n }\n };\n }\n\n private createRequestHandler(family: string, protocolName: string) {\n return async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n try {\n await this.requestService.processRequest(family, protocolName, req, res);\n } catch (e: any) {\n this.log.error(`Error handling ${family} ${protocolName} request: ${e?.message ?? e}`);\n res.status(500).json({error: 'Failed to process request'});\n }\n };\n }\n\n private createNoOpHandler(providerFamily: string) {\n return async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const log = this.mlog(`${providerFamily}NoOpHandler`);\n log.debug(`Received data: ${JSON.stringify(req.body)}`);\n res.status(204);\n }\n }\n}\n","import {pickDefined} from '@holokai/holo-sdk';\nimport {type SourceModelObservation} from './types';\n\nexport interface OpenRouterModel {\n id: string;\n canonical_slug?: string;\n name?: string;\n description?: string;\n architecture?: {\n modality?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n tokenizer?: string;\n };\n supported_parameters?: string[];\n default_parameters?: Record<string, any>;\n context_length?: number;\n pricing?: {\n prompt?: string;\n completion?: string;\n request?: string;\n image?: string;\n };\n created?: number;\n top_provider?: {\n context_length?: number;\n };\n}\n\ninterface OpenRouterResponse {\n data: OpenRouterModel[];\n}\n\nexport const PROVIDER_PREFIX_TO_FAMILY: Record<string, string> = {\n anthropic: 'claude',\n openai: 'openai',\n google: 'gemini',\n meta: 'llama',\n 'meta-llama': 'llama',\n mistralai: 'mistral',\n cohere: 'cohere',\n deepseek: 'deepseek',\n qwen: 'qwen',\n};\n\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/models';\nconst CACHE_TTL_MS = 60 * 60 * 1000;\n\nlet cachedModels: OpenRouterModel[] | null = null;\nlet cacheExpiry = 0;\n\nexport async function fetchOpenRouterModels(): Promise<OpenRouterModel[]> {\n const now = Date.now();\n if (cachedModels && now < cacheExpiry) return cachedModels;\n\n const res = await fetch(OPENROUTER_API_URL);\n if (!res.ok) throw new Error(`OpenRouter API returned ${res.status}`);\n\n const body = await res.json() as OpenRouterResponse;\n cachedModels = body.data;\n cacheExpiry = now + CACHE_TTL_MS;\n return cachedModels;\n}\n\nexport function toSourceModels(orModels: OpenRouterModel[]): SourceModelObservation[] {\n const results: SourceModelObservation[] = [];\n\n for (const orModel of orModels) {\n const slash = orModel.id.indexOf('/');\n if (slash < 0) continue;\n\n const prefix = orModel.id.substring(0, slash);\n const suffix = orModel.id.substring(slash + 1);\n const providerFamily = PROVIDER_PREFIX_TO_FAMILY[prefix] ?? prefix;\n const arch = orModel.architecture;\n const pricing = orModel.pricing;\n\n results.push({\n source: 'openrouter',\n externalId: orModel.id,\n canonicalCandidate: orModel.canonical_slug ?? orModel.id,\n name: orModel.name ?? suffix,\n providerFamily,\n canInsert: true,\n ...pickDefined({\n description: orModel.description,\n contextLength: orModel.context_length,\n modality: arch?.modality,\n inputModalities: arch?.input_modalities,\n outputModalities: arch?.output_modalities,\n supportedParameters: orModel.supported_parameters,\n capabilities: orModel.default_parameters ? {default_parameters: orModel.default_parameters} : undefined,\n }),\n ...pickDefined({\n pricing: pricing ? pickDefined({\n input: pricing.prompt ? parseFloat(pricing.prompt) : undefined,\n output: pricing.completion ? parseFloat(pricing.completion) : undefined,\n }) as SourceModelObservation['pricing'] : undefined,\n metadata: pickDefined({\n tokenizer: arch?.tokenizer,\n created: orModel.created,\n canonical_slug: orModel.canonical_slug,\n }) as SourceModelObservation['metadata'],\n }),\n } as SourceModelObservation);\n }\n\n return results;\n}\n","import {pickDefined} from '@holokai/holo-sdk';\nimport {type SourceModelObservation} from './types';\n\nexport interface LiteLLMModel {\n input_cost_per_token?: number;\n output_cost_per_token?: number;\n cache_creation_input_token_cost?: number;\n cache_read_input_token_cost?: number;\n max_input_tokens?: number;\n max_output_tokens?: number;\n max_tokens?: number;\n mode?: string;\n litellm_provider?: string;\n supports_function_calling?: boolean;\n supports_vision?: boolean;\n supports_prompt_caching?: boolean;\n supports_reasoning?: boolean;\n supports_pdf_input?: boolean;\n supports_computer_use?: boolean;\n}\n\nconst LITELLM_URL = 'https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json';\nconst CACHE_TTL_MS = 60 * 60 * 1000;\n\nlet cachedData: Record<string, LiteLLMModel> | null = null;\nlet cacheExpiry = 0;\n\nconst GATEWAY_PREFIXES = [\n 'azure/', 'bedrock/', 'vertex_ai/', 'vertex_ai_beta/', 'sagemaker/',\n 'together_ai/', 'fireworks_ai/', 'anyscale/', 'replicate/', 'deepinfra/',\n 'ai21/', 'palm/', 'voyage/',\n];\n\nconst REGIONAL_MARKERS = ['/eu/', '/us/', '/us-east/', '/us-west/', '/ap-', '/eu-'];\n\nexport const LITELLM_PROVIDER_TO_FAMILY: Record<string, string> = {\n openai: 'openai',\n anthropic: 'claude',\n google: 'gemini',\n mistral: 'mistral',\n cohere: 'cohere',\n deepseek: 'deepseek',\n};\n\nexport function isBaseModel(key: string): boolean {\n if (GATEWAY_PREFIXES.some(p => key.startsWith(p))) return false;\n if (REGIONAL_MARKERS.some(m => key.includes(m))) return false;\n if (key === 'sample_spec') return false;\n return true;\n}\n\nexport function extractBaseModelId(key: string): string {\n const slashIdx = key.indexOf('/');\n if (slashIdx >= 0) return key.substring(slashIdx + 1);\n\n const dotIdx = key.indexOf('.');\n if (dotIdx >= 0) {\n const prefix = key.substring(0, dotIdx);\n if (LITELLM_PROVIDER_TO_FAMILY[prefix]) {\n return key.substring(dotIdx + 1);\n }\n }\n\n return key;\n}\n\nexport async function fetchLiteLLMModels(): Promise<Record<string, LiteLLMModel>> {\n const now = Date.now();\n if (cachedData && now < cacheExpiry) return cachedData;\n\n const res = await fetch(LITELLM_URL);\n if (!res.ok) throw new Error(`LiteLLM fetch returned ${res.status}`);\n\n cachedData = await res.json() as Record<string, LiteLLMModel>;\n cacheExpiry = now + CACHE_TTL_MS;\n return cachedData;\n}\n\nfunction buildCapabilities(model: LiteLLMModel): Record<string, unknown> | undefined {\n const caps: Record<string, unknown> = {};\n if (model.supports_function_calling) caps.function_calling = true;\n if (model.supports_vision) caps.vision = true;\n if (model.supports_prompt_caching) caps.prompt_caching = true;\n if (model.supports_reasoning) caps.reasoning = true;\n if (model.supports_pdf_input) caps.pdf_input = true;\n if (model.supports_computer_use) caps.computer_use = true;\n return Object.keys(caps).length > 0 ? caps : undefined;\n}\n\nfunction inferProviderFamily(key: string, model: LiteLLMModel): string | undefined {\n if (model.litellm_provider) {\n const family = LITELLM_PROVIDER_TO_FAMILY[model.litellm_provider];\n if (family) return family;\n }\n\n const slashIdx = key.indexOf('/');\n if (slashIdx >= 0) {\n const prefix = key.substring(0, slashIdx);\n const family = LITELLM_PROVIDER_TO_FAMILY[prefix];\n if (family) return family;\n }\n\n return undefined;\n}\n\nexport function toLiteLLMSourceModels(data: Record<string, LiteLLMModel>): SourceModelObservation[] {\n const results: SourceModelObservation[] = [];\n\n for (const [key, model] of Object.entries(data)) {\n if (!isBaseModel(key)) continue;\n\n const baseId = extractBaseModelId(key);\n const providerFamily = inferProviderFamily(key, model);\n const contextLength = model.max_input_tokens ?? model.max_tokens;\n\n results.push({\n source: 'litellm',\n externalId: key,\n canonicalCandidate: baseId,\n name: baseId,\n canInsert: false,\n ...pickDefined({\n providerFamily,\n contextLength,\n capabilities: buildCapabilities(model),\n pricing: pickDefined({\n input: model.input_cost_per_token,\n output: model.output_cost_per_token,\n cacheRead: model.cache_read_input_token_cost,\n cacheWrite: model.cache_creation_input_token_cost,\n }) as SourceModelObservation['pricing'],\n metadata: pickDefined({\n mode: model.mode,\n litellm_provider: model.litellm_provider,\n max_output_tokens: model.max_output_tokens,\n }) as SourceModelObservation['metadata'],\n }),\n } as SourceModelObservation);\n }\n\n return results;\n}\n","import {type SourceModelObservation} from './types';\n\nexport interface ModelsDevModel {\n id: string;\n name?: string;\n family?: string;\n release_date?: string;\n modalities?: { input?: string[]; output?: string[] };\n cost?: {\n input?: number;\n output?: number;\n reasoning?: number;\n cache_read?: number;\n cache_write?: number;\n };\n limit?: { context?: number; input?: number; output?: number };\n reasoning?: boolean;\n tool_call?: boolean;\n attachment?: boolean;\n structured_output?: boolean;\n open_weights?: boolean;\n status?: string;\n knowledge?: string;\n}\n\nconst MODELSDEV_URL = 'https://models.dev/api.json';\nconst CACHE_TTL_MS = 60 * 60 * 1000;\n\nlet cachedModels: ModelsDevModel[] | null = null;\nlet cacheExpiry = 0;\n\nconst FAMILY_TO_PROVIDER: Record<string, string> = {\n gpt: 'openai', 'o1': 'openai', 'o3': 'openai', 'o4': 'openai',\n claude: 'claude',\n gemini: 'gemini',\n llama: 'llama',\n mistral: 'mistral',\n command: 'cohere',\n deepseek: 'deepseek',\n qwen: 'qwen',\n phi: 'phi',\n gemma: 'gemma',\n};\n\nconst QUANTIZATION_SUFFIXES = ['-fp8', '-fp16', '-bf16', '-q4', '-q5', '-q8', '-gguf', '-gptq', '-awq', '-exl2'];\n\nexport function isLikelyBaseModel(model: ModelsDevModel): boolean {\n const id = model.id.toLowerCase();\n\n if (!inferProviderFamily(model)) return false;\n\n if (QUANTIZATION_SUFFIXES.some(s => id.endsWith(s))) return false;\n if (id.includes('-gguf') || id.includes('-gptq') || id.includes('-awq')) return false;\n\n if (id.includes('/') && !id.startsWith('meta-llama/') && !id.startsWith('mistralai/')) {\n const prefix = id.substring(0, id.indexOf('/'));\n const knownOrgPrefixes = ['openai', 'anthropic', 'google', 'meta-llama', 'mistralai', 'cohere', 'deepseek', 'qwen'];\n if (!knownOrgPrefixes.includes(prefix)) return false;\n }\n\n return true;\n}\n\nfunction inferProviderFamily(model: ModelsDevModel): string | undefined {\n if (model.family) {\n const family = FAMILY_TO_PROVIDER[model.family.toLowerCase()];\n if (family) return family;\n }\n\n const id = model.id.toLowerCase();\n for (const [prefix, family] of Object.entries(FAMILY_TO_PROVIDER)) {\n if (id.startsWith(prefix)) return family;\n }\n\n return undefined;\n}\n\nfunction buildCapabilities(model: ModelsDevModel): Record<string, unknown> | undefined {\n const caps: Record<string, unknown> = {};\n if (model.reasoning) caps.reasoning = true;\n if (model.tool_call) caps.tool_call = true;\n if (model.attachment) caps.attachment = true;\n if (model.structured_output) caps.structured_output = true;\n return Object.keys(caps).length > 0 ? caps : undefined;\n}\n\nfunction convertStatus(status?: string): 'active' | 'preview' | 'deprecated' | 'shutdown' | undefined {\n if (!status) return undefined;\n const s = status.toLowerCase();\n if (s === 'ga' || s === 'active' || s === 'stable') return 'active';\n if (s === 'preview' || s === 'beta' || s === 'experimental') return 'preview';\n if (s === 'deprecated' || s === 'legacy') return 'deprecated';\n if (s === 'shutdown' || s === 'discontinued') return 'shutdown';\n return undefined;\n}\n\ninterface ModelsDevProvider {\n id?: string;\n name?: string;\n models?: Record<string, ModelsDevModel>;\n}\n\ntype ModelsDevResponse = Record<string, ModelsDevProvider>;\n\nexport async function fetchModelsDevModels(): Promise<ModelsDevModel[]> {\n const now = Date.now();\n if (cachedModels && now < cacheExpiry) return cachedModels;\n\n const res = await fetch(MODELSDEV_URL);\n if (!res.ok) throw new Error(`models.dev API returned ${res.status}`);\n\n const body = await res.json() as ModelsDevResponse;\n\n const flat: ModelsDevModel[] = [];\n for (const provider of Object.values(body)) {\n if (!provider.models) continue;\n for (const model of Object.values(provider.models)) {\n if (model.id) flat.push(model);\n }\n }\n\n cachedModels = flat;\n cacheExpiry = now + CACHE_TTL_MS;\n return cachedModels;\n}\n\nexport function toModelsDevSourceModels(models: ModelsDevModel[]): SourceModelObservation[] {\n const results: SourceModelObservation[] = [];\n const PER_MILLION = 1_000_000;\n\n for (const model of models) {\n if (!model.id) continue;\n\n const providerFamily = inferProviderFamily(model);\n const canInsert = isLikelyBaseModel(model);\n const cost = model.cost;\n const limit = model.limit;\n const status = convertStatus(model.status);\n\n const entry: SourceModelObservation = {\n source: 'modelsdev',\n externalId: model.id,\n name: model.name ?? model.id,\n canInsert,\n };\n if (providerFamily) entry.providerFamily = providerFamily;\n if (limit?.context != null) entry.contextLength = limit.context;\n if (model.modalities?.input) entry.inputModalities = model.modalities.input;\n if (model.modalities?.output) entry.outputModalities = model.modalities.output;\n if (model.open_weights != null) entry.isOpenSource = model.open_weights;\n if (model.release_date) entry.releaseDate = model.release_date;\n const caps = buildCapabilities(model);\n if (caps) entry.capabilities = caps;\n if (cost) {\n const p: NonNullable<SourceModelObservation['pricing']> = {};\n if (cost.input != null) p.input = cost.input / PER_MILLION;\n if (cost.output != null) p.output = cost.output / PER_MILLION;\n if (cost.cache_read != null) p.cacheRead = cost.cache_read / PER_MILLION;\n if (cost.cache_write != null) p.cacheWrite = cost.cache_write / PER_MILLION;\n if (Object.keys(p).length > 0) entry.pricing = p;\n }\n const meta: Record<string, unknown> = {};\n if (status) meta['status'] = status;\n if (model.knowledge) meta['knowledge'] = model.knowledge;\n if (limit?.input != null) meta['max_input_tokens'] = limit.input;\n if (limit?.output != null) meta['max_output_tokens'] = limit.output;\n if (Object.keys(meta).length > 0) entry.metadata = meta;\n\n results.push(entry);\n }\n\n return results;\n}\n","export type {SourceModelObservation, SourceModel, SourceName} from './types';\nexport {\n fetchOpenRouterModels,\n toSourceModels,\n PROVIDER_PREFIX_TO_FAMILY,\n} from './openrouter.source';\nexport type {OpenRouterModel} from './openrouter.source';\nexport {\n fetchLiteLLMModels,\n toLiteLLMSourceModels,\n isBaseModel,\n extractBaseModelId,\n LITELLM_PROVIDER_TO_FAMILY,\n} from './litellm.source';\nexport type {LiteLLMModel} from './litellm.source';\nexport {\n fetchModelsDevModels,\n toModelsDevSourceModels,\n isLikelyBaseModel,\n} from './modelsdev.source';\nexport type {ModelsDevModel} from './modelsdev.source';\n","import {normalizeModelName, stripChannel, stripDate, stripProviderRevision} from '@holokai/holo-sdk/matching';\nimport {type ModelAliasType, type ModelDictionaryAlias} from '@holokai/holo-types/entities';\n\ntype AliasInput = Omit<ModelDictionaryAlias, 'id' | 'created_at' | 'updated_at'>;\n\nexport function generateAliases(\n dictionaryId: string,\n canonicalId: string,\n providerFamily: string,\n canonicalSlug?: string,\n): AliasInput[] {\n const aliases: AliasInput[] = [];\n const seen = new Set<string>();\n\n const add = (raw: string, type: ModelAliasType, weight: number) => {\n const norm = normalizeModelName(raw);\n const key = `${norm.normalized}|${providerFamily}|openrouter`;\n if (seen.has(key)) return;\n seen.add(key);\n aliases.push({\n dictionary_id: dictionaryId,\n alias: raw,\n alias_normalized: norm.normalized,\n alias_type: type,\n provider_family: providerFamily,\n source: 'openrouter',\n source_key: 'openrouter',\n weight,\n active: true,\n });\n };\n\n // --- Source-derived aliases ---\n\n add(canonicalId, 'official', 100);\n\n const slash = canonicalId.indexOf('/');\n const suffix = slash >= 0 ? canonicalId.substring(slash + 1) : undefined;\n if (suffix) {\n add(suffix, 'reseller', 90);\n if (suffix.includes('.')) {\n add(suffix.replace(/\\./g, '-'), 'provider_api', 90);\n }\n }\n\n if (canonicalSlug && canonicalSlug !== canonicalId) {\n add(canonicalSlug, 'official', 95);\n const slugSlash = canonicalSlug.indexOf('/');\n if (slugSlash >= 0) {\n const slugSuffix = canonicalSlug.substring(slugSlash + 1);\n add(slugSuffix, 'reseller', 90);\n if (slugSuffix.includes('.')) {\n add(slugSuffix.replace(/\\./g, '-'), 'provider_api', 90);\n }\n\n const dateMatch = slugSuffix.match(/^(.+?)(\\d{4})(\\d{2})(\\d{2})$/);\n if (dateMatch) {\n const hyphenated = `${dateMatch[1]}${dateMatch[2]}-${dateMatch[3]}-${dateMatch[4]}`;\n add(hyphenated, 'provider_api', 85);\n if (hyphenated.includes('.')) {\n add(hyphenated.replace(/\\./g, '-'), 'provider_api', 85);\n }\n }\n }\n }\n\n // --- Match-oriented aliases ---\n\n // Fix 1: prefer canonicalSlug/suffix over canonicalId to avoid provider-prefix bias\n const sourceBase = canonicalSlug ?? suffix ?? canonicalId;\n const norm = normalizeModelName(sourceBase);\n const base = norm.normalized;\n\n // Date-stripped shorthand: claude-3-5-haiku-20241022 → claude-3-5-haiku\n const dateStripped = norm.dateHint ? stripDate(base) : undefined;\n if (dateStripped) {\n add(dateStripped, 'shorthand', 85);\n }\n\n // Provider-revision-stripped shorthand: gemini-2.0-flash-001 → gemini-2.0-flash\n const revisionStripped = stripProviderRevision(base);\n if (revisionStripped) {\n add(revisionStripped, 'shorthand', 85);\n }\n\n // Channel-stripped shorthand: gpt-4o-mini-audio-preview → gpt-4o-mini-audio\n const channelStripped = stripChannel(base);\n if (channelStripped) {\n add(channelStripped, 'shorthand', 82);\n }\n\n // Channel-stripped on date/revision-stripped form:\n // gpt-4o-realtime-preview-2024-12-17 → date-strip → gpt-4o-realtime-preview → channel-strip → gpt-4o-realtime\n const dateOrRevStripped = dateStripped ?? revisionStripped;\n if (dateOrRevStripped) {\n const chainedChannel = stripChannel(dateOrRevStripped);\n if (chainedChannel) {\n add(chainedChannel, 'shorthand', 80);\n }\n }\n\n // Shorthand base for downstream permutations (only when stripping produced something)\n const shorthandBase = dateStripped ?? revisionStripped;\n\n // Dot↔dash version permutations on the shorthand base\n const permBase = shorthandBase ?? base;\n if (permBase.includes('.')) {\n add(permBase.replace(/\\./g, '-'), 'heuristic', 70);\n } else if (norm.versionHint && norm.versionHint.includes('.')) {\n const dashVersion = norm.versionHint.replace(/\\./g, '-');\n const dotVersion = norm.versionHint;\n if (permBase.includes(dashVersion)) {\n add(permBase.replace(dashVersion, dotVersion), 'heuristic', 70);\n }\n }\n\n // Cross-channel runtime aliases: generate Ollama/LM Studio-style colon IDs from\n // OpenRouter catalog rows so that `llama3.1:8b` can match `meta-llama/llama-3.1-8b`.\n // These are not literal OpenRouter IDs — they bridge catalog entries to the compact\n // identifiers that local runtimes actually use.\n if (norm.versionHint && norm.sizeHint && norm.familyHint) {\n const family = norm.familyHint;\n const version = norm.versionHint;\n const size = norm.sizeHint;\n\n add(`${family}${version}:${size}`, 'runtime', 85);\n\n if (norm.variantHint) {\n add(`${family}${version}-${norm.variantHint}:${size}`, 'runtime', 85);\n }\n }\n\n return aliases;\n}\n","import {normalizeModelName} from '@holokai/holo-sdk/matching';\nimport {type ModelDictionary, type ModelDictionaryAlias} from '@holokai/holo-types/entities';\nimport {type SourceModelObservation} from '../sources/types';\nimport {generateAliases} from './alias-generator';\n\nexport interface DictionarySyncResult {\n synced: number;\n aliasesCreated: number;\n errors: string[];\n}\n\nexport interface DictionarySyncDeps {\n insertDictionary(entry: Omit<ModelDictionary, 'id' | 'created_at' | 'updated_at'>): Promise<ModelDictionary | null>;\n\n bulkInsertAliases(aliases: Array<Omit<ModelDictionaryAlias, 'id' | 'created_at' | 'updated_at'>>): Promise<number>;\n}\n\nfunction inferKind(modality?: string, outputModalities?: string[]): string {\n if (outputModalities?.includes('image')) return 'image';\n if (modality === 'text+image->text') return 'chat';\n return 'chat';\n}\n\nexport async function syncDictionary(\n sourceModels: SourceModelObservation[],\n deps: DictionarySyncDeps,\n): Promise<DictionarySyncResult> {\n let synced = 0;\n let aliasesCreated = 0;\n const errors: string[] = [];\n\n for (const sm of sourceModels) {\n try {\n const norm = normalizeModelName(sm.externalId);\n const canonicalId = sm.canonicalCandidate ?? sm.externalId;\n const providerFamily = sm.providerFamily ?? norm.providerHint ?? 'unknown';\n\n const entry = await deps.insertDictionary({\n canonical_id: canonicalId,\n canonical_id_normalized: norm.normalized,\n name: sm.name,\n normalized_name: norm.normalized,\n family: sm.externalId.includes('/') ? sm.externalId.substring(sm.externalId.indexOf('/') + 1) : undefined,\n provider_family: providerFamily,\n version_label: norm.versionHint,\n variant: norm.variantHint,\n size_label: norm.sizeHint,\n description: sm.description,\n context_length: sm.contextLength,\n modality: sm.modality,\n input_modalities: sm.inputModalities ?? [],\n output_modalities: sm.outputModalities ?? [],\n supported_parameters: sm.supportedParameters ?? [],\n default_parameters: (sm.capabilities as Record<string, any>)?.default_parameters ?? {},\n capabilities: sm.capabilities ?? {},\n tokenizer: (sm.metadata as Record<string, any>)?.tokenizer,\n kind: inferKind(sm.modality, sm.outputModalities),\n status: 'active',\n aliases: [],\n sources: [sm.source],\n base_input_cost: sm.pricing?.input,\n base_output_cost: sm.pricing?.output,\n base_cache_read_cost: sm.pricing?.cacheRead,\n base_cache_write_cost: sm.pricing?.cacheWrite,\n last_synced_at: new Date().toISOString(),\n } as Omit<ModelDictionary, 'id' | 'created_at' | 'updated_at'>);\n\n if (!entry) continue;\n synced++;\n\n const canonicalSlug = (sm.metadata as Record<string, any>)?.canonical_slug as string | undefined;\n const aliases = generateAliases(entry.id, sm.externalId, providerFamily, canonicalSlug);\n if (aliases.length > 0) {\n const count = await deps.bulkInsertAliases(aliases);\n aliasesCreated += count;\n }\n } catch (err) {\n errors.push(`${sm.externalId}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {synced, aliasesCreated, errors};\n}\n","import {normalizeModelName, stripChannel, stripDate, stripProviderRevision} from '@holokai/holo-sdk/matching';\nimport {type SourceModelObservation, type SourceName} from '../sources/types';\n\nexport interface CanonicalModelCandidate {\n canonicalId: string;\n canonicalIdNormalized: string;\n name: string;\n providerFamily: string;\n sources: SourceName[];\n observations: SourceModelObservation[];\n\n description?: string;\n contextLength?: number;\n modality?: string;\n inputModalities?: string[];\n outputModalities?: string[];\n supportedParameters?: string[];\n defaultParameters?: Record<string, any>;\n capabilities?: Record<string, unknown>;\n tokenizer?: string;\n kind?: string;\n isOpenSource?: boolean;\n releaseDate?: string;\n pricing?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n}\n\nexport interface CanonicalizationDecision {\n candidateKey: string;\n matchedObservationIds: string[];\n unmatchedObservationIds: string[];\n reasons: string[];\n}\n\ninterface Cluster {\n key: string;\n canonicalId: string;\n canonicalIdNormalized: string;\n name: string;\n providerFamily: string;\n observations: SourceModelObservation[];\n}\n\nconst FIELD_PRECEDENCE: Record<string, SourceName[]> = {\n pricing: ['litellm', 'openrouter', 'modelsdev'],\n contextLength: ['modelsdev', 'litellm', 'openrouter'],\n capabilities: ['modelsdev', 'litellm', 'openrouter'],\n inputModalities: ['modelsdev', 'openrouter'],\n outputModalities: ['modelsdev', 'openrouter'],\n isOpenSource: ['modelsdev'],\n releaseDate: ['modelsdev'],\n supportedParameters: ['openrouter'],\n defaultParameters: ['openrouter'],\n tokenizer: ['openrouter'],\n description: ['openrouter', 'modelsdev'],\n};\n\nfunction normalizeKey(id: string): string {\n return normalizeModelName(id).normalized;\n}\n\nfunction strippedVariants(normalized: string): string[] {\n const variants: string[] = [];\n const ds = stripDate(normalized);\n if (ds) variants.push(ds);\n const rs = stripProviderRevision(normalized);\n if (rs) variants.push(rs);\n const cs = stripChannel(normalized);\n if (cs) variants.push(cs);\n return variants;\n}\n\nfunction tryMatchCluster(\n candidateId: string,\n clusters: Map<string, Cluster>,\n clusterIndex: Map<string, string>,\n): Cluster | undefined {\n const normalized = normalizeKey(candidateId);\n\n const directKey = clusterIndex.get(normalized);\n if (directKey) return clusters.get(directKey);\n\n for (const variant of strippedVariants(normalized)) {\n const variantKey = clusterIndex.get(variant);\n if (variantKey) return clusters.get(variantKey);\n }\n\n return undefined;\n}\n\nfunction resolveField<T>(\n field: string,\n observations: SourceModelObservation[],\n extractor: (obs: SourceModelObservation) => T | undefined,\n): T | undefined {\n const precedence = FIELD_PRECEDENCE[field];\n if (!precedence) return undefined;\n\n for (const source of precedence) {\n for (const obs of observations) {\n if (obs.source === source) {\n const val = extractor(obs);\n if (val != null) return val;\n }\n }\n }\n return undefined;\n}\n\nfunction mergeCapabilities(observations: SourceModelObservation[]): Record<string, unknown> | undefined {\n const precedence = FIELD_PRECEDENCE['capabilities']!;\n const merged: Record<string, unknown> = {};\n let hasAny = false;\n\n for (const source of [...precedence].reverse()) {\n for (const obs of observations) {\n if (obs.source === source && obs.capabilities && Object.keys(obs.capabilities).length > 0) {\n Object.assign(merged, obs.capabilities);\n hasAny = true;\n }\n }\n }\n\n return hasAny ? merged : undefined;\n}\n\nfunction buildCandidate(cluster: Cluster): CanonicalModelCandidate {\n const obs = cluster.observations;\n\n const candidate: CanonicalModelCandidate = {\n canonicalId: cluster.canonicalId,\n canonicalIdNormalized: cluster.canonicalIdNormalized,\n name: cluster.name,\n providerFamily: cluster.providerFamily,\n sources: [...new Set(obs.map(o => o.source))],\n observations: obs,\n };\n\n const description = resolveField('description', obs, o => o.description);\n if (description != null) candidate.description = description;\n\n const contextLength = resolveField('contextLength', obs, o => o.contextLength);\n if (contextLength != null) candidate.contextLength = contextLength;\n\n const inputModalities = resolveField('inputModalities', obs, o => o.inputModalities?.length ? o.inputModalities : undefined);\n if (inputModalities) candidate.inputModalities = inputModalities;\n\n const outputModalities = resolveField('outputModalities', obs, o => o.outputModalities?.length ? o.outputModalities : undefined);\n if (outputModalities) candidate.outputModalities = outputModalities;\n\n const supportedParameters = resolveField('supportedParameters', obs, o => o.supportedParameters?.length ? o.supportedParameters : undefined);\n if (supportedParameters) candidate.supportedParameters = supportedParameters;\n\n const defaultParameters = resolveField('defaultParameters', obs, o => {\n const dp = (o.capabilities as Record<string, any>)?.default_parameters;\n return dp && Object.keys(dp).length > 0 ? dp : undefined;\n });\n if (defaultParameters) candidate.defaultParameters = defaultParameters;\n\n const capabilities = mergeCapabilities(obs);\n if (capabilities) candidate.capabilities = capabilities;\n\n const tokenizer = resolveField('tokenizer', obs, o => (o.metadata as Record<string, any>)?.tokenizer);\n if (tokenizer != null) candidate.tokenizer = tokenizer;\n\n const isOpenSource = resolveField('isOpenSource', obs, o => o.isOpenSource);\n if (isOpenSource != null) candidate.isOpenSource = isOpenSource;\n\n const releaseDate = resolveField('releaseDate', obs, o => o.releaseDate);\n if (releaseDate != null) candidate.releaseDate = releaseDate;\n\n const pricing = resolveField('pricing', obs, o => o.pricing);\n if (pricing) candidate.pricing = pricing;\n\n return candidate;\n}\n\nexport function buildCanonicalCandidates(\n observations: SourceModelObservation[],\n): {\n resolved: CanonicalModelCandidate[];\n unmatchedEnrichment: SourceModelObservation[];\n decisions: CanonicalizationDecision[];\n} {\n const clusters = new Map<string, Cluster>();\n const clusterIndex = new Map<string, string>();\n const decisions: CanonicalizationDecision[] = [];\n const unmatchedEnrichment: SourceModelObservation[] = [];\n\n const insertCapable = observations.filter(o => o.canInsert);\n const enrichmentOnly = observations.filter(o => !o.canInsert);\n\n const sourceOrder: SourceName[] = ['openrouter', 'modelsdev'];\n insertCapable.sort((a, b) => {\n const ai = sourceOrder.indexOf(a.source);\n const bi = sourceOrder.indexOf(b.source);\n return (ai === -1 ? 99 : ai) - (bi === -1 ? 99 : bi);\n });\n\n for (const obs of insertCapable) {\n const candidateId = obs.canonicalCandidate ?? obs.externalId;\n const existing = tryMatchCluster(candidateId, clusters, clusterIndex);\n\n if (existing) {\n existing.observations.push(obs);\n } else {\n const normalized = normalizeKey(candidateId);\n const key = normalized;\n const cluster: Cluster = {\n key,\n canonicalId: candidateId,\n canonicalIdNormalized: normalized,\n name: obs.name,\n providerFamily: obs.providerFamily ?? 'unknown',\n observations: [obs],\n };\n clusters.set(key, cluster);\n clusterIndex.set(normalized, key);\n\n for (const variant of strippedVariants(normalized)) {\n if (!clusterIndex.has(variant)) {\n clusterIndex.set(variant, key);\n }\n }\n }\n }\n\n for (const obs of enrichmentOnly) {\n const candidateId = obs.canonicalCandidate ?? obs.externalId;\n const existing = tryMatchCluster(candidateId, clusters, clusterIndex);\n\n if (existing) {\n existing.observations.push(obs);\n } else {\n unmatchedEnrichment.push(obs);\n }\n }\n\n const resolved: CanonicalModelCandidate[] = [];\n for (const cluster of clusters.values()) {\n resolved.push(buildCandidate(cluster));\n\n decisions.push({\n candidateKey: cluster.key,\n matchedObservationIds: cluster.observations.map(o => `${o.source}:${o.externalId}`),\n unmatchedObservationIds: [],\n reasons: [`Cluster from ${[...new Set(cluster.observations.map(o => o.source))].join(', ')}`],\n });\n }\n\n for (const obs of unmatchedEnrichment) {\n decisions.push({\n candidateKey: `unmatched:${obs.source}:${obs.externalId}`,\n matchedObservationIds: [],\n unmatchedObservationIds: [`${obs.source}:${obs.externalId}`],\n reasons: [`No cluster match for enrichment-only source ${obs.source}`],\n });\n }\n\n return {resolved, unmatchedEnrichment, decisions};\n}\n","import {normalizeModelName} from '@holokai/holo-sdk/matching';\nimport {type ModelDictionaryAlias} from '@holokai/holo-types/entities';\nimport {type SourceName} from '../sources/types';\nimport {type CanonicalModelCandidate} from './canonicalize';\nimport {generateAliases} from './alias-generator';\n\nexport interface CanonicalPublishPayload {\n canonical_id: string;\n canonical_id_normalized: string;\n name: string;\n provider_family: string;\n description?: string;\n context_length?: number;\n modality?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n supported_parameters?: string[];\n default_parameters?: Record<string, any>;\n capabilities?: Record<string, unknown>;\n tokenizer?: string;\n kind?: string;\n is_open_source?: boolean;\n release_date?: string;\n base_input_cost?: number;\n base_output_cost?: number;\n base_cache_read_cost?: number;\n base_cache_write_cost?: number;\n sources: SourceName[];\n}\n\ntype AliasInput = Omit<ModelDictionaryAlias, 'id' | 'created_at' | 'updated_at'>;\n\nexport interface PublishDeps {\n upsertCanonicalRow(entry: CanonicalPublishPayload): Promise<{ id: string; canonical_id: string }>;\n\n bulkInsertAliases(aliases: AliasInput[]): Promise<number>;\n}\n\nexport interface PublishResult {\n inserted: number;\n updated: number;\n aliasesCreated: number;\n errors: string[];\n}\n\nconst SOURCE_TO_ALIAS_TYPE: Record<string, string> = {\n openrouter: 'official',\n litellm: 'provider_api',\n modelsdev: 'provider_api',\n};\n\nfunction buildObservationAliases(\n dictionaryId: string,\n candidate: CanonicalModelCandidate,\n): AliasInput[] {\n const aliases: AliasInput[] = [];\n const seen = new Set<string>();\n\n for (const obs of candidate.observations) {\n const norm = normalizeModelName(obs.externalId);\n const key = `${norm.normalized}|${obs.providerFamily ?? ''}|${obs.source}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n let aliasType = SOURCE_TO_ALIAS_TYPE[obs.source] ?? 'heuristic';\n if (obs.source === 'openrouter' && obs.externalId.includes('/')) {\n const prefix = obs.externalId.substring(0, obs.externalId.indexOf('/'));\n if (prefix !== candidate.providerFamily && prefix !== 'openai' && prefix !== 'anthropic' && prefix !== 'google') {\n aliasType = 'reseller';\n }\n }\n\n const alias: AliasInput = {\n dictionary_id: dictionaryId,\n alias: obs.externalId,\n alias_normalized: norm.normalized,\n alias_type: aliasType as AliasInput['alias_type'],\n source: obs.source,\n source_key: obs.source,\n weight: aliasType === 'official' ? 100 : aliasType === 'reseller' ? 90 : 85,\n active: true,\n };\n if (obs.providerFamily) alias.provider_family = obs.providerFamily;\n\n aliases.push(alias);\n }\n\n return aliases;\n}\n\nfunction buildPayload(candidate: CanonicalModelCandidate): CanonicalPublishPayload {\n const payload: CanonicalPublishPayload = {\n canonical_id: candidate.canonicalId,\n canonical_id_normalized: candidate.canonicalIdNormalized,\n name: candidate.name,\n provider_family: candidate.providerFamily,\n sources: candidate.sources,\n };\n if (candidate.description != null) payload.description = candidate.description;\n if (candidate.contextLength != null) payload.context_length = candidate.contextLength;\n if (candidate.inputModalities) payload.input_modalities = candidate.inputModalities;\n if (candidate.outputModalities) payload.output_modalities = candidate.outputModalities;\n if (candidate.supportedParameters) payload.supported_parameters = candidate.supportedParameters;\n if (candidate.defaultParameters) payload.default_parameters = candidate.defaultParameters;\n if (candidate.capabilities) payload.capabilities = candidate.capabilities;\n if (candidate.tokenizer != null) payload.tokenizer = candidate.tokenizer;\n if (candidate.kind != null) payload.kind = candidate.kind;\n if (candidate.isOpenSource != null) payload.is_open_source = candidate.isOpenSource;\n if (candidate.releaseDate != null) payload.release_date = candidate.releaseDate;\n if (candidate.pricing?.input != null) payload.base_input_cost = candidate.pricing.input;\n if (candidate.pricing?.output != null) payload.base_output_cost = candidate.pricing.output;\n if (candidate.pricing?.cacheRead != null) payload.base_cache_read_cost = candidate.pricing.cacheRead;\n if (candidate.pricing?.cacheWrite != null) payload.base_cache_write_cost = candidate.pricing.cacheWrite;\n return payload;\n}\n\nexport async function publishCanonicalCandidates(\n candidates: CanonicalModelCandidate[],\n deps: PublishDeps,\n): Promise<PublishResult> {\n let inserted = 0;\n let updated = 0;\n let aliasesCreated = 0;\n const errors: string[] = [];\n\n for (const candidate of candidates) {\n try {\n const payload = buildPayload(candidate);\n const row = await deps.upsertCanonicalRow(payload);\n inserted++;\n\n const orObs = candidate.observations.find(o => o.source === 'openrouter');\n const canonicalSlug = orObs?.metadata\n ? (orObs.metadata as Record<string, any>)['canonical_slug'] as string | undefined\n : undefined;\n\n const generatedAliases = generateAliases(\n row.id,\n candidate.canonicalId,\n candidate.providerFamily,\n canonicalSlug,\n );\n\n const observationAliases = buildObservationAliases(row.id, candidate);\n\n const allAliases = deduplicateAliases([...generatedAliases, ...observationAliases]);\n\n if (allAliases.length > 0) {\n const count = await deps.bulkInsertAliases(allAliases);\n aliasesCreated += count;\n }\n } catch (err) {\n errors.push(`${candidate.canonicalId}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {inserted, updated, aliasesCreated, errors};\n}\n\nfunction deduplicateAliases(aliases: AliasInput[]): AliasInput[] {\n const seen = new Map<string, AliasInput>();\n\n for (const alias of aliases) {\n const key = `${alias.alias_normalized}|${alias.provider_family ?? ''}|${alias.source_key ?? ''}`;\n const existing = seen.get(key);\n if (!existing || alias.weight > existing.weight) {\n seen.set(key, alias);\n }\n }\n\n return [...seen.values()];\n}\n","import {\n normalizeModelName,\n stripChannel,\n stripDate,\n stripProviderRevision,\n stripQuantization\n} from '@holokai/holo-sdk/matching';\nimport {type SourceModelObservation} from '../sources/types';\n\nexport interface EnrichFields {\n contextLength?: number;\n pricing?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\n capabilities?: Record<string, unknown>;\n isOpenSource?: boolean;\n releaseDate?: string;\n}\n\nexport interface EnrichDeps {\n findByNormalized(normalized: string): Promise<{ id: string; canonical_id: string } | null>;\n\n findByAliasNormalized(normalized: string, providerFamily?: string): Promise<{\n id: string;\n canonical_id: string\n } | null>;\n\n enrichUpdate(id: string, fields: EnrichFields, overwriteKeys: string[], source: string): Promise<void>;\n}\n\nexport interface EnrichResult {\n matched: number;\n enriched: number;\n unmatched: number;\n errors: string[];\n}\n\nfunction tryMatchDictionary(\n normalized: string,\n deps: EnrichDeps,\n providerFamily?: string,\n): Promise<{ id: string; canonical_id: string } | null> {\n return tryMatchChain(normalized, deps, providerFamily);\n}\n\nasync function tryMatchChain(\n normalized: string,\n deps: EnrichDeps,\n providerFamily?: string,\n): Promise<{ id: string; canonical_id: string } | null> {\n const direct = await deps.findByNormalized(normalized);\n if (direct) return direct;\n\n const alias = await deps.findByAliasNormalized(normalized, providerFamily);\n if (alias) return alias;\n\n const strippers: Array<(s: string) => string | undefined> = [\n stripDate, stripProviderRevision, stripQuantization, stripChannel,\n ];\n\n for (const strip of strippers) {\n const stripped = strip(normalized);\n if (stripped && stripped !== normalized) {\n const match = await deps.findByNormalized(stripped);\n if (match) return match;\n\n const aliasMatch = await deps.findByAliasNormalized(stripped, providerFamily);\n if (aliasMatch) return aliasMatch;\n }\n }\n\n return null;\n}\n\nfunction extractEnrichFields(obs: SourceModelObservation): EnrichFields {\n const fields: EnrichFields = {};\n if (obs.contextLength != null) fields.contextLength = obs.contextLength;\n if (obs.pricing) fields.pricing = obs.pricing;\n if (obs.capabilities && Object.keys(obs.capabilities).length > 0) fields.capabilities = obs.capabilities;\n if (obs.isOpenSource != null) fields.isOpenSource = obs.isOpenSource;\n if (obs.releaseDate) fields.releaseDate = obs.releaseDate;\n return fields;\n}\n\nfunction determineOverwriteKeys(source: string): string[] {\n if (source === 'litellm') return ['pricing'];\n if (source === 'modelsdev') return ['contextLength', 'capabilities', 'isOpenSource', 'releaseDate'];\n return [];\n}\n\nexport async function enrichUnmatchedObservations(\n observations: SourceModelObservation[],\n deps: EnrichDeps,\n): Promise<EnrichResult> {\n let matched = 0;\n let enriched = 0;\n let unmatched = 0;\n const errors: string[] = [];\n\n for (const obs of observations) {\n try {\n const candidateId = obs.canonicalCandidate ?? obs.externalId;\n const normalized = normalizeModelName(candidateId).normalized;\n\n const match = await tryMatchDictionary(normalized, deps, obs.providerFamily);\n if (!match) {\n unmatched++;\n continue;\n }\n matched++;\n\n const fields = extractEnrichFields(obs);\n if (Object.keys(fields).length === 0) continue;\n\n const overwriteKeys = determineOverwriteKeys(obs.source);\n await deps.enrichUpdate(match.id, fields, overwriteKeys, obs.source);\n enriched++;\n } catch (err) {\n errors.push(`${obs.externalId}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {matched, enriched, unmatched, errors};\n}\n","import {fetchOpenRouterModels, toSourceModels} from '../sources/openrouter.source';\nimport {fetchLiteLLMModels, toLiteLLMSourceModels} from '../sources/litellm.source';\nimport {fetchModelsDevModels, toModelsDevSourceModels} from '../sources/modelsdev.source';\nimport {buildCanonicalCandidates} from './canonicalize';\nimport {publishCanonicalCandidates, type PublishDeps, type PublishResult} from './publish';\nimport {type EnrichDeps, type EnrichResult, enrichUnmatchedObservations} from './dictionary-enrich';\n\nexport interface PipelineDeps extends PublishDeps, EnrichDeps {\n}\n\nexport interface PipelineResult {\n published: PublishResult;\n enriched: EnrichResult;\n}\n\nexport async function runPipeline(deps: PipelineDeps): Promise<PipelineResult> {\n const [orModels, litellmData, modelsdevModels] = await Promise.all([\n fetchOpenRouterModels().then(toSourceModels),\n fetchLiteLLMModels().then(toLiteLLMSourceModels),\n fetchModelsDevModels().then(toModelsDevSourceModels),\n ]);\n\n const {resolved, unmatchedEnrichment} = buildCanonicalCandidates(\n [...orModels, ...litellmData, ...modelsdevModels],\n );\n\n const published = await publishCanonicalCandidates(resolved, deps);\n\n const enriched = await enrichUnmatchedObservations(unmatchedEnrichment, deps);\n\n return {published, enriched};\n}\n","export {syncDictionary} from './dictionary-sync';\nexport type {DictionarySyncResult, DictionarySyncDeps} from './dictionary-sync';\nexport {generateAliases} from './alias-generator';\nexport {buildCanonicalCandidates} from './canonicalize';\nexport type {CanonicalModelCandidate, CanonicalizationDecision} from './canonicalize';\nexport {publishCanonicalCandidates} from './publish';\nexport type {PublishDeps, PublishResult, CanonicalPublishPayload} from './publish';\nexport {enrichUnmatchedObservations} from './dictionary-enrich';\nexport type {EnrichDeps, EnrichResult, EnrichFields} from './dictionary-enrich';\nexport {runPipeline} from './pipeline';\nexport type {PipelineDeps, PipelineResult} from './pipeline';\n","export {fetchOpenRouterModels, toSourceModels, PROVIDER_PREFIX_TO_FAMILY} from './sources';\nexport {\n fetchLiteLLMModels, toLiteLLMSourceModels, isBaseModel, extractBaseModelId, LITELLM_PROVIDER_TO_FAMILY\n} from './sources';\nexport {fetchModelsDevModels, toModelsDevSourceModels, isLikelyBaseModel} from './sources';\nexport type {\n SourceModelObservation, SourceModel, SourceName, OpenRouterModel, LiteLLMModel, ModelsDevModel\n} from './sources';\nexport {syncDictionary, generateAliases} from './sync';\nexport type {DictionarySyncResult, DictionarySyncDeps} from './sync';\nexport {buildCanonicalCandidates} from './sync';\nexport type {CanonicalModelCandidate, CanonicalizationDecision} from './sync';\nexport {publishCanonicalCandidates} from './sync';\nexport type {PublishDeps, PublishResult, CanonicalPublishPayload} from './sync';\nexport {enrichUnmatchedObservations} from './sync';\nexport type {EnrichDeps, EnrichResult} from './sync';\nexport {runPipeline} from './sync';\nexport type {PipelineDeps, PipelineResult} from './sync';\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ModelDB, ModelDictionaryDB} from '../db';\nimport {ProviderImplService} from './plugin';\nimport {ProviderService} from './entities';\nimport {ClassLogger, pickDefined} from '@holokai/holo-sdk';\nimport {type Model} from '@holokai/holo-types/entities';\nimport {type DiscoveredModel} from '@holokai/holo-types/provider';\nimport {ModelMatchingService} from './model-matching.service';\n\ninterface DiscoveryResult {\n providers: {\n id: string;\n name: string;\n created: number;\n updated: number;\n unavailable: number;\n errors: string[];\n }[];\n}\n\ninterface ProviderSyncResult {\n providerId: string;\n created: number;\n updated: number;\n unavailable: number;\n matched: number;\n unmatched: string[];\n errors: string[];\n}\n\n@injectable()\nexport class ModelDiscoveryService extends ClassLogger {\n\n constructor(\n private modelDB: ModelDB,\n private dictionaryDB: ModelDictionaryDB,\n private providerImplService: ProviderImplService,\n private providerService: ProviderService,\n private matchingService: ModelMatchingService,\n ) {\n super();\n }\n\n async discover(): Promise<DiscoveryResult> {\n const providerResults = await this.discoverFromProviders();\n await this.relinkModels();\n return {providers: providerResults};\n }\n\n async relinkModels(): Promise<{ linked: number; unmatched: number }> {\n const logger = this.mlog(this.relinkModels);\n const unlinked = await this.modelDB.listUnlinked();\n let linked = 0;\n let unmatched = 0;\n\n for (const model of unlinked) {\n const accessModel = model.access_model;\n if (!accessModel) continue;\n\n const result = await this.matchingService.resolve(accessModel, {\n providerId: model.provider_id,\n sourceType: 'relink',\n ...pickDefined({providerFamily: model.provider_type}),\n } as Parameters<ModelMatchingService['resolve']>[1]);\n\n if (result.dictionaryId) {\n const dictEntry = await this.dictionaryDB.findByCanonicalId(result.canonicalId!);\n await this.modelDB.update(model.id, {\n dictionary_id: result.dictionaryId,\n raw_name: accessModel,\n normalized_name: result.normalizedInput,\n match_status: result.status,\n match_confidence: result.confidence,\n match_method: result.method,\n match_metadata: result.matchMetadata,\n matched_at: new Date().toISOString(),\n source_type: 'relink',\n family_detected: dictEntry?.family,\n ...(dictEntry ? pickDefined({\n modality: dictEntry.modality,\n }) : {}),\n } as Partial<Model>);\n linked++;\n } else {\n await this.modelDB.update(model.id, {\n raw_name: accessModel,\n normalized_name: result.normalizedInput,\n match_status: result.status,\n match_method: result.method,\n } as Partial<Model>);\n unmatched++;\n }\n }\n\n logger.info(`Relink complete: ${linked} linked, ${unmatched} unmatched out of ${unlinked.length} models`);\n return {linked, unmatched};\n }\n\n async syncProviderModels(providerId: string): Promise<ProviderSyncResult> {\n const logger = this.mlog(this.syncProviderModels);\n const result: ProviderSyncResult = {\n providerId,\n created: 0,\n updated: 0,\n unavailable: 0,\n matched: 0,\n unmatched: [],\n errors: [],\n };\n\n try {\n const impl = await this.providerImplService.getProviderImplById(providerId);\n const provider = await this.providerService.getById(providerId);\n const providerFamily = provider?.type;\n\n const discovered = await impl.discoverModels();\n const existing = await this.modelDB.listAllByProvider(providerId);\n const existingByAccess = new Map(existing.map(m => [m.access_model, m]));\n const discoveredAccessModels = new Set<string>();\n\n for (const model of discovered) {\n discoveredAccessModels.add(model.accessModel);\n const ex = existingByAccess.get(model.accessModel);\n\n if (ex) {\n const updateFields: Partial<Model> = {available: true};\n if (model.name !== ex.name) updateFields.name = model.name;\n if (model.description && model.description !== ex.description) updateFields.description = model.description;\n if (model.version && model.version !== ex.version) updateFields.version = model.version;\n if (model.contextLength && model.contextLength !== ex.context_length) updateFields.context_length = model.contextLength;\n if (model.metadata) updateFields.metadata = model.metadata;\n await this.modelDB.update(ex.id!, updateFields);\n result.updated++;\n } else {\n const matchResult = await this.matchingService.resolve(model.accessModel, {\n providerId,\n sourceType: 'provider_api',\n ...pickDefined({providerFamily}),\n } as Parameters<ModelMatchingService['resolve']>[1]);\n\n const record: Record<string, any> = {\n name: model.name,\n access_model: model.accessModel,\n provider_id: providerId,\n version: model.version ?? '1.0',\n description: model.description ?? `AI Model: ${model.accessModel}`,\n context_length: model.contextLength ?? null,\n parameters: {},\n metadata: model.metadata ?? {},\n enabled: true,\n available: true,\n deleted: false,\n raw_name: model.accessModel,\n normalized_name: matchResult.normalizedInput,\n match_status: matchResult.status,\n match_confidence: matchResult.confidence,\n match_method: matchResult.method,\n match_metadata: matchResult.matchMetadata ?? null,\n matched_at: matchResult.dictionaryId ? new Date().toISOString() : null,\n source_type: 'provider_api',\n source_key: providerFamily,\n family_detected: undefined,\n input_modalities: model.inputModalities ?? [],\n output_modalities: model.outputModalities ?? [],\n supported_parameters: [],\n };\n\n if (matchResult.dictionaryId) {\n const dictEntry = await this.dictionaryDB.findByCanonicalId(matchResult.canonicalId!);\n if (dictEntry) {\n record.dictionary_id = dictEntry.id;\n record.description = dictEntry.description ?? record.description;\n record.context_length = dictEntry.context_length ?? record.context_length;\n record.modality = dictEntry.modality;\n record.input_modalities = dictEntry.input_modalities;\n record.output_modalities = dictEntry.output_modalities;\n record.supported_parameters = dictEntry.supported_parameters;\n record.family_detected = dictEntry.family;\n }\n result.matched++;\n } else {\n result.unmatched.push(model.accessModel);\n }\n\n await this.modelDB.create(record as Omit<Model, 'id' | 'created_at' | 'updated_at'>);\n result.created++;\n }\n }\n\n for (const ex of existing) {\n if (ex.available && !discoveredAccessModels.has(ex.access_model!)) {\n await this.modelDB.update(ex.id!, {available: false});\n result.unavailable++;\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Provider sync failed for ${providerId}: ${msg}`);\n result.errors.push(msg);\n }\n\n logger.info('Provider model sync complete', {\n providerId,\n created: result.created,\n updated: result.updated,\n unavailable: result.unavailable,\n matched: result.matched,\n unmatched: result.unmatched.length,\n });\n\n return result;\n }\n\n private async discoverFromProviders(): Promise<DiscoveryResult['providers']> {\n const logger = this.mlog(this.discoverFromProviders);\n const providerImpls = this.providerImplService.getAllProviderImpls();\n const providers = await this.providerService.getProviders();\n const providerMap = new Map(providers.map(p => [p.id, p]));\n\n const results: DiscoveryResult['providers'] = [];\n\n for (const [providerId, impl] of providerImpls) {\n const provider = providerMap.get(providerId);\n if (!provider) continue;\n\n const result = {\n id: providerId,\n name: provider.name,\n created: 0,\n updated: 0,\n unavailable: 0,\n errors: [] as string[]\n };\n\n try {\n const discovered = await impl.discoverModels();\n const existing = await this.modelDB.listAllByProvider(providerId);\n const existingByAccess = new Map(existing.map(m => [m.access_model, m]));\n const discoveredAccessModels = new Set<string>();\n\n for (const model of discovered) {\n discoveredAccessModels.add(model.accessModel);\n const ex = existingByAccess.get(model.accessModel);\n\n if (!ex) {\n await this.createModel(providerId, model);\n result.created++;\n } else if (this.needsUpdate(ex, model)) {\n const updateFields: Partial<Model> = {available: true};\n if (model.name !== ex.name) updateFields.name = model.name;\n if (model.description && model.description !== ex.description) updateFields.description = model.description;\n if (model.version && model.version !== ex.version) updateFields.version = model.version;\n if (model.contextLength && model.contextLength !== ex.context_length) updateFields.context_length = model.contextLength;\n if (model.metadata) updateFields.metadata = model.metadata;\n await this.modelDB.update(ex.id!, updateFields);\n result.updated++;\n } else if (!ex.available) {\n await this.modelDB.update(ex.id!, {available: true});\n result.updated++;\n }\n }\n\n for (const ex of existing) {\n if (ex.available && !discoveredAccessModels.has(ex.access_model!)) {\n await this.modelDB.update(ex.id!, {available: false});\n result.unavailable++;\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Discovery failed for provider ${provider.name}: ${msg}`);\n result.errors.push(msg);\n }\n\n results.push(result);\n }\n\n logger.info('Provider discovery complete', {\n total: results.length,\n created: results.reduce((s, r) => s + r.created, 0),\n updated: results.reduce((s, r) => s + r.updated, 0),\n unavailable: results.reduce((s, r) => s + r.unavailable, 0),\n });\n\n return results;\n }\n\n private async createModel(providerId: string, model: DiscoveredModel): Promise<void> {\n const dictEntry = await this.dictionaryDB.findByAlias(model.accessModel);\n\n const record: Record<string, any> = {\n name: model.name,\n access_model: model.accessModel,\n provider_id: providerId,\n version: model.version ?? '1.0',\n description: dictEntry?.description ?? model.description ?? `AI Model: ${model.accessModel}`,\n context_length: dictEntry?.context_length ?? model.contextLength ?? null,\n modality: dictEntry?.modality ?? null,\n input_modalities: dictEntry?.input_modalities?.length ? dictEntry.input_modalities : model.inputModalities ?? [],\n output_modalities: dictEntry?.output_modalities?.length ? dictEntry.output_modalities : model.outputModalities ?? [],\n supported_parameters: dictEntry?.supported_parameters ?? [],\n parameters: {},\n metadata: model.metadata ?? {},\n enabled: true,\n available: true,\n deleted: false,\n dictionary_id: dictEntry?.id ?? null,\n };\n await this.modelDB.create(record as Omit<Model, 'id' | 'created_at' | 'updated_at'>);\n }\n\n private needsUpdate(existing: Model, discovered: DiscoveredModel): boolean {\n if (existing.name !== discovered.name) return true;\n if (existing.description !== discovered.description) return true;\n if (existing.version !== (discovered.version ?? '1.0')) return true;\n if (discovered.contextLength && existing.context_length !== discovered.contextLength) return true;\n return false;\n }\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {ClassLogger} from '@holokai/holo-sdk';\nimport {ModelDictionaryAliasDB, ModelDictionaryDB} from '../db';\nimport type {PipelineResult} from '@holokai/holo-etl';\nimport {runPipeline} from '@holokai/holo-etl';\nimport {ModelDiscoveryService} from './model-discovery.service';\n\n@injectable()\nexport class DictionarySyncService extends ClassLogger {\n constructor(\n private dictionaryDB: ModelDictionaryDB,\n private aliasDB: ModelDictionaryAliasDB,\n private discoveryService: ModelDiscoveryService,\n ) {\n super();\n }\n\n async syncAll(): Promise<PipelineResult & { relink: { linked: number; unmatched: number } }> {\n const logger = this.mlog(this.syncAll);\n logger.info('Starting multi-source dictionary sync');\n\n const result = await runPipeline({\n upsertCanonicalRow: (entry) => this.dictionaryDB.upsertCanonical(entry),\n bulkInsertAliases: (aliases) => this.aliasDB.bulkInsert(aliases),\n findByNormalized: (n) => this.dictionaryDB.findByCanonicalIdNormalized(n)\n .then(r => r ? {id: r.id, canonical_id: r.canonical_id} : null),\n findByAliasNormalized: (n, pf) => this.aliasDB.findByNormalized(n, pf)\n .then(rows => rows.length > 0 ? {\n id: rows[0]!.dictionary_id,\n canonical_id: rows[0]!.canonical_id\n } : null),\n enrichUpdate: (id, f, ok, s) => this.dictionaryDB.enrichUpdate(id, f, ok, s),\n });\n\n logger.info(`Sync complete: ${result.published.inserted} published, ${result.published.aliasesCreated} aliases, ${result.enriched.enriched} enriched`);\n\n const relink = await this.discoveryService.relinkModels();\n\n return {...result, relink};\n }\n}\n","import 'reflect-metadata';\nimport {container, Lifecycle} from 'tsyringe';\nimport {AppDB, DatastoreDB, ModelDictionaryAliasDB, ModelMatchOverrideDB} from '../db';\nimport {\n CryptoService,\n NotificationService,\n PluginDiscoveryService,\n PluginLoaderService,\n PluginService,\n ProviderImplService,\n ProviderPluginService,\n ProviderService,\n RedisService\n} from '../services';\nimport {NotificationServiceToken, NotificationStoreToken} from '@holokai/holo-sdk/notification';\nimport {PostgresNotificationStore} from '../db/notification.db';\nimport {PluginRouteService} from '../services/plugin/plugin.route.service';\nimport {PluginInstallerService} from '../services/plugin/plugin.installer.service';\nimport {PluginLifecycleService} from '../services/plugin/plugin.lifecycle.service';\nimport {PluginWatcherService} from '../services/plugin/plugin.watcher.service';\nimport {PluginRegistry} from '../services/plugin/plugin.registry';\nimport {DatastorePluginService} from '../services/plugin/datastore.plugin.service';\nimport {DatastoreService} from '../services/datastore.service';\nimport {AuditMappingService} from '../services/audit.mapping.service';\nimport {ModelMatchingService} from '../services/model-matching.service';\nimport {DictionarySyncService} from '../services/dictionary-sync.service';\nimport {env} from '../env';\n\nconst separatePluginDirs =\n env.worker.pluginsDir !== env.api.pluginsDir ||\n env.audit.pluginsDir !== env.api.pluginsDir;\n\nconst installerLifecycle = separatePluginDirs ? Lifecycle.Transient : Lifecycle.Singleton;\n\ncontainer\n .registerSingleton(AppDB)\n .registerSingleton(RedisService)\n .registerSingleton(CryptoService)\n .registerSingleton(NotificationServiceToken, NotificationService)\n .registerSingleton(NotificationStoreToken, PostgresNotificationStore)\n .registerSingleton(PluginService)\n .registerSingleton(PluginDiscoveryService)\n .registerSingleton(PluginLoaderService)\n .registerSingleton(ProviderPluginService)\n .registerSingleton(ProviderImplService)\n .registerSingleton(ProviderService)\n .registerSingleton(PluginRouteService)\n .register(PluginInstallerService, {useClass: PluginInstallerService}, {lifecycle: installerLifecycle})\n .register(PluginLifecycleService, {useClass: PluginLifecycleService}, {lifecycle: Lifecycle.Transient})\n .registerSingleton(PluginRegistry)\n .registerSingleton(PluginWatcherService)\n .registerSingleton(ModelDictionaryAliasDB)\n .registerSingleton(ModelMatchOverrideDB)\n .registerSingleton(ModelMatchingService)\n .registerSingleton(DictionarySyncService)\n .registerSingleton(DatastoreDB)\n .registerSingleton(DatastorePluginService)\n .registerSingleton(DatastoreService)\n .registerSingleton(AuditMappingService);\n","import {container} from 'tsyringe';\nimport {\n AccessDB,\n ApplicationDB,\n HoloTokenDB,\n ModelDB,\n PricingDB,\n ProtocolDB,\n ProviderDB,\n ProviderResponseCostDB,\n RequestDB,\n ResponseDB\n} from '../db';\nimport {\n AccessService,\n ApplicationService,\n HoloTokenService,\n PricingService,\n ResponseService,\n TokenService\n} from '../services';\nimport {HoloRequestService} from '../services/holo.request.service';\n\ncontainer\n .registerSingleton(ResponseService)\n .registerSingleton(TokenService)\n .registerSingleton(HoloTokenDB)\n .registerSingleton(HoloTokenService)\n .registerSingleton(ProviderDB)\n .registerSingleton(AccessDB)\n .registerSingleton(AccessService)\n .registerSingleton(ApplicationService)\n .registerSingleton(ApplicationDB)\n .registerSingleton(ModelDB)\n .registerSingleton(RequestDB)\n .registerSingleton(ResponseDB)\n .registerSingleton(PricingDB)\n .registerSingleton(ProviderResponseCostDB)\n .registerSingleton(PricingService)\n .registerSingleton(ProtocolDB)\n .registerSingleton(HoloRequestService);\n","import 'reflect-metadata';\nimport {ClassLogger} from \"@holokai/holo-sdk\";\nimport {ServerType} from \"@holokai/holo-types/entities\";\nimport logger from \"../utils/logger\";\n\nexport interface IAppServer {\n onError(error: Error): Promise<void>;\n\n onInit(): Promise<void>;\n\n onShutdown(): Promise<void>;\n}\n\nexport class BaseServer extends ClassLogger implements IAppServer {\n id!: string;\n type!: ServerType;\n protected initialized = false;\n private shuttingDown = false;\n\n constructor(...args: any[]) {\n super();\n this.id = args[0];\n this.type = args[1];\n this.__className = `${this.constructor.name}-${this.id}`;\n }\n\n async init() {\n const log = this.mlog(this.init);\n await this.onInit();\n this.initialized = true;\n log.info(`Server (${this.id}) started successfully.`);\n }\n\n async shutdown() {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n const log = this.mlog(this.shutdown);\n log.info(`Shutting down server (${this.id})...`);\n await this.onShutdown();\n log.info('Server shutdown gracefully.');\n }\n\n async start() {\n const log = this.mlog(this.start);\n\n this.registerProcessHandlers();\n\n try {\n await this.init();\n log.info('Server is running...');\n } catch (error) {\n await this.handleError(error as Error);\n process.exit(1);\n }\n }\n\n onInit(): Promise<void> {\n return Promise.resolve();\n }\n\n onShutdown(): Promise<void> {\n return Promise.resolve();\n }\n\n onError(_error: Error): Promise<void> {\n return Promise.resolve();\n }\n\n private registerProcessHandlers() {\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGBREAK']) {\n process.on(signal, async () => {\n logger.info(`${signal} received, shutting down ${this.id}...`);\n await this.shutdown();\n process.exit(0);\n });\n }\n\n process.on('uncaughtException', (err) => {\n logger.error(`Uncaught exception in ${this.id}: ${err.message}`, {stack: err.stack});\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason) => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n logger.error(`Unhandled rejection in ${this.id}: ${err.message}`, {stack: err.stack});\n });\n }\n\n private async handleError(error: Error) {\n const log = this.mlog(this.handleError);\n log.error(`Server error: ${error.message}`, {stack: error.stack});\n await this.onError(error);\n }\n}\n","import 'reflect-metadata';\nimport {type DatabaseConfig} from \"../../types\";\nimport logger from \"../../utils/logger\";\nimport {AppDB, ServerDB} from \"../../db\";\nimport {container, injectable} from \"tsyringe\";\nimport {type IAppServer} from \"../base.server\";\nimport {env} from \"../../env\";\nimport {type Constructor} from \"../../utils\";\nimport {ServerType} from \"@holokai/holo-types/entities\";\n\nconst PING_INTERVAL_MS = 60_000;\nconst HEARTBEAT_INTERVAL_MS = 10 * 60_000;\n\nexport function withDB<TBase extends Constructor<IAppServer>>(Base: TBase) {\n @injectable()\n class WithDBServer extends Base implements IAppServer {\n db: AppDB;\n id!: string;\n type!: ServerType;\n serverDB: ServerDB;\n pingTimer?: ReturnType<typeof setInterval>;\n heartbeatTimer?: ReturnType<typeof setInterval>;\n serverId?: string;\n\n constructor(...args: any[]) {\n super(...args);\n\n this.db = container.resolve(AppDB);\n\n if (!this.db) {\n logger.debug('No Database found in container, initializing from config file.');\n if (env.appDb) {\n throw new Error('Database configuration is required when using withDB mixin');\n }\n this.db = new AppDB(env.appDb as DatabaseConfig);\n }\n\n if (!this.db) {\n throw new Error('Database is required when using withDB mixin');\n }\n\n this.serverDB = container.resolve(ServerDB);\n }\n\n async onError(error: Error): Promise<void> {\n await super.onError(error);\n }\n\n async onInit(): Promise<void> {\n logger.debug('Initializing database...');\n await super.onInit();\n await this.db.connect();\n\n const server = await this.serverDB.upsert(this.id, this.type);\n if (!server) {\n throw new Error(`Unable to register server: ${this.id}`);\n }\n this.serverId = server.id;\n logger.info(`Registered server: ${this.id} (${this.type})`);\n\n await this.serverDB.recordHeartbeat(server.id);\n\n this.pingTimer = setInterval(async () => {\n try {\n await this.serverDB.ping(this.serverId!);\n } catch (err) {\n logger.error(`Server ping failed: ${(err as Error).message}`);\n }\n }, PING_INTERVAL_MS);\n\n this.heartbeatTimer = setInterval(async () => {\n try {\n await this.serverDB.recordHeartbeat(this.serverId!);\n } catch (err) {\n logger.error(`Heartbeat failed: ${(err as Error).message}`);\n }\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n async onShutdown(): Promise<void> {\n logger.debug('Shutting down database...');\n if (this.pingTimer) clearInterval(this.pingTimer);\n if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);\n await super.onShutdown();\n await this.db.disconnect();\n }\n }\n\n return WithDBServer;\n}\n","import 'reflect-metadata';\nimport {QueueService} from \"../../services\";\nimport logger from \"../../utils/logger\";\nimport {container, injectable} from \"tsyringe\";\nimport {type IAppServer} from \"../base.server\";\nimport {type Constructor} from \"../../utils\";\n\n/**\n * Mixin to add queue functionality to a class\n */\nexport function withQueue<TBase extends Constructor<IAppServer>>(Base: TBase) {\n @injectable()\n class WithQueueServer extends Base implements IAppServer {\n\n readonly queueService: QueueService;\n\n constructor(...args: any[]) {\n super(...args);\n this.queueService = container.resolve(QueueService);\n if (!this.queueService) {\n throw new Error('Queue service is required when using withQueue mixin');\n }\n }\n\n\n async onError(error: Error): Promise<void> {\n await super.onError(error);\n }\n\n async onInit(): Promise<void> {\n logger.debug('Initializing queue...');\n await super.onInit();\n await this.queueService.connect();\n }\n\n async onShutdown(): Promise<void> {\n logger.debug('Shutting down queue...');\n await super.onShutdown();\n await this.queueService.disconnect();\n }\n }\n\n return WithQueueServer;\n}\n","import 'reflect-metadata';\nimport {container, injectable} from \"tsyringe\";\nimport logger from \"../../utils/logger\";\nimport {type IAppServer} from \"../base.server\";\nimport {withQueue} from \"./with.queue\";\nimport {env} from \"../../env\";\nimport {type Constructor} from \"../../utils\";\nimport {AdminService} from \"../../services\";\nimport {\n type EntityChangedEvent,\n PluginLifecycleService,\n type PluginUpdatedEvent,\n} from \"../../services/plugin/plugin.lifecycle.service\";\nimport {ServerType} from \"@holokai/holo-types/entities\";\n\nexport function withAdmin<TBase extends Constructor<IAppServer>>(Base: TBase) {\n\n @injectable()\n class WithAdminServer extends withQueue(Base) implements IAppServer {\n id!: string;\n type!: ServerType;\n adminHandlers = new Map<string, (workerId: string, payload: object) => Promise<object>>();\n adminCommandQueue: string;\n adminExchange: string;\n readonly adminService: AdminService;\n readonly pluginLifecycleService: PluginLifecycleService;\n\n constructor(...args: any[]) {\n super(...args);\n this.id = args[0];\n this.type = args[1];\n this.adminCommandQueue = env.queue.adminCommandQueue;\n this.adminExchange = env.queue.adminExchange;\n this.adminService = container.resolve(AdminService);\n this.pluginLifecycleService = container.resolve(PluginLifecycleService);\n }\n\n async onInit(): Promise<void> {\n await super.onInit(); // This calls withQueue's onInit, which calls Base's onInit\n\n logger.debug(`${this.id} is Admin Aware`);\n let commandQueue = `${env.queue.adminCommandQueue}_${this.id}`;\n let exchange = env.queue.adminExchange;\n await this.queueService.assertExchange(exchange, 'topic');\n await this.queueService.assertQueue(commandQueue, {\n exclusive: false,\n durable: true,\n autoDelete: true\n }, exchange, 'model.#');\n\n await this.queueService.bindQueue(commandQueue, exchange, 'worker.#');\n await this.queueService.bindQueue(commandQueue, exchange, 'plugin.#');\n await this.queueService.bindQueue(commandQueue, exchange, 'provider.#');\n await this.queueService.bindQueue(commandQueue, exchange, 'datastore.#');\n\n this.pluginLifecycleService.setServerId(this.id);\n this.adminHandlers.set('plugin.enabled', async (_serverId, payload) => {\n await this.pluginLifecycleService.handleRemoteEnable(payload as any);\n return {success: true};\n });\n this.adminHandlers.set('plugin.disabled', async (_serverId, payload) => {\n await this.pluginLifecycleService.handleRemoteDisable(payload as any);\n return {success: true};\n });\n this.adminHandlers.set('plugin.updated', async (_serverId, payload) => {\n await this.pluginLifecycleService.handleRemoteUpdate(payload as PluginUpdatedEvent);\n return {success: true};\n });\n for (const action of ['provider.changed', 'datastore.changed'] as const) {\n this.adminHandlers.set(action, async (_serverId, payload) => {\n await this.pluginLifecycleService.handleEntityChanged(payload as EntityChangedEvent);\n return {success: true};\n });\n }\n\n this.queueService.onReconnect(async () => {\n logger.info(`${this.id} queue reconnected, reconciling plugins...`);\n await this.pluginLifecycleService.reconcilePlugins();\n });\n\n if (env.api.pluginReconcileIntervalMs > 0) {\n this.pluginLifecycleService.startPeriodicReconciliation(env.api.pluginReconcileIntervalMs);\n }\n\n await this.queueService.consume(commandQueue, async (messageId, content, _message) => {\n const {action, serverId, timestamp, ...payload} = content;\n logger.info(`Worker (${this.id}) received admin command: ${action}, messageId: ${messageId}`);\n\n\n let handler = this.adminHandlers.get(action);\n let response = {};\n if (!handler) {\n logger.warn(`No handler registered for admin command: ${action}`);\n response = {success: false, message: `No handler registered for admin command: ${action}`};\n } else {\n try {\n response = await handler(this.id, payload);\n } catch (error) {\n logger.error(`Error handling admin command: ${action} - ${(error as Error).message}`);\n response = {success: false, message: (error as Error).message};\n }\n }\n await this.adminService.sendAdminResponse(this.id, serverId, messageId, response);\n });\n\n }\n\n async onShutdown(): Promise<void> {\n logger.debug('Cleaning up anything Admin related...');// Cleanup audit if it has shutdown method\n await super.onShutdown(); // This calls withQueue's onShutdown\n }\n\n async onError(error: Error): Promise<void> {\n await super.onError(error); // This calls withQueue's onError\n }\n }\n\n return WithAdminServer;\n}\n","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {type IAppServer} from \"../base.server\";\nimport {type Constructor} from \"../../utils\";\n\n\nexport interface ServerStats {\n chatErrors: number;\n chatRequests: number;\n chatSuccesses: number;\n chatTime: number;\n generateErrors: number;\n generateRequests: number;\n generateSuccesses: number;\n generateTime: number;\n startTime: Date;\n totalErrors: number;\n totalProcessingTime: number;\n totalRequests: number;\n totalSuccesses: number;\n}\n\n/**\n * Mixin to add stats functionality to a class\n */\nexport function withStats<TBase extends Constructor<IAppServer>>(Base: TBase) {\n @injectable()\n class WithStatsServer extends Base implements IAppServer {\n stats: ServerStats;\n\n constructor(...args: any[]) {\n super(...args);\n\n this.stats = {\n chatErrors: 0,\n chatRequests: 0,\n chatSuccesses: 0,\n chatTime: 0,\n generateErrors: 0,\n generateRequests: 0,\n generateSuccesses: 0,\n generateTime: 0,\n startTime: new Date(),\n totalErrors: 0,\n totalProcessingTime: 0,\n totalRequests: 0,\n totalSuccesses: 0\n }\n }\n\n async onError(error: Error): Promise<void> {\n await super.onError(error);\n }\n\n async onInit(): Promise<void> {\n await super.onInit();\n }\n\n async onShutdown(): Promise<void> {\n await super.onShutdown();\n }\n }\n\n return WithStatsServer;\n}\n","export * from './with.db';\nexport * from './with.queue';\nexport * from './with.admin';\nexport * from './with.stats';","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {type HoloApiRequest} from \"../types\";\nimport {type ApiResponse, BaseController} from \"../../utils\";\nimport {RequestService} from \"../../services/request.service\";\n\n@injectable()\nexport class AppController extends BaseController {\n\n constructor(private readonly requestService: RequestService) {\n super();\n }\n\n public resolveRequest = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {provider, appSlug} = req.params;\n const nativePath = req.params[0] ?? '';\n await this.requestService.processCustomRequest(provider, appSlug, nativePath, req, res);\n }\n}\n","import 'reflect-metadata';\nimport express from \"express\";\nimport {container} from \"tsyringe\";\nimport {AppController} from '../controllers/app.controller';\nimport {asyncHandler} from '../../utils/api';\nimport {makeAuthMiddleware} from '../middleware';\nimport {AuthService} from '../../services';\n\nexport function createCustomApplicationRoutes(): express.Router {\n const apiRouter = express.Router();\n const customUrlController: AppController = container.resolve(AppController);\n const authService = container.resolve(AuthService);\n const auth = makeAuthMiddleware(authService);\n\n /**\n * @openapi\n * /custom/{provider}/{appSlug}/{path}:\n * post:\n * tags: [Proxy]\n * summary: Proxy request to a model via custom application, with optional cross-provider translation\n * description: |\n * The `provider` path param is the **wire format** the client speaks\n * (e.g. `claude`, `openai`, `gemini`, `ollama`, `bedrock`). It does not\n * have to match the model's native provider — the gateway looks up the\n * requested model in the application's allowed models, resolves its\n * actual provider, and runs the request end-to-end:\n *\n * * **Same-family** (URL provider matches the model's provider family):\n * pass-through, no translation. Behaves exactly like the legacy\n * per-family routes (e.g. `/api/claude/v1/messages`).\n * * **Cross-family**: wire body is translated wire→Holo→target on the\n * way in, the target provider executes the request, and the response\n * is translated target→Holo→wire on the way out so the client always\n * receives the wire family's native shape (Claude messages SSE,\n * OpenAI chat completions SSE, etc.).\n *\n * Example: `POST /api/custom/claude/myapp/v1/messages` with\n * `{\"model\": \"gpt-4o-mini\", ...}` calls OpenAI under the hood and\n * returns a Claude-shaped response (`{id, type: \"message\", role: \"assistant\", content: [...]}`).\n *\n * Audit records carry the full chain in metadata: `is_translated`,\n * `original_request`, `original_plugin_id`, `original_protocol`.\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: provider\n * required: true\n * schema:\n * type: string\n * description: Wire family the client is speaking (e.g. `openai`, `claude`, `ollama`). Independent of the model's native provider.\n * - in: path\n * name: appSlug\n * required: true\n * schema:\n * type: string\n * description: Application slug. The application's `models[]` is the source of truth for which models the request can dispatch to.\n * - in: path\n * name: path\n * required: true\n * schema:\n * type: string\n * description: Wire family's native API path (e.g. `v1/messages` for Claude, `v1/chat/completions` for OpenAI). Resolved against the wire plugin's route table.\n * requestBody:\n * content:\n * application/json:\n * schema:\n * type: object\n * description: Request body in the wire family's native shape. Must include a `model` field; the model determines the target provider.\n * responses:\n * 200:\n * description: Response in the wire family's native shape — never in the target provider's shape, even when cross-translation occurred.\n * 400:\n * description: Body is missing the `model` field for the wire protocol's shape.\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n * 403:\n * description: Model is not in any authorized application's allowed models.\n * 404:\n * description: Wire family or native path not registered (no plugin loaded for the family, or path doesn't match any protocol).\n */\n apiRouter.all('/:provider/:appSlug/*', auth, asyncHandler(customUrlController.resolveRequest));\n return apiRouter;\n}\n","import 'reflect-metadata';\nimport {type Response} from \"express\";\nimport {inject, injectable} from \"tsyringe\";\nimport {pickDefined, stringifyAny} from \"@holokai/holo-sdk\";\nimport {BaseController} from \"../../utils\";\nimport type {\n INotificationService,\n INotificationSub,\n NotificationEvent,\n NotificationSubscribeFilter\n} from '@holokai/holo-types/notification';\nimport {NotificationServiceToken} from '@holokai/holo-sdk/notification';\n\nimport {type HoloApiRequest} from \"../types\";\n\nfunction normalizeQueryValues(...values: unknown[]): string[] | undefined {\n const normalized = values\n .flatMap((value) => Array.isArray(value) ? value : [value])\n .flatMap((value) => typeof value === \"string\" ? value.split(\",\") : [])\n .map((value) => value.trim())\n .filter(Boolean);\n\n return normalized.length ? normalized : undefined;\n}\n\n@injectable()\nexport class NotificationController extends BaseController {\n constructor(\n @inject(NotificationServiceToken) private readonly notificationService: INotificationService) {\n super();\n }\n\n stream = async (req: HoloApiRequest, res: Response) => {\n const logger = this.mlog(this.stream);\n\n if (!req.auth) {\n res.status(401).send({});\n return;\n }\n\n const {organizationId, userId, clientIdentifier, application} = req.auth;\n const threadIds = normalizeQueryValues(req.query.threadId, req.query.threadIds, req.query.thread_id);\n\n const filter = pickDefined({\n organizationId,\n userId: userId ?? clientIdentifier,\n appSlug: application?.url_slug,\n threadIds,\n }) as NotificationSubscribeFilter;\n\n // SSE headers\n res.status(200);\n res.setHeader(\"Content-Type\", \"text/event-stream; charset=utf-8\");\n res.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\"); // nginx buffering off\n res.flushHeaders?.();\n res.write(`retry: 1500\\n\\n`);\n\n // Heartbeat\n const hb = setInterval(() => {\n res.write(`: ping ${Date.now()}\\n\\n`);\n }, 25_000);\n\n let sub: INotificationSub | undefined;\n\n let closed = false;\n\n const close = async () => {\n if (closed) return;\n closed = true;\n clearInterval(hb);\n\n try {\n if (sub) await this.notificationService.unsubscribe(sub.id);\n } catch (e) {\n // best-effort\n }\n\n try {\n res.end();\n } catch {\n // ignore\n }\n };\n\n req.on(\"close\", close);\n req.on(\"error\", close);\n\n const write = async (ev: NotificationEvent) => {\n if (closed) return;\n if (ev.organizationId !== organizationId) return;\n if (filter.appSlug && ev.appSlug !== filter.appSlug) return;\n const matchesUser = filter.userId ? ev.userId === filter.userId : false;\n if (!matchesUser) {\n const matchesThread = !!ev.threadId && !!filter.threadIds?.includes(ev.threadId);\n if (!matchesThread) return;\n }\n\n const chunk =\n `id: ${ev.id}\\n` +\n `event: ${ev.type}\\n` +\n `data: ${JSON.stringify(ev)}\\n\\n`;\n\n if (!res.write(chunk)) {\n await new Promise<void>((resolve) => res.once(\"drain\", resolve));\n }\n };\n\n try {\n sub = await this.notificationService.subscribe(filter);\n for await (const ev of sub.q) {\n await write(ev);\n }\n\n await close();\n } catch (e: any) {\n logger.error(`notification stream error: ${e?.message ?? e}`);\n\n try {\n await write(pickDefined({\n id: `err_${Date.now()}`,\n ts: Date.now(),\n organizationId,\n appSlug: application?.url_slug,\n userId,\n type: \"provider_error\",\n severity: \"error\",\n message: \"notification_stream_error\",\n payload: {error: stringifyAny(e?.message ?? e)},\n }) as NotificationEvent);\n } catch {\n // ignore\n }\n\n await close();\n }\n };\n}\n","import express from \"express\";\nimport {container} from \"tsyringe\";\nimport {NotificationController} from \"../controllers/notification.controller\";\nimport {asyncHandler} from '../../utils/api';\n\nexport function createNotificationRoutes(): express.Router {\n const apiRouter = express.Router();\n const notificationController = container.resolve(NotificationController);\n /**\n * @openapi\n * /notifications/stream:\n * get:\n * tags: [Notifications]\n * summary: SSE event stream\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: query\n * name: threadId\n * schema:\n * type: string\n * - in: query\n * name: threadIds\n * schema:\n * type: string\n * description: Comma-separated list of thread IDs\n * - in: query\n * name: thread_id\n * schema:\n * type: string\n * responses:\n * 200:\n * description: SSE event stream\n * content:\n * text/event-stream:\n * schema:\n * type: string\n */\n apiRouter.get('/stream', asyncHandler(notificationController.stream));\n return apiRouter;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError, pickDefined} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {HoloTokenService} from '../../services';\nimport {HoloTokenDB} from '../../db';\nimport type {HoloToken} from '@holokai/holo-types/entities';\n\nfunction maskToken(token: HoloToken): Omit<HoloToken, 'key_hash'> {\n const {key_hash, ...rest} = token;\n return rest;\n}\n\n@injectable()\nexport class TokenController extends BaseController {\n constructor(\n private holoTokenService: HoloTokenService,\n private holoTokenDB: HoloTokenDB,\n ) {\n super();\n }\n\n create = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const auth = req.auth!;\n const {user_id, application_id, name, expires_at} = req.body;\n\n if (!user_id && !application_id) throw HoloError.badRequest('Either user_id or application_id is required');\n if (user_id && application_id) throw HoloError.badRequest('Provide either user_id or application_id, not both');\n\n const {token, record} = await this.holoTokenService.generate(\n auth.organizationId,\n pickDefined({\n user_id,\n application_id,\n name,\n expires_at: expires_at ? new Date(expires_at) : undefined\n }) as Parameters<HoloTokenService['generate']>[1]\n );\n\n res.status(201).json({\n token,\n record: maskToken(record),\n });\n };\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const auth = req.auth!;\n const {user_id, application_id} = req.query;\n\n let tokens: HoloToken[];\n if (user_id) {\n tokens = await this.holoTokenDB.getByUser(user_id as string);\n } else if (application_id) {\n tokens = await this.holoTokenDB.getByApplication(application_id as string);\n } else {\n tokens = await this.holoTokenDB.getByOrganization(auth.organizationId);\n }\n\n res.status(200).json(tokens.map(maskToken));\n };\n\n get = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const auth = req.auth!;\n const token = await this.holoTokenDB.getById(req.params.id);\n if (!token || token.organization_id !== auth.organizationId) throw HoloError.notFound('Token');\n\n res.status(200).json(maskToken(token));\n };\n\n deactivate = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const auth = req.auth!;\n const token = await this.holoTokenDB.getById(req.params.id);\n if (!token || token.organization_id !== auth.organizationId) throw HoloError.notFound('Token');\n\n await this.holoTokenService.deactivate(token.id, token.key_hash);\n const deactivated = await this.holoTokenDB.getById(token.id);\n res.status(200).json(maskToken(deactivated!));\n };\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {TokenController} from '../controllers/token.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createTokenRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(TokenController);\n\n /**\n * @openapi\n * /tokens:\n * post:\n * tags: [Tokens]\n * summary: Create a new token\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * name:\n * type: string\n * user_id:\n * type: string\n * format: uuid\n * application_id:\n * type: string\n * format: uuid\n * expires_at:\n * type: string\n * format: date-time\n * required:\n * - name\n * responses:\n * 201:\n * description: Token created (raw key shown only once)\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n * 400:\n * description: Validation error\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.create));\n\n /**\n * @openapi\n * /tokens:\n * get:\n * tags: [Tokens]\n * summary: List tokens\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: query\n * name: user_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: application_id\n * schema:\n * type: string\n * format: uuid\n * - $ref: '#/components/parameters/Page'\n * - $ref: '#/components/parameters/Limit'\n * responses:\n * 200:\n * description: Paginated list of tokens\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * pagination:\n * $ref: '#/components/schemas/Pagination'\n * timestamp:\n * type: string\n */\n router.get('/', asyncHandler(controller.list));\n\n /**\n * @openapi\n * /tokens/{id}:\n * get:\n * tags: [Tokens]\n * summary: Get token by ID\n * description: Key hash is masked in the response.\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Token details\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n * 404:\n * description: Token not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.get));\n\n /**\n * @openapi\n * /tokens/{id}:\n * delete:\n * tags: [Tokens]\n * summary: Deactivate token\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Token deactivated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n * 404:\n * description: Token not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.delete('/:id', asyncHandler(controller.deactivate));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {PricingService} from '../../services';\n\n@injectable()\nexport class PricingController extends BaseController {\n constructor(private pricingService: PricingService) {\n super();\n }\n\n recalculate = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {from, to, provider_id} = req.body;\n\n if (!from || !to) throw HoloError.badRequest('from and to are required');\n\n const fromDate = new Date(from);\n const toDate = new Date(to);\n\n if (isNaN(fromDate.getTime()) || isNaN(toDate.getTime())) throw HoloError.badRequest('from and to must be valid dates');\n\n const result = await this.pricingService.recalculateCostsForDateRange(fromDate, toDate, provider_id);\n\n res.json({\n success: true,\n data: {\n row_count: result.rowCount,\n total_cost: result.totalCost,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n provider_id: provider_id ?? null,\n },\n timestamp: new Date().toISOString()\n });\n };\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {PricingController} from '../controllers/pricing.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createPricingRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(PricingController);\n\n /**\n * @openapi\n * /pricing/recalculate:\n * post:\n * tags: [Pricing]\n * summary: Bulk recalculate costs\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required:\n * - from\n * - to\n * properties:\n * from:\n * type: string\n * format: date-time\n * to:\n * type: string\n * format: date-time\n * provider_id:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Recalculation result\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n * 400:\n * description: Validation error\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/recalculate', asyncHandler(controller.recalculate));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {RedisService} from '../../services';\nimport {QueueService} from '../../services/queue.service';\nimport {DatastoreDB, PluginDB, ProviderDB} from '../../db';\nimport {env} from '../../env';\nimport type {EntityChangedEvent} from '../../services/plugin/plugin.lifecycle.service';\n\n@injectable()\nexport class CacheController extends BaseController {\n constructor(\n private redis: RedisService,\n private queueService: QueueService,\n private providerDB: ProviderDB,\n private datastoreDB: DatastoreDB,\n private pluginDB: PluginDB,\n ) {\n super();\n }\n\n invalidateProvider = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {provider_id, org_id, provider_name} = req.body;\n this.log.info(`Cache invalidation: provider`, {\n provider_id,\n org_id,\n provider_name,\n caller: req.auth?.userId\n });\n let deleted = 0;\n\n if (provider_id) {\n if (await this.redis.del(`provider:${provider_id}`)) deleted++;\n }\n\n if (org_id && provider_name) {\n if (await this.redis.del(`org:${org_id}:provider:name:${provider_name}`)) deleted++;\n }\n\n if (org_id) {\n deleted += await this.scanDelete(`org:${org_id}:provider:*`);\n }\n\n this.log.info(`Cache invalidation complete: provider — ${deleted} key(s) deleted`);\n\n try {\n if (provider_id) {\n const provider = await this.providerDB.getById(provider_id);\n await this.broadcastEntityChanged('provider.changed', provider_id, provider?.plugin_id);\n } else if (org_id) {\n const providers = await this.providerDB.listActiveByOrgId(org_id);\n for (const p of providers) {\n await this.broadcastEntityChanged('provider.changed', p.id, p.plugin_id);\n }\n }\n } catch (e) {\n this.log.warn(`Provider impl refresh broadcast failed: ${(e as Error).message}`);\n }\n\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n invalidateDatastore = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {datastore_id, org_id} = req.body;\n this.log.info(`Cache invalidation: datastore`, {datastore_id, org_id, caller: req.auth?.userId});\n let deleted = 0;\n\n if (datastore_id) {\n if (await this.redis.del(`datastore:${datastore_id}`)) deleted++;\n }\n\n if (org_id) {\n deleted += await this.scanDelete(`org:${org_id}:datastore:*`);\n }\n\n this.log.info(`Cache invalidation complete: datastore — ${deleted} key(s) deleted`);\n\n try {\n if (datastore_id) {\n const ds = await this.datastoreDB.getById(datastore_id);\n await this.broadcastEntityChanged('datastore.changed', datastore_id, ds?.plugin_id);\n } else if (org_id) {\n const datastores = await this.datastoreDB.getByOrg(org_id);\n for (const ds of datastores) {\n await this.broadcastEntityChanged('datastore.changed', ds.id, ds.plugin_id);\n }\n }\n } catch (e) {\n this.log.warn(`Datastore impl refresh broadcast failed: ${(e as Error).message}`);\n }\n\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n invalidateApplication = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {application_id, org_id, url_slug} = req.body;\n this.log.info(`Cache invalidation: application`, {\n application_id,\n org_id,\n url_slug,\n caller: req.auth?.userId\n });\n let deleted = 0;\n\n if (application_id) {\n if (await this.redis.del(`app:id:${application_id}`)) deleted++;\n }\n\n if (url_slug) {\n if (await this.redis.del(`app:slug:${url_slug}`)) deleted++;\n deleted += await this.scanDelete(`auth:*:${url_slug}`);\n }\n\n if (org_id && url_slug) {\n if (await this.redis.del(`org:${org_id}:application:${url_slug}`)) deleted++;\n }\n\n if (org_id) {\n deleted += await this.scanDelete(`org:${org_id}:application:*`);\n }\n\n this.log.info(`Cache invalidation complete: application — ${deleted} key(s) deleted`);\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n invalidateAccess = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {user_id, email} = req.body;\n this.log.info(`Cache invalidation: access`, {user_id, email, caller: req.auth?.userId});\n let deleted = 0;\n\n if (user_id) {\n deleted += await this.scanDelete(`access:${user_id}:*`);\n }\n\n if (email) {\n if (await this.redis.del(`access:email:${email.trim().toLowerCase()}`)) deleted++;\n }\n\n this.log.info(`Cache invalidation complete: access — ${deleted} key(s) deleted`);\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n invalidateUser = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {user_id, email} = req.body;\n this.log.info(`Cache invalidation: user`, {user_id, email, caller: req.auth?.userId});\n let deleted = 0;\n\n if (user_id) {\n deleted += await this.scanDelete(`access:${user_id}:*`);\n deleted += await this.scanDelete(`auth:${user_id}:*`);\n }\n\n if (email) {\n if (await this.redis.del(`access:email:${email.trim().toLowerCase()}`)) deleted++;\n }\n\n this.log.info(`Cache invalidation complete: user — ${deleted} key(s) deleted`);\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n invalidateAuth = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {token_hash, app_slug} = req.body;\n this.log.info(`Cache invalidation: auth`, {\n token_hash: token_hash ? `${token_hash.substring(0, 8)}...` : undefined,\n app_slug,\n caller: req.auth?.userId\n });\n let deleted = 0;\n\n if (token_hash) {\n if (await this.redis.del(`holo_token:${token_hash}`)) deleted++;\n deleted += await this.scanDelete(`auth:${token_hash}:*`);\n }\n\n if (app_slug) {\n deleted += await this.scanDelete(`auth:*:${app_slug}`);\n }\n\n this.log.info(`Cache invalidation complete: auth — ${deleted} key(s) deleted`);\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n invalidateOrg = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {org_id} = req.body;\n if (!org_id) throw HoloError.badRequest('org_id is required');\n\n this.log.info(`Cache invalidation: org`, {org_id, caller: req.auth?.userId});\n let deleted = 0;\n deleted += await this.scanDelete(`org:${org_id}:*`);\n\n this.log.info(`Cache invalidation complete: org — ${deleted} key(s) deleted`);\n res.json({success: true, data: {deleted}, timestamp: new Date().toISOString()});\n };\n\n private async broadcastEntityChanged(\n action: EntityChangedEvent['action'],\n entityId: string,\n pluginId?: string | null,\n ): Promise<void> {\n let family = '';\n if (pluginId) {\n const plugin = await this.pluginDB.getById(pluginId);\n if (plugin) family = plugin.family;\n }\n\n const event: EntityChangedEvent = {\n action,\n mutation: 'updated',\n entityId,\n pluginId: pluginId ?? '',\n family,\n serverId: env.api.apiServerId,\n ts: Date.now(),\n };\n\n await this.queueService.sendToExchange(env.queue.adminExchange, action, event);\n this.log.info(`Broadcast ${action} for ${entityId}`);\n }\n\n private async scanDelete(pattern: string): Promise<number> {\n const keys = await this.redis.keys(pattern);\n let deleted = 0;\n for (const key of keys) {\n if (await this.redis.del(key)) deleted++;\n }\n return deleted;\n }\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {CacheController} from '../controllers/cache.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createCacheRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(CacheController);\n\n /**\n * @openapi\n * /cache/invalidate/provider:\n * post:\n * tags: [Cache]\n * summary: Invalidate provider cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * provider_id:\n * type: string\n * format: uuid\n * org_id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/provider', asyncHandler(controller.invalidateProvider));\n\n /**\n * @openapi\n * /cache/invalidate/datastore:\n * post:\n * tags: [Cache]\n * summary: Invalidate datastore cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * datastore_id:\n * type: string\n * format: uuid\n * org_id:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/datastore', asyncHandler(controller.invalidateDatastore));\n\n /**\n * @openapi\n * /cache/invalidate/application:\n * post:\n * tags: [Cache]\n * summary: Invalidate application cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * application_id:\n * type: string\n * format: uuid\n * org_id:\n * type: string\n * format: uuid\n * url_slug:\n * type: string\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/application', asyncHandler(controller.invalidateApplication));\n\n /**\n * @openapi\n * /cache/invalidate/access:\n * post:\n * tags: [Cache]\n * summary: Invalidate access cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * user_id:\n * type: string\n * format: uuid\n * email:\n * type: string\n * format: email\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/access', asyncHandler(controller.invalidateAccess));\n\n /**\n * @openapi\n * /cache/invalidate/auth:\n * post:\n * tags: [Cache]\n * summary: Invalidate auth cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * token_hash:\n * type: string\n * app_slug:\n * type: string\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/auth', asyncHandler(controller.invalidateAuth));\n\n /**\n * @openapi\n * /cache/invalidate/org:\n * post:\n * tags: [Cache]\n * summary: Invalidate org cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required:\n * - org_id\n * properties:\n * org_id:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/org', asyncHandler(controller.invalidateOrg));\n\n /**\n * @openapi\n * /cache/invalidate/user:\n * post:\n * tags: [Cache]\n * summary: Invalidate user cache\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * user_id:\n * type: string\n * format: uuid\n * email:\n * type: string\n * format: email\n * responses:\n * 200:\n * description: Cache invalidated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n */\n router.post('/invalidate/user', asyncHandler(controller.invalidateUser));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {PluginDB, ProviderDB} from '../../db';\nimport {QueueService} from '../../services/queue.service';\nimport {ProviderImplService} from '../../services/plugin/provider.impl.service';\nimport {env} from '../../env';\nimport {paginatedResponse, parsePagination} from '../../utils/pagination';\nimport type {EntityChangedEvent} from '../../services/plugin/plugin.lifecycle.service';\n\n@injectable()\nexport class ProviderCrudController extends BaseController {\n constructor(\n private providerDB: ProviderDB,\n private pluginDB: PluginDB,\n private queueService: QueueService,\n private providerImplService: ProviderImplService,\n ) {\n super();\n }\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const p = parsePagination(req);\n const {org_id, enabled, search} = req.query as Record<string, string>;\n const filters: { org_id?: string; enabled?: boolean; search?: string } = {};\n if (org_id) filters.org_id = org_id;\n if (enabled !== undefined) filters.enabled = enabled === 'true';\n if (search) filters.search = search;\n const result = await this.providerDB.listPaginated(\n filters, p.limit, p.offset, p.sort_by, p.sort_dir\n );\n res.json(paginatedResponse(result.rows, result.total, p));\n };\n\n get = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const provider = await this.providerDB.getById(req.params.id);\n if (!provider) throw HoloError.notFound('Provider');\n res.json({success: true, data: provider, timestamp: new Date().toISOString()});\n };\n\n create = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const provider = await this.providerDB.create(req.body);\n if (!provider) throw HoloError.badRequest('Failed to create provider');\n await this.broadcastProviderChanged('created', provider.id, provider.plugin_id);\n res.status(201).json({success: true, data: provider, timestamp: new Date().toISOString()});\n };\n\n update = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const provider = await this.providerDB.update(req.params.id, req.body);\n if (!provider) throw HoloError.notFound('Provider');\n await this.broadcastProviderChanged('updated', provider.id, provider.plugin_id);\n res.json({success: true, data: provider, timestamp: new Date().toISOString()});\n };\n\n remove = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const existing = await this.providerDB.getById(req.params.id);\n const deleted = await this.providerDB.softDelete(req.params.id);\n if (!deleted) throw HoloError.notFound('Provider');\n await this.broadcastProviderChanged('deleted', req.params.id, existing?.plugin_id);\n res.json({success: true, timestamp: new Date().toISOString()});\n };\n\n upgradePlugin = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {pluginVersion} = req.body;\n if (!pluginVersion) throw HoloError.badRequest('pluginVersion is required');\n\n const provider = await this.providerDB.getById(req.params.id);\n if (!provider) throw HoloError.notFound('Provider');\n\n const currentPlugin = provider.plugin_id ? await this.pluginDB.getById(provider.plugin_id) : null;\n if (!currentPlugin) throw HoloError.badRequest('Provider has no associated plugin');\n\n const targetPlugin = await this.pluginDB.getByFamilyAndVersion(currentPlugin.family, pluginVersion);\n if (!targetPlugin) throw HoloError.notFound(`Plugin version ${pluginVersion} for ${currentPlugin.family}`);\n\n await this.providerDB.update(req.params.id, {plugin_id: targetPlugin.id} as any);\n await this.broadcastProviderChanged('updated', req.params.id, targetPlugin.id);\n\n res.json({\n success: true,\n data: {providerId: req.params.id, pluginVersion, pluginId: targetPlugin.id},\n timestamp: new Date().toISOString()\n });\n };\n\n testConnection = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const result = await this.providerImplService.testConnection(req.params.id);\n res.json({success: true, data: result, timestamp: new Date().toISOString()});\n };\n\n testConnectionWithConfig = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {plugin_id, connection_config} = req.body;\n if (!plugin_id) throw HoloError.badRequest('plugin_id is required');\n if (!connection_config) throw HoloError.badRequest('connection_config is required');\n const result = await this.providerImplService.testConnectionWithConfig(plugin_id, connection_config);\n res.json({success: true, data: result, timestamp: new Date().toISOString()});\n };\n\n private async broadcastProviderChanged(\n mutation: EntityChangedEvent['mutation'],\n providerId: string,\n pluginId?: string | null\n ): Promise<void> {\n let family = '';\n if (pluginId) {\n const plugin = await this.pluginDB.getById(pluginId);\n if (plugin) family = plugin.family;\n }\n\n const event: EntityChangedEvent = {\n action: 'provider.changed',\n mutation,\n entityId: providerId,\n pluginId: pluginId ?? '',\n family,\n serverId: env.api.apiServerId,\n ts: Date.now(),\n };\n\n try {\n await this.queueService.sendToExchange(\n env.queue.adminExchange, 'provider.changed', event\n );\n } catch (e) {\n this.log.warn(`Failed to broadcast provider.changed: ${(e as Error).message}`);\n }\n }\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {ProviderCrudController} from '../controllers/provider.crud.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createProviderRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(ProviderCrudController);\n\n /**\n * @openapi\n * /providers:\n * get:\n * tags: [Providers]\n * summary: List providers with pagination\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - $ref: '#/components/parameters/OrgId'\n * - in: query\n * name: enabled\n * schema:\n * type: boolean\n * description: Filter by enabled status\n * - in: query\n * name: search\n * schema:\n * type: string\n * description: Search by name\n * - $ref: '#/components/parameters/Page'\n * - $ref: '#/components/parameters/Limit'\n * - in: query\n * name: sort_by\n * schema:\n * type: string\n * default: created_at\n * description: Field to sort by\n * - $ref: '#/components/parameters/SortDir'\n * responses:\n * 200:\n * description: Paginated list of providers\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * type:\n * type: string\n * enabled:\n * type: boolean\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * pagination:\n * $ref: '#/components/schemas/Pagination'\n * timestamp:\n * type: string\n * format: date-time\n */\n /**\n * @openapi\n * /providers/test:\n * post:\n * tags: [Providers]\n * summary: Test provider connectivity with config (before saving)\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [plugin_id, connection_config]\n * properties:\n * plugin_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * responses:\n * 200:\n * description: Connection test result\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * ok:\n * type: boolean\n * error:\n * type: string\n * timestamp:\n * type: string\n * format: date-time\n * 400:\n * description: Missing required fields\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/test', asyncHandler(controller.testConnectionWithConfig));\n router.get('/', asyncHandler(controller.list));\n\n /**\n * @openapi\n * /providers/{id}:\n * get:\n * tags: [Providers]\n * summary: Get provider by ID\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Provider UUID\n * responses:\n * 200:\n * description: Provider details\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * type:\n * type: string\n * enabled:\n * type: boolean\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Provider not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.get));\n\n /**\n * @openapi\n * /providers:\n * post:\n * tags: [Providers]\n * summary: Create a new provider\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [name, org_id, type]\n * properties:\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * type:\n * type: string\n * credentials:\n * type: object\n * enabled:\n * type: boolean\n * default: true\n * metadata:\n * type: object\n * responses:\n * 201:\n * description: Provider created\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * type:\n * type: string\n * enabled:\n * type: boolean\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 400:\n * description: Invalid request body\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.create));\n\n /**\n * @openapi\n * /providers/{id}:\n * put:\n * tags: [Providers]\n * summary: Update a provider\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Provider UUID\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * type:\n * type: string\n * credentials:\n * type: object\n * enabled:\n * type: boolean\n * metadata:\n * type: object\n * responses:\n * 200:\n * description: Provider updated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * type:\n * type: string\n * enabled:\n * type: boolean\n * metadata:\n * type: object\n * updated_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Provider not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.put('/:id', asyncHandler(controller.update));\n\n /**\n * @openapi\n * /providers/{id}:\n * delete:\n * tags: [Providers]\n * summary: Soft delete a provider\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Provider UUID\n * responses:\n * 200:\n * description: Provider deleted\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * deleted:\n * type: boolean\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Provider not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.delete('/:id', asyncHandler(controller.remove));\n\n /**\n * @openapi\n * /providers/{id}/upgrade-plugin:\n * post:\n * tags: [Providers]\n * summary: Upgrade provider to a different plugin version\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Provider UUID\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [pluginId]\n * properties:\n * pluginId:\n * type: string\n * format: uuid\n * description: Target plugin version UUID\n * responses:\n * 200:\n * description: Provider plugin upgraded\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * providerId:\n * type: string\n * format: uuid\n * pluginId:\n * type: string\n * format: uuid\n * 404:\n * description: Provider not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/:id/upgrade-plugin', asyncHandler(controller.upgradePlugin));\n\n /**\n * @openapi\n * /providers/{id}/test:\n * post:\n * tags: [Providers]\n * summary: Test connectivity of an existing provider\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Provider UUID\n * responses:\n * 200:\n * description: Connection test result\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * ok:\n * type: boolean\n * error:\n * type: string\n * timestamp:\n * type: string\n * format: date-time\n */\n router.post('/:id/test', asyncHandler(controller.testConnection));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {ApplicationDB} from '../../db';\nimport {paginatedResponse, parsePagination} from '../../utils/pagination';\n\n@injectable()\nexport class ApplicationCrudController extends BaseController {\n constructor(private applicationDB: ApplicationDB) {\n super();\n }\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const p = parsePagination(req);\n const {org_id, provider_id, search} = req.query as Record<string, string>;\n const result = await this.applicationDB.listPaginated({\n org_id,\n provider_id,\n search\n }, p.limit, p.offset, p.sort_by, p.sort_dir);\n res.json(paginatedResponse(result.rows, result.total, p));\n };\n\n get = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const app = await this.applicationDB.getById(req.params.id);\n if (!app) throw HoloError.notFound('Application');\n res.json({success: true, data: app, timestamp: new Date().toISOString()});\n };\n\n create = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const app = await this.applicationDB.create(req.body);\n if (!app) throw HoloError.badRequest('Failed to create application');\n res.status(201).json({success: true, data: app, timestamp: new Date().toISOString()});\n };\n\n update = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const app = await this.applicationDB.update(req.params.id, req.body);\n if (!app) throw HoloError.notFound('Application');\n res.json({success: true, data: app, timestamp: new Date().toISOString()});\n };\n\n remove = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const deleted = await this.applicationDB.softDelete(req.params.id);\n if (!deleted) throw HoloError.notFound('Application');\n res.json({success: true, timestamp: new Date().toISOString()});\n };\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {ApplicationCrudController} from '../controllers/application.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createApplicationRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(ApplicationCrudController);\n\n /**\n * @openapi\n * /applications:\n * get:\n * tags: [Applications (Admin)]\n * summary: List applications with pagination\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - $ref: '#/components/parameters/OrgId'\n * - in: query\n * name: provider_id\n * schema:\n * type: string\n * format: uuid\n * description: Filter by provider ID\n * - in: query\n * name: search\n * schema:\n * type: string\n * description: Search by name\n * - $ref: '#/components/parameters/Page'\n * - $ref: '#/components/parameters/Limit'\n * - in: query\n * name: sort_by\n * schema:\n * type: string\n * default: created_at\n * description: Field to sort by\n * - $ref: '#/components/parameters/SortDir'\n * responses:\n * 200:\n * description: Paginated list of applications\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * url_slug:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * provider_id:\n * type: string\n * format: uuid\n * system_prompt:\n * type: string\n * guards:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * pagination:\n * $ref: '#/components/schemas/Pagination'\n * timestamp:\n * type: string\n * format: date-time\n */\n router.get('/', asyncHandler(controller.list));\n\n /**\n * @openapi\n * /applications/{id}:\n * get:\n * tags: [Applications (Admin)]\n * summary: Get application by ID\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Application UUID\n * responses:\n * 200:\n * description: Application details\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * url_slug:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * provider_id:\n * type: string\n * format: uuid\n * system_prompt:\n * type: string\n * guards:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Application not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.get));\n\n /**\n * @openapi\n * /applications:\n * post:\n * tags: [Applications (Admin)]\n * summary: Create a new application\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [name, org_id, provider_id, url_slug]\n * properties:\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * provider_id:\n * type: string\n * format: uuid\n * url_slug:\n * type: string\n * system_prompt:\n * type: string\n * guards:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * metadata:\n * type: object\n * responses:\n * 201:\n * description: Application created\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * url_slug:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * provider_id:\n * type: string\n * format: uuid\n * system_prompt:\n * type: string\n * guards:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 400:\n * description: Invalid request body\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.create));\n\n /**\n * @openapi\n * /applications/{id}:\n * put:\n * tags: [Applications (Admin)]\n * summary: Update an application\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Application UUID\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * name:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * provider_id:\n * type: string\n * format: uuid\n * url_slug:\n * type: string\n * system_prompt:\n * type: string\n * guards:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * metadata:\n * type: object\n * responses:\n * 200:\n * description: Application updated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * url_slug:\n * type: string\n * org_id:\n * type: string\n * format: uuid\n * provider_id:\n * type: string\n * format: uuid\n * system_prompt:\n * type: string\n * guards:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * metadata:\n * type: object\n * updated_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Application not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.put('/:id', asyncHandler(controller.update));\n\n /**\n * @openapi\n * /applications/{id}:\n * delete:\n * tags: [Applications (Admin)]\n * summary: Soft delete an application\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Application UUID\n * responses:\n * 200:\n * description: Application deleted\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * deleted:\n * type: boolean\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Application not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.delete('/:id', asyncHandler(controller.remove));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {ModelDB} from '../../db';\nimport {ModelDiscoveryService} from '../../services/model-discovery.service';\nimport {DictionarySyncService} from '../../services/dictionary-sync.service';\nimport {paginatedResponse, parsePagination} from '../../utils/pagination';\n\n@injectable()\nexport class ModelCrudController extends BaseController {\n constructor(\n private modelDB: ModelDB,\n private discoveryService: ModelDiscoveryService,\n private dictionarySyncService: DictionarySyncService,\n ) {\n super();\n }\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const p = parsePagination(req, 'name');\n const {org_id, provider_id, search} = req.query as Record<string, string>;\n const result = await this.modelDB.listPaginated({\n org_id,\n provider_id,\n search\n }, p.limit, p.offset, p.sort_by, p.sort_dir);\n res.json(paginatedResponse(result.rows, result.total, p));\n };\n\n get = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const model = await this.modelDB.getById(req.params.id);\n if (!model) throw HoloError.notFound('Model');\n res.json({success: true, data: model, timestamp: new Date().toISOString()});\n };\n\n create = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const model = await this.modelDB.create(req.body);\n if (!model) throw HoloError.badRequest('Failed to create model');\n res.status(201).json({success: true, data: model, timestamp: new Date().toISOString()});\n };\n\n update = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const model = await this.modelDB.update(req.params.id, req.body);\n if (!model) throw HoloError.notFound('Model');\n res.json({success: true, data: model, timestamp: new Date().toISOString()});\n };\n\n remove = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const deleted = await this.modelDB.softDelete(req.params.id);\n if (!deleted) throw HoloError.notFound('Model');\n res.json({success: true, timestamp: new Date().toISOString()});\n };\n\n sync = async (_req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const result = await this.discoveryService.discover();\n res.json({success: true, data: result, timestamp: new Date().toISOString()});\n };\n\n syncDictionary = async (_req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const result = await this.dictionarySyncService.syncAll();\n res.json({success: true, data: result, timestamp: new Date().toISOString()});\n };\n\n syncProvider = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {providerId} = req.params;\n if (!providerId) throw HoloError.badRequest('providerId is required');\n const result = await this.discoveryService.syncProviderModels(providerId);\n res.json({success: true, data: result, timestamp: new Date().toISOString()});\n };\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {ModelCrudController} from '../controllers/model.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createModelRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(ModelCrudController);\n\n /**\n * @openapi\n * /models:\n * get:\n * tags: [Models (Admin)]\n * summary: List models with pagination\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - $ref: '#/components/parameters/OrgId'\n * - in: query\n * name: provider_id\n * schema:\n * type: string\n * format: uuid\n * description: Filter by provider ID\n * - in: query\n * name: search\n * schema:\n * type: string\n * description: Search by name\n * - $ref: '#/components/parameters/Page'\n * - $ref: '#/components/parameters/Limit'\n * - in: query\n * name: sort_by\n * schema:\n * type: string\n * default: name\n * description: Field to sort by\n * - $ref: '#/components/parameters/SortDir'\n * responses:\n * 200:\n * description: Paginated list of models\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * access_model:\n * type: string\n * provider_id:\n * type: string\n * format: uuid\n * context_length:\n * type: integer\n * modalities:\n * type: array\n * items:\n * type: string\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * pagination:\n * $ref: '#/components/schemas/Pagination'\n * timestamp:\n * type: string\n * format: date-time\n */\n router.get('/', asyncHandler(controller.list));\n\n /**\n * @openapi\n * /models/sync:\n * post:\n * tags: [Models (Admin)]\n * summary: Sync all models from providers\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * responses:\n * 200:\n * description: Sync completed\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n */\n router.post('/sync', asyncHandler(controller.sync));\n\n /**\n * @openapi\n * /models/sync/dictionary:\n * post:\n * tags: [Models (Admin)]\n * summary: Sync model dictionary\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * responses:\n * 200:\n * description: Dictionary sync completed\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n */\n router.post('/sync/dictionary', asyncHandler(controller.syncDictionary));\n\n /**\n * @openapi\n * /models/sync/providers/{providerId}:\n * post:\n * tags: [Models (Admin)]\n * summary: Sync models for a specific provider\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: providerId\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Provider UUID\n * responses:\n * 200:\n * description: Provider models synced\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n */\n router.post('/sync/providers/:providerId', asyncHandler(controller.syncProvider));\n\n /**\n * @openapi\n * /models/{id}:\n * get:\n * tags: [Models (Admin)]\n * summary: Get model by ID\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Model UUID\n * responses:\n * 200:\n * description: Model details\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * access_model:\n * type: string\n * provider_id:\n * type: string\n * format: uuid\n * context_length:\n * type: integer\n * modalities:\n * type: array\n * items:\n * type: string\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Model not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.get));\n\n /**\n * @openapi\n * /models:\n * post:\n * tags: [Models (Admin)]\n * summary: Create a new model\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [name, access_model, provider_id]\n * properties:\n * name:\n * type: string\n * access_model:\n * type: string\n * description: Model identifier used for API access\n * provider_id:\n * type: string\n * format: uuid\n * context_length:\n * type: integer\n * modalities:\n * type: array\n * items:\n * type: string\n * metadata:\n * type: object\n * responses:\n * 201:\n * description: Model created\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * access_model:\n * type: string\n * provider_id:\n * type: string\n * format: uuid\n * context_length:\n * type: integer\n * modalities:\n * type: array\n * items:\n * type: string\n * metadata:\n * type: object\n * created_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 400:\n * description: Invalid request body\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.create));\n\n /**\n * @openapi\n * /models/{id}:\n * put:\n * tags: [Models (Admin)]\n * summary: Update a model\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Model UUID\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * name:\n * type: string\n * access_model:\n * type: string\n * provider_id:\n * type: string\n * format: uuid\n * context_length:\n * type: integer\n * modalities:\n * type: array\n * items:\n * type: string\n * metadata:\n * type: object\n * responses:\n * 200:\n * description: Model updated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * access_model:\n * type: string\n * provider_id:\n * type: string\n * format: uuid\n * context_length:\n * type: integer\n * modalities:\n * type: array\n * items:\n * type: string\n * metadata:\n * type: object\n * updated_at:\n * type: string\n * format: date-time\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Model not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.put('/:id', asyncHandler(controller.update));\n\n /**\n * @openapi\n * /models/{id}:\n * delete:\n * tags: [Models (Admin)]\n * summary: Soft delete a model\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Model UUID\n * responses:\n * 200:\n * description: Model deleted\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * deleted:\n * type: boolean\n * timestamp:\n * type: string\n * format: date-time\n * 404:\n * description: Model not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.delete('/:id', asyncHandler(controller.remove));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {ProviderResponseCostDB, ResponseDB} from '../../db';\nimport {paginatedResponse, parsePagination} from '../../utils/pagination';\n\n@injectable()\nexport class ResponseCrudController extends BaseController {\n constructor(\n private responseDB: ResponseDB,\n private costDB: ProviderResponseCostDB\n ) {\n super();\n }\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const p = parsePagination(req);\n const q = req.query as Record<string, string>;\n const result = await this.responseDB.listPaginated(\n {\n org_id: q.org_id, application_id: q.application_id, provider_id: q.provider_id,\n access_model: q.access_model, user_id: q.user_id, client_identifier: q.client_identifier,\n status: q.status, from: q.from, to: q.to\n },\n p.limit, p.offset, p.sort_by, p.sort_dir\n );\n res.json(paginatedResponse(result.rows, result.total, p));\n };\n\n get = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const response = await this.responseDB.getById(req.params.id);\n if (!response) throw HoloError.notFound('Response');\n const costs = await this.costDB.findByResponseId(req.params.id);\n res.json({success: true, data: {...response, costs}, timestamp: new Date().toISOString()});\n };\n\n filters = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const data = await this.responseDB.getFilters(req.query.org_id as string);\n res.json({success: true, data, timestamp: new Date().toISOString()});\n };\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {ResponseCrudController} from '../controllers/response.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createResponseRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(ResponseCrudController);\n\n /**\n * @openapi\n * /responses/filters:\n * get:\n * tags: [Responses]\n * summary: Get available filter options\n * description: Returns lists of applications, providers, models, and users for filter dropdowns.\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: query\n * name: org_id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Filter options\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * applications:\n * type: array\n * items:\n * type: object\n * providers:\n * type: array\n * items:\n * type: object\n * models:\n * type: array\n * items:\n * type: object\n * users:\n * type: array\n * items:\n * type: object\n * timestamp:\n * type: string\n */\n router.get('/filters', asyncHandler(controller.filters));\n\n /**\n * @openapi\n * /responses/{id}:\n * get:\n * tags: [Responses]\n * summary: Get response audit record by ID\n * description: Includes associated costs array.\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Response audit record with costs\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n * 404:\n * description: Response not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.get));\n\n /**\n * @openapi\n * /responses:\n * get:\n * tags: [Responses]\n * summary: List response audit records\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - $ref: '#/components/parameters/OrgId'\n * - in: query\n * name: application_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: provider_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: access_model\n * schema:\n * type: string\n * - in: query\n * name: user_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: client_identifier\n * schema:\n * type: string\n * - in: query\n * name: status\n * schema:\n * type: string\n * enum: [success, error, timeout, cancelled]\n * - in: query\n * name: from\n * schema:\n * type: string\n * format: date-time\n * - in: query\n * name: to\n * schema:\n * type: string\n * format: date-time\n * - $ref: '#/components/parameters/Page'\n * - $ref: '#/components/parameters/Limit'\n * - in: query\n * name: sort_by\n * schema:\n * type: string\n * default: timestamp\n * - $ref: '#/components/parameters/SortDir'\n * responses:\n * 200:\n * description: Paginated list of response audit records\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * pagination:\n * $ref: '#/components/schemas/Pagination'\n * timestamp:\n * type: string\n */\n router.get('/', asyncHandler(controller.list));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {RequestDB} from '../../db';\nimport {paginatedResponse, parsePagination} from '../../utils/pagination';\n\n@injectable()\nexport class RequestCrudController extends BaseController {\n constructor(private requestDB: RequestDB) {\n super();\n }\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const p = parsePagination(req, 'timestamp');\n const q = req.query as Record<string, string>;\n const result = await this.requestDB.listPaginated(\n {\n org_id: q.org_id, application_id: q.application_id, provider_id: q.provider_id,\n access_model: q.access_model, user_id: q.user_id, from: q.from, to: q.to\n },\n p.limit, p.offset, p.sort_by, p.sort_dir\n );\n res.json(paginatedResponse(result.rows, result.total, p));\n };\n\n get = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const request = await this.requestDB.getById(req.params.id);\n if (!request) throw HoloError.notFound('Request');\n res.json({success: true, data: request, timestamp: new Date().toISOString()});\n };\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {RequestCrudController} from '../controllers/request.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createRequestRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(RequestCrudController);\n\n /**\n * @openapi\n * /requests/{id}:\n * get:\n * tags: [Requests]\n * summary: Get request audit record by ID\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * responses:\n * 200:\n * description: Request audit record\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * timestamp:\n * type: string\n * 404:\n * description: Request not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.get));\n\n /**\n * @openapi\n * /requests:\n * get:\n * tags: [Requests]\n * summary: List request audit records\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - $ref: '#/components/parameters/OrgId'\n * - in: query\n * name: application_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: provider_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: access_model\n * schema:\n * type: string\n * - in: query\n * name: user_id\n * schema:\n * type: string\n * format: uuid\n * - in: query\n * name: from\n * schema:\n * type: string\n * format: date-time\n * - in: query\n * name: to\n * schema:\n * type: string\n * format: date-time\n * - $ref: '#/components/parameters/Page'\n * - $ref: '#/components/parameters/Limit'\n * - in: query\n * name: sort_by\n * schema:\n * type: string\n * default: timestamp\n * - $ref: '#/components/parameters/SortDir'\n * responses:\n * 200:\n * description: Paginated list of request audit records\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * pagination:\n * $ref: '#/components/schemas/Pagination'\n * timestamp:\n * type: string\n */\n router.get('/', asyncHandler(controller.list));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {inject, injectable} from 'tsyringe';\nimport {HoloError, pickDefined} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {GuardService, HoloRequestService, ProviderImplService, ResponseService} from '../../services';\nimport {ApplicationDB, ModelDB, ProtocolDB} from '../../db';\nimport type {INotificationService} from '@holokai/holo-types/notification';\nimport {NotificationEventFactory, NotificationServiceToken} from '@holokai/holo-sdk/notification';\nimport type {HoloApplicationInfo, HoloModelInfo, HoloRequest} from '@holokai/holo-types/holo';\nimport {ProtocolCapability} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class HoloController extends BaseController {\n constructor(\n private readonly holoRequestService: HoloRequestService,\n private readonly responseService: ResponseService,\n private readonly guardService: GuardService,\n private readonly providerImplService: ProviderImplService,\n private readonly modelDB: ModelDB,\n private readonly applicationDB: ApplicationDB,\n private readonly protocolDB: ProtocolDB,\n @inject(NotificationServiceToken) private readonly notificationService: INotificationService,\n ) {\n super();\n }\n\n chat = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const logger = this.mlog(this.chat);\n const {auth} = req;\n if (!auth) throw HoloError.unauthorized();\n\n const holoRequest: HoloRequest = req.body;\n\n const appSlug = req.headers['x-holo-application'] as string;\n if (appSlug && !holoRequest.application) {\n holoRequest.application = appSlug;\n }\n\n const target = await this.holoRequestService.resolveTarget(auth, holoRequest);\n\n if (holoRequest.protocol) {\n target.protocol = await this.holoRequestService.resolveProtocol(\n target.provider.plugin_id, holoRequest.protocol, ProtocolCapability.CHAT\n );\n }\n\n const workerRequest = this.holoRequestService.buildWorkerRequest(\n auth,\n target,\n holoRequest,\n {path: req.path, method: req.method, headers: req.headers || {}, query: req.query || {}},\n );\n\n if (target.application?.guards?.length) {\n const provider = await this.providerImplService.getProviderImplById(target.provider.id);\n await this.notificationService.publish(\n NotificationEventFactory.fromAuthAndRequest('guard_started', auth, workerRequest, 'Running guards')\n );\n const result = await this.guardService.guard(provider, workerRequest, target.application.guards, auth);\n await this.notificationService.publish(\n NotificationEventFactory.fromAuthAndRequest(\n result?.passed ? 'guard_passed' : 'guard_failed',\n auth, workerRequest, 'Running guards'\n )\n );\n }\n\n await this.notificationService.publish(\n NotificationEventFactory.fromAuthAndRequest('request_started', auth, workerRequest, 'Request started')\n );\n await this.responseService.sendRequest(req, res, workerRequest);\n\n logger.info(`Holo chat request processed`, {requestId: workerRequest.requestId});\n };\n\n generate = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const logger = this.mlog(this.generate);\n const {auth} = req;\n if (!auth) throw HoloError.unauthorized();\n\n const body = req.body;\n const holoRequest: HoloRequest = {\n model: body.model,\n messages: [{role: 'user', content: body.prompt}],\n stream: body.stream,\n max_tokens: body.max_tokens,\n temperature: body.temperature,\n top_p: body.top_p,\n stop_sequences: body.stop_sequences,\n provider: body.provider,\n application: body.application,\n };\n\n const target = await this.holoRequestService.resolveTargetForCapability(\n auth, holoRequest, ProtocolCapability.GENERATE, body.protocol\n );\n\n const workerRequest = this.holoRequestService.buildWorkerRequest(\n auth,\n target,\n holoRequest,\n {path: req.path, method: req.method, headers: req.headers || {}, query: req.query || {}},\n );\n workerRequest.payload = body;\n\n await this.notificationService.publish(\n NotificationEventFactory.fromAuthAndRequest('request_started', auth, workerRequest, 'Request started')\n );\n await this.responseService.sendRequest(req, res, workerRequest);\n\n logger.info(`Holo generate request processed`, {requestId: workerRequest.requestId});\n };\n\n embed = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const logger = this.mlog(this.embed);\n const {auth} = req;\n if (!auth) throw HoloError.unauthorized();\n\n const body = req.body;\n const holoRequest: HoloRequest = {\n model: body.model,\n provider: body.provider,\n application: body.application,\n };\n\n const target = await this.holoRequestService.resolveTargetForCapability(\n auth, holoRequest, ProtocolCapability.EMBED, body.protocol\n );\n\n const workerRequest = this.holoRequestService.buildWorkerRequest(\n auth,\n target,\n {...holoRequest, stream: false},\n {path: req.path, method: req.method, headers: req.headers || {}, query: req.query || {}},\n );\n workerRequest.payload = body;\n\n await this.responseService.sendRequest(req, res, workerRequest);\n\n logger.info(`Holo embed request processed`, {requestId: workerRequest.requestId});\n };\n\n countTokens = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const logger = this.mlog(this.countTokens);\n const {auth} = req;\n if (!auth) throw HoloError.unauthorized();\n\n const body = req.body;\n const holoRequest: HoloRequest = {\n model: body.model,\n messages: body.messages,\n provider: body.provider,\n };\n\n const target = await this.holoRequestService.resolveTargetForCapability(\n auth, holoRequest, ProtocolCapability.METRICS, body.protocol\n );\n\n const workerRequest = this.holoRequestService.buildWorkerRequest(\n auth,\n target,\n {...holoRequest, stream: false},\n {path: req.path, method: req.method, headers: req.headers || {}, query: req.query || {}},\n );\n workerRequest.payload = body;\n\n await this.responseService.sendRequest(req, res, workerRequest);\n\n logger.info(`Holo countTokens request processed`, {requestId: workerRequest.requestId});\n };\n\n cancel = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {id} = req.params;\n res.json({success: true, data: {id, cancelled: true}, timestamp: new Date().toISOString()});\n };\n\n listModels = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const [models, capsByPlugin] = await Promise.all([\n this.modelDB.listWithProvider(),\n this.protocolDB.listActiveGrouped(),\n ]);\n const family = req.query.family as string | undefined;\n const capability = req.query.capability as string | undefined;\n const inputModality = req.query.input_modality as string | undefined;\n\n let data: HoloModelInfo[] = models.map(m => {\n return pickDefined({\n id: m.access_model || m.name,\n name: m.name,\n provider_family: m.provider_type || '',\n capabilities: (m.plugin_id && capsByPlugin.get(m.plugin_id)) || ['chat'],\n context_length: m.context_length,\n modality: m.modality,\n input_modalities: m.input_modalities || [],\n output_modalities: m.output_modalities || [],\n supported_parameters: m.supported_parameters || [],\n metadata: m.metadata || {},\n }) as HoloModelInfo;\n });\n\n if (family) {\n data = data.filter(m => m.provider_family.toLowerCase() === family.toLowerCase());\n }\n if (capability) {\n data = data.filter(m => m.capabilities.includes(capability));\n }\n if (inputModality) {\n data = data.filter(m => m.input_modalities?.includes(inputModality));\n }\n\n res.json({success: true, data, timestamp: new Date().toISOString()});\n };\n\n listApplications = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {auth} = req;\n if (!auth) throw HoloError.unauthorized();\n\n const apps = await this.applicationDB.getAllByOrg(auth.organizationId);\n const data: HoloApplicationInfo[] = apps.map(app => {\n const info: HoloApplicationInfo = {\n slug: app.url_slug!,\n name: app.name,\n provider_family: app.provider?.type || '',\n has_system_prompt: !!app.system_prompt,\n has_guards: !!(app.guards?.length),\n };\n const defaultModel = app.models?.[0]?.access_model || app.models?.[0]?.name;\n if (defaultModel) info.default_model = defaultModel;\n return info;\n });\n res.json({success: true, data, timestamp: new Date().toISOString()});\n };\n\n getApplication = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {auth} = req;\n if (!auth) throw HoloError.unauthorized();\n\n const app = await this.applicationDB.getBySlug(auth.organizationId, req.params.slug);\n if (!app) throw HoloError.notFound('Application');\n\n const data: HoloApplicationInfo = {\n slug: app.url_slug!,\n name: app.name,\n provider_family: app.provider?.type || '',\n has_system_prompt: !!app.system_prompt,\n has_guards: !!(app.guards?.length),\n };\n const defaultModel = app.models?.[0]?.access_model || app.models?.[0]?.name;\n if (defaultModel) data.default_model = defaultModel;\n res.json({success: true, data, timestamp: new Date().toISOString()});\n };\n}\n\nexport {HoloController as HoloChatController};\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {HoloController} from '../controllers/holo.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createHoloChatRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(HoloController);\n\n /**\n * @openapi\n * /chat:\n * post:\n * tags: [Chat]\n * summary: Execute a chat request\n * description: Send a chat completion request to a model. Supports optional streaming via the `stream` field.\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: header\n * name: x-holo-application\n * schema:\n * type: string\n * description: Application slug override\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [model, messages]\n * properties:\n * model:\n * type: string\n * description: Model identifier (e.g. 'gpt-4o', 'claude-sonnet-4-20250514')\n * messages:\n * type: array\n * items:\n * type: object\n * properties:\n * role:\n * type: string\n * enum: [system, user, assistant, tool]\n * content:\n * type: string\n * max_tokens:\n * type: integer\n * temperature:\n * type: number\n * top_p:\n * type: number\n * stream:\n * type: boolean\n * default: false\n * protocol:\n * type: string\n * description: Target protocol (e.g. 'openai.chatCompletions')\n * provider:\n * type: string\n * description: Route to a specific provider by name or UUID\n * application:\n * type: string\n * description: Application slug\n * thread_id:\n * type: string\n * description: Conversation thread ID for multi-turn tracking\n * responses:\n * 200:\n * description: Chat completion response (or SSE stream if stream=true)\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * model:\n * type: string\n * output:\n * type: array\n * items:\n * type: object\n * usage:\n * type: object\n * finish_reason:\n * type: string\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n * 400:\n * description: Invalid request\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.chat));\n\n /**\n * @openapi\n * /chat/{id}/cancel:\n * post:\n * tags: [Chat]\n * summary: Cancel an in-progress chat request\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * description: Request ID to cancel\n * responses:\n * 200:\n * description: Request cancelled\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * id:\n * type: string\n * cancelled:\n * type: boolean\n * timestamp:\n * type: string\n * format: date-time\n */\n router.post('/:id/cancel', asyncHandler(controller.cancel));\n\n return router;\n}\n\nexport function createHoloGenerateRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(HoloController);\n\n /**\n * @openapi\n * /generate:\n * post:\n * tags: [Generate]\n * summary: Generate text from a prompt\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [model, prompt]\n * properties:\n * model:\n * type: string\n * description: Model identifier\n * prompt:\n * type: string\n * description: Text prompt for generation\n * max_tokens:\n * type: integer\n * temperature:\n * type: number\n * top_p:\n * type: number\n * stream:\n * type: boolean\n * default: false\n * stop_sequences:\n * type: array\n * items:\n * type: string\n * protocol:\n * type: string\n * description: Target protocol (e.g. 'ollama.generate')\n * provider:\n * type: string\n * description: Route to a specific provider by name or UUID\n * application:\n * type: string\n * description: Application slug\n * responses:\n * 200:\n * description: Generated text response\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * model:\n * type: string\n * output:\n * type: array\n * items:\n * type: object\n * usage:\n * type: object\n * finish_reason:\n * type: string\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n * 400:\n * description: Invalid request\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.generate));\n\n return router;\n}\n\nexport function createHoloEmbedRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(HoloController);\n\n /**\n * @openapi\n * /embed:\n * post:\n * tags: [Embed]\n * summary: Create an embedding\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [model, input]\n * properties:\n * model:\n * type: string\n * description: Embedding model identifier\n * input:\n * oneOf:\n * - type: string\n * - type: array\n * items:\n * type: string\n * description: Text or array of texts to embed\n * protocol:\n * type: string\n * description: Target protocol (e.g. 'openai.embeddings')\n * provider:\n * type: string\n * description: Route to a specific provider by name or UUID\n * application:\n * type: string\n * description: Application slug\n * responses:\n * 200:\n * description: Embedding response\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * model:\n * type: string\n * output:\n * type: array\n * items:\n * type: object\n * usage:\n * type: object\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n * 400:\n * description: Invalid request\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.embed));\n\n return router;\n}\n\nexport function createHoloMetricsRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(HoloController);\n\n /**\n * @openapi\n * /metrics/count-tokens:\n * post:\n * tags: [Metrics]\n * summary: Count tokens for a set of messages\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [model, messages]\n * properties:\n * model:\n * type: string\n * description: Model identifier for tokenizer selection\n * messages:\n * type: array\n * items:\n * type: object\n * properties:\n * role:\n * type: string\n * enum: [system, user, assistant, tool]\n * content:\n * type: string\n * protocol:\n * type: string\n * description: Target protocol\n * provider:\n * type: string\n * description: Route to a specific provider by name or UUID\n * responses:\n * 200:\n * description: Token count result\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * model:\n * type: string\n * output:\n * type: array\n * items:\n * type: object\n * usage:\n * type: object\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n * 400:\n * description: Invalid request\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/count-tokens', asyncHandler(controller.countTokens));\n\n return router;\n}\n\nexport function createHoloModelRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(HoloController);\n\n /**\n * @openapi\n * /models:\n * get:\n * tags: [Models]\n * summary: List available models\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: query\n * name: family\n * schema:\n * type: string\n * description: Filter by provider family (e.g. 'openai', 'claude')\n * - in: query\n * name: capability\n * schema:\n * type: string\n * description: Filter by capability (e.g. 'chat', 'embed', 'generate')\n * - in: query\n * name: input_modality\n * schema:\n * type: string\n * description: Filter by input modality (e.g. 'text', 'image')\n * responses:\n * 200:\n * description: List of available models\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * properties:\n * id:\n * type: string\n * name:\n * type: string\n * provider_family:\n * type: string\n * capabilities:\n * type: array\n * items:\n * type: string\n * context_length:\n * type: integer\n * modality:\n * type: string\n * input_modalities:\n * type: array\n * items:\n * type: string\n * output_modalities:\n * type: array\n * items:\n * type: string\n * supported_parameters:\n * type: array\n * items:\n * type: string\n * timestamp:\n * type: string\n * format: date-time\n */\n router.get('/', asyncHandler(controller.listModels));\n\n return router;\n}\n\nexport function createHoloApplicationRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(HoloController);\n\n /**\n * @openapi\n * /applications:\n * get:\n * tags: [Applications]\n * summary: List organization applications\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * responses:\n * 200:\n * description: List of applications for the authenticated organization\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: array\n * items:\n * type: object\n * properties:\n * slug:\n * type: string\n * name:\n * type: string\n * provider_family:\n * type: string\n * default_model:\n * type: string\n * has_system_prompt:\n * type: boolean\n * has_guards:\n * type: boolean\n * timestamp:\n * type: string\n * format: date-time\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/', asyncHandler(controller.listApplications));\n\n /**\n * @openapi\n * /applications/{slug}:\n * get:\n * tags: [Applications]\n * summary: Get application by slug\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: slug\n * required: true\n * schema:\n * type: string\n * description: Application URL slug\n * responses:\n * 200:\n * description: Application details\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * data:\n * type: object\n * properties:\n * slug:\n * type: string\n * name:\n * type: string\n * provider_family:\n * type: string\n * default_model:\n * type: string\n * has_system_prompt:\n * type: boolean\n * has_guards:\n * type: boolean\n * timestamp:\n * type: string\n * format: date-time\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n * 404:\n * description: Application not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:slug', asyncHandler(controller.getApplication));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {PluginLifecycleService} from '../../services/plugin/plugin.lifecycle.service';\nimport {PluginService} from '../../services/plugin/plugin.service';\nimport {PluginRegistry} from '../../services/plugin/plugin.registry';\nimport {PluginDB} from '../../db';\nimport {ServerDB} from '../../db/server.db';\nimport type {Plugin} from '@holokai/holo-types/entities';\n\n@injectable()\nexport class PluginController extends BaseController {\n constructor(\n private lifecycle: PluginLifecycleService,\n private pluginDB: PluginDB,\n private pluginService: PluginService,\n private pluginRegistry: PluginRegistry,\n private serverDB: ServerDB,\n ) {\n super();\n }\n\n list = async (_req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const packages = await this.pluginDB.listAll();\n const plugins = await this.pluginService.getPlugins();\n res.json({\n packages: packages.map(p => this.enrichWithSchema(p)),\n plugins: plugins.map(p => this.enrichWithSchema(p)),\n });\n };\n\n status = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const family = req.params.family.toUpperCase();\n const plugins = await this.pluginService.getPlugins(p => p.family === family);\n const allPkgs = await this.pluginDB.listAll();\n const pkg = allPkgs.find(p => p.family === family);\n res.json({\n plugin: plugins[0] ? this.enrichWithSchema(plugins[0]) : null,\n package: pkg ? this.enrichWithSchema(pkg) : null,\n });\n };\n\n upload = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n if (!req.body || !Buffer.isBuffer(req.body) || req.body.length === 0) {\n throw HoloError.badRequest('Request body must be a plugin tarball (.tgz)');\n }\n const meta = await this.lifecycle.installFromTarball(req.body, req.auth?.userId);\n res.json({status: 'installed', ...meta});\n };\n\n install = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {packageName, version} = req.body;\n if (!packageName) throw HoloError.badRequest('packageName is required');\n const meta = await this.lifecycle.install(packageName, version, req.auth?.userId);\n res.json({status: 'installed', ...meta});\n };\n\n enable = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const pkg = await this.findByFamily(req.params.family);\n await this.lifecycle.enable(pkg.name, req.auth?.userId ?? 'admin');\n res.json({status: 'enabled', family: req.params.family});\n };\n\n disable = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const pkg = await this.findByFamily(req.params.family);\n await this.lifecycle.disable(pkg.name);\n res.json({status: 'disabled', family: req.params.family});\n };\n\n reload = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const pkg = await this.findByFamily(req.params.family);\n await this.lifecycle.reload(pkg.name, req.auth?.userId ?? 'admin');\n res.json({status: 'reloaded', family: req.params.family});\n };\n\n uninstall = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {packageName} = req.body;\n if (!packageName) throw HoloError.badRequest('packageName is required');\n await this.lifecycle.uninstall(packageName, {force: req.body.force === true});\n res.json({status: 'uninstalled', packageName});\n };\n\n serverPlugins = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const plugins = await this.serverDB.getPluginsByServer(req.params.serverName);\n res.json({server: req.params.serverName, plugins});\n };\n\n private enrichWithSchema(plugin: Plugin) {\n if (plugin.schema) return plugin;\n const impl = this.pluginRegistry.get(plugin.id);\n return {...plugin, schema: impl?.getSchema?.() ?? null};\n }\n\n private async findByFamily(family: string): Promise<Plugin> {\n const packages = await this.pluginDB.listAll();\n const pkg = packages.find(p => p.family === family.toUpperCase());\n if (!pkg) throw HoloError.notFound(`No installed plugin for family ${family}`);\n return pkg;\n }\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {PluginController} from '../controllers/plugin.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createPluginRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(PluginController);\n\n /**\n * @openapi\n * /plugins:\n * get:\n * tags: [Plugins]\n * summary: List all plugins\n * description: Returns all installed plugin packages and currently loaded plugin instances\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * responses:\n * 200:\n * description: Plugin packages and loaded plugins\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * packages:\n * type: array\n * items:\n * $ref: '#/components/schemas/Plugin'\n * plugins:\n * type: array\n * items:\n * $ref: '#/components/schemas/Plugin'\n */\n router.get('/', asyncHandler(controller.list));\n\n /**\n * @openapi\n * /plugins/{family}/status:\n * get:\n * tags: [Plugins]\n * summary: Get plugin status by family\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: family\n * required: true\n * schema:\n * type: string\n * description: Plugin family name (e.g. OPENAI, CLAUDE)\n * responses:\n * 200:\n * description: Plugin and package status for the family\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * plugin:\n * nullable: true\n * allOf:\n * - $ref: '#/components/schemas/Plugin'\n * package:\n * nullable: true\n * allOf:\n * - $ref: '#/components/schemas/Plugin'\n */\n router.get('/:family/status', asyncHandler(controller.status));\n\n /**\n * @openapi\n * /plugins/upload:\n * post:\n * tags: [Plugins]\n * summary: Upload a plugin tarball\n * description: Uploads a raw .tgz plugin tarball for installation. Validates and stores the plugin.\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/gzip:\n * schema:\n * type: string\n * format: binary\n * responses:\n * 200:\n * description: Plugin installed from tarball\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: installed\n * name:\n * type: string\n * version:\n * type: string\n * family:\n * type: string\n * pluginId:\n * type: string\n * format: uuid\n * 400:\n * description: Invalid or missing tarball\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/upload',\n express.raw({type: ['application/gzip', 'application/x-gzip', 'application/octet-stream'], limit: '50mb'}),\n asyncHandler(controller.upload));\n\n /**\n * @openapi\n * /plugins/install:\n * post:\n * tags: [Plugins]\n * summary: Install a plugin from npm registry\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [packageName]\n * properties:\n * packageName:\n * type: string\n * description: npm package name\n * version:\n * type: string\n * description: Semver version or tag (defaults to latest)\n * responses:\n * 200:\n * description: Plugin installed from npm\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: installed\n * name:\n * type: string\n * version:\n * type: string\n * family:\n * type: string\n * pluginId:\n * type: string\n * format: uuid\n * 400:\n * description: Missing packageName\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/install', asyncHandler(controller.install));\n\n /**\n * @openapi\n * /plugins/{family}/enable:\n * post:\n * tags: [Plugins]\n * summary: Enable a plugin\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: family\n * required: true\n * schema:\n * type: string\n * description: Plugin family name\n * responses:\n * 200:\n * description: Plugin enabled\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: enabled\n * family:\n * type: string\n * 404:\n * description: No installed plugin for family\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/:family/enable', asyncHandler(controller.enable));\n\n /**\n * @openapi\n * /plugins/{family}/disable:\n * post:\n * tags: [Plugins]\n * summary: Disable a plugin\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: family\n * required: true\n * schema:\n * type: string\n * description: Plugin family name\n * responses:\n * 200:\n * description: Plugin disabled\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: disabled\n * family:\n * type: string\n * 404:\n * description: No installed plugin for family\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/:family/disable', asyncHandler(controller.disable));\n\n /**\n * @openapi\n * /plugins/{family}/reload:\n * post:\n * tags: [Plugins]\n * summary: Reload a plugin\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: family\n * required: true\n * schema:\n * type: string\n * description: Plugin family name\n * responses:\n * 200:\n * description: Plugin reloaded\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: reloaded\n * family:\n * type: string\n * 404:\n * description: No installed plugin for family\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/:family/reload', asyncHandler(controller.reload));\n\n /**\n * @openapi\n * /plugins/uninstall:\n * post:\n * tags: [Plugins]\n * summary: Uninstall a plugin\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [packageName]\n * properties:\n * packageName:\n * type: string\n * description: npm package name to uninstall\n * force:\n * type: boolean\n * description: Force uninstall even if plugin is in use\n * default: false\n * responses:\n * 200:\n * description: Plugin uninstalled\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: uninstalled\n * packageName:\n * type: string\n * 400:\n * description: Missing packageName\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/uninstall', asyncHandler(controller.uninstall));\n\n /**\n * @openapi\n * /plugins/server/{serverName}:\n * get:\n * tags: [Plugins]\n * summary: List plugins by server name\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: serverName\n * required: true\n * schema:\n * type: string\n * description: Server name to query plugins for\n * responses:\n * 200:\n * description: Plugins associated with the server\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * server:\n * type: string\n * plugins:\n * type: array\n * items:\n * $ref: '#/components/schemas/Plugin'\n */\n router.get('/server/:serverName', asyncHandler(controller.serverPlugins));\n\n return router;\n}\n","import 'reflect-metadata';\nimport {injectable} from 'tsyringe';\nimport {HoloError} from '@holokai/holo-sdk';\nimport {type ApiResponse, BaseController} from '../../utils';\nimport {type HoloApiRequest} from '../types';\nimport {DatastoreService} from '../../services';\nimport {DatastoreDB, PluginDB} from '../../db';\nimport {QueueService} from '../../services/queue.service';\nimport {env} from '../../env';\nimport type {EntityChangedEvent} from '../../services/plugin/plugin.lifecycle.service';\n\n@injectable()\nexport class DatastoreController extends BaseController {\n constructor(\n private datastoreService: DatastoreService,\n private datastoreDB: DatastoreDB,\n private queueService: QueueService,\n private pluginDB: PluginDB,\n ) {\n super();\n }\n\n list = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const orgId = this.requireOrg(req);\n const datastores = await this.datastoreDB.getByOrg(orgId);\n res.json(datastores.map(ds => this.datastoreService.maskEncryptedFields(ds, ds.plugin_id)));\n };\n\n getById = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const orgId = this.requireOrg(req);\n const {id} = req.params;\n\n const ds = await this.datastoreDB.getByIdAndOrg(id, orgId);\n if (!ds) throw HoloError.notFound('Datastore');\n res.json(this.datastoreService.maskEncryptedFields(ds, ds.plugin_id));\n };\n\n create = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const orgId = this.requireOrg(req);\n const {name, plugin_id, connection_config, mapping, enabled, api_credential_id} = req.body;\n\n if (!name || !plugin_id) throw HoloError.badRequest('name and plugin_id are required');\n\n if (connection_config) {\n const configResult = this.datastoreService.validateConfig(plugin_id, connection_config, api_credential_id);\n if (!configResult.valid) throw HoloError.badRequest(`Invalid config: ${configResult.errors.join(', ')}`);\n }\n\n if (mapping) {\n const mappingResult = this.datastoreService.validateMapping(mapping);\n if (!mappingResult.valid) throw HoloError.badRequest(`Invalid mapping: ${mappingResult.errors.join(', ')}`);\n }\n\n const ds = await this.datastoreDB.insert(orgId, {\n name,\n plugin_id,\n organization_id: orgId,\n api_credential_id,\n connection_config: connection_config ?? {},\n mapping: mapping ?? {},\n enabled: enabled ?? true,\n });\n\n if (ds) {\n await this.broadcastDatastoreChanged('created', ds.id, ds.plugin_id);\n }\n\n res.json(ds);\n };\n\n update = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const orgId = this.requireOrg(req);\n const {id} = req.params;\n\n const existing = await this.datastoreDB.getByIdAndOrg(id, orgId);\n if (!existing) throw HoloError.notFound('Datastore');\n\n const {name, connection_config, mapping, enabled, api_credential_id} = req.body;\n const effectiveCredentialId = api_credential_id ?? existing.api_credential_id;\n\n if (connection_config) {\n const configResult = this.datastoreService.validateConfig(existing.plugin_id, connection_config, effectiveCredentialId);\n if (!configResult.valid) throw HoloError.badRequest(`Invalid config: ${configResult.errors.join(', ')}`);\n }\n\n if (mapping) {\n const mappingResult = this.datastoreService.validateMapping(mapping);\n if (!mappingResult.valid) throw HoloError.badRequest(`Invalid mapping: ${mappingResult.errors.join(', ')}`);\n }\n\n const ds = await this.datastoreDB.update(orgId, id, {\n name,\n connection_config,\n mapping,\n enabled,\n api_credential_id\n });\n\n if (ds) {\n await this.broadcastDatastoreChanged('updated', ds.id, ds.plugin_id);\n }\n\n res.json(ds);\n };\n\n remove = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const orgId = this.requireOrg(req);\n const {id} = req.params;\n\n const existing = await this.datastoreDB.getByIdAndOrg(id, orgId);\n if (!existing) throw HoloError.notFound('Datastore');\n\n await this.datastoreDB.deactivate(orgId, id);\n await this.broadcastDatastoreChanged('deleted', id, existing.plugin_id);\n res.json({status: 'deleted'});\n };\n\n testConnection = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const orgId = this.requireOrg(req);\n const {id} = req.params;\n\n const existing = await this.datastoreDB.getByIdAndOrg(id, orgId);\n if (!existing) throw HoloError.notFound('Datastore');\n\n const result = await this.datastoreService.testConnection(id);\n res.json(result);\n };\n\n testConnectionWithConfig = async (req: HoloApiRequest, res: ApiResponse): Promise<void> => {\n const {plugin_id, connection_config} = req.body;\n if (!plugin_id || !connection_config) {\n throw HoloError.badRequest('plugin_id and connection_config are required');\n }\n const result = await this.datastoreService.testConnectionWithConfig(plugin_id, connection_config);\n res.json(result);\n };\n\n private async broadcastDatastoreChanged(\n mutation: EntityChangedEvent['mutation'],\n datastoreId: string,\n pluginId?: string | null,\n ): Promise<void> {\n let family = '';\n if (pluginId) {\n const plugin = await this.pluginDB.getById(pluginId);\n if (plugin) family = plugin.family;\n }\n\n const event: EntityChangedEvent = {\n action: 'datastore.changed',\n mutation,\n entityId: datastoreId,\n pluginId: pluginId ?? '',\n family,\n serverId: env.api.apiServerId,\n ts: Date.now(),\n };\n\n try {\n await this.queueService.sendToExchange(env.queue.adminExchange, 'datastore.changed', event);\n } catch (e) {\n this.log.warn(`Failed to broadcast datastore.changed: ${(e as Error).message}`);\n }\n }\n\n private requireOrg(req: HoloApiRequest): string {\n const orgId = req.auth?.organizationId;\n if (!orgId) throw HoloError.unauthorized('Organization required');\n return orgId;\n }\n}\n","import express from 'express';\nimport {container} from 'tsyringe';\nimport {DatastoreController} from '../controllers/datastore.controller';\nimport {asyncHandler} from '../../utils';\n\nexport function createDatastoreRoutes(): express.Router {\n const router = express.Router();\n const controller = container.resolve(DatastoreController);\n\n /**\n * @openapi\n * /datastores:\n * get:\n * tags: [Datastores]\n * summary: List datastores for organization\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - $ref: '#/components/parameters/OrgId'\n * responses:\n * 200:\n * description: List of datastores\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * plugin_id:\n * type: string\n * format: uuid\n * organization_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * mapping:\n * type: object\n * enabled:\n * type: boolean\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * 401:\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/', asyncHandler(controller.list));\n\n /**\n * @openapi\n * /datastores/{id}:\n * get:\n * tags: [Datastores]\n * summary: Get datastore by ID\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Datastore UUID\n * responses:\n * 200:\n * description: Datastore details\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * plugin_id:\n * type: string\n * format: uuid\n * organization_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * mapping:\n * type: object\n * enabled:\n * type: boolean\n * created_at:\n * type: string\n * format: date-time\n * updated_at:\n * type: string\n * format: date-time\n * 404:\n * description: Datastore not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.get('/:id', asyncHandler(controller.getById));\n\n /**\n * @openapi\n * /datastores:\n * post:\n * tags: [Datastores]\n * summary: Create a new datastore\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [name, plugin_id]\n * properties:\n * name:\n * type: string\n * plugin_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * mapping:\n * type: object\n * enabled:\n * type: boolean\n * default: true\n * responses:\n * 200:\n * description: Datastore created\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * plugin_id:\n * type: string\n * format: uuid\n * organization_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * mapping:\n * type: object\n * enabled:\n * type: boolean\n * created_at:\n * type: string\n * format: date-time\n * 400:\n * description: Invalid request body\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/', asyncHandler(controller.create));\n\n /**\n * @openapi\n * /datastores/{id}:\n * put:\n * tags: [Datastores]\n * summary: Update a datastore\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Datastore UUID\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * name:\n * type: string\n * connection_config:\n * type: object\n * mapping:\n * type: object\n * enabled:\n * type: boolean\n * responses:\n * 200:\n * description: Datastore updated\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * id:\n * type: string\n * format: uuid\n * name:\n * type: string\n * plugin_id:\n * type: string\n * format: uuid\n * organization_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * mapping:\n * type: object\n * enabled:\n * type: boolean\n * updated_at:\n * type: string\n * format: date-time\n * 404:\n * description: Datastore not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.put('/:id', asyncHandler(controller.update));\n\n /**\n * @openapi\n * /datastores/{id}:\n * delete:\n * tags: [Datastores]\n * summary: Delete a datastore\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Datastore UUID\n * responses:\n * 200:\n * description: Datastore deleted\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * status:\n * type: string\n * example: deleted\n * 404:\n * description: Datastore not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.delete('/:id', asyncHandler(controller.remove));\n\n /**\n * @openapi\n * /datastores/{id}/test:\n * post:\n * tags: [Datastores]\n * summary: Test connection of an existing datastore\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * parameters:\n * - in: path\n * name: id\n * required: true\n * schema:\n * type: string\n * format: uuid\n * description: Datastore UUID\n * responses:\n * 200:\n * description: Connection test result\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * message:\n * type: string\n * 404:\n * description: Datastore not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/:id/test', asyncHandler(controller.testConnection));\n\n /**\n * @openapi\n * /datastores/test:\n * post:\n * tags: [Datastores]\n * summary: Test connection with provided config\n * security:\n * - BearerAuth: []\n * - HoloToken: []\n * requestBody:\n * required: true\n * content:\n * application/json:\n * schema:\n * type: object\n * required: [plugin_id, connection_config]\n * properties:\n * plugin_id:\n * type: string\n * format: uuid\n * connection_config:\n * type: object\n * responses:\n * 200:\n * description: Connection test result\n * content:\n * application/json:\n * schema:\n * type: object\n * properties:\n * success:\n * type: boolean\n * message:\n * type: string\n * 400:\n * description: Missing required fields\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/ErrorResponse'\n */\n router.post('/test', asyncHandler(controller.testConnectionWithConfig));\n\n return router;\n}\n","import express from \"express\";\nimport {container} from 'tsyringe';\nimport {createCustomApplicationRoutes} from \"./app.routes\";\nimport {AuthService} from \"../../services\";\nimport {createNotificationRoutes} from \"./notification.routes\";\nimport {createTokenRoutes} from \"./token.routes\";\nimport {createPricingRoutes} from \"./pricing.routes\";\nimport {createCacheRoutes} from \"./cache.routes\";\nimport {createProviderRoutes} from \"./provider.routes\";\nimport {createApplicationRoutes} from \"./application.routes\";\nimport {createModelRoutes} from \"./model.routes\";\nimport {createResponseRoutes} from \"./response.routes\";\nimport {createRequestRoutes} from \"./request.routes\";\nimport {\n createHoloApplicationRoutes,\n createHoloChatRoutes,\n createHoloEmbedRoutes,\n createHoloGenerateRoutes,\n createHoloMetricsRoutes,\n createHoloModelRoutes,\n} from \"./holo.routes\";\nimport {createPluginRoutes} from \"./plugin.routes\";\nimport {createDatastoreRoutes} from \"./datastore.routes\";\nimport {makeAuthMiddleware} from \"../middleware\";\nimport {PluginRouteService} from \"../../services/plugin/plugin.route.service\";\n\nexport async function createProviderProxyRoutes(): Promise<express.Router> {\n const router = express.Router();\n\n const pluginRouteService = container.resolve(PluginRouteService);\n await pluginRouteService.registerRoutes(router);\n\n router.use('/custom/', createCustomApplicationRoutes());\n return router;\n}\n\nexport function createHoloRoutes(): express.Router {\n const router = express.Router();\n\n const authService = container.resolve(AuthService);\n const auth = makeAuthMiddleware(authService);\n\n // Holo native SDK endpoints\n router.use('/chat', auth, createHoloChatRoutes());\n router.use('/generate', auth, createHoloGenerateRoutes());\n router.use('/embed', auth, createHoloEmbedRoutes());\n router.use('/metrics', auth, createHoloMetricsRoutes());\n router.use('/models', auth, createHoloModelRoutes());\n router.use('/applications', auth, createHoloApplicationRoutes());\n return router;\n}\n\nexport function createAdminRoutes(): express.Router {\n const router = express.Router();\n\n const authService = container.resolve(AuthService);\n const auth = makeAuthMiddleware(authService);\n\n router.use('/notifications', auth, createNotificationRoutes());\n router.use('/tokens', auth, createTokenRoutes());\n router.use('/pricing', auth, createPricingRoutes());\n router.use('/cache', auth, createCacheRoutes());\n router.use('/providers', auth, createProviderRoutes());\n router.use('/applications', auth, createApplicationRoutes());\n router.use('/models', auth, createModelRoutes());\n router.use('/responses', auth, createResponseRoutes());\n router.use('/requests', auth, createRequestRoutes());\n router.use('/plugins', auth, createPluginRoutes());\n router.use('/datastores', auth, createDatastoreRoutes());\n return router;\n}\n","// Auto-generated — do not edit\nexport const VERSION = \"1.4.0\";\n","import swaggerJsdoc from 'swagger-jsdoc';\nimport {VERSION} from '../version';\n\nconst options: swaggerJsdoc.Options = {\n definition: {\n openapi: '3.0.3',\n info: {\n title: 'Holo Gateway API',\n version: VERSION,\n description: 'Holo AI Gateway — routing, security, and management layer for LLM providers',\n },\n servers: [\n {url: '/holo/api/v1', description: 'Holo API (SDK + Admin)'},\n {url: '/api', description: 'Provider Proxy'},\n ],\n tags: [\n {name: 'Chat', description: 'Holo native chat endpoints'},\n {name: 'Models', description: 'Model listing (SDK)'},\n {name: 'Applications', description: 'Application listing (SDK)'},\n {name: 'Applications (Admin)', description: 'Application CRUD management'},\n {name: 'Providers', description: 'Provider CRUD management'},\n {name: 'Models (Admin)', description: 'Model CRUD management'},\n {name: 'Tokens', description: 'API token management'},\n {name: 'Requests', description: 'Request audit logs'},\n {name: 'Responses', description: 'Response audit logs'},\n {name: 'Pricing', description: 'Cost recalculation'},\n {name: 'Cache', description: 'Cache invalidation'},\n {name: 'Notifications', description: 'Real-time event stream (SSE)'},\n {name: 'Plugins', description: 'Plugin lifecycle management'},\n {name: 'Datastores', description: 'Datastore CRUD management'},\n {name: 'Generate', description: 'Text generation endpoints'},\n {name: 'Embed', description: 'Embedding endpoints'},\n {name: 'Metrics', description: 'Token counting and metrics'},\n {name: 'Proxy', description: 'Provider proxy endpoints'},\n {name: 'Health', description: 'System health check'},\n ],\n components: {\n securitySchemes: {\n BearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n description: 'JWT token from identity provider',\n },\n HoloToken: {\n type: 'apiKey',\n in: 'header',\n name: 'x-holo-token',\n description: 'Holo API token (prefixed with holo_)',\n },\n },\n parameters: {\n Page: {\n name: 'page',\n in: 'query',\n schema: {type: 'integer', default: 1, minimum: 1},\n description: 'Page number',\n },\n Limit: {\n name: 'limit',\n in: 'query',\n schema: {type: 'integer', default: 25, maximum: 100},\n description: 'Items per page',\n },\n SortDir: {\n name: 'sort_dir',\n in: 'query',\n schema: {type: 'string', enum: ['asc', 'desc'], default: 'desc'},\n description: 'Sort direction',\n },\n OrgId: {\n name: 'org_id',\n in: 'query',\n schema: {type: 'string', format: 'uuid'},\n description: 'Filter by organization ID',\n },\n HoloApplication: {\n name: 'x-holo-application',\n in: 'header',\n schema: {type: 'string'},\n description: 'Application slug for context',\n },\n ClientUser: {\n name: 'x-client-user',\n in: 'header',\n schema: {type: 'string'},\n description: 'Client user identifier (forwarded from caller)',\n },\n },\n schemas: {\n ErrorResponse: {\n type: 'object',\n properties: {\n success: {type: 'boolean', example: false},\n error: {\n type: 'object',\n properties: {\n message: {type: 'string'},\n code: {\n type: 'string',\n enum: ['unauthorized', 'forbidden', 'validation_error', 'not_found', 'guard_failure', 'internal_error', 'timeout']\n },\n },\n },\n timestamp: {type: 'string', format: 'date-time'},\n },\n },\n Pagination: {\n type: 'object',\n properties: {\n page: {type: 'integer'},\n limit: {type: 'integer'},\n total: {type: 'integer'},\n total_pages: {type: 'integer'},\n },\n },\n HealthResponse: {\n type: 'object',\n properties: {\n status: {type: 'string', example: 'ok'},\n timestamp: {type: 'string', format: 'date-time'},\n uptime: {type: 'number'},\n version: {type: 'string'},\n },\n },\n },\n },\n security: [\n {BearerAuth: []},\n {HoloToken: []},\n ],\n },\n apis: [\n './src/api/routes/*.ts',\n './src/servers/api.server.ts',\n ],\n};\n\nexport const swaggerSpec = swaggerJsdoc(options);\n","import 'reflect-metadata';\nimport express, { type Application, type Request, type Response } from 'express';\nimport bodyParser from 'body-parser';\nimport helmet from 'helmet';\nimport morgan from 'morgan';\nimport listEndpoints from 'express-list-endpoints';\nimport {injectable} from 'tsyringe';\nimport {BaseServer} from './base.server';\nimport {withAdmin, withDB} from './mixins';\nimport {env} from '../env';\nimport logger from '../utils/logger';\nimport {ServerType} from '@holokai/holo-types/entities';\nimport {InitService} from '../services';\nimport {corsMiddleware, errorMiddleware} from '../api/middleware';\nimport {createAdminRoutes, createHoloRoutes, createProviderProxyRoutes} from '../api/routes';\nimport swaggerUi from 'swagger-ui-express';\nimport {swaggerSpec} from '../api/swagger';\n\n@injectable()\nexport class ApiServer extends withAdmin(withDB(BaseServer)) {\n private readonly expressApp: Application;\n private httpServer?: ReturnType<Application['listen']>;\n\n constructor(\n private initService: InitService,\n ) {\n super(env.api.apiServerId, ServerType.API);\n this.expressApp = express();\n this.setupMiddleware();\n }\n\n async onInit(): Promise<void> {\n await super.onInit();\n await this.initService.init(this.id);\n\n this.expressApp.get('/api-docs/spec.json', (_req: Request, res: Response): void => {\n res.json(swaggerSpec);\n });\n this.expressApp.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));\n\n this.expressApp.use('/api', await createProviderProxyRoutes());\n this.expressApp.use('/holo/api/v1', createHoloRoutes());\n this.expressApp.use('/holo/api/v1', createAdminRoutes());\n this.expressApp.use(errorMiddleware);\n await this.startListening();\n }\n\n async onShutdown(): Promise<void> {\n if (this.httpServer) {\n await new Promise<void>((resolve) => this.httpServer!.close(() => resolve()));\n }\n await super.onShutdown();\n }\n\n private setupMiddleware() {\n this.expressApp.use(helmet.hidePoweredBy());\n this.expressApp.use(helmet.noSniff());\n this.expressApp.use(helmet.frameguard({action: 'deny'}));\n this.expressApp.use(helmet.hsts({maxAge: 31536000, includeSubDomains: true}));\n this.expressApp.use(helmet.contentSecurityPolicy({\n directives: {\n defaultSrc: [\"'self'\"],\n scriptSrc: [\"'self'\"],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:'],\n frameAncestors: [\"'none'\"],\n formAction: [\"'self'\"],\n },\n }));\n this.expressApp.use(morgan('dev', {\n skip: (req) => req.path === '/health'\n }));\n this.expressApp.use(bodyParser.json({limit: '10mb'}));\n this.expressApp.use(corsMiddleware);\n\n /**\n * @openapi\n * /health:\n * get:\n * tags: [Health]\n * summary: System health check\n * security: []\n * servers:\n * - url: /\n * responses:\n * 200:\n * description: Server is healthy\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/HealthResponse'\n */\n this.expressApp.get('/health', (_req: Request, res: Response): void => {\n res.status(200).json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n version: process.env.npm_package_version || '1.0.0'\n });\n });\n }\n\n private startListening(): Promise<void> {\n const port = env.api.port || 3000;\n return new Promise((resolve, reject) => {\n this.httpServer = this.expressApp.listen(port, () => {\n logger.info(`API server running on port ${port}`);\n logger.info(`Environment: ${process.env.NODE_ENV || 'development'}`);\n const endpoints = listEndpoints(this.expressApp);\n console.table(endpoints);\n resolve();\n });\n\n this.httpServer.on('error', (error: Error & { code?: string; syscall?: string }) => {\n if (error.syscall === 'listen') {\n if (error.code === 'EACCES') {\n logger.error(`Port ${port} requires elevated privileges`);\n } else if (error.code === 'EADDRINUSE') {\n logger.error(`Port ${port} is already in use`);\n }\n }\n reject(error);\n });\n });\n }\n}\n","import './container/base.registry';\nimport './container/api.registry';\nimport {container} from 'tsyringe';\nimport {ApiServer} from './servers/api.server';\n\nconst server = container.resolve(ApiServer);\nawait server.start();\n","import {container} from 'tsyringe';\nimport {ResponseService} from '../services';\n\ncontainer\n .registerSingleton(ResponseService);\n","import 'reflect-metadata';\nimport {inject, injectable} from \"tsyringe\";\nimport {withAdmin, withDB, withStats} from \"./mixins\";\nimport {BaseServer} from \"./base.server\";\nimport {env} from \"../env\";\nimport {ProviderImplService, ResponseService} from \"../services\";\nimport {PluginRegistry} from \"../services/plugin\";\nimport {NotificationEventFactory, NotificationServiceToken} from \"@holokai/holo-sdk/notification\";\nimport {\n type HoloWorkerRequest,\n type IProvider,\n type IProviderPlugin,\n type ProviderDoneEvent,\n type ProviderErrorEvent\n} from \"@holokai/holo-types\";\nimport type {ProtocolCapability} from \"@holokai/holo-types/entities\";\nimport {ServerType} from \"@holokai/holo-types/entities\";\nimport type {INotificationService} from \"@holokai/holo-types/notification\";\nimport type {IWireAdapter} from \"@holokai/holo-types/provider\";\nimport {HoloWireAdapter, processProviderEvents, translateProviderEvents} from \"@holokai/holo-sdk/provider\";\n\ninterface AIRequestStat {\n type: ProtocolCapability;\n duration: number;\n success: number;\n error: number;\n}\n\n@injectable()\nexport class WorkerServer extends withAdmin((withDB(withStats(BaseServer)))) {\n\n protected __className = `${this.constructor.name}-${env.worker.serverId}`;\n\n constructor(\n private providerPluginService: ProviderImplService,\n private pluginRegistry: PluginRegistry,\n private responseService: ResponseService,\n @inject(NotificationServiceToken) private readonly notificationService: INotificationService\n ) {\n super(env.worker.serverId, ServerType.WORKER);\n }\n\n async onInit(): Promise<void> {\n await super.onInit();\n this.pluginLifecycleService.setPluginsDir(env.worker.pluginsDir);\n await this.pluginRegistry.loadAllActive();\n await this.providerPluginService.warmAll();\n this.adminHandlers.set('worker.restart', this.adminService.restartWorker)\n let requestQueue = env.queue.requestQueue;\n\n const logger = this.mlog('workerConsume')\n await this.queueService.consume(requestQueue, async (requestId, workerRequest: HoloWorkerRequest) => {\n this.stats.totalRequests++;\n logger.info(`Worker ${this.id} handling request: ${requestId} provider: ${workerRequest.provider.name} from server ${workerRequest.sourceId} and queue ${requestQueue}...`);\n const ai: IProvider = await this.providerPluginService.getProviderImplById(workerRequest.provider.id);\n const plugin = ai.plugin;\n logger.info(`resolved ai provider: ${ai.name}`);\n\n const {sourceId, guardResult} = workerRequest;\n const envelope = await ai.auditor.createWorkerResponseEnvelope(workerRequest, this.id);\n\n try {\n if (guardResult && !guardResult.passed) {\n logger.info('Guards failed. Sending back guard errors.');\n\n const wire = await plugin.createWireAdapter({\n requestId,\n isStreaming: false,\n protocol: ai.plugin.defaultProtocol\n });\n\n const errorMessage = guardResult.errors?.join('\\n\\n') || 'Policy violation';\n\n const evt = {\n type: 'error',\n requestId,\n seq: 0,\n ts: Date.now(),\n status: 400,\n metrics: {\n inputTokens: 0,\n outputTokens: 0,\n timeToFirstToken: 0,\n totalProcessingTime: 0,\n totalTokens: 0\n },\n text: errorMessage,\n error: ai.responseFactory.createError(errorMessage)\n } as ProviderErrorEvent;\n\n for (const wireChunk of await wire.fromProviderEvent(evt)) {\n logger.debug(`Guard failed response: ${JSON.stringify(wireChunk)}`);\n await this.responseService.sendResponseChunk(sourceId, requestId, wireChunk);\n }\n await this.responseService.sendToAudit({...workerRequest, providerEvent: evt, workerId: this.id});\n await this.notificationService.publish(\n NotificationEventFactory.fromProviderEvent(envelope, evt),\n );\n } else {\n const wirePlugin = this.resolveWirePlugin(workerRequest, plugin);\n if (wirePlugin) {\n logger.info(`Translating inbound: ${wirePlugin.family}/${workerRequest.wireProtocolName} → holo → ${plugin.family}/${workerRequest.protocol.name}`);\n await this.applyInboundTranslation(workerRequest, wirePlugin);\n }\n\n const wire = await this.createWireAdapter(requestId, workerRequest, wirePlugin, plugin);\n\n const rawEvents = await ai.processWorkerRequest(workerRequest);\n const events = wirePlugin\n ? translateProviderEvents(rawEvents, plugin.translator, wirePlugin.translator)\n : rawEvents;\n\n await processProviderEvents(events, wire, workerRequest, envelope, {\n publishChunk: this.responseService.sendResponseChunk.bind(this),\n publishFinal: async (final: HoloWorkerRequest & {\n providerEvent: ProviderDoneEvent | ProviderErrorEvent\n }) => {\n await this.responseService.sendToAudit(final);\n await this.notificationService.publish(NotificationEventFactory.fromProviderEvent(envelope, final.providerEvent))\n }\n });\n }\n } catch (error) {\n logger.error(`Error handling request (${requestId}): ${(error as Error).message}`);\n try {\n const errorMessage = (error as Error).message;\n const errorEvent = {\n type: 'error',\n requestId,\n seq: 0,\n ts: Date.now(),\n status: 500,\n error: ai.responseFactory.createError(errorMessage),\n text: errorMessage,\n metrics: {\n inputTokens: 0,\n outputTokens: 0,\n timeToFirstToken: 0,\n totalProcessingTime: 0,\n totalTokens: 0\n },\n } as ProviderErrorEvent;\n\n const wire = workerRequest.isHoloNative\n ? new HoloWireAdapter(requestId, false, workerRequest.payload?.model)\n : await plugin.createWireAdapter({\n requestId,\n isStreaming: false,\n protocol: workerRequest.protocol?.name ?? ai.plugin.defaultProtocol\n });\n\n for (const wireChunk of await wire.fromProviderEvent(errorEvent)) {\n await this.responseService.sendResponseChunk(sourceId, requestId, wireChunk);\n }\n\n await this.responseService.sendToAudit({\n ...workerRequest,\n providerEvent: errorEvent,\n workerId: this.id\n });\n } catch (auditError) {\n logger.error(`Failed to send error response for (${requestId}): ${(auditError as Error).message}`);\n }\n await this.onError(error as Error);\n }\n });\n }\n\n async onShutdown(): Promise<void> {\n await super.onShutdown();\n }\n\n async onError(error: Error): Promise<void> {\n await super.onError(error);\n this.stats.totalErrors++;\n }\n\n async mergeStats(requestStats: AIRequestStat) {\n this.stats.totalErrors += requestStats.error;\n this.stats.totalSuccesses += requestStats.success;\n this.stats.totalProcessingTime += requestStats.duration;\n switch (requestStats.type) {\n case \"generate\":\n this.stats.generateSuccesses += requestStats.success;\n this.stats.generateErrors += requestStats.error;\n this.stats.generateTime += requestStats.duration;\n break;\n case \"chat\":\n this.stats.chatSuccesses += requestStats.success;\n this.stats.chatErrors += requestStats.error;\n this.stats.chatTime += requestStats.duration;\n break;\n default:\n return;\n }\n }\n\n private resolveWirePlugin(workerRequest: HoloWorkerRequest, plugin: IProviderPlugin): IProviderPlugin | undefined {\n const wireFamily = workerRequest.wireFamily;\n if (!wireFamily || wireFamily === plugin.family.toLowerCase()) return undefined;\n return this.pluginRegistry.findByFamily(wireFamily);\n }\n\n private async applyInboundTranslation(workerRequest: HoloWorkerRequest, wirePlugin: IProviderPlugin): Promise<void> {\n workerRequest.originalRequest = workerRequest.payload;\n workerRequest.originalPluginId = (wirePlugin as any).id;\n workerRequest.payload = await wirePlugin.translator.toHoloRequest(workerRequest.payload);\n workerRequest.isHoloNative = true;\n }\n\n private async createWireAdapter(\n requestId: string,\n workerRequest: HoloWorkerRequest,\n wirePlugin: IProviderPlugin | undefined,\n plugin: IProviderPlugin,\n ): Promise<IWireAdapter> {\n if (wirePlugin) {\n return wirePlugin.createWireAdapter({\n requestId,\n isStreaming: workerRequest.isStreaming,\n protocol: workerRequest.wireProtocolName ?? wirePlugin.defaultProtocol,\n });\n }\n if (workerRequest.isHoloNative) {\n return new HoloWireAdapter(\n requestId,\n workerRequest.isStreaming,\n workerRequest.payload?.model,\n workerRequest.protocol?.capability as ProtocolCapability,\n );\n }\n return plugin.createWireAdapter({\n requestId,\n isStreaming: workerRequest.isStreaming,\n protocol: workerRequest.protocol.name,\n });\n }\n}\n\n","import './container/base.registry';\nimport './container/worker.registry';\nimport {container} from 'tsyringe';\nimport {WorkerServer} from './servers/worker.server';\n\nconst server = container.resolve(WorkerServer);\nawait server.start();\n","import 'reflect-metadata';\nimport {container} from 'tsyringe';\nimport {PricingDB, ProviderResponseCostDB} from '../db';\nimport {PricingService} from '../services';\n\ncontainer\n .registerSingleton(PricingDB)\n .registerSingleton(ProviderResponseCostDB)\n .registerSingleton(PricingService);\n","import 'reflect-metadata';\nimport {injectable} from \"tsyringe\";\nimport {BaseServer} from \"./base.server\";\nimport {withAdmin, withDB, withQueue} from \"./mixins\";\nimport {env} from \"../env\";\nimport {AuditService, ProviderImplService} from \"../services\";\nimport {PluginRegistry} from \"../services/plugin\";\nimport type {HoloWorkerRequest} from \"@holokai/holo-types/worker\";\nimport type {NotificationEvent} from \"@holokai/holo-types/notification\";\nimport {ServerType} from \"@holokai/holo-types/entities\";\n\n@injectable()\nexport class AuditServer extends withAdmin(withQueue(withDB(BaseServer))) {\n\n constructor(\n private auditService: AuditService,\n private providerImplService: ProviderImplService,\n private pluginRegistry: PluginRegistry,\n ) {\n super(env.audit.serverId, ServerType.AUDIT);\n }\n\n async onInit(): Promise<void> {\n await super.onInit();\n this.pluginLifecycleService.setPluginsDir(env.audit.pluginsDir);\n await this.pluginRegistry.loadAllActive();\n await this.providerImplService.warmAll();\n\n await this.queueService.consume(env.queue.auditNotificationQueue, async (_id, content: NotificationEvent) => {\n await this.auditService.logNotification(content);\n })\n\n await this.queueService.consume(env.queue.auditRequestQueue, async (_id, content: HoloWorkerRequest) => {\n await this.auditService.logRequest(content);\n });\n\n await this.queueService.consume(env.queue.auditResponseQueue, async (_id, content: HoloWorkerRequest) => {\n await this.auditService.logResponse(content);\n });\n }\n\n async onShutdown(): Promise<void> {\n await super.onShutdown();\n }\n\n async onError(error: Error): Promise<void> {\n await super.onError(error);\n }\n}\n","import './container/base.registry';\nimport './container/audit.registry';\nimport {container} from 'tsyringe';\nimport {AuditServer} from './servers/audit.server';\n\nconst server = container.resolve(AuditServer);\nawait server.start();\n","import './container/base.registry';\nimport './container/api.registry';\nimport './container/worker.registry';\nimport './container/audit.registry';\nimport {container} from 'tsyringe';\nimport {ApiServer} from './servers/api.server';\nimport {WorkerServer} from './servers/worker.server';\nimport {AuditServer} from './servers/audit.server';\n\nconst api = container.resolve(ApiServer);\nconst worker = container.resolve(WorkerServer);\nconst audit = container.resolve(AuditServer);\n\nawait api.start();\nawait Promise.all([worker.start(), audit.start()]);\n","import 'reflect-metadata';\nimport {readFileSync} from 'fs';\nimport {dirname, join} from 'path';\nimport {fileURLToPath} from 'url';\nimport {Command} from 'commander';\nimport {initCommand} from './cli/init';\nimport {startCommand} from './cli/start';\nimport {viewCommand} from './cli/view';\nimport {doctorCommand} from './cli/doctor';\nimport {pluginCommand} from './cli/plugin';\n\nfunction readVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf8'));\n return pkg.version as string;\n } catch {\n return 'unknown';\n }\n}\n\nconst program = new Command();\nprogram\n .name('holo')\n .description('Holokai Holo — provider-agnostic LLM gateway')\n .version(readVersion());\n\nprogram.addCommand(initCommand);\nprogram.addCommand(startCommand);\nprogram.addCommand(viewCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(pluginCommand);\n\nawait program.parseAsync();\n","import {randomBytes} from 'crypto';\nimport {existsSync} from 'fs';\nimport {Command} from 'commander';\nimport {confirm, input, password} from '@inquirer/prompts';\nimport {ensureHolokaiDirs} from '@holokai/holo-sdk/env';\nimport {type HoloSettings, loadSettings, SETTINGS_FILE, writeSettings} from '../services/settings';\n\ninterface InitFlags {\n nonInteractive?: boolean;\n force?: boolean;\n jwtSecret?: string;\n credentialKey?: string;\n pgHost?: string;\n pgPort?: string;\n pgUser?: string;\n pgPassword?: string;\n pgDatabase?: string;\n rabbitmqUrl?: string;\n redisUrl?: string;\n mokuUrl?: string;\n apiId?: string;\n workerId?: string;\n auditId?: string;\n}\n\nfunction genHex(bytes: number): string {\n return randomBytes(bytes).toString('hex');\n}\n\nfunction genBase64(bytes: number): string {\n return randomBytes(bytes).toString('base64');\n}\n\nfunction suffix(): string {\n return randomBytes(4).toString('hex');\n}\n\nasync function promptInteractive(existing: HoloSettings | null): Promise<HoloSettings> {\n const pre = existing ?? {};\n console.log('\\nHolo configuration wizard — press Enter to accept the default shown in brackets.\\n');\n\n const jwt_secret = await input({\n message: 'JWT secret (blank = generate 32-byte hex)',\n default: pre.jwt?.secret ?? '',\n });\n const credential_key = await input({\n message: 'Credential encryption key (blank = generate 32-byte base64)',\n default: pre.encryption?.credential_key ?? '',\n });\n const pg_host = await input({message: 'Postgres host', default: pre.postgres?.host ?? 'localhost'});\n const pg_port = await input({message: 'Postgres port', default: String(pre.postgres?.port ?? 5432)});\n const pg_user = await input({message: 'Postgres user', default: pre.postgres?.user ?? 'holo'});\n const pg_password = await password({\n message: 'Postgres password',\n mask: '*',\n });\n const pg_database = await input({message: 'Postgres database', default: pre.postgres?.database ?? 'holokai'});\n const rabbitmq_url = await input({message: 'RabbitMQ URL', default: pre.rabbitmq?.url ?? 'amqp://localhost:5672'});\n const redis_url = await input({message: 'Redis URL', default: pre.redis?.url ?? 'redis://localhost:6379'});\n const moku_url = await input({message: 'Moku URL', default: pre.moku?.url ?? 'http://localhost:8080'});\n const api_id = await input({message: 'API server id', default: pre.servers?.api_id ?? `api-${suffix()}`});\n const worker_id = await input({message: 'Worker server id', default: pre.servers?.worker_id ?? `worker-${suffix()}`});\n const audit_id = await input({message: 'Audit server id', default: pre.servers?.audit_id ?? `audit-${suffix()}`});\n\n return {\n jwt: {secret: jwt_secret || genHex(32)},\n encryption: {credential_key: credential_key || genBase64(32)},\n postgres: {\n host: pg_host,\n port: parseInt(pg_port, 10),\n user: pg_user,\n password: pg_password || pre.postgres?.password,\n database: pg_database,\n },\n rabbitmq: {url: rabbitmq_url},\n redis: {url: redis_url},\n moku: {url: moku_url},\n servers: {api_id, worker_id, audit_id},\n };\n}\n\nfunction collectFromFlags(flags: InitFlags, existing: HoloSettings | null): HoloSettings {\n const pre = existing ?? {};\n return {\n jwt: {\n secret: flags.jwtSecret ?? pre.jwt?.secret ?? genHex(32),\n },\n encryption: {\n credential_key: flags.credentialKey ?? pre.encryption?.credential_key ?? genBase64(32),\n },\n postgres: {\n host: flags.pgHost ?? pre.postgres?.host,\n port: flags.pgPort ? parseInt(flags.pgPort, 10) : pre.postgres?.port,\n user: flags.pgUser ?? pre.postgres?.user,\n password: flags.pgPassword ?? pre.postgres?.password,\n database: flags.pgDatabase ?? pre.postgres?.database,\n },\n rabbitmq: {url: flags.rabbitmqUrl ?? pre.rabbitmq?.url},\n redis: {url: flags.redisUrl ?? pre.redis?.url},\n moku: {url: flags.mokuUrl ?? pre.moku?.url},\n servers: {\n api_id: flags.apiId ?? pre.servers?.api_id ?? `api-${suffix()}`,\n worker_id: flags.workerId ?? pre.servers?.worker_id ?? `worker-${suffix()}`,\n audit_id: flags.auditId ?? pre.servers?.audit_id ?? `audit-${suffix()}`,\n },\n };\n}\n\nexport const initCommand = new Command('init')\n .description('Set up Holo configuration in ~/.holokai/config/settings.json')\n .option('--non-interactive', 'Skip prompts; use flags + existing values + defaults')\n .option('--force', 'Overwrite existing settings without asking')\n .option('--jwt-secret <secret>')\n .option('--credential-key <key>')\n .option('--pg-host <host>')\n .option('--pg-port <port>')\n .option('--pg-user <user>')\n .option('--pg-password <password>')\n .option('--pg-database <database>')\n .option('--rabbitmq-url <url>')\n .option('--redis-url <url>')\n .option('--moku-url <url>')\n .option('--api-id <id>')\n .option('--worker-id <id>')\n .option('--audit-id <id>')\n .action(async (flags: InitFlags) => {\n ensureHolokaiDirs();\n const existing = loadSettings();\n if (existsSync(SETTINGS_FILE) && !flags.force && !flags.nonInteractive) {\n const overwrite = await confirm({\n message: `Settings already exist at ${SETTINGS_FILE}. Overwrite?`,\n default: false,\n });\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n }\n const settings = flags.nonInteractive\n ? collectFromFlags(flags, existing)\n : await promptInteractive(existing);\n writeSettings(settings);\n console.log(`\\n✓ Wrote ${SETTINGS_FILE}`);\n console.log(' Start a server with: holo start [api|worker|audit|aio]');\n });\n","import {Command} from 'commander';\n\nconst SERVERS = ['api', 'worker', 'audit', 'aio'] as const;\ntype ServerName = typeof SERVERS[number];\n\nconst ENTRIES: Record<ServerName, () => Promise<unknown>> = {\n api: () => import('../app'),\n worker: () => import('../worker'),\n audit: () => import('../audit'),\n aio: () => import('../aio'),\n};\n\nexport const startCommand = new Command('start')\n .description('Start a Holo server (default: aio)')\n .argument('[server]', `Server to start: ${SERVERS.join('|')}`, 'aio')\n .action(async (server: string) => {\n if (!SERVERS.includes(server as ServerName)) {\n console.error(`Unknown server \"${server}\". Use one of: ${SERVERS.join(', ')}.`);\n process.exit(2);\n }\n await ENTRIES[server as ServerName]();\n });\n","import {existsSync} from 'fs';\nimport {resolve} from 'path';\nimport {Command} from 'commander';\nimport dotenv from 'dotenv';\nimport {applySettingsToEnv, loadSettings, SETTINGS_FILE} from '../services/settings';\n\ninterface ViewFlags {\n json?: boolean;\n reveal?: boolean;\n effective?: boolean;\n}\n\nconst MASKED_PATHS = new Set([\n 'jwt.secret',\n 'encryption.credential_key',\n 'postgres.password',\n]);\n\nconst EFFECTIVE_ENV_VARS = [\n 'JWT_SECRET',\n 'JWT_ALGORITHM',\n 'CREDENTIAL_ENCRYPTION_KEY',\n 'AUDIT_PG_HOST',\n 'AUDIT_PG_PORT',\n 'AUDIT_PG_USER',\n 'AUDIT_PG_PASSWORD',\n 'AUDIT_PG_DATABASE',\n 'RABBITMQ_URL',\n 'REDIS_URL',\n 'MOKU_URL',\n 'API_SERVER_ID',\n 'WORKER_ID',\n 'AUDIT_ID',\n] as const;\n\nfunction mask(value: string | number | undefined): string {\n if (value == null) return '';\n const s = String(value);\n if (s.length <= 8) return '*'.repeat(s.length);\n return `${s.slice(0, 4)}…${s.slice(-4)} (${s.length} chars, masked)`;\n}\n\nfunction maskValue(path: string, value: unknown): unknown {\n if (MASKED_PATHS.has(path)) return mask(value as string | number | undefined);\n return value;\n}\n\nfunction deepMaskClone(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n out[k] = deepMaskClone(v as Record<string, unknown>, path);\n } else {\n out[k] = maskValue(path, v);\n }\n }\n return out;\n}\n\nfunction formatHuman(settings: Record<string, unknown>, reveal: boolean): string {\n const rendered = reveal ? settings : deepMaskClone(settings);\n const lines: string[] = [];\n const walk = (obj: Record<string, unknown>, depth: number): void => {\n const pad = ' '.repeat(depth);\n for (const [k, v] of Object.entries(obj)) {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n lines.push(`${pad}${k}:`);\n walk(v as Record<string, unknown>, depth + 1);\n } else {\n lines.push(`${pad}${k.padEnd(22)}: ${v ?? ''}`);\n }\n }\n };\n walk(rendered, 0);\n return lines.join('\\n');\n}\n\nfunction formatEffective(reveal: boolean): string {\n const lines: string[] = [];\n for (const name of EFFECTIVE_ENV_VARS) {\n const v = process.env[name];\n if (v == null || v === '') {\n lines.push(` ${name.padEnd(28)} : <unset>`);\n continue;\n }\n const isSecret = /SECRET|KEY|PASSWORD/.test(name);\n const display = isSecret && !reveal ? mask(v) : v;\n lines.push(` ${name.padEnd(28)} : ${display}`);\n }\n return lines.join('\\n');\n}\n\nexport const viewCommand = new Command('view')\n .description('Show current Holo settings (credentials masked by default)')\n .option('--json', 'Emit raw JSON instead of a formatted view')\n .option('--reveal', 'Show secrets unmasked (use with care — pipes/redirects expose them)')\n .option('--effective', 'Show the effective process.env values after dotenv + settings.json merge')\n .action((flags: ViewFlags) => {\n if (flags.effective) {\n // Run the same merge env.ts would: dotenv first, then settings.json.\n dotenv.config({path: [resolve(import.meta.dirname, '../../../.env'), '.env']});\n applySettingsToEnv();\n }\n const settings = loadSettings();\n if (!settings || !existsSync(SETTINGS_FILE)) {\n console.log(`No settings file at ${SETTINGS_FILE}.`);\n console.log('Run `holo init` to create one, or rely entirely on env vars.');\n if (flags.effective) {\n console.log('\\nEffective env (from $VAR + .env only):');\n console.log(formatEffective(flags.reveal ?? false));\n }\n return;\n }\n\n if (flags.reveal) {\n console.warn('⚠ --reveal printed unmasked secrets. Avoid in shared shells, pipes, or logs.\\n');\n }\n\n if (flags.json) {\n const obj = flags.reveal ? settings : deepMaskClone(settings as unknown as Record<string, unknown>);\n console.log(JSON.stringify(obj, null, 2));\n return;\n }\n\n console.log(SETTINGS_FILE);\n console.log('─'.repeat(60));\n console.log(formatHuman(settings as unknown as Record<string, unknown>, flags.reveal ?? false));\n\n if (flags.effective) {\n console.log('\\nEffective env ($VAR > .env > settings.json):');\n console.log(formatEffective(flags.reveal ?? false));\n }\n });\n","import {Command} from 'commander';\n\nexport const doctorCommand = new Command('doctor')\n .description('Run runtime diagnostics (not yet implemented)')\n .action(() => {\n console.log('holo doctor: not yet implemented.');\n console.log('Planned checks: env vars set, ~/.holokai/ writable, Postgres/RabbitMQ/Redis reachable, plugins valid.');\n });\n","import {Command} from 'commander';\n\nexport const pluginCommand = new Command('plugin')\n .description('Manage Holo plugins (not yet implemented)');\n\npluginCommand\n .command('list')\n .description('List installed plugins')\n .action(() => {\n console.log('holo plugin list: not yet implemented.');\n });\n\npluginCommand\n .command('install <package>')\n .description('Install a plugin from npm')\n .action((pkg: string) => {\n console.log(`holo plugin install ${pkg}: not yet implemented.`);\n });\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAQA,YAAYC,iBAAgB;AACpC,OAAOC,QAAQ;AACf,SAAQC,MAAMC,eAAc;AAE5B,SAASC,qBAAAA;AACL,MAAIC,QAAQC,IAAIC,aAAc,QAAOJ,QAAQE,QAAQC,IAAIC,YAAY;AACrE,QAAMC,SAASN,KAAKD,GAAGQ,QAAO,GAAI,UAAA;AAClC,MAAIV,WAAWS,MAAAA,EAAS,QAAOA;AAC/B,MAAIH,QAAQC,IAAII,cAAe,QAAOR,KAAKG,QAAQC,IAAII,eAAe,SAAA;AACtE,SAAOF;AACX;AAgBO,SAASG,oBAAAA;AACZ,aAAWC,OAAO;IAACL;IAAcM;IAAaC;IAAYC;IAAUC;KAAW;AAC3E,QAAI,CAACjB,WAAWa,GAAAA,GAAM;AAClBZ,gBAAUY,KAAK;QAACK,WAAW;MAAI,CAAA;IACnC;EACJ;AACJ;AAhCA,IAYaV,cACAM,aAGAC,YAGAC,UAGAC;AAtBb;;;AAISZ;AAQF,IAAMG,eAAeH,mBAAAA;AACrB,IAAMS,cAAcR,QAAQC,IAAIY,mBACjCf,QAAQE,QAAQC,IAAIY,gBAAgB,IACpChB,KAAKK,cAAc,SAAA;AAClB,IAAMO,aAAaT,QAAQC,IAAIa,qBAChChB,QAAQE,QAAQC,IAAIa,kBAAkB,IACtCjB,KAAKK,cAAc,QAAA;AAClB,IAAMQ,WAAWV,QAAQC,IAAIc,UAC9BjB,QAAQE,QAAQC,IAAIc,OAAO,IAC3BlB,KAAKK,cAAc,MAAA;AAClB,IAAMS,WAAWX,QAAQC,IAAIe,mBAC9BlB,QAAQE,QAAQC,IAAIe,gBAAgB,IACpCnB,KAAKK,cAAc,MAAA;AAETI;;;;;AC1BhB,SAAQW,cAAAA,aAAYC,aAAAA,YAAWC,cAAcC,qBAAoB;AACjE,SAAQC,SAASC,QAAAA,aAAW;AAoCrB,SAASC,eAAAA;AACZ,MAAI,CAACN,YAAWO,aAAAA,EAAgB,QAAO;AACvC,MAAI;AACA,WAAOC,KAAKC,MAAMP,aAAaK,eAAe,MAAA,CAAA;EAClD,QAAQ;AACJ,WAAO;EACX;AACJ;AAEO,SAASG,cAAcC,UAAsB;AAChDV,EAAAA,WAAUG,QAAQG,aAAAA,GAAgB;IAACK,WAAW;EAAI,CAAA;AAClDT,gBAAcI,eAAeC,KAAKK,UAAUF,UAAU,MAAM,CAAA,IAAK,IAAA;AACrE;AAEO,SAASG,qBAAAA;AACZ,QAAMC,IAAIT,aAAAA;AACV,MAAI,CAACS,EAAG;AACR,QAAMC,MAAM,wBAACC,KAAaC,QAAAA;AACtB,QAAIA,OAAO,QAAQ,CAACC,QAAQC,IAAIH,GAAAA,GAAM;AAClCE,cAAQC,IAAIH,GAAAA,IAAOI,OAAOH,GAAAA;IAC9B;EACJ,GAJY;AAKZF,MAAI,cAAcD,EAAEO,KAAKC,MAAAA;AACzBP,MAAI,iBAAiBD,EAAEO,KAAKE,SAAAA;AAC5BR,MAAI,6BAA6BD,EAAEU,YAAYC,cAAAA;AAC/CV,MAAI,iBAAiBD,EAAEY,UAAUC,IAAAA;AACjCZ,MAAI,iBAAiBD,EAAEY,UAAUE,IAAAA;AACjCb,MAAI,iBAAiBD,EAAEY,UAAUG,IAAAA;AACjCd,MAAI,qBAAqBD,EAAEY,UAAUI,QAAAA;AACrCf,MAAI,qBAAqBD,EAAEY,UAAUK,QAAAA;AACrChB,MAAI,gBAAgBD,EAAEkB,UAAUC,GAAAA;AAChClB,MAAI,aAAaD,EAAEoB,OAAOD,GAAAA;AAC1BlB,MAAI,YAAYD,EAAEqB,MAAMF,GAAAA;AACxBlB,MAAI,iBAAiBD,EAAEsB,SAASC,MAAAA;AAChCtB,MAAI,aAAaD,EAAEsB,SAASE,SAAAA;AAC5BvB,MAAI,YAAYD,EAAEsB,SAASG,QAAAA;AAC/B;AAzEA,IAmCajC;AAnCb;;;AAEA;AAiCO,IAAMA,gBAAgBF,MAAKoC,YAAY,eAAA;AAE9BnC;AASAI;AAKAI;;;;;ACnDhB,SAAQ4B,cAAAA,mBAAiB;AACzB,SAAQC,qBAAoB;AAC5B,SAAQC,WAAAA,UAASC,QAAAA,OAAMC,WAAAA,gBAAc;AACrC,SAAQC,qBAAoB;AAMrB,SAASC,uBAAAA;AACZ,MAAIC,QAAQC,IAAIC,gBAAiB,QAAOL,SAAQG,QAAQC,IAAIC,eAAe;AAE3E,QAAMC,WAAWL,cAAc,IAAIM,IAAI,KAAK,YAAYC,GAAG,CAAA;AAI3D,MAAIC,QAAQH;AACZ,WAASI,IAAI,GAAGA,IAAI,IAAIA,KAAK;AACzB,QAAID,MAAME,MAAM,OAAA,EAASC,IAAG,MAAO,eAAgB,QAAOH;AAC1D,UAAMI,SAASf,SAAQW,KAAAA;AACvB,QAAII,WAAWJ,MAAO;AACtBA,YAAQI;EACZ;AAOA,MAAIC,YAA2B;AAC/BL,UAAQH;AACR,WAASI,IAAI,GAAGA,IAAI,IAAIA,KAAK;AACzB,UAAMK,YAAYhB,MAAKU,OAAO,cAAA;AAC9B,QAAIb,YAAWG,MAAKgB,WAAW,UAAA,CAAA,EAAcD,aAAYC;AACzD,UAAMF,SAASf,SAAQW,KAAAA;AACvB,QAAII,WAAWJ,MAAO;AACtBA,YAAQI;EACZ;AACA,MAAIC,UAAW,QAAOA;AAEtB,SAAOd,SAAQM,UAAU,MAAM,MAAM,cAAA;AACzC;AAzCA,IAKMU;AALN;;;AAOA;AAFA,IAAMA,WAAUnB,cAAc,YAAYW,GAAG;AAI7BN;;;;;ACTT,SAASe,aAAaC,OAA2BC,eAAwB,OAAK;AACjF,MAAI,CAACD,MAAO,QAAOC;AACnB,SAAOD,MAAME,YAAW,MAAO;AACnC;AAEO,SAASC,YAAYH,OAA2BC,cAAoB;AACvE,MAAI,CAACD,MAAO,QAAOC;AACnB,QAAMG,SAASC,SAASL,OAAO,EAAA;AAC/B,SAAOM,MAAMF,MAAAA,IAAUH,eAAeG;AAC1C;AAEO,SAASG,WAAWP,OAA2BC,eAAyB,CAAA,GAAE;AAC7E,MAAI,CAACD,MAAO,QAAOC;AACnB,SAAOD,MAAMQ,MAAM,GAAA,EAAKC,IAAIC,CAAAA,SAAQA,KAAKC,KAAI,CAAA;AACjD;AAdA;;;AAAgBZ;AAKAI;AAMAI;;;;;ACFhB,SAAQK,WAAAA,gBAAc;AACtB,OAAOC,YAAY;AAVnB;AAAA,IAAAC,YAAA;;;AAWA;AACA;AACA;AAEAD,WAAOE,OAAO;MAACC,MAAM;QAACJ,SAAQ,YAAYK,SAAS,YAAA;QAAe;;IAAO,CAAA;AACzEC,uBAAAA;AACAC,sBAAAA;cAEiBC,MAAAA;WACAC,WAAWC,QAAQF,IAAIC,YAAY;WACnCE,KAAKD,QAAQF,IAAII,OAAO,IAAIF,QAAQF,IAAII,IAAI,KAAKC,KAAKC,OAAM,EAAGC,SAAS,EAAA,EAAIC,UAAU,GAAG,EAAA;WACzFC,SAASC;gBAGLC,MAAAA;aACAC,cAAcV,QAAQF,IAAIa,iBAAiB,OAAKb,KAAEG,EAAAA;aAClDW,OAAOC,YAAYb,QAAQF,IAAII,MAAM,GAAA;aACrCY,aAAad,QAAQF,IAAIiB,mBAAmB;aAC5CC,aAAahB,QAAQF,IAAImB,mBAAmB;aAC5CC,kBAAkBL,YAAYb,QAAQF,IAAIqB,oBAAoB,GAAA;aAC9DC,gBAAgBC,qBAAAA;aAChBC,aAAaC;aACbC,qBAAqBC,aAAazB,QAAQF,IAAI4B,sBAAsB,KAAA;aACpEC,qBAAqBF,aAAazB,QAAQF,IAAI8B,sBAAsB7B,KAAAA,aAAa,aAAA;aACjF8B,wBAAwBhB,YAAYb,QAAQF,IAAIgC,0BAA0B,GAAA;aAC1EC,4BAA4BlB,YAAYb,QAAQF,IAAIkC,8BAA8B,CAAA;kBAG9EC,eAAAA;wBAEAC,iBAAiBrB,YAAYb,QAAQF,IAAIqC,wBAAwB,IAAA;wBACjEC,qBAAqBvB,YAAYb,QAAQF,IAAIuC,4BAA4B,GAAA;wBACzEC,iBAAiBzB,YAAYb,QAAQF,IAAIyC,wBAAwB,GAAA;wBAIjEC,WAAWxC,QAAQF,IAAI2C,kBAAkB;wBACzCC,mBAAmB1C,QAAQF,IAAI6C,4BAA4B;wBAC3DC,kBAAkB5C,QAAQF,IAAI+C,sBAAsB;wBAIpDC,eAAeC,WAAW/C,QAAQF,IAAIkD,qBAAqB,CAAA,CAAE;QAC9E,GAAAvC,KAfiBwB,kBAAAA,KAAAA,gBAAAA,CAAAA,EAAAA;MAgBrB,GAAAnC,KA9BiBW,QAAAA,KAAAA,MAAAA,CAAAA,EAAAA;gBAiCAwC,OAAAA;cACAC,OAAOlD,QAAQF,IAAIqD,eAAenD,QAAQF,IAAIsD,iBAAiB;cAC/DxC,OAAOC,YAAYb,QAAQF,IAAIuD,eAAerD,QAAQF,IAAIwD,eAAe,IAAA;cACzEC,WAAWvD,QAAQF,IAAI0D,mBAAmBxD,QAAQF,IAAI2D,qBAAqB;cAC3EC,OAAO1D,QAAQF,IAAI6D,eAAe3D,QAAQF,IAAI8D,iBAAiB;cAC/DC,WAAW7D,QAAQF,IAAIgE,mBAAmB9D,QAAQF,IAAIiE,qBAAqB;cAC3EC,MAAMvC,aAAazB,QAAQF,IAAImE,cAAcjE,QAAQF,IAAIoE,cAAc,KAAA;cACvEC,iBAAiBtD,YAAYb,QAAQF,IAAIsE,0BAA0BpE,QAAQF,IAAIuE,0BAA0B,EAAA;cACzGC,cAAczD,YAAYb,QAAQF,IAAIyE,uBAAuBvE,QAAQF,IAAI0E,uBAAuB,GAAA;cAEhG/E,SAAS;UAClByD,MAAI,MAAJA;UACAtC,MAAI,MAAJA;UACA2C,UAAQ,MAARA;UACAG,MAAI,MAAJA;UACAG,UAAQ,MAARA;UACAG,KAAG,MAAHA;UACAS,KAAG,MAAEN;UACLO,mBAAiB,MAAEJ;QACvB;MACJ,GAAAxE,KApBiBmD,UAAAA,KAAAA,QAAAA,CAAAA,EAAAA;gBAuBA0B,SAAAA;gBACAzB,OAAOlD,QAAQF,IAAIsD,iBAAiBpD,QAAQF,IAAIqD,eAAe;gBAC/DvC,OAAOC,YAAYb,QAAQF,IAAIwD,iBAAiBtD,QAAQF,IAAIuD,aAAa,IAAA;gBACzEE,WAAWvD,QAAQF,IAAI2D,qBAAqBzD,QAAQF,IAAI0D,mBAAmB;gBAC3EE,OAAO1D,QAAQF,IAAI8D,iBAAiB5D,QAAQF,IAAI6D,eAAe;gBAC/DE,WAAW7D,QAAQF,IAAIiE,qBAAqB/D,QAAQF,IAAIgE,mBAAmB;gBAC3EE,MAAMvC,aAAazB,QAAQF,IAAIoE,gBAAgBlE,QAAQF,IAAImE,YAAY,KAAA;gBACvEE,iBAAiBtD,YAAYb,QAAQF,IAAIuE,4BAA4BrE,QAAQF,IAAIsE,wBAAwB,EAAA;gBACzGE,cAAczD,YAAYb,QAAQF,IAAI0E,yBAAyBxE,QAAQF,IAAIyE,qBAAqB,GAAA;gBAEhG9E,SAAS;UAClByD,MAAI,QAAJA;UACAtC,MAAI,QAAJA;UACA2C,UAAQ,QAARA;UACAG,MAAI,QAAJA;UACAG,UAAQ,QAARA;UACAG,KAAG,QAAHA;UACAS,KAAG,QAAEN;UACLO,mBAAiB,QAAEJ;QACvB;MACJ,GAAAxE,KApBiB6E,YAAAA,KAAAA,UAAAA,CAAAA,EAAAA;gBAsBAC,OAAAA;cACAC,MAAM7E,QAAQF,IAAIgF,aAAa;MAChD,GAAAhF,KAFiB8E,UAAAA,KAAAA,QAAAA,CAAAA,EAAAA;gBAKAG,OAAAA;cACAF,MAAM7E,QAAQF,IAAIkF,gBAAgB;cAClCC,oBAAoBpE,YAAYb,QAAQF,IAAIoF,6BAA6B,CAAA;cACzEC,mBAAmBtE,YAAYb,QAAQF,IAAIsF,6BAA6B,GAAA;AAErF,cAAMC,SAASrF,QAAQF,IAAIwF,gBAAgB;AAE3C,iBAASC,EAAEC,MAAY;AACnB,iBAAOH,SAAS,GAAGA,MAAAA,IAAUG,IAAAA,KAASA;QAC1C;AAFSD;cAIIE,eAAezF,QAAQF,IAAI4F,0BAA0BH,EAAE,cAAA;cACvDI,kBAAkB3F,QAAQF,IAAI8F,6BAA6BL,EAAE,uBAAA;cAC7DM,gBAAgB7F,QAAQF,IAAIgG,2BAA2BP,EAAE,eAAA;cACzDQ,mBAAmB/F,QAAQF,IAAIkG,8BAA8BT,EAAE,wBAAA;cAE/DU,gBAAgBjG,QAAQF,IAAIoG,2BAA2BX,EAAE,WAAA;cACzDY,iBAAiBnG,QAAQF,IAAIsG,4BAA4Bb,EAAE,iBAAA;cAC3Dc,oBAAoBrG,QAAQF,IAAIwG,gCAAgCf,EAAE,oBAAA;cAClEgB,wBAAwBvG,QAAQF,IAAI0G,oCAAoCjB,EAAE,qBAAA;cAC1EkB,qBAAqBzG,QAAQF,IAAI4G,iCAAiCnB,EAAE,qBAAA;cAEpEoB,mBAAmB3G,QAAQF,IAAI8G,8BAA8BrB,EAAE,UAAA;cAE/DsB,oBAAoB7G,QAAQF,IAAIgH,gCAAgCvB,EAAE,oBAAA;cAClEwB,qBAAqB/G,QAAQF,IAAIkH,iCAAiCzB,EAAE,qBAAA;cACpE0B,kBAAkBjH,QAAQF,IAAIoH,qBAAqB3B,EAAE,OAAA;cAErD4B,aAAanH,QAAQF,IAAIsH,wBAAwB7B,EAAE,YAAA;cACnD8B,kBAAkBrH,QAAQF,IAAIwH,qBAAqB/B,EAAE,YAAA;cAErDgC,kBAAkBvH,QAAQF,IAAI0H,oBAAoB;cAElDC,kBAAkBzH,QAAQF,IAAI4H,0BAA0BnC,EAAE,kBAAA;cAE1DoC,uBAAuB3H,QAAQF,IAAI8H,kCAAkCrC,EAAE,wBAAA;cACvEsC,oBAAoB7H,QAAQF,IAAIgI,+BAA+BvC,EAAE,eAAA;cACjEwC,yBAAyB/H,QAAQF,IAAIkI,qCAAqCzC,EAAE,qBAAA;cAE5E9F,SAAS;UAClBoF,KAAG,MAAHA;UACAI,mBAAiB,MAAjBA;UACAE,kBAAgB,MAAhBA;QACJ;MACJ,GAAArF,KA5CiBiF,UAAAA,KAAAA,QAAAA,CAAAA,EAAAA;gBA8CAkD,SAAAA;gBACAC,WAAWlI,QAAQF,IAAIqI,aAAa,UAAQrI,KAAEG,EAAAA;gBAC9CqB,aAAatB,QAAQF,IAAIsI,sBAAsB3H,KAAAA,IAAIa;gBACnD+E,oBAAoB,GAAGtB,KAAAA,MAAMsB,iBAAiB,IAAI4B,KAAAA,OAAOC,QAAQ;MAClF,GAAApI,KAJiBmI,WAAAA,KAAAA,SAAAA,CAAAA,EAAAA;gBAMAI,QAAAA;eACAH,WAAWlI,QAAQF,IAAIwI,YAAY,SAAOxI,KAAEG,EAAAA;eAC5CqB,aAAatB,QAAQF,IAAIyI,qBAAqB9H,KAAAA,IAAIa;MACnE,GAAAxB,KAHiBuI,UAAAA,KAAAA,QAAAA,CAAAA,EAAAA;gBAKAG,OAAAA;cACAN,WAAWlI,QAAQF,IAAI2I,YAChC,SAAO3I,KAAEG,EAAAA;MACjB,GAAAH,KAHiB0I,UAAAA,KAAAA,QAAAA,CAAAA,EAAAA;AAWjB,UAAI,CAACxI,QAAQF,IAAI4I,YAAY;AACzB,cAAM,IAAIC,MAAM,6CAAA;MACpB;WAEaC,YAAuB;QAChCC,QAAQ7I,QAAQF,IAAI4I;QACpBI,WAAW9I,QAAQF,IAAIiJ,kBAAkB;QACzCC,WAAW;MACf;WAEaC,UAAUjJ,QAAQF,IAAIoJ,YAAY;gBAE9BC,UAAAA;iBACAC,gBAAgBpJ,QAAQF,IAAIuJ;AACzC,YAAI,CAAA,SAACD,eAAe;AAChB,gBAAM,IAAIT,MAAM,gFAAA;QACpB;iBAEaW,qBAAqBvG,WAC9B/C,QAAQF,IAAIyJ,sBACZ;UAAC;UAAyB;SAAwB;MAE1D,GAAAzJ,KAViBqJ,aAAAA,KAAAA,WAAAA,CAAAA,EAAAA;IAWrB,GApLiBrJ,QAAAA,MAAAA,CAAAA,EAAAA;;;;;ACnBjB,OAAO;AACP,OAAO0J,aAAa;AACpB,OAAOC,QAAQ;AACf,OAAOC,UAAU;AAEjB,SAAQC,iBAAqC;AAqC7C,SAASC,WAAWC,IAAO;AACvB,QAAMC,IAAI,IAAIC,KAAKF,EAAAA;AACnB,QAAMG,KAAKC,OAAOH,EAAEI,SAAQ,CAAA,EAAIC,SAAS,GAAG,GAAA;AAC5C,QAAMC,KAAKH,OAAOH,EAAEO,WAAU,CAAA,EAAIF,SAAS,GAAG,GAAA;AAC9C,QAAMG,KAAKL,OAAOH,EAAES,WAAU,CAAA,EAAIJ,SAAS,GAAG,GAAA;AAC9C,QAAMK,KAAKP,OAAOH,EAAEW,gBAAe,CAAA,EAAIN,SAAS,GAAG,GAAA;AACnD,SAAO,GAAGH,EAAAA,IAAMI,EAAAA,IAAME,EAAAA,IAAME,EAAAA;AAChC;AAEA,SAASE,WAAWC,MAAY;AAC5B,QAAMC,OAAOD,KAAKE,MAAM,QAAA;AACxB,MAAID,QAAQA,KAAKE,UAAU,EAAG,QAAOF,KAAKG,KAAK,EAAA;AAC/C,SAAOJ,KAAKK,MAAM,GAAG,CAAA;AACzB;AAEA,SAASC,SAASC,GAAWC,OAAa;AACtC,MAAID,EAAEJ,UAAUK,MAAO,QAAOD,EAAEE,OAAOD,OAAO,GAAA;AAC9C,SAAOD,EAAEF,MAAM,GAAGK,KAAKC,IAAI,GAAGH,QAAQ,CAAA,CAAA,IAAM;AAChD;AAEA,SAASI,SAASC,KAAcC,IAAI,GAAC;AACjC,MAAI,CAACD,IAAK,QAAO;AACjB,QAAMN,IAAIjB,OAAOuB,GAAAA;AACjB,SAAO,OAAON,EAAEJ,UAAUW,IAAIP,IAAIA,EAAEF,MAAM,CAACS,CAAAA,CAAAA;AAC/C;AAEA,SAASC,eAAeC,KAAcC,KAAcT,QAAQ,IAAE;AAC1D,QAAMU,IAAIF,MAAM1B,OAAO0B,GAAAA,IAAO;AAC9B,QAAMG,IAAIF,MAAM3B,OAAO2B,GAAAA,IAAO;AAC9B,MAAI,CAACC,KAAK,CAACC,EAAG,QAAO;AAErB,QAAMC,OAAOF,KAAKC,IAAI,GAAGD,CAAAA,IAAKC,CAAAA,KAAOD,KAAKC;AAC1C,MAAIC,KAAKjB,UAAUK,MAAO,QAAOY;AAEjC,MAAIF,KAAKC,GAAG;AACR,UAAME,OAAO,GAAGtB,WAAWmB,CAAAA,CAAAA,IAAMC,CAAAA;AACjC,QAAIE,KAAKlB,UAAUK,MAAO,QAAOa;AAGjC,UAAMC,eAAeZ,KAAKC,IAAI,GAAGH,SAASW,EAAEhB,SAAS,EAAA;AACrD,UAAMoB,WAAWjB,SAASY,GAAGI,YAAAA,EAAcE,KAAI;AAC/C,WAAO,GAAGD,QAAAA,IAAYJ,CAAAA,GAAId,MAAM,GAAGG,KAAAA;EACvC;AAEA,SAAOY,KAAKf,MAAM,GAAGG,KAAAA;AACzB;AAEO,SAASiB,mBAAmBC,UAAgB;AAC/C,QAAMC,QAAQ;AACd,QAAMC,QAAQ;AACd,QAAMC,QAAQ;AACd,QAAMC,QAAQ;AAEd,QAAMC,OAAO,wBAACC,QAAAA;AACV,UAAMC,IAAID,IAAIE,YAAW;AACzB,QAAID,MAAM,QAAS,QAAO;AAC1B,QAAIA,MAAM,QAAS,QAAO;AAC1B,QAAIA,MAAM,OAAQ,QAAO;AACzB,QAAIA,MAAM,OAAQ,QAAO;AACzB,QAAIA,MAAM,QAAS,QAAO;AAC1B,QAAIA,MAAM,OAAQ,QAAO;AACzB,QAAIA,MAAM,UAAW,QAAO;AAC5B,QAAIA,MAAM,QAAS,QAAO;AAC1B,WAAOA,EAAE5B,MAAM,GAAG,CAAA,EAAG8B,YAAW;EACpC,GAXa;AAab,SAAOtD,QAAQuD,OAAOC,QAClBxD,QAAQuD,OAAOE,UAAS,GACxBzD,QAAQuD,OAAOG,OAAO,CAAC,EAACC,OAAAA,QAAOC,SAASH,WAAWI,WAAWC,YAAYC,WAAW,GAAGC,SAAAA,MAAS;AAC7F,UAAMC,OAAO7D,WAAWqD,SAAAA;AAExB,UAAMS,aAAaP,OAAMQ,QAAQ,eAAe,EAAA;AAChD,UAAMhB,MAAM1B,SAASyB,KAAKgB,UAAAA,GAAapB,KAAAA,EAAOH,KAAI;AAClD,UAAMyB,MAAM3C,SAASoB,UAAUE,KAAAA,EAAOJ,KAAI;AAC1C,UAAM0B,MAAM5C,SAASS,eAAe2B,WAAiCC,YAAkCd,KAAAA,GAAQA,KAAAA,EAAOsB,QAAO;AAC7H,UAAMtC,MAAMP,SAASM,SAASgC,WAAiC,CAAA,GAAId,KAAAA,EAAON,KAAI;AAE9E,QAAI4B,MAAM,GAAGN,IAAAA,IAAQd,GAAAA,IAAOiB,GAAAA,IAAOC,GAAAA,IAAOrC,GAAAA,IAAO4B,OAAAA;AACjD,QAAIY,OAAOC,KAAKT,QAAAA,EAAU1C,SAAS,GAAG;AAClCiD,aAAO,IAAIG,KAAKC,UAAUX,QAAAA,CAAAA;IAC9B;AACA,WAAOO;EACX,CAAA,GACAvE,QAAQuD,OAAOqB,SAAS;IAACC,KAAK;EAAI,CAAA,CAAA;AAE1C;AA8BO,SAASC,oBAAoBjC,UAAgB;AAChD,SAAO;IACHc,OAAOA,MAAAA;IACPoB;IACAxB,QAAQX,mBAAmBC,QAAAA;IAC3BmC;EACJ;AACJ;AApKA,IAOMC,QAWOF,QAWAG,QAoGPF,YAwBArB,OAaAwB,YAKAC,QASOC,oBAcb;AAlMA;;;AAIA,IAAAC;AAGA,IAAML,SAASM,IAAIN;AAEnB,QAAI;AACA,UAAI,CAAChF,GAAGuF,WAAWP,MAAAA,GAAS;AACxBhF,WAAGwF,UAAUR,QAAQ;UAACS,WAAW;QAAI,CAAA;MACzC;IACJ,SAASC,OAAO;AACZC,cAAQC,KAAK,6CAA8CF,MAAgB/B,OAAO,EAAE;AACpFgC,cAAQC,KAAK,yBAAA;IACjB;AAEO,IAAMd,SAAS;MAClBe,OAAO;MACPH,OAAO;MACPE,MAAM;MACNE,MAAM;MACNC,MAAM;MACNC,SAAS;MACTC,OAAO;MACPC,OAAO;IACX;AAEO,IAAMjB,SAAS;MAClBY,OAAO;MACPH,OAAO;MACPE,MAAM;MACNE,MAAM;MACNC,MAAM;MACNC,SAAS;MACTC,OAAO;MACPC,OAAO;IACX;AAEAnG,YAAQoG,UAAUlB,MAAAA;AAET9E;AASAc;AAMAO;AAKAM;AAMAG;AAqBOU;AAwChB,IAAMoC,aAAoB;MACtB,IAAIhF,QAAQgF,WAAWqB,QAAO;;AAGlC,QAAI;AACApG,SAAGqG,WAAWrB,QAAQhF,GAAGsG,UAAUC,IAAI;AAEvCxB,iBAAWyB,KACP,IAAIzG,QAAQgF,WAAW0B,KAAK;QACxBC,UAAUzG,KAAKqB,KAAK0D,QAAQ,WAAA;QAC5BtB,OAAO;MACX,CAAA,CAAA;AAGJqB,iBAAWyB,KACP,IAAIzG,QAAQgF,WAAW0B,KAAK;QACxBC,UAAUzG,KAAKqB,KAAK0D,QAAQ,SAAA;MAChC,CAAA,CAAA;IAER,SAASU,OAAO;AACZC,cAAQC,KAAK,yDAA0DF,MAAgB/B,OAAO,EAAE;AAChGgC,cAAQC,KAAK,yBAAA;IACjB;AAEA,IAAMlC,QAAQ,6BAAA;AACV,aAAO4B,IAAIqB,aAAa,gBAAgB,UAAU;IACtD,GAFc;AAIE9B;AAShB,IAAMK,aAAanF,QAAQ6G,aACvB/B,oBAAoBS,IAAIuB,EAAE,CAAA;AAI9B,IAAM1B,SAASD;AAMdC,WAAeU,QAAQX,WAAW4B,IAAIC,KAAK7B,YAAY,OAAA;AACvDC,WAAee,QAAQhB,WAAW4B,IAAIC,KAAK7B,YAAY,OAAA;AAEjD,IAAME,qBAAiF;AAE9FlF,cAAU8G,SAAS5B,oBAAoB;MACnC6B,YAAY,6BAAM,CAAC/E,QAAAA;AACf,cAAMgF,cAAchC,WAAWiC,MAAM;UAACvD,WAAY1B,IAAiBhB,QAAQgB;QAAG,CAAA;AAI7EgF,oBAAoBrB,QAAQqB,YAAYJ,IAAIC,KAAKG,aAAa,OAAA;AAC9DA,oBAAoBhB,QAAQgB,YAAYJ,IAAIC,KAAKG,aAAa,OAAA;AAC/D,eAAOA;MACX,GARY;IAShB,CAAA;AAEA,IAAA,iBAAe/B;;;;;AClMf,SAAQiC,YAAkD;AAA1D,IAQaC;AARb;;;AAEA;AACA,IAAAC;AAKO,IAAMD,QAAN,MAAMA;MARb,OAQaA;;;;MACQE;MACTC,eAAe;MAEvB,YAA6BC,SAAyBC,IAAIC,MAAMF,QAAQ;aAA3CA,SAAAA;AACzB,aAAKF,OAAO,IAAIH,KAAK,KAAKK,MAAM;MACpC;MAEA,MAAMG,UAAyB;AAC3B,YAAI;AAEA,gBAAMC,MAAM,MAAM,KAAKN,KAAKO,MAAM,cAAA;AAClCC,yBAAOC,KAAK,yCAAyCH,IAAII,KAAK,CAAA,EAAGJ,GAAG,EAAE;QAC1E,SAASK,OAAO;AACZH,yBAAOG,MAAM,oCAAqCA,MAAgBC,OAAO,EAAE;AAC3E,gBAAMD;QACV;MACJ;MAEA,MAAME,aAA4B;AAC9B,YAAI,KAAKb,QAAQ,CAAC,KAAKC,cAAc;AACjC,eAAKA,eAAe;AACpB,gBAAM,KAAKD,KAAKc,IAAG;AACnBN,yBAAOC,KAAK,8BAAA;QAChB;MACJ;MAEAM,UAAgB;AACZ,YAAI,CAAC,KAAKf,MAAM;AACZ,gBAAM,IAAIgB,MAAM,wBAAA;QACpB;AACA,eAAO,KAAKhB;MAChB;;;;;;;MAQA,MAAMO,MAAsCU,MAAcC,QAA8B;AACpF,cAAMlB,OAAO,KAAKe,QAAO;AACzB,eAAOf,KAAKO,MAAMU,MAAMC,MAAAA,EAAQC,KAAK,CAACC,WAAWA,OAAOV,IAAI;MAChE;;;;;;;MAQA,MAAMW,YAA4CJ,MAAcC,QAAyC;AACrG,cAAMlB,OAAO,KAAKe,QAAO;AACzB,eAAOf,KAAKO,MAAMU,MAAMC,MAAAA;MAC5B;;;;;;;MAQA,MAAMI,SAAkBL,MAAcC,QAAmC;AACrE,eAAO,KAAKX,MAAMU,MAAMC,MAAAA,EAAQC,KAAK,CAACT,SAASA,KAAK,CAAA,KAAM,IAAA;MAC9D;;;;;;;MAQA,MAAMa,YAAqBN,MAAcC,QAAmC;AACxE,cAAME,SAAS,MAAM,KAAKC,YAAYJ,MAAMC,MAAAA;AAC5C,YAAIE,OAAOV,KAAKc,WAAW,EAAG,QAAO;AACrC,cAAMC,WAAWL,OAAOV,KAAK,CAAA;AAC7B,eAAOgB,OAAOC,OAAOF,QAAAA,EAAU,CAAA;MACnC;;;;;;MAOA,MAAMG,WAAWC,SAAkE;AAC/E,eAAO,KAAKC,YAAY,OAAOC,WAAAA;AAC3B,gBAAMC,UAAU,CAAA;AAChB,qBAAWzB,SAASsB,SAAS;AACzB,kBAAMT,SAAS,MAAMW,OAAOxB,MAAMA,MAAMU,MAAMV,MAAMW,MAAM;AAC1Dc,oBAAQC,KAAKb,OAAOV,IAAI;UAC5B;AACA,iBAAOsB;QACX,CAAA;MACJ;MAEA,MAAME,OAAUC,OAAeC,UAAmD;AAC9E,eAAO,KAAKN,YAAY,OAAOC,WAAAA;AAC3B,gBAAMA,OAAOxB,MACT,kEACA;YAAC4B;WAAM;AAEX,iBAAOC,SAASL,MAAAA;QACpB,CAAA;MACJ;MAEA,MAAMM,SAAYD,UAAmD;AACjE,eAAO,KAAKN,YAAY,OAAOC,WAAAA;AAC3B,gBAAMA,OAAOxB,MACT,uDAAuD;AAE3D,iBAAO6B,SAASL,MAAAA;QACpB,CAAA;MACJ;MAEA,MAAMO,YAA4CrB,MAAcC,QAA8B;AAC1F,eAAO,KAAKmB,SAAS,OAAON,WAAAA;AACxB,gBAAMX,SAAS,MAAMW,OAAOxB,MAAMU,MAAMC,MAAAA;AACxC,iBAAOE,OAAOV;QAClB,CAAA;MACJ;MAEA,MAAM6B,eAAwBtB,MAAcC,QAAmC;AAC3E,eAAO,KAAKmB,SAAS,OAAON,WAAAA;AACxB,gBAAMX,SAAS,MAAMW,OAAOxB,MAAMU,MAAMC,MAAAA;AACxC,iBAAOE,OAAOV,KAAK,CAAA,KAAM;QAC7B,CAAA;MACJ;MAEA,MAAM8B,kBAA2BvB,MAAcC,QAAmC;AAC9E,eAAO,KAAKmB,SAAS,OAAON,WAAAA;AACxB,gBAAMX,SAAS,MAAMW,OAAOxB,MAAMU,MAAMC,MAAAA;AACxC,cAAIE,OAAOV,KAAKc,WAAW,EAAG,QAAO;AACrC,gBAAMC,WAAWL,OAAOV,KAAK,CAAA;AAC7B,iBAAOgB,OAAOC,OAAOF,QAAAA,EAAU,CAAA;QACnC,CAAA;MACJ;MAEA,MAAMK,YAAeM,UAAmD;AACpE,cAAMpC,OAAO,KAAKe,QAAO;AACzB,cAAMgB,SAAS,MAAM/B,KAAKK,QAAO;AAEjC,YAAI;AACA,gBAAM0B,OAAOxB,MAAM,OAAA;AACnB,gBAAMa,SAAS,MAAMgB,SAASL,MAAAA;AAC9B,gBAAMA,OAAOxB,MAAM,QAAA;AACnB,iBAAOa;QACX,SAAST,OAAO;AACZ,gBAAMoB,OAAOxB,MAAM,UAAA;AACnB,gBAAMI;QACV,UAAA;AACIoB,iBAAOU,QAAO;QAClB;MACJ;MAEAC,cAAuB;AACnB,eAAO,KAAK1C,SAAS;MACzB;IACJ;;;;;ACrKA,OAAO;AACP,SAAQ2C,kBAAiB;;;;;;;;;;IAInBC,6BAqBOC;;;;AAxBb;;;AAGA,IAAMD,8BAA8B;;;;;;;;;;;;;;;;;;;AAqB7B,IAAMC,gBAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MACpB;MAEA,MAAMC,QAAQC,IAAyC;AACnD,eAAO,KAAKF,GAAGG,eAA4BL,8BAA8B,kBAAkB;UAACI;SAAG;MACnG;MAEA,MAAME,UAAUC,OAAeC,SAA8C;AACzE,eAAO,KAAKN,GAAGG,eACXL,8BAA8B,mDAC9B;UAACO;UAAOC;SAAQ;MAExB;MAEA,MAAMC,kBAAkBD,SAA8C;AAClE,eAAO,KAAKN,GAAGG,eAA4BL,8BAA8B,wBAAwB;UAACQ;SAAQ;MAC9G;MAEA,MAAME,YAAYH,OAAuC;AACrD,eAAO,KAAKL,GAAGS,YAAyBX,8BAA8B,+CAA+C;UAACO;SAAM;MAChI;MAEA,MAAMK,cAAcC,SAEjBC,OAAeC,QAAgBC,QAAgBC,SAG/C;AACC,cAAMC,aAAuB;UAAC;;AAC9B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIP,QAAQQ,QAAQ;AAChBH,qBAAWI,KAAK,wBAAwBF,KAAAA,EAAO;AAC/CD,iBAAOG,KAAKT,QAAQQ,MAAM;QAC9B;AACA,YAAIR,QAAQU,aAAa;AACrBL,qBAAWI,KAAK,oBAAoBF,KAAAA,EAAO;AAC3CD,iBAAOG,KAAKT,QAAQU,WAAW;QACnC;AACA,YAAIV,QAAQW,QAAQ;AAChBN,qBAAWI,KAAK,kBAAkBF,GAAAA,yBAA4BA,GAAAA,GAAM;AACpED,iBAAOG,KAAK,IAAIT,QAAQW,MAAM,GAAG;AACjCJ;QACJ;AAEA,cAAMK,QAAQP,WAAWQ,KAAK,OAAA;AAC9B,cAAMC,eAAe,oBAAIC,IAAI;UAAC;UAAQ;UAAY;UAAc;SAAa;AAC7E,cAAMC,MAAMF,aAAaG,IAAId,MAAAA,IAAUA,SAAS;AAChD,cAAMe,MAAMd,YAAY,QAAQ,QAAQ;AAExC,cAAMe,WAAWZ;AACjB,cAAMa,YAAYb;AAClB,eAAO,KAAKlB,GAAGgC,SAAS,OAAOC,WAAAA;AAC3B,gBAAM,CAACC,YAAYC,WAAAA,IAAe,MAAMC,QAAQC,IAAI;YAChDJ,OAAOK,MACH;;;6BAGSf,KAAAA;kCACKI,GAAAA,IAAOE,GAAAA;8BACXC,QAAAA,YAAoBC,SAAAA,IAC9B;iBAAId;cAAQL;cAAOC;aAAO;YAE9BoB,OAAOK,MAAM;;sCAESf,KAAAA,IAASN,MAAAA;WAClC;AACD,iBAAO;YACHsB,MAAML,WAAWK;YACjBC,OAAOC,SAASN,YAAYI,KAAK,CAAA,GAAIG,SAAS,GAAA;UAClD;QACJ,CAAA;MACJ;MAEA,MAAMC,OAAOC,KAAuD;AAChE,eAAO,KAAK5C,GAAGG,eACX;;;2BAIA;UAACyC,IAAIC;UAAiBD,IAAIE;UAAMF,IAAIG;UAAUH,IAAII,eAAe;UAC7DJ,IAAIvB;UAAauB,IAAIK,oBAAoB;UAAML,IAAIM,WAAW;UAAMN,IAAIO,aAAa;SAAK;MAEtG;MAEA,MAAMC,OAAOlD,IAAYmD,QAA0D;AAC/E,cAAMC,OAAiB,CAAA;AACvB,cAAMrC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,cAAMqC,YAAY;UAAC;UAAQ;UAAY;UAAe;UAAe;UAAoB;UAAW;;AACpG,mBAAWC,OAAOD,WAAW;AACzB,cAAIF,OAAOG,GAAAA,MAASC,QAAW;AAC3BH,iBAAKlC,KAAK,GAAGoC,GAAAA,OAAUtC,KAAAA,EAAO;AAC9BD,mBAAOG,KAAKiC,OAAOG,GAAAA,CAAI;UAC3B;QACJ;AAEA,YAAIF,KAAKI,WAAW,EAAG,QAAO,KAAKzD,QAAQC,EAAAA;AAE3CoD,aAAKlC,KAAK,oBAAoB;AAC9BH,eAAOG,KAAKlB,EAAAA;AACZ,eAAO,KAAKF,GAAGG,eAA4B;0DACOmD,KAAK9B,KAAK,IAAA,CAAA;kEACFN,GAAAA,kCAAqCD,MAAAA;MACnG;MAEA,MAAM0C,WAAWzD,IAA8B;AAC3C,cAAM0D,SAAS,MAAM,KAAK5D,GAAGG,eAA4B;;;;iFAIgB;UAACD;SAAG;AAC7E,eAAO0D,WAAW;MACtB;IACJ;;;;;;;;;;;;AC/IA,OAAO;AAEP,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IASZC;;;;AAVb;;;AAUO,IAAMA,aAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MAEpB;MAEA,MAAMC,OAA0C;AAC5C,cAAMC,QAAQ;;;;;;;;;;AAUd,eAAO,KAAKF,GAAGG,YAAoCD,KAAAA;MACvD;MAEA,MAAME,IAAIC,MAAsD;AAC5D,cAAMH,QAAQ;;;;;;;;;;AAUd,eAAO,KAAKF,GAAGM,eAAuCJ,OAAO;UAACG;SAAK;MACvE;MAEA,MAAME,QAAQC,IAAoD;AAC9D,cAAMN,QAAQ;;;;;;;;;AASd,eAAO,KAAKF,GAAGM,eAAuCJ,OAAO;UAACM;SAAG;MACrE;MAEA,MAAMC,kBAAkBC,OAA8D;AAClF,eAAO,KAAKV,GAAGG,YACX;;;qCAIA;UAACO;SAAM;MAEf;MAEA,MAAMC,eAAeC,UAAqD;AACtE,eAAO,KAAKZ,GAAGG,YAAY;;;;;;;;WAQxB;UAACS;SAAS;MACjB;MAEA,MAAMC,sBAAsBC,QAAgBC,gBAAyC;AACjF,cAAMC,SAAS,MAAM,KAAKhB,GAAGG,YACzB;;;;;;;qCAQA;UAACW,OAAOG,YAAW;UAAIF;SAAe;AAE1C,eAAQC,OAAeE,UAAU;MACrC;MAEA,MAAMC,cAAcC,SAEjBC,OAAeC,QAAgBC,QAAgBC,SAA+D;AAC7G,cAAMC,aAAuB;UAAC;;AAC9B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIP,QAAQQ,QAAQ;AAChBH,qBAAWI,KAAK,wBAAwBF,KAAAA,EAAO;AAC/CD,iBAAOG,KAAKT,QAAQQ,MAAM;QAC9B;AACA,YAAIR,QAAQU,YAAYC,QAAW;AAC/BN,qBAAWI,KAAK,gBAAgBF,KAAAA,EAAO;AACvCD,iBAAOG,KAAKT,QAAQU,OAAO;QAC/B;AACA,YAAIV,QAAQY,QAAQ;AAChBP,qBAAWI,KAAK,iBAAiBF,KAAAA,EAAO;AACxCD,iBAAOG,KAAK,IAAIT,QAAQY,MAAM,GAAG;QACrC;AAEA,cAAMC,QAAQR,WAAWS,KAAK,OAAA;AAC9B,cAAMC,eAAe,oBAAIC,IAAI;UAAC;UAAQ;UAAc;UAAc;SAAO;AACzE,cAAMC,MAAMF,aAAaG,IAAIf,MAAAA,IAAUA,SAAS;AAChD,cAAMgB,MAAMf,YAAY,QAAQ,QAAQ;AAExC,cAAMgB,WAAWb;AACjB,cAAMc,YAAYd;AAClB,eAAO,KAAK3B,GAAG0C,SAAS,OAAOC,WAAAA;AAC3B,gBAAM,CAACC,YAAYC,WAAAA,IAAe,MAAMC,QAAQC,IAAI;YAChDJ,OAAOzC,MACH;;6BAES+B,KAAAA;kCACKI,GAAAA,IAAOE,GAAAA;8BACXC,QAAAA,YAAoBC,SAAAA,IAC9B;iBAAIf;cAAQL;cAAOC;aAAO;YAE9BqB,OAAOzC,MACH;;6BAES+B,KAAAA,IAASP,MAAAA;WAEzB;AACD,iBAAO;YACHsB,MAAMJ,WAAWI;YACjBC,OAAOC,SAASL,YAAYG,KAAK,CAAA,GAAIG,SAAS,GAAA;UAClD;QACJ,CAAA;MACJ;MAEA,MAAMC,OAAOC,UAAwF;AACjG,eAAO,KAAKrD,GAAGM,eACX;;;2BAIA;UAAC+C,SAASC;UAAiBD,SAAShD;UAAMgD,SAASE;UAAMF,SAASG,eAAe;UAC7EC,KAAKC,UAAUL,SAASM,MAAM;UAAGN,SAASO,qBAAqB;UAAMP,SAASQ;UAC9ER,SAASS,mBAAmB;UAAMT,SAASvB;UAASuB,SAASU;UAAWV,SAASW;UAASX,SAASY;SAAO;MAEtH;MAEA,MAAMC,OAAO1D,IAAY2D,QAAqD;AAC1E,cAAMC,OAAiB,CAAA;AACvB,cAAM1C,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,cAAM0C,YAAgC;UAAC;UAAQ;UAAQ;UAAe;UAAW;UAAa;UAAa;UAAmB;;AAC9H,mBAAWC,OAAOD,WAAW;AACzB,cAAIF,OAAOG,GAAAA,MAASvC,QAAW;AAC3BqC,iBAAKvC,KAAK,GAAGyC,GAAAA,OAAU3C,KAAAA,EAAO;AAC9BD,mBAAOG,KAAKsC,OAAOG,GAAAA,CAAI;UAC3B;QACJ;AACA,YAAIH,OAAOR,WAAW5B,QAAW;AAC7BqC,eAAKvC,KAAK,aAAaF,KAAAA,EAAO;AAC9BD,iBAAOG,KAAK4B,KAAKC,UAAUS,OAAOR,MAAM,CAAA;QAC5C;AAEA,YAAIS,KAAKlD,WAAW,EAAG,QAAO,KAAKlB,GAAGM,eAAyB;;wFAEiB;UAACE;SAAG;AAEpF4D,aAAKvC,KAAK,oBAAoB;AAC9BH,eAAOG,KAAKrB,EAAAA;AACZ,eAAO,KAAKR,GAAGM,eACX;mBACO8D,KAAKlC,KAAK,IAAA,CAAA;2BACFP,GAAAA,kCAAqCD,MAAAA;MAE5D;MAEA,MAAM6C,WAAW/D,IAA8B;AAC3C,cAAMQ,SAAS,MAAM,KAAKhB,GAAGM,eACzB;;;;;4BAKgB;UAACE;SAAG;AAExB,eAAOQ,WAAW;MACtB;MAEA,MAAMwD,mBAAmB1D,QAAgB2D,iBAA6D;AAClG,YAAIA,iBAAiB;AACjB,iBAAO,KAAKzE,GAAGG,YAAY;;;;;;;;eAQxB;YAACW,OAAOG,YAAW;YAAIwD;WAAgB;QAC9C;AACA,eAAO,KAAKzE,GAAGG,YAAY;;;;;;;WAOxB;UAACW,OAAOG,YAAW;SAAG;MAC7B;IACJ;;;;;;;;;;;;AC3MA,IAAayD,YAOAC;AAPb;;;AAAO,IAAMD,aAAa;MACtBE,UAAU;MACVC,WAAW;IACf;AAIO,IAAMF,cAAc;MACvBG,eAAe;MACfC,cAAc;MACdC,OAAO;MACPC,OAAO;MACPC,YAAY;MACZC,WAAW;IACf;;;;;AC9BA;;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACYA;;;;;;;ACaA;;;;;;;ACoJA;;;;;;;AC7KA;;;;;;;ACAA,IAAaC;AAAb,IAAAC,eAAA;;;AAAO,IAAMD,gBAAgB;MACzBE,cAAc;MACdC,WAAW;MACXC,kBAAkB;MAClBC,WAAW;MACXC,eAAe;MACfC,gBAAgB;MAChBC,iBAAiB;MACjBC,SAAS;IACb;;;;;ACiDA;;;;;;;AC1DA;;;;;;;ACQA;;;;;;;ACCA;;;;;;;ACTA;;;;;;;ACAA;;;;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;;;;;ACVA,IAEaC;AAFb,IAAAC,eAAA;;;;AAEO,IAAMD,YAAN,MAAMA,mBAAkBE,MAAAA;MAF/B,OAE+BA;;;;;MAC3B,YACoBC,YAChBC,SACgBC,OAAsBC,cAAcC,gBACtD;AACE,cAAMH,OAAAA,GAAAA,KAJUD,aAAAA,YAAAA,KAEAE,OAAAA;AAGhB,aAAKG,OAAO;MAChB;MAEA,OAAOC,SAASC,UAA6B;AACzC,eAAO,IAAIV,WAAU,KAAK,GAAGU,QAAAA,cAAsBJ,cAAcK,SAAS;MAC9E;MAEA,OAAOC,WAAWR,SAA4B;AAC1C,eAAO,IAAIJ,WAAU,KAAKI,SAASE,cAAcO,gBAAgB;MACrE;MAEA,OAAOC,aAAaV,UAAU,gBAA2B;AACrD,eAAO,IAAIJ,WAAU,KAAKI,SAASE,cAAcS,YAAY;MACjE;MAEA,OAAOC,UAAUZ,UAAU,aAAwB;AAC/C,eAAO,IAAIJ,WAAU,KAAKI,SAASE,cAAcW,SAAS;MAC9D;MAEA,OAAOC,eAAed,UAAU,mBAA8B;AAC1D,eAAO,IAAIJ,WAAU,KAAKI,SAASE,cAAca,eAAe;MACpE;IACJ;;;;;AC9BA,SAAQC,aAAAA,kBAAqC;AAC7C,SAAQC,iBAAgB;AAgDjB,SAASC,mBAAAA;AACZ,MAAI,CAACC,eAAe;AAChB,QAAIH,WAAUI,aAAaC,qBAAoB,IAAA,GAAO;AAClDF,sBAAgBH,WAAUM,QAA2BD,mBAAAA;IACzD,OAAO;AACH,YAAM,IAAIE,gBAAgB,+BAAA;IAC9B;EACJ;AACA,SAAOJ;AACX;AAyBO,SAASK,gBAA2CC,MAAW;AAClE,SAAO,MAAMC,wBAAwBD,KAAAA;IApFzC,OAoFyCA;;;IACjC;IACA;IAEA,IAAIE,MAAkB;AAClB,WAAK,aAAa,KAAK,cAAc,KAAK,aAAaC;AACvD,aAAQ,KAAK,SAASV,iBAAAA,EAAmB,KAAK,UAAU;IAC5D;IAEAW,KAAKC,YAA2C;AAC5C,aAAO,KAAKH,IAAII,MAAM;QAACD,YAAaA,WAAwBF,QAAQE;MAAU,CAAA;IAClF;EACJ;AACJ;AAjGA,IAgCaP,iBAaAF,qBAETF,eAiBkBa,aAmCAC;AAnGtB,IAAAC,eAAA;;;AAgCO,IAAMX,kBAAN,cAA8BY,MAAAA;MAhCrC,OAgCqCA;;;MACjC,YACIC,SACF;AACE,cAAMA,OAAAA;AACN,aAAKR,OAAO;MAChB;IACJ;AAMO,IAAMP,sBAA6E;AAI1EH;AAeT,IAAec,cAAf,MAAeA;MAhEtB,OAgEsBA;;;MACRK;MAEFC;MAER,IAAcX,MAAkB;AAC5B,aAAKU,cAAc,KAAKA,eAAe,KAAK,aAAaT;AACzD,eAAQ,KAAKU,SAASpB,iBAAAA,EAAmB,KAAKmB,WAAW;MAC7D;MAEUR,KAAKC,YAA2C;AACtD,eAAO,KAAKH,IAAII,MAAM;UAACD,YAAaA,WAAwBF,QAAQE;QAAU,CAAA;MAClF;IACJ;AAMgBN;AAgBT,IAAeS,wBAAf,cAA6CT,gBAAgBP,SAAAA,EAAAA;MAnGpE,OAmGoEA;;;IACpE;;;;;ACrGA,IAAasB;AAAb;;;AAAO,IAAMA,kBAAN,MAAMA;MAAb,OAAaA;;;MACDC,IAAS,CAAA;MACTC,UAA8C,CAAA;MAC9CC,QAAQ;MACRC,MAAW;MAEnBC,KAAKC,MAAS;AACV,YAAI,KAAKH,MAAO;AAChB,cAAMI,IAAI,KAAKL,QAAQM,MAAK;AAC5B,YAAID,EAAGA,GAAE;UAACE,OAAOH;UAAMI,MAAM;QAAK,CAAA;YAC7B,MAAKT,EAAEI,KAAKC,IAAAA;MACrB;MAEAK,MAAM;AACF,aAAKR,QAAQ;AACb,eAAO,KAAKD,QAAQU,OAAQ,MAAKV,QAAQM,MAAK,EAAI;UAACC,OAAOI;UAAkBH,MAAM;QAAI,CAAA;MAC1F;MAEAI,KAAKC,GAAQ;AACT,aAAKX,MAAMW;AACX,aAAKJ,IAAG;MACZ;MAEA,CAACK,OAAOC,aAAa,IAAsB;AACvC,eAAO;UACHC,MAAM,6BAAA;AACF,gBAAI,KAAKd,IAAK,QAAOe,QAAQC,OAAO,KAAKhB,GAAG;AAC5C,gBAAI,KAAKH,EAAEW,OAAQ,QAAOO,QAAQE,QAAQ;cAACZ,OAAO,KAAKR,EAAEO,MAAK;cAAKE,MAAM;YAAK,CAAA;AAC9E,gBAAI,KAAKP,MAAO,QAAOgB,QAAQE,QAAQ;cAACZ,OAAOI;cAAkBH,MAAM;YAAI,CAAA;AAC3E,mBAAO,IAAIS,QAA2BE,CAAAA,aAAW,KAAKnB,QAAQG,KAAKgB,QAAAA,CAAAA;UACvE,GALM;QAMV;MACJ;IACJ;;;;;ACjCA;;;;;;;ACAO,SAASC,eAAeC,KAAwB;AACnD,SAAOC,OAAOC,QAAQF,GAAAA,EAAKG,OAAO,CAACC,KAAK,CAACC,KAAKC,KAAAA,MAAM;AAEhD,QAAIA,SAAS,QAAQA,UAAU,IAAI;AAC/BF,UAAIC,GAAAA,IAAOC;IACf;AACA,WAAOF;EACX,GAAG,CAAC,CAAA;AACR;AARA;;;AAAgBL;;;;;ACET,SAASQ,YAA8BC,KAAM;AAChD,QAAMC,MAAkB,CAAC;AAEzB,aAAWC,OAAOF,KAAK;AACnB,QAAIG,OAAOC,UAAUC,eAAeC,KAAKN,KAAKE,GAAAA,GAAM;AAChD,YAAMK,WAAWL;AACjB,YAAMM,QAAQR,IAAIO,QAAAA;AAClB,UAAIC,UAAUC,QAAW;AACrBR,YAAIM,QAAAA,IAAYC;MACpB;IACJ;EACJ;AAEA,SAAOP;AACX;AAdA;;;AAAgBF;;;;;ACFT,SAASW,UAAUC,KAA0BC,OAAcC,OAAU;AACxE,QAAMC,SAAS;IAAC,GAAGH;EAAG;AACtB,QAAMI,OAAOH,MAAKI,MAAM,GAAA;AACxB,MAAID,KAAKE,WAAW,GAAG;AACnBH,WAAOC,KAAK,CAAA,CAAE,IAAIF;AAClB,WAAOC;EACX;AACA,MAAII,UAAeJ;AACnB,WAASK,IAAI,GAAGA,IAAIJ,KAAKE,SAAS,GAAGE,KAAK;AACtCD,YAAQH,KAAKI,CAAAA,CAAE,IAAID,QAAQH,KAAKI,CAAAA,CAAE,IAAI;MAAC,GAAGD,QAAQH,KAAKI,CAAAA,CAAE;IAAC,IAAI,CAAC;AAC/DD,cAAUA,QAAQH,KAAKI,CAAAA,CAAE;EAC7B;AACAD,UAAQH,KAAKA,KAAKE,SAAS,CAAA,CAAE,IAAIJ;AACjC,SAAOC;AACX;AAdA;;;AAAgBJ;;;;;ACAT,SAASU,aAAaC,KAAoB;AAC7C,SAAO,OAAOA,QAAQ,WAAWA,MAAMC,KAAKC,UAAUF,GAAAA;AAC1D;AAFA;;;AAAgBD;;;;;ACAhB;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA,SAAQI,0BAAyB;AAAjC;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACEA;;;;;;;ACFA;;;IAAAC;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AChBA;;;;;;;ACAA;;;;;;;ACAA,SAAQC,YAAYC,WAAS;AAC7B,OAAOC,WAAU;AADjB;;;;;;;ACoBA;;;;;;;ACpBA,IAAAC,eAAA;;;;AACA;AACA;AACA;AACA;;;;;ACAA,IAAAC,cAAA;;;;;;;ACJA;;;IAAAC;;;;;ACAA,IAAAC,aAAA;;;;;;;ACAA,IAAaC;AAAb;;;AAAO,IAAMA,qBAAqB;MAC9BC,MAAM;MACNC,UAAU;MACVC,OAAO;MACPC,QAAQ;MACRC,SAAS;IACb;;;;;ACHA,IAAaC;AAAb;;;AAAO,IAAMA,aAAa;MACtBC,KAAK;MACLC,OAAO;MACPC,QAAQ;MACRC,OAAO;IACX;;;;;ACNA,IAQaC;AARb;;;AAQO,IAAMA,WAAW;MACpBC,UAAU;MACVC,UAAU;IACd;;;;;ACbA;;;IAAAC;AAkCA;AACA;AACA;;;;;AClBA,IAAAC,eAAA;;;;;;;AClBA,IAAAC,eAAA;;;IAAAA;;;;;ACGA,IAAaC;AAAb,IAAAC,cAAA;;;AAAO,IAAMD,wBAAwB;MACjCE,iBAAiB;MACjBC,eAAe;MACfC,cAAc;MACdC,cAAc;MACdC,QAAQ;MACRC,0BAA0B;MAC1BC,6BAA6B;MAC7BC,oBAAoB;MACpBC,gBAAgB;IACpB;;;;;ACbA;;;IAAAC;;;;;ACOA,IAAAC,iBAAA;;;;;;;ACSA,IAAaC;AAAb,IAAAC,cAAA;;;AAAO,IAAMD,oBAAoB;MAC7BE,cAAc;MACdC,YAAY;MACZC,iBAAiB;MACjBC,MAAM;MACNC,OAAO;IACX;;;;;ACtBA;;;IAAAC;AACA,IAAAC;;;;;ACCA,IAAaC;AAAb;;;AAAO,IAAMA,eAAe;MACxBC,QAAQ;MACRC,SAAS;MACTC,aAAa;MACbC,MAAM;IACV;;;;;ACPA;;;;;;;;ACsBA;;;;;;;ACNA;;;;;;;AChBA;;;;AACA;;;;;ACDA;;;;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;;;;;ACRA,IAAAC,aAAA;;;;;;;ACAA;;;IAAAC;;;;;ACEA;;;;;;;ACDA,IAAAC,aAAA;;;;;;;ACiCA;;;;;;;ACpBA,gBAAuBC,wBACnBC,QACAC,QACAC,MAAyB;AAEzB,MAAI,CAACD,OAAOE,cAAc;AACtB,qBAAiBC,MAAMJ,OAAQ,OAAMI;AACrC;EACJ;AAGA,QAAMC,MAKF;IAACC,iBAAiB;IAAMC,aAAa;IAAMC,cAAc;IAAMC,aAAa,CAAA;EAAE;AAElF,QAAMC,WAAWT,OAAOE,cACnB,mBAAA;AACG,qBAAiBC,MAAMJ,QAAQ;AAC3B,UAAII,GAAGO,SAAS,kBAAkBP,GAAGQ,SAAS,MAAM;AAChDP,YAAIC,kBAAkBF;AACtB,cAAMA,GAAGQ;MACb,WAAWR,GAAGO,SAAS,UAAUP,GAAGS,WAAW,MAAM;AACjDR,YAAIE,cAAcH;AAClB;MACJ,WAAWA,GAAGO,SAAS,SAAS;AAC5BN,YAAIG,eAAeJ;AACnB;MACJ,OAAO;AACHC,YAAII,YAAYK,KAAKV,EAAAA;MACzB;IACJ;EACJ,GAAA,CAAA;AAGJ,mBAAiBW,aAAab,KAAKc,eAAeN,QAAAA,GAA6C;AAC3F,UAAMO,MAAMZ,IAAIC;AAChB,QAAIW,IAAK,OAAM;MAAC,GAAGA;MAAKL,OAAOG;IAAS;EAC5C;AAEA,aAAWX,MAAMC,IAAII,YAAa,OAAML;AAExC,QAAMc,OAAOb,IAAIE;AACjB,MAAIW,MAAM;AACN,QAAI;AACA,YAAMC,WAAYD,KAAKE,gBAAgB,MAAMnB,OAAOoB,eAAeH,KAAKL,OAAO;AAM/E,YAAMS,IAAKJ,KAQRK;AACH,UAAIC,WAAyBL;AAC7B,UAAIG,GAAG;AACH,cAAMG,WAAWN,SAASO;AAC1B,cAAMA,QAAiCD,WAAW;UAAC,GAAGA;QAAQ,IAAI,CAAC;AAQnE,cAAME,YAAY,wBAACC,aAAsBC,SAAAA;AACrC,gBAAMC,IAAI,OAAOF,gBAAgB,WAAWA,cAAc;AAC1D,gBAAMG,IAAI,OAAOF,SAAS,WAAWA,OAAO;AAC5C,cAAIC,MAAM,KAAKC,MAAM,GAAG;AACpB,mBAAO,OAAOH,gBAAgB,WAAWA,cAAcI;UAC3D;AACA,iBAAOC,KAAKC,IAAIJ,GAAGC,CAAAA;QACvB,GAPkB;AAQlB,cAAMI,SAAQR,UAAUD,MAAMU,cAAcd,EAAEe,WAAW;AACzD,YAAIF,WAAUH,OAAWN,OAAMU,eAAeD;AAC9C,cAAMG,SAASX,UAAUD,MAAMa,eAAejB,EAAEkB,YAAY;AAC5D,YAAIF,WAAWN,OAAWN,OAAMa,gBAAgBD;AAChD,cAAMG,QAAQd,UAAUD,MAAMgB,cAAcpB,EAAEqB,WAAW;AACzD,YAAIF,UAAUT,OAAWN,OAAMgB,eAAeD;AAM9C,cAAMG,kBAAmBnB,UAA+DoB,WAAW,CAAC;AACpG,cAAMA,UAAkC;UAAC,GAAGD;QAAe;AAC3D,cAAME,QAAQ,wBAACC,OAAeA,KAAK,KAArB;AACd,YAAIF,QAAQJ,UAAUT,UAAa,OAAOV,EAAE0B,wBAAwB,UAAU;AAC1EH,kBAAQJ,QAAQK,MAAMxB,EAAE0B,mBAAmB;QAC/C;AACA,YAAIH,QAAQI,gBAAgBjB,UAAa,OAAOV,EAAE4B,qBAAqB,UAAU;AAC7EL,kBAAQI,cAAcH,MAAMxB,EAAE4B,gBAAgB;QAClD;AACA,YAAIL,QAAQM,SAASnB,UACd,OAAOV,EAAE0B,wBAAwB,YACjC,OAAO1B,EAAE4B,qBAAqB,UAAU;AAC3CL,kBAAQM,OAAOL,MAAMb,KAAKC,IAAI,GAAGZ,EAAE0B,sBAAsB1B,EAAE4B,gBAAgB,CAAA;QAC/E;AACA,YAAIE,OAAOC,KAAKR,OAAAA,EAASS,SAAS,GAAG;AACjC5B,gBAAMmB,UAAUA;QACpB;AACA,YAAIO,OAAOC,KAAK3B,KAAAA,EAAO4B,SAAS,GAAG;AAC/B9B,qBAAW4B,OAAOG,OAAO,CAAC,GAAGpC,UAAU;YAACO;UAAqC,CAAA;QACjF;MACJ;AACA,YAAM;QAAC,GAAGR;QAAML,SAAS,MAAMX,KAAKsD,iBAAiBhC,QAAAA;MAAS;IAClE,QAAQ;AACJ,YAAMN;IACV;EACJ;AACA,QAAMuC,MAAMpD,IAAIG;AAChB,MAAIiD,IAAK,OAAMA;AACnB;AApIA;;;AAYuB1D;;;;;ACdvB;;;;AACA,IAAA2D;AACA;AACA;;;;;ACMA,IAAAC,aAAA;;;;;;;ACTA,IAGsBC;AAHtB,IAAAC,aAAA;;;;AAGO,IAAeD,kBAAf,cAAuCE,YAAAA;MAH9C,OAG8CA;;;;;MAC1CC,UAAU;MAEV,YACoBC,WACAC,aAClB;AACE,cAAK,GAAA,KAHWD,YAAAA,WAAAA,KACAC,cAAAA;MAGpB;MAEA,MAAMC,kBAAkBC,IAAyC;AAC7D,YAAI,CAAC,KAAKF,YAAa,QAAO,KAAKG,iBAAiBD,EAAAA;AACpD,eAAO,KAAKE,cAAcF,EAAAA;MAC9B;;MAKUG,sBAA8C;AACpD,eAAO;UAAC,gBAAgB;QAAkB;MAC9C;MAEUC,mBAA2C;AACjD,eAAO;UACH,gBAAgB;UAChB,iBAAiB;UACjB,cAAc;QAClB;MACJ;MAEUC,uBAAuBL,IAA2C;AACxE,eAAQA,GAAGM,SAAS,WAAW,CAAC,KAAKR,cAAe,KAAKK,oBAAmB,IAAK,KAAKC,iBAAgB;MAC1G;MAEA,MAAgBG,SAASP,IAAmBQ,QAAsCC,MAAaC,UAIxE;AACnB,cAAMC,UAAU,KAAKf,WAAW;AAChC,cAAMgB,MAAM,KAAKhB;AACjB,cAAMiB,OAAO,MAAML,OAAOR,EAAAA;AAC1B,cAAMc,WAAWJ,UAASI;AAE1B,cAAMC,QAAQC,YAAY;UACtBF;UACAjB,WAAW,KAAKA;UAChBe;UACAK,UAAUjB,GAAGY;UACbC;UACAJ;QACJ,CAAA;AAEA,YAAIE,SAAS;AACT,gBAAMO,SAASR,UAASQ,WAAWlB,GAAGM,SAAS,UAAWN,GAAGkB,UAAU,MAAO;AAC9E,gBAAMC,UACFT,UAASS,YACRnB,GAAGM,SAAS,WAAWN,GAAGmB,UAAUnB,GAAGmB,UAAUC,WAAc,KAAKf,uBAAuBL,EAAAA;AAEhGe,gBAAMG,SAASA;AACfH,gBAAMI,UAAUA;QACpB,OAAO;AAEH,cAAIT,UAASQ,WAAWE,OAAWL,OAAMG,SAASR,SAAQQ;AAC1D,cAAIR,UAASS,QAASJ,OAAMI,UAAUT,SAAQS;QAClD;AAEA,eAAOJ;MACX;;MAGA,MAAgBd,iBAAiBD,IAAyC;AACtE,YAAIA,GAAGM,SAAS,QAAQ;AACpB,iBAAO;YAAC,MAAM,KAAKC,SAASP,IAAI,OAAOA,QAEhCqB,aAAarB,IAAGsB,OAAO,GAAG,IAAA;;QACrC;AACA,YAAItB,GAAGM,SAAS,SAAS;AACrB,iBAAO;YAAC,MAAM,KAAKC,SAASP,IAAI,OAAOA,QAEhCqB,aAAarB,IAAGuB,KAAK,GAAG,MAAMP,YAAY;cAACE,QAAQlB,GAAGkB,UAAU;cAAKC,SAASnB,GAAGmB;YAAO,CAAA,CAAA;;QACnG;AACA,eAAO,CAAA;MACX;;MAGA,MAAgBjB,cAAcF,IAAyC;AACnE,gBAAQA,GAAGM,MAAI;UACX,KAAK;AACD,mBAAO,KAAKkB,cAAcxB,EAAAA;UAC9B,KAAK;AACD,mBAAO,KAAKyB,gBAAgBzB,EAAAA;UAChC,KAAK;AACD,mBAAO,KAAK0B,iBAAiB1B,EAAAA;UACjC,KAAK;UACL;AACI,mBAAO,CAAA;QACf;MACJ;MAEA,MAAgBwB,cAAcxB,IAA4E;AACtG,eAAO;UAAC,MAAM,KAAKO,SAASP,IAAI,KAAK2B,4BAA4BC,KAAK,IAAI,CAAA;;MAC9E;MAEA,MAAgBH,gBAAgBzB,IAAoE;AAChG,eAAO;UAAC,MAAM,KAAKO,SAASP,IAAI,KAAK6B,2BAA2BD,KAAK,IAAI,GAAG,MAAM;YAACd,UAAUd,GAAG8B;UAAI,CAAA;;MACxG;MAEA,MAAgBJ,iBAAiB1B,IAAqE;AAClG,YAAI,KAAKJ,YAAY,GAAG;AACpB,iBAAO,MAAM,KAAKK,iBAAiBD,EAAAA;QACvC;AAEA,eAAO;UAAC,MAAM,KAAKO,SAASP,IAAI,KAAK+B,4BAA4BH,KAAK,IAAI,GAAG,IAAA;;MACjF;MAEA,MAAgBC,2BAA2B7B,IAA+D;AACtG,eAAO,KAAKgC,WAAWhC,GAAGsB,OAAO;MACrC;MAEA,MAAgBS,4BAA4B/B,IAAgE;AACxG,eAAOqB,aAAarB,GAAGuB,KAAK;MAChC;MAEA,MAAgBI,4BAA4B3B,IAAuE;AAC/G,eAAO,KAAKgC,WAAWhC,GAAGiC,KAAK;MACnC;IACJ;;;;;AC4EA,SAASC,gBAAgBC,IAEvB;AACE,QAAMC,MAAMD,GAAGE;AACf,MAAI,CAACD,IAAK,QAAO;AACjB,QAAME,SAASF,IAAIG,eAAeH,IAAII,iBAAiBJ,IAAIK,UAAU,CAAA,GAAID;AACzE,UAAQF,QAAAA;IACJ,KAAK;IACL,KAAK;AACD,aAAO;IACX,KAAK;IACL,KAAK;AACD,aAAO;IACX,KAAK;IACL,KAAK;AACD,aAAO;IACX,KAAK;AACD,aAAO;IACX;AACI,aAAO;EACf;AACJ;AAhOA,IAIaI;AAJb;;;IAAAC;AAEA;AAEO,IAAMD,kBAAN,cAA8BE,gBAAAA;MAJrC,OAIqCA;;;MACzBC,kBAAkB;MAClBC,YAA2E,oBAAIC,IAAAA;MAC/EC;MACAC;MACAC,aAAa;MACJC;MAEjB,YAAYC,WAAmBC,aAAsBC,cAAuBH,YAAiC;AACzG,cAAMC,WAAWC,WAAAA;AACjB,YAAIC,aAAc,MAAKL,QAAQK;AAC/B,aAAKH,aAAaA;MACtB;MAEAI,WAAWC,MAAwC;AAC/C,YAAI,OAAOA,SAAS,UAAU;AAC1B,iBAAO,UAAUA,IAAAA;;;;QACrB;AACA,eAAO,UAAUA,KAAKC,IAAI;QAAWC,KAAKC,UAAUH,IAAAA,CAAAA;;;MACxD;MAEAI,YAAYC,IAAYZ,OAAgC;AACpD,aAAKD,aAAaa;AAClB,aAAKZ,QAAQA;AACb,eAAO;UACHQ,MAAM;UACNK,UAAU;YAACD;YAAIZ;YAAOc,QAAQ,CAAA;YAAIC,SAASC,KAAKC,IAAG;YAAIC,OAAO,CAAC;YAAG3B,eAAe;UAAI;QACzF;MACJ;MAEA4B,cAAcC,OAAeC,MAA+B;AACxD,aAAKzB,mBAAmByB;AACxB,eAAO;UAACb,MAAM;UAA8BY;UAAOE,OAAOD;QAAI;MAClE;MAEAE,mBAAmBH,OAAeC,MAA+B;AAC7D,eAAO;UAACb,MAAM;UAA4BY;UAAOE,OAAOD;QAAI;MAChE;MAEAG,kBAAkBJ,OAAeE,OAAkF;AAC/G,cAAMG,WAAW,KAAK5B,UAAU6B,IAAIN,KAAAA;AACpC,YAAIK,UAAU;AACV,cAAIH,MAAMV,GAAIa,UAASb,KAAKU,MAAMV;AAClC,cAAIU,MAAMK,KAAMF,UAASE,QAAQL,MAAMK;AACvC,cAAIL,MAAMM,gBAAiBH,UAASI,aAAaP,MAAMM;QAC3D,OAAO;AACH,gBAAME,QAA0D;YAC5DH,MAAML,MAAMK,QAAQ;YACpBE,WAAWP,MAAMM,mBAAmB;UACxC;AACA,cAAIN,MAAMV,GAAIkB,OAAMlB,KAAKU,MAAMV;AAC/B,eAAKf,UAAUkC,IAAIX,OAAOU,KAAAA;QAC9B;AACA,eAAO;UAACtB,MAAM;UAA4BY;UAAOY,iBAAiBV;QAAK;MAC3E;MAEA,MAAMW,cAAc/C,IAAmBgD,WAAkD;AACrF,eAAO;UAAC,MAAM,KAAKC,SAASjD,IAAI,YAAY,KAAKoB,WAAW4B,SAAAA,CAAAA;;MAChE;MAEA,MAAgBE,iBAAiBlD,IAAyC;AACtE,YAAIA,GAAGsB,SAAS,QAAQ;AACpB,cAAI,KAAKN,eAAe,WAAW,KAAKA,eAAe,WAAW;AAC9D,mBAAO;cAAC,MAAM,KAAKiC,SAASjD,IAAI,YAAYuB,KAAKC,UAAUxB,GAAGE,OAAO,GAAG,IAAA;;UAC5E;AACA,gBAAMyB,WAAW3B,GAAGmD,gBAAgB,KAAKC,mBAAmBpD,EAAAA;AAC5D,iBAAO;YAAC,MAAM,KAAKiD,SAASjD,IAAI,YAAYuB,KAAKC,UAAUG,QAAAA,GAAW,IAAA;;QAC1E;AACA,YAAI3B,GAAGsB,SAAS,SAAS;AACrB,gBAAM+B,SAASrD,GAAGqD,UAAU;AAC5B,gBAAMC,YAAY,OAAOtD,GAAGuD,UAAU,WAChC;YAACrD,SAASF,GAAGuD;UAAK,IACjBvD,GAAGuD,SAAS;YAACrD,SAASF,GAAGmC,QAAQ;UAAe;AACvD,gBAAMqB,aAA8B;YAChClC,MAAM;YACNiC,OAAO;cAACrD,SAASoD,UAAUpD,WAAWF,GAAGmC,QAAQsB,OAAOzD,GAAGuD,KAAK;cAAGG,MAAMD,OAAOJ,MAAAA;YAAO;UAC3F;AACA,gBAAMM,OAA6D;YAACN;UAAM;AAC1E,cAAIrD,GAAG4D,QAASD,MAAKC,UAAU5D,GAAG4D;AAClC,iBAAO;YAAC,MAAM,KAAKX,SAASjD,IAAI,YAAYuB,KAAKC,UAAUgC,UAAAA,GAAa,MAAMG,IAAAA;;QAClF;AACA,eAAO,CAAA;MACX;MAEA,MAAgBE,cAAc7D,IAAyC;AACnE,cAAM8D,SAAsB,CAAA;AAE5B,YAAI,KAAK/C,YAAY;AACjB,eAAKA,aAAa;AAClB,gBAAMgD,eAAe,KAAKtC,YAAY,KAAKR,WAAW,KAAKH,SAAS,EAAA;AACpEgD,iBAAOE,KAAK,MAAM,KAAKf,SAASjD,IAAI,YAAY,KAAKoB,WAAW2C,YAAAA,CAAAA,CAAAA;QACpE;AAEA,gBAAQ/D,GAAGsB,MAAI;UACX,KAAK,cAAc;AACf,kBAAM2C,aAAa,KAAKhC,cAAc,GAAGjC,GAAGmC,IAAI;AAChD2B,mBAAOE,KAAK,MAAM,KAAKf,SAASjD,IAAI,YAAY,KAAKoB,WAAW6C,UAAAA,CAAAA,CAAAA;AAChE,mBAAOH;UACX;UACA,KAAK,mBAAmB;AACpB,kBAAMI,OAAOlE;AACb,kBAAMgD,YAAY,KAAKV,kBAAkB4B,KAAKhC,OAAOgC,KAAK9B,KAAK;AAC/D0B,mBAAOE,KAAK,MAAM,KAAKf,SAASjD,IAAI,YAAY,KAAKoB,WAAW4B,SAAAA,CAAAA,CAAAA;AAChE,mBAAOc;UACX;UACA,KAAK;AACD,mBAAOA;UACX,KAAK;AACD,iBAAKK,IAAIC,MAAM,+CAA0C7C,KAAKC,UAAWxB,GAAGE,UAAsC,aAAA,KAAmBF,GAAGE,UAAsC,eAAA,CAAgB,CAAA,eAAgB,KAAKS,UAAU0D,IAAI,EAAE;AACnOP,mBAAOE,KAAI,GAAI,MAAM,KAAKM,gBAAgBtE,EAAAA,CAAAA;AAC1C,mBAAO8D;UACX,KAAK;AACDA,mBAAOE,KAAI,GAAI,MAAM,KAAKO,iBAAiBvE,EAAAA,CAAAA;AAC3C,mBAAO8D;UACX;AACI,mBAAOA;QACf;MACJ;MAEA,MAAgBQ,gBAAgBtE,IAAoE;AAChG,cAAM2B,WAAW3B,GAAGmD,gBAAgB,KAAKC,mBAAmBpD,EAAAA;AAC5D,cAAMwE,iBAAkC;UACpClD,MAAM;UACNK;UACA,GAAG8C,YAAY;YACXzC,OAAOL,SAASK;YAChB3B,eAAesB,SAAStB;UAC5B,CAAA;QACJ;AACA,eAAO;UAAC,MAAM,KAAK4C,SAASjD,IAAI,YAAY,KAAKoB,WAAWoD,cAAAA,GAAiB,MAAM;YAACE,UAAU1E,GAAGmC;UAAI,CAAA;;MACzG;MAEA,MAAgBoC,iBAAiBvE,IAAqE;AAClG,YAAI,KAAK2E,YAAY,GAAG;AACpB,iBAAO,KAAKzB,iBAAiBlD,EAAAA;QACjC;AACA,cAAMqD,SAASrD,GAAGqD,UAAU;AAC5B,cAAMC,YAAY,OAAOtD,GAAGuD,UAAU,WAChC;UAACrD,SAASF,GAAGuD;QAAK,IACjBvD,GAAGuD,SAAS;UAACrD,SAASF,GAAGmC,QAAQ;QAAe;AACvD,cAAMqB,aAA8B;UAChClC,MAAM;UACNiC,OAAO;YAACrD,SAASoD,UAAUpD,WAAWF,GAAGmC,QAAQsB,OAAOzD,GAAGuD,KAAK;YAAGG,MAAMD,OAAOJ,MAAAA;UAAO;QAC3F;AACA,eAAO;UAAC,MAAM,KAAKJ,SAASjD,IAAI,YAAY,KAAKoB,WAAWoC,UAAAA,GAAa,IAAA;;MAC7E;MAEQJ,mBAAmBpD,IAA4D;AACnF,cAAM4B,SAAwB,CAAA;AAC9B,cAAMO,OAAOnC,GAAGmC,QAAQ,KAAKzB;AAC7B,cAAMkE,eAAe,KAAKjE,UAAU0D,OAAO;AAE3C,YAAIO,cAAc;AACd,gBAAMC,cAAc;eAAI,KAAKlE,UAAUmE,QAAO;YAAIC,KAAK,CAACC,GAAGC,MAAMD,EAAE,CAAA,IAAKC,EAAE,CAAA,CAAE;AAC5E,gBAAMC,gBAA+B,CAAA;AACrC,cAAI/C,KAAM+C,eAAclB,KAAK;YAAC1C,MAAM;YAAQa;UAAI,CAAA;AAChD,qBAAW,CAAA,EAAGgD,EAAAA,KAAON,aAAa;AAC9B,gBAAIO,OAAgC,CAAC;AACrC,gBAAI;AACA,kBAAID,GAAGxC,UAAWyC,QAAO7D,KAAK8D,MAAMF,GAAGxC,SAAS;YACpD,QAAQ;YACR;AACA,kBAAM2C,QAAqBH,GAAGzD,KACxB;cAACJ,MAAM;cAAaI,IAAIyD,GAAGzD;cAAIe,MAAM0C,GAAG1C;cAAME,WAAWyC;YAAI,IAC7D;cAAC9D,MAAM;cAAamB,MAAM0C,GAAG1C;cAAME,WAAWyC;YAAI;AACxDF,0BAAclB,KAAKsB,KAAAA;UACvB;AACA,gBAAMC,sBAAsCV,YAAYW,IAAI,CAAC,CAAA,EAAGL,EAAAA,MAAG;AAC/D,gBAAIC,OAAgC,CAAC;AACrC,gBAAI;AACA,kBAAID,GAAGxC,UAAWyC,QAAO7D,KAAK8D,MAAMF,GAAGxC,SAAS;YACpD,QAAQ;YACR;AACA,kBAAM8C,OAAqB;cAACnE,MAAM;cAAYoE,UAAU;gBAACjD,MAAM0C,GAAG1C;gBAAME,WAAWyC;cAAI;YAAC;AACxF,gBAAID,GAAGzD,GAAI+D,MAAK/D,KAAKyD,GAAGzD;AACxB,mBAAO+D;UACX,CAAA;AACA7D,iBAAOoC,KAAK;YAAC2B,MAAM;YAAaC,SAASV;YAAeW,YAAYN;UAAmB,CAAA;QAC3F,WAAWpD,MAAM;AACbP,iBAAOoC,KAAK;YAAC2B,MAAM;YAAaC,SAASzD;UAAI,CAAA;QACjD;AAEA,cAAMH,QAAmB,CAAC;AAC1B,YAAIhC,GAAG8F,QAAQC,YAAa/D,OAAMgE,eAAehG,GAAG8F,QAAQC;AAC5D,YAAI/F,GAAG8F,QAAQG,aAAcjE,OAAMkE,gBAAgBlG,GAAG8F,QAAQG;AAC9D,cAAME,QAAQnG,GAAG8F,QAAQC,cAAc/F,GAAG8F,QAAQG;AAClD,YAAIE,MAAOnE,OAAMoE,eAAeD;AAEhC,eAAO;UACHzE,IAAI,KAAKb,cAAcb,GAAGiB;UAC1BH,OAAO,KAAKA,SAAS;UACrBc;UACAC,SAASC,KAAKC,IAAG;UACjB1B,eAAeN,gBAAgBC,EAAAA;UAC/BgC;QACJ;MACJ;IACJ;AAESjC;;;;;AC9MT;;;IAAAsG;AACA;;;;;ACaA,eAAsBC,sBAClBC,QACAC,aACAC,eACAC,UACAC,WAKC;AAED,QAAMC,SAA8B;IAACC,MAAM;EAAE;AAC7C,mBAAiBC,OAAOP,QAAQ;AAC5B,QAAIO,IAAIC,SAASC,kBAAkBC,WAAYL,QAAOC,QAAQC,IAAID;AAClE,eAAWK,SAAS,MAAMV,YAAYW,kBAAkBL,GAAAA,GAAM;AAC1D,YAAMH,UAAUS,aAAaV,SAASW,WAAWX,SAASY,YAAYJ,KAAAA;IAC1E;AACA,QAAIJ,IAAIC,SAASC,kBAAkBO,QAAQT,IAAIC,SAASC,kBAAkBQ,OAAO;AAC7EZ,aAAOC,OAAOC,IAAIC,SAASC,kBAAkBO,OAAOT,IAAID,OAAOC,IAAIW;AACnE,YAAMC,QAAQ;QAAC,GAAGjB;QAAekB,eAAeb;MAAG;AACnD,UAAIJ,SAASkB,UAAWF,OAAMG,WAAWnB,SAASkB;AAClDhB,aAAOc,QAAQA;AACf,YAAMf,UAAUmB,aAAaJ,KAAAA;AAC7B;IACJ;EACJ;AACA,SAAOd;AACX;AA1CA;;;;AAcsBN;;;;;ACVtB,SAAQyB,MAAMC,cAAa;AAoBpB,SAASC,oBAAoBC,QAA2B;AAC3D,SAAOC,YAAY;IACfC,UAAUF,OAAOE;IACjBC,UAAUH,OAAOG;IACjBC,SAASJ,OAAOI;IAChBC,UAAUL,OAAOK;IACjBC,aAAaN,OAAOM;IACpBC,WAAWP,OAAOO,aAAaT,OAAAA;IAC/BU,gBAAgBR,OAAOQ,kBAAkB;IACzCC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;IACjCC,oBAAoBZ,OAAOY,sBAAsB;MAACC,MAAM;MAAKC,QAAQ;IAAM;IAC3EC,aAAaf,OAAOe;IACpBC,UAAUhB,OAAOgB;IACjBC,UAAUjB,OAAOiB;IACjBC,QAAQlB,OAAOkB;IACfC,kBAAkBnB,OAAOmB;IACzBC,WAAWpB,OAAOoB;IAClBC,SAASrB,OAAOqB;EACpB,CAAA;AACJ;AAxCA;;;;AAqBgBtB;;;;;ACxBhB,IAAAuB,iBAAA;;;;AACA;AACA,IAAAC;AACA;AACA;AACA;;;;;ACOA,IAAAC,gBAAA;;;;;;;ACVA;;;;;;;ACFA;;;;;;;;ACAA,IAAAC,aAAA;;;IAAAC;AACA;;;;;ACDA,IAAAC,YAAA;;;IAAAC;AACA,IAAAC;AACA,IAAAC;AACA;;;;;ACHA,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IAMZC;;;;AALb;AAEA,IAAAC;;;AAGO,IAAMD,YAAN,cAAwBE,YAAAA;aAAAA;;;;MAC3B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,QAAQC,IAA6C;AACvD,eAAO,KAAKF,GAAGG,SAA0B;;kEAEiB;UAACD;SAAG;MAClE;MAEA,MAAME,eAAeC,WAAoD;AACrE,eAAO,KAAKL,GAAGG,SAA0B;;0EAEyB;UAACE;SAAU;MACjF;MAEA,MAAMC,cAAcC,SAGjBC,OAAeC,QAAgBC,QAAgBC,SAG/C;AACC,cAAMC,aAAuB,CAAA;AAC7B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIP,QAAQQ,QAAQ;AAChBH,qBAAWI,KAAK,sBAAsBF,KAAAA,EAAO;AAC7CD,iBAAOG,KAAKT,QAAQQ,MAAM;QAC9B;AACA,YAAIR,QAAQU,gBAAgB;AACxBL,qBAAWI,KAAK,qBAAqBF,KAAAA,EAAO;AAC5CD,iBAAOG,KAAKT,QAAQU,cAAc;QACtC;AACA,YAAIV,QAAQW,aAAa;AACrBN,qBAAWI,KAAK,kBAAkBF,KAAAA,EAAO;AACzCD,iBAAOG,KAAKT,QAAQW,WAAW;QACnC;AACA,YAAIX,QAAQY,cAAc;AACtBP,qBAAWI,KAAK,mBAAmBF,KAAAA,EAAO;AAC1CD,iBAAOG,KAAKT,QAAQY,YAAY;QACpC;AACA,YAAIZ,QAAQa,SAAS;AACjBR,qBAAWI,KAAK,cAAcF,KAAAA,EAAO;AACrCD,iBAAOG,KAAKT,QAAQa,OAAO;QAC/B;AACA,YAAIb,QAAQc,MAAM;AACdT,qBAAWI,KAAK,iBAAiBF,KAAAA,EAAO;AACxCD,iBAAOG,KAAKT,QAAQc,IAAI;QAC5B;AACA,YAAId,QAAQe,IAAI;AACZV,qBAAWI,KAAK,gBAAgBF,KAAAA,EAAO;AACvCD,iBAAOG,KAAKT,QAAQe,EAAE;QAC1B;AAEA,cAAMC,QAAQX,WAAWY,SAAS,IAAI,WAAWZ,WAAWa,KAAK,OAAA,IAAW;AAC5E,cAAMC,eAAe,oBAAIC,IAAI;UAAC;UAAa;UAAc;SAAe;AACxE,cAAMC,MAAMF,aAAaG,IAAInB,MAAAA,IAAUA,SAAS;AAChD,cAAMoB,MAAMnB,YAAY,QAAQ,QAAQ;AAExC,cAAM,CAACoB,MAAMC,WAAAA,IAAe,MAAMC,QAAQC,IAAI;UAC1C,KAAKlC,GAAGmC,MAAuB;qEAC0BZ,KAAAA;uDACdK,GAAAA,IAAOE,GAAAA;qDACThB,KAAAA,YAAiBA,KAAAA,IAAS;eAAID;YAAQL;YAAOC;WAAO;UAC7F,KAAKT,GAAGG,SAA4B;0EAC0BoB,KAAAA,IAASV,MAAAA;SAC1E;AACD,eAAO;UAACkB;UAAMK,OAAOC,SAASL,aAAaM,SAAS,GAAA;QAAI;MAC5D;MAEA,MAAMC,OAAOC,SAAsC;AAC/C,cAAM,EACFC,iBACAC,YACAzB,gBACAC,aACAyB,aACAvB,SACAwB,mBACAzB,cACA0B,WACAC,WACAC,YACAC,UACAC,aACAC,eACAC,iBAAgB,IAChBX;AAEJ,cAAML,QAAQ;;;;;;AAOd,cAAM,KAAKnC,GAAGmC,MAAMA,OAAO;UACvBM;UACAC;UACAzB;UACAC;UACAyB;UACAvB;UACAwB;UACAzB;UACA0B,aAAa;UACbC;UACAC;UACAC;UACAC,eAAe;UACfC,iBAAiB;UACjBC,oBAAoB;SACvB;MACL;IACJ;;;;;;;;;;;;AC3HA,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IAKZC;;;;AAJb;;;AAIO,IAAMA,aAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MAEpB;MAEA,MAAMC,QAAQC,IAAkD;AAC5D,eAAO,KAAKF,GAAGG,SACX;;;;;;;;;;;gCAWoB;UAACD;SAAG;MAEhC;MAEA,MAAME,cAAcC,SAIjBC,OAAeC,QAAgBC,QAAgBC,SAG/C;AACC,cAAMC,aAAuB,CAAA;AAC7B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIP,QAAQQ,QAAQ;AAChBH,qBAAWI,KAAK,yBAAyBF,KAAAA,EAAO;AAChDD,iBAAOG,KAAKT,QAAQQ,MAAM;QAC9B;AACA,YAAIR,QAAQU,gBAAgB;AACxBL,qBAAWI,KAAK,wBAAwBF,KAAAA,EAAO;AAC/CD,iBAAOG,KAAKT,QAAQU,cAAc;QACtC;AACA,YAAIV,QAAQW,aAAa;AACrBN,qBAAWI,KAAK,qBAAqBF,KAAAA,EAAO;AAC5CD,iBAAOG,KAAKT,QAAQW,WAAW;QACnC;AACA,YAAIX,QAAQY,cAAc;AACtBP,qBAAWI,KAAK,sBAAsBF,KAAAA,EAAO;AAC7CD,iBAAOG,KAAKT,QAAQY,YAAY;QACpC;AACA,YAAIZ,QAAQa,SAAS;AACjBR,qBAAWI,KAAK,iBAAiBF,KAAAA,EAAO;AACxCD,iBAAOG,KAAKT,QAAQa,OAAO;QAC/B;AACA,YAAIb,QAAQc,mBAAmB;AAC3BT,qBAAWI,KAAK,2BAA2BF,KAAAA,EAAO;AAClDD,iBAAOG,KAAKT,QAAQc,iBAAiB;QACzC;AACA,YAAId,QAAQe,QAAQ;AAChBV,qBAAWI,KAAK,gBAAgBF,KAAAA,EAAO;AACvCD,iBAAOG,KAAKT,QAAQe,MAAM;QAC9B;AACA,YAAIf,QAAQgB,MAAM;AACdX,qBAAWI,KAAK,qBAAqBF,KAAAA,EAAO;AAC5CD,iBAAOG,KAAKT,QAAQgB,IAAI;QAC5B;AACA,YAAIhB,QAAQiB,IAAI;AACZZ,qBAAWI,KAAK,oBAAoBF,KAAAA,EAAO;AAC3CD,iBAAOG,KAAKT,QAAQiB,EAAE;QAC1B;AAEA,cAAMC,QAAQb,WAAWc,SAAS,IAAI,WAAWd,WAAWe,KAAK,OAAA,IAAW;AAC5E,cAAMC,eAAe,oBAAIC,IAAI;UAAC;UAAc;UAAgB;UAAiB;UAAQ;UAAS;UAAU;UAAgB;SAAwB;AAChJ,cAAMC,MAAMF,aAAaG,IAAIrB,MAAAA,IAAUA,SAAS;AAChD,cAAMsB,MAAMrB,YAAY,QAAQ,QAAQ;AAExC,cAAMsB,YAAY;;;;cAIZR,KAAAA;AAEN,cAAM,CAACS,MAAMC,WAAAA,IAAe,MAAMC,QAAQC,IAAI;UAC1C,KAAKnC,GAAGoC,MACJ,uEAAuEL,SAAAA,gBAAyBH,GAAAA,IAAOE,GAAAA,WAAclB,KAAAA,YAAiBA,KAAAA,IACtI;eAAID;YAAQL;YAAOC;WAAO;UAE9B,KAAKP,GAAGG,SAA4B,kCAAkC4B,SAAAA,IAAapB,MAAAA;SACtF;AACD,eAAO;UAACqB;UAAMK,OAAOC,SAASL,aAAaM,SAAS,GAAA;QAAI;MAC5D;MAEA,MAAMC,WAAWC,OAKd;AACC,cAAMlB,QAAQkB,QAAQ,kCAAkC;AACxD,cAAM9B,SAAS8B,QAAQ;UAACA;YAAS,CAAA;AAEjC,cAAM,CAACC,cAAcC,WAAWC,QAAQC,QAAAA,IAAY,MAAMX,QAAQC,IAAI;UAClE,KAAKnC,GAAGoC,MAAwB;;wGAE4Db,KAAAA;+DACzCZ,MAAAA;UACnD,KAAKX,GAAGoC,MAAwB;;wGAE4Db,KAAAA;kEACtCZ,MAAAA;UACtD,KAAKX,GAAGoC,MAAgC;kFAC8Bb,KAAAA;gFACFZ,MAAAA;UACpE,KAAKX,GAAGoC,MAA0B;4EAC8Bb,KAAAA;oEACRZ,MAAAA;SAC3D;AACD,eAAO;UACH+B,cAAcA,aAAaI,IAAIC,CAAAA,MAAKA,EAAEC,IAAI;UAC1CL,WAAWA,UAAUG,IAAIC,CAAAA,MAAKA,EAAEC,IAAI;UACpCJ,QAAQA,OAAOE,IAAIC,CAAAA,MAAKA,EAAE9B,YAAY;UACtC4B,UAAUA,SAASC,IAAIC,CAAAA,MAAKA,EAAE3B,MAAM;QACxC;MACJ;MAEA,MAAM6B,OAAOC,UAAwE;AACjF,cAAM,EACFC,iBACAC,YACArC,gBACAC,aACAqC,aACAnC,SACAC,mBACAF,cACAG,QACAkC,eACAJ,UAAUK,cACVC,cACAC,cACAC,eACAC,qBACAC,uBACAC,MACAC,OACAC,YACAC,UACAC,WACAC,aAAY,IACZhB;AAEJ,cAAMd,QAAQ;;;;;;;;;;AAWd,eAAO,KAAKpC,GAAGG,SAAyBiC,OAAO;UAC3Ce;UACAC;UACArC;UACAC;UACAqC;UACAnC;UACAC;UACAF;UACAG;UACAkC;UACAC;UACAC,gBAAgB;UAChBC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;SACH;MACL;IACJ;;;;;;;;;;;;AChMA,OAAO;AACP,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IAcZC;;;;AAbb;AACA,IAAAC;;;AAYO,IAAMD,kBAAN,cAA8BE,YAAAA;aAAAA;;;;MACjC,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,IAAIC,IAA2C;AACjD,cAAMC,QAAQ;;;;;AAKd,eAAO,KAAKH,GAAGI,SAAwBD,OAAO;UAACD;SAAG;MACtD;MAEA,MAAMG,kBAAkBC,gBAAkD;AACtE,cAAMH,QAAQ;;;;;;AAMd,eAAO,KAAKH,GAAGG,MAAqBA,OAAO;UAACG;SAAe;MAC/D;IACJ;;;;;;;;;;;;ACtCA,OAAO;AACP,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IAMZC;;;;AALb;AACA,IAAAC;;;AAIO,IAAMD,cAAN,cAA0BE,YAAAA;aAAAA;;;;MAC7B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,QAAQC,IAAuC;AACjD,cAAMC,QAAQ;;;;;AAKd,eAAO,KAAKH,GAAGI,SAAoBD,OAAO;UAACD;SAAG;MAClD;MAEA,MAAMG,UAAUC,SAA4C;AACxD,cAAMH,QAAQ;;;;;;AAMd,eAAO,KAAKH,GAAGI,SAAoBD,OAAO;UAACG;SAAQ;MACvD;MAEA,MAAMC,UAAUC,QAAsC;AAClD,cAAML,QAAQ;;;;;;AAMd,eAAO,KAAKH,GAAGG,MAAiBA,OAAO;UAACK;SAAO;MACnD;MAEA,MAAMC,iBAAiBC,eAA6C;AAChE,cAAMP,QAAQ;;;;;;AAMd,eAAO,KAAKH,GAAGG,MAAiBA,OAAO;UAACO;SAAc;MAC1D;MAEA,MAAMC,kBAAkBC,OAAqC;AACzD,cAAMT,QAAQ;;;;;;AAMd,eAAO,KAAKH,GAAGG,MAAiBA,OAAO;UAACS;SAAM;MAClD;MAEA,MAAMC,OAAOC,OAAiK;AAC1K,cAAMX,QAAQ;;;;;;AAOd,cAAMY,SAAS,MAAM,KAAKf,GAAGI,SAAoBD,OAAO;UACpDW,MAAME;UACNF,MAAMG,WAAW;UACjBH,MAAMI,kBAAkB;UACxBJ,MAAMK;UACNL,MAAMM;UACNN,MAAMO;UACNP,MAAMQ,QAAQ;UACdR,MAAMS,cAAc;SACvB;AACD,eAAOR;MACX;MAEA,MAAMS,WAAWtB,IAA2B;AACxC,cAAMC,QAAQ;;;;;;AAMd,cAAM,KAAKH,GAAGG,MAAMA,OAAO;UAACD;SAAG;MACnC;MAEA,MAAMuB,eAAevB,IAA2B;AAC5C,cAAMC,QAAQ;;;;;;AAMd,cAAM,KAAKH,GAAGG,MAAMA,OAAO;UAACD;SAAG;MACnC;IACJ;;;;;;;;;;;;ACrGA,OAAO;AAEP,SAAQwB,cAAAA,mBAAiB;;;;;;;;;;IAIZC;;;;AALb;;;AAKO,IAAMA,UAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MACpB;MAEA,MAAMC,OAAyB;AAC3B,eAAO,KAAKD,GAAGE,YACX;;;2BAGe;MAEvB;MAEA,MAAMC,mBAAwF;AAC1F,eAAO,KAAKH,GAAGE,YACX;;;;6BAIiB;MAEzB;MAEA,MAAME,IAAIC,MAAqC;AAC3C,eAAO,KAAKL,GAAGM,eACX;;;mCAIA;UAACD;SAAK;MAEd;MAEA,MAAME,iBAAiBC,aAAqBC,YAA2C;AACnF,eAAO,KAAKT,GAAGM,eACX;;;;;uBAMA;UAACE;UAAaC;SAAW;MAEjC;MAEA,MAAMC,QAAQC,IAAmC;AAC7C,eAAO,KAAKX,GAAGM,eACX;;;mCAIA;UAACK;SAAG;MAEZ;MAEA,MAAMC,eAAeH,YAAsC;AACvD,eAAO,KAAKT,GAAGE,YACX;;;;6BAKA;UAACO;SAAW;MAEpB;MAEA,MAAMI,kBAAkBJ,YAAsC;AAC1D,eAAO,KAAKT,GAAGE,YACX;;;;6BAKA;UAACO;SAAW;MAEpB;MAEA,MAAMK,eAAgE;AAClE,eAAO,KAAKd,GAAGE,YACX;;;;;;6BAMiB;MAEzB;MAEA,MAAMa,mBAAmBC,OAAiC;AACtD,eAAO,KAAKhB,GAAGE,YACX;;;;6BAKA;UAACc;SAAM;MAEf;MAEA,MAAMC,cAAcC,SAEjBC,OAAeC,QAAgBC,QAAgBC,SAA4D;AAC1G,cAAMC,aAAuB;UAAC;;AAC9B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIP,QAAQQ,QAAQ;AAChBH,qBAAWI,KAAK,sBAAsBF,KAAAA,EAAO;AAC7CD,iBAAOG,KAAKT,QAAQQ,MAAM;QAC9B;AACA,YAAIR,QAAQU,aAAa;AACrBL,qBAAWI,KAAK,kBAAkBF,KAAAA,EAAO;AACzCD,iBAAOG,KAAKT,QAAQU,WAAW;QACnC;AACA,YAAIV,QAAQW,QAAQ;AAChBN,qBAAWI,KAAK,gBAAgBF,GAAAA,2BAA8BA,GAAAA,GAAM;AACpED,iBAAOG,KAAK,IAAIT,QAAQW,MAAM,GAAG;AACjCJ;QACJ;AAEA,cAAMK,QAAQP,WAAWQ,KAAK,OAAA;AAC9B,cAAMC,eAAe,oBAAIC,IAAI;UAAC;UAAQ;UAAgB;UAAc;SAAa;AACjF,cAAMC,MAAMF,aAAaG,IAAId,MAAAA,IAAUA,SAAS;AAChD,cAAMe,MAAMd,YAAY,QAAQ,QAAQ;AAExC,cAAMe,WAAWZ;AACjB,cAAMa,YAAYb;AAClB,eAAO,KAAKzB,GAAGuC,SAAS,OAAOC,WAAAA;AAC3B,gBAAM,CAACC,YAAYC,WAAAA,IAAe,MAAMC,QAAQC,IAAI;YAChDJ,OAAOK,MAAM;;sCAESf,KAAAA;yCACGI,GAAAA,IAAOE,GAAAA;uCACTC,QAAAA,YAAoBC,SAAAA,IAAa;iBAAId;cAAQL;cAAOC;aAAO;YAClFoB,OAAOK,MAAM;;sCAESf,KAAAA,IAASN,MAAAA;WAClC;AACD,iBAAO;YACHsB,MAAML,WAAWK;YACjBC,OAAOC,SAASN,YAAYI,KAAK,CAAA,GAAIG,SAAS,GAAA;UAClD;QACJ,CAAA;MACJ;MAEA,MAAMC,OAAOC,OAA+E;AACxF,eAAO,KAAKnD,GAAGM,eACX;;;;;;;;;2BAUA;UACI6C,MAAM9C;UAAM8C,MAAMC,gBAAgB;UAAMD,MAAMvB;UAAauB,MAAME;UACjEF,MAAMG,eAAe;UAAMH,MAAMI,kBAAkB;UAAMJ,MAAMK,YAAY;UAC3EC,KAAKC,UAAUP,MAAMQ,oBAAoB,CAAA,CAAE;UAAGF,KAAKC,UAAUP,MAAMS,qBAAqB,CAAA,CAAE;UAC1FH,KAAKC,UAAUP,MAAMU,wBAAwB,CAAA,CAAE;UAC/CJ,KAAKC,UAAUP,MAAMW,cAAc,CAAC,CAAA;UAAIL,KAAKC,UAAUP,MAAMY,YAAY,CAAC,CAAA;UAC1EN,KAAKC,UAAUP,MAAMa,sBAAsB,CAAC,CAAA;UAAIP,KAAKC,UAAUP,MAAMc,cAAc,CAAC,CAAA;UACpFR,KAAKC,UAAUP,MAAMe,iBAAiB,CAAC,CAAA;UAAIf,MAAMgB;UAAShB,MAAMiB;UAAWjB,MAAMkB;UACjFlB,MAAMmB,iBAAiB;UACvBnB,MAAMoB,YAAY;UAAMpB,MAAMqB,mBAAmB;UACjDrB,MAAMsB,gBAAgB;UAAatB,MAAMuB,oBAAoB;UAC7DvB,MAAMwB,gBAAgB;UACtBxB,MAAMyB,iBAAiBnB,KAAKC,UAAUP,MAAMyB,cAAc,IAAI;UAC9DzB,MAAM0B,cAAc;UACpB1B,MAAM2B,eAAe;UAAM3B,MAAM4B,cAAc;UAAM5B,MAAM6B,mBAAmB;SACjF;MAET;MAEA,MAAMC,OAAOtE,IAAYuE,QAA+C;AACpE,cAAMC,OAAiB,CAAA;AACvB,cAAM3D,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,cAAM2D,SAA0B;UAC5B;UAAQ;UAAgB;UAAW;UAAe;UAAkB;UACpE;UAAW;UAAa;UAAe;UACvC;UAAY;UAAmB;UAAgB;UAAoB;UACnE;UAAc;UAAe;UAAc;;AAE/C,mBAAWC,OAAOD,QAAQ;AACtB,cAAIF,OAAOG,GAAAA,MAASC,QAAW;AAC3BH,iBAAKxD,KAAK,GAAG0D,GAAAA,OAAU5D,KAAAA,EAAO;AAC9BD,mBAAOG,KAAKuD,OAAOG,GAAAA,CAAI;UAC3B;QACJ;AACA,cAAME,OAAwB;UAC1B;UAAoB;UAAqB;UACzC;UAAc;UAAY;UAAsB;UAAc;UAC9D;;AAEJ,mBAAWF,OAAOE,MAAM;AACpB,cAAIL,OAAOG,GAAAA,MAASC,QAAW;AAC3BH,iBAAKxD,KAAK,GAAG0D,GAAAA,OAAU5D,KAAAA,EAAO;AAC9BD,mBAAOG,KAAK8B,KAAKC,UAAUwB,OAAOG,GAAAA,CAAI,CAAA;UAC1C;QACJ;AAEA,YAAIF,KAAKK,WAAW,EAAG,QAAO,KAAKxF,GAAGM,eAAsB;;qFAEiB;UAACK;SAAG;AAEjFwE,aAAKxD,KAAK,oBAAoB;AAC9BH,eAAOG,KAAKhB,EAAAA;AACZ,eAAO,KAAKX,GAAGM,eAAsB;oDACO6E,KAAKpD,KAAK,IAAA,CAAA;4DACFN,GAAAA,kCAAqCD,MAAAA;MAC7F;MAEA,MAAMiE,iBAAiB9E,IAAYuE,QAMT;AACtB,cAAMC,OAAiB,CAAA;AACvB,cAAM3D,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIyD,OAAO1B,aAAa8B,QAAW;AAC/BH,eAAKxD,KAAK,eAAeF,KAAAA,EAAO;AAChCD,iBAAOG,KAAKuD,OAAO1B,QAAQ;QAC/B;AACA,YAAI0B,OAAO3B,mBAAmB+B,QAAW;AACrCH,eAAKxD,KAAK,qBAAqBF,KAAAA,EAAO;AACtCD,iBAAOG,KAAKuD,OAAO3B,cAAc;QACrC;AACA,YAAI2B,OAAOvB,qBAAqB2B,QAAW;AACvCH,eAAKxD,KAAK,uBAAuBF,KAAAA,EAAO;AACxCD,iBAAOG,KAAK8B,KAAKC,UAAUwB,OAAOvB,gBAAgB,CAAA;QACtD;AACA,YAAIuB,OAAOtB,sBAAsB0B,QAAW;AACxCH,eAAKxD,KAAK,wBAAwBF,KAAAA,EAAO;AACzCD,iBAAOG,KAAK8B,KAAKC,UAAUwB,OAAOtB,iBAAiB,CAAA;QACvD;AACA,YAAIsB,OAAOrB,yBAAyByB,QAAW;AAC3CH,eAAKxD,KAAK,2BAA2BF,KAAAA,EAAO;AAC5CD,iBAAOG,KAAK8B,KAAKC,UAAUwB,OAAOrB,oBAAoB,CAAA;QAC1D;AAEA,YAAIsB,KAAKK,WAAW,EAAG,QAAO;AAE9BL,aAAKxD,KAAK,oBAAoB;AAC9BH,eAAOG,KAAKhB,EAAAA;AACZ,eAAO,KAAKX,GAAGM,eAAsB;oDACO6E,KAAKpD,KAAK,IAAA,CAAA;4DACFN,GAAAA,gBAAmBD,MAAAA;MAC3E;MAEA,MAAMkE,WAAW/E,IAA8B;AAC3C,cAAMgF,SAAS,MAAM,KAAK3F,GAAGM,eACzB;;;;4BAKA;UAACK;SAAG;AAER,eAAOgF,WAAW;MACtB;IACJ;;;;;;;;;;;;ACnRA,OAAO;AACP,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IAKZC,UAiDPC,oBA2BAC,uBAoBAC;;;;AApGN;AACA,IAAAC;;;AAGO,IAAMJ,WAAN,cAAuBK,YAAAA;aAAAA;;;;MAC1B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,UAAUC,OAAeC,QAAgBC,eAAyC;AACpF,eAAO,KAAKJ,GAAGK,OAAOH,OAAO,OAAOI,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MAAMb,oBAAoB;YAACQ;YAAQC;WAAc;AAC7E,iBAAOG,OAAOE,KAAK,CAAA,GAAIC,UAAU;QACrC,CAAA;MACJ;MAEA,MAAMC,4BAA4BR,QAAgBD,OAAkC;AAChF,eAAO,KAAKF,GAAGK,OAAOH,OAAO,OAAOI,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MAAMZ,uBAAuB;YAACO;YAAQD;WAAM;AACxE,iBAAOK,OAAOE,KAAKG,IAAI,CAACC,MAAsBA,EAAEC,EAAE;QACtD,CAAA;MACJ;MAEA,MAAMC,iBAAiBb,OAAeC,QAAwC;AAC1E,eAAO,KAAKH,GAAGK,OAAOH,OAAO,OAAOI,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MACxB;;iCAEiB;YAACL;WAAO;AAE7B,iBAAOI,OAAOE,KAAK,CAAA,GAAIO,SAAS;QACpC,CAAA;MACJ;MAEA,MAAMC,iBAAiBf,OAAec,OAAuC;AACzE,eAAO,KAAKhB,GAAGK,OAAOH,OAAO,OAAOI,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MACxB;;kDAEkC;YAACQ;WAAM;AAE7C,iBAAOT,OAAOE,KAAK,CAAA,GAAIK,MAAM;QACjC,CAAA;MACJ;MAEA,MAAMI,eAAehB,OAAeC,QAAgBC,eAAuBe,aAAuC;AAC9G,eAAO,KAAKnB,GAAGK,OAAOH,OAAO,OAAOI,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MAAMX,oBAAoB;YAACM;YAAQC;YAAee;WAAY;AAC1F,iBAAOZ,OAAOE,KAAK,CAAA,GAAIC,UAAU;QACrC,CAAA;MACJ;IACJ;;;;;;;;AAEA,IAAMf,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;AA2B3B,IAAMC,wBAAwB;;;;;;;;;;;;;;;;;;;AAoB9B,IAAMC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtG3B,OAAO;AACP,SAAQuB,cAAAA,mBAAiB;;;;;;;;;;IAMnBC,aAGOC;;;;AARb;AACA,IAAAC;;;AAIA,IAAMF,cAAc;AAGb,IAAMC,WAAN,cAAuBE,YAAAA;aAAAA;;;;MAC1B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,OACFC,QAAgBC,MAAcC,SAAiBC,OAC/CC,MAOsB;AACtB,cAAMC,QAAQ;;;;;;;;;;;wBAWEX,WAAAA;;AAEhB,eAAO,KAAKI,GAAGQ,SAAiBD,OAAO;UACnCL,OAAOO,YAAW;UAAIL;UAASD;UAAME,MAAKI,YAAW;UACrDH,MAAMI,WAAW;UAAMJ,MAAMK,UAAU;UACvCL,MAAMI,SAASE,UAAU;UAAMN,MAAMO,UAAU;UAAMP,MAAMQ,eAAe;UAC1ER,MAAMS,SAASC,KAAKC,UAAUX,KAAKS,MAAM,IAAI;SAChD;MACL;MAEA,MAAMG,MACFf,MAAcC,SAAiBF,QAAgBG,OAC/CK,SAAiBC,QAAgBE,QAAgBC,aACjDC,QACsB;AACtB,cAAMR,QAAQ;;;;;;;;;;;;wBAYEX,WAAAA;;AAEhB,eAAO,KAAKI,GAAGQ,SAAiBD,OAAO;UACnCL,OAAOO,YAAW;UAAIL;UAASD;UAAME,MAAKI,YAAW;UACrDC;UAASC;UAAQD,QAAQE;UAAQC;UAAQC,eAAe;UACxDC,SAASC,KAAKC,UAAUF,MAAAA,IAAU;SACrC;MACL;MAEA,MAAMI,aAAaC,UAAkBL,QAA4C;AAC7E,cAAM,KAAKf,GAAGO,MACV;;;6BAIA;UAACS,KAAKC,UAAUF,MAAAA;UAASK;SAAS;MAE1C;MAEA,MAAMC,UAAUnB,QAAgBE,SAAyC;AACrE,cAAMkB,MAAM,MAAM,KAAKtB,GAAGQ,SACtB;;;;;mCAMA;UAACN,OAAOO,YAAW;UAAIL;SAAQ;AAEnC,eAAOkB,KAAKX,UAAU;MAC1B;MAEA,MAAMY,WAAWrB,QAAgBE,SAAyC;AACtE,cAAMkB,MAAM,MAAM,KAAKtB,GAAGQ,SACtB;;;kCAIA;UAACN,OAAOO,YAAW;UAAIL;SAAQ;AAEnC,eAAOkB,KAAKZ,WAAW;MAC3B;MAEA,MAAMc,eAAeJ,UAA0C;AAC3D,cAAME,MAAM,MAAM,KAAKtB,GAAGQ,SACtB;;6BAGA;UAACY;SAAS;AAEd,eAAOE,KAAKZ,WAAW;MAC3B;MAEA,MAAMe,WAAWvB,QAAgBE,SAAmC;AAChE,cAAMsB,QAAQ,MAAM,KAAK1B,GAAG2B,YACxB;;;kCAIA;UAACzB,OAAOO,YAAW;UAAIL;SAAQ;AAEnC,gBAAQsB,SAAS,KAAK;MAC1B;MAEA,MAAME,aAAgC;AAClC,eAAO,KAAK5B,GAAGO,MACX,UAAUX,WAAAA;;;8CAGwB;MAE1C;MAEA,MAAMiC,UAA6B;AAC/B,eAAO,KAAK7B,GAAGO,MACX,UAAUX,WAAAA;;8CAEwB;MAE1C;MAEA,MAAMkC,UAAU3B,MAAsC;AAClD,eAAO,KAAKH,GAAGQ,SACX,UAAUZ,WAAAA;;;;uBAKV;UAACO;SAAK;MAEd;MAEA,MAAM4B,oBAAoB5B,MAAcC,SAAyC;AAC7E,eAAO,KAAKJ,GAAGQ,SACX,UAAUZ,WAAAA;;;kCAIV;UAACO;UAAMC;SAAQ;MAEvB;MAEA,MAAM4B,WAAW3B,OAAkB4B,SAAS,MAAyB;AACjE,eAAO,KAAKjC,GAAGO,MACX,UAAUX,WAAAA;;;iCAIV;UAACS;UAAM4B;SAAO;MAEtB;MAEA,MAAMC,sBAAsBd,UAAkBe,QAA+B;AACzE,cAAM,KAAKnC,GAAGO,MACV;;;6BAIA;UAAC4B;UAAQf;SAAS;MAE1B;MAGA,MAAMgB,WAAWhB,UAAiC;AAC9C,cAAM,KAAKpB,GAAGO,MACV;;;6BAIA;UAACa;SAAS;MAElB;MAEA,MAAMiB,WAAWjB,UAAiC;AAC9C,cAAM,KAAKpB,GAAGO,MAAM;;oDAEwB;UAACa;SAAS;AACtD,cAAM,KAAKpB,GAAGO,MAAM;;oDAEwB;UAACa;SAAS;AACtD,cAAM,KAAKpB,GAAGO,MAAM;;oDAEwB;UAACa;SAAS;AACtD,cAAM,KAAKpB,GAAGO,MAAM;;oDAEwB;UAACa;SAAS;AACtD,cAAM,KAAKpB,GAAGO,MAAM;;6CAEiB;UAACa;SAAS;MACnD;MAEA,MAAMkB,QAAQC,IAAoC;AAC9C,eAAO,KAAKvC,GAAGQ,SACX,UAAUZ,WAAAA;;;mCAIV;UAAC2C;SAAG;MAEZ;MAEA,MAAMC,sBAAsBtC,QAAgBE,SAAyC;AACjF,eAAO,KAAKJ,GAAGQ,SACX,UAAUZ,WAAAA;;;kCAIV;UAACM,OAAOO,YAAW;UAAIL;SAAQ;MAEvC;MAEA,MAAMqC,qBAAqBvC,QAAmC;AAC1D,eAAO,KAAKF,GAAGO,MACX,UAAUX,WAAAA;;;;wCAKV;UAACM,OAAOO,YAAW;SAAG;MAE9B;IACJ;;;;;;;;;;;;ACpPA,OAAO;AACP,SAAQiC,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AALb;AACA,IAAAC;;;AAIO,IAAMD,aAAN,cAAyBE,YAAAA;aAAAA;;;;MAC5B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,OAAOC,UAAkBC,MAAcC,YAAoBC,OAAkC;AAC/F,cAAMC,QAAQ;;;;;;;;AAQd,cAAMC,SAAS,MAAM,KAAKP,GAAGQ,SAAmBF,OAAO;UAACJ;UAAUC;UAAMC;UAAYC,SAAQ;SAAK;AACjG,eAAOE;MACX;MAEA,MAAME,kBAAkBP,UAAkBC,MAAwC;AAC9E,eAAO,KAAKH,GAAGQ,SACX;;;+BAIA;UAACN;UAAUC;SAAK;MAExB;MAEA,MAAMO,YAAYR,UAAuC;AACrD,eAAO,KAAKF,GAAGM,MACX;;;;6BAKA;UAACJ;SAAS;MAElB;MAEA,MAAMS,mBAMF;AACA,eAAO,KAAKX,GAAGM,MACX;;;;;yCAK6B;MAErC;MAEA,MAAMM,oBAAoD;AACtD,cAAMC,OAAO,MAAM,KAAKb,GAAGM,MACvB;;;gCAGoB;AAExB,cAAMQ,MAAM,oBAAIC,IAAAA;AAChB,mBAAWC,OAAOH,MAAM;AACpBC,cAAIG,IAAID,IAAIE,WAAWF,IAAIG,YAAY;QAC3C;AACA,eAAOL;MACX;IACJ;;;;;;;;;;;;AC5EA,OAAO;AACP,OAAOM,SAAQ;AACf,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AALb,IAAAC;AACA;;;AAIO,IAAMD,WAAN,cAAuBE,YAAAA;aAAAA;;;;MAC1B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,OAAOC,MAAcC,OAA0C;AACjE,cAAMC,QAAQ;;;;;;AAMd,eAAO,KAAKJ,GAAGK,SAAiBD,OAAO;UAACF;UAAMC;SAAK;MACvD;MAEA,MAAMG,KAAKC,UAAiC;AACxC,cAAM,KAAKP,GAAGI,MAAM;;6CAEiB;UAACG;SAAS;MACnD;MAEA,MAAMC,UAAUN,MAAsC;AAClD,eAAO,KAAKF,GAAGK,SACX;;+BAGA;UAACH;SAAK;MACd;MAEA,MAAMO,eAAeC,YAAoBC,UAAoC;AACzE,cAAMP,QAAQ;;;;;;;;AAQd,cAAMQ,SAAS,MAAM,KAAKZ,GAAGK,SAAmDD,OAAO;UAACM;UAAYC;SAAS;AAC7G,eAAOC,UAAU;MACrB;MAEA,MAAMC,gBAAgBN,UAAiC;AACnD,cAAMO,OAAOnB,IAAGoB,kBAAiB;AACjC,cAAMC,KAAKC,OAAOC,OAAOJ,IAAAA,EAAMK,KAAI,EAAGC,KAAKC,CAAAA,MAAKA,KAAK,CAACA,EAAEC,YAAYD,EAAEE,WAAW,MAAA,GAASC;AAE1F,cAAMpB,QAAQ;;;;;;AAMd,cAAM,KAAKJ,GAAGI,MAAMA,OAAO;UACvBG;UACAZ,IAAG8B,SAAQ;UACXT,MAAM;UACNrB,IAAG+B,SAAQ;UACX/B,IAAGgC,KAAI;UACPC,QAAQC;UACRlC,IAAGmC,SAAQ;UACXnC,IAAGoC,QAAO;UACVpC,IAAGqC,KAAI,EAAGC;UACVC,KAAKC,MAAMP,QAAQQ,OAAM,CAAA;UACzBR,QAAQS;SACX;MACL;MAEA,MAAMC,mBAAmB5B,YAAoC;AACzD,eAAO,KAAKV,GAAGI,MACX;;;;;qCAMA;UAACM;SAAW;MAEpB;MAEA,MAAM6B,YAAY7B,YAAoB8B,iBAA4C;AAC9E,YAAI,CAACA,gBAAgBP,QAAQ;AACzB,gBAAMrB,UAAS,MAAM,KAAKZ,GAAGI,MACzB;;8EAGA;YAACM;WAAW;AAEhB,iBAAQE,QAAe6B,YAAY;QACvC;AAEA,cAAMC,eAAeF,gBAAgBG,IAAI,CAACC,GAAGC,MAAM,IAAIA,IAAI,CAAA,EAAG,EAAEC,KAAK,IAAA;AACrE,cAAMlC,SAAS,MAAM,KAAKZ,GAAGI,MACzB;;;uCAG2BsC,YAAAA,KAC3B;UAAChC;aAAe8B;SAAgB;AAEpC,eAAQ5B,OAAe6B,YAAY;MACvC;MAEA,MAAMM,uBAAuBC,kBAA2C;AACpE,cAAMpC,SAAS,MAAM,KAAKZ,GAAGI,MACzB;;;;wEAKA;UAAC4C,iBAAiBC,SAAQ;SAAG;AAEjC,cAAMC,QAAStC,OAAe6B,YAAY;AAC1C,YAAIS,QAAQ,GAAG;AACX,gBAAM,KAAKlD,GAAGI,MACV;;kFAEkE;QAE1E;AACA,eAAO8C;MACX;IACJ;;;;;;;;;;;;AChIA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AALb;AACA,IAAAC;;;AAIO,IAAMD,YAAN,cAAwBE,YAAAA;aAAAA;;;;MAC3B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,WACFC,cACAC,MACAC,QACAC,WACAC,UACAC,aACAC,WAAW,OACgB;AAC3B,cAAMC,WAAW,MAAM,KAAKC,gBAAgBR,YAAAA;AAC5C,YAAIO,UAAU;AACV,iBAAO,KAAKT,GAAGW,SACX;;;;;;;+BAQA;YAACR;YAAMI,eAAe;YAAMC;YAAUF;YAAUG,SAASG;WAAG;QAEpE;AACA,eAAO,KAAKZ,GAAGW,SACX;;2BAGA;UAACT,aAAaW,YAAW;UAAIV;UAAMI,eAAe;UAAMC;UAAUJ;UAAQC;UAAWC;SAAS;MAEtG;MAEA,MAAMI,gBAAgBR,cAAmD;AACrE,eAAO,KAAKF,GAAGW,SACX;;;;mCAKA;UAACT,aAAaW,YAAW;SAAG;MAEpC;MAEA,MAAMC,aAAaF,IAAyC;AACxD,eAAO,KAAKZ,GAAGW,SACX;;6BAEiB;UAACC;SAAG;MAE7B;MAEA,MAAMG,YACFC,QACAb,MACAc,SACAC,eACAC,aACAC,OAC4B;AAC5B,eAAO,KAAKpB,GAAGW,SACX;;;;;;;;2BASA;UAACK;UAAQb;UAAMc;UAASC;UAAeC,eAAe;UAAMC,SAAS;SAAK;MAElF;MAEA,MAAMC,mBAAmBL,QAAgBM,IAAwC;AAC7E,eAAO,KAAKtB,GAAGW,SACX;;;;;;uBAOA;UAACK;UAAQM,GAAGC,YAAW;SAAG;MAElC;MAEA,MAAMC,mBAAmBR,QAAyC;AAC9D,eAAO,KAAKhB,GAAGyB,MACX;;;4CAIA;UAACT;SAAO;MAEhB;MAEA,MAAMU,iBACFC,SACAC,WACAC,OAYAC,SAQiC;AACjC,eAAO,KAAK9B,GAAGW,SACX;;;;;;;;;;;;;;;;;;;;;;;;;;2BA2BA;UACIgB;UAASC;UACTC,MAAME;UAAYF,MAAMG;UACxBH,MAAMI,mBAAmB;UAAGJ,MAAMK,oBAAoB;UACtDL,MAAMM,oBAAoB;UAAGN,MAAMO,qBAAqB;UACxDP,MAAMQ,qBAAqB;UAAMR,MAAMS,uBAAuB;UAC9DT,MAAMU,wBAAwB;UAC9BV,MAAMW,cAAcC,KAAKC,UAAUb,MAAMW,WAAW,IAAI;UACxDV,SAASa,iBAAiB;UAAMb,SAASc,YAAY;UACrDd,SAASe,yBAAyB;UAAMf,SAASgB,gBAAgB;UACjEhB,SAASiB,oBAAoB;UAAMjB,SAASkB,gBAAgB;SAC/D;MAET;MAEA,MAAMC,oBAAoBtB,SAAiBuB,aAAqBC,SAI1B;AAClC,eAAO,KAAKnD,GAAGW,SACX;;;;;;;;;;;;;;;;;;4BAmBA;UAACgB;UAASwB,SAASC,WAAW;UAAMD,SAASE,gBAAgB;UAAMF,SAASG,kBAAkB;UAAMJ;SAAY;MAExH;MAEA,MAAMK,iBAAiB5B,SAAiBC,WAAsD;AAC1F,eAAO,KAAK5B,GAAGW,SACX;;;qCAIA;UAACgB;UAASC;SAAU;MAE5B;MAEA,MAAM4B,0BAA0B7B,SAAiByB,SAAoD;AACjG,eAAO,KAAKpD,GAAGW,SACX;;;mCAIA;UAACgB;UAASyB;SAAQ;MAE1B;MAEA,MAAMK,+BAA+B9B,SAAiB0B,cAAyD;AAC3G,eAAO,KAAKrD,GAAGW,SACX;;;wCAIA;UAACgB;UAAS0B;SAAa;MAE/B;MAEA,MAAMK,iCAAiC/B,SAAiB2B,gBAA2D;AAC/G,eAAO,KAAKtD,GAAGW,SACX;;;gDAIA;UAACgB;UAAS2B;SAAe;MAEjC;MAEA,MAAMK,oBAAoBhC,SAA+C;AACrE,eAAO,KAAK3B,GAAGyB,MACX;;;mCAIA;UAACE;SAAQ;MAEjB;MAEA,MAAMiC,kBAAkBjC,SAAiBkC,mBAA8C;AACnF,YAAIA,kBAAkBC,WAAW,EAAG,QAAO;AAC3C,cAAMC,eAAeF,kBAAkBG,IAAI,CAACC,GAAGC,MAAM,IAAIA,IAAI,CAAA,EAAG,EAAEC,KAAK,IAAA;AACvE,cAAMC,SAAS,MAAM,KAAKpE,GAAGqE,YACzB;;;wCAG4BN,YAAAA,KAC5B;UAACpC;aAAYkC;SAAkB;AAEnC,eAAOO,OAAOE,YAAY;MAC9B;IACJ;;;;;;;;;;;;ACzQA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAKZC;;;;AAJb;;;AAIO,IAAMA,yBAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MACpB;MAEA,MAAMC,OAAOC,MAAuF;AAChG,cAAMC,QAAQ;;;;;;;;;AASd,eAAO,KAAKH,GAAGI,SAAyBD,OAAO;UAC3CD,KAAKG;UACLH,KAAKI;UACLJ,KAAKK,oBAAoB;UACzBL,KAAKM;UACLN,KAAKO;UACLP,KAAKQ;UACLR,KAAKS;UACLT,KAAKU;UACLV,KAAKW;UACLX,KAAKY;UACLZ,KAAKa;UACLb,KAAKc;UACLd,KAAKe;UACLf,KAAKgB,WAAWC,KAAKC,UAAUlB,KAAKgB,QAAQ,IAAI;SACnD;MACL;MAEA,MAAMG,iBAAiBC,YAAqD;AACxE,eAAO,KAAKtB,GAAGG,MACX;;;kCAIA;UAACmB;SAAW;MAEpB;MAEA,MAAMC,mBAAmBD,YAAmC;AACxD,cAAM,KAAKtB,GAAGG,MACV;;sCAGA;UAACmB;SAAW;MAEpB;IACJ;;;;;;;;;;;;AC2BO,SAASE,mBAAmBC,QAAa;AAC5C,QAAMC,MAAMD;AACZ,MAAIE,IAAIF,OAAMG,KAAI,EAAGC,YAAW;AAEhC,MAAIC;AACJ,MAAIC;AACJ,aAAWC,UAAUC,mBAAmB;AACpC,QAAIN,EAAEO,WAAWF,MAAAA,GAAS;AACtBD,kBAAYC,OAAOG,MAAM,GAAG,EAAC;AAC7BL,qBAAeM,mBAAmBL,SAAAA;AAClCJ,UAAIA,EAAEQ,MAAMH,OAAOK,MAAM;AACzB;IACJ;EACJ;AAEAV,MAAIA,EAAEW,QAAQ,WAAW,GAAA,EAAKA,QAAQ,QAAQ,GAAA,EAAKA,QAAQ,OAAO,GAAA,EAAKA,QAAQ,UAAU,EAAA;AAEzF,MAAIC;AACJ,QAAMC,cAAcb,EAAEc,MAAMC,qBAAAA;AAC5B,MAAIF,aAAa;AACbD,eAAW,GAAGC,YAAY,CAAA,CAAE,IAAIA,YAAY,CAAA,CAAE,IAAIA,YAAY,CAAA,CAAE;EACpE,OAAO;AACH,UAAMG,aAAahB,EAAEc,MAAMG,oBAAAA;AAC3B,QAAID,YAAY;AACZJ,iBAAW,GAAGI,WAAW,CAAA,CAAE,IAAIA,WAAW,CAAA,CAAE,IAAIA,WAAW,CAAA,CAAE;IACjE;EACJ;AAEA,MAAIE;AACJ,QAAMC,eAAenB,EAAEc,MAAM,iBAAA;AAC7B,MAAIK,cAAc;AACdD,kBAAc,GAAGC,aAAa,CAAA,CAAE,IAAIA,aAAa,CAAA,CAAE;EACvD,OAAO;AACH,UAAMC,aAAapB,EAAEc,MAAM,sBAAA;AAC3B,QAAIM,YAAY;AACZF,oBAAcE,WAAW,CAAA;IAC7B;EACJ;AAEA,MAAIC;AACJ,QAAMC,YAAYtB,EAAEc,MAAMS,YAAAA;AAC1B,MAAID,WAAW;AACXD,eAAWC,UAAU,CAAA;EACzB;AAEA,MAAIE;AACJ,MAAIC;AACJ,QAAMC,iBAAiB;OAAI1B,EAAE2B,SAASC,eAAAA;;AACtC,MAAIF,eAAehB,SAAS,GAAG;AAC3B,UAAMmB,YAAsB,CAAA;AAC5B,eAAWC,KAAKJ,gBAAgB;AAC5B,YAAMK,IAAID,EAAE,CAAA;AACZ,UAAIE,gBAAgBC,SAASF,CAAAA,GAAI;AAC7BN,sBAAcM;MAClB,OAAO;AACHF,kBAAUK,KAAKH,CAAAA;MACnB;IACJ;AACA,QAAIF,UAAUnB,SAAS,GAAG;AACtBc,oBAAcK,UAAUM,KAAK,CAACC,GAAGC,OAAOC,iBAAiBD,CAAAA,KAAM,MAAMC,iBAAiBF,CAAAA,KAAM,EAAA,EAAI,CAAA;IACpG;EACJ;AAEA,MAAIG;AACJ,MAAInC,UAAWmC,cAAaC,iBAAiBpC,SAAAA;AAC7C,MAAI,CAACmC,YAAY;AACb,eAAW,CAACE,SAASC,MAAAA,KAAWC,iBAAiB;AAC7C,UAAIF,QAAQG,KAAK5C,CAAAA,GAAI;AACjBuC,qBAAaG;AACb;MACJ;IACJ;EACJ;AAEA,MAAIG;AACJ,aAAW,CAACJ,SAASK,IAAAA,KAASC,cAAc;AACxC,QAAIN,QAAQG,KAAK5C,CAAAA,GAAI;AACjB6C,iBAAWC;AACX;IACJ;EACJ;AAEA,QAAME,SAAShD,EAAEiD,MAAM,GAAA,EAAKC,OAAOC,CAAAA,MAAKA,EAAEzC,SAAS,CAAA;AAEnD,SAAO0C,OAAOC,OACV;IAACtD;IAAKuD,YAAYtD;IAAGgD;EAAM,GAC3BO,YAAY;IAACpD;IAAcoC;IAAYrB;IAAaG;IAAUG;IAAaC;IAAab;IAAUiC;EAAQ,CAAA,CAAA;AAElH;AAEO,SAASW,UAAUF,YAAkB;AACxC,QAAMG,UAAUH,WAAWxC,MAAMC,qBAAAA;AACjC,MAAI0C,QAAS,QAAOH,WAAW9C,MAAM,GAAG,CAACiD,QAAQ,CAAA,EAAG/C,MAAM;AAC1D,QAAMgD,SAASJ,WAAWxC,MAAMG,oBAAAA;AAChC,MAAIyC,OAAQ,QAAOJ,WAAW9C,MAAM,GAAG,CAACkD,OAAO,CAAA,EAAGhD,MAAM;AACxD,SAAOiD;AACX;AAIO,SAASC,sBAAsBN,YAAkB;AACpD,QAAMxC,QAAQwC,WAAWxC,MAAM+C,iBAAAA;AAC/B,MAAI/C,MAAO,QAAOwC,WAAW9C,MAAM,GAAG,CAACM,MAAM,CAAA,EAAGJ,MAAM;AACtD,SAAOiD;AACX;AAIO,SAASG,kBAAkBR,YAAkB;AAChD,QAAMxC,QAAQwC,WAAWxC,MAAMiD,YAAAA;AAC/B,MAAIjD,MAAO,QAAOwC,WAAW9C,MAAM,GAAG,CAACM,MAAM,CAAA,EAAGJ,MAAM;AACtD,SAAOiD;AACX;AAIO,SAASK,aAAaV,YAAkB;AAC3C,QAAMxC,QAAQwC,WAAWxC,MAAMmD,cAAAA;AAC/B,MAAInD,MAAO,QAAOwC,WAAW9C,MAAM,GAAG,CAACM,MAAM,CAAA,EAAGJ,MAAM;AACtD,SAAOiD;AACX;AA3MA,IAgBMrD,mBAOAG,oBAgBA+B,kBAOAG,iBAeAuB,mBACAlC,iBACAmC,oBACAvC,iBAEAU,kBAIAf,cACAR,uBACAE,sBAEA8B,cA2GAc,mBAQAE,cAQAE;AArMN,IAAAG,kBAAA;;;;AAgBA,IAAM9D,oBAAoB;MACtB;MAAc;MAAW;MAAW;MAAe;MAAS;MAC5D;MAAW;MAAa;MACxB;MAAW;MAAa;MAAe;MACvC;;AAGJ,IAAMG,qBAA6C;MAC/C,aAAa;MACb,UAAU;MACV,UAAU;MACV,cAAc;MACd,QAAQ;MACR,aAAa;MACb,UAAU;MACV,YAAY;MACZ,QAAQ;MACR,UAAU;MACV,YAAY;MACZ,cAAc;MACd,SAAS;IACb;AAEA,IAAM+B,mBAA2C;MAC7C,aAAa;MACb,UAAU;MACV,cAAc;MACd,QAAQ;IACZ;AAEA,IAAMG,kBAA2C;MAC7C;QAAC;QAAY;;MACb;QAAC;QAAY;;MACb;QAAC;QAAS;;MACV;QAAC;QAAwB;;MACzB;QAAC;QAAW;;MACZ;QAAC;QAAU;;MACX;QAAC;QAAgB;;MACjB;QAAC;QAAc;;MACf;QAAC;QAAY;;MACb;QAAC;QAAa;;MACd;QAAC;QAAS;;MACV;QAAC;QAAW;;;AAGhB,IAAMuB,oBAAoB;MAAC;MAAQ;MAAU;MAAS;MAAO;MAAS;MAAQ;MAAQ;MAAY;MAAS;;AAC3G,IAAMlC,kBAAkB;MAAC;MAAU;;AACnC,IAAMmC,qBAAqB;SAAID;SAAsBlC;;AACrD,IAAMJ,kBAAkB,IAAIyC,OAAO,OAAOF,mBAAmBG,KAAK,GAAA,CAAA,QAAY,GAAA;AAE9E,IAAMhC,mBAAmBc,OAAOmB,YAC5BL,kBAAkBM,IAAI,CAACzC,GAAG0C,MAAM;MAAC1C;MAAGmC,kBAAkBxD,SAAS+D;KAAE,CAAA;AAGrE,IAAMlD,eAAe;AACrB,IAAMR,wBAAwB;AAC9B,IAAME,uBAAuB;AAE7B,IAAM8B,eAAwC;MAC1C;QAAC;QAAW;;MACZ;QAAC;QAAW;;MACZ;QAAC;QAAe;;MAChB;QAAC;QAAc;;MACf;QAAC;QAAa;;MACd;QAAC;QAA+C;;;AAGpClD;AA0FA2D;AAQhB,IAAMK,oBAAoB;AAEVD;AAMhB,IAAMG,eAAe;AAELD;AAMhB,IAAMG,iBAAiB;AAEPD;;;;;ACvMhB;;;IAAAU;;;;;ACAA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AALb;AAEA;;;AAGO,IAAMA,oBAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MACpB;;;;MAKA,MAAMC,YAAYC,OAAgD;AAC9D,eAAO,KAAKF,GAAGG,eACX;;0CAGA;UAACC,KAAKC,UAAU;YAACH;WAAM;SAAE;MAEjC;MAEA,MAAMI,kBAAkBC,aAAsD;AAC1E,eAAO,KAAKP,GAAGG,eACX;;uCAGA;UAACI;SAAY;MAErB;MAEA,MAAMC,4BAA4BC,YAAqD;AACnF,eAAO,KAAKT,GAAGG,eACX;;kDAGA;UAACM;SAAW;MAEpB;MAEA,MAAMC,OAAOC,OAAmG;AAC5G,cAAMC,gBAAgBC,mBAAmBF,MAAMG,YAAY;AAC3D,cAAMC,WAAWF,mBAAmBF,MAAMK,IAAI;AAE9C,cAAMC,SAAS;UACXN,MAAMG;UACNF,cAAcH;UACdE,MAAMK;UACNL,MAAMO,mBAAmBH,SAASN;UAClCE,MAAMQ,UAAU;UAChBR,MAAMS;UACNT,MAAMU,iBAAiBT,cAAcU,eAAe;UACpDX,MAAMY,WAAWX,cAAcY,eAAe;UAC9Cb,MAAMc,cAAcb,cAAcc,YAAY;UAC9Cf,MAAMgB,uBAAuB;UAC7BvB,KAAKC,UAAUM,MAAMiB,WAAW,CAAA,CAAE;UAClCjB,MAAMkB,eAAe;UACrBlB,MAAMmB,kBAAkB;UACxBnB,MAAMoB,YAAY;UAClB3B,KAAKC,UAAUM,MAAMqB,oBAAoB,CAAA,CAAE;UAC3C5B,KAAKC,UAAUM,MAAMsB,qBAAqB,CAAA,CAAE;UAC5C7B,KAAKC,UAAUM,MAAMuB,wBAAwB,CAAA,CAAE;UAC/C9B,KAAKC,UAAUM,MAAMwB,sBAAsB,CAAC,CAAA;UAC5C/B,KAAKC,UAAUM,MAAMyB,gBAAgB,CAAC,CAAA;UACtCzB,MAAM0B,aAAa;UACnB1B,MAAM2B;UACN3B,MAAM4B,UAAU;UAChB5B,MAAM6B,kBAAkB;UACxB7B,MAAM8B,gBAAgB;UACtB9B,MAAM+B,iBAAiB;UACvB/B,MAAMgC,mBAAmB;UACzBhC,MAAMiC,oBAAoB;UAC1BjC,MAAMkC,wBAAwB;UAC9BlC,MAAMmC,yBAAyB;UAC/B1C,KAAKC,UAAUM,MAAMoC,WAAW,CAAA,CAAE;UAClCpC,MAAMqC,kBAAkB;;AAG5B,eAAO,KAAKhD,GAAGG,eACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmEAc,MAAAA;MAER;;;;MAKA,MAAMgC,cACFC,eACAC,YACAC,QACAC,QAC+B;AAC/B,cAAMpC,SAAS;UACXiC;UACA9C,KAAKC,UAAU8C,UAAAA;UACf/C,KAAKC,UAAU;YAAC+C;WAAO;UACvBC,OAAOlC,UAAU;UACjBkC,OAAOf,QAAQ;UACfe,OAAOZ,gBAAgB;UACvBY,OAAOX,iBAAiB;WACxB,oBAAIY,KAAAA,GAAOC,YAAW;;AAG1B,eAAO,KAAKvD,GAAGG,eACX;;;;;;;;;;;;8BAaAc,MAAAA;MAER;MAEA,MAAMuC,gBAAgBC,SAsB4B;AAC9C,cAAMC,OAAO7C,mBAAmB4C,QAAQ3C,YAAY;AACpD,cAAMC,WAAWF,mBAAmB4C,QAAQzC,IAAI;AAEhD,cAAMC,SAAS;UACXwC,QAAQ3C;UACR4C,KAAKjD;UACLgD,QAAQzC;UACRD,SAASN;UACTgD,QAAQrC;UACRsC,KAAKpC,eAAe;UACpBoC,KAAKlC,eAAe;UACpBkC,KAAKhC,YAAY;UACjB+B,QAAQ5B,eAAe;UACvB4B,QAAQ3B,kBAAkB;UAC1B2B,QAAQ1B,YAAY;UACpB3B,KAAKC,UAAUoD,QAAQzB,oBAAoB,CAAA,CAAE;UAC7C5B,KAAKC,UAAUoD,QAAQxB,qBAAqB,CAAA,CAAE;UAC9C7B,KAAKC,UAAUoD,QAAQvB,wBAAwB,CAAA,CAAE;UACjD9B,KAAKC,UAAUoD,QAAQtB,sBAAsB,CAAC,CAAA;UAC9C/B,KAAKC,UAAUoD,QAAQrB,gBAAgB,CAAC,CAAA;UACxCqB,QAAQpB,aAAa;UACrBoB,QAAQnB,QAAQ;UAChBmB,QAAQjB,kBAAkB;UAC1BiB,QAAQhB,gBAAgB;UACxBgB,QAAQd,mBAAmB;UAC3Bc,QAAQb,oBAAoB;UAC5Ba,QAAQZ,wBAAwB;UAChCY,QAAQX,yBAAyB;UACjC1C,KAAKC,UAAUoD,QAAQV,WAAW,CAAA,CAAE;;AAGxC,cAAMY,MAAM,MAAM,KAAK3D,GAAGG,eACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAiEAc,MAAAA;AAGJ,YAAI,CAAC0C,IAAK,OAAM,IAAIC,MAAM,8BAA8BH,QAAQ3C,YAAY,EAAE;AAC9E,eAAO6C;MACX;MAEA,MAAME,aACFC,IACAT,QAOAU,eACAX,QACa;AACb,cAAMY,aAAuB,CAAA;AAC7B,cAAM/C,SAAgB;UAAC6C;;AACvB,YAAIG,MAAM;AAEV,cAAMC,cAAc,wBAACC,QAAgBJ,cAAcK,SAASD,GAAAA,GAAxC;AAEpB,YAAId,OAAOgB,iBAAiB,MAAM;AAC9B,cAAIH,YAAY,eAAA,GAAkB;AAC9BF,uBAAWM,KAAK,qBAAqBL,KAAAA,EAAO;UAChD,OAAO;AACHD,uBAAWM,KAAK,8BAA8BL,KAAAA,mBAAwB;UAC1E;AACAhD,iBAAOqD,KAAKjB,OAAOgB,aAAa;QACpC;AAEA,YAAIhB,OAAOkB,SAAS;AAChB,gBAAMC,IAAInB,OAAOkB;AACjB,cAAIC,EAAEC,SAAS,MAAM;AACjBT,uBAAWM,KAAKJ,YAAY,SAAA,IAAa,sBAAsBD,KAAAA,KAAU,+BAA+BA,KAAAA,oBAAyB;AACjIhD,mBAAOqD,KAAKE,EAAEC,KAAK;UACvB;AACA,cAAID,EAAEE,UAAU,MAAM;AAClBV,uBAAWM,KAAKJ,YAAY,SAAA,IAAa,uBAAuBD,KAAAA,KAAU,gCAAgCA,KAAAA,qBAA0B;AACpIhD,mBAAOqD,KAAKE,EAAEE,MAAM;UACxB;AACA,cAAIF,EAAEG,aAAa,MAAM;AACrBX,uBAAWM,KAAKJ,YAAY,SAAA,IAAa,2BAA2BD,KAAAA,KAAU,oCAAoCA,KAAAA,yBAA8B;AAChJhD,mBAAOqD,KAAKE,EAAEG,SAAS;UAC3B;AACA,cAAIH,EAAEI,cAAc,MAAM;AACtBZ,uBAAWM,KAAKJ,YAAY,SAAA,IAAa,4BAA4BD,KAAAA,KAAU,qCAAqCA,KAAAA,0BAA+B;AACnJhD,mBAAOqD,KAAKE,EAAEI,UAAU;UAC5B;QACJ;AAEA,YAAIvB,OAAOjB,gBAAgByC,OAAOC,KAAKzB,OAAOjB,YAAY,EAAE2C,SAAS,GAAG;AACpEf,qBAAWM,KAAK,mCAAmCL,KAAAA,SAAc;AACjEhD,iBAAOqD,KAAKlE,KAAKC,UAAUgD,OAAOjB,YAAY,CAAA;QAClD;AAEA,YAAIiB,OAAO2B,gBAAgB,MAAM;AAC7B,cAAId,YAAY,cAAA,GAAiB;AAC7BF,uBAAWM,KAAK,qBAAqBL,KAAAA,EAAO;UAChD,OAAO;AACHD,uBAAWM,KAAK,8BAA8BL,KAAAA,mBAAwB;UAC1E;AACAhD,iBAAOqD,KAAKjB,OAAO2B,YAAY;QACnC;AAEA,YAAI3B,OAAO4B,aAAa;AACpB,cAAIf,YAAY,aAAA,GAAgB;AAC5BF,uBAAWM,KAAK,mBAAmBL,KAAAA,QAAa;UACpD,OAAO;AACHD,uBAAWM,KAAK,4BAA4BL,KAAAA,uBAA4B;UAC5E;AACAhD,iBAAOqD,KAAKjB,OAAO4B,WAAW;QAClC;AAEA,YAAIjB,WAAWe,WAAW,EAAG;AAE7Bf,mBAAWM,KAAK,0FAA0FL,KAAAA,uBAA4B;AACtIhD,eAAOqD,KAAKlE,KAAKC,UAAU;UAAC+C;SAAO,CAAA;AAEnCY,mBAAWM,KAAK,wBAAA;AAChBN,mBAAWM,KAAK,oBAAA;AAEhB,cAAM,KAAKtE,GAAGkF,YACV;mBACOlB,WAAWmB,KAAK,IAAA,CAAA;6BAEvBlE,MAAAA;MAER;MAEA,MAAMmE,KAAKC,SAKRC,QAAQ,KAAKC,SAAS,GAAwD;AAC7E,cAAMC,aAAuB,CAAA;AAC7B,cAAMvE,SAAgB,CAAA;AACtB,YAAIgD,MAAM;AAEV,YAAIoB,SAASjE,iBAAiB;AAC1BoE,qBAAWlB,KAAK,sBAAsBL,KAAAA,EAAO;AAC7ChD,iBAAOqD,KAAKe,QAAQjE,eAAe;QACvC;AACA,YAAIiE,SAASlE,QAAQ;AACjBqE,qBAAWlB,KAAK,aAAaL,KAAAA,EAAO;AACpChD,iBAAOqD,KAAKe,QAAQlE,MAAM;QAC9B;AACA,YAAIkE,SAAS9C,QAAQ;AACjBiD,qBAAWlB,KAAK,aAAaL,KAAAA,EAAO;AACpChD,iBAAOqD,KAAKe,QAAQ9C,MAAM;QAC9B;AACA,YAAI8C,SAASI,QAAQ;AACjBD,qBAAWlB,KAAK,gBAAgBL,GAAAA,2BAA8BA,GAAAA,GAAM;AACpEhD,iBAAOqD,KAAK,IAAIe,QAAQI,MAAM,GAAG;AACjCxB;QACJ;AAEA,cAAMyB,QAAQF,WAAWT,SAAS,IAAI,SAASS,WAAWL,KAAK,OAAA,CAAA,KAAa;AAC5E,cAAMQ,WAAW1B;AACjB,cAAM2B,YAAY3B;AAElB,eAAO,KAAKjE,GAAG6F,SAAS,OAAOC,WAAAA;AAC3B,gBAAM,CAACC,YAAYC,WAAAA,IAAe,MAAMC,QAAQC,IAAI;YAChDJ,OAAOK,MAAM;sDACyBT,KAAAA;;uCAEfC,QAAAA,YAAoBC,SAAAA,IAAa;iBAAI3E;cAAQqE;cAAOC;aAAO;YAClFO,OAAOK,MAAM;sDACyBT,KAAAA,IAASzE,MAAAA;WAClD;AACD,iBAAO;YACHmF,MAAML,WAAWK;YACjBC,OAAOC,SAASN,YAAYI,KAAK,CAAA,GAAIG,SAAS,GAAA;UAClD;QACJ,CAAA;MACJ;IACJ;;;;;;;;;;;;ACjcA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAKZC;;;;AAJb;;;AAIO,IAAMA,yBAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MACpB;MAEA,MAAMC,iBACFC,YACAC,gBACAC,eACiF;AACjF,eAAO,KAAKJ,GAAGK,YACX;;;;;;;;;;;;;;;;;;;;;;;;;;uCA2BA;UAACH;UAAYC,kBAAkB;UAAMC,iBAAiB;SAAK;MAEnE;MAEA,MAAME,sBAAsBC,cAAuD;AAC/E,eAAO,KAAKP,GAAGK,YACX;;;sDAIA;UAACE;SAAa;MAEtB;MAEA,MAAMC,OAAOC,OAA6G;AACtH,eAAO,KAAKT,GAAGU,eACX;;;;;;;;;;;;;;2BAeA;UACID,MAAME;UACNF,MAAMA;UACNA,MAAMG;UACNH,MAAMI;UACNJ,MAAMK,mBAAmB;UACzBL,MAAMM,kBAAkB;UACxBN,MAAMO,UAAU;UAChBP,MAAMQ,cAAc;UACpBR,MAAMS;UACNT,MAAMU;SACT;MAET;MAEA,MAAMC,WAAWC,SAAiG;AAC9G,YAAIA,QAAQC,WAAW,EAAG,QAAO;AAEjC,cAAMC,SAAmB,CAAA;AACzB,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,mBAAWC,KAAKL,SAAS;AACrBE,iBAAOI,KAAK,KAAKF,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,MAAWA,KAAAA,GAAQ;AAC5HD,iBAAOG,KACHD,EAAEf,eAAee,EAAEjB,OAAOiB,EAAEd,kBAAkBc,EAAEb,YAChDa,EAAEZ,mBAAmB,MAAMY,EAAEX,kBAAkB,MAC/CW,EAAEV,UAAU,MAAMU,EAAET,cAAc,MAAMS,EAAER,QAAQQ,EAAEP,MAAM;QAElE;AAEA,cAAMS,SAAS,MAAM,KAAK5B,GAAG6B,SAAS,OAAOC,WAAAA;AACzC,gBAAMC,MAAM,MAAMD,OAAOE,MACrB;;;;kBAIET,OAAOU,KAAK,IAAA,CAAA;;;;;;;;;;0CAWdT,MAAAA;AAEJ,iBAAOO,IAAIG,YAAY;QAC3B,CAAA;AAEA,eAAON;MACX;MAEA,MAAMO,WAAW5B,cAAsB6B,iBAAwC;AAC3E,cAAM,KAAKpC,GAAGK,YACV;;;;2CAKA;UAACE;UAAc6B;SAAgB;MAEvC;IACJ;;;;;;;;;;;;AC5IA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAYZC;;;;AAXb;;;AAWO,IAAMA,uBAAN,MAAMA;aAAAA;;;;MACT,YAAoBC,IAAW;aAAXA,KAAAA;MACpB;MAEA,MAAMC,UAAUC,gBAAwBC,SAE7B;AACP,eAAO,KAAKH,GAAGI,eACX;;;;;;;;;;;;;;;;;;uBAmBA;UACIF;UACAC,QAAQE,kBAAkB;UAC1BF,QAAQG,cAAc;UACtBH,QAAQI;UACRJ,QAAQK,aAAa;SACxB;MAET;MAEA,MAAMC,OAAOC,UAA4G;AACrH,eAAO,KAAKV,GAAGI,eACX;;;;;;;;;;;;;;;;;2BAkBA;UACIM,SAASC,mBAAmB;UAC5BD,SAASE;UACTF,SAASG,cAAc;UACvBH,SAASI,eAAe;UACxBJ,SAASK;UACTL,SAASM;UACTN,SAASO;UACTP,SAASQ,UAAU;UACnBR,SAASS;UACTT,SAASU,cAAc;SAC1B;MAET;MAEA,MAAMC,KAAKC,SAIRC,QAAQ,KAAKC,SAAS,GAAkC;AACvD,cAAMC,aAAuB,CAAA;AAC7B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AAEV,YAAIL,SAASjB,gBAAgB;AACzBoB,qBAAWG,KAAK,sBAAsBD,KAAAA,EAAO;AAC7CD,iBAAOE,KAAKN,QAAQjB,cAAc;QACtC;AACA,YAAIiB,SAASf,YAAY;AACrBkB,qBAAWG,KAAK,kBAAkBD,KAAAA,EAAO;AACzCD,iBAAOE,KAAKN,QAAQf,UAAU;QAClC;AACA,YAAIe,SAASH,WAAWU,QAAW;AAC/BJ,qBAAWG,KAAK,aAAaD,KAAAA,EAAO;AACpCD,iBAAOE,KAAKN,QAAQH,MAAM;QAC9B;AAEA,cAAMW,QAAQL,WAAWM,SAAS,IAAI,SAASN,WAAWO,KAAK,OAAA,CAAA,KAAa;AAE5E,eAAO,KAAKhC,GAAGiC,YACX;0CAC8BH,KAAAA;;sBAEpBH,KAAAA,YAAiBA,KAAAA,IAC3B;aAAID;UAAQH;UAAOC;SAAO;MAElC;IACJ;;;;;;;;;;;;ACrHA,SAAQU,cAAAA,oBAAiB;;;;;;;;;;IAWZC;;;;AAVb;AAEA,IAAAC;;;AAQO,IAAMD,cAAN,cAA0BE,YAAAA;aAAAA;;;;MAC7B,YAAoBC,IAAW;AAC3B,cAAK,GAAA,KADWA,KAAAA;MAEpB;MAEA,MAAMC,SAA+B;AACjC,eAAO,KAAKD,GAAGE,YAAuB,8CAAA;MAC1C;MAEA,MAAMC,aAAiD;AACnD,eAAO,KAAKH,GAAGE,YACX;;;;;mCAKuB;MAE/B;MAEA,MAAME,QAAQC,IAAqD;AAC/D,eAAO,KAAKL,GAAGM,eACX;;;;qCAKA;UAACD;SAAG;MAEZ;MAEA,MAAME,SAASC,OAAqC;AAChD,eAAO,KAAKR,GAAGS,OAAOD,OAAO,OAAOE,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MACxB,0HACA;YAACJ;WAAM;AAEX,iBAAOG,OAAOE;QAClB,CAAA;MACJ;MAEA,MAAMC,cAAcT,IAAYG,OAA0C;AACtE,eAAO,KAAKR,GAAGS,OAAOD,OAAO,OAAOE,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MACxB,kHACA;YAACP;YAAIG;WAAM;AAEf,iBAAQG,OAAOE,KAAK,CAAA,KAAoB;QAC5C,CAAA;MACJ;MAEA,MAAME,OAAOP,OAAeQ,WAAsG;AAC9H,eAAO,KAAKhB,GAAGS,OAAOD,OAAO,OAAOE,WAAAA;AAChC,gBAAMC,SAAS,MAAMD,OAAOE,MACxB;;+BAGA;YACII,UAAUC;YACVD,UAAUE;YACVF,UAAUG,mBAAmB;YAC7BH,UAAUI,qBAAqB;YAC/BC,KAAKC,UAAUN,UAAUO,iBAAiB;YAC1CF,KAAKC,UAAUN,UAAUQ,OAAO;YAChCR,UAAUS;WACb;AAEL,iBAAQd,OAAOE,KAAK,CAAA,KAAoB;QAC5C,CAAA;MACJ;MAEA,MAAMa,OAAOlB,OAAeH,IAAYsB,SAA0I;AAC9K,eAAO,KAAK3B,GAAGS,OAAOD,OAAO,OAAOE,WAAAA;AAChC,gBAAMkB,OAAiB,CAAA;AACvB,gBAAMC,SAAgB,CAAA;AACtB,cAAIC,MAAM;AAEV,cAAIH,QAAQV,SAASc,QAAW;AAC5BH,iBAAKI,KAAK,WAAWF,KAAAA,EAAO;AAC5BD,mBAAOG,KAAKL,QAAQV,IAAI;UAC5B;AACA,cAAIU,QAAQJ,sBAAsBQ,QAAW;AACzCH,iBAAKI,KAAK,wBAAwBF,KAAAA,EAAO;AACzCD,mBAAOG,KAAKX,KAAKC,UAAUK,QAAQJ,iBAAiB,CAAA;UACxD;AACA,cAAII,QAAQH,YAAYO,QAAW;AAC/BH,iBAAKI,KAAK,cAAcF,KAAAA,EAAO;AAC/BD,mBAAOG,KAAKX,KAAKC,UAAUK,QAAQH,OAAO,CAAA;UAC9C;AACA,cAAIG,QAAQF,YAAYM,QAAW;AAC/BH,iBAAKI,KAAK,cAAcF,KAAAA,EAAO;AAC/BD,mBAAOG,KAAKL,QAAQF,OAAO;UAC/B;AACA,cAAIE,QAAQP,sBAAsBW,QAAW;AACzCH,iBAAKI,KAAK,wBAAwBF,KAAAA,EAAO;AACzCD,mBAAOG,KAAKL,QAAQP,iBAAiB;UACzC;AAEA,cAAIQ,KAAKK,WAAW,EAAG,QAAO,KAAK7B,QAAQC,EAAAA;AAE3CuB,eAAKI,KAAK,oBAAoB;AAC9BH,iBAAOG,KAAK3B,EAAAA;AAEZ,gBAAMM,SAAS,MAAMD,OAAOE,MACxB;uBACOgB,KAAKM,KAAK,IAAA,CAAA;+BACFJ,GAAAA,gBACfD,MAAAA;AAEJ,iBAAQlB,OAAOE,KAAK,CAAA,KAAoB;QAC5C,CAAA;MACJ;MAEA,MAAMsB,WAAW3B,OAAeH,IAA2B;AACvD,cAAM,KAAKL,GAAGS,OAAOD,OAAO,OAAOE,WAAAA;AAC/B,gBAAMA,OAAOE,MAAM,0EAA0E;YAACP;WAAG;QACrG,CAAA;MACJ;MAEA,MAAM+B,OAAO/B,IAA2B;AACpC,cAAM,KAAKL,GAAGY,MAAM,wCAAwC;UAACP;SAAG;MACpE;IACJ;;;;;;;;;;;;ACrIA;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACjBA,IAAagC,0BAEAC;AAFb;;;AAAO,IAAMD,2BAA2BE,uBAAO,qBAAA;AAExC,IAAMD,oBAAN,MAAMA;MAFb,OAEaA;;;MAET,OAAOE,QAAQC,OAAeC,QAAgB;AAC1C,eAAO,GAAGD,KAAAA,IAASC,MAAAA;MACvB;MAEA,OAAOC,QAAQF,OAAeC,QAAgBE,UAAkB,KAAK;AACjE,eAAO,OAAOH,KAAAA,SAAcC,MAAAA,QAAcE,OAAAA;MAC9C;MAEA,OAAOC,WAAWJ,OAAeC,SAAiB,OAAOE,UAAkB,OAAO;AAC9E,eAAO,OAAOH,KAAAA,SAAcC,MAAAA,QAAcE,OAAAA;MAC9C;MAEA,OAAOE,aAAaL,OAAeG,SAAiB;AAChD,eAAO,OAAOH,KAAAA,iBAAsBG,OAAAA;MACxC;IACJ;;;;;ACnBA,IAAaG;AAAb;;;AAAO,IAAMA,yBAAyBC,uBAAO,mBAAA;;;;;ACK7C,SAAQC,MAAMC,eAAa;AAJ3B,IAOaC;AAPb,IAAAC,cAAA;;;;AAGA;AAEA;AAEO,IAAMD,2BAAN,MAAMA;MAPb,OAOaA;;;MACT,OAAOE,mBAAmBC,OAA6BC,MAAYC,SAA4BC,SAAiBC,SAAeC,WAAiC,QAA2B;AACvL,cAAM,EAACC,gBAAgBC,aAAaC,OAAM,IAAIP;AAC9C,cAAM,EAACQ,WAAWC,UAAUC,SAAQ,IAAIT;AACxC,cAAMU,UAAUL,aAAaM;AAC7B,eAAOC,YAAY;UACfC,IAAInB,QAAAA;UACJoB,IAAIC,KAAKC,IAAG;UACZZ;UACAE;UACAI;UACAZ,MAAAA;UACAK;UACAF;UACAM;UACAL;UACAM;UACAC;QACJ,CAAA;MACJ;MAEA,OAAOQ,YAAYnB,OAA6BE,SAA4BC,SAAiBC,SAAeC,WAAiC,QAA2B;AACpK,cAAM,EAACC,gBAAgBE,QAAQI,SAASH,WAAWC,UAAUC,SAAQ,IAAIT;AACzE,eAAOY,YAAY;UACfC,IAAInB,QAAAA;UACJoB,IAAIC,KAAKC,IAAG;UACZZ;UACAE;UACAI;UACAZ,MAAAA;UACAK;UACAF;UACAM;UACAL;UACAM;UACAC;QACJ,CAAA;MACJ;MAEA,OAAOS,kBAAkBC,UAAkCC,OAAkE;AAEzH,eAAOR,YAAY;UACfd,MAAMuB,sBAAsBC;UAC5BT,IAAInB,QAAAA;UACJoB,IAAIC,KAAKC,IAAG;UACZZ,gBAAgBe,SAASI;UACzBjB,QAAQa,SAASK;UACjBd,SAASS,SAASd,aAAaM;UAC/BR,UAAUiB,MAAMtB,SAAS2B,kBAAkBC,QAAQ,UAAU;UAC7DzB,SAASoB,sBAAsBC;UAC/Bf,WAAWY,SAASQ;UACpBzB,SAASU,YAAY;YACjBgB,QAAQR,MAAMtB,SAAS2B,kBAAkBI,OAAO,YAAY;YAC5DC,WAAWV,MAAMtB;YACjBiC,OAAOX,MAAMtB,SAAS2B,kBAAkBC,QAAQN,MAAMW,QAAQC;UAClE,CAAA;UACAxB,UAAUW,SAASc;UACnBxB,UAAUU,SAASe;QACvB,CAAA;MACJ;IACJ;;;;;ACpEA,IAAAC,qBAAA;;;;AACA;AACA,IAAAC;;;;;ACFA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AALb,IAAAC;AAEA;;;AAGO,IAAMD,4BAAN,MAAMA;aAAAA;;;;MACT,YAA6BE,IAAW;aAAXA,KAAAA;MAC7B;MAEA,MAAMC,OAAOC,OAAyC;AAClD,cAAM,EACFC,IACAC,IACAC,gBACAC,SACAC,QACAC,UACAC,WACAC,UACAC,MAAAA,OACAC,UACAC,SACAC,QAAO,IACPZ;AAEJ,cAAMa,QAAQ;;;;;;;AAQd,cAAM,KAAKf,GAAGe,MAAMA,OAAO;UACvBZ;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;UACAG,KAAKC,UAAUH,OAAAA;SAClB;MACL;MAEA,MAAMC,MAAMG,QAAyD;AACjE,cAAM,EACFb,gBACAC,SACAa,WACAC,YACAC,WACAC,OACAC,SACAC,MAAK,IACLN;AAGJ,YAAIO,UAAyB;AAC7B,YAAIF,SAAS;AACT,gBAAMG,MAAM,MAAM,KAAK1B,GAAG2B,SACtB;;;;uCAKA;YAACJ;YAASlB;YAAgBC;WAAQ;AAEtCmB,oBAAUC,KAAKtB,MAAM;QACzB;AAEA,cAAMwB,QAAkB;UAAC;UAA8B;;AACvD,cAAMC,SAAgB;UAACxB;UAAgBC;;AACvC,YAAIwB,IAAID,OAAOE;AAEf,YAAIZ,WAAWY,QAAQ;AACnBH,gBAAMI,KAAK,oBAAoB,EAAEF,CAAAA,WAAY;AAC7CD,iBAAOG,KAAKb,SAAAA;QAChB;AAEA,YAAIC,YAAYW,QAAQ;AACpBH,gBAAMI,KAAK,qBAAqB,EAAEF,CAAAA,WAAY;AAC9CD,iBAAOG,KAAKZ,UAAAA;QAChB;AAEA,YAAIC,WAAWU,QAAQ;AACnBH,gBAAMI,KAAK,oBAAoB,EAAEF,CAAAA,WAAY;AAC7CD,iBAAOG,KAAKX,SAAAA;QAChB;AAEA,YAAIC,OAAOS,QAAQ;AACfH,gBAAMI,KAAK,eAAe,EAAEF,CAAAA,WAAY;AACxCD,iBAAOG,KAAKV,KAAAA;QAChB;AAGA,YAAIC,WAAWE,YAAY,MAAM;AAC7BG,gBAAMI,KAAK,UAAU,EAAEF,CAAAA,cAAeA,CAAAA,cAAe,EAAEA,CAAAA,IAAK;AAC5DD,iBAAOG,KAAKP,SAASF,OAAAA;QACzB;AAEAM,eAAOG,KAAKC,KAAKC,IAAI,GAAGV,KAAAA,CAAAA;AAExB,cAAMT,QAAQ;;;;;;;;;;;;;;oBAcFa,MAAMO,KAAK,OAAA,CAAA;;qBAEV,EAAEL,CAAAA;;AAGf,cAAMM,OAAO,MAAM,KAAKpC,GAAGe,MAAWA,OAAOc,MAAAA;AAE7C,eAAOO,KAAKC,IAAI,CAACC,MAAOC,YAAY;UAChCpC,IAAImC,EAAEnC;UACNC,IAAIoC,OAAOF,EAAElC,EAAE;UACfC,gBAAgBiC,EAAEG;UAClBnC,SAASgC,EAAEI;UACXnC,QAAQ+B,EAAEK;UACVnC,UAAU8B,EAAEM;UACZnC,WAAW6B,EAAEO;UACbnC,UAAU4B,EAAEQ;UACZnC,MAAM2B,EAAE3B;UACRC,UAAU0B,EAAE1B;UACZC,SAASyB,EAAEzB;UACXC,SAASwB,EAAExB;QACf,CAAA,CAAA;MACJ;IACJ;;;;;;;;;;;;ACjJA,SAAQiC,cAAAA,oBAAiB;AACzB,SAAQC,YAAYC,WAAS;AAC7B,OAAOC,WAAU;;;;;;;;;;IAoBJC;;;;AAnBb;AACA,IAAAC;AACA,IAAAC;;;AAiBO,IAAMF,yBAAN,MAAMA,gCAA+BG,YAAAA;aAAAA;;;MAChCC;MAER,cAAc;AACV,cAAK;AACL,aAAKA,aAAaL,MAAKM,QAAQC,IAAIC,IAAIH,UAAU;MACrD;MAEA,OAAOI,OAAOJ,YAA4C;AACtD,cAAMK,WAAW,IAAIT,wBAAAA;AACrBS,iBAASL,aAAaL,MAAKM,QAAQD,UAAAA;AACnC,eAAOK;MACX;MAEA,MAAMC,kBAA+C;AACjD,cAAMC,UAAS,KAAKC,KAAK,KAAKF,eAAe;AAC7C,YAAI;AACA,gBAAMG,aAAa,MAAM,KAAKC,eAAc;AAE5C,cAAID,WAAWE,SAAS,GAAG;AACvB,kBAAMC,cAAcH,WAAWI,IAAIC,CAAAA,MAAKA,EAAEC,WAAW,EAAEC,KAAK,IAAA;AAC5DT,YAAAA,QAAOU,MAAM,SAASR,WAAWE,MAAM,aAAaC,WAAAA,EAAa;UACrE;AAEA,iBAAOH;QACX,SAASS,OAAO;AACZX,UAAAA,QAAOW,MAAM,8BAA8B;YAACA;UAAK,CAAA;AACjD,iBAAO,CAAA;QACX;MACJ;MAEA,MAAMC,eAAeC,aAAuD;AACxE,cAAMC,aAAa1B,MAAK2B,SAASF,WAAAA;AACjC,eAAO,KAAKG,aAAaF,YAAYD,WAAAA;MACzC;MAEA,MAAMI,sBAAsBC,YAAqD;AAC7E,cAAMC,aAAa,MAAM,KAAKpB,gBAAe;AAC7C,eAAOoB,WAAWC,OAAOC,CAAAA,WAAUA,OAAOH,eAAeA,UAAAA;MAC7D;MAEA,MAAcf,iBAA8C;AACxD,cAAMmB,UAA8B,CAAA;AAEpC,YAAIC;AACJ,YAAI;AACAA,uBAAa,MAAMpC,IAAGqC,QAAQ,KAAK/B,YAAY;YAACgC,eAAe;UAAI,CAAA;QACvE,QAAQ;AACJ,iBAAOH;QACX;AAEA,cAAMI,eAAe,8BAAOC,WAAAA;AACxB,gBAAMC,aAAa,MAAMzC,IAAGqC,QAAQG,QAAQ;YAACF,eAAe;UAAI,CAAA,EAAGI,MAAM,MAAM,CAAA,CAAE;AACjF,qBAAWC,OAAOF,YAAY;AAC1B,gBAAI,CAACE,IAAIC,YAAW,KAAM,CAACD,IAAIE,eAAc,EAAI;AACjD,kBAAMC,aAAa7C,MAAKqB,KAAKkB,QAAQG,IAAII,IAAI;AAC7C,kBAAMb,SAAS,MAAM,KAAKL,aAAac,IAAII,MAAMD,UAAAA;AACjD,gBAAIZ,OAAQC,SAAQa,KAAKd,MAAAA;UAC7B;QACJ,GARqB;AAUrB,mBAAWe,SAASb,YAAY;AAC5B,cAAI,CAACa,MAAML,YAAW,KAAM,CAACK,MAAMJ,eAAc,EAAI;AACrD,cAAII,MAAMF,SAAS,kBAAkBE,MAAMF,KAAKG,WAAW,GAAA,EAAM;AACjE,gBAAMC,YAAYlD,MAAKqB,KAAK,KAAKhB,YAAY2C,MAAMF,IAAI;AAEvD,cAAIE,MAAMF,KAAKG,WAAW,GAAA,GAAM;AAC5B,kBAAME,eAAe,MAAMpD,IAAGqC,QAAQc,WAAW;cAACb,eAAe;YAAI,CAAA,EAAGI,MAAM,MAAM,CAAA,CAAE;AACtF,uBAAWW,cAAcD,cAAc;AACnC,kBAAI,CAACC,WAAWT,YAAW,KAAM,CAACS,WAAWR,eAAc,EAAI;AAC/D,oBAAMN,aAAatC,MAAKqB,KAAK6B,WAAWE,WAAWN,IAAI,CAAA;YAC3D;UACJ,OAAO;AACH,kBAAMR,aAAaY,SAAAA;UACvB;QACJ;AAEA,eAAOhB;MACX;MAEA,MAAcN,aAAaF,YAAoBD,aAAuD;AAClG,cAAMb,UAAS,KAAKC,KAAK,KAAKe,YAAY;AAE1C,YAAI;AACA,gBAAMyB,kBAAkBrD,MAAKqB,KAAKI,aAAa,cAAA;AAC/C,gBAAM6B,qBAAqB,MAAMvD,IAAGwD,SAASF,iBAAiB,OAAA;AAC9D,gBAAMG,cAA2BC,KAAKC,MAAMJ,kBAAAA;AAE5C,cAAI,CAACE,YAAYV,QAAQ,CAACU,YAAYG,SAAS;AAC3C/C,YAAAA,QAAOgD,KAAK,mCAAmC;cAC3ClC;cACAmC,SAAS,CAAC,CAACL,YAAYV;cACvBgB,YAAY,CAAC,CAACN,YAAYG;YAC9B,CAAA;AACA,mBAAO;UACX;AAEA,gBAAM7B,aAAa,KAAKiC,gBAAgBP,YAAYV,MAAMU,WAAAA;AAC1D,cAAI,CAAC1B,WAAY,QAAO;AAExB,iBAAO;YACHV,aAAaoC,YAAYV;YACzBa,SAASH,YAAYG;YACrBK,YAAYR,YAAYS,QAAQ;YAChCnC;YACAL;UACJ;QACJ,SAASF,OAAO;AACZX,UAAAA,QAAOgD,KAAK,2BAA2B;YACnClC;YACAH,OAAOA,iBAAiB2C,QAAQ3C,MAAM4C,UAAUC,OAAO7C,KAAAA;UAC3D,CAAA;AACA,iBAAO;QACX;MACJ;MAEQwC,gBAAgB3C,aAAqBoC,aAAoE;AAC7G,YAAIA,aAAaa,YAAYC,MAAM;AAC/B,gBAAMC,IAAIf,YAAYa,WAAWC,KAAKE,YAAW;AACjD,cAAID,MAAM,WAAY,QAAOE,WAAWC;AACxC,cAAIH,MAAM,YAAa,QAAOE,WAAWE;QAC7C;AAEA,YAAI,cAAcC,KAAKxD,WAAAA,EAAc,QAAOqD,WAAWE;AACvD,YAAI,aAAaC,KAAKxD,WAAAA,EAAc,QAAOqD,WAAWC;AACtD,eAAO;MACX;IAGJ;;;;;;;;;;ACvJA,OAAO;AACP,SAAQG,cAAAA,oBAAiB;AACzB,OAAOC,WAAW;;;;;;;;;;IAKLC;;;;AAJb,IAAAC;AACA,IAAAC;;;AAGO,IAAMF,eAAN,cAA2BG,YAAAA;aAAAA;;;MACbC;MAEjB,cAAc;AACV,cAAK;AACL,cAAMC,UAAS,KAAKC,KAAK,KAAK,WAAW;AACzC,aAAKF,SAAS,IAAIL,MAAMQ,IAAIC,MAAMC,KAAK;UACnCC,aAAa;UACbC,sBAAsB;UACtBC,cAAcC,OAAa;AACvB,mBAAOC,KAAKC,IAAIF,QAAQ,KAAK,GAAA;UACjC;QACJ,CAAA;AAEA,aAAKT,OAAOY,GAAG,SAAS,CAACC,QAAQZ,QAAOa,MAAM,0BAA0B;UAACA,OAAOD,IAAIE;QAAO,CAAA,CAAA;AAC3F,aAAKf,OAAOY,GAAG,WAAW,MAAMX,QAAOe,KAAK,iBAAA,CAAA;MAChD;MAEA,MAAMC,UAAyB;AAC3B,cAAM,KAAKjB,OAAOiB,QAAO;MAC7B;MAEA,MAAMC,aAA4B;AAC9B,cAAM,KAAKlB,OAAOmB,KAAI;MAC1B;MAEA,MAAMC,IAAOC,KAAgC;AACzC,cAAMC,MAAM,MAAM,KAAKtB,OAAOoB,IAAIC,GAAAA;AAClC,YAAIC,QAAQ,KAAM,QAAO;AACzB,eAAOC,KAAKC,MAAMF,GAAAA;MACtB;MAEA,MAAMG,IAAIJ,KAAaK,OAAgBC,YAAoC;AACvE,cAAMC,aAAaL,KAAKM,UAAUH,KAAAA;AAClC,YAAIC,eAAeG,QAAW;AAC1B,gBAAM,KAAK9B,OAAOyB,IAAIJ,KAAKO,YAAY,MAAMD,UAAAA;QACjD,OAAO;AACH,gBAAM,KAAK3B,OAAOyB,IAAIJ,KAAKO,UAAAA;QAC/B;MACJ;MAEA,MAAMG,IAAIV,KAA+B;AACrC,cAAMW,QAAQ,MAAM,KAAKhC,OAAO+B,IAAIV,GAAAA;AACpC,eAAOW,QAAQ;MACnB;MAEA,MAAMC,KAAKC,SAAoC;AAC3C,cAAMC,SAAmB,CAAA;AACzB,YAAIC,SAAS;AACb,WAAG;AACC,gBAAM,CAACC,YAAYC,KAAAA,IAAS,MAAM,KAAKtC,OAAOuC,KAAKH,QAAQ,SAASF,SAAS,SAAS,GAAA;AACtFE,mBAASC;AACTF,iBAAOK,KAAI,GAAIF,KAAAA;QACnB,SAASF,WAAW;AACpB,eAAOD;MACX;IACJ;;;;;;;;;;AC/DA,SAAQM,cAAAA,oBAAiB;AACzB,SAAQC,oBAAmB;AAC3B,SAAQC,qBAAoB;;;;;;;;;;IAqBfC;;;;AAlBb,IAAAC;;;AAkBO,IAAMD,sBAAN,cAAkCE,gBAAgBJ,YAAAA,EAAAA;aAAAA;;;MAErD,cAAc;AACV,cAAK;MACT;MAEA,MAAMK,YAAYC,YAAyD;AACvE,cAAMC,SAAyB,CAAA;AAE/B,mBAAWC,iBAAiBF,YAAY;AACpC,gBAAMG,SAAS,MAAM,KAAKC,WAAWF,aAAAA;AACrC,cAAIC,QAAQ;AACRF,mBAAOI,KAAKF,MAAAA;UAChB;QACJ;AAEA,eAAOF;MACX;MAEA,MAAMG,WAAWJ,YAA4D;AACzE,YAAI;AAEA,cAAIM,aAAa,GAAGN,WAAWO,WAAW,IAAIP,WAAWQ,UAAU;AAGnE,gBAAMC,gBAAgB,iBAAiBC,KAAKJ,UAAAA;AAC5C,cAAIG,iBAAiBE,QAAQC,aAAa,SAAS;AAE/CN,yBAAaA,WAAWO,QAAQ,oBAAoB,CAACC,QAAQC,UAAAA;AACzD,qBAAO,QAAQA,MAAMC,YAAW,CAAA;YACpC,CAAA,EAAGH,QAAQ,OAAO,GAAA;UACtB;AAGA,gBAAMI,YAAYtB,cAAcW,UAAAA,EAAYY,OAAO,QAAQC,KAAKC,IAAG;AACnE,gBAAMC,SAAS,MAAM,OAAOJ;AAE5B,cAAI,CAACI,OAAOC,WAAW,OAAOD,OAAOC,YAAY,UAAU;AACvD,kBAAM,IAAIC,MAAM,qCAAA;UACpB;AAEA,gBAAMC,SAASH,OAAOC;AAEtB,cAAI,CAACE,OAAOC,UAAU;AAClB,kBAAM,IAAIF,MAAM,kCAAA;UACpB;AAEA,cAAI,CAACC,OAAOC,SAASC,QAAQ,CAACF,OAAOC,SAASE,WAAW,CAACH,OAAOC,SAASG,YAAY;AAClF,kBAAM,IAAIL,MAAM,yCAAA;UACpB;AAEAM,kBAAQC,IAAI,mBAAmB9B,WAAW+B,WAAW,KAAKP,OAAOC,SAASE,OAAO,EAAE;AACnF,eAAKK,KAAK,iBAAiB;YAACR;YAAQO,aAAa/B,WAAW+B;UAAW,CAAA;AAEvE,iBAAO;YACHP;YACAtB,eAAeF;UACnB;QACJ,SAASiC,OAAO;AACZ,gBAAMC,MAAMD,iBAAiBV,QAAQU,QAAQ,IAAIV,MAAMY,OAAOF,KAAAA,CAAAA;AAC9DJ,kBAAQO,KAAK,2BAA2BpC,WAAW+B,WAAW,KAAKG,IAAIG,OAAO,EAAE;AAChF,eAAKL,KAAK,iBAAiB;YAACD,aAAa/B,WAAW+B;YAAaE,OAAOC;UAAG,CAAA;AAC3E,iBAAO;QACX;MACJ;IACJ;;;;;;;;;;ACxFA,SAAQI,YAAsB;AAA9B,IAgBaC;AAhBb;;;AAgBO,IAAMA,wBAAwBD,KAAK;MACtCE,MAAM;MACNC,SAAS;MACT,SAAS;MACT,SAAS;MACTC,YAAY;QACRJ,MAAM;MACV;MACA,iBAAiB;MACjB,qBAAqB;MACrB,YAAY;IAChB,CAAA;;;;;AC3BA,OAAO;AACP,SAAQK,cAAAA,oBAAiB;AACzB,SAAQC,gBAAe;AACvB,SAAQC,iBAAgB;AACxB,SAAQC,kBAAiB;AACzB,SAAQC,cAAAA,aAAYC,YAAYC,WAAS;AACzC,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAYf,SAAQC,iBAAgB;;;;;;;;;;IAGlBC,eACAC,sBAWOC;;;;AA1Bb,IAAAC;AACA,IAAAC;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;;;AAEA,IAAMJ,gBAAgBR,UAAUD,QAAAA;AAChC,IAAMU,uBAAuB;AAWtB,IAAMC,yBAAN,MAAMA,gCAA+BG,YAAAA;aAAAA;;;;;;;MAChCC;MACAC;MACAC,cAA6BC,QAAQC,QAAO;MAEpD,YACYC,OACAC,UACAC,WACAC,QACV;AACE,cAAK,GAAA,KALGH,QAAAA,OAAAA,KACAC,WAAAA,UAAAA,KACAC,YAAAA,WAAAA,KACAC,SAAAA;AAGR,aAAKR,aAAaT,MAAKa,QAAQK,IAAIC,IAAIV,UAAU;AACjD,aAAKC,gBAAgBV,MAAKa,QAAQK,IAAIC,IAAIT,aAAa;MAC3D;MAEA,OAAOU,OACHN,OAAqBO,IACrBZ,YAAoBC,eACpBM,WAAoCC,QACd;AACtB,cAAMK,IAAIN,aAAaO,uBAAuBH,OAAOX,UAAAA;AACrD,cAAMe,IAAIP,UAAU,IAAIQ,oBAAAA;AACxB,cAAMC,WAAW,IAAIrB,wBAAuBS,OAAOO,IAAIC,GAAGE,CAAAA;AAC1DE,iBAASjB,aAAaT,MAAKa,QAAQJ,UAAAA;AACnCiB,iBAAShB,gBAAgBV,MAAKa,QAAQH,aAAAA;AACtC,eAAOgB;MACX;MAEAC,cAAcC,KAAmB;AAC7B,aAAKnB,aAAaT,MAAKa,QAAQe,GAAAA;MACnC;MAEA,MAAMC,mBAAkC;AACpC,cAAMC,MAAM,KAAKC,KAAK,KAAKF,gBAAgB;AAC3C,cAAM9B,IAAGiC,MAAM,KAAKvB,YAAY;UAACwB,WAAW;QAAI,CAAA;AAChD,cAAM,KAAKC,oBAAoB,KAAKzB,UAAU;AAC9CqB,YAAIK,KAAK,sBAAsB,KAAK1B,UAAU,EAAE;MACpD;;MAIA,MAAM2B,gBACFC,WACAC,QACAC,aACe;AACf,cAAMT,MAAM,KAAKC,KAAK,KAAKK,eAAe;AAE1C,cAAMI,MAAMC,KAAKC,MAAM,MAAM3C,IAAG4C,SAAS3C,MAAK4C,KAAKP,WAAW,cAAA,GAAiB,OAAA,CAAA;AAC/E,cAAM,EAACQ,MAAMC,QAAO,IAAIN;AACxB,YAAI,CAACK,QAAQ,CAACC,QAAS,OAAM,IAAIC,MAAM,sCAAA;AAGvC,YAAIT,WAAW,cAAc;AACzB,gBAAM,KAAKU,YAAYX,SAAAA;QAC3B;AAGA,cAAMY,YAAY,MAAM,KAAKC,eAAeb,WAAWG,GAAAA;AACvD,cAAM,EAACW,QAAQC,MAAAA,OAAMC,OAAM,IAAIJ;AAG/B,YAAIX,WAAW,cAAc;AACzB,gBAAMgB,cAAc,MAAM,KAAKvC,SAASwC,UAAUJ,QAAQL,OAAAA;AAC1D,cAAIQ,aAAa;AACb,kBAAME,UAAUC,WACZ,UAAUZ,IAAAA,IAAQC,OAAAA,+BAAsCQ,YAAYI,MAAM,GAAG,EAAA,CAAA,uDAA0D;UAE/I;QACJ;AAGA,cAAMC,UAAU,MAAM,KAAKC,WAAWvB,SAAAA;AACtC,cAAMwB,SAAS,KAAKC,KAAKH,OAAAA;AAGzB,cAAMI,eAAe/D,MAAK4C,KAAK,KAAKnC,YAAU,GAAKoC,KAAKmB,MAAM,GAAA,GAAMlB,OAAAA;AACpE,cAAM,KAAKmB,aAAa5B,WAAW0B,YAAAA;AAGnC,cAAMG,OAAO,MAAM,KAAKnD,SAASoD,MAC7BtB,MAAMC,SAASK,QAAQC,OAAMO,SAASE,QAAQvB,QAAQC,aAAac,MAAAA;AAEvE,cAAM,KAAKe,aAAavB,MAAMC,SAASa,OAAAA;AAEvC,YAAI,CAACO,KAAM,OAAM,IAAInB,MAAM,0BAA0BF,IAAAA,IAAQC,OAAAA,EAAS;AACtEhB,YAAIK,KAAK,cAAcU,IAAAA,IAAQC,OAAAA,YAAmBR,MAAAA,KAAWqB,QAAQU,MAAM,SAAS;AACpF,eAAOH;MACX;;MAIA,MAAMI,iBAAoC;AACtC,cAAMxC,MAAM,KAAKC,KAAK,KAAKuC,cAAc;AACzC,YAAIpD,IAAIC,IAAIoD,oBAAoB;AAC5BzC,cAAIK,KAAK,oDAAA;AACT,iBAAO,CAAA;QACX;AAEA,cAAMqC,WAAW,MAAM,KAAKC,sBAAqB;AACjD,cAAMC,SAAmB,CAAA;AAEzB,mBAAW,EAACC,YAAYnC,IAAG,KAAKgC,UAAU;AACtC,gBAAMI,aAAa,MAAM,KAAK5D,UAAU6D,eAAeF,UAAAA;AACvD,cAAI,CAACC,WAAY;AAEjB,cAAI;AACA,kBAAMV,OAAO,MAAM,KAAK9B,gBAAgBuC,YAAY,YAAA;AACpDD,mBAAOI,KAAKZ,IAAAA;UAChB,SAASa,GAAG;AACRjD,gBAAIkD,MAAM,kBAAkBxC,IAAIK,IAAI,IAAIL,IAAIM,OAAO,KAAMiC,EAAYE,OAAO,EAAE;UAClF;QACJ;AAEA,eAAOP;MACX;;MAIA,MAAMQ,mBAAmBvB,SAAiBpB,aAAuC;AAC7E,eAAO,KAAK4C,SAAS,YAAA;AACjB,gBAAMC,SAASpF,MAAK4C,KAAK3C,IAAGoF,OAAM,GAAI,sBAAsBC,KAAKC,IAAG,CAAA,IAAMC,KAAKC,OAAM,EAAGC,SAAS,EAAA,EAAIhC,MAAM,GAAG,CAAA,CAAA,EAAI;AAClH,cAAI;AACA,kBAAM,KAAKiC,eAAehC,SAASyB,MAAAA;AACnC,mBAAO,MAAM,KAAKhD,gBAAgBgD,QAAQ,UAAU7C,WAAAA;UACxD,UAAA;AACI,kBAAMxC,IAAG6F,GAAGR,QAAQ;cAACnD,WAAW;cAAM4D,OAAO;YAAI,CAAA,EAAGC,MAAM,MAAA;YAC1D,CAAA;UACJ;QACJ,CAAA;MACJ;;MAIA,MAAMC,oBAAoBC,aAAqBlD,SAAkBP,aAAuC;AACpG,YAAI,CAACyD,YAAa,OAAM,IAAIjD,MAAM,iCAAA;AAElC,eAAO,KAAKoC,SAAS,YAAA;AACjB,gBAAMrD,MAAM,KAAKC,KAAK,KAAKgE,mBAAmB;AAC9C,gBAAME,OAAOnD,UAAU,GAAGkD,WAAAA,IAAelD,OAAAA,KAAYkD;AACrDlE,cAAIK,KAAK,cAAc8D,IAAAA,gBAAoB;AAE3C,gBAAMb,SAASpF,MAAK4C,KAAK,KAAKnC,YAAY,cAAA;AAC1C,gBAAMV,IAAGiC,MAAMoD,QAAQ;YAACnD,WAAW;UAAI,CAAA;AACvC,gBAAMlC,IAAGmG,UAAUlG,MAAK4C,KAAKwC,QAAQ,cAAA,GAAiB3C,KAAK0D,UAAU;YACjEtD,MAAM;YACNuD,SAAS;YACThD,MAAM;UACV,CAAA,CAAA;AACA,gBAAM,KAAKiD,WAAW;YAAC;YAAWJ;aAAOb,MAAAA;AAEzC,gBAAMkB,mBAAmBtG,MAAK4C,KAAKwC,QAAQ,gBAAA,GAAmBY,YAAYhC,MAAM,GAAA,GAAM,cAAA;AACtF,gBAAMuC,eAAevG,MAAKwG,QAAQF,gBAAAA;AAElC,cAAI;AACA,mBAAO,MAAM,KAAKlE,gBAAgBmE,cAAc,OAAOhE,WAAAA;UAC3D,UAAA;AACI,kBAAMxC,IAAG6F,GAAGR,QAAQ;cAACnD,WAAW;cAAM4D,OAAO;YAAI,CAAA,EAAGC,MAAM,MAAA;YAC1D,CAAA;UACJ;QACJ,CAAA;MACJ;;MAIA,MAAMH,eAAehC,SAAiB8C,WAAkC;AACpE,YAAI5G,YAAWG,MAAK4C,KAAK6D,WAAW,cAAA,CAAA,EAAkB;AAEtD,cAAMC,UAASlB,KAAKC,OAAM,EAAGC,SAAS,EAAA,EAAIhC,MAAM,GAAG,CAAA;AACnD,cAAMiD,iBAAiB,GAAGF,SAAAA,gBAAyBC,OAAAA;AACnD,cAAM3G,IAAGiC,MAAM2E,gBAAgB;UAAC1E,WAAW;QAAI,CAAA;AAE/C,cAAM2E,UAAU5G,MAAK4C,KAAK3C,IAAGoF,OAAM,GAAI,eAAeC,KAAKC,IAAG,CAAA,IAAMmB,OAAAA,MAAY;AAChF,YAAI;AACA,gBAAM3G,IAAGmG,UAAUU,SAASjD,OAAAA;AAC5B,gBAAMxD,cAAc,OAAO;YAAC;YAAOyG;YAAS;YAAwB;YAAMD;WAAe;QAC7F,UAAA;AACI,gBAAM5G,IAAG8G,OAAOD,OAAAA,EAASd,MAAM,MAAA;UAC/B,CAAA;QACJ;AAEA,YAAI;AACA,gBAAM/F,IAAG+G,OAAOH,gBAAgBF,SAAAA;QACpC,SAAS1B,GAAQ;AACb,gBAAMhF,IAAG6F,GAAGe,gBAAgB;YAAC1E,WAAW;YAAM4D,OAAO;UAAI,CAAA,EAAGC,MAAM,MAAA;UAClE,CAAA;AACA,cAAIf,EAAEgC,SAAS,eAAelH,YAAW4G,SAAAA,EAAY;AACrD,gBAAM1B;QACV;MACJ;MAEA,MAAMiC,UAAUhB,aAAoC;AAChD,YAAI,CAACA,YAAa,OAAM,IAAIjD,MAAM,iCAAA;AAClC,eAAO,KAAKoC,SAAS,YAAA;AACjB,gBAAMrD,MAAM,KAAKC,KAAK,KAAKiF,SAAS;AACpClF,cAAIK,KAAK,gBAAgB6D,WAAAA,EAAa;AACtC,gBAAMxD,MAAM,MAAM,KAAKzB,SAASkG,UAAUjB,WAAAA;AAC1C,cAAIxD,KAAK;AACL,kBAAM,KAAKzB,SAASmG,WAAW1E,IAAI2E,EAAE;AACrC,kBAAM,KAAKrG,MAAMsG,IAAI,GAAGhH,oBAAAA,GAAuB4F,WAAAA,IAAexD,IAAIM,OAAO,EAAE;UAC/E;QACJ,CAAA;MACJ;MAEA,MAAMuE,iBAAiBC,UAAkBtB,aAAqBlD,SAAiBe,QAAiC;AAC5G,cAAM/B,MAAM,KAAKC,KAAK,KAAKsF,gBAAgB;AAC3C,cAAMzF,MAAM,MAAM,KAAK2F,WAAWvB,aAAalD,OAAAA;AAC/C,YAAIlB,IAAK,QAAOA;AAEhB,cAAMmC,eAAe/D,MAAK4C,KAAK,KAAKnC,YAAU,GAAKuF,YAAYhC,MAAM,GAAA,GAAMlB,OAAAA;AAC3EhB,YAAIK,KAAK,UAAU6D,WAAAA,IAAelD,OAAAA,iCAAwC;AAE1E,YAAIa,UAAU,MAAM,KAAK6D,iBAAiBxB,aAAalD,OAAAA;AACvD,YAAI,CAACa,SAAS;AACV7B,cAAIK,KAAK,kBAAkB6D,WAAAA,IAAelD,OAAAA,gCAAuC;AACjFa,oBAAU,MAAM,KAAK5C,SAAS0G,eAAeH,QAAAA;QACjD;AACA,YAAI,CAAC3D,QAAS,OAAM,IAAIZ,MAAM,yBAAyBiD,WAAAA,IAAelD,OAAAA,KAAYwE,QAAAA,GAAW;AAE7F,YAAIzD,QAAQ;AACR,gBAAM6D,aAAa,KAAK5D,KAAKH,OAAAA;AAC7B,cAAI+D,eAAe7D,QAAQ;AACvB,kBAAM,IAAId,MAAM,8BAA8BiD,WAAAA,IAAelD,OAAAA,cAAqBe,OAAOH,MAAM,GAAG,EAAA,CAAA,SAAYgE,WAAWhE,MAAM,GAAG,EAAA,CAAA,EAAK;UAC3I;QACJ;AAEA,cAAM,KAAKiC,eAAehC,SAASI,YAAAA;AACnC,cAAM,KAAKf,YAAYe,YAAAA;AACvB,cAAM,KAAKK,aAAa4B,aAAalD,SAASa,OAAAA;AAC9C,eAAOI;MACX;MAEA,MAAM4D,aAAa3B,aAAqBlD,SAAiBe,QAAiC;AACtF,cAAM/B,MAAM,KAAKC,KAAK,KAAK4F,YAAY;AACvC,cAAM/F,MAAM,MAAM,KAAK2F,WAAWvB,aAAalD,OAAAA;AAC/C,YAAIlB,IAAK,QAAOA;AAEhB,cAAMmC,eAAe/D,MAAK4C,KAAK,KAAKnC,YAAU,GAAKuF,YAAYhC,MAAM,GAAA,GAAMlB,OAAAA;AAC3EhB,YAAIK,KAAK,UAAU6D,WAAAA,IAAelD,OAAAA,iCAAwC;AAE1E,YAAIa,UAAU,MAAM,KAAK6D,iBAAiBxB,aAAalD,OAAAA;AACvD,YAAI,CAACa,SAAS;AACV7B,cAAIK,KAAK,kBAAkB6D,WAAAA,IAAelD,OAAAA,0BAAiC;AAC3E,gBAAM8E,MAAM,MAAM,KAAK7G,SAAS8G,oBAAoB7B,aAAalD,OAAAA;AACjEa,oBAAUiE,MAAM,MAAM,KAAK7G,SAAS0G,eAAeG,IAAIT,EAAE,IAAI;QACjE;AACA,YAAI,CAACxD,QAAS,OAAM,IAAIZ,MAAM,yBAAyBiD,WAAAA,IAAelD,OAAAA,EAAS;AAE/E,cAAM4E,aAAa,KAAK5D,KAAKH,OAAAA;AAC7B,YAAI+D,eAAe7D,QAAQ;AACvB,gBAAM,IAAId,MAAM,oCAAoCc,OAAOH,MAAM,GAAG,EAAA,CAAA,SAAYgE,WAAWhE,MAAM,GAAG,EAAA,CAAA,EAAK;QAC7G;AAEA,cAAM,KAAKiC,eAAehC,SAASI,YAAAA;AACnC,cAAM,KAAKf,YAAYe,YAAAA;AACvB,eAAOA;MACX;MAEA+D,gBAAwB;AACpB,eAAO,KAAKrH;MAChB;MAGA,MAAMmD,WAAWe,YAAqC;AAClD,cAAM,EAACoD,OAAM,IAAI,MAAM5H,cAAc,QAAQ;UAAC;UAAQ;UAAsBF,IAAGoF,OAAM;WAAK;UAAC2C,KAAKrD;QAAU,CAAA;AAG1G,cAAMsD,OAAOF,OAAOG,KAAI,EAAGlE,MAAM,IAAA,EAAMmE,IAAG,EAAID,KAAI;AAClD,cAAME,cAAcpI,MAAKqI,WAAWJ,IAAAA,IAAQA,OAAOjI,MAAK4C,KAAK3C,IAAGoF,OAAM,GAAI4C,IAAAA;AAC1E,cAAMtE,UAAU,MAAM5D,IAAG4C,SAASyF,WAAAA;AAClC,cAAMrI,IAAG8G,OAAOuB,WAAAA,EAAatC,MAAM,MAAA;QACnC,CAAA;AACA,eAAOnC;MACX;MAEA,MAAMS,aAAa4B,aAAqBlD,SAAiBa,SAAgC;AACrF,cAAM2E,MAAM,GAAGlI,oBAAAA,GAAuB4F,WAAAA,IAAelD,OAAAA;AACrD,cAAM,KAAKhC,MAAMyH,IAAID,KAAK3E,QAAQ+B,SAAS,QAAA,CAAA;MAC/C;MAEA,MAAMxC,eACFyB,YACA6D,iBAC+B;AAC/B,cAAM1G,MAAM,KAAKC,KAAK,KAAKmB,cAAc;AAEzC,cAAMuF,MAAMD,mBACR/F,KAAKC,MAAM,MAAM3C,IAAG4C,SAAS3C,MAAK4C,KAAK+B,YAAY,cAAA,GAAiB,OAAA,CAAA;AAExE,cAAM+D,SAASC,sBAAsBF,GAAAA;AACrC,YAAIC,kBAAkBxI,WAAW;AAC7B,gBAAM,IAAI6C,MAAM,gCAAgC2F,OAAOE,OAAO,EAAE;QACpE;AACA,cAAMC,UAAUH;AAChB,cAAM,EAAC7F,MAAMC,SAASgG,KAAI,IAAID;AAE9B,cAAME,aAAaD,QAAQ;AAC3B,YAAI;AACA,gBAAM/I,IAAGiJ,OAAOhJ,MAAK4C,KAAK+B,YAAYoE,UAAAA,CAAAA;QAC1C,QAAQ;AACJ,gBAAM,IAAIhG,MAAM,gBAAgBgG,UAAAA,wBAAkC;QACtE;AAEA,cAAME,mBAAmB;UAAC;UAAe;UAAc;UAAW;;AAClE,cAAMC,UAAUL,QAAQK,WAAW,CAAC;AACpC,mBAAWC,UAAUF,kBAAkB;AACnC,cAAIC,QAAQC,MAAAA,EAAS,OAAM,IAAIpG,MAAM,oDAAoDoG,MAAAA,GAAS;QACtG;AAEA,cAAMC,gBAAgB,oBAAIC,IAAI;UAAC;UAAO;UAAS;UAAS;UAAU;UAAO;UAAQ;UAAQ;SAAO;AAChG,cAAMC,QAAQ,MAAM,KAAKC,QAAQ5E,UAAAA;AACjC,YAAI6E,YAAY;AAChB,mBAAWC,QAAQH,OAAO;AACtB,gBAAMI,MAAM1J,MAAK2J,QAAQF,IAAAA,EAAMG,YAAW;AAC1C,cAAIR,cAAcS,IAAIH,GAAAA,EAAM,OAAM,IAAI3G,MAAM,iCAAiC2G,GAAAA,MAAS1J,MAAK8J,SAASnF,YAAY8E,IAAAA,CAAAA,EAAO;AACvH,gBAAMM,OAAO,MAAMhK,IAAGgK,KAAKN,IAAAA;AAC3BD,uBAAaO,KAAKC;QACtB;AACA,YAAIR,YAAY,KAAK,OAAO,KAAM,OAAM,IAAIzG,MAAM,uBAAuByG,YAAY,OAAO,MAAMS,QAAQ,CAAA,CAAA,uBAAyB;AAEnInI,YAAIK,KAAK,4BAA4BU,IAAAA,IAAQC,OAAAA,KAAYwG,MAAMjF,MAAM,YAAYmF,YAAY,MAAMS,QAAQ,CAAA,CAAA,KAAO;AAElH,cAAMrF,aAAa,MAAM,KAAK5D,UAAU6D,eAAeF,UAAAA;AACvD,YAAI,CAACC,WAAY,OAAM,IAAI7B,MAAM,gCAAgC4B,UAAAA,EAAY;AAE7E,cAAMuF,SAAS,MAAM,KAAKjJ,OAAOkJ,WAAWvF,UAAAA;AAC5C,YAAI,CAACsF,OAAQ,OAAM,IAAInH,MAAM,qEAAqE;AAElG,cAAMqH,SAASF,OAAOE;AACtB,YAAI;AACA,gBAAMC,gBAA+B;YAACC,QAAQA;YAAsBC,QAAQ,CAAC;YAAGrJ,KAAKsJ,QAAQtJ;UAAG;AAChG,gBAAMkJ,OAAOK,WAAWJ,aAAAA;AACxB,cAAID,OAAOM,SAAQ,MAAOC,YAAYC,OAAO;AACzC,kBAAM,IAAI7H,MAAM,qCAAqCqH,OAAOM,SAAQ,CAAA,EAAI;UAC5E;AACA5I,cAAIK,KAAK,2BAA2BU,IAAAA,IAAQC,OAAAA,EAAS;AACrD,cAAI,CAACsH,OAAOjH,OAAQ,OAAM,IAAIJ,MAAM,UAAUF,IAAAA,IAAQC,OAAAA,wBAA+B;AACrF,cAAI,CAACsH,OAAOhH,KAAM,OAAM,IAAIL,MAAM,UAAUF,IAAAA,IAAQC,OAAAA,sBAA6B;AACjF,iBAAO;YACHK,QAAQiH,OAAOjH;YACfC,MAAMgH,OAAOhH;YACbC,QAAQ+G,OAAOS,YAAS,KAAQC;UACpC;QACJ,UAAA;AACI,cAAI;AACA,kBAAMV,OAAOW,QAAO;UACxB,QAAQ;UACR;QACJ;MACJ;;MAIA,MAAcxD,WAAWvB,aAAqBlD,SAAyC;AAMnF,cAAMkI,gBAAgBhL,MAAK4C,KAAK,KAAKlC,eAAa,GAAKsF,YAAYhC,MAAM,GAAA,CAAA;AACzE,YAAI;AACA,gBAAMxB,MAAMC,KAAKC,MAAM,MAAM3C,IAAG4C,SAAS3C,MAAK4C,KAAKoI,eAAe,cAAA,GAAiB,OAAA,CAAA;AACnF,cAAIxI,IAAIM,YAAYA,QAAS,QAAOkI;QACxC,QAAQ;QACR;AAEA,cAAMjH,eAAe/D,MAAK4C,KAAK,KAAKnC,YAAU,GAAKuF,YAAYhC,MAAM,GAAA,GAAMlB,OAAAA;AAG3E,YAAI;AACA,gBAAMN,MAAMC,KAAKC,MAAM,MAAM3C,IAAG4C,SAAS3C,MAAK4C,KAAKmB,cAAc,cAAA,GAAiB,OAAA,CAAA;AAClF,cAAIvB,IAAIM,YAAYA,QAAS,QAAOiB;QACxC,QAAQ;QACR;AAGA,cAAMkH,YAAYjL,MAAKwG,QAAQzC,YAAAA;AAC/B,YAAI;AACA,gBAAMmH,UAAU,MAAMnL,IAAGoL,QAAQF,SAAAA;AACjC,gBAAMG,cAAcF,QAAQG,KAAKtG,CAAAA,MAAKA,EAAEuG,WAAW,GAAGxI,OAAAA,eAAsB,CAAA;AAC5E,cAAIsI,aAAa;AACb,qBAASG,IAAI,GAAGA,IAAI,IAAIA,KAAK;AACzB,oBAAM,IAAI3K,QAAQ4K,CAAAA,MAAKC,WAAWD,GAAG,GAAA,CAAA;AACrC,kBAAI;AACA,sBAAMzL,IAAGiJ,OAAOhJ,MAAK4C,KAAKmB,cAAc,cAAA,CAAA;AACxC,uBAAOA;cACX,QAAQ;cACR;YACJ;UACJ;QACJ,QAAQ;QACR;AAEA,eAAO;MACX;MAEA,MAAcE,aAAa5B,WAAmBqJ,UAAiC;AAC3E,cAAMhF,UAASlB,KAAKC,OAAM,EAAGC,SAAS,EAAA,EAAIhC,MAAM,GAAG,CAAA;AACnD,cAAMiD,iBAAiB,GAAG+E,QAAAA,gBAAwBhF,OAAAA;AAElD,cAAM3G,IAAGiC,MAAMhC,MAAKwG,QAAQkF,QAAAA,GAAW;UAACzJ,WAAW;QAAI,CAAA;AACvD,cAAMlC,IAAG4L,GAAGtJ,WAAWsE,gBAAgB;UACnC1E,WAAW;UACX2J,QAAQ,wBAACC,QAAQ,CAAC7L,MAAK8L,SAASD,GAAAA,EAAKP,WAAW,UAAA,GAAxC;QACZ,CAAA;AAEA,YAAI;AACA,cAAIzL,YAAW6L,QAAAA,GAAW;AACtB,kBAAM3L,IAAG6F,GAAG8F,UAAU;cAACzJ,WAAW;cAAM4D,OAAO;YAAI,CAAA;UACvD;AACA,gBAAM9F,IAAG+G,OAAOH,gBAAgB+E,QAAAA;QACpC,SAAS3G,GAAQ;AACb,gBAAMhF,IAAG6F,GAAGe,gBAAgB;YAAC1E,WAAW;YAAM4D,OAAO;UAAI,CAAA,EAAGC,MAAM,MAAA;UAClE,CAAA;AACA,cAAIjG,YAAW6L,QAAAA,EAAW;AAC1B,gBAAM3G;QACV;MACJ;MAEA,MAAc7C,oBAAoB6J,SAAgC;AAC9D,cAAMjK,MAAM,KAAKC,KAAK,KAAKG,mBAAmB;AAC9C,YAAI;AACA,gBAAMgJ,UAAU,MAAMnL,IAAGoL,QAAQY,SAAS;YAACC,eAAe;UAAI,CAAA;AAC9D,qBAAWC,SAASf,SAAS;AACzB,gBAAIe,MAAMpJ,KAAKqJ,SAAS,eAAA,GAAkB;AACtC,oBAAMC,WAAWnM,MAAK4C,KAAKmJ,SAASE,MAAMpJ,IAAI;AAC9C,oBAAM9C,IAAG6F,GAAGuG,UAAU;gBAAClK,WAAW;gBAAM4D,OAAO;cAAI,CAAA,EAAGC,MAAM,MAAA;cAC5D,CAAA;AACAhE,kBAAIK,KAAK,2BAA2B8J,MAAMpJ,IAAI,EAAE;YACpD,WAAWoJ,MAAMG,YAAW,GAAI;AAC5B,oBAAM,KAAKlK,oBAAoBlC,MAAK4C,KAAKmJ,SAASE,MAAMpJ,IAAI,CAAA;YAChE;UACJ;QACJ,QAAQ;QACR;MACJ;MAEA,MAAcG,YAAYqJ,WAAoC;AAC1D,cAAMC,UAAUtM,MAAK4C,KAAKyJ,WAAW,cAAA;AACrC,cAAM7J,MAAMC,KAAKC,MAAM,MAAM3C,IAAG4C,SAAS2J,SAAS,OAAA,CAAA;AAClD,cAAMC,OAAO/J,IAAIgK;AACjB,YAAI,CAACD,QAAQE,OAAOC,KAAKH,IAAAA,EAAMlI,WAAW,EAAG,QAAO;AACpD,YAAIxE,YAAWG,MAAK4C,KAAKyJ,WAAW,cAAA,CAAA,EAAkB,QAAO;AAK7D,cAAMM,UAAoB,CAAA;AAC1B,mBAAW,CAAC9J,MAAMC,OAAAA,KAAY2J,OAAOvB,QAAQqB,IAAAA,GAAO;AAChD,cAAI;AACAK,sBAAQ/L,QAAQgC,MAAM;cAACgK,OAAO;gBAACR;;YAAU,CAAA;UAC7C,QAAQ;AACJM,oBAAQ7H,KAAK,GAAGjC,IAAAA,IAAQC,OAAAA,EAAS;UACrC;QACJ;AAEA,YAAI6J,QAAQtI,WAAW,EAAG,QAAO;AAEjC,cAAMvC,MAAM,KAAKC,KAAK,KAAKiB,WAAW;AACtClB,YAAIK,KAAK,cAAcwK,QAAQtI,MAAM,eAAe7B,IAAIK,IAAI,IAAIL,IAAIM,OAAO,KAAK6J,QAAQ/J,KAAK,IAAA,CAAA,EAAO;AACpG,cAAM,KAAKyD,WAAW;UAAC;UAAO;UAAU;UAAoB;aAAwCsG;WAAUN,SAAAA;AAC9GvK,YAAIK,KAAK,sBAAsBK,IAAIK,IAAI,IAAIL,IAAIM,OAAO,EAAE;AACxD,eAAO6J,QAAQtI;MACnB;MAEA,MAAckF,QAAQ3H,KAAgC;AAClD,cAAMkL,UAAoB,CAAA;AAC1B,cAAM5B,UAAU,MAAMnL,IAAGoL,QAAQvJ,KAAK;UAACoK,eAAe;QAAI,CAAA;AAC1D,mBAAWC,SAASf,SAAS;AACzB,cAAIe,MAAMpJ,SAAS,eAAgB;AACnC,gBAAMkK,OAAO/M,MAAK4C,KAAKhB,KAAKqK,MAAMpJ,IAAI;AACtC,cAAIoJ,MAAMG,YAAW,EAAIU,SAAQhI,KAAI,GAAI,MAAM,KAAKyE,QAAQwD,IAAAA,CAAAA;cACvDD,SAAQhI,KAAKiI,IAAAA;QACtB;AACA,eAAOD;MACX;MAEA,MAAcrI,wBAA0F;AACpG,cAAMqI,UAAmE,CAAA;AACzE,cAAME,YAAY,MAAMjN,IAAGoL,QAAQ,KAAKzK,aAAa,EAAEoF,MAAM,MAAM,CAAA,CAAE;AACrE,mBAAWmG,SAASe,WAAW;AAC3B,gBAAMC,YAAYjN,MAAK4C,KAAK,KAAKlC,eAAeuL,KAAAA;AAChD,cAAI,CAACA,MAAMX,WAAW,GAAA,EAAM;AAC5B,gBAAM4B,eAAe,MAAMnN,IAAGoL,QAAQ8B,SAAAA,EAAWnH,MAAM,MAAM,CAAA,CAAE;AAC/D,qBAAWtD,OAAO0K,cAAc;AAC5B,kBAAMC,SAAS,MAAMpN,IAAGqN,SAASpN,MAAK4C,KAAKqK,WAAWzK,GAAAA,CAAAA,EAAMsD,MAAM,MAAM,IAAA;AACxE,gBAAI,CAACqH,OAAQ;AACb,gBAAI;AACA,oBAAMtE,UAAUpG,KAAKC,MAAM,MAAM3C,IAAG4C,SAAS3C,MAAK4C,KAAKuK,QAAQ,cAAA,GAAiB,OAAA,CAAA;AAChF,kBAAItE,QAAQhG,QAAQgG,QAAQ/F,WAAW+F,QAAQwE,YAAYjK,MAAM;AAC7D0J,wBAAQhI,KAAK;kBAACH,YAAYwI;kBAAQ3K,KAAKqG;gBAAO,CAAA;cAClD;YACJ,QAAQ;YACR;UACJ;QACJ;AACA,eAAOiE;MACX;MAEQhJ,KAAKwJ,MAAsB;AAC/B,eAAO1N,WAAW,QAAA,EAAU2N,OAAOD,IAAAA,EAAME,OAAO,KAAA;MACpD;MAEA,MAAchG,iBAAiBxB,aAAqBlD,SAAyC;AACzF,cAAMwF,MAAM,GAAGlI,oBAAAA,GAAuB4F,WAAAA,IAAelD,OAAAA;AACrD,cAAMwK,OAAO,MAAM,KAAKxM,MAAM2M,IAAYnF,GAAAA;AAC1C,eAAOgF,OAAOI,OAAOC,KAAKL,MAAM,QAAA,IAAY;MAChD;MAEA,MAAcjH,WAAWuH,MAAgB5F,KAA8B;AACnE,cAAM,EAACD,QAAQ8F,OAAM,IAAI,MAAM1N,cAAc,QAAQyN,MAAM;UAAC5F;UAAK8F,SAAS;QAAM,CAAA;AAChF,YAAID,UAAU,CAACA,OAAO3B,SAAS,MAAA,EAAS,MAAKpK,IAAIiM,KAAK,gBAAgBF,OAAOnK,MAAM,GAAG,GAAA,CAAA,EAAM;AAC5F,eAAOqE;MACX;MAEQ5C,SAAY6I,IAAkC;AAClD,cAAMC,OAAO,KAAKtN;AAClB,YAAIE;AACJ,aAAKF,cAAc,IAAIC,QAAc4K,CAAAA,MAAK3K,WAAU2K,CAAAA;AACpD,eAAOyC,KAAKC,KAAKF,EAAAA,EAAIG,QAAQ,MAAMtN,SAAAA,CAAAA;MACvC;IACJ;;;;;;;;;;;;;;;AC5iBA,OAAO;AACP,SAAQuN,cAAAA,oBAAiB;;;;;;;;;;IAOZC;;;;AANb,IAAAC;AAEA;;;AAIO,IAAMD,wBAAN,cAAoCE,YAAAA;aAAAA;;;;MAEtBC,kBAAsD,oBAAIC,IAAAA;MAE3E,YACYC,YACV;AACE,cAAK,GAAA,KAFGA,aAAAA;MAGZ;MAEA,MAAMC,kBAAkBC,UAAkBC,QAA0C;AAChF,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,iBAAiB;AAC/C,YAAIK,YAAY,KAAKR,gBAAgBS,IAAIL,QAAAA;AACzC,YAAI,CAACI,WAAW;AACZA,sBAAY,oBAAIP,IAAAA;AAChB,eAAKD,gBAAgBU,IAAIN,UAAUI,SAAAA;QACvC;AACA,mBAAWG,YAAYN,QAAQ;AAC3B,gBAAM,EAACO,SAAQ,IAAID;AACnB,gBAAME,QAAOF,SAASG,MAAMC,KAAK,GAAA;AACjC,gBAAMC,aAAa,MAAM,KAAKd,WAAWe,OAAOb,UAAUQ,SAASM,MAAMN,SAASO,YAAYN,KAAAA;AAE9F,cAAI,CAACG,YAAY;AACbV,YAAAA,QAAOc,KAAK,6BAA6BR,SAASM,IAAI,EAAE;UAC5D,OAAO;AACHV,sBAAUE,IAAIM,WAAWE,MAAMF,UAAAA;UACnC;QACJ;MACJ;MAGA,MAAMK,oBAAoBjB,UAAiC;AACvD,cAAMI,YAAY,MAAM,KAAKN,WAAWoB,YAAYlB,QAAAA;AACpD,cAAMmB,MAAM,oBAAItB,IAAAA;AAChB,mBAAWuB,KAAKhB,WAAW;AACvBe,cAAIb,IAAIc,EAAEN,MAAMM,CAAAA;QACpB;AACA,aAAKxB,gBAAgBU,IAAIN,UAAUmB,GAAAA;MACvC;MAEAE,gBAAgBrB,UAAwB;AACpC,aAAKJ,gBAAgB0B,OAAOtB,QAAAA;MAChC;MAEA,MAAMuB,YAAYvB,UAAkBwB,cAAyC;AACzE,eAAO,KAAK5B,gBAAgBS,IAAIL,QAAAA,GAAWK,IAAImB,YAAAA;MACnD;MAEAC,wBAAwBzB,UAAkBe,YAA0C;AAChF,cAAMX,YAAY,KAAKR,gBAAgBS,IAAIL,QAAAA;AAC3C,YAAI,CAACI,UAAW,QAAOsB;AACvB,mBAAWlB,YAAYJ,UAAUuB,OAAM,GAAI;AACvC,cAAInB,SAASO,eAAeA,WAAY,QAAOP;QACnD;AACA,eAAOkB;MACX;IACJ;;;;;;;;;;;;AChEA,OAAO;AAAP,IAUsBE;AAVtB;;;AACA,IAAAC;AASO,IAAeD,oBAAf,cAA4CE,YAAAA;MAVnD,OAUmDA;;;;;MAC/C,YACcC,OACAC,QACZ;AACE,cAAK,GAAA,KAHKD,QAAAA,OAAAA,KACAC,SAAAA;MAGd;MAEA,MAAMC,WAAWC,IAAYC,OAA8B;AACvD,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,UAAU;AACxCG,QAAAA,QAAOE,KAAK,gBAAgB,KAAKN,OAAOO,MAAM,IAAIL,EAAAA,YAAcC,KAAAA,EAAO;AACvE,cAAM,KAAKJ,MAAMS,IAAI,KAAKC,IAAIN,OAAOD,EAAAA,CAAAA;MACzC;MAEA,MAAMQ,gBAAgBP,OAA8B;AAChD,cAAMQ,OAAO,MAAM,KAAKZ,MAAMY,KAAK,KAAKF,IAAIN,OAAO,GAAA,CAAA;AACnD,mBAAWM,OAAOE,KAAM,OAAM,KAAKZ,MAAMS,IAAIC,GAAAA;MACjD;MAEA,MAAgBG,OAAOH,KAAaI,OAAmD;AACnF,cAAMD,SAAS,MAAM,KAAKb,MAAMe,IAAOL,GAAAA;AACvC,YAAIG,QAAQ;AACR,eAAKG,IAAIT,KAAK,SAASG,GAAAA,QAAW;AAClC,iBAAOG;QACX;AAEA,cAAMI,SAAS,MAAMH,MAAAA;AACrB,YAAI,CAACG,OAAQ,QAAO;AAEpB,cAAM,KAAKjB,MAAMkB,IAAIR,KAAKO,QAAQ,KAAKhB,OAAOkB,GAAG;AACjD,eAAOF;MACX;MAEUP,IAAIN,OAAegB,SAAwB;AACjD,eAAO,OAAOhB,KAAAA,IAAS,KAAKH,OAAOO,MAAM,IAAIY,OAAAA;MACjD;IACJ;;;;;AC9CA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAOZC;;;;AANb;AACA;AAEA;;;AAGO,IAAMA,qBAAN,cAAiCC,kBAAAA;aAAAA;;;;MACpC,YACIC,OACQC,eACV;AACE,cAAMD,OAAO;UAACE,QAAQ;UAAeC,KAAK;QAAG,CAAA,GAAA,KAFrCF,gBAAAA;MAGZ;MAEA,MAAMG,UAAUC,OAAeC,SAA8C;AACzE,eAAO,KAAKC,OAAO,KAAKC,IAAIH,OAAOC,OAAAA,GAAU,MAAM,KAAKL,cAAcG,UAAUC,OAAOC,OAAAA,CAAAA;MAC3F;MAEA,MAAMG,WAAWJ,OAAeK,OAAyC;AACrE,cAAMC,UAAyB,CAAA;AAC/B,mBAAWC,QAAQF,OAAO;AACtB,gBAAMG,MAAM,MAAM,KAAKT,UAAUC,OAAOO,IAAAA;AACxC,cAAIC,IAAKF,SAAQG,KAAKD,GAAAA;QAC1B;AACA,eAAOF;MACX;MAEA,MAAMI,QAAQC,eAAoD;AAC9D,eAAO,KAAKT,OAAO,UAAUS,aAAAA,IAAiB,MAAM,KAAKf,cAAcc,QAAQC,aAAAA,CAAAA;MACnF;MAEA,MAAMC,kBAAkBX,SAA8C;AAClE,eAAO,KAAKC,OAAO,YAAYD,OAAAA,IAAW,MAAM,KAAKL,cAAcgB,kBAAkBX,OAAAA,CAAAA;MACzF;MAEA,MAAeY,WAAWC,IAAYd,OAA8B;AAChE,cAAM,MAAMa,WAAWC,IAAId,KAAAA;AAC3B,cAAMe,WAAW,MAAM,KAAKpB,MAAMqB,KAAK,UAAUF,EAAAA,EAAI;AACrD,mBAAWX,OAAOY,SAAU,OAAM,KAAKpB,MAAMsB,IAAId,GAAAA;MACrD;MAEA,MAAMe,YAAYlB,OAAuC;AACrD,eAAO,KAAKJ,cAAcsB,YAAYlB,KAAAA;MAC1C;IACJ;;;;;;;;;;;;;AC9CA,OAAO;AAEP,SAAQmB,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AAPb;AAEA;AAEA;;;AAGO,IAAMA,kBAAN,cAA8BC,kBAAAA;aAAAA;;;;MACjCC;MAEA,YACYC,YACRC,OACF;AACE,cAAMA,OAAO;UAACC,QAAQ;UAAYC,KAAK;QAAG,CAAA,GAAA,KAHlCH,aAAAA;MAIZ;MAEA,MAAMI,eAAkD;AACpD,eAAO,KAAKJ,WAAWK,KAAI;MAC/B;MAEA,MAAMC,UAAUC,OAAeC,cAAgD;AAC3E,eAAO,KAAKC,OAAO,KAAKC,IAAIH,OAAO,QAAQC,YAAAA,EAAc,GAAG,YAAA;AACxD,gBAAMG,WAAW,MAAM,KAAKX,WAAWY,IAAIJ,YAAAA;AAC3C,iBAAQG,YAAYA,SAASE,oBAAoBN,QAASI,WAAW;QACzE,CAAA;MACJ;MAEA,MAAMG,QAAQC,IAAsC;AAChD,eAAO,KAAKN,OAAO,YAAYM,EAAAA,IAAM,MAAM,KAAKf,WAAWc,QAAQC,EAAAA,CAAAA;MACvE;MAEA,MAAMC,eAAeC,UAAqD;AACtE,eAAO,KAAKjB,WAAWgB,eAAeC,QAAAA;MAC1C;MAEA,MAAMC,sBAAsBC,QAAgBC,gBAAyC;AACjF,eAAO,KAAKpB,WAAWkB,sBAAsBC,QAAQC,cAAAA;MACzD;MAEA,MAAMC,eAAeC,YAAoBL,UAAiC;AACtE,cAAM,KAAKjB,WAAWuB,OAAOD,YAAY;UAACE,WAAWP;QAAQ,CAAA;MACjE;MAEA,MAAMQ,mBAAmBN,QAAgBO,iBAA6D;AAClG,eAAO,KAAK1B,WAAWyB,mBAAmBN,QAAQO,eAAAA;MACtD;IACJ;;;;;;;;;;;;;AChDA,IAAAC,iBAAA;;;;AACA;AACA;;;;;ACFA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAYZC;;;;AAXb,IAAAC;AAEA;AAEA;AACA;AACA;AACA;AACA;;;AAGO,IAAMD,iBAAN,cAA6BE,YAAAA;aAAAA;;;;;;;MACxBC,UAAU,oBAAIC,IAAAA;MACdC,UAAU,oBAAID,IAAAA;MAEtB,YACYE,WACAC,WACAC,QACAC,UACV;AACE,cAAK,GAAA,KALGH,YAAAA,WAAAA,KACAC,YAAAA,WAAAA,KACAC,SAAAA,QAAAA,KACAC,WAAAA;MAGZ;MAEA,MAAMC,UAAUC,UAAoC;AAChD,cAAMC,WAAW,KAAKT,QAAQU,IAAIF,QAAAA;AAClC,YAAIC,SAAU,QAAOA;AAErB,cAAME,WAAW,KAAKT,QAAQQ,IAAIF,QAAAA;AAClC,YAAIG,SAAU,QAAOA;AAErB,cAAMC,UAAU,KAAKC,WAAWL,QAAAA;AAChC,aAAKN,QAAQY,IAAIN,UAAUI,OAAAA;AAC3B,YAAI;AACA,gBAAMG,SAAS,MAAMH;AACrB,iBAAOG;QACX,UAAA;AACI,eAAKb,QAAQc,OAAOR,QAAAA;QACxB;MACJ;MAEAE,IAAIF,UAAuC;AACvC,eAAO,KAAKR,QAAQU,IAAIF,QAAAA;MAC5B;MAEAS,IAAIT,UAA2B;AAC3B,eAAO,KAAKR,QAAQiB,IAAIT,QAAAA;MAC5B;MAEAU,cAAcV,UAA+C;AACzD,eAAO,KAAKR,QAAQU,IAAIF,QAAAA;MAC5B;MAEAW,aAAaC,QAAiC;AAC1C,cAAMC,SAASD,OAAOE,YAAW;AACjC,cAAMC,aAAgC,CAAA;AACtC,mBAAWR,UAAU,KAAKf,QAAQwB,OAAM,GAAI;AACxC,cAAIT,OAAOU,SAASC,WAAWC,SAAU;AACzC,cAAIZ,OAAOK,OAAOE,YAAW,MAAOD,OAAQ;AAC5CE,qBAAWK,KAAKb,MAAAA;QACpB;AACA,YAAIQ,WAAWM,WAAW,GAAG;AACzB,gBAAM,IAAIC,MAAM,gDAAgDV,MAAAA,EAAQ;QAC5E;AACA,YAAIG,WAAWM,WAAW,EAAG,QAAON,WAAW,CAAA;AAC/CA,mBAAWQ,KAAK,CAACC,GAAGC,MAAMA,EAAEC,QAAQC,cAAcH,EAAEE,SAASE,QAAW;UAACC,SAAS;QAAI,CAAA,CAAA;AACtF,eAAOd,WAAW,CAAA;MACtB;MAEAe,OAAO9B,UAAwB;AAC3B,cAAMO,SAAS,KAAKf,QAAQU,IAAIF,QAAAA;AAChC,YAAIO,QAAQ;AACRA,iBAAOwB,QAAO,EAAGC,MAAM,MAAA;UACvB,CAAA;AACA,eAAKxC,QAAQgB,OAAOR,QAAAA;QACxB;MACJ;MAEA,MAAMiC,gBAA+B;AACjC,cAAMC,MAAM,KAAKC,KAAK,KAAKF,aAAa;AACxC,cAAMG,SAAS,MAAM,KAAKtC,SAASuC,WAAU;AAC7CH,YAAII,KAAK,WAAWF,OAAOf,MAAM,8BAA8B;AAE/D,mBAAWkB,OAAOH,QAAQ;AACtB,cAAI,KAAK3B,IAAI8B,IAAIC,EAAE,EAAG;AACtB,cAAI;AACA,kBAAM,KAAKzC,UAAUwC,IAAIC,EAAE;UAC/B,SAASC,GAAG;AACRP,gBAAIQ,KAAK,kBAAkBH,IAAII,IAAI,IAAIJ,IAAIb,OAAO,KAAMe,EAAYG,OAAO,EAAE;UACjF;QACJ;AAEAV,YAAII,KAAK,gBAAgB,KAAK9C,QAAQqD,IAAI,mBAAmB;MACjE;MAEAC,YAAkC;AAC9B,eAAO,IAAIrD,IAAI,KAAKD,OAAO;MAC/B;MAEA,MAAca,WAAWL,UAAoC;AACzD,cAAMkC,MAAM,KAAKC,KAAK,KAAK9B,UAAU;AAErC,cAAMkC,MAAM,MAAM,KAAKzC,SAASiD,QAAQ/C,QAAAA;AACxC,YAAI,CAACuC,IAAK,OAAM,IAAIjB,MAAM,UAAUtB,QAAAA,kBAA0B;AAE9DkC,YAAII,KAAK,kBAAkBC,IAAII,IAAI,IAAIJ,IAAIb,OAAO,KAAK1B,QAAAA,GAAW;AAElE,cAAMgD,MAAM,MAAM,KAAKrD,UAAUsD,iBAAiBjD,UAAUuC,IAAII,MAAMJ,IAAIb,SAASa,IAAIW,UAAU,EAAA;AAEjG,cAAMC,aAAa,MAAM,KAAKvD,UAAUwD,eAAeJ,GAAAA;AACvD,YAAI,CAACG,WAAY,OAAM,IAAI7B,MAAM,gCAAgC0B,GAAAA,EAAK;AAEtE,cAAMK,SAAS,MAAM,KAAKxD,OAAOQ,WAAW8C,UAAAA;AAC5C,YAAI,CAACE,OAAQ,OAAM,IAAI/B,MAAM,oCAAoCiB,IAAII,IAAI,IAAIJ,IAAIb,OAAO,EAAE;AAE1F,cAAMnB,SAAS8C,OAAO9C;AACtB,cAAM+C,gBAA+B;UACjCC,QAAQA;UACRC,QAAQ,CAAC;UACTC,KAAKC,QAAQD;QACjB;AAEA,cAAMlD,OAAOoD,WAAWL,aAAAA;AACxB,YAAI/C,OAAOqD,SAAQ,MAAOC,YAAYC,OAAO;AACzC,cAAI;AACA,kBAAMvD,OAAOwB,QAAO;UACxB,QAAQ;UACR;AACA,gBAAM,IAAIT,MAAM,UAAUiB,IAAII,IAAI,IAAIJ,IAAIb,OAAO,+BAA+BnB,OAAOqD,SAAQ,CAAA,EAAI;QACvG;AAECrD,eAAeiC,KAAKxC;AACrB,aAAKR,QAAQc,IAAIN,UAAUO,MAAAA;AAC3B2B,YAAII,KAAK,UAAUC,IAAII,IAAI,IAAIJ,IAAIb,OAAO,sBAAsB1B,QAAAA,GAAW;AAC3E,eAAOO;MACX;IACJ;;;;;;;;;;;;;;;AC1IA,OAAO;AACP,SAAQwD,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AALb;AACA;AACA,IAAAC;;;AAGO,IAAMD,gBAAN,cAA4BE,kBAAAA;aAAAA;;;;MAC/B,YACYC,UACRC,OACF;AACE,cAAMA,OAAO;UAACC,QAAQ;UAAUC,KAAK;QAAG,CAAA,GAAA,KAHhCH,WAAAA;MAIZ;MAEA,MAAMI,UAAUC,OAAeC,QAAgBC,eAAyC;AACpF,cAAMC,MAAM,GAAG,KAAKC,OAAOP,MAAM,IAAII,MAAAA,IAAUC,aAAAA;AAC/C,cAAMG,SAAS,MAAM,KAAKT,MAAMU,IAAaH,GAAAA;AAC7C,YAAIE,WAAW,KAAM,QAAOA;AAE5B,cAAME,SAAS,MAAM,KAAKZ,SAASI,UAAUC,OAAOC,QAAQC,aAAAA;AAC5D,cAAM,KAAKN,MAAMY,IAAIL,KAAKI,QAAQ,KAAKH,OAAON,GAAG;AACjD,eAAOS;MACX;MAEA,MAAME,eAAeT,OAAeC,QAAgBC,eAAuBQ,aAAuC;AAC9G,cAAMP,MAAM,GAAG,KAAKC,OAAOP,MAAM,UAAUI,MAAAA,IAAUC,aAAAA,IAAiBQ,WAAAA;AACtE,cAAML,SAAS,MAAM,KAAKT,MAAMU,IAAaH,GAAAA;AAC7C,YAAIE,WAAW,KAAM,QAAOA;AAE5B,cAAME,SAAS,MAAM,KAAKZ,SAASc,eAAeT,OAAOC,QAAQC,eAAeQ,WAAAA;AAChF,cAAM,KAAKd,MAAMY,IAAIL,KAAKI,QAAQ,KAAKH,OAAON,GAAG;AACjD,eAAOS;MACX;MAEA,MAAMI,4BAA4BV,QAAgBD,OAAkC;AAChF,eAAO,MAAM,KAAKK,OAAO,GAAG,KAAKD,OAAOP,MAAM,IAAII,MAAAA,QAAcD,KAAAA,IAC5D,MAAM,KAAKL,SAASgB,4BAA4BV,QAAQD,KAAAA,CAAAA,KAAW,CAAA;MAC3E;MAEA,MAAMY,iBAAiBZ,OAAeC,QAAwC;AAC1E,eAAO,KAAKI,OAAO,GAAG,KAAKD,OAAOP,MAAM,WAAWI,MAAAA,IAC/C,MAAM,KAAKN,SAASiB,iBAAiBZ,OAAOC,MAAAA,CAAAA;MACpD;MAEA,MAAMY,iBAAiBb,OAAec,OAAuC;AACzE,eAAO,KAAKT,OAAO,GAAG,KAAKD,OAAOP,MAAM,UAAUiB,MAAMC,KAAI,EAAGC,YAAW,CAAA,IACtE,MAAM,KAAKrB,SAASkB,iBAAiBb,OAAOc,MAAMC,KAAI,CAAA,CAAA;MAC9D;MAEA,MAAME,eAAehB,QAA+B;AAChD,cAAMiB,OAAO,MAAM,KAAKtB,MAAMsB,KAAK,GAAG,KAAKd,OAAOP,MAAM,IAAII,MAAAA,IAAU;AACtE,mBAAWE,OAAOe,KAAM,OAAM,KAAKtB,MAAMuB,IAAIhB,GAAAA;MACjD;MAEA,MAAMiB,gBAAgBN,OAA8B;AAChD,cAAM,KAAKlB,MAAMuB,IAAI,GAAG,KAAKf,OAAOP,MAAM,UAAUiB,MAAMC,KAAI,EAAGC,YAAW,CAAA,EAAI;MACpF;IACJ;;;;;;;;;;;;;AC1DA,IAAaK,cAYAC;AAZb,IAAAC,eAAA;;;AAAO,IAAMF,eAAN,cAA2BG,MAAAA;MAAlC,OAAkCA;;;MACrBC;MACAC;MAET,YAAYC,SAAiBF,QAAgBC,MAAgB;AACzD,cAAMC,OAAAA;AACN,aAAKC,OAAO;AACZ,aAAKH,SAASA;AACd,aAAKC,OAAOA;MAChB;IACJ;AAEO,IAAMJ,mBAAN,cAA+BE,MAAAA;MAZtC,OAYsCA;;;MACzBK;MAET,YAAYA,WAAmB;AAC3B,cAAM,2BAA2BA,SAAAA,IAAa;AAC9C,aAAKD,OAAO;AACZ,aAAKC,YAAYA;MACrB;IACJ;;;;;ACRA,SAASC,cAAcC,QAAgC;AACnD,MAAI,CAACA,OAAQ,QAAO;AACpB,QAAMC,UAAUC,OAAOD,QAAQD,MAAAA,EAAQG,OAAO,CAAC,CAAA,EAAGC,CAAAA,MAAOA,MAAMC,UAAaD,MAAM,IAAA;AAClF,MAAIH,QAAQK,WAAW,EAAG,QAAO;AACjC,SAAO,MAAML,QAAQM,IAAI,CAAC,CAACC,GAAGJ,CAAAA,MAAO,GAAGK,mBAAmBD,CAAAA,CAAAA,IAAMC,mBAAmBC,OAAON,CAAAA,CAAAA,CAAAA,EAAK,EAAEO,KAAK,GAAA;AAC3G;AAjBA,IAmBaC;AAnBb;;;IAAAC;AAYSd;AAOF,IAAMa,qBAAN,MAAMA;MAnBb,OAmBaA;;;MACQE;MACAC;MACAC;MACAC;MAEjB,YAAYC,UAA4B;AACpC,aAAKJ,UAAUI,SAAQJ,QAAQK,QAAQ,QAAQ,EAAA;AAC/C,aAAKJ,cAAcG,SAAQE;AAC3B,aAAKJ,SAASE,SAAQG,SAASC,WAAWD,MAAME,KAAKD,UAAAA;AACrD,aAAKL,UAAUC,SAAQD,WAAW;MACtC;MAEA,MAAMO,QAAWN,UAAqC;AAClD,cAAMO,MAAM,GAAG,KAAKX,OAAO,GAAGI,SAAQQ,IAAI,GAAG3B,cAAcmB,SAAQS,KAAK,CAAA;AAExE,cAAMC,UAAkC;UAAC,GAAGV,SAAQU;QAAO;AAE3D,cAAMR,QAAQ,MAAM,KAAKS,aAAY;AACrC,YAAIT,MAAOQ,SAAQ,eAAA,IAAmB,UAAUR,KAAAA;AAChD,YAAIF,SAAQY,SAASzB,OAAWuB,SAAQ,cAAA,IAAkB;AAE1D,cAAMG,OAAoB;UAACC,QAAQd,SAAQc;UAAQJ;QAAO;AAC1D,YAAIV,SAAQY,SAASzB,OAAW0B,MAAKD,OAAOG,KAAKC,UAAUhB,SAAQY,IAAI;AAEvE,cAAMK,kBAAkB,KAAKC,aAAalB,SAAQmB,MAAM;AACxD,YAAIF,gBAAiBJ,MAAKM,SAASF;AAEnC,YAAI;AACA,gBAAMG,WAAW,MAAM,KAAKtB,OAAOS,KAAKM,IAAAA;AAExC,cAAI,CAACO,SAASC,IAAI;AACd,kBAAM,KAAKC,oBAAoBF,QAAAA;UACnC;AAEA,gBAAMG,OAAO,MAAMH,SAASG,KAAI;AAChC,cAAI,CAACA,KAAM,QAAOpC;AAClB,iBAAO4B,KAAKS,MAAMD,IAAAA;QACtB,SAASE,GAAG;AACR,gBAAM,KAAKC,cAAcD,GAAGzB,SAAQmB,MAAM;QAC9C;MACJ;MAEA,MAAcR,eAA4C;AACtD,YAAI,CAAC,KAAKd,YAAa,QAAOV;AAC9B,YAAI,OAAO,KAAKU,gBAAgB,SAAU,QAAO,KAAKA;AACtD,eAAO,KAAKA,YAAW;MAC3B;MAEA,MAAcyB,oBAAoBF,UAAoC;AAClE,YAAIR;AACJ,cAAMW,OAAO,MAAMH,SAASG,KAAI;AAChC,YAAI;AACAX,iBAAOG,KAAKS,MAAMD,IAAAA;QACtB,QAAQ;AACJX,iBAAOW;QACX;AACA,cAAM,IAAII,aACN,QAAQP,SAASQ,MAAM,KAAKR,SAASS,UAAU,IAC/CT,SAASQ,QACThB,IAAAA;MAER;MAEQM,aAAaY,gBAAuD;AACxE,cAAMC,gBAAgBC,YAAYjC,QAAQ,KAAKA,OAAO;AACtD,YAAI,CAAC+B,eAAgB,QAAOC;AAC5B,eAAOC,YAAYC,IAAI;UAACH;UAAgBC;SAAc;MAC1D;MAEQL,cAAcD,GAAYK,gBAAuC;AACrE,YAAIL,aAAaE,gBAAgBF,aAAaS,iBAAkB,QAAOT;AAEvE,YAAIA,aAAaU,gBAAgBV,EAAEW,SAAS,cAAc;AACtD,cAAIN,gBAAgBO,QAAS,QAAOZ;AACpC,iBAAO,IAAIS,iBAAiB,KAAKnC,OAAO;QAC5C;AACA,YAAI0B,aAAaU,gBAAgBV,EAAEW,SAAS,gBAAgB;AACxD,iBAAO,IAAIF,iBAAiB,KAAKnC,OAAO;QAC5C;AAEA,eAAO0B;MACX;IACJ;;;;;AClGA,IAAaa;AAAb,IAAAC,aAAA;;;AAAO,IAAMD,gBAAN,MAAMA;MAAb,OAAaA;;;;MACT,YAA+BE,QAAyB;aAAzBA,SAAAA;MAC/B;MAEUC,IAAOC,OAAcC,OAA6C;AACxE,eAAO,KAAKH,OAAOI,QAAQ,OAAOF,OAAMG,QAAWF,KAAAA;MACvD;MAEUG,KAAQJ,OAAcK,MAAgBJ,OAA6C;AACzF,eAAO,KAAKH,OAAOI,QAAQ,QAAQF,OAAMK,MAAMJ,KAAAA;MACnD;MAEUK,IAAON,OAAcK,MAA4B;AACvD,eAAO,KAAKP,OAAOI,QAAQ,OAAOF,OAAMK,IAAAA;MAC5C;MAEUE,MAASP,OAAcK,MAA4B;AACzD,eAAO,KAAKP,OAAOI,QAAQ,SAASF,OAAMK,IAAAA;MAC9C;MAEUG,IAAcR,OAA0B;AAC9C,eAAO,KAAKF,OAAOI,QAAQ,UAAUF,KAAAA;MACzC;IACJ;;;;;AC3BA,IAQaS;AARb;;;IAAAC;AAQO,IAAMD,gBAAN,cAA4BE,cAAAA;MARnC,OAQmCA;;;MAC/BC,eAAeC,QAAkD;AAC7D,eAAO,KAAKC,KAAK,2BAA2B;UAACD;QAAM,CAAA;MACvD;MAEAE,aAAaC,MAA0D;AACnE,eAAO,KAAKF,KAAK,2BAA2BE,IAAAA;MAChD;MAEAC,KAAuC;AACnC,eAAO,KAAKC,IAAI,cAAA;MACpB;MAEAC,OAAwB;AACpB,eAAO,KAAKD,IAAI,gBAAA;MACpB;MAEAE,UAA4C;AACxC,eAAO,KAAKF,IAAI,gBAAA;MACpB;MAEAG,aAAaC,QAAoE;AAC7E,eAAO,KAAKJ,IAAI,2BAA2BI,MAAAA;MAC/C;MAEAC,aAAaP,MAAoD;AAC7D,eAAO,KAAKF,KAAK,kBAAkBE,IAAAA;MACvC;MAEAQ,cAAcC,QAAiC;AAC3C,eAAO,KAAKX,KAAK,kBAAkBY,mBAAmBD,MAAAA,CAAAA,iBAAwB;MAClF;MAEAE,mBAAoD;AAChD,eAAO,KAAKT,IAAI,4BAAA;MACpB;MAEAU,oBAAyD;AACrD,eAAO,KAAKV,IAAI,wCAAA;MACpB;MAEAW,kBAAkBC,gBAAwBd,MAA+D;AACrG,eAAO,KAAKe,IAAI,0CAA0CL,mBAAmBI,cAAAA,CAAAA,gBAA+Bd,IAAAA;MAChH;MAEAgB,uBAAyD;AACrD,eAAO,KAAKlB,KAAK,2BAAA;MACrB;IACJ;;;;;ACxDA,IAqCamB;AArCb;;;IAAAC;AAqCO,IAAMD,wBAAN,cAAoCE,cAAAA;MArC3C,OAqC2CA;;;MACvCC,KAAKC,QAA4E;AAC7E,eAAO,KAAKC,IAAI,qBAAqBD,MAAAA;MACzC;MAEAE,QAAQC,IAAwC;AAC5C,eAAO,KAAKF,IAAI,qBAAqBG,mBAAmBD,EAAAA,CAAAA,EAAK;MACjE;MAEAE,OAAOC,MAA4D;AAC/D,eAAO,KAAKC,KAAK,qBAAqBD,IAAAA;MAC1C;MAEAE,OAAOL,IAAYG,MAA4D;AAC3E,eAAO,KAAKG,IAAI,qBAAqBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACnE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,qBAAqBP,mBAAmBD,EAAAA,CAAAA,EAAK;MACjE;MAEAS,QAAQT,IAAYH,QAA6E;AAC7F,eAAO,KAAKC,IAAI,qBAAqBG,mBAAmBD,EAAAA,CAAAA,YAAeH,MAAAA;MAC3E;MAEAa,UAAqC;AACjC,eAAO,KAAKZ,IAAI,2BAAA;MACpB;MAEAa,aAAaC,MAA0C;AACnD,eAAO,KAAKd,IAAI,mCAAmCG,mBAAmBW,IAAAA,CAAAA,EAAO;MACjF;MAEAC,OAAOhB,QAAiE;AACpE,eAAO,KAAKC,IAAI,6BAA6BD,MAAAA;MACjD;MAEAiB,WAAWC,OAAclB,QAAsE;AAC3F,eAAO,KAAKC,IAAI,kCAAkCG,mBAAmBc,KAAAA,CAAAA,IAASlB,MAAAA;MAClF;IACJ;;;;;AC7EA,IAmBamB;AAnBb;;;IAAAC;AAmBO,IAAMD,qBAAN,cAAiCE,cAAAA;MAnBxC,OAmBwCA;;;MACpCC,KAAKC,QAAsE;AACvE,eAAO,KAAKC,IAAI,qBAAqBD,MAAAA;MACzC;MAEAE,QAAQC,IAAqC;AACzC,eAAO,KAAKF,IAAI,qBAAqBG,mBAAmBD,EAAAA,CAAAA,EAAK;MACjE;MAEAE,OAAOC,MAAsD;AACzD,eAAO,KAAKC,KAAK,qBAAqBD,IAAAA;MAC1C;MAEAE,OAAOL,IAAYG,MAAsD;AACrE,eAAO,KAAKG,IAAI,qBAAqBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACnE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,qBAAqBP,mBAAmBD,EAAAA,CAAAA,EAAK;MACjE;MAEAS,iBAAiBT,IAA6C;AAC1D,eAAO,KAAKI,KAAK,qBAAqBH,mBAAmBD,EAAAA,CAAAA,oBAAuB;MACpF;MAEAU,WAAWP,MAAgE;AACvE,eAAO,KAAKC,KAAK,uCAAuCD,IAAAA;MAC5D;MAEAQ,WAAWX,IAAsC;AAC7C,eAAO,KAAKI,KAAK,qBAAqBH,mBAAmBD,EAAAA,CAAAA,cAAiB;MAC9E;MAEAY,WAAWZ,IAAYa,SAA2C;AAC9D,eAAO,KAAKC,MAAM,qBAAqBb,mBAAmBD,EAAAA,CAAAA,YAAe;UAACa;QAAO,CAAA;MACrF;IACJ;;;;;ACvDA,IAkBaE;AAlBb,IAAAC,eAAA;;;IAAAC;AAkBO,IAAMF,kBAAN,cAA8BG,cAAAA;MAlBrC,OAkBqCA;;;MACjCC,KAAKC,QAAgE;AACjE,eAAO,KAAKC,IAAI,kBAAkBD,MAAAA;MACtC;MAEAE,QAAQC,IAAkC;AACtC,eAAO,KAAKF,IAAI,kBAAkBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC9D;MAEAE,OAAOC,MAAgD;AACnD,eAAO,KAAKC,KAAK,kBAAkBD,IAAAA;MACvC;MAEAE,OAAOL,IAAYG,MAAgD;AAC/D,eAAO,KAAKG,IAAI,kBAAkBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAChE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,kBAAkBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC9D;IACJ;;;;;ACtCA,IAyBaS;AAzBb;;;IAAAC;AAyBO,IAAMD,yBAAN,cAAqCE,cAAAA;MAzB5C,OAyB4CA;;;MACxCC,KAAKC,QAA+E;AAChF,eAAO,KAAKC,IAAI,sBAAsBD,MAAAA;MAC1C;MAEAE,QAAQC,IAAyC;AAC7C,eAAO,KAAKF,IAAI,sBAAsBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAClE;MAEAE,OAAOC,MAA8D;AACjE,eAAO,KAAKC,KAAK,sBAAsBD,IAAAA;MAC3C;MAEAE,OAAOL,IAAYG,MAA8D;AAC7E,eAAO,KAAKG,IAAI,sBAAsBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACpE;MAEAI,WAAWC,gBAAwBL,MAAsD;AACrF,eAAO,KAAKM,MAAM,sBAAsBR,mBAAmBO,cAAAA,CAAAA,SAAwBL,IAAAA;MACvF;MAEAO,YAAYF,gBAAwBX,QAAsD;AACtF,eAAO,KAAKC,IAAI,sBAAsBG,mBAAmBO,cAAAA,CAAAA,aAA4BX,MAAAA;MACzF;MAEAc,cAAcH,gBAAwBL,MAAoD;AACtF,eAAO,KAAKC,KAAK,sBAAsBH,mBAAmBO,cAAAA,CAAAA,aAA4BL,IAAAA;MAC1F;IACJ;;;;;ACrDA,IAkCaS;AAlCb;;;IAAAC;AAkCO,IAAMD,iBAAN,cAA6BE,cAAAA;MAlCpC,OAkCoCA;;;MAChCC,KAAKC,QAA8D;AAC/D,eAAO,KAAKC,IAAI,iBAAiBD,MAAAA;MACrC;MAEAE,QAAQC,IAAiC;AACrC,eAAO,KAAKF,IAAI,iBAAiBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC7D;MAEAE,OAAOC,MAA8C;AACjD,eAAO,KAAKC,KAAK,iBAAiBD,IAAAA;MACtC;MAEAE,OAAOL,IAAYG,MAA8C;AAC7D,eAAO,KAAKG,IAAI,iBAAiBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAC/D;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,iBAAiBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC7D;MAEAS,QAAQC,QAAgBC,QAA+B;AACnD,eAAO,KAAKP,KAAK,iBAAiBH,mBAAmBS,MAAAA,CAAAA,UAAiBT,mBAAmBU,MAAAA,CAAAA,EAAS;MACtG;MAEAC,WAAWF,QAAgBC,QAA+B;AACtD,eAAO,KAAKH,IAAI,iBAAiBP,mBAAmBS,MAAAA,CAAAA,UAAiBT,mBAAmBU,MAAAA,CAAAA,EAAS;MACrG;MAEAE,SAASb,IAAYH,QAAkD;AACnE,eAAO,KAAKC,IAAI,iBAAiBG,mBAAmBD,EAAAA,CAAAA,UAAaH,MAAAA;MACrE;MAEAiB,gBAAgBd,IAAYH,QAAgE;AACxF,eAAO,KAAKC,IAAI,iBAAiBG,mBAAmBD,EAAAA,CAAAA,iBAAoBH,MAAAA;MAC5E;MAEAkB,OAAOlB,QAAkD;AACrD,eAAO,KAAKC,IAAI,wBAAwBD,MAAAA;MAC5C;MAEAmB,OAAOC,OAAmC;AACtC,eAAO,KAAKnB,IAAI,sBAAsBG,mBAAmBgB,KAAAA,CAAAA,EAAO;MACpE;MAEAC,YAAYD,OAAsC;AAC9C,eAAO,KAAKnB,IAAI,sBAAsBG,mBAAmBgB,KAAAA,CAAAA,cAAmB;MAChF;MAEAE,SAASF,OAAsC;AAC3C,eAAO,KAAKnB,IAAI,sBAAsBG,mBAAmBgB,KAAAA,CAAAA,WAAgB;MAC7E;MAEAG,SAASH,OAAsC;AAC3C,eAAO,KAAKnB,IAAI,sBAAsBG,mBAAmBgB,KAAAA,CAAAA,YAAiB;MAC9E;MAEAI,QAAQC,QAAuC;AAC3C,eAAO,KAAKxB,IAAI,uBAAuBwB,MAAAA,EAAO;MAClD;MAEAC,YAAiC;AAC7B,eAAO,KAAKzB,IAAI,yBAAA;MACpB;MAEA0B,kBAAkBd,QAAmC;AACjD,eAAO,KAAKZ,IAAI,2BAA2BG,mBAAmBS,MAAAA,CAAAA,EAAS;MAC3E;MAEAe,UAAUd,QAAwC;AAC9C,eAAO,KAAKb,IAAI,uBAAuBG,mBAAmBU,MAAAA,CAAAA,QAAe;MAC7E;IACJ;;;;;AC1GA,IAmBae;AAnBb;;;IAAAC;AAmBO,IAAMD,iBAAN,cAA6BE,cAAAA;MAnBpC,OAmBoCA;;;MAChCC,KAAKC,QAA8D;AAC/D,eAAO,KAAKC,IAAI,oBAAoBD,MAAAA;MACxC;MAEAE,QAAQC,IAAiC;AACrC,eAAO,KAAKF,IAAI,oBAAoBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAChE;MAEAE,OAAOC,MAA8C;AACjD,eAAO,KAAKC,KAAK,oBAAoBD,IAAAA;MACzC;MAEAE,OAAOL,IAAYG,MAA8C;AAC7D,eAAO,KAAKG,IAAI,oBAAoBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAClE;MAEAI,aAAaP,IAAYG,MAAoD;AACzE,eAAO,KAAKK,MAAM,oBAAoBP,mBAAmBD,EAAAA,CAAAA,WAAcG,IAAAA;MAC3E;MAEAM,YAAYT,IAAYG,MAAmD;AACvE,eAAO,KAAKK,MAAM,oBAAoBP,mBAAmBD,EAAAA,CAAAA,UAAaG,IAAAA;MAC1E;MAEAO,WAAWC,OAAiD;AACxD,eAAO,KAAKb,IAAI,gCAAgC;UAACa;QAAK,CAAA;MAC1D;IACJ;;;;;AC/CA,IAqBaC;AArBb;;;IAAAC;AAqBO,IAAMD,uBAAN,cAAmCE,cAAAA;MArB1C,OAqB0CA;;;MACtCC,KAAKC,QAA8E;AAC/E,eAAO,KAAKC,IAAI,uBAAuBD,MAAAA;MAC3C;MAEAE,QAAQC,IAA0C;AAC9C,eAAO,KAAKF,IAAI,uBAAuBG,mBAAmBD,EAAAA,CAAAA,EAAK;MACnE;MAEAE,OAAOC,MAAgE;AACnE,eAAO,KAAKC,KAAK,uBAAuBD,IAAAA;MAC5C;MAEAE,OAAOL,IAAYG,MAAgE;AAC/E,eAAO,KAAKG,IAAI,uBAAuBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACrE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,uBAAuBP,mBAAmBD,EAAAA,CAAAA,EAAK;MACnE;MAEAS,SAA0C;AACtC,eAAO,KAAKX,IAAI,4BAAA;MACpB;MAEAY,qBAAqBb,QAAsE;AACvF,eAAO,KAAKC,IAAI,8CAA8CD,MAAAA;MAClE;MAEAc,YAAYC,OAAsC;AAC9C,eAAO,KAAKd,IAAI,qBAAqBG,mBAAmBW,KAAAA,CAAAA,EAAO;MACnE;MAEAC,UAAUD,OAAsC;AAC5C,eAAO,KAAKd,IAAI,gBAAgBG,mBAAmBW,KAAAA,CAAAA,EAAO;MAC9D;MAEAE,qBAAqBF,OAAcT,MAA8C;AAC7E,eAAO,KAAKC,KAAK,gBAAgBH,mBAAmBW,KAAAA,CAAAA,IAAST,IAAAA;MACjE;MAEAY,aAAaH,OAA6B;AACtC,eAAO,KAAKJ,IAAI,gBAAgBP,mBAAmBW,KAAAA,CAAAA,EAAO;MAC9D;IACJ;;;;;ACjEA,IAgCaI;AAhCb;;;IAAAC;AAgCO,IAAMD,mBAAN,cAA+BE,cAAAA;MAhCtC,OAgCsCA;;;MAClCC,KAAKC,QAAkE;AACnE,eAAO,KAAKC,IAAI,gBAAgBD,MAAAA;MACpC;MAEAE,QAAQC,IAAmC;AACvC,eAAO,KAAKF,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC5D;MAEAE,OAAOC,MAAkD;AACrD,eAAO,KAAKC,KAAK,gBAAgBD,IAAAA;MACrC;MAEAE,OAAOL,IAAYG,MAAkD;AACjE,eAAO,KAAKG,IAAI,gBAAgBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAC9D;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,gBAAgBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC5D;MAEAS,QAAQT,IAAYH,QAA2D;AAC3E,eAAO,KAAKC,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,YAAeH,MAAAA;MACtE;MAEAa,WAAWb,QAA6D;AACpE,eAAO,KAAKC,IAAI,2BAA2BD,MAAAA;MAC/C;MAEAc,MAAMC,KAAaf,QAAqD;AACpE,eAAO,KAAKC,IAAI,uBAAuBG,mBAAmBW,GAAAA,CAAAA,IAAQf,MAAAA;MACtE;MAEAgB,UAAkC;AAC9B,eAAO,KAAKf,IAAI,sBAAA;MACpB;MAEAgB,kBAAkBd,IAA+B;AAC7C,eAAO,KAAKF,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,eAAkB;MACzE;IACJ;;;;;ACxEA,IAkBae;AAlBb;;;IAAAC;AAkBO,IAAMD,oBAAN,cAAgCE,cAAAA;MAlBvC,OAkBuCA;;;MACnCC,KAAKC,QAAgE;AACjE,eAAO,KAAKC,IAAI,oBAAoBD,MAAAA;MACxC;MAEAE,QAAQC,IAAuC;AAC3C,eAAO,KAAKF,IAAI,oBAAoBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAChE;MAEAE,OAAOC,MAAuD;AAC1D,eAAO,KAAKC,KAAK,oBAAoBD,IAAAA;MACzC;MAEAE,OAAOL,IAAYG,MAAuD;AACtE,eAAO,KAAKG,MAAM,oBAAoBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACpE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,oBAAoBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAChE;MAEAS,WAAWT,IAAkC;AACzC,eAAO,KAAKF,IAAI,oBAAoBG,mBAAmBD,EAAAA,CAAAA,UAAa;MACxE;MAEAU,UAAUC,WAAmBR,MAA+C;AACxE,eAAO,KAAKC,KAAK,oBAAoBH,mBAAmBU,SAAAA,CAAAA,YAAsBR,IAAAA;MAClF;MAEAS,aAAaD,WAAmBE,UAAiC;AAC7D,eAAO,KAAKL,IAAI,oBAAoBP,mBAAmBU,SAAAA,CAAAA,YAAsBV,mBAAmBY,QAAAA,CAAAA,EAAW;MAC/G;MAEAC,iBAAiBH,WAAmBE,UAAkBV,MAA+C;AACjG,eAAO,KAAKG,MAAM,oBAAoBL,mBAAmBU,SAAAA,CAAAA,YAAsBV,mBAAmBY,QAAAA,CAAAA,IAAaV,IAAAA;MACnH;MAEAY,WAAWf,IAA8C;AACrD,eAAO,KAAKF,IAAI,oBAAoBG,mBAAmBD,EAAAA,CAAAA,UAAa;MACxE;IACJ;;;;;AC1DA,IAoBagB;AApBb,IAAAC,gBAAA;;;IAAAC;AAoBO,IAAMF,mBAAN,cAA+BG,cAAAA;MApBtC,OAoBsCA;;;MAClCC,UAAUC,QAA6E;AACnF,eAAO,KAAKC,IAAI,yBAAyBD,MAAAA;MAC7C;MAEAE,QAAQC,IAAwC;AAC5C,eAAO,KAAKF,IAAI,yBAAyBG,mBAAmBD,EAAAA,CAAAA,EAAK;MACrE;MAEAE,WAAWC,MAA4D;AACnE,eAAO,KAAKC,KAAK,yBAAyBD,IAAAA;MAC9C;MAEAE,WAAWL,IAAYG,MAA4D;AAC/E,eAAO,KAAKG,IAAI,yBAAyBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACvE;MAEAI,WAAWP,IAA2B;AAClC,eAAO,KAAKQ,IAAI,yBAAyBP,mBAAmBD,EAAAA,CAAAA,EAAK;MACrE;MAEAS,cAAcC,QAAgD;AAC1D,eAAO,KAAKZ,IAAI,mCAAmCG,mBAAmBS,MAAAA,CAAAA,EAAS;MACnF;MAEAC,WAAWC,QAAiD;AACxD,eAAO,KAAKd,IAAI,yBAAyBG,mBAAmBW,MAAAA,CAAAA,SAAgB;MAChF;MAEAC,SAASD,QAAgBE,SAA8C;AACnE,eAAO,KAAKhB,IAAI,yBAAyBG,mBAAmBW,MAAAA,CAAAA,WAAkBX,mBAAmBa,OAAAA,CAAAA,EAAU;MAC/G;MAEAC,YAAYH,QAAgBT,MAA8D;AACtF,eAAO,KAAKC,KAAK,yBAAyBH,mBAAmBW,MAAAA,CAAAA,WAAkBT,IAAAA;MACnF;MAEAa,YAAYJ,QAAgBE,SAAiBX,MAA8D;AACvG,eAAO,KAAKG,IAAI,yBAAyBL,mBAAmBW,MAAAA,CAAAA,WAAkBX,mBAAmBa,OAAAA,CAAAA,IAAYX,IAAAA;MACjH;MAEAc,YAAYL,QAAgBE,SAAgC;AACxD,eAAO,KAAKN,IAAI,yBAAyBP,mBAAmBW,MAAAA,CAAAA,WAAkBX,mBAAmBa,OAAAA,CAAAA,EAAU;MAC/G;MAEAI,kBAAkBN,QAAgBE,SAAiBX,MAAqE;AACpH,eAAO,KAAKC,KAAK,yBAAyBH,mBAAmBW,MAAAA,CAAAA,WAAkBX,mBAAmBa,OAAAA,CAAAA,WAAmBX,IAAAA;MACzH;IACJ;;;;;ACpEA,IAGagB;AAHb;;;IAAAC;AAGO,IAAMD,mBAAN,cAA+BE,cAAAA;MAHtC,OAGsCA;;;MAClCC,OAAkC;AAC9B,eAAO,KAAKC,IAAI,iBAAA;MACpB;MAEAC,QAAQC,IAAmC;AACvC,eAAO,KAAKF,IAAI,mBAAmBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC/D;IACJ;;;;;ACXA,IA4BaE;AA5Bb;;;IAAAC;AA4BO,IAAMD,oBAAN,cAAgCE,cAAAA;MA5BvC,OA4BuCA;;;MACnCC,KAAKC,QAAqE;AACtE,eAAO,KAAKC,IAAI,iBAAiBD,MAAAA;MACrC;MAEAE,QAAQC,IAAoC;AACxC,eAAO,KAAKF,IAAI,iBAAiBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC7D;MAEAE,OAAOC,MAAoD;AACvD,eAAO,KAAKC,KAAK,iBAAiBD,IAAAA;MACtC;MAEAE,OAAOL,IAAYG,MAAoD;AACnE,eAAO,KAAKG,IAAI,iBAAiBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAC/D;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,iBAAiBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC7D;MAEAS,WAAWT,IAAYH,QAA+D;AAClF,eAAO,KAAKC,IAAI,iBAAiBG,mBAAmBD,EAAAA,CAAAA,YAAeH,MAAAA;MACvE;MAEAa,WAAWV,IAAYG,MAAmD;AACtE,eAAO,KAAKC,KAAK,iBAAiBH,mBAAmBD,EAAAA,CAAAA,YAAeG,IAAAA;MACxE;MAEAQ,aAAaX,IAA2B;AACpC,eAAO,KAAKQ,IAAI,iBAAiBP,mBAAmBD,EAAAA,CAAAA,UAAa;MACrE;MAEAY,aAAaZ,IAAuC;AAChD,eAAO,KAAKF,IAAI,iBAAiBG,mBAAmBD,EAAAA,CAAAA,YAAe;MACvE;MAEAa,gBAA6C;AACzC,eAAO,KAAKf,IAAI,0BAAA;MACpB;MAEAgB,OAAOjB,QAA+C;AAClD,eAAO,KAAKC,IAAI,wBAAwBD,MAAAA;MAC5C;IACJ;;;;;ACxEA,IA+CakB;AA/Cb;;;IAAAC;AA+CO,IAAMD,uBAAN,cAAmCE,cAAAA;MA/C1C,OA+C0CA;;;MACtCC,UAAUC,QAAmF;AACzF,eAAO,KAAKC,IAAI,yBAAyBD,MAAAA;MAC7C;MAEAE,QAAQC,IAA2C;AAC/C,eAAO,KAAKF,IAAI,yBAAyBG,mBAAmBD,EAAAA,CAAAA,EAAK;MACrE;MAEAE,WAAWC,MAAkE;AACzE,eAAO,KAAKC,KAAK,yBAAyBD,IAAAA;MAC9C;MAEAE,WAAWL,IAAYG,MAAkE;AACrF,eAAO,KAAKG,IAAI,yBAAyBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACvE;MAEAI,WAAWP,IAA2B;AAClC,eAAO,KAAKQ,IAAI,yBAAyBP,mBAAmBD,EAAAA,CAAAA,EAAK;MACrE;MAEAS,cAAcT,IAA8C;AACxD,eAAO,KAAKF,IAAI,yBAAyBG,mBAAmBD,EAAAA,CAAAA,YAAe;MAC/E;MAEAU,iBAAqD;AACjD,eAAO,KAAKZ,IAAI,kCAAA;MACpB;MAEAa,WAAWd,QAAsD;AAC7D,eAAO,KAAKC,IAAI,gCAAgCD,MAAAA;MACpD;MAEAe,uBAAuBC,UAAqD;AACxE,eAAO,KAAKf,IAAI,6CAA6CG,mBAAmBY,QAAAA,CAAAA,EAAW;MAC/F;MAEAC,aAAajB,QAAyF;AAClG,eAAO,KAAKC,IAAI,4BAA4BD,MAAAA;MAChD;MAEAkB,WAAWf,IAA8C;AACrD,eAAO,KAAKF,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,EAAK;MACxE;MAEAgB,cAAcC,QAAgBd,MAAwE;AAClG,eAAO,KAAKC,KAAK,kCAAkCH,mBAAmBgB,MAAAA,CAAAA,IAAWd,IAAAA;MACrF;MAEAe,aAAalB,IAA2B;AACpC,eAAO,KAAKI,KAAK,4BAA4BH,mBAAmBD,EAAAA,CAAAA,QAAW;MAC/E;MAEAmB,cAAcnB,IAA2B;AACrC,eAAO,KAAKI,KAAK,4BAA4BH,mBAAmBD,EAAAA,CAAAA,SAAY;MAChF;MAEAoB,eAAepB,IAAqC;AAChD,eAAO,KAAKF,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,UAAa;MAChF;MAEAqB,eAAerB,IAAYH,QAAiF;AACxG,eAAO,KAAKC,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,YAAeH,MAAAA;MAClF;MAEAyB,gBAAgBtB,IAA4C;AACxD,eAAO,KAAKF,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,sBAAyB;MAC5F;MAEAuB,eAAevB,IAA2C;AACtD,eAAO,KAAKF,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,6BAAgC;MACnG;MAEAwB,kBAAkBxB,IAA8C;AAC5D,eAAO,KAAKF,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,gCAAmC;MACtG;MAEAyB,eAAezB,IAA0D;AACrE,eAAO,KAAKF,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,6BAAgC;MACnG;MAEA0B,UAAUC,UAAmD;AACzD,eAAO,KAAK7B,IAAI,oCAAoCG,mBAAmB0B,QAAAA,CAAAA,EAAW;MACtF;MAEAC,oBAA2D;AACvD,eAAO,KAAK9B,IAAI,qCAAA;MACpB;MAEA+B,sBAAsBZ,QAAsD;AACxE,eAAO,KAAKnB,IAAI,kCAAkCG,mBAAmBgB,MAAAA,CAAAA,WAAkB;MAC3F;MAEAa,qBAAqB9B,IAAYH,QAAoD;AACjF,eAAO,KAAKC,IAAI,4BAA4BG,mBAAmBD,EAAAA,CAAAA,sBAAyBH,MAAAA;MAC5F;IACJ;;;;;AC/IA,IAGakC;AAHb;;;IAAAC;AAGO,IAAMD,sBAAN,cAAkCE,cAAAA;MAHzC,OAGyCA;;;MACrCC,OAAyB;AACrB,eAAO,KAAKC,IAAI,iBAAA;MACpB;MAEAC,QAAQC,IAA8B;AAClC,eAAO,KAAKF,IAAI,mBAAmBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC/D;MAEAE,KAAKC,MAAiE;AAClE,eAAO,KAAKC,KAAK,mBAAmBD,IAAAA;MACxC;MAEAE,OAAOL,IAAYG,MAAiE;AAChF,eAAO,KAAKG,IAAI,mBAAmBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MACjE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,mBAAmBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC/D;MAEAS,QAAQT,IAA8C;AAClD,eAAO,KAAKI,KAAK,mBAAmBH,mBAAmBD,EAAAA,CAAAA,UAAa;MACxE;MAEAU,SAASP,MAAoE;AACzE,eAAO,KAAKC,KAAK,4BAA4BD,IAAAA;MACjD;MAEAQ,cAAgD;AAC5C,eAAO,KAAKb,IAAI,0BAAA;MACpB;MAEAc,aAAaT,MAAiE;AAC1E,eAAO,KAAKC,KAAK,4BAA4BD,IAAAA;MACjD;IACJ;;;;;ACvCA,IAUaU;AAVb;;;IAAAC;AAUO,IAAMD,qBAAN,cAAiCE,cAAAA;MAVxC,OAUwCA;;;MACpCC,MAAMC,MAA4D;AAC9D,eAAO,KAAKC,KAAK,2BAA2BD,IAAAA;MAChD;MAEAE,cAAcF,MAAgE;AAC1E,eAAO,KAAKC,KAAK,oCAAoCD,IAAAA;MACzD;MAEAG,eAAeH,MAAkE;AAC7E,eAAO,KAAKC,KAAK,qCAAqCD,IAAAA;MAC1D;IACJ;;;;;ACtBA,IAGaI;AAHb;;;IAAAC;AAGO,IAAMD,mBAAN,cAA+BE,cAAAA;MAHtC,OAGsCA;;;MAClCC,OAAkC;AAC9B,eAAO,KAAKC,IAAI,iBAAA;MACpB;MAEAC,QAAQC,IAAmC;AACvC,eAAO,KAAKF,IAAI,mBAAmBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC/D;MAEAE,UAAiC;AAC7B,eAAO,KAAKJ,IAAI,yBAAA;MACpB;IACJ;;;;;ACfA,IA2BaK;AA3Bb;;;IAAAC;AA2BO,IAAMD,sBAAN,cAAkCE,cAAAA;MA3BzC,OA2ByCA;;;MACrCC,YAAYC,QAAqF;AAC7F,eAAO,KAAKC,IAAI,+BAA+BD,MAAAA;MACnD;MAEAE,aAA+C;AAC3C,eAAO,KAAKD,IAAI,qCAAA;MACpB;MAEAE,aAAyC;AACrC,eAAO,KAAKF,IAAI,kCAAA;MACpB;MAEAG,oBAA6C;AACzC,eAAO,KAAKH,IAAI,0CAAA;MACpB;MAEAI,aAAgC;AAC5B,eAAO,KAAKJ,IAAI,iCAAA;MACpB;MAEAK,aAAaC,MAA0C;AACnD,eAAO,KAAKN,IAAI,mCAAmCO,mBAAmBD,IAAAA,CAAAA,UAAe;MACzF;MAEAE,eAAgD;AAC5C,eAAO,KAAKR,IAAI,yCAAA;MACpB;MAEAS,mBAAmBH,MAAiD;AAChE,eAAO,KAAKN,IAAI,mCAAmCO,mBAAmBD,IAAAA,CAAAA,UAAe;MACzF;MAEAI,gBAAmC;AAC/B,eAAO,KAAKV,IAAI,oCAAA;MACpB;MAEAW,gBAAgBL,MAA0C;AACtD,eAAO,KAAKN,IAAI,sCAAsCO,mBAAmBD,IAAAA,CAAAA,UAAe;MAC5F;MAEAM,gBAAgBN,MAAoD;AAChE,eAAO,KAAKN,IAAI,sCAAsCO,mBAAmBD,IAAAA,CAAAA,UAAe;MAC5F;MAEAO,eAAyC;AACrC,eAAO,KAAKb,IAAI,iCAAA;MACpB;MAEAc,mBAAiD;AAC7C,eAAO,KAAKd,IAAI,4CAAA;MACpB;MAEAe,kBAAmC;AAC/B,eAAO,KAAKC,KAAK,kCAAA;MACrB;IACJ;;;;;ACnFA,IAmBaC;AAnBb;;;IAAAC;AAmBO,IAAMD,iBAAN,cAA6BE,cAAAA;MAnBpC,OAmBoCA;;;MAChCC,SAAqC;AACjC,eAAO,KAAKC,IAAI,mBAAA;MACpB;MAEAC,cAAcC,QAAoE;AAC9E,eAAO,KAAKF,IAAI,6BAA6BE,MAAAA;MACjD;MAEAC,cAAcC,UAAkBF,QAA0D;AACtF,eAAO,KAAKF,IAAI,8BAA8BK,mBAAmBD,QAAAA,CAAAA,IAAaF,MAAAA;MAClF;MAEAI,cAAcC,QAAoC;AAC9C,eAAO,KAAKP,IAAI,oBAAoBK,mBAAmBE,MAAAA,CAAAA,YAAmB;MAC9E;MAEAC,WAAWD,QAAgBL,QAAiD;AACxE,eAAO,KAAKF,IAAI,oBAAoBK,mBAAmBE,MAAAA,CAAAA,YAAmBL,MAAAA;MAC9E;IACJ;;;;;ACvCA,IAuDaO;AAvDb;;;IAAAC;AAuDO,IAAMD,mBAAN,cAA+BE,cAAAA;MAvDtC,OAuDsCA;;;MAClCC,KAAKC,QAA+D;AAChE,eAAO,KAAKC,IAAI,gBAAgBD,MAAAA;MACpC;MAEAE,QAAQC,IAAmC;AACvC,eAAO,KAAKF,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC5D;MAEAE,OAAOC,MAAkD;AACrD,eAAO,KAAKC,KAAK,gBAAgBD,IAAAA;MACrC;MAEAE,OAAOL,IAAYG,MAAkD;AACjE,eAAO,KAAKG,IAAI,gBAAgBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAC9D;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,gBAAgBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC5D;MAEAS,QAAQT,IAA2B;AAC/B,eAAO,KAAKM,IAAI,gBAAgBL,mBAAmBD,EAAAA,CAAAA,UAAa;MACpE;MAEAU,YAAYV,IAA2C;AACnD,eAAO,KAAKF,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,WAAc;MACrE;MAEAW,WAAWX,IAAYY,WAA0C;AAC7D,eAAO,KAAKd,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,aAAgBC,mBAAmBW,SAAAA,CAAAA,EAAY;MACtG;MAEAC,eAAeD,WAA0C;AACrD,eAAO,KAAKd,IAAI,yBAAyBG,mBAAmBW,SAAAA,CAAAA,EAAY;MAC5E;MAEAE,2BAA2Bd,IAAYG,MAA0F;AAC7H,eAAO,KAAKC,KAAK,gBAAgBH,mBAAmBD,EAAAA,CAAAA,4BAA+BG,IAAAA;MACvF;MAEAY,mBAAmBlB,QAA2D;AAC1E,eAAO,KAAKC,IAAI,gCAAgCD,MAAAA;MACpD;MAEAmB,sBAAsBb,MAA4CN,QAAsF;AACpJ,eAAO,KAAKO,KAAK,uCAAuCD,MAAMN,MAAAA;MAClE;MAEAoB,SAASd,MAAkE;AACvE,eAAO,KAAKC,KAAK,yBAAyBD,IAAAA;MAC9C;MAEAe,oBAAoBC,UAAkBtB,QAAwE;AAC1G,eAAO,KAAKC,IAAI,gBAAgBG,mBAAmBkB,QAAAA,CAAAA,eAAwBtB,MAAAA;MAC/E;MAEAuB,mBAAmBD,UAAkBE,aAA+C;AAChF,eAAO,KAAKvB,IAAI,gBAAgBG,mBAAmBkB,QAAAA,CAAAA,eAAwBlB,mBAAmBoB,WAAAA,CAAAA,EAAc;MAChH;MAEAC,kBAAkBH,UAAkBE,aAAqBlB,MAAuD;AAC5G,eAAO,KAAKC,KAAK,gBAAgBH,mBAAmBkB,QAAAA,CAAAA,eAAwBlB,mBAAmBoB,WAAAA,CAAAA,aAAyBlB,IAAAA;MAC5H;MAEAoB,gBAAgBC,UAAkB3B,QAA2D;AACzF,eAAO,KAAKC,IAAI,gBAAgBG,mBAAmBuB,QAAAA,CAAAA,+BAAwC3B,MAAAA;MAC/F;MAEA4B,QAAQ5B,QAA8C;AAClD,eAAO,KAAKC,IAAI,oCAAoCD,MAAAA;MACxD;MAEA6B,uBAA0C;AACtC,eAAO,KAAK5B,IAAI,6CAAA;MACpB;IACJ;;;;;ACnIA,IAsBa6B;AAtBb,IAAAC,gBAAA;;;IAAAC;AAsBO,IAAMF,mBAAN,cAA+BG,cAAAA;MAtBtC,OAsBsCA;;;MAClCC,KAAKC,QAA8D;AAC/D,eAAO,KAAKC,IAAI,gBAAgBD,MAAAA;MACpC;MAEAE,QAAQC,IAAgC;AACpC,eAAO,KAAKF,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC5D;MAEAE,OAAOC,MAA+C;AAClD,eAAO,KAAKC,KAAK,gBAAgBD,IAAAA;MACrC;MAEAE,OAAOL,IAAYG,MAAwD;AACvE,eAAO,KAAKG,MAAM,gBAAgBL,mBAAmBD,EAAAA,CAAAA,IAAOG,IAAAA;MAChE;MAEAI,OAAOP,IAA2B;AAC9B,eAAO,KAAKQ,IAAI,gBAAgBP,mBAAmBD,EAAAA,CAAAA,EAAK;MAC5D;MAEAS,YAAYT,IAAYH,QAAgE;AACpF,eAAO,KAAKC,IAAI,gBAAgBG,mBAAmBD,EAAAA,CAAAA,aAAgBH,MAAAA;MACvE;IACJ;;;;;AC9CA,IASaa;AATb;;;IAAAC;AASO,IAAMD,kBAAN,cAA8BE,cAAAA;MATrC,OASqCA;;;MACjCC,KAAKC,QAAoD;AACrD,eAAO,KAAKC,IAAI,kBAAkBD,MAAAA;MACtC;MAEAE,QAAQC,IAAsC;AAC1C,eAAO,KAAKF,IAAI,kBAAkBG,mBAAmBD,EAAAA,CAAAA,EAAK;MAC9D;IACJ;;;;;ACjBA,IAGaE;AAHb;;;IAAAC;AAGO,IAAMD,eAAN,cAA2BE,cAAAA;MAHlC,OAGkCA;;;MAC9BC,QAA+B;AAC3B,eAAO,KAAKC,IAAI,gBAAA;MACpB;MAEAC,QAA+B;AAC3B,eAAO,KAAKD,IAAI,gBAAA;MACpB;MAEAE,gBAAwC;AACpC,eAAO,KAAKF,IAAI,yBAAA;MACpB;MAEAG,YAAmC;AAC/B,eAAO,KAAKH,IAAI,oBAAA;MACpB;MAEAI,iBAAiBC,YAAoD;AACjE,eAAO,KAAKL,IAAI,sBAAsBM,mBAAmBD,UAAAA,CAAAA,SAAoB;MACjF;MAEAE,UAAiC;AAC7B,eAAO,KAAKP,IAAI,kBAAA;MACpB;MAEAQ,SAAyC;AACrC,eAAO,KAAKR,IAAI,iBAAA;MACpB;MAEAS,UAAmC;AAC/B,eAAO,KAAKT,IAAI,kBAAA;MACpB;IACJ;;;;;ACnCA;;;AAEA;AACA;AACA;AACA,IAAAU;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;;;;;ACvBA,IA2BaC;AA3Bb;;;;AACA;AA0BO,IAAMA,aAAN,MAAMA;MA3Bb,OA2BaA;;;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MACAC;MAEQC;MAEjB,YAAYC,UAA4B;AACpC,aAAKD,YAAY,IAAIE,mBAAmBD,QAAAA;AAExC,aAAKxB,OAAO,IAAI0B,cAAc,IAAI;AAClC,aAAKzB,eAAe,IAAI0B,sBAAsB,IAAI;AAClD,aAAKzB,YAAY,IAAI0B,mBAAmB,IAAI;AAC5C,aAAKzB,SAAS,IAAI0B,gBAAgB,IAAI;AACtC,aAAKzB,gBAAgB,IAAI0B,uBAAuB,IAAI;AACpD,aAAKzB,QAAQ,IAAI0B,eAAe,IAAI;AACpC,aAAKzB,QAAQ,IAAI0B,eAAe,IAAI;AACpC,aAAKzB,cAAc,IAAI0B,qBAAqB,IAAI;AAChD,aAAKzB,UAAU,IAAI0B,iBAAiB,IAAI;AACxC,aAAKzB,WAAW,IAAI0B,kBAAkB,IAAI;AAC1C,aAAKzB,UAAU,IAAI0B,iBAAiB,IAAI;AACxC,aAAKzB,UAAU,IAAI0B,iBAAiB,IAAI;AACxC,aAAKzB,WAAW,IAAI0B,kBAAkB,IAAI;AAC1C,aAAKzB,cAAc,IAAI0B,qBAAqB,IAAI;AAChD,aAAKzB,aAAa,IAAI0B,oBAAoB,IAAI;AAC9C,aAAKzB,YAAY,IAAI0B,mBAAmB,IAAI;AAC5C,aAAKzB,UAAU,IAAI0B,iBAAiB,IAAI;AACxC,aAAKzB,aAAa,IAAI0B,oBAAoB,IAAI;AAC9C,aAAKzB,QAAQ,IAAI0B,eAAe,IAAI;AACpC,aAAKzB,UAAU,IAAI0B,iBAAiB,IAAI;AACxC,aAAKzB,UAAU,IAAI0B,iBAAiB,IAAI;AACxC,aAAKzB,SAAS,IAAI0B,gBAAgB,IAAI;AACtC,aAAKzB,MAAM,IAAI0B,aAAa,IAAI;MACpC;MAEAC,QAAWC,QAAgBC,OAAcC,MAAgBC,OAA6C;AAClG,eAAO,KAAK9B,UAAU0B,QAAW;UAACC;UAAQC,MAAAA;UAAMC;UAAMC;QAAK,CAAA;MAC/D;IACJ;;;;;ACtFA,IAAAC,YAAA;;;;AACA,IAAAC;;;;;ACDA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;AACzB,OAAOC,SAAS;;;;;;;;;;IAOVC,aAGOC;;;;AATb,IAAAC;AAEA;AACA;AACA,IAAAC;;;AAEA,IAAMH,cAAc;AAGb,IAAMC,eAAN,MAAMA;aAAAA;;;;MAEQG,WAAW,oBAAIC,IAAAA;MACfC;MAEjB,YAA6BC,OAAqB;aAArBA,QAAAA;AACzB,YAAIC,IAAIC,SAAS;AACb,eAAKH,OAAO,IAAII,WAAW;YAACC,SAASH,IAAIC;UAAO,CAAA;QACpD;MACJ;MAEA,MAAMG,YAAYC,OAAeC,WAAW,MAAgC;AACxE,YAAIA,UAAU;AACV,gBAAMC,MAAM,MAAM,KAAKR,MAAMS,IAAcH,KAAAA;AAC3CI,yBAAOC,MAAM,cAAc,CAAC,CAACH,GAAAA,EAAK;AAClC,cAAIA,IAAK,QAAOA;QACpB;AAEA,cAAMI,WAAW,KAAKf,SAASY,IAAIH,KAAAA;AACnC,YAAIM,SAAU,QAAOA;AAErB,cAAMC,IAAI,KAAKC,aAAaR,KAAAA,EACvBS,KAAK,CAACC,gBAAgBA,cAAc,KAAKC,gBAAgBD,WAAAA,IAAe,CAAA,CAAE,EAC1ED,KAAK,OAAOG,UAAAA;AACT,cAAIA,OAAOC,OAAQ,OAAM,KAAKnB,MAAMoB,IAAId,OAAOY,OAAOzB,WAAAA;AACtD,iBAAOyB;QACX,CAAA,EACCG,QAAQ,MAAM,KAAKxB,SAASyB,OAAOhB,KAAAA,CAAAA;AAExC,aAAKT,SAASuB,IAAId,OAAOO,CAAAA;AACzB,eAAOA;MACX;MAEA,MAAMU,WAAWjB,OAAe;AAC5B,cAAM,KAAKN,MAAMwB,IAAIlB,KAAAA;AACrB,aAAKT,SAASyB,OAAOhB,KAAAA;MACzB;MAEAmB,YAAYnB,OAA2B;AACnC,eAAOd,IAAIkC,OAAOpB,OAAOL,IAAI0B,UAAUC,QAAQ;UAC3CC,YAAY;YAAC5B,IAAI0B,UAAUG;;UAC3BC,gBAAgB;QACpB,CAAA;MACJ;MAEA,MAAMjB,aAAakB,eAA+C;AAC9D,YAAI,CAAC,KAAKjC,MAAM;AACZW,yBAAOuB,MAAM,2CAAA;AACb,iBAAO;QACX;AAEA,YAAI;AACA,gBAAMC,OAAO,MAAM,KAAKnC,KAAKoC,KAAKC,eAAeJ,aAAAA;AAEjD,gBAAMhB,cAAekB,MAAkClB;AACvD,cAAI,CAACA,aAAa;AACdN,2BAAO2B,KAAK,4CAAA;AACZ,mBAAO;UACX;AAEA,iBAAOrB;QACX,SAASsB,GAAG;AACR,cAAIA,aAAaC,cAAc;AAC3B7B,2BAAO2B,KAAK,wBAAwB;cAACG,QAAQF,EAAEE;cAAQC,MAAMH,EAAEG;YAAI,CAAA;UACvE,OAAO;AACH/B,2BAAOuB,MAAM,uBAAuB;cAACS,MAAOJ,EAAYI;cAAMT,OAAQK,EAAYK;YAAO,CAAA;UAC7F;AACA,iBAAO;QACX;MACJ;MAEA,MAAc1B,gBAAgBD,aAA+C;AACzE,YAAI;AACA,gBAAMmB,OAAO,KAAKV,YAAYT,WAAAA;AAE9B,gBAAME,QAAQiB,MAAMS;AACpB,cAAI,CAACC,MAAMC,QAAQ5B,KAAAA,GAAQ;AACvBR,2BAAOC,MAAM,yEAAyE;cAClFoC,aAAa,CAAC,CAAC7B;cACf8B,cAAc,OAAO9B;YACzB,CAAA;AACA,mBAAO;UACX;AAEA,gBAAM+B,MAAMC,KAAKC,IAAI,GAAGhB,KAAKiB,MAAMF,KAAKG,MAAMC,KAAKC,IAAG,IAAK,GAAA,CAAA;AAC3D,gBAAM,KAAKvD,MAAMoB,IAAIJ,aAAaE,OAAO+B,GAAAA;AACzC,iBAAO/B;QACX,SAASoB,GAAG;AACR,gBAAMkB,MAAMlB;AACZ,gBAAMmB,OACFnB,aAAa9C,IAAIkE,oBAAoB,YACjCpB,aAAa9C,IAAImE,oBAAoB,YAAY;AACzDjD,yBAAO2B,KAAK,gDAAgD;YACxDoB;YACAG,KAAKJ,IAAIb;YACTkB,UAAU7C,YAAYG;UAC1B,CAAA;AACA,iBAAO;QACX;MACJ;IACJ;;;;;;;;;;;;AChHA,OAAO;AACP,OAAO2C,YAAY;AACnB,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAMnBC,cACAC,kBACAC,mBAUOC;;;;AAjBb,IAAAC;AACA;AAEA;;;AAEA,IAAMJ,eAAe;AACrB,IAAMC,mBAAmB;AACzB,IAAMC,oBAAoB;AAUnB,IAAMC,mBAAN,cAA+BE,YAAAA;aAAAA;;;;;MAClC,YACYC,aACAC,cACV;AACE,cAAK,GAAA,KAHGD,cAAAA,aAAAA,KACAC,eAAAA;MAGZ;MAEA,MAAMC,WAAWC,IAAYC,SAAgC;AACzD,cAAM,KAAKJ,YAAYE,WAAWC,EAAAA;AAClC,cAAM,KAAKF,aAAaI,IAAI,GAAGV,gBAAAA,GAAmBS,OAAAA,EAAS;AAC3D,cAAME,WAAW,MAAM,KAAKL,aAAaM,KAAK,QAAQH,OAAAA,IAAW;AACjE,mBAAWI,OAAOF,SAAU,OAAM,KAAKL,aAAaI,IAAIG,GAAAA;MAC5D;MAEA,MAAMC,SAASC,gBAAwBC,MAAsE;AACzG,cAAMC,WAAWlB,eAAeF,OAAOqB,YAAY,EAAA,EAAIC,SAAS,WAAA;AAChE,cAAMV,UAAUZ,OAAOuB,WAAW,QAAA,EAAUC,OAAOJ,QAAAA,EAAUK,OAAO,KAAA;AACpE,cAAMC,YAAYN,SAASO,MAAM,EAAC;AAElC,cAAMC,SAAS,MAAM,KAAKpB,YAAYqB,OAAO;UACzCC,iBAAiBZ;UACjBa,UAAUnB;UACVoB,YAAY9B;UACZ+B,YAAYP;UACZ,GAAGQ,YAAYf,IAAAA;QACnB,CAAA;AAEA,eAAO;UAACgB,OAAOf;UAAUQ;QAAM;MACnC;MAEA,MAAMQ,OAAOhB,UAA6C;AACtD,cAAMiB,UAAS,KAAKC,KAAK,KAAKF,MAAM;AACpC,cAAMxB,UAAUZ,OAAOuB,WAAW,QAAA,EAAUC,OAAOJ,QAAAA,EAAUK,OAAO,KAAA;AAEpE,cAAMc,SAAS,MAAM,KAAK9B,aAAa+B,IAAe,GAAGrC,gBAAAA,GAAmBS,OAAAA,EAAS;AACrF,YAAI2B,QAAQ;AACR,cAAIA,OAAOE,cAAc,IAAIC,KAAKH,OAAOE,UAAU,IAAI,oBAAIC,KAAAA,GAAQ;AAC/D,mBAAO;UACX;AACA,eAAKlC,YAAYmC,eAAeJ,OAAO5B,EAAE,EAAEiC,MAAMC,CAAAA,QAC7CR,QAAOS,MAAM,kCAAkCD,IAAIE,OAAO,EAAE,CAAA;AAEhE,iBAAOR;QACX;AAEA,cAAMX,SAAS,MAAM,KAAKpB,YAAYwC,UAAUpC,OAAAA;AAChD,YAAI,CAACgB,UAAU,CAACA,OAAOqB,QAAQ;AAC3B,iBAAO;QACX;AAEA,YAAIrB,OAAOa,cAAc,IAAIC,KAAKd,OAAOa,UAAU,IAAI,oBAAIC,KAAAA,GAAQ;AAC/D,iBAAO;QACX;AAEA,aAAKjC,aAAayC,IAAI,GAAG/C,gBAAAA,GAAmBS,OAAAA,IAAWgB,QAAQxB,iBAAAA,EAAmBwC,MAAMC,CAAAA,QACpFR,QAAOS,MAAM,mCAAmCD,IAAIE,OAAO,EAAE,CAAA;AAGjE,aAAKvC,YAAYmC,eAAef,OAAOjB,EAAE,EAAEiC,MAAMC,CAAAA,QAC7CR,QAAOS,MAAM,kCAAkCD,IAAIE,OAAO,EAAE,CAAA;AAGhE,eAAOnB;MACX;IACJ;;;;;;;;;;;;;ACrFA,OAAO;AACP,OAAOuB,aAAY;AAInB,SAAQC,cAAAA,oBAAiB;AAGzB,SAAQC,yBAAwB;;;;;;;;;;AAQhC,SAASC,UACLC,WACAC,gBACAC,cACAC,aACAC,QACAC,kBAAyB;AAEzB,SAAOC,YAAY;IACfL;IACAG;IACAJ;IACAG;IACAD;IACAG;EACJ,CAAA;AACJ;AAEO,SAASE,aAAaC,KAAmB;AAC5C,MAAIC,QAAQD,IAAIE,QAAQ,WAAA;AACxB,MAAI,CAACD,OAAO;AACR,UAAME,IAAIH,IAAIE,QAAQE;AACtB,QAAID,GAAGE,WAAW,SAAA,EAAYJ,SAAQE,EAAEG,MAAM,CAAA,EAAGC,KAAI;EACzD;AACA,SAAON;AACX;AAEO,SAASO,eAAeR,KAAmB;AAC9C,QAAM,EAACS,SAASC,cAAa,IAAIV,IAAIW;AACrC,SAAQX,IAAYS,WAAWC;AACnC;IAhCME,gBAmCOC;;;;AA/Cb,IAAAC;AAIA;AAGA;AACA,IAAAC;AACA;AACA;;;AAEA,IAAMH,iBAAiB;AAEdrB;AAkBOQ;AASAS;AAMT,IAAMK,cAAN,cAA0BG,YAAAA;aAAAA;;;;;;;;MAE7B,YACYC,cACAC,kBACAC,oBACAC,eACAC,OACV;AACE,cAAK,GAAA,KANGJ,eAAAA,cAAAA,KACAC,mBAAAA,kBAAAA,KACAC,qBAAAA,oBAAAA,KACAC,gBAAAA,eAAAA,KACAC,QAAAA;MAGZ;MAEA,MAAMC,sBAAsBC,UAAkBd,SAAkBe,UAAkC;AAC9F,cAAMC,YAAYrC,QAAOsC,WAAW,QAAA,EAAUC,OAAOJ,QAAAA,EAAUK,OAAO,KAAA;AACtE,cAAMC,WAAW,QAAQJ,SAAAA,IAAahB,WAAW,GAAA;AAEjD,cAAMqB,SAAS,MAAM,KAAKT,MAAMU,IAAUF,QAAAA;AAC1C,YAAIC,OAAQ,QAAOA;AAEnB,cAAME,YAAY,MAAM,KAAKd,iBAAiBe,OAAOV,QAAAA;AACrD,YAAI,CAACS,WAAW;AACZ,gBAAM,IAAI1C,kBAAkB,iBAAiB;YAAC4C,SAAS;UAAkD,CAAA;QAC7G;AAEA,YAAIC;AACJ,YAAIH,UAAUI,gBAAgB;AAC1BD,iBAAO,MAAM,KAAKE,gBAAgBL,WAAWvB,SAASe,QAAAA;QAC1D,WAAWQ,UAAUM,SAAS;AAC1BH,iBAAO,MAAM,KAAKI,iBAAiBP,WAAWvB,SAASe,QAAAA;QAC3D,OAAO;AACH,gBAAM,IAAIlC,kBAAkB,iBAAiB;YAAC4C,SAAS;UAA+C,CAAA;QAC1G;AAEA,aAAKb,MAAMmB,IAAIX,UAAUM,MAAMvB,cAAAA,EAAgB6B,MAAMC,CAAAA,QACjD,KAAKC,IAAIC,MAAM,gCAAgCF,IAAIR,OAAO,EAAE,CAAA;AAGhE,eAAOC;MACX;MAEA,MAAMU,gBAAgB5C,OAAeQ,SAAkBe,UAAmBsB,WAAoB,MAAqB;AAC/G,cAAMC,UAAS,KAAKC,KAAK,KAAKH,eAAe;AAC7C,cAAMI,WAAW,MAAM,KAAKhC,aAAaiC,YAAYjD,OAAO6C,QAAAA;AAC5D,YAAI,CAACG,UAAU;AACX,iBAAOE,QAAQC,OAAO,gDAAA;QAC1B;AAEA,YAAI3C,WAAW,CAACwC,SAASI,SAAS5C,OAAAA,GAAU;AACxC,iBAAO0C,QAAQC,OAAO,yCAAA;QAC1B;AAEA,cAAME,eAAe,KAAKrC,aAAasC,YAAYtD,KAAAA;AACnD,cAAM,EAACR,gBAAgB+D,KAAK5D,QAAQ6D,MAAK,IAAIH;AAE7C,YAAIzD,mBAAmB4D,SAAS,MAAM,KAAKrC,cAAcsC,iBAAiBjE,gBAAgBG,MAAAA;AAE1F,YAAI,CAACC,kBAAkB;AACnB,iBAAOsD,QAAQC,OAAO,wBAAA;QAC1B;AAEAL,QAAAA,QAAOY,KAAK,SAAS9D,gBAAAA,4BAA4C;AAEjE,cAAM+D,kBAAkB,MAAM,KAAKzC,mBAAmB0C,WAAWpE,gBAAgBwD,QAAAA;AAEjF,YAAItD;AACJ,YAAIc,SAAS;AACTd,wBAAciE,gBAAgBE,KAAKC,CAAAA,MAAKA,EAAEC,aAAavD,OAAAA;AACvD,cAAI,CAACd,aAAa;AACd,mBAAOwD,QAAQC,OAAO,eAAe3C,OAAAA,uBAA8B;UACvE;AACA,cAAIe,YAAY7B,YAAY6B,SAAUyC,KAAKC,YAAW,MAAO1C,SAAS0C,YAAW,GAAI;AACjF,mBAAOf,QAAQC,OAAO,eAAe3C,OAAAA,aAAoBd,YAAY6B,SAAUyC,IAAI,SAASzC,QAAAA,EAAU;UAC1G;QACJ;AAEA,YAAI2C,WAAWP;AACf,YAAIpC,UAAU;AACV2C,qBAAWP,gBAAgBQ,OAAOL,CAAAA,MAAKA,EAAEvC,SAAUyC,KAAKC,YAAW,MAAO1C,SAAS0C,YAAW,CAAA;AAC9F,cAAI,CAACC,SAASE,QAAQ;AAClB,mBAAOlB,QAAQC,OAAO,6CAA6C5B,QAAAA,GAAW;UAClF;QACJ;AAEA,YAAI,CAAC7B,eAAe,CAACwE,SAASE,QAAQ;AAClC,iBAAOlB,QAAQC,OAAO,2CAAA;QAC1B;AAEA,eAAO7D,UAAU,OAAOE,gBAAgB0E,UAAUxE,aAAaC,QAAQC,gBAAAA;MAC3E;MAEA,MAAMyE,sBAAsB7D,SAAiBe,UAAkC;AAC3E,cAAM7B,cAAc,MAAM,KAAKwB,mBAAmBoD,kBAAkB9D,OAAAA;AACpE,YAAI,CAACd,eAAeA,YAAY6E,iBAAiB,aAAa;AAC1D,gBAAM,IAAIlF,kBAAkB,wBAAwB;YAAC4C,SAAS;UAA2C,CAAA;QAC7G;AACA,YAAIV,YAAY7B,YAAY6B,SAAUyC,KAAKC,YAAW,MAAO1C,SAAS0C,YAAW,GAAI;AACjF,iBAAOf,QAAQC,OAAO,eAAe3C,OAAAA,aAAoBd,YAAY6B,SAAUyC,IAAI,SAASzC,QAAAA,EAAU;QAC1G;AACA,eAAOjC,UAAU,aAAaI,YAAY8E,iBAAiB;UAAC9E;WAAcA,WAAAA;MAC9E;MAEA,MAAM+E,sBAAsBjD,WAAkC;AAC1D,cAAMkD,OAAO,MAAM,KAAKtD,MAAMsD,KAAK,QAAQlD,SAAAA,IAAa;AACxD,mBAAWmD,OAAOD,KAAM,OAAM,KAAKtD,MAAMwD,IAAID,GAAAA;MACjD;MAEA,MAAME,oBAAoBrE,SAAgC;AACtD,cAAMkE,OAAO,MAAM,KAAKtD,MAAMsD,KAAK,UAAUlE,OAAAA,EAAS;AACtD,mBAAWmE,OAAOD,KAAM,OAAM,KAAKtD,MAAMwD,IAAID,GAAAA;MACjD;MAEA,MAAcvC,gBAAgBL,WAAsBvB,SAAkBe,UAAkC;AACpG,YAAI,CAACf,SAAS;AACV,iBAAO0C,QAAQC,OAAO,4DAAA;QAC1B;AAEA,cAAMzD,cAAc,MAAM,KAAKwB,mBAAmB4D,QAAQ/C,UAAUI,cAAc;AAClF,YAAI,CAACzC,aAAa;AACd,iBAAOwD,QAAQC,OAAO,wCAAA;QAC1B;AAEA,YAAIzD,YAAYqE,aAAavD,SAAS;AAClC,iBAAO0C,QAAQC,OAAO,2DAAA;QAC1B;AAEA,YAAI5B,YAAY7B,YAAY6B,SAAUyC,KAAKC,YAAW,MAAO1C,SAAS0C,YAAW,GAAI;AACjF,iBAAOf,QAAQC,OAAO,wBAAwBzD,YAAY6B,SAAUyC,IAAI,SAASzC,QAAAA,EAAU;QAC/F;AAEA,eAAOjC,UAAU,oBAAoByC,UAAUyC,iBAAiB;UAAC9E;WAAcA,WAAAA;MACnF;MAEA,MAAc4C,iBAAiBP,WAAsBvB,SAAkBe,UAAkC;AACrG,cAAMwD,QAAQhD,UAAUyC;AACxB,cAAM7E,SAASoC,UAAUM;AAEzB,YAAI7B,SAAS;AACT,gBAAMd,cAAc,MAAM,KAAKwB,mBAAmB8D,UAAUD,OAAOvE,OAAAA;AACnE,cAAI,CAACd,aAAa;AACd,mBAAOwD,QAAQC,OAAO,eAAe3C,OAAAA,aAAoB;UAC7D;AAEA,gBAAMyE,UAAU,MAAM,KAAK9D,cAAc+D,UAAUH,OAAOpF,QAAQD,YAAYyF,EAAE;AAChF,cAAI,CAACF,SAAS;AACV,mBAAO/B,QAAQC,OAAO,8CAAA;UAC1B;AAEA,cAAI5B,YAAY7B,YAAY6B,SAAUyC,KAAKC,YAAW,MAAO1C,SAAS0C,YAAW,GAAI;AACjF,mBAAOf,QAAQC,OAAO,eAAe3C,OAAAA,aAAoBd,YAAY6B,SAAUyC,IAAI,SAASzC,QAAAA,EAAU;UAC1G;AAEA,iBAAOjC,UAAU,aAAayF,OAAO;YAACrF;aAAcA,aAAaC,MAAAA;QACrE;AAEA,cAAMyF,gBAAgB,MAAM,KAAKjE,cAAckE,4BAA4B1F,QAAQoF,KAAAA;AACnF,cAAMO,UAAU,MAAM,KAAKpE,mBAAmBqE,YAAYR,KAAAA;AAC1D,YAAIS,aAAaF,QAAQnB,OAAOL,CAAAA,MAAKsB,cAAchC,SAASU,EAAEqB,EAAE,CAAA;AAEhE,YAAI5D,UAAU;AACViE,uBAAaA,WAAWrB,OAAOL,CAAAA,MAAKA,EAAEvC,SAAUyC,KAAKC,YAAW,MAAO1C,SAAS0C,YAAW,CAAA;AAC3F,cAAI,CAACuB,WAAWpB,QAAQ;AACpB,mBAAOlB,QAAQC,OAAO,6CAA6C5B,QAAAA,GAAW;UAClF;QACJ;AAEA,YAAI,CAACiE,WAAWpB,QAAQ;AACpB,iBAAOlB,QAAQC,OAAO,8CAAA;QAC1B;AAEA,eAAO7D,UAAU,aAAayF,OAAOS,YAAYC,QAAW9F,MAAAA;MAChE;IACJ;;;;;;;;;;;;;;;;AC5NA,SAAQ+F,cAAAA,oBAAiB;AACzB,SAAQC,wBAAuB;;;;;;;;;;IAKlBC;;;;AAJb,IAAAC;AACA,IAAAC;;;AAGO,IAAMF,gBAAN,cAA4BG,YAAAA;aAAAA;;;MACdC,YAAY;MACZC,YAAY;MACZC;MAEjB,cAAc;AACV,cAAK;AACL,cAAMC,MAAMC,IAAIC,SAASH;AACzB,YAAI,CAACC,KAAK;AACN,gBAAM,IAAIG,MAAM,mDAAA;QACpB;AAEA,aAAKJ,gBAAgBK,OAAOC,KAAKL,KAAK,QAAA;AAEtC,YAAI,KAAKD,cAAcO,WAAW,IAAI;AAClC,gBAAM,IAAIH,MAAM,wDAAA;QACpB;MACJ;MAEAI,QAAQC,gBAAwBC,sBAAsC;AAClE,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,OAAO;AAErC,YAAI;AACA,gBAAMK,KAAKR,OAAOC,KAAKI,sBAAsB,QAAA;AAC7C,gBAAMI,gBAAgBT,OAAOC,KAAKG,gBAAgB,QAAA;AAElD,cAAII,GAAGN,WAAW,IAAI;AAClB,kBAAM,IAAIH,MAAM,uCAAA;UACpB;AAEA,gBAAMW,UAAUD,cAAcE,SAAS,CAAC,KAAKjB,SAAS;AACtD,gBAAMkB,aAAaH,cAAcE,SAAS,GAAG,CAAC,KAAKjB,SAAS;AAE5D,gBAAMmB,WAAWzB,iBAAiB,KAAKK,WAAW,KAAKE,eAAea,EAAAA;AACtEK,mBAASC,WAAWJ,OAAAA;AAEpB,cAAIK,YAAYF,SAASG,OAAOJ,UAAAA;AAChCG,sBAAYf,OAAOiB,OAAO;YAACF;YAAWF,SAASK,MAAK;WAAG;AAEvD,iBAAOH,UAAUI,SAAS,MAAA;QAC9B,SAASC,OAAO;AACZd,UAAAA,QAAOc,MAAM,sBAAuBA,MAAgBC,OAAO,EAAE;AAC7D,gBAAM,IAAItB,MAAM,8BAAA;QACpB;MACJ;IACJ;;;;;;;;;;ACnDA,IAAAuB,aAAA;;;;AACA;AACA;AACA;AACA;;;;;ACJA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAsBZC;;;;AArBb,IAAAC;AAEA;AAEA;AACA,IAAAC;AACA;;;AAeO,IAAMF,yBAAN,cAAqCG,YAAAA;aAAAA;;;;;;MAChCC,oBAAoB,oBAAIC,IAAAA;MACxBC,iBAAiB,oBAAID,IAAAA;MAE7B,YACqBE,aACAC,eACAC,gBACnB;AACE,cAAK,GAAA,KAJYF,cAAAA,aAAAA,KACAC,gBAAAA,eAAAA,KACAC,iBAAAA;MAGrB;MAEAC,yBAAyBC,UAAkBC,QAAgC;AACvE,aAAKR,kBAAkBS,IAAIF,UAAUC,MAAAA;MACzC;MAEAE,oBAAoBH,UAAgD;AAChE,eAAO,KAAKP,kBAAkBW,IAAIJ,QAAAA;MACtC;MAEAK,0BAAyD;AACrD,eAAO,IAAIX,IAAI,KAAKD,iBAAiB;MACzC;MAEA,MAAMa,qBAAqBN,UAAkBO,SAA0C;AACnF,cAAMC,UAAS,KAAKC,KAAK,KAAKH,oBAAoB;AAClD,YAAII;AACJ,YAAI;AACAA,uBAAa,MAAM,KAAKd,YAAYe,WAAU;QAClD,SAASC,OAAO;AACZJ,UAAAA,QAAOI,MAAM,uCAAwCA,MAAgBC,OAAO,IAAI;YAACC,OAAQF,MAAgBE;UAAK,CAAA;AAC9G;QACJ;AAEA,mBAAWC,MAAML,YAAY;AACzB,cAAIK,GAAGC,cAAchB,SAAU;AAC/B,cAAI;AACA,kBAAM,KAAKiB,iBAAiBF,GAAGG,EAAE;AACjCV,YAAAA,QAAOW,KAAK,8BAA8BJ,GAAGK,IAAI,KAAKL,GAAGG,EAAE,GAAG;UAClE,SAASN,OAAO;AACZJ,YAAAA,QAAOI,MAAM,uCAAuCG,GAAGK,IAAI,KAAMR,MAAgBC,OAAO,IAAI;cACxFQ,aAAaN,GAAGG;cAChBlB,UAAUe,GAAGC;cACbF,OAAQF,MAAgBE;YAC5B,CAAA;UACJ;QACJ;MACJ;MAEA,MAAMG,iBAAiBI,aAAoC;AACvD,cAAMb,UAAS,KAAKC,KAAK,KAAKQ,gBAAgB;AAE9C,cAAMK,WAAW,KAAK3B,eAAeS,IAAIiB,WAAAA;AACzC,YAAIC,UAAU;AACV,cAAI;AACA,kBAAMA,SAASC,SAASC,WAAU;UACtC,SAASC,GAAG;AACRjB,YAAAA,QAAOkB,KAAK,oCAAoCL,WAAAA,KAAiBI,EAAYZ,OAAO,EAAE;UAC1F;AACA,eAAKlB,eAAegC,OAAON,WAAAA;QAC/B;AAEA,cAAMO,YAAY,MAAM,KAAKhC,YAAYiC,QAAQR,WAAAA;AACjD,YAAI,CAACO,aAAa,CAACA,UAAUE,QAAS;AAEtC,YAAI7B,SAAS,KAAKR,kBAAkBW,IAAIwB,UAAUZ,SAAS;AAC3D,YAAI,CAACf,QAAQ;AACT,gBAAM8B,SAAS,KAAKjC,eAAeM,IAAIwB,UAAUZ,SAAS;AAC1D,cAAIe,UAAUA,OAAOC,SAASC,WAAWC,WAAW;AAChDjC,qBAAS8B;AACT,iBAAKtC,kBAAkBS,IAAI0B,UAAUZ,WAAWf,MAAAA;UACpD;QACJ;AACA,YAAI,CAACA,QAAQ;AACT,gBAAM,IAAIkC,MAAM,4CAA4CP,UAAUZ,SAAS,EAAE;QACrF;AAEA,cAAMoB,SAAS,KAAKC,2BAA2BT,WAAW3B,MAAAA;AAC1D,cAAMsB,WAAW,MAAMtB,OAAOqC,eAAeF,MAAAA;AAC7C,cAAMb,SAASgB,QAAO;AAEtB,aAAK5C,eAAeO,IAAImB,aAAa;UAACO;UAAWL;QAAQ,CAAA;MAC7D;MAEA,MAAMiB,WAAWnB,aAAoC;AACjD,cAAMC,WAAW,KAAK3B,eAAeS,IAAIiB,WAAAA;AACzC,YAAIC,UAAU;AACV,gBAAMA,SAASC,SAASC,WAAU;AAClC,eAAK7B,eAAegC,OAAON,WAAAA;QAC/B;MACJ;MAEA,MAAMoB,YAAYpB,aAA6C;AAC3D,cAAMC,WAAW,KAAK3B,eAAeS,IAAIiB,WAAAA;AACzC,YAAIC,SAAU,QAAOA;AAErB,cAAM,KAAKL,iBAAiBI,WAAAA;AAE5B,cAAMqB,OAAO,KAAK/C,eAAeS,IAAIiB,WAAAA;AACrC,YAAI,CAACqB,KAAM,OAAM,IAAIP,MAAM,aAAad,WAAAA,iCAA4C;AACpF,eAAOqB;MACX;MAEAC,YAAYtB,aAAgD;AACxD,eAAO,KAAK1B,eAAeS,IAAIiB,WAAAA;MACnC;MAEA,MAAMuB,oBAA8C;AAChD,cAAMd,UAAU,MAAM,KAAKlC,YAAYe,WAAU;AACjD,mBAAWI,MAAMe,SAAS;AACtB,cAAI,CAAC,KAAKnC,eAAekD,IAAI9B,GAAGG,EAAE,GAAG;AACjC,gBAAI;AACA,oBAAM,KAAKuB,YAAY1B,GAAGG,EAAE;YAChC,SAASN,OAAO;AACZ,oBAAMkC,MAAM,KAAKrC,KAAK,KAAKmC,iBAAiB;AAC5CE,kBAAIpB,KAAK,4BAA4BX,GAAGG,EAAE,YAAYH,GAAGC,SAAS,MAAOJ,MAAgBC,OAAO,EAAE;YACtG;UACJ;QACJ;AACA,eAAOkC,MAAMC,KAAK,KAAKrD,eAAesD,OAAM,CAAA;MAChD;MAEA,MAAMC,iBAAgC;AAClC,mBAAW,CAAChC,EAAAA,KAAO,KAAKvB,gBAAgB;AACpC,gBAAM,KAAK6C,WAAWtB,EAAAA;QAC1B;MACJ;MAEQmB,2BACJT,WACA3B,QACmB;AACnB,cAAMmC,SAAS;UAAC,GAAGR,UAAUuB;QAAiB;AAC9C,YAAI,CAACvB,UAAUwB,mBAAmB,CAACxB,UAAUyB,sBAAuB,QAAOjB;AAE3E,cAAMkB,YAAYrD,OAAOsD,YAAS,GAAMC,YAAYC,YAAY,CAAA;AAChE,YAAI,CAACH,UAAW,QAAOlB;AAEvB,cAAMsB,YAAY,KAAK7D,cAAc8D,QACjC/B,UAAUwB,iBACVxB,UAAUyB,qBAAqB;AAEnC,eAAOO,UAAUxB,QAAQkB,WAAWI,SAAAA;MACxC;IACJ;;;;;;;;;;;;;;ACvKA,OAAO;AACP,SAAQG,cAAAA,oBAAiB;;;;;;;;;;IAwBZC;;;;AAvBb,IAAAC;AACA;AAOA;;;AAeO,IAAMD,uBAAN,cAAmCE,YAAAA;aAAAA;;;;;;MACtC,YACYC,SACAC,cACAC,YACV;AACE,cAAK,GAAA,KAJGF,UAAAA,SAAAA,KACAC,eAAAA,cAAAA,KACAC,aAAAA;MAGZ;MAEA,MAAMC,QAAQC,QAAeC,SAAqD;AAC9E,cAAMC,OAAOC,mBAAmBH,MAAAA;AAChC,cAAMI,aAAaF,KAAKE;AAExB,cAAMC,YAAY,8BAAyB;UACvCC,QAAQ;UACRC,QAAQ;UACRC,YAAY;UACZC,iBAAiBL;UACjBM,cAAc,CAAA;QAClB,IANkB;AAQlB,YAAI,CAACN,cAAcA,WAAWO,SAAS,EAAG,QAAON,UAAAA;AAGjD,YAAIJ,SAASW,YAAY;AACrB,gBAAMC,WAAW,MAAM,KAAKf,WAAWgB,UAAUV,YAAY;YACzDQ,YAAYX,QAAQW;YACpB,GAAGG,YAAY;cACXC,gBAAgBf,QAAQe;cACxBC,YAAYhB,QAAQgB;cACpBC,WAAWjB,QAAQiB;YACvB,CAAA;UACJ,CAAA;AACA,cAAIL,UAAU;AACV,mBAAO;cACHM,cAAcN,SAASO;cACvBC,aAAaR,SAASS;cACtBhB,QAAQ;cACRC,QAAQ;cACRC,YAAY;cACZC,iBAAiBL;cACjBM,cAAc;gBAACG,SAASO;;cACxBG,eAAe;gBAACC,YAAYX,SAASY;cAAE;YAC3C;UACJ;QACJ;AAGA,cAAMC,iBAAiB,MAAM,KAAK7B,aAAa8B,4BAA4BvB,UAAAA;AAC3E,YAAIsB,gBAAgB;AAChB,iBAAO;YACHP,cAAcO,eAAeD;YAC7BJ,aAAaK,eAAeJ;YAC5BhB,QAAQ;YACRC,QAAQ;YACRC,YAAY;YACZC,iBAAiBL;YACjBM,cAAc;cAACgB,eAAeD;;UAClC;QACJ;AAGA,cAAMG,cAAc,MAAM,KAAKC,eAAezB,YAAYH,OAAAA;AAC1D,YAAI2B,YAAa,QAAOA;AAGxB,cAAME,eAAeC,UAAU3B,UAAAA;AAC/B,YAAI0B,cAAc;AACd,gBAAME,iBAAiB,MAAM,KAAKH,eAAeC,cAAc7B,OAAAA;AAC/D,cAAI+B,gBAAgB;AAChB,kBAAMxB,aAAayB,KAAKC,IAAIF,eAAexB,YAAY,IAAA;AACvD,kBAAM2B,eAAe;cACjBL,cAAc;cACdM,OAAO;gBAACC,UAAUjC;gBAAYkC,UAAUR;cAAY;YACxD;AAEA,gBAAIE,eAAe1B,WAAW,aAAa;AACvC,qBAAO;gBACH,GAAG0B;gBACH1B,QAAQ;gBACRC,QAAQ;gBACRC;gBACAC,iBAAiBL;gBACjBmB,eAAe;kBAAC,GAAGS,eAAeT;kBAAe,GAAGY;gBAAY;cACpE;YACJ;AACA,mBAAO;cACH,GAAGH;cACH1B,QAAQ;cACRC,QAAQ;cACRC;cACAC,iBAAiBL;cACjBmB,eAAe;gBAAC,GAAGS,eAAeT;gBAAe,GAAGY;cAAY;YACpE;UACJ;AAGA,gBAAMI,oBAAoB,MAAM,KAAK1C,aAAa8B,4BAA4BG,YAAAA;AAC9E,cAAIS,mBAAmB;AACnB,mBAAO;cACHpB,cAAcoB,kBAAkBd;cAChCJ,aAAakB,kBAAkBjB;cAC/BhB,QAAQ;cACRC,QAAQ;cACRC,YAAY;cACZC,iBAAiBL;cACjBM,cAAc;gBAAC6B,kBAAkBd;;cACjCF,eAAe;gBAACO,cAAc;cAAI;YACtC;UACJ;QACJ;AAGA,cAAMU,iBAAiB,MAAM,KAAKC,kBAC9BC,sBAAsBtC,UAAAA,GAAaA,YAAY,qBAAqB,MAAMH,OAAAA;AAE9E,YAAIuC,eAAgB,QAAOA;AAG3B,cAAMG,cAAc,MAAM,KAAKF,kBAC3BG,kBAAkBxC,UAAAA,GAAaA,YAAY,yBAAyB,MAAMH,OAAAA;AAE9E,YAAI0C,YAAa,QAAOA;AAGxB,cAAME,gBAAgB,MAAM,KAAKJ,kBAC7BK,aAAa1C,UAAAA,GAAaA,YAAY,oBAAoB,KAAMH,OAAAA;AAEpE,YAAI4C,cAAe,QAAOA;AAG1B,cAAME,oBAAoB,oBAAIC,IAAAA;AAC9B,cAAMC,gBAA0D;UAC5D;YAAClB,UAAUa,kBAAkBxC,UAAAA,KAAe,EAAA;YAAK;;UACjD;YAACsC,sBAAsBE,kBAAkBxC,UAAAA,KAAe,EAAA;YAAK;;UAC7D;YAAC0C,aAAaJ,sBAAsBtC,UAAAA,KAAe,EAAA;YAAK;;UACxD;YAAC0C,aAAaf,UAAU3B,UAAAA,KAAe,EAAA;YAAK;;;AAEhD,mBAAW,CAACkC,UAAU/B,MAAAA,KAAW0C,eAAe;AAC5C,cAAI,CAACX,YAAYA,aAAalC,cAAc2C,kBAAkBG,IAAIZ,QAAAA,EAAW;AAC7ES,4BAAkBI,IAAIb,QAAAA;AACtB,gBAAMc,gBAAgB,MAAM,KAAKX,kBAC7BH,UAAUlC,YAAYG,QAAQ,MAAMN,OAAAA;AAExC,cAAImD,cAAe,QAAOA;QAC9B;AAGA,cAAMC,mBAAmB,MAAM,KAAKC,yBAAyBpD,MAAMD,OAAAA;AACnE,YAAIoD,iBAAkB,QAAOA;AAG7B,eAAOhD,UAAAA;MACX;MAEA,MAAcwB,eACVzB,YACAH,SACgC;AAEhC,YAAIA,SAASsD,gBAAgB;AACzB,gBAAMC,UAAS,MAAM,KAAKC,eACtBrD,YACAH,QAAQsD,gBACRG,QACA,yBACA,IAAA;AAEJ,cAAIF,QAAQ,QAAOA;QACvB;AAGA,YAAIvD,SAAS0D,eAAe;AACxB,gBAAMH,UAAS,MAAM,KAAKC,eACtBrD,YACAsD,QACAzD,QAAQ0D,eACR,wBACA,IAAA;AAEJ,cAAIH,QAAQ,QAAOA;QACvB;AAGA,cAAMA,SAAS,MAAM,KAAKC,eACtBrD,YACAsD,QACAA,QACA,eACA,IAAA;AAEJ,eAAOF;MACX;MAEA,MAAcC,eACVrD,YACAmD,gBACAI,eACApD,QACAC,YACgC;AAChC,cAAMoD,OAAO,MAAM,KAAKhE,QAAQiE,iBAAiBzD,YAAYmD,gBAAgBI,aAAAA;AAC7E,YAAIC,KAAKjD,WAAW,EAAG,QAAO;AAE9B,cAAMmD,YAAYF;AAElB,cAAMG,kBAAkB;aAAI,IAAIf,IAAIc,UAAUE,IAAIC,CAAAA,MAAKA,EAAE7C,aAAa,CAAA;;AAEtE,YAAI2C,gBAAgBpD,WAAW,GAAG;AAC9B,gBAAMuD,OAAOJ,UAAU,CAAA;AACvB,iBAAO;YACH3C,cAAc+C,KAAK9C;YACnBC,aAAa6C,KAAK5C;YAClBhB,QAAQ;YACRC;YACAC;YACAC,iBAAiBL;YACjBM,cAAc;cAACwD,KAAK9C;;YACpBG,eAAe;cAAC4C,SAASD,KAAKzC;YAAE;UACpC;QACJ;AAEA,cAAM2C,aAAaL,gBAAgBC,IAAIK,CAAAA,QAAAA;AACnC,gBAAMC,MAAMR,UAAUS,KAAKN,CAAAA,MAAKA,EAAE7C,kBAAkBiD,GAAAA;AACpD,iBAAO;YAAClD,cAAckD;YAAKhD,aAAaiD,IAAIhD;YAAckD,OAAOhE;UAAU;QAC/E,CAAA;AAEA,eAAO;UACHF,QAAQ;UACRC;UACAC;UACAC,iBAAiBL;UACjBM,cAAcqD;UACdU,aAAa,4CAA4CrE,UAAAA;UACzDmB,eAAe;YAACmD,qBAAqBN;UAAU;QACnD;MACJ;MAEA,MAAc3B,kBACVH,UACAD,UACA9B,QACAoE,eACA1E,SACgC;AAChC,YAAI,CAACqC,YAAYA,aAAaD,SAAU,QAAO;AAC/C,cAAMuC,UAAS,KAAKC,KAAK,KAAKpC,iBAAiB;AAE/C,cAAMb,cAAc,MAAM,KAAKC,eAAeS,UAAUrC,OAAAA;AACxD,YAAI2B,aAAa;AACb,gBAAMpB,aAAayB,KAAKC,IAAIN,YAAYpB,YAAYmE,aAAAA;AACpDC,UAAAA,QAAOE,MAAM,eAAevE,MAAAA,KAAW8B,QAAAA,WAAcC,QAAAA,EAAU;AAC/D,iBAAO;YACH,GAAGV;YACHtB,QAAQsB,YAAYtB,WAAW,cAAc,cAAc;YAC3DC;YACAC;YACAC,iBAAiB4B;YACjBd,eAAe;cAAC,GAAGK,YAAYL;cAAea,OAAO;gBAACC;gBAAUC;cAAQ;YAAC;UAC7E;QACJ;AAEA,cAAMZ,iBAAiB,MAAM,KAAK7B,aAAa8B,4BAA4BW,QAAAA;AAC3E,YAAIZ,gBAAgB;AAChBkD,UAAAA,QAAOE,MAAM,eAAevE,MAAAA,iBAAuB8B,QAAAA,WAAcC,QAAAA,EAAU;AAC3E,iBAAO;YACHnB,cAAcO,eAAeD;YAC7BJ,aAAaK,eAAeJ;YAC5BhB,QAAQ;YACRC;YACAC,YAAYmE;YACZlE,iBAAiB4B;YACjB3B,cAAc;cAACgB,eAAeD;;YAC9BF,eAAe;cAACa,OAAO;gBAACC;gBAAUC;cAAQ;YAAC;UAC/C;QACJ;AAEA,eAAO;MACX;MAEA,MAAcgB,yBACVpD,MACAD,SACgC;AAChC,cAAMsD,iBAAiBtD,SAASsD;AAChC,cAAMwB,iBAAiB7E,KAAK8E;AAC5B,YAAI,CAACzB,kBAAkB,CAACwB,eAAgB,QAAO;AAE/C,cAAME,aAAuB,CAAA;AAC7B,cAAMC,SAAgB,CAAA;AACtB,YAAIC,MAAM;AACV,YAAIC,cAAc;AAElB,YAAI7B,gBAAgB;AAChB0B,qBAAWI,KAAK,sBAAsBF,KAAAA,EAAO;AAC7CD,iBAAOG,KAAK9B,cAAAA;QAChB;AACA,YAAIwB,gBAAgB;AAChBE,qBAAWI,KAAK,kBAAkBF,GAAAA,8BAAiCA,GAAAA,GAAM;AACzED,iBAAOG,KAAK,IAAIN,cAAAA,GAAiB;AACjCI;AACAC,yBAAe;QACnB;AAEA,YAAIlF,KAAKoF,aAAa;AAClBL,qBAAWI,KAAK,cAAcF,KAAAA,EAAO;AACrCD,iBAAOG,KAAKnF,KAAKoF,WAAW;AAC5BF,yBAAe;QACnB;AACA,YAAIlF,KAAKqF,aAAa;AAClBN,qBAAWI,KAAK,oBAAoBF,KAAAA,EAAO;AAC3CD,iBAAOG,KAAKnF,KAAKqF,WAAW;AAC5BH,yBAAe;QACnB;AACA,YAAIlF,KAAKsF,UAAU;AACfP,qBAAWI,KAAK,iBAAiBF,KAAAA,EAAO;AACxCD,iBAAOG,KAAKnF,KAAKsF,QAAQ;AACzBJ,yBAAe;QACnB;AACA,YAAInF,SAASwF,QAAQvF,KAAKwF,UAAU;AAChCT,qBAAWI,KAAK,WAAWF,KAAAA,EAAO;AAClCD,iBAAOG,KAAKpF,SAASwF,QAAQvF,KAAKwF,QAAQ;AAC1CN,yBAAe;QACnB;AAEA,YAAIA,cAAc,EAAG,QAAO;AAE5B,cAAMO,OAAO,MAAM,KAAK9F,aAAa,IAAA,EAAM+F,YACvC;;qBAESX,WAAWY,KAAK,OAAA,CAAA;;uBAGzBX,MAAAA;AAGJ,YAAIS,KAAKhF,WAAW,EAAG,QAAO;AAE9B,cAAMmF,iBAAiB,OAAO7D,KAAKC,IAAIkD,cAAc,MAAM,IAAA;AAE3D,YAAIO,KAAKhF,WAAW,GAAG;AACnB,iBAAO;YACHQ,cAAcwE,KAAK,CAAA,EAAIlE;YACvBJ,aAAasE,KAAK,CAAA,EAAIrE;YACtBhB,QAAQ;YACRC,QAAQ;YACRC,YAAYsF;YACZrF,iBAAiBP,KAAKE;YACtBM,cAAc;cAACiF,KAAK,CAAA,EAAIlE;;YACxBF,eAAe;cACXa,OAAO;gBACH,GAAIlC,KAAK8E,aAAa;kBAACe,QAAQ7F,KAAK8E;gBAAU,IAAI,CAAC;gBACnD,GAAI9E,KAAKoF,cAAc;kBAACU,SAAS9F,KAAKoF;gBAAW,IAAI,CAAC;gBACtD,GAAIpF,KAAKqF,cAAc;kBAACU,SAAS/F,KAAKqF;gBAAW,IAAI,CAAC;gBACtD,GAAIrF,KAAKsF,WAAW;kBAACU,MAAMhG,KAAKsF;gBAAQ,IAAI,CAAC;cACjD;YACJ;UACJ;QACJ;AAGA,cAAMpB,aAAauB,KAAK3B,IAAImC,CAAAA,OAAM;UAC9BhF,cAAcgF,EAAE1E;UAChBJ,aAAa8E,EAAE7E;UACfkD,OAAOsB;QACX,EAAA;AAEA,eAAO;UACHxF,QAAQ;UACRC,QAAQ;UACRC,YAAYsF;UACZrF,iBAAiBP,KAAKE;UACtBM,cAAciF,KAAK3B,IAAImC,CAAAA,MAAKA,EAAE1E,EAAE;UAChCgD,aAAa,kEAAkEM,kBAAkBxB,cAAAA;UACjGhC,eAAe;YAACmD,qBAAqBN;UAAU;QACnD;MACJ;IACJ;;;;;;;;;;;;;;AClZA,SAAQgC,cAAAA,oBAAiB;;;;;;;;;;IA8BZC;;;;AA7Bb;AACA;AACA;AACA;AAUA;AACA;AACA,IAAAC;AAEA;AACA;AACA;AACA,IAAAC;AACA;AACA;;;AAOO,IAAMF,gBAAN,cAA4BG,kBAAAA;aAAAA;;;;;;;;;;;;;MAEdC,mBAAqD,oBAAIC,IAAAA;MACzDC,cAAoC,oBAAID,IAAAA;MAEzD,YACqBE,UACAC,UACAC,WACAC,SACAC,iBACAC,WACAC,QACAC,uBACAC,gBACAC,wBACjBC,OACF;AACE,cAAMA,OAAO;UAACC,QAAQ;UAAUC,KAAK;QAAG,CAAA,GAAA,KAZvBZ,WAAAA,UAAAA,KACAC,WAAAA,UAAAA,KACAC,YAAAA,WAAAA,KACAC,UAAAA,SAAAA,KACAC,kBAAAA,iBAAAA,KACAC,YAAAA,WAAAA,KACAC,SAAAA,QAAAA,KACAC,wBAAAA,uBAAAA,KACAC,iBAAAA,gBAAAA,KACAC,yBAAAA;MAIrB;;;;;MAMA,MAAMI,uBAAuBC,YAAmC;AAC5D,cAAMC,MAAM,KAAKC,KAAK,KAAKH,sBAAsB;AACjDE,YAAIE,KAAK,+BAAA;AAGT,cAAMC,aAAa,MAAM,KAAKb,UAAUc,sBAAsBC,WAAWC,QAAQ;AACjFN,YAAIE,KAAK,cAAcC,WAAWI,MAAM,mBAAmB;AAG3D,cAAMC,SAAS,MAAM,KAAKjB,OAAOkB,YAAYN,UAAAA;AAC7CH,YAAIE,KAAK,UAAUM,OAAOD,MAAM,mBAAmB;AAGnD,mBAAW,EAACG,QAAQC,cAAa,KAAKH,QAAQ;AAG1C,gBAAM,KAAKI,eACPb,YACAW,QACA,OACAC,cAAcE,WAAW;AAI7B,gBAAMC,gBAA+B;YACjCC,QAAQA;YACRC,QAAQ,CAAC;YACTC,KAAKC,QAAQD;UACjB;AAGA,gBAAMP,OAAOS,WAAWL,aAAAA;AAExB,cAAIJ,OAAOU,SAAQ,MAAOC,YAAYC,OAAO;AACzCtB,gBAAIE,KAAK,+BAA+BQ,OAAOa,SAASC,IAAI,IAAIb,cAAcc,OAAO,EAAE;UAC3F,OAAO;AACHzB,gBAAI0B,KAAK,UAAUhB,OAAOa,SAASC,IAAI,sBAAsBd,OAAOU,SAAQ,CAAA,EAAI;UACpF;QACJ;AAGA,cAAMO,uBAAuB,MAAM,KAAKrC,UAAUc,sBAAsBC,WAAWuB,SAAS;AAC5F,YAAID,qBAAqBpB,SAAS,GAAG;AACjCP,cAAIE,KAAK,cAAcyB,qBAAqBpB,MAAM,oBAAoB;AACtE,gBAAMsB,mBAAmB,MAAM,KAAKtC,OAAOkB,YAAYkB,oBAAAA;AAEvD,qBAAW,EAACjB,QAAQC,cAAa,KAAKkB,kBAAkB;AACpD,kBAAM,KAAKjB,eAAeb,YAAYW,QAAQ,OAAOC,cAAcE,WAAW;AAE9E,kBAAMC,gBAA+B;cACjCC,QAAQA;cACRC,QAAQ,CAAC;cACTC,KAAKC,QAAQD;YACjB;AACA,kBAAMP,OAAOS,WAAWL,aAAAA;AAExB,gBAAIJ,OAAOU,SAAQ,MAAOC,YAAYC,OAAO;AACzCtB,kBAAIE,KAAK,gCAAgCQ,OAAOa,SAASC,IAAI,IAAIb,cAAcc,OAAO,EAAE;YAC5F;UACJ;QACJ;AAEA,cAAMK,gBAAgBC,MAAMC,KAAK,KAAKhD,YAAYiD,KAAI,CAAA;AACtD,cAAMC,UAAU,MAAM,KAAKhD,SAASiD,YAAYpC,YAAY+B,aAAAA;AAC5D,YAAII,UAAU,GAAG;AACblC,cAAIE,KAAK,WAAWgC,OAAAA,gCAAuCnC,UAAAA,EAAY;QAC3E;AAEAC,YAAIE,KAAK,wCAAA;MACb;MAEA,MAAMkC,wBAAwBrC,YAAmC;AAC7D,cAAMC,MAAM,KAAKC,KAAK,KAAKmC,uBAAuB;AAClD,YAAIC,aAAa;AAEjB,mBAAW,CAACC,UAAU5B,MAAAA,KAAW,KAAKjB,eAAe8C,UAAS,GAAI;AAC9D,cAAI;AACA,kBAAMC,YAAY,MAAM,KAAKvD,SAASwD,QAAQH,QAAAA;AAC9C,gBAAI,CAACE,UAAW;AAEhB,kBAAM,KAAKtD,SAAS0B,eAAeb,YAAYuC,QAAAA;AAC/C,iBAAKtD,YAAY0D,IAAIJ,UAAU5B,MAAAA;AAE/B,gBAAI,CAAC8B,UAAUG,UAAUjC,OAAOkC,WAAW;AACvC,oBAAMD,SAASjC,OAAOkC,UAAS;AAC/B,kBAAID,QAAQ;AACR,sBAAM,KAAK1D,SAAS4D,aAAaP,UAAUK,MAAAA;AAC3CH,0BAAUG,SAASA;cACvB;YACJ;AAEA,kBAAMG,SAASN,UAAUM,OAAOC,YAAW;AAC3C,gBAAI,CAAC,KAAKjE,iBAAiBkE,IAAIF,MAAAA,GAAS;AACpC,mBAAKhE,iBAAiB4D,IAAII,QAAQ,oBAAI/D,IAAAA,CAAAA;YAC1C;AACA,iBAAKD,iBAAiBmE,IAAIH,MAAAA,EAASJ,IAAIF,UAAUf,SAASe,SAAAA;AAE1D,kBAAMU,aAAaxC,OAAOyC,MAAMJ,YAAAA,KAAiBP,UAAUW;AAC3D,kBAAMC,MAAM,GAAGN,MAAAA,IAAUN,UAAUf,OAAO;AAC1C,oBAAQyB,YAAAA;cACJ,KAAK7C,WAAWC,UAAU;AACtB,sBAAM+C,iBAAiB3C;AACvB,sBAAM4C,SAASD,eAAeE,UAAS;AACvC,sBAAM,KAAK/D,sBAAsBgE,kBAAkBlB,UAAUgB,MAAAA;AAC7D,sBAAMG,gBAAgB,MAAM,KAAKC,uBAAuBL,gBAAgBP,QAAQR,QAAAA;AAChFtC,oBAAIE,KAAK,GAAGkD,GAAAA,KAAQE,OAAO/C,MAAM,cAAckD,aAAAA,EAAe;AAC9D;cACJ;cACA,KAAKpD,WAAWuB,WAAW;AACvB,sBAAM+B,kBAAkBjD;AACxB,qBAAKhB,uBAAuBkE,yBAAyBtB,UAAUqB,eAAAA;AAC/D,sBAAM,KAAKjE,uBAAuBmE,qBAAqBvB,UAAUqB,eAAAA;AACjE3D,oBAAIE,KAAK,GAAGkD,GAAAA,wBAA2B;AACvC;cACJ;YACJ;AACAf;UACJ,SAASyB,OAAO;AACZ9D,gBAAI8D,MAAM,6BAA6BxB,QAAAA,KAAcwB,MAAgBC,OAAO,EAAE;UAClF;QACJ;AAEA/D,YAAIE,KAAK,cAAcmC,UAAAA,YAAsB;MACjD;MAEA,MAAMzB,eAAeb,YAAoBW,QAAiBsD,YAAqB,OAAOnD,aAAqC;AACvH,cAAME,UAAS,KAAKd,KAAK,KAAKW,cAAc;AAC5C,cAAMqD,UAAUpD,eAAeH,OAAOa,SAASC;AAC/CT,QAAAA,QAAOb,KAAK,uBAAuB+D,OAAAA,iBAAwBlE,UAAAA,EAAY;AACvE,YAAI,CAACW,OAAOoC,QAAQ;AAChB,gBAAM,IAAIoB,MAAM,UAAUD,OAAAA,wBAA+B;QAC7D;AACA,cAAMnB,SAASpC,OAAOoC,OAAOC,YAAW;AACxC,cAAMoB,gBAAgBzD,OAAOe;AAE7B,cAAMe,YAAY,MAAM,KAAKvD,SAASmF,OAAOtB,QAAQmB,SAASE,eAAezD,OAAOyC,IAAI;AACxF,YAAI,CAACX,UAAW,OAAM,IAAI0B,MAAM,4BAA4BD,OAAAA,IAAWE,aAAAA,EAAe;AAEtF,cAAM,KAAKjF,SAAS0B,eAAeb,YAAYyC,UAAU6B,EAAE;AAE3D,aAAKrF,YAAY0D,IAAIF,UAAU6B,IAAI3D,MAAAA;AACnC,YAAI,CAAC,KAAK5B,iBAAiBkE,IAAIF,MAAAA,GAAS;AACpC,eAAKhE,iBAAiB4D,IAAII,QAAQ,oBAAI/D,IAAAA,CAAAA;QAC1C;AACA,aAAKD,iBAAiBmE,IAAIH,MAAAA,EAASJ,IAAIyB,eAAe3B,SAAAA;AAEtD,gBAAQ9B,OAAOyC,MAAI;UACf,KAAK9C,WAAWC,UAAU;AACtB,kBAAM+C,iBAAiB3C;AACvB,kBAAM4C,SAASD,eAAeE,UAAS;AACvC,kBAAM,KAAK/D,sBAAsBgE,kBAAkBhB,UAAU6B,IAAIf,MAAAA;AACjE,kBAAM,KAAKI,uBAAuBL,gBAAgBP,QAAQN,UAAU6B,EAAE;AACtE;UACJ;UACA,KAAKhE,WAAWuB,WAAW;AACvB,kBAAM+B,kBAAkBjD;AACxB,iBAAKhB,uBAAuBkE,yBAAyBpB,UAAU6B,IAAIV,eAAAA;AACnE,kBAAM,KAAKjE,uBAAuBmE,qBAAqBrB,UAAU6B,IAAIV,eAAAA;AACrE;UACJ;UACA;AACI,kBAAM,IAAIO,MAAM,2BAA2BxD,OAAOyC,IAAI,EAAE;QAChE;MAEJ;MAEA,MAAMmB,kBACFvE,YACAW,QACA4B,UACAQ,QACa;AACb,cAAM9C,MAAM,KAAKC,KAAK,KAAKqE,iBAAiB;AAC5C,cAAMC,YAAYzB,OAAOC,YAAW;AAEpC,cAAMP,YAAY,MAAM,KAAKvD,SAASwD,QAAQH,QAAAA;AAC9C,YAAI,CAACE,WAAW;AACZ,gBAAM,IAAI0B,MAAM,UAAU5B,QAAAA,8DAAsE;QACpG;AAEA,cAAM,KAAKpD,SAAS0B,eAAeb,YAAYuC,QAAAA;AAE/C,aAAKtD,YAAY0D,IAAIJ,UAAU5B,MAAAA;AAC/B,YAAI,CAAC,KAAK5B,iBAAiBkE,IAAIuB,SAAAA,GAAY;AACvC,eAAKzF,iBAAiB4D,IAAI6B,WAAW,oBAAIxF,IAAAA,CAAAA;QAC7C;AACA,aAAKD,iBAAiBmE,IAAIsB,SAAAA,EAAY7B,IAAIF,UAAUf,SAASe,SAAAA;AAE7D,gBAAQ9B,OAAOyC,MAAI;UACf,KAAK9C,WAAWC,UAAU;AACtB,kBAAM,KAAKd,sBAAsBgF,oBAAoBlC,QAAAA;AACrD;UACJ;UACA,KAAKjC,WAAWuB,WAAW;AACvB,kBAAM+B,kBAAkBjD;AACxB,iBAAKhB,uBAAuBkE,yBAAyBtB,UAAUqB,eAAAA;AAC/D,kBAAM,KAAKjE,uBAAuBmE,qBAAqBvB,UAAUqB,eAAAA;AACjE;UACJ;QACJ;AAEA3D,YAAIE,KAAK,0BAA0BQ,OAAOc,IAAI,KAAKc,QAAAA,GAAW;MAClE;MAEA,MAAMmC,0BAA0B1E,YAAoBuC,UAAiC;AACjF,cAAM,KAAKpD,SAAS0B,eAAeb,YAAYuC,QAAAA;MACnD;MAEA,MAAMoC,aAAapC,UAAiC;AAChD,cAAMvB,UAAS,KAAKd,KAAK,KAAKyE,YAAY;AAE1C,cAAMC,OAAO,KAAK3F,YAAYiE,IAAIX,QAAAA;AAClC,YAAIqC,MAAM;AACN,cAAI;AACA,kBAAMA,KAAKC,QAAO;UACtB,SAASC,GAAG;AACR9D,YAAAA,QAAOW,KAAK,2BAA2BY,QAAAA,KAAcuC,EAAYd,OAAO,EAAE;UAC9E;AACA,eAAK/E,YAAY8F,OAAOxC,QAAAA;QAC5B;AAEA,mBAAW,CAAA,EAAGyC,QAAAA,KAAa,KAAKjG,kBAAkB;AAC9C,qBAAW,CAAC2C,SAASf,MAAAA,KAAWqE,UAAU;AACtC,gBAAIrE,OAAO2D,OAAO/B,UAAU;AACxByC,uBAASD,OAAOrD,OAAAA;AAChB;YACJ;UACJ;QACJ;AAEA,cAAM,KAAKxC,SAAS+F,WAAW1C,QAAAA;AAC/BvB,QAAAA,QAAOb,KAAK,kBAAkBoC,QAAAA,EAAU;MAC5C;MAEA,MAAM2C,iBAAiBnC,QAAgBrB,SAAiC;AACpE,cAAM8C,YAAYzB,OAAOC,YAAW;AAEpC,YAAI,CAACtB,SAAS;AACV,eAAK3C,iBAAiBgG,OAAOP,SAAAA;QACjC,OAAO;AACH,gBAAMQ,WAAW,KAAKjG,iBAAiBmE,IAAIsB,SAAAA;AAC3C,cAAIQ,UAAU;AACVA,qBAASD,OAAOrD,OAAAA;AAChB,gBAAIsD,SAASG,SAAS,GAAG;AACrB,mBAAKpG,iBAAiBgG,OAAOP,SAAAA;YACjC;UACJ;QACJ;MACJ;MAEA,MAAMY,WAAWC,QAAyD;AACtE,cAAMC,SAAmB,CAAA;AACzB,mBAAWC,cAAc,KAAKxG,iBAAiByG,OAAM,GAAI;AACrD,qBAAW7E,UAAU4E,WAAWC,OAAM,GAAI;AACtC,gBAAI,CAACH,UAAUA,OAAO1E,MAAAA,GAAS;AAC3B2E,qBAAOG,KAAK9E,MAAAA;YAChB;UACJ;QACJ;AACA,eAAO2E;MACX;MAEA,MAAMI,SAASL,QAA0D;AACrE,cAAMC,SAAoB,CAAA;AAC1B,mBAAWC,cAAc,KAAKxG,iBAAiByG,OAAM,GAAI;AACrD,qBAAW7E,UAAU4E,WAAWC,OAAM,GAAI;AACtC,gBAAI,CAACH,UAAUA,OAAO1E,MAAAA,GAAS;AAC3B,oBAAMiE,OAAO,KAAK3F,YAAYiE,IAAIvC,OAAO2D,EAAE;AAC3C,kBAAIM,KAAMU,QAAOG,KAAKb,IAAAA;YAC1B;UACJ;QACJ;AACA,eAAOU;MACX;MAEA,MAAMK,YAAYrB,IAAqC;AACnD,eAAO,KAAKrF,YAAYiE,IAAIoB,EAAAA,KAAO;MACvC;MAEA,MAAMsB,gBAAgB7C,QAAgBrB,SAA2C;AAC7E,cAAM8C,YAAYzB,OAAOC,YAAW;AACpC,cAAM6C,QAAQ,MAAM,KAAKH,SAASI,CAAAA,MAC9BA,EAAE/C,WAAWyB,cAAc9C,UAAUoE,EAAEpE,YAAYA,UAAU,KAAG;AACpE,eAAOmE,MAAMrF,SAAS,IAAIqF,MAAM,CAAA,IAAK;MACzC;MAEA,MAAclC,uBAAuBhD,QAAyBoC,QAAgBR,UAAmC;AAC7G,cAAMwD,SAASpF,OAAOqF,mBAAgB;AACtC,cAAMC,gBAAgB,CAACF,SAASpF,OAAOuF,oBAAiB,IAAOC;AAC/D,YAAI,CAACJ,UAAU,CAACE,cAAe,QAAO;AAEtC,cAAMG,WACFL,UAAU,oBAAI/G,IAAI;UAAC;YAACiH,cAAevE;YAASuE;;SAAgB;AAEhE,cAAMI,SAASrE,MAAMC,KAAKmE,SAASZ,OAAM,CAAA,EAAIc,KACzC,CAACC,GAAGC,MAAMA,EAAEC,eAAeC,cAAcH,EAAEE,cAAc,CAAA;AAE7D,cAAME,cAAcN,OAAO,CAAA;AAE3B,cAAMrF,UAAS,KAAKd,KAAK,KAAKyD,sBAAsB;AACpD,cAAMiD,OAAO,MAAM,KAAKxH,UAAUyH,WAC9B9D,QACA4D,YAAYlF,MACZ,UACA,MACA,IAAA;AAEJ,YAAI,CAACmF,MAAM;AACP5F,UAAAA,QAAOW,KAAK,6CAA6CoB,MAAAA,EAAQ;AACjE,iBAAO;QACX;AAEA,cAAM,KAAK7D,SAAS4H,sBAAsBvE,UAAUqE,KAAKtC,EAAE;AAE3D,YAAIyC,cAAc;AAClB,mBAAWC,eAAeZ,SAASZ,OAAM,GAAI;AACzC,gBAAMyB,QAAQ,MAAM,KAAK7H,UAAU8H,YAC/BN,KAAKtC,IACL0C,YAAYvF,MACZuF,YAAYtF,SACZsF,YAAYP,gBACZO,YAAYG,YAAY;AAE5B,cAAI,CAACF,OAAO;AACRjG,YAAAA,QAAOW,KAAK,kCAAkCqF,YAAYtF,OAAO,QAAQqB,MAAAA,EAAQ;AACjF;UACJ;AAEA,qBAAWqE,SAASJ,YAAYK,QAAQ;AACpC,kBAAM,KAAKjI,UAAUkI,iBAAiBL,MAAM3C,IAAI8C,MAAMG,YAAYC,YAAY;cAC1EC,YAAYL,MAAMK;cAClBC,aAAaN,MAAMM;cACnBC,iBAAiBP,MAAMO;cACvBC,kBAAkBR,MAAMQ;cACxBC,kBAAkBT,MAAMS;cACxBC,mBAAmBV,MAAMU;cACzBC,mBAAmBX,MAAMW;cACzBC,qBAAqBZ,MAAMY;cAC3BC,sBAAsBb,MAAMa;cAC5BC,aAAad,MAAMc;YACvB,CAAA,CAAA;UAYJ;AAGA,cAAIlB,gBAAgBL,aAAa;AAC7B,kBAAMwB,oBAAoBnB,YAAYK,OAAOe,IAAIC,CAAAA,MAAKA,EAAEd,UAAU;AAClE,kBAAM,KAAKnI,UAAUkJ,kBAAkBrB,MAAM3C,IAAI6D,iBAAAA;UACrD;AAEApB,yBAAeC,YAAYK,OAAO7G;QACtC;AAEA,cAAM+H,aAAa,MAAM,KAAKC,6BAA6B7H,QAAQoC,MAAAA;AACnE,eAAO,GAAGqD,SAASjB,IAAI,cAAc4B,WAAAA,YAAuBwB,UAAAA;MAChE;MAEA,MAAcC,6BACV7H,QACAoC,QACe;AACf,cAAM0F,WAAW9H,OAAO+H,qBAAkB;AAC1C,YAAI,CAACD,YAAYA,SAASjI,WAAW,EAAG,QAAO;AAE/C,cAAMQ,UAAS,KAAKd,KAAK,KAAKsI,4BAA4B;AAC1D,cAAMG,iBAAiB5F,OAAO6F,YAAW;AACzC,YAAIC,UAAU;AACd,YAAIC,YAAY;AAEhB,mBAAWC,OAAON,UAAU;AACxB,cAAIM,IAAIC,iBAAiB,IAAIC,KAAKF,IAAIC,aAAa,IAAI,oBAAIC,KAAAA,EAAQ;AAEnE,cAAI;AACA,kBAAM3D,SAAS,MAAM,KAAKhG,gBAAgB4J,QAAQH,IAAII,UAAU;cAC5DR;cACAS,YAAY;YAChB,CAAA;AAEA,gBAAI9D,OAAO+D,WAAW,WAAW/D,OAAO+D,WAAW,eAAe/D,OAAO+D,WAAW,UAAU;AAC1FR;AACA,kBAAIvD,OAAOgE,cAAc;AACrB,sBAAM,KAAKC,oBAAoBjE,OAAOgE,cAAcP,IAAII,UAAU7D,OAAOkE,iBAAiBb,cAAAA;cAC9F;YACJ,OAAO;AACHG;YACJ;UACJ,SAASW,KAAK;AACVzI,YAAAA,QAAOW,KAAK,+BAA+BoH,IAAII,QAAQ,KAAKM,eAAetF,QAAQsF,IAAIzF,UAAU0F,OAAOD,GAAAA,CAAAA,EAAM;UAClH;QACJ;AAEA,eAAO,QAAQZ,OAAAA,IAAWA,UAAUC,SAAAA;MACxC;MAEA,MAAcS,oBACVD,cACAK,YACAC,YACAjB,gBACa;AACb,cAAMkB,YAAY;UACdC,eAAeR;UACfS,iBAAiBpB;UACjBqB,QAAQ;UACRC,YAAYtB;UACZuB,QAAQ;QACZ;AAEA,cAAM,KAAK7K,QAAQgF,OAAO;UACtB,GAAGwF;UACHM,OAAOR;UACPS,kBAAkBR;UAClBS,YAAY;UACZC,QAAQ;QACZ,CAAA;AAEA,cAAMC,eAAeC,UAAUZ,UAAAA;AAC/B,YAAIW,gBAAgBA,iBAAiBX,YAAY;AAC7C,gBAAM,KAAKvK,QAAQgF,OAAO;YACtB,GAAGwF;YACHM,OAAOI;YACPH,kBAAkBG;YAClBF,YAAY;YACZC,QAAQ;UACZ,CAAA;QACJ;MACJ;IACJ;;;;;;;;;;;;;;;;;;;;;;AC5eA,OAAO;AACP,SAAQG,cAAAA,oBAAiB;AACzB,SAAQC,kBAAiB;;;;;;;;;;IASZC;;;;AARb,IAAAC;AAEA,IAAAC;AACA;AACA,IAAAC;AACA;;;AAGO,IAAMH,sBAAN,cAAkCI,YAAAA;aAAAA;;;;;;;MAE7BC,gBAAwC,oBAAIC,IAAAA;MAEpD,YACYC,iBACAC,eACAC,gBACAC,YACV;AACE,cAAK,GAAA,KALGH,kBAAAA,iBAAAA,KACAC,gBAAAA,eAAAA,KACAC,iBAAAA,gBAAAA,KACAC,aAAAA;MAGZ;MAEA,MAAMC,YAAYC,YAAwC;AACtD,cAAMC,WAAW,KAAKR,cAAcS,IAAIF,UAAAA;AACxC,YAAIC,SAAU,QAAOA;AAErB,cAAME,MAAM,KAAKC,KAAK,KAAKL,WAAW;AACtC,cAAMM,WAAW,MAAM,KAAKV,gBAAgBW,QAAQN,UAAAA;AACpD,YAAI,CAACK,SAAU,OAAM,IAAIE,MAAM,YAAYP,UAAAA,YAAsB;AACjE,YAAI,CAACK,SAASG,UAAW,OAAM,IAAID,MAAM,YAAYP,UAAAA,mBAA6B;AAElF,cAAMS,SAAS,MAAM,KAAKZ,eAAea,UAAUL,SAASG,SAAS;AAErE,cAAMG,SAAS,MAAM,KAAKC,2BAA2BP,UAAUI,MAAAA;AAC/D,cAAMI,OAAO,MAAMJ,OAAOK,eAAeT,SAASU,IAAIV,SAASW,MAAML,MAAAA;AACrE,aAAKlB,cAAcwB,IAAIjB,YAAYa,IAAAA;AAEnCV,YAAIe,KAAK,0BAA0Bb,SAASW,IAAI,KAAKhB,UAAAA,kBAA4BK,SAASG,SAAS,EAAE;AACrG,eAAOK;MACX;MAEA,MAAMM,oBAAoBJ,IAAgC;AACtD,eAAO,KAAKhB,YAAYgB,EAAAA;MAC5B;MAEA,MAAMK,UAAyB;AAC3B,cAAMjB,MAAM,KAAKC,KAAK,KAAKgB,OAAO;AAClC,cAAMC,YAAY,MAAM,KAAKvB,WAAWwB,KAAI;AAC5CnB,YAAIe,KAAK,WAAWG,UAAUE,MAAM,iBAAiB;AAErD,cAAMC,YAAY,IAAIC,IAAIJ,UAAUK,IAAIC,CAAAA,MAAKA,EAAEnB,SAAS,CAAA;AACxD,mBAAWoB,YAAYJ,WAAW;AAC9B,cAAI;AACA,kBAAM,KAAK3B,eAAea,UAAUkB,QAAAA;UACxC,SAASC,GAAG;AACR1B,gBAAI2B,MAAM,yBAAyBF,QAAAA,KAAcC,EAAYE,OAAO,EAAE;UAC1E;QACJ;AAEA,mBAAW1B,YAAYgB,WAAW;AAC9B,cAAI,CAAC,KAAKxB,eAAemC,IAAI3B,SAASG,SAAS,GAAG;AAC9CL,gBAAI2B,MAAM,YAAYzB,SAASW,IAAI,8BAA8BX,SAASG,SAAS,+BAA0B;AAC7G;UACJ;AACA,cAAI;AACA,kBAAM,KAAKT,YAAYM,SAASU,EAAE;UACtC,SAASc,GAAG;AACR1B,gBAAI2B,MAAM,2BAA2BzB,SAASW,IAAI,KAAMa,EAAYE,OAAO,EAAE;UACjF;QACJ;AAEA5B,YAAIe,KAAK,UAAU,KAAKzB,cAAcwC,IAAI,mBAAmB;MACjE;MAEAC,sBAA8C;AAC1C,eAAO,KAAKzC;MAChB;MAEA,MAAM0C,gBAAgBnC,YAAmC;AACrD,cAAMG,MAAM,KAAKC,KAAK,KAAK+B,eAAe;AAC1C,cAAM,KAAKC,WAAWpC,UAAAA;AAEtB,cAAMK,WAAW,MAAM,KAAKV,gBAAgBW,QAAQN,UAAAA;AACpD,YAAI,CAACK,UAAU;AACXF,cAAIkC,MAAM,YAAYrC,UAAAA,sCAAgD;AACtE;QACJ;AAEA,cAAM,KAAKD,YAAYC,UAAAA;MAC3B;MAEA,MAAMoC,WAAWpC,YAAmC;AAChD,cAAMa,OAAO,KAAKpB,cAAcS,IAAIF,UAAAA;AACpC,YAAIa,QAAQ,OAAQA,KAAayB,YAAY,YAAY;AACrD,gBAAOzB,KAAayB,QAAO;QAC/B;AACA,aAAK7C,cAAc8C,OAAOvC,UAAAA;MAC9B;MAEA,MAAMwC,sBAAsBZ,UAAmC;AAC3D,cAAMa,WAAqB,CAAA;AAC3B,mBAAW,CAACzC,YAAYa,IAAAA,KAAS,KAAKpB,eAAe;AACjD,cAAKoB,KAAae,aAAaA,UAAU;AACrCa,qBAASC,KAAK1C,UAAAA;UAClB;QACJ;AACA,mBAAWe,MAAM0B,UAAU;AACvB,gBAAM,KAAKL,WAAWrB,EAAAA;QAC1B;AACA,eAAO0B,SAASlB;MACpB;MAEA,MAAMoB,yBAAyBC,aAAsC;AACjE,mBAAW7B,MAAM6B,aAAa;AAC1B,gBAAM,KAAKR,WAAWrB,EAAAA;QAC1B;MACJ;MAEA,MAAM8B,sBAAsB7C,YAAoB8C,gBAAuC;AACnF,cAAM3C,MAAM,KAAKC,KAAK,KAAKyC,qBAAqB;AAChD,cAAM,KAAKlD,gBAAgBoD,eAAe/C,YAAY8C,cAAAA;AACtD,cAAM,KAAKV,WAAWpC,UAAAA;AACtB,cAAM,KAAKD,YAAYC,UAAAA;AACvBG,YAAIe,KAAK,qBAAqBlB,UAAAA,cAAwB8C,cAAAA,EAAgB;MAC1E;MAEA,MAAME,eAAehD,YAA8D;AAC/E,YAAI;AACA,gBAAMa,OAAO,MAAM,KAAKd,YAAYC,UAAAA;AACpC,gBAAMa,KAAKoC,eAAc;AACzB,iBAAO;YAACC,IAAI;UAAI;QACpB,SAASpB,OAAO;AACZ,iBAAO;YAACoB,IAAI;YAAOpB,OAAOA,iBAAiBvB,QAAQuB,MAAMC,UAAUoB,OAAOrB,KAAAA;UAAM;QACpF;MACJ;MAEA,MAAMsB,yBAAyBxB,UAAkBjB,QAG9C;AACC,YAAIE,OAAyB;AAC7B,YAAI;AACA,gBAAMJ,SAAS,MAAM,KAAKZ,eAAea,UAAUkB,QAAAA;AACnDf,iBAAO,MAAMJ,OAAOK,eAAe3B,WAAAA,GAAc,QAAQwB,MAAAA;AACzD,gBAAME,KAAKoC,eAAc;AACzB,iBAAO;YAACC,IAAI;UAAI;QACpB,SAASpB,OAAO;AACZ,iBAAO;YAACoB,IAAI;YAAOpB,OAAOA,iBAAiBvB,QAAQuB,MAAMC,UAAUoB,OAAOrB,KAAAA;UAAM;QACpF,UAAA;AACI,cAAIjB,QAAQ,OAAQA,KAAayB,YAAY,YAAY;AACrD,gBAAI;AACA,oBAAOzB,KAAayB,QAAO;YAC/B,QAAQ;YACR;UACJ;QACJ;MACJ;MAEA,MAAc1B,2BACVP,UACAI,QAC4B;AAC5B,cAAMN,MAAM,KAAKC,KAAK,KAAKQ,0BAA0B;AACrD,YAAID,SAAS0C,eAAehD,SAASM,MAAM;AAE3C,YAAI,CAACN,SAASiD,mBAAmB,CAACjD,SAASkD,uBAAuB;AAC9DpD,cAAIkC,MAAM,yCAAyChC,SAASW,IAAI,EAAE;AAClE,gBAAMwC,SAAS/C,OAAOgD,YAAS,GAAMC;AACrC,cAAIF,QAAQG,WAAWpC,UAAUiC,OAAOI,YAAY;AAChD,uBAAWC,SAASL,OAAOG,WAAW;AAClC,oBAAMG,OAAON,OAAOI,WAAWC,KAAAA;AAC/B,kBAAIC,QAAQ,OAAOA,SAAS,YAAYA,KAAKC,YAAYC,UAAarD,OAAOkD,KAAAA,MAAWG,QAAW;AAC/FrD,yBAASsD,UAAUtD,QAAQkD,OAAOC,KAAKC,OAAO;cAClD;YACJ;UACJ;AACA,iBAAOpD;QACX;AAEA,YAAI;AACA,gBAAMuD,YAAYzD,OAAOgD,YAAS,GAAMC,YAAYC,YAAY,CAAA,KAAM;AACtE,gBAAMQ,YAAY,KAAKvE,cAAcwE,QACjC/D,SAASiD,iBACTjD,SAASkD,qBAAqB;AAElC,iBAAOU,UAAUtD,QAAQuD,WAAWC,SAAAA;QACxC,SAASrC,OAAO;AACZ3B,cAAI2B,MAAM,6CAA6CzB,SAASW,IAAI,KAAMc,MAAgBC,OAAO,EAAE;AACnG,gBAAM,IAAIxB,MAAM,6CAA6CF,SAASW,IAAI,EAAE;QAChF;MACJ;IACJ;;;;;;;;;;;;;;;ACjMA,OAAO;AACP,SAAyCqD,eAAiD;AAC1F,SAAQC,gBAAAA,qBAAmB;AAG3B,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAQZC;;;;AATb,IAAAC;AAEA,IAAAC;;;AAOO,IAAMF,eAAN,cAA2BG,gBAAgBL,aAAAA,EAAAA;aAAAA;;;MACvCM,cAAuB;MACvBC,oBAAoB;MACVC,SAAuBC,IAAIC,MAAMF;MAC1CG,aAAkC;MAClCC,UAA0B;MAC1BC,oBAAoB;MACpBC,qBAAiD,CAAA;MAEzD,cAAc;AACV,cAAK;MACT;MAEAC,YAAYC,UAAqC;AAC7C,aAAKF,mBAAmBG,KAAKD,QAAAA;MACjC;MAEA,MAAajB,UAAyB;AAClC,cAAMmB,UAAS,KAAKC,KAAK,KAAKpB,OAAO;AACrC,YAAI;AACA,cAAI,KAAKY,cAAc,KAAKC,SAAS;AACjC,iBAAKN,cAAc;AACnB;UACJ;AAEA,cAAI,KAAKK,cAAc,CAAC,KAAKC,SAAS;AAClC,kBAAM,KAAKQ,gBAAe;AAC1B;UACJ;AAEA,gBAAMC,YAAY,IAAIC,IAAI,KAAKd,OAAOe,GAAG;AACzC,cAAIF,UAAUG,SAAUH,WAAUG,WAAW;AAC7CN,UAAAA,QAAOO,KAAK,8BAA8BJ,UAAUK,SAAQ,CAAA,EAAI;AAChE,eAAKf,aAAa,MAAMZ,QAAQ,KAAKS,OAAOe,GAAG;AAC/CL,UAAAA,QAAOO,KAAK,oCAAA;AAEZ,gBAAM,KAAKE,cAAa;AAExB,eAAKhB,WAAWiB,GAAG,SAAS,CAACC,QAAAA;AACzBX,YAAAA,QAAOY,MAAM,8BAA8BD,IAAIE,OAAO,EAAE;AACxD,iBAAKzB,cAAc;AACnB,iBAAKM,UAAU;AACf,iBAAKD,aAAa;AAClB,iBAAKqB,KAAK,cAAA;AACV,iBAAKC,UAAS;UAClB,CAAA;AAEA,eAAKtB,WAAWiB,GAAG,SAAS,MAAA;AACxB,gBAAI,KAAKtB,aAAa;AAClBY,cAAAA,QAAOgB,KAAK,yCAAA;AACZ,mBAAK5B,cAAc;AACnB,mBAAKM,UAAU;AACf,mBAAKD,aAAa;AAClB,mBAAKqB,KAAK,cAAA;AACV,mBAAKC,UAAS;YAClB;UACJ,CAAA;AAEA,eAAK3B,cAAc;QACvB,SAASwB,OAAO;AACZZ,UAAAA,QAAOY,MAAM,kCAAmCA,MAAgBC,OAAO,EAAE;AACzE,gBAAMD;QACV;MACJ;MAEA,MAAaG,YAA2B;AACpC,cAAMf,UAAS,KAAKC,KAAK,KAAKc,SAAS;AACvC,YAAI,CAAC,KAAK3B,aAAa;AACnB,cAAI,KAAKC,qBAAqB,KAAKC,OAAOD,mBAAmB;AACzDW,YAAAA,QAAOY,MAAM,yCAAyC,KAAKvB,iBAAiB,WAAW;AACvF;UACJ;AAEA,eAAKA;AACL,gBAAM4B,QAAQ,KAAK3B,OAAO4B,mBAAmBC,KAAKC,IAAI,GAAG,KAAK/B,oBAAoB,CAAA;AAElFW,UAAAA,QAAOO,KAAK,0CAA0CU,KAAAA,eAAoB,KAAK5B,iBAAiB,GAAG;AAEnG,eAAKK,UAAU;AACf,eAAKD,aAAa;AAElB4B,qBAAW,YAAA;AACP,gBAAI;AACA,oBAAM,KAAKxC,QAAO;AAClB,kBAAI,KAAKO,aAAa;AAClB,2BAAWkC,MAAM,KAAK1B,oBAAoB;AACtC,sBAAI;AACA,0BAAM0B,GAAAA;kBACV,SAASC,GAAG;AACRvB,oBAAAA,QAAOY,MAAM,6BAA8BW,EAAYV,OAAO,EAAE;kBACpE;gBACJ;cACJ;YACJ,SAASD,OAAO;YAEhB;UACJ,GAAGK,KAAAA;QACP;MACJ;MAEA,MAAaO,eAA8B;AACvC,YAAI,KAAK9B,SAAS;AACd,gBAAM+B,KAAK,KAAK/B;AAChB,eAAKA,UAAU;AACf,eAAKN,cAAc;AACnB,eAAK0B,KAAK,cAAA;AACV,gBAAMW,GAAGC,MAAK;QAClB;MACJ;MAEA,MAAaC,aAAa;AACtB,cAAM3B,UAAS,KAAKC,KAAK,KAAK0B,UAAU;AACxC,YAAI,CAAC,KAAKvC,eAAe,CAAC,KAAKK,WAAY;AAE3C,cAAM,KAAK+B,aAAY;AAEvB,YAAI,KAAK/B,YAAY;AACjB,gBAAMmC,OAAO,KAAKnC;AAClB,eAAKA,aAAa;AAClB,gBAAMmC,KAAKF,MAAK;QACpB;AAEA,aAAKtC,cAAc;AACnBY,QAAAA,QAAOO,KAAK,4BAAA;MAChB;MAEA,MAAasB,QAAQC,WAAmBhC,UAAuFiC,eAAwB,OAAOC,WAAU;QAACC,OAAO;MAAK,GAAqB;AACtM,cAAMjC,UAAS,KAAKC,KAAK,KAAKpB,OAAO;AACrC,YAAI,CAAC,KAAKO,aAAa;AACnB,gBAAM,KAAKP,QAAO;QACtB;AAGA,YAAI;AACA,iBAAO,KAAKa,QAASmC,QAAQC,WAAW,OAAOjB,YAAAA;AAC3C,gBAAI,CAACA,SAAS;AACVb,cAAAA,QAAOgB,KAAK,qCAAqCc,SAAAA,EAAW;AAC5D;YACJ;AACA,gBAAI;AACA,oBAAMI,UAAUC,KAAKC,MAAMvB,QAAQqB,QAAQ1B,SAAQ,CAAA;AACnD,oBAAM,EAAC6B,UAAS,IAAIH;AACpB,oBAAMpC,SAASuC,WAAWH,SAASrB,OAAAA;AACnC,mBAAKnB,SAAS4C,IAAIzB,OAAAA;YAEtB,SAASD,OAAO;AACZZ,cAAAA,QAAOY,MAAM,wCAAwCkB,SAAAA,KAAelB,MAAgBC,OAAO,EAAE;AAE7F,kBAAI,CAAC,KAAKnB,QAAS;AAEnB,kBAAIqC,cAAc;AACd,qBAAKrC,QAAQ4C,IAAIzB,OAAAA;cACrB,OAAO;AACH,oBAAIA,QAAQ0B,OAAOC,aAAa;AAC5B,uBAAK9C,QAAQ+C,KAAK5B,SAAS,OAAO,KAAA;AAClCb,kBAAAA,QAAOgB,KAAK,+CAAA;gBAChB,OAAO;AACH,uBAAKtB,QAAQ+C,KAAK5B,SAAS,OAAO,IAAA;AAClCb,kBAAAA,QAAOO,KAAK,6BAAA;gBAChB;cACJ;YACJ;UAEJ,GAAGyB,QAAAA;QACP,SAASpB,OAAO;AACZZ,UAAAA,QAAOY,MAAM,uCAAuCkB,SAAAA,KAAelB,MAAgBC,OAAO,EAAE;AAC5F,gBAAMD;QACV;MACJ;;;;;;;MAQA,MAAM8B,YAAYlD,OAAeqB,SAAyBmB,WAAkB,CAAC,GAAqB;AAC9F,cAAMhC,UAAS,KAAKC,KAAK,KAAKyC,WAAW;AACzC,YAAI,CAAC,KAAKtD,aAAa;AACnB,gBAAM,KAAKP,QAAO;QACtB;AAEA,YAAI;AAEA,gBAAM8D,SAASC,OAAOC,KAAKV,KAAKW,UAAUjC,OAAAA,CAAAA;AAG1C,gBAAMkC,iBAAiB;YACnBC,YAAY;YACZC,aAAa;UACjB;AAGA,gBAAMC,iBAAiB;YAAC,GAAGH;YAAgB,GAAGf;UAAO;AAGrD,gBAAMmB,OAAO,KAAKzD,QAASgD,YAAYlD,OAAOmD,QAAQO,cAAAA;AAEtD,cAAIC,MAAM;AACNnD,YAAAA,QAAOoD,MAAM,yBAAyB5D,KAAAA,aAAkBqB,QAAQwC,EAAE,EAAE;UACxE,OAAO;AACHrD,YAAAA,QAAOgB,KAAK,mCAAmCxB,KAAAA,0BAA+B;UAElF;AAEA,iBAAO2D;QACX,SAASvC,OAAO;AACZZ,UAAAA,QAAOY,MAAM,kCAAkCpB,KAAAA,KAAWoB,MAAgBC,OAAO,EAAE;AACnF,gBAAMD;QACV;MACJ;;;;;;;;MASA,MAAM0C,eAAeC,UAAkBC,YAAoB3C,SAAamB,WAAkB,CAAC,GAAqB;AAC5G,cAAMhC,UAAS,KAAKC,KAAK,KAAKqD,cAAc;AAC5C,YAAI,CAAC,KAAKlE,aAAa;AACnB,gBAAM,KAAKP,QAAO;QACtB;AAEA,YAAI;AAEA,gBAAM8D,SAASC,OAAOC,KAAKV,KAAKW,UAAUjC,OAAAA,CAAAA;AAG1C,gBAAMkC,iBAAiB;YACnBC,YAAY;YACZC,aAAa;UACjB;AAGA,gBAAMC,iBAAiB;YAAC,GAAGH;YAAgB,GAAGf;UAAO;AAGrD,gBAAMmB,OAAO,KAAKzD,QAAS+D,QAAQF,UAAUC,YAAYb,QAAQO,cAAAA;AAEjE,cAAI,CAACC,MAAM;AACPnD,YAAAA,QAAOgB,KAAK,yCAAyCuC,QAAAA,0BAAkC;UAE3F;AAEA,iBAAOJ;QACX,SAASvC,OAAO;AACZZ,UAAAA,QAAOY,MAAM,wCAAwC2C,QAAAA,KAAc3C,MAAgBC,OAAO,EAAE;AAC5F,gBAAMD;QACV;MACJ;;;;MAKA,MAAM8C,OAAO;AACT,cAAM1D,UAAS,KAAKC,KAAK,KAAKyD,IAAI;AAClC,YAAI,KAAKhE,SAAS;AACd,cAAI;AACA,kBAAM,KAAKA,QAAQiE,OAAO,mBAAA;AAC1B3D,YAAAA,QAAOO,KAAK,4BAAA;UAChB,SAASK,OAAO;AACZZ,YAAAA,QAAOY,MAAM,4BAA6BA,MAAgBC,OAAO,EAAE;UACvE;QACJ;MACJ;MAEA,MAAM+C,eAAeL,UAAkBM,OAAc7B,WAAkB;QAAC8B,SAAS;MAAI,GAAG;AACpF,cAAM9D,UAAS,KAAKC,KAAK,KAAK2D,cAAc;AAC5C,YAAI,CAAC,KAAKxE,aAAa;AACnB,gBAAM,KAAKP,QAAO;QACtB;AAEAmB,QAAAA,QAAOoD,MAAM,sBAAsBG,QAAAA,cAAsBM,KAAAA,EAAM;AAC/D,cAAM,KAAKnE,QAASkE,eAAeL,UAAUM,OAAM7B,QAAAA;MACvD;MAEA,MAAM+B,YAAYvE,OAAewC,WAAkB;QAAC8B,SAAS;MAAI,GAAGP,UAAmBS,SAAkB;AACrG,cAAMhE,UAAS,KAAKC,KAAK,KAAK8D,WAAW;AACzC,YAAI,CAAC,KAAK3E,aAAa;AACnB,gBAAM,KAAKP,QAAO;QACtB;AACAmB,QAAAA,QAAOoD,MAAM,mBAAmB5D,KAAAA,EAAO;AACvC,cAAM,KAAKE,QAASqE,YAAYvE,OAAOwC,QAAAA;AAEvC,YAAIuB,UAAU;AACV,gBAAM,KAAKU,UAAUzE,OAAO+D,UAAUS,WAAW,EAAA;QACrD;MACJ;MAEA,MAAMC,UAAUzE,OAAe+D,UAAkBS,SAAiB;AAC9D,cAAMhE,UAAS,KAAKC,KAAK,KAAKgE,SAAS;AACvC,YAAI,CAAC,KAAK7E,aAAa;AACnB,gBAAM,KAAKP,QAAO;QACtB;AACA,YAAImF,SAAS;AACThE,UAAAA,QAAOoD,MAAM,iBAAiB5D,KAAAA,gBAAqB+D,QAAAA,iBAAyBS,OAAAA,EAAS;QACzF,OAAO;AACHhE,UAAAA,QAAOoD,MAAM,iBAAiB5D,KAAAA,gBAAqB+D,QAAAA,WAAmB;QAE1E;AACA,cAAM,KAAK7D,QAASuE,UAAUzE,OAAO+D,UAAUS,OAAAA;MACnD;MAEA,MAAME,YAAY1E,OAAe+D,UAAkBS,SAAiB;AAChE,cAAMhE,UAAS,KAAKC,KAAK,KAAKiE,WAAW;AACzC,YAAI,CAAC,KAAK9E,YAAa,OAAM,KAAKP,QAAO;AACzCmB,QAAAA,QAAOoD,MAAM,mBAAmB5D,KAAAA,kBAAuB+D,QAAAA,iBAAyBS,OAAAA,EAAS;AACzF,cAAM,KAAKtE,QAASwE,YAAY1E,OAAO+D,UAAUS,OAAAA;MACrD;MAEA,MAAMG,YAAY3E,OAAewC,WAAkB,CAAC,GAAG;AACnD,cAAMhC,UAAS,KAAKC,KAAK,KAAKkE,WAAW;AACzC,YAAI,CAAC,KAAK/E,YAAa,OAAM,KAAKP,QAAO;AACzCmB,QAAAA,QAAOoD,MAAM,kBAAkB5D,KAAAA,EAAO;AACtC,cAAM,KAAKE,QAASyE,YAAY3E,OAAOwC,QAAAA;MAC3C;MAEA,MAAcvB,gBAA+B;AACzC,cAAMT,UAAS,KAAKC,KAAK,KAAKQ,aAAa;AAC3C,aAAKf,UAAU,MAAM,KAAKD,WAAYgB,cAAa;AACnDT,QAAAA,QAAOO,KAAK,uCAAA;AAEZ,aAAKb,QAAQgB,GAAG,SAAS,CAACC,QAAAA;AACtBX,UAAAA,QAAOY,MAAM,2BAA2BD,IAAIE,OAAO,EAAE;AACrD,eAAKnB,UAAU;AACf,eAAKN,cAAc;AACnB,eAAK0B,KAAK,cAAA;AACV,eAAKZ,gBAAe,EAAGkE,MAAM7C,CAAAA,MACzBvB,QAAOY,MAAM,+BAA+BW,EAAEV,OAAO,EAAE,CAAA;QAE/D,CAAA;AAEA,aAAKzB,cAAc;MACvB;MAEA,MAAcc,kBAAiC;AAC3C,cAAMF,UAAS,KAAKC,KAAK,KAAKC,eAAe;AAC7C,YAAI,KAAKP,kBAAmB;AAC5B,aAAKA,oBAAoB;AACzB,YAAI;AACA,cAAI,CAAC,KAAKF,YAAY;AAClB,kBAAM,KAAKZ,QAAO;AAClB;UACJ;AACAmB,UAAAA,QAAOO,KAAK,oDAAA;AACZ,gBAAM,KAAKE,cAAa;AACxB,eAAKpB,oBAAoB;QAC7B,UAAA;AACI,eAAKM,oBAAoB;QAC7B;MACJ;IACJ;;;;;;;;;;;;;;AC9WA,OAAO;AACP,SAAQ0E,cAAAA,oBAAiB;;;;;;;;;;IAyDZC;;;;AAxDb,IAAAC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA,IAAAC;;;AA6CO,IAAMF,yBAAN,cAAqCG,YAAAA;aAAAA;;;;;;;;;;;MAChCC,WAAmB;MACVC,cAA8C,oBAAIC,IAAAA;MAC3DC,iBAAwC;MAEhD,YACYC,WACAC,UACAC,eACAC,gBACAC,qBACAC,uBACAC,wBACAC,cACV;AACE,cAAK,GAAA,KATGP,YAAAA,WAAAA,KACAC,WAAAA,UAAAA,KACAC,gBAAAA,eAAAA,KACAC,iBAAAA,gBAAAA,KACAC,sBAAAA,qBAAAA,KACAC,wBAAAA,uBAAAA,KACAC,yBAAAA,wBAAAA,KACAC,eAAAA;MAGZ;MAEAC,YAAYZ,UAAwB;AAChC,aAAKA,WAAWA;MACpB;MAEAa,cAAcC,KAAmB;AAC7B,aAAKV,UAAUS,cAAcC,GAAAA;MACjC;MAEA,MAAMC,QAAQC,aAAqBC,SAAkBC,aAAuC;AACxF,cAAMC,MAAM,KAAKC,KAAK,KAAKL,OAAO;AAClCI,YAAIE,KAAK,cAAcL,WAAAA,GAAcC,UAAU,MAAMA,UAAU,EAAA,EAAI;AACnE,cAAMK,OAAO,MAAM,KAAKlB,UAAUmB,oBAAoBP,aAAaC,SAASC,WAAAA;AAC5E,cAAM,KAAKM,OAAOF,KAAKG,MAAMP,WAAAA;AAC7B,eAAOI;MACX;MAEA,MAAMI,mBAAmBC,SAAiBT,aAAuC;AAC7E,cAAMC,MAAM,KAAKC,KAAK,KAAKM,kBAAkB;AAC7CP,YAAIE,KAAK,mCAAmCM,QAAQC,MAAM,SAAS;AACnE,cAAMN,OAAO,MAAM,KAAKlB,UAAUsB,mBAAmBC,SAAST,WAAAA;AAC9D,cAAM,KAAKM,OAAOF,KAAKG,MAAMP,WAAAA;AAC7B,eAAOI;MACX;MAEA,MAAME,OAAOR,aAAqBa,YAAoC;AAClE,cAAMV,MAAM,KAAKC,KAAK,KAAKI,MAAM;AACjC,cAAMM,MAAM,MAAM,KAAKzB,SAAS0B,UAAUf,WAAAA;AAC1C,YAAI,CAACc,IAAK,OAAM,IAAIE,MAAM,WAAWhB,WAAAA,+BAA0C;AAE/EG,YAAIE,KAAK,YAAYL,WAAAA,IAAec,IAAIb,OAAO,KAAK;AAEpD,cAAMgB,SAAS,MAAM,KAAK1B,eAAe2B,UAAUJ,IAAIK,EAAE;AACzD,cAAM,KAAK7B,cAAc8B,eAAe,KAAKpC,UAAUiC,QAAQ,MAAMjB,WAAAA;AAErE,cAAM,KAAKqB,UAAU,kBAAkB;UACnCC,UAAUR,IAAIK;UAAInB;UAAaC,SAASa,IAAIb;UAASsB,QAAQT,IAAIS;UAAQC,QAAQV,IAAIU,UAAU;QACnG,CAAA;MACJ;MAEA,MAAMC,QAAQzB,aAAoC;AAC9C,cAAMG,MAAM,KAAKC,KAAK,KAAKqB,OAAO;AAClC,cAAMX,MAAM,MAAM,KAAKzB,SAAS0B,UAAUf,WAAAA;AAC1C,YAAI,CAACc,OAAO,CAACA,IAAIY,QAAQ;AACrBvB,cAAIE,KAAK,GAAGL,WAAAA,cAAyB;AACrC;QACJ;AAEA,cAAM,KAAKR,oBAAoBmC,sBAAsBb,IAAIK,EAAE;AAC3D,aAAK1B,sBAAsBmC,gBAAgBd,IAAIK,EAAE;AACjD,cAAM,KAAK7B,cAAcuC,aAAaf,IAAIK,EAAE;AAE5C,cAAM,KAAKE,UAAU,mBAAmB;UACpCC,UAAUR,IAAIK;UAAInB;UAAaC,SAASa,IAAIb;UAASsB,QAAQT,IAAIS;UAAQC,QAAQV,IAAIU,UAAU;QACnG,CAAA;AAEArB,YAAIE,KAAK,YAAYL,WAAAA,EAAa;MACtC;MAEA,MAAM8B,UAAU9B,aAAqB+B,OAA4B,CAAC,GAAkB;AAChF,cAAM5B,MAAM,KAAKC,KAAK,KAAK0B,SAAS;AACpC,cAAMhB,MAAM,MAAM,KAAKzB,SAAS0B,UAAUf,WAAAA;AAC1C,YAAI,CAACc,IAAK;AAEV,YAAI,CAACiB,KAAKC,OAAO;AACb,cAAIlB,IAAIY,QAAQ;AACZ,kBAAM,IAAIV,MAAM,oBAAoBhB,WAAAA,mCAA8C;UACtF;AACA,cAAIc,IAAImB,WAAW,WAAW;AAC1B,kBAAM,IAAIjB,MAAM,mCAAmChB,WAAAA,EAAa;UACpE;QACJ;AAEA,YAAIc,IAAIY,QAAQ;AACZ,gBAAM,KAAKQ,aAAapB,IAAIK,EAAE,EAAEgB,MAAMC,CAAAA,MAClCjC,IAAIkC,KAAK,mBAAmBvB,IAAIL,IAAI,sBAAuB2B,EAAYE,OAAO,EAAE,CAAA;QAExF;AAEA,cAAM,KAAKjD,SAASkD,WAAWzB,IAAIK,EAAE;AACrChB,YAAIE,KAAK,eAAeL,WAAAA,gBAA2B;MACvD;MAEA,MAAMwC,OAAOxC,aAAqByC,WAAkC;AAChE,cAAMtC,MAAM,KAAKC,KAAK,KAAKoC,MAAM;AACjCrC,YAAIE,KAAK,aAAaL,WAAAA,EAAa;AACnC,cAAM,KAAKyB,QAAQzB,WAAAA;AACnB,cAAM,KAAKQ,OAAOR,aAAayC,SAAAA;MACnC;MAEA,MAAMC,mBAAmBC,SAA4C;AACjE,YAAIA,QAAQ3D,aAAa,KAAKA,SAAU;AACxC,cAAMmB,MAAM,KAAKC,KAAK,KAAKsC,kBAAkB;AAG7C,cAAM,KAAKtD,UAAUwD,iBACjBD,QAAQrB,UAAUqB,QAAQ3C,aAAa2C,QAAQ1C,SAAS0C,QAAQnB,MAAM;AAI1E,YAAI,CAAC,KAAKjC,eAAesD,IAAIF,QAAQrB,QAAQ,GAAG;AAC5CnB,cAAIE,KAAK,0BAA0BsC,QAAQ3C,WAAW,IAAI2C,QAAQ1C,OAAO,SAAS0C,QAAQ3D,QAAQ,EAAE;AACpG,gBAAMiC,SAAS,MAAM,KAAK1B,eAAe2B,UAAUyB,QAAQrB,QAAQ;AACnE,gBAAM,KAAKhC,cAAcwD,kBACrB,KAAK9D,UAAUiC,QAAQ0B,QAAQrB,UAAUqB,QAAQpB,MAAM;QAE/D,OAAO;AACHpB,cAAI4C,MAAM,GAAGJ,QAAQpB,MAAM,yCAAyC;QACxE;MACJ;MAEA,MAAMyB,oBAAoBL,SAA4C;AAClE,YAAIA,QAAQ3D,aAAa,KAAKA,SAAU;AACxC,cAAMmB,MAAM,KAAKC,KAAK,KAAK4C,mBAAmB;AAC9C7C,YAAIE,KAAK,mBAAmBsC,QAAQrB,QAAQ,SAASqB,QAAQ3D,QAAQ,EAAE;AACvE,cAAM,KAAKkD,aAAaS,QAAQrB,QAAQ;MAC5C;MAEA,MAAM2B,mBAAmBC,YAAoC;AACzD,cAAM/C,MAAM,KAAKC,KAAK,KAAK6C,kBAAkB;AAC7C,YAAIC,WAAY,MAAKlE,WAAWkE;AAChC,cAAM,KAAK9D,UAAU+D,iBAAgB;AAErC,cAAMC,UAAU,MAAM,KAAK/D,SAASgE,WAAU;AAC9C,YAAID,QAAQxC,WAAW,GAAG;AACtBT,cAAIkC,KAAK,yEAAA;AACT;QACJ;AACAlC,YAAIE,KAAK,WAAW+C,QAAQxC,MAAM,oBAAoB;AAEtD,mBAAW0C,aAAaF,SAAS;AAC7B,cAAI,KAAK7D,eAAesD,IAAIS,UAAUnC,EAAE,GAAG;AACvC,kBAAM,KAAK7B,cAAciE,0BAA0B,KAAKvE,UAAUsE,UAAUnC,EAAE;AAC9EhB,gBAAI4C,MAAM,GAAGO,UAAU7C,IAAI,gDAAgD;AAC3E;UACJ;AAEA,cAAI;AACA,kBAAMQ,SAAS,MAAM,KAAK1B,eAAe2B,UAAUoC,UAAUnC,EAAE;AAC/D,kBAAM,KAAK7B,cAAcwD,kBACrB,KAAK9D,UAAUiC,QAAQqC,UAAUnC,IAAImC,UAAU/B,MAAM;UAE7D,SAASa,GAAG;AACRjC,gBAAIqD,MAAM,kBAAkBF,UAAU7C,IAAI,KAAM2B,EAAYE,OAAO,EAAE;UACzE;QACJ;MACJ;MAEA,MAAMmB,mBAAmBC,OAA0C;AAC/D,YAAIA,MAAM1E,aAAa,KAAKA,SAAU;AACtC,cAAMmB,MAAM,KAAKC,KAAK,KAAKqD,kBAAkB;AAE7C,cAAME,UAAU,KAAK1E,YAAY2E,IAAIF,MAAMnC,OAAOsC,YAAW,CAAA;AAC7D,YAAIF,SAASnC,WAAWkC,MAAMlC,QAAQ;AAClCrB,cAAI4C,MAAM,GAAGW,MAAMnC,MAAM,oBAAoBmC,MAAMlC,OAAOsC,MAAM,GAAG,EAAA,CAAA,YAAe;AAClF;QACJ;AAEA3D,YAAIE,KAAK,kBAAkBqD,MAAM1D,WAAW,IAAI0D,MAAMzD,OAAO,WAAWyD,MAAMlC,OAAOsC,MAAM,GAAG,EAAA,CAAA,EAAK;AAEnG,aAAKvE,eAAewE,OAAOL,MAAMpC,QAAQ;AACzC,cAAM,KAAKlC,UAAUwD,iBACjBc,MAAMpC,UAAUoC,MAAM1D,aAAa0D,MAAMzD,SAASyD,MAAMlC,MAAM;MAEtE;MAEA,MAAMwC,oBAAoBN,OAA0C;AAChE,cAAMvD,MAAM,KAAKC,KAAK,KAAK4D,mBAAmB;AAC9C7D,YAAIE,KAAK,GAAGqD,MAAMO,MAAM,IAAIP,MAAMQ,QAAQ,KAAKR,MAAMS,QAAQ,aAAaT,MAAMpC,QAAQ,GAAG;AAE3F,YAAIoC,MAAMO,WAAW,oBAAoB;AACrC,kBAAQP,MAAMQ,UAAQ;YAClB,KAAK;YACL,KAAK;AACD,oBAAM,KAAK1E,oBAAoB4E,gBAAgBV,MAAMS,QAAQ;AAC7D;YACJ,KAAK;AACD,oBAAM,KAAK3E,oBAAoB6E,WAAWX,MAAMS,QAAQ;AACxD;UACR;QACJ,WAAWT,MAAMO,WAAW,qBAAqB;AAC7C,kBAAQP,MAAMQ,UAAQ;YAClB,KAAK;YACL,KAAK;AACD,oBAAM,KAAKxE,uBAAuB4E,iBAAiBZ,MAAMS,QAAQ;AACjE;YACJ,KAAK;AACD,oBAAM,KAAKzE,uBAAuB2E,WAAWX,MAAMS,QAAQ;AAC3D;UACR;QACJ;MACJ;MAEA,MAAMI,mBAAkC;AACpC,cAAMpE,MAAM,KAAKC,KAAK,KAAKmE,gBAAgB;AAC3C,cAAMnB,UAAU,MAAM,KAAK/D,SAASgE,WAAU;AAC9C,cAAMmB,kBAAkB,oBAAIC,IAAAA;AAE5B,mBAAWnB,aAAaF,SAAS;AAC7B,gBAAM7B,SAAS+B,UAAU/B,OAAOsC,YAAW;AAC3CW,0BAAgBE,IAAInD,MAAAA;AAEpB,gBAAMoC,UAAU,KAAK1E,YAAY2E,IAAIrC,MAAAA;AACrC,cAAIoC,SAASnC,WAAW8B,UAAU9B,OAAQ;AAE1C,cAAI;AACA,gBAAImC,SAAS;AACTxD,kBAAIE,KAAK,cAAckB,MAAAA,2BAAiC;AACxD,mBAAKhC,eAAewE,OAAOT,UAAUnC,EAAE;YAC3C,OAAO;AACHhB,kBAAIE,KAAK,cAAckB,MAAAA,sBAA4B;YACvD;AACA,kBAAMN,SAAS,MAAM,KAAK1B,eAAe2B,UAAUoC,UAAUnC,EAAE;AAC/D,kBAAM,KAAK7B,cAAcwD,kBACrB,KAAK9D,UAAUiC,QAAQqC,UAAUnC,IAAImC,UAAU/B,MAAM;AAEzD,iBAAKtC,YAAY0F,IAAIpD,QAAQ;cACzBD,UAAUgC,UAAUnC;cAAII;cAAQtB,SAASqD,UAAUrD;cACnDuB,QAAQ8B,UAAU9B,UAAU;cAAIxB,aAAasD,UAAU7C;cACvDmE,YAAY;cAAIC,UAAUC,KAAKC,IAAG;YACtC,CAAA;UACJ,SAAS3C,GAAG;AACRjC,gBAAIqD,MAAM,wBAAwBF,UAAU7C,IAAI,KAAM2B,EAAYE,OAAO,EAAE;UAC/E;QACJ;AAEA,mBAAW,CAACf,MAAAA,KAAW,KAAKtC,aAAa;AACrC,cAAI,CAACuF,gBAAgB3B,IAAItB,MAAAA,GAAS;AAC9BpB,gBAAIE,KAAK,cAAckB,MAAAA,2CAAiD;AACxE,iBAAKtC,YAAY+F,OAAOzD,MAAAA;UAC5B;QACJ;MACJ;MAEA0D,4BAA4BC,YAA0B;AAClD,YAAIA,cAAc,KAAK,KAAK/F,eAAgB;AAC5C,cAAMgB,MAAM,KAAKC,KAAK,KAAK6E,2BAA2B;AACtD9E,YAAIE,KAAK,iDAAiD6E,UAAAA,IAAc;AACxE,aAAK/F,iBAAiBgG,YAAY,MAAA;AAC9B,eAAKZ,iBAAgB,EAAGpC,MAAMC,CAAAA,MAC1BjC,IAAIqD,MAAM,mCAAoCpB,EAAYE,OAAO,EAAE,CAAA;QAE3E,GAAG4C,UAAAA;MACP;MAEAE,6BAAmC;AAC/B,YAAI,KAAKjG,gBAAgB;AACrBkG,wBAAc,KAAKlG,cAAc;AACjC,eAAKA,iBAAiB;QAC1B;MACJ;MAGA,MAAc+C,aAAaZ,UAAiC;AACxD,cAAM,KAAK9B,oBAAoBmC,sBAAsBL,QAAAA;AACrD,aAAK7B,sBAAsBmC,gBAAgBN,QAAAA;AAC3C,cAAM,KAAKhC,cAAcuC,aAAaP,QAAAA;MAC1C;MAEA,MAAcD,UAAU4C,QAAgBqB,MAAoF;AACxH,YAAI;AACA,gBAAM,KAAK3F,aAAa4F,eAAeC,IAAIC,MAAMC,eAAezB,QAAQ;YACpEA;YACA,GAAGqB;YACHtG,UAAU,KAAKA;YACf2G,WAAWb,KAAKC,IAAG;UACvB,CAAA;QACJ,SAAS3C,GAAG;AACR,eAAKjC,IAAIkC,KAAK,uBAAuB4B,MAAAA,KAAY7B,EAAYE,OAAO,EAAE;QAC1E;MACJ;IACJ;;;;;;;;;;;;;;;;;;;AC1VA,OAAO;AACP,SAAQsD,aAAAA,YAAWC,cAAAA,oBAAiB;AACpC,SAAQC,cAAAA,mBAAiB;AACzB,SAAwBC,YAAYC,KAAIC,aAAY;AACpD,OAAOC,WAAU;;;;;;;;;;IAQXC,mBAGOC;;;;AAVb,IAAAC;AACA;AACA;AACA;AACA;AACA,IAAAC;;;AAEA,IAAMH,oBAAoB;AAGnB,IAAMC,uBAAN,MAAMA,8BAA6BG,YAAAA;aAAAA;;;;;;MAC9BC,UAA4B;MAC5BC,cAAmC,oBAAIC,IAAAA;MACvCC,iBAA8B,oBAAIC,IAAAA;MAClCC,iBAA8C,oBAAIH,IAAAA;MAClDI,iBAA8C,oBAAIJ,IAAAA;MAClDK,aAAa;MACbC;MAER,YACYC,WACAC,WACAC,UACV;AACE,cAAK,GAAA,KAJGF,YAAAA,WAAAA,KACAC,YAAAA,WAAAA,KACAC,WAAAA;AAGR,aAAKH,aAAad,MAAKkB,QAAQC,IAAIC,IAAIN,UAAU;MACrD;MAEA,OAAOO,OACHN,WAAmCC,WACnCC,UAAoBH,YACA;AACpB,cAAMQ,WAAW,IAAIpB,sBAAqBa,WAAWC,WAAWC,QAAAA;AAChEK,iBAASR,aAAad,MAAKkB,QAAQJ,UAAAA;AACnC,eAAOQ;MACX;MAEA,MAAMC,gBAA+B;AACjC,cAAMC,MAAM,KAAKC,KAAK,KAAKF,aAAa;AAExC,YAAI;AACA,gBAAMzB,IAAG4B,OAAO,KAAKZ,UAAU;QACnC,QAAQ;AACJU,cAAIG,KAAK,qBAAqB,KAAKb,UAAU,iCAAiC;AAC9E;QACJ;AAEA,cAAMc,aAAa,MAAM,KAAKC,eAAc;AAC5C,mBAAWC,OAAOF,YAAY;AAC1B,cAAI;AACA,kBAAMG,OAAO,MAAM,KAAKC,iBAAiBF,IAAI9B,IAAI;AACjD,iBAAKO,YAAY0B,IAAIH,IAAII,KAAKH,IAAAA;UAClC,QAAQ;UACR;QACJ;AAEA,aAAKzB,UAAUP,MAAM,KAAKe,YAAY;UAACqB,WAAW;QAAI,GAAG,CAACC,QAAQC,aAAAA;AAC9D,cAAI,CAACA,SAAU;AACf,eAAKC,aAAaD,QAAAA;QACtB,CAAA;AAEAb,YAAIe,KAAK,uCAAuC,KAAKzB,UAAU,cAAcc,WAAWY,MAAM,aAAa;MAC/G;MAEAC,eAAqB;AACjB,YAAI,KAAKnC,SAAS;AACd,eAAKA,QAAQoC,MAAK;AAClB,eAAKpC,UAAU;QACnB;AACA,mBAAWqC,SAAS,KAAK/B,eAAegC,OAAM,EAAIC,cAAaF,KAAAA;AAC/D,aAAK/B,eAAekC,MAAK;AACzB,mBAAWC,WAAW,KAAKpC,eAAeiC,OAAM,EAAIC,cAAaE,OAAAA;AACjE,aAAKpC,eAAemC,MAAK;MAC7B;MAEQR,aAAaD,UAAwB;AACzC,YAAIA,SAASW,SAAS,cAAA,KAAmBX,SAASY,WAAW,GAAA,EAAM;AACnE,cAAMC,WAAWlD,MAAKmD,KAAK,KAAKrC,YAAYuB,QAAAA;AAC5C,aAAKe,cAAcF,QAAAA,EAAUG,KAAKC,CAAAA,cAAAA;AAC9B,cAAIA,WAAW;AACX,kBAAMpB,MAAMlC,MAAKuD,SAAS,KAAKzC,YAAYwC,SAAAA;AAC3C,gBAAI,KAAK7C,eAAe+C,IAAItB,GAAAA,EAAM;AAClC,iBAAKuB,SAASvB,KAAK,MAAM,KAAKwB,aAAaJ,WAAWpB,GAAAA,CAAAA;AACtD;UACJ;AAEA,qBAAW,CAACA,GAAAA,KAAQ,KAAK3B,aAAa;AAClC,kBAAMoD,WAAW3D,MAAKmD,KAAK,KAAKrC,YAAYoB,GAAAA;AAC5C,gBAAIgB,SAASD,WAAWU,QAAAA,GAAW;AAC/B,mBAAKF,SAASvB,KAAK,MAAM,KAAK0B,cAAcD,UAAUzB,GAAAA,CAAAA;AACtD;YACJ;UACJ;QACJ,CAAA,EAAG2B,MAAMC,CAAAA,MAAK,KAAKtC,IAAIuC,MAAM,uBAAwBD,EAAYE,OAAO,EAAE,CAAA;MAC9E;MAEQP,SAASvB,KAAa+B,IAA+B;AACzD,cAAMC,WAAW,KAAKtD,eAAeuD,IAAIjC,GAAAA;AACzC,YAAIgC,SAAUrB,cAAaqB,QAAAA;AAE3B,aAAKtD,eAAeqB,IAAIC,KAAKkC,WAAW,MAAA;AACpC,eAAKxD,eAAeyD,OAAOnC,GAAAA;AAC3B+B,aAAAA,EAAKJ,MAAMC,CAAAA,MAAK,KAAKtC,IAAI8C,MAAM,4BAA4BpC,GAAAA,KAAS4B,EAAYE,OAAO,EAAE,CAAA;QAC7F,GAAG,KAAKnD,UAAU,CAAA;MACtB;MAEA,MAAc6C,aAAaJ,WAAmBpB,KAA4B;AACtE,cAAMV,MAAM,KAAKC,KAAK,KAAKiC,YAAY;AACvC,aAAKjD,eAAe8D,IAAIrC,GAAAA;AAExB,cAAMa,UAAUqB,WAAW,MAAA;AACvB5C,cAAIG,KAAK,sBAAsBO,GAAAA,2BAA8B;AAC7D,eAAKzB,eAAe4D,OAAOnC,GAAAA;AAC3B,eAAKvB,eAAe0D,OAAOnC,GAAAA;QAC/B,GAAGjC,iBAAAA;AACH,aAAKU,eAAesB,IAAIC,KAAKa,OAAAA;AAE7B,YAAI;AACA,gBAAMyB,aAAa,MAAM,KAAKxD,UAAUyD,eAAenB,SAAAA;AACvD,cAAI,CAACkB,WAAY;AAEjB,gBAAME,UAAU,MAAM,KAAK1C,iBAAiBsB,SAAAA;AAC5C,gBAAMqB,eAAe,KAAKpE,YAAY4D,IAAIjC,GAAAA;AAC1C,cAAIyC,iBAAiBD,QAAS;AAE9B,gBAAME,eAAe,CAACD;AACtB,gBAAME,OAAO,MAAM,KAAK9D,UAAU+D,gBAAgBxB,WAAW,YAAA;AAC7D,eAAK/C,YAAY0B,IAAIC,KAAKwC,OAAAA;AAE1B,cAAI,CAAChF,WAAUqF,aAAaC,kBAAAA,GAAqB;AAC7CxD,gBAAIG,KAAK,qDAAqDkD,KAAKI,MAAM,EAAE;AAC3E;UACJ;AAEA,gBAAM,EAACC,wBAAAA,wBAAsB,IAAI,MAAM;AACvC,gBAAMC,YAAYzF,WAAUwB,QAAQgE,uBAAAA;AAEpC,cAAIN,cAAc;AACdpD,gBAAIe,KAAK,wBAAwBiC,WAAWY,WAAW,IAAIZ,WAAWa,OAAO,eAAe;AAC5F,kBAAMF,UAAUG,OAAOd,WAAWY,aAAa,SAAA;UACnD,OAAO;AACH5D,gBAAIe,KAAK,UAAUiC,WAAWY,WAAW,IAAIZ,WAAWa,OAAO,wBAAwB;AACvF,kBAAMF,UAAUI,OAAOf,WAAWY,aAAa,SAAA;UACnD;QACJ,UAAA;AACI,eAAK3E,eAAe4D,OAAOnC,GAAAA;AAC3B,gBAAMsD,IAAI,KAAK7E,eAAewD,IAAIjC,GAAAA;AAClC,cAAIsD,GAAG;AACH3C,yBAAa2C,CAAAA;AACb,iBAAK7E,eAAe0D,OAAOnC,GAAAA;UAC/B;QACJ;MACJ;MAEA,MAAc0B,cAAcN,WAAmBpB,KAA4B;AACvE,cAAMV,MAAM,KAAKC,KAAK,KAAKmC,aAAa;AACxC,YAAI;AACA,gBAAM9D,IAAG4B,OAAO4B,SAAAA;AAChB;QACJ,QAAQ;QACR;AAEA9B,YAAIe,KAAK,mBAAmBL,GAAAA,EAAK;AACjC,aAAK3B,YAAY8D,OAAOnC,GAAAA;AAExB,cAAMuD,QAAQvD,IAAIwD,MAAM,GAAA;AACxB,cAAML,UAAUI,MAAME,IAAG;AACzB,cAAMP,cAAcK,MAAMtC,KAAK,GAAA;AAE/B,cAAMyC,YAAY,MAAM,KAAK3E,SAAS4E,oBAAoBT,aAAaC,OAAAA;AACvE,YAAIO,WAAW;AACX,gBAAM,KAAK3E,SAAS6E,WAAWF,UAAUG,EAAE;AAC3CvE,cAAIe,KAAK,sBAAsB6C,WAAAA,IAAeC,OAAAA,EAAS;QAC3D;MACJ;MAEA,MAAcjC,cAAc4C,aAA6C;AACrE,YAAIlE,MAAMkE;AAEV,iBAASC,IAAI,GAAGA,IAAI,IAAIA,KAAK;AACzB,cAAI;AACA,kBAAMC,OAAO,MAAMpG,IAAGoG,KAAKpE,GAAAA;AAC3B,gBAAI,CAACoE,KAAKC,YAAW,GAAI;AACrBrE,oBAAM9B,MAAKoG,QAAQtE,GAAAA;AACnB;YACJ;UACJ,QAAQ;AACJA,kBAAM9B,MAAKoG,QAAQtE,GAAAA;AACnB;UACJ;AAEA,cAAIA,QAAQ,KAAKhB,cAAc,CAACgB,IAAImB,WAAW,KAAKnC,UAAU,EAAG,QAAO;AAExE,cAAI;AACA,kBAAMhB,IAAG4B,OAAO1B,MAAKmD,KAAKrB,KAAK,cAAA,CAAA;AAC/B,mBAAOA;UACX,QAAQ;UACR;AACAA,gBAAM9B,MAAKoG,QAAQtE,GAAAA;QACvB;AACA,eAAO;MACX;MAEA,MAAcD,iBAAgE;AAC1E,cAAMwE,UAAgD,CAAA;AAEtD,cAAMC,eAAe,8BAAOC,WAAAA;AACxB,gBAAMC,aAAa,MAAM1G,IAAG2G,QAAQF,QAAQ;YAACG,eAAe;UAAI,CAAA,EAAG7C,MAAM,MAAM,CAAA,CAAE;AACjF,qBAAW8C,OAAOH,YAAY;AAC1B,gBAAI,CAACG,IAAIR,YAAW,KAAM,CAACQ,IAAIC,eAAc,EAAI;AACjD,kBAAMC,aAAa7G,MAAKmD,KAAKoD,QAAQI,IAAIG,IAAI;AAC7C,kBAAMtC,aAAa,MAAM,KAAKxD,UAAUyD,eAAeoC,UAAAA;AACvD,gBAAIrC,YAAY;AACZ6B,sBAAQU,KAAK;gBAAC/G,MAAM6G;gBAAY3E,KAAKlC,MAAKuD,SAAS,KAAKzC,YAAY+F,UAAAA;cAAW,CAAA;YACnF;UACJ;QACJ,GAVqB;AAYrB,YAAIG;AACJ,YAAI;AACAA,uBAAa,MAAMlH,IAAG2G,QAAQ,KAAK3F,YAAY;YAAC4F,eAAe;UAAI,CAAA;QACvE,QAAQ;AACJ,iBAAOL;QACX;AAEA,mBAAWY,SAASD,YAAY;AAC5B,cAAI,CAACC,MAAMd,YAAW,KAAM,CAACc,MAAML,eAAc,EAAI;AACrD,cAAIK,MAAMH,SAAS,kBAAkBG,MAAMH,KAAK7D,WAAW,GAAA,EAAM;AACjE,gBAAMiE,YAAYlH,MAAKmD,KAAK,KAAKrC,YAAYmG,MAAMH,IAAI;AAEvD,cAAIG,MAAMH,KAAK7D,WAAW,GAAA,GAAM;AAC5B,kBAAMkE,eAAe,MAAMrH,IAAG2G,QAAQS,WAAW;cAACR,eAAe;YAAI,CAAA,EAAG7C,MAAM,MAAM,CAAA,CAAE;AACtF,uBAAWuD,cAAcD,cAAc;AACnC,kBAAI,CAACC,WAAWjB,YAAW,KAAM,CAACiB,WAAWR,eAAc,EAAI;AAC/D,oBAAMN,aAAatG,MAAKmD,KAAK+D,WAAWE,WAAWN,IAAI,CAAA;YAC3D;UACJ,OAAO;AACH,kBAAMR,aAAaY,SAAAA;UACvB;QACJ;AAEA,eAAOb;MACX;MAEA,MAAcrE,iBAAiBsB,WAAoC;AAC/D,cAAM+D,UAAUrH,MAAKmD,KAAKG,WAAW,MAAA;AACrC,cAAMvB,OAAOnC,YAAW,QAAA;AACxB,cAAM0H,QAAQ,MAAM,KAAKC,QAAQF,OAAAA;AACjCC,cAAME,KAAI;AACV,mBAAWC,QAAQH,OAAO;AACtB,gBAAMI,UAAU,MAAM5H,IAAG6H,SAASF,IAAAA;AAClC1F,eAAK6F,OAAOH,KAAKI,MAAMR,QAAQ7E,MAAM,CAAA;AACrCT,eAAK6F,OAAOF,OAAAA;QAChB;AACA,eAAO3F,KAAK+F,OAAO,KAAA;MACvB;MAEA,MAAcP,QAAQzF,KAAgC;AAClD,cAAMuE,UAAoB,CAAA;AAC1B,cAAM0B,UAAU,MAAMjI,IAAG2G,QAAQ3E,KAAK;UAAC4E,eAAe;QAAI,CAAA;AAC1D,mBAAWO,SAASc,SAAS;AACzB,gBAAMC,OAAOhI,MAAKmD,KAAKrB,KAAKmF,MAAMH,IAAI;AACtC,cAAIG,MAAMd,YAAW,GAAI;AACrBE,oBAAQU,KAAI,GAAI,MAAM,KAAKQ,QAAQS,IAAAA,CAAAA;UACvC,OAAO;AACH3B,oBAAQU,KAAKiB,IAAAA;UACjB;QACJ;AACA,eAAO3B;MACX;IACJ;;;;;;;;;;;;;;ACnRA,IAAA4B,eAAA;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACTA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAUnBC,mBAGOC;;;;AAZb,IAAAC;AACA;AACA;AAEA;AAEA;AACA;;;AAEA,IAAMF,oBAAoB;AAGnB,IAAMC,iBAAN,cAA6BE,YAAAA;aAAAA;;;;;;;;;;;;MAChC,YACqBC,WACAC,QACAC,YACAC,UACAC,eACAC,IACAC,cACAC,SACAC,OACnB;AACE,cAAK,GAAA,KAVYR,YAAAA,WAAAA,KACAC,SAAAA,QAAAA,KACAC,aAAAA,YAAAA,KACAC,WAAAA,UAAAA,KACAC,gBAAAA,eAAAA,KACAC,KAAAA,IAAAA,KACAC,eAAAA,cAAAA,KACAC,UAAAA,SAAAA,KACAC,QAAAA;MAGrB;MAEA,MAAMC,wBAAwBC,YAAoBC,UAA6C;AAC3F,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,uBAAuB;AAErD,cAAMK,WAAW,MAAM,KAAKZ,WAAWa,QAAQJ,SAASK,WAAW;AACnE,YAAI,CAACF,UAAU;AACXF,UAAAA,QAAOK,KAAK,YAAYN,SAASK,WAAW,uCAAuC;AACnF,iBAAO;QACX;AAEA,YAAIE,OAAOJ,SAASK,kBACd,MAAM,KAAKC,WAAWN,SAASK,eAAe,IAC9C;AAEN,YAAI,CAACD,QAAQJ,SAASO,WAAW;AAC7B,gBAAMC,SAAS,MAAM,KAAKnB,SAASY,QAAQD,SAASO,SAAS;AAC7D,cAAIC,QAAQC,yBAAyB;AACjCL,mBAAO,MAAM,KAAKE,WAAWE,OAAOC,uBAAuB;UAC/D;QACJ;AAEA,YAAI,CAACL,MAAM;AACPN,UAAAA,QAAOY,MAAM,sCAAsCV,SAASW,IAAI,YAAYX,SAASY,IAAI,GAAG;AAC5F,iBAAO;QACX;AAEA,cAAMC,eAAe,IAAIC,KAAKjB,SAASkB,UAAU;AACjD,cAAMC,QAAQ,MAAM,KAAKC,YAAYb,KAAKc,IAAIL,YAAAA;AAC9C,YAAI,CAACG,OAAO;AACRlB,UAAAA,QAAOY,MAAM,uCAAuCN,KAAKO,IAAI,OAAOd,SAASkB,UAAU,EAAE;AACzF,iBAAO;QACX;AAEA,cAAMI,eAAe,MAAM,KAAKC,oBAAoBJ,MAAME,IAAIrB,SAASwB,cAAcxB,SAASK,WAAW;AACzG,YAAI,CAACiB,cAAc;AACfrB,UAAAA,QAAOY,MAAM,wBAAwBb,SAASwB,YAAY,aAAaL,MAAML,IAAI,EAAE;AACnF,iBAAO;QACX;AAEA,cAAMW,iBAAiBzB,SAAS0B,UAAUC;AAE1C,YAAIF,gBAAgB;AAChB,gBAAMG,aAAa,MAAM,KAAKnC,cAAcoC,gBAAgB1B,SAASY,IAAI;AACzE,cAAIa,YAAY;AACZ,kBAAME,aAAaF,WAAWG,cAAcN,gBAAgBH,YAAAA;AAE5D,kBAAMU,cAA8D;cAChEC,aAAalC;cACbmC,WAAWC,SAASC;cACpBC,kBAAkBlB,MAAME;cACxBiB,cAAcb,eAAec,SAAS;cACtCC,eAAef,eAAegB,UAAU;cACxCC,mBAAmBjB,eAAekB,cAAc;cAChDC,oBAAoBnB,eAAeoB,eAAe;cAClDC,YAAYhB,WAAWgB;cACvBC,aAAajB,WAAWiB;cACxBC,iBAAiBlB,WAAWmB,OAAON,YAAYO,QAAQ;cACvDC,kBAAkBrB,WAAWmB,OAAOJ,aAAaK,QAAQ;cACzDE,YAAYtB,WAAWsB;cACvBC,UAAU9C,KAAK8C;cACf3B,UAAUI,WAAWmB;YACzB;AAEA,kBAAM,KAAK3D,OAAOgE,OAAOtB,WAAAA;AACzB,kBAAM,KAAKuB,mBAAmBxD,YAAY+B,WAAWsB,UAAU;AAE/DnD,YAAAA,QAAOY,MAAM,gCAAgCd,UAAAA,MAAgB+B,WAAWsB,WAAWI,QAAQ,CAAA,CAAA,KAAOxD,SAASwB,YAAY,GAAG;AAC1H,mBAAOM,WAAWsB;UACtB;QACJ;AAEA,cAAMK,SAAS,KAAKC,cAAc1D,QAAAA;AAClC,cAAMkD,OAAO,KAAKS,YAAYrC,cAAcmC,MAAAA;AAE5C,cAAMzB,aAA8D;UAChEC,aAAalC;UACbmC,WAAWC,SAASC;UACpBC,kBAAkBlB,MAAME;UACxBiB,cAAcmB,OAAOlB;UACrBC,eAAeiB,OAAOhB;UACtBC,mBAAmBe,OAAOG;UAC1BhB,oBAAoBa,OAAOI;UAC3Bf,YAAYI,KAAKY;UACjBf,aAAaG,KAAKa;UAClBf,iBAAiBE,KAAKc;UACtBb,kBAAkBD,KAAKe;UACvBb,YAAYF,KAAKgB;UACjBb,UAAU9C,KAAK8C;QACnB;AAEA,cAAM,KAAK/D,OAAOgE,OAAOtB,UAAAA;AAEzB,cAAM,KAAKuB,mBAAmBxD,YAAYmD,KAAKgB,SAAS;AAExDjE,QAAAA,QAAOY,MAAM,gCAAgCd,UAAAA,MAAgBmD,KAAKgB,UAAUV,QAAQ,CAAA,CAAA,KAAOxD,SAASwB,YAAY,GAAG;AACnH,eAAO0B,KAAKgB;MAChB;MAEA,MAAMC,eAAenE,UAAiE;AAClF,cAAMG,WAAW,MAAM,KAAKZ,WAAWa,QAAQJ,SAASK,WAAW;AACnE,YAAI,CAACF,SAAU,QAAO;AAEtB,YAAII,OAAOJ,SAASK,kBACd,MAAM,KAAKnB,UAAU+E,aAAajE,SAASK,eAAe,IAC1D;AAEN,YAAI,CAACD,QAAQJ,SAASO,WAAW;AAC7B,gBAAMC,SAAS,MAAM,KAAKnB,SAASY,QAAQD,SAASO,SAAS;AAC7D,cAAIC,QAAQC,yBAAyB;AACjCL,mBAAO,MAAM,KAAKlB,UAAU+E,aAAazD,OAAOC,uBAAuB;UAC3E;QACJ;AAEA,YAAI,CAACL,KAAM,QAAO;AAElB,cAAMS,eAAe,IAAIC,KAAKjB,SAASkB,UAAU;AACjD,cAAMC,QAAQ,MAAM,KAAK9B,UAAUgF,mBAAmB9D,KAAKc,IAAIL,YAAAA;AAC/D,YAAI,CAACG,MAAO,QAAO;AAEnB,cAAMG,eAAe,MAAM,KAAKC,oBAAoBJ,MAAME,IAAIrB,SAASwB,cAAcxB,SAASK,WAAW;AACzG,YAAI,CAACiB,aAAc,QAAO;AAE1B,cAAMG,iBAAiBzB,SAAS0B,UAAUC;AAE1C,YAAIF,gBAAgB;AAChB,gBAAMG,aAAa,MAAM,KAAKnC,cAAcoC,gBAAgB1B,SAASY,IAAI;AACzE,cAAIa,YAAY;AACZ,kBAAME,aAAaF,WAAWG,cAAcN,gBAAgBH,YAAAA;AAC5D,mBAAO;cACHY,WAAWC,SAASC;cACpBC,kBAAkBlB,MAAME;cACxBiB,cAAcb,eAAec,SAAS;cACtCC,eAAef,eAAegB,UAAU;cACxCC,mBAAmBjB,eAAekB,cAAc;cAChDC,oBAAoBnB,eAAeoB,eAAe;cAClDC,YAAYhB,WAAWgB;cACvBC,aAAajB,WAAWiB;cACxBC,iBAAiBlB,WAAWmB,OAAON,YAAYO,QAAQ;cACvDC,kBAAkBrB,WAAWmB,OAAOJ,aAAaK,QAAQ;cACzDE,YAAYtB,WAAWsB;cACvBC,UAAU9C,KAAK8C;cACf3B,UAAUI,WAAWmB;YACzB;UACJ;QACJ;AAEA,cAAMQ,SAAS,KAAKC,cAAc1D,QAAAA;AAClC,cAAMkD,OAAO,KAAKS,YAAYrC,cAAcmC,MAAAA;AAC5C,eAAO;UACHvB,WAAWC,SAASC;UACpBC,kBAAkBlB,MAAME;UACxBiB,cAAcmB,OAAOlB;UACrBC,eAAeiB,OAAOhB;UACtBC,mBAAmBe,OAAOG;UAC1BhB,oBAAoBa,OAAOI;UAC3Bf,YAAYI,KAAKY;UACjBf,aAAaG,KAAKa;UAClBf,iBAAiBE,KAAKc;UACtBb,kBAAkBD,KAAKe;UACvBb,YAAYF,KAAKgB;UACjBb,UAAU9C,KAAK8C;QACnB;MACJ;MAEA,MAAMiB,iBAAiBvE,YAAqC;AACxD,cAAMwE,SAAS,MAAM,KAAKC,gBACtB,cAAc;UAACzE;SAAW;AAE9B,eAAOwE,OAAOL;MAClB;MAEA,MAAMO,6BAA6BC,MAAYC,IAAUC,YAGtD;AACC,cAAM3E,UAAS,KAAKC,KAAK,KAAKuE,4BAA4B;AAE1D,cAAMI,aAAa;UAAC;UAAuB;;AAC3C,cAAMC,SAAgB;UAACJ,KAAKK,YAAW;UAAIJ,GAAGI,YAAW;;AAEzD,YAAIH,YAAY;AACZC,qBAAWG,KAAK,qBAAqBF,OAAOG,SAAS,CAAA,EAAG;AACxDH,iBAAOE,KAAKJ,UAAAA;QAChB;AAEA3E,QAAAA,QAAOiF,KAAK,wBAAwBR,KAAKK,YAAW,CAAA,OAASJ,GAAGI,YAAW,CAAA,GAAKH,aAAa,aAAaA,UAAAA,KAAe,EAAA,EAAI;AAE7H,cAAML,SAAS,MAAM,KAAKC,gBAAgBK,WAAWM,KAAK,OAAA,GAAUL,MAAAA;AAEpE7E,QAAAA,QAAOiF,KAAK,gBAAgBX,OAAOa,QAAQ,4BAA4Bb,OAAOL,UAAUV,QAAQ,CAAA,CAAA,EAAI;AACpG,eAAOe;MACX;MAEA,MAAc9D,WAAoB4E,QAAmC;AACjE,cAAMC,MAAM,gBAAgBD,MAAAA;AAC5B,cAAME,SAAS,MAAM,KAAK1F,MAAM2F,IAAOF,GAAAA;AACvC,YAAIC,OAAQ,QAAOA;AACnB,cAAMhF,OAAO,MAAM,KAAKlB,UAAU+E,aAAaiB,MAAAA;AAC/C,YAAI9E,KAAM,OAAM,KAAKV,MAAM4F,IAAIH,KAAK/E,MAAMtB,iBAAAA;AAC1C,eAAOsB;MACX;MAEA,MAAca,YAAqBiE,QAAgBK,MAA+B;AAC9E,cAAMC,UAAUD,KAAKX,YAAW,EAAGa,MAAM,GAAG,EAAA;AAC5C,cAAMN,MAAM,iBAAiBD,MAAAA,IAAUM,OAAAA;AACvC,cAAMJ,SAAS,MAAM,KAAK1F,MAAM2F,IAAOF,GAAAA;AACvC,YAAIC,OAAQ,QAAOA;AACnB,cAAMpE,QAAQ,MAAM,KAAK9B,UAAUgF,mBAAmBgB,QAAQK,IAAAA;AAC9D,YAAIvE,MAAO,OAAM,KAAKtB,MAAM4F,IAAIH,KAAKnE,OAAOlC,iBAAAA;AAC5C,eAAOkC;MACX;MAEA,MAAcqD,gBAAgBqB,aAAqBf,QAGhD;AACC,cAAM7E,UAAS,KAAKC,KAAK,KAAKsE,eAAe;AAE7C,eAAO,KAAK9E,GAAGoG,SAAS,OAAOC,WAAAA;AAE3B,gBAAMA,OAAOC,MACT;;uFAEuEH,WAAAA,KACvEf,MAAAA;AAKJ,gBAAMmB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCA6FSJ,WAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiC7B,gBAAMK,eAAe,MAAMH,OAAOC,MAAMC,aAAanB,MAAAA;AACrD,gBAAMP,SAAS2B,aAAaC,KAAK,CAAA,KAAM;YAACC,WAAW;YAAGhD,YAAY;UAAC;AAGnE,gBAAM2C,OAAOC,MACT;;;;;mFAKmEH,WAAAA,KACnEf,MAAAA;AAGJ7E,UAAAA,QAAOiF,KAAK,qBAAqBX,OAAO6B,SAAS,eAAe;AAChE,iBAAO;YAAChB,UAAUb,OAAO6B;YAAWlC,WAAWK,OAAOnB;UAAU;QACpE,CAAA;MACJ;MAEA,MAAc7B,oBAAoB8E,SAAiBC,aAAqB1B,YAAuD;AAC3H,cAAM2B,QAAQ,MAAM,KAAK3G,QAAQ4G,iBAAiBF,aAAa1B,UAAAA;AAC/D,cAAM6B,aAAaC,mBAAmBJ,WAAAA,EAAaG;AAEnD,cAAMlC,SAAS,MAAM,KAAKlF,UAAUkC,oBAAoB8E,SAASC,aAAa;UAC1E,GAAGK,YAAY;YAACC,SAASL,OAAOlF;YAAIwF,cAAcN,OAAOO;UAAa,CAAA;UACtEC,gBAAgBN;QACpB,CAAA;AACA,YAAIlC,OAAQ,QAAOA;AAGnB,cAAMyC,YAAY,MAAM,KAAKrH,aAAasH,YAAYX,WAAAA;AACtD,YAAIU,WAAWE,QAAQ;AACnB,iBAAO,KAAK7H,UAAU8H,iBAAiBd,SAASW,UAAUE,MAAM;QACpE;AAEA,eAAO;MACX;MAEQxD,cAAc1D,UAAkD;AACpE,cAAMoH,WAAWpH,SAAS0B,UAAU2F;AAEpC,eAAO;UACH9E,OAAOvC,SAASsC,gBAAgB;UAChCG,QAAQzC,SAASwC,iBAAiB;UAClCoB,WAAWwD,UAAUE,2BAA2BF,UAAUG,iBAAiB;UAC3E1D,YAAYuD,UAAUI,+BAA+B;QACzD;MACJ;MAEQ7D,YAAY8D,SAA4BhE,QAAmD;AAC/F,YAAIiE,oBAAoBC,OAAOF,QAAQ3E,UAAU;AACjD,YAAI8E,qBAAqBD,OAAOF,QAAQ1E,WAAW;AAEnD,YAAI0E,QAAQI,qBAAqBJ,QAAQK,uBAAuBL,QAAQM,sBAAsB;AAC1F,gBAAMC,aAAavE,OAAOlB,QAAQkB,OAAOG,YAAYH,OAAOI;AAC5D,cAAImE,aAAaP,QAAQI,mBAAmB;AACxCH,gCAAoBC,OAAOF,QAAQK,mBAAmB;AACtDF,iCAAqBD,OAAOF,QAAQM,oBAAoB;UAC5D;QACJ;AAEA,cAAMjE,YAAYL,OAAOlB,QAAQmF;AACjC,cAAM3D,aAAaN,OAAOhB,SAASmF;AACnC,cAAM5D,gBAAgBP,OAAOG,YAAY+D,OAAOF,QAAQzE,eAAe;AACvE,cAAMiB,iBAAiBR,OAAOI,aAAa8D,OAAOF,QAAQtE,gBAAgB;AAE1E,eAAO;UACHW;UACAC;UACAC;UACAC;UACAC,WAAWJ,YAAYC,aAAaC,gBAAgBC;QACxD;MACJ;MAEA,MAAcV,mBAAmBxD,YAAoBmD,MAA6B;AAC9E,cAAM,KAAKxD,GAAGsG,MACV;;6BAGA;UAAC9C;UAAMnD;SAAW;MAE1B;IACJ;;;;;;;;;;;;;;;;;;;;ACldA,OAAO;AACP,SAAQkI,cAAAA,oBAAiB;;;;;;;;;;IAQnBC,eAEAC,wBAMAC,yBAQAC,qBAaOC;;;;AApCb,IAAAC;AAIA;;;AAGA,IAAML,gBAAgB;AAEtB,IAAMC,yBAAyB,oBAAIK,IAAI;MACnC;MAAc;MAAmB;MAAkB;MAAe;MAClE;MAAuB;MAAW;MAAqB;MAAgB;MACvE;MAAa;MAAc;MAAiB;MAAoB;MAAe;KAClF;AAED,IAAMJ,0BAA0B,oBAAII,IAAI;MACpC;MAAmB;MAAc;MAAkB;MAAe;MAClE;MAAW;MAAqB;MAChC;MAAU;MAAY;MAAgB;MAAa;MAAgB;MACnE;MAAgB;MAAuB;MAAyB;MAChE;MAAQ;MAAS;MAAc;KAClC;AAED,IAAMH,sBAAsB,oBAAIG,IAAI;MAChC;MAAe;MAAa;MAAoB;MAAgB;MAChE;MAAqB;MAAsB;MAAc;MACzD;MAAmB;MAAoB;MAAc;MAAY;KACpE;AASM,IAAMF,mBAAN,cAA+BG,YAAAA;aAAAA;;;;MAElC,YACqBC,wBACnB;AACE,cAAK,GAAA,KAFYA,yBAAAA;MAGrB;MAEA,MAAMC,sBAAkD;AACpD,cAAMC,QAAQ,MAAM,KAAKF,uBAAuBG,kBAAiB;AACjE,eAAOD,MAAME,IAAI,CAAC,EAACC,WAAWC,SAAQ,OAAO;UACzCD;UACAE,MAAMD;UACNE,SAASH,UAAUG;QACvB,EAAA;MACJ;MAEA,MAAMC,eAAeC,aAA+D;AAChF,YAAI;AACA,gBAAMH,OAAO,MAAM,KAAKP,uBAAuBW,YAAYD,WAAAA;AAC3D,iBAAOH,KAAKD,SAASG,eAAc;QACvC,SAASG,OAAO;AACZ,iBAAO;YAACC,IAAI;YAAOD,OAAOA,iBAAiBE,QAAQF,MAAMG,UAAUC,OAAOJ,KAAAA;UAAM;QACpF;MACJ;MAEA,MAAMK,yBAAyBC,UAAkBC,QAG9C;AACC,cAAMC,SAAS,KAAKpB,uBAAuBqB,oBAAoBH,QAAAA;AAC/D,YAAI,CAACE,OAAQ,QAAO;UAACP,IAAI;UAAOD,OAAO;QAAkB;AAEzD,YAAIN,WAAsC;AAC1C,YAAI;AACAA,qBAAW,MAAMc,OAAOE,eAAeH,MAAAA;AACvC,gBAAMb,SAASiB,QAAO;AACtB,gBAAMC,SAAS,MAAMlB,SAASG,eAAc;AAC5C,iBAAOe;QACX,SAASZ,OAAO;AACZ,iBAAO;YAACC,IAAI;YAAOD,OAAOA,iBAAiBE,QAAQF,MAAMG,UAAUC,OAAOJ,KAAAA;UAAM;QACpF,UAAA;AACI,cAAIN,UAAU;AACV,gBAAI;AACA,oBAAMA,SAASmB,WAAU;YAC7B,QAAQ;YACR;UACJ;QACJ;MACJ;MAEAC,gBAAgBlB,SAAkE;AAC9E,cAAMmB,SAAmB,CAAA;AAEzB,mBAAWC,WAAW;UAAC;UAAW;UAAY;WAAkB;AAC5D,gBAAMC,IAAIrB,QAAQoB,OAAAA;AAClB,cAAI,CAACC,EAAG;AAER,cAAI,CAACrC,cAAcsC,KAAKD,EAAEE,KAAK,GAAG;AAC9BJ,mBAAOK,KAAK,GAAGJ,OAAAA,WAAkBC,EAAEE,KAAK,iCAAiC;UAC7E;AAEA,gBAAME,gBAAgBL,YAAY,YAAYnC,yBACxCmC,YAAY,aAAalC,0BACrBC;AAEV,qBAAW,CAACuC,WAAWC,WAAAA,KAAgBC,OAAOC,QAAQR,EAAES,MAAM,GAAG;AAC7D,gBAAI,CAAC9C,cAAcsC,KAAKI,SAAAA,GAAY;AAChCP,qBAAOK,KAAK,GAAGJ,OAAAA,2BAAkCM,SAAAA,iCAA0C;YAC/F;AACA,gBAAI,CAACC,YAAYI,WAAW,OAAA,KAAY,CAACN,cAAcO,IAAIL,WAAAA,GAAc;AACrER,qBAAOK,KAAK,GAAGJ,OAAAA,oBAA2BO,WAAAA,yCAAoD;YAClG;UACJ;QACJ;AAEA,eAAO;UAACM,OAAOd,OAAOe,WAAW;UAAGf;QAAM;MAC9C;MAEAgB,eAAezB,UAAkBC,QAA6ByB,iBAG5D;AACE,cAAMxB,SAAS,KAAKpB,uBAAuBqB,oBAAoBH,QAAAA;AAC/D,YAAI,CAACE,OAAQ,QAAO;UAACqB,OAAO;UAAOd,QAAQ;YAAC;;QAAmB;AAE/D,cAAMkB,SAASzB,OAAO0B,YAAS;AAC/B,cAAMnB,SAAmB,CAAA;AAEzB,cAAMoB,WAAYF,QAAQG,YAAYD,YAAyB,CAAA;AAC/D,cAAME,YAAY,IAAInD,IAAI+C,QAAQG,YAAYC,aAAa,CAAA,CAAE;AAC7D,mBAAWC,SAASH,UAAU;AAC1B,cAAIH,mBAAmBK,UAAUT,IAAIU,KAAAA,EAAQ;AAC7C,cAAI/B,OAAO+B,KAAAA,MAAWC,UAAahC,OAAO+B,KAAAA,MAAW,QAAQ/B,OAAO+B,KAAAA,MAAW,IAAI;AAC/EvB,mBAAOK,KAAK,mBAAmBkB,KAAAA,cAAmB;UACtD;QACJ;AAEA,eAAO;UAACT,OAAOd,OAAOe,WAAW;UAAGf;QAAM;MAC9C;MAEAyB,oBAAoB/C,WAAsBa,UAA6B;AACnE,cAAME,SAAS,KAAKpB,uBAAuBqB,oBAAoBH,QAAAA;AAC/D,YAAI,CAACE,OAAQ,QAAOf;AAEpB,cAAM4C,YAAY,IAAInD,IAAIsB,OAAO0B,YAAS,GAAME,YAAYC,aAAa,CAAA,CAAE;AAC3E,cAAMI,eAAe;UAAC,GAAGhD,UAAUiD;QAAiB;AAEpD,mBAAWC,OAAOnB,OAAOoB,KAAKH,YAAAA,GAAe;AACzC,cAAIJ,UAAUT,IAAIe,GAAAA,KAAQF,aAAaE,GAAAA,KAAQ,MAAM;AACjDF,yBAAaE,GAAAA,IAAO;cAACE,QAAQ;YAAI;UACrC;QACJ;AAEA,eAAO;UAAC,GAAGpD;UAAWiD,mBAAmBD;QAAY;MACzD;IAEJ;;;;;;;;;;;;AC3JA,OAAO;AACP,SAAQK,cAAAA,oBAAiB;;;;;;;;;;IAKZC;;;;AAJb,IAAAC;;;AAIO,IAAMD,sBAAN,cAAkCE,YAAAA;aAAAA;;;MAErC,cAAc;AACV,cAAK;MACT;MAEAC,oBACIC,gBACAC,MACmB;AACnB,eAAO,KAAKC,YAAYF,eAAeG,QAAQF,KAAKG,WAAW,CAAC,GAAGH,IAAAA;MACvE;MAEAI,qBACIL,gBACAC,MACmB;AACnB,eAAO,KAAKC,YAAYF,eAAeG,QAAQF,KAAKK,YAAY,CAAC,GAAGL,IAAAA;MACxE;MAEAM,iBACIP,gBACAC,MACAO,YACmB;AACnB,cAAMC,aAAa;UAAC,GAAIR,KAAKS,QAAQ,CAAC;UAAIC,aAAaH;QAAU;AACjE,eAAO,KAAKN,YAAYF,eAAeG,QAAQM,YAAYR,IAAAA;MAC/D;MAEQC,YACJC,QACAS,eACAX,MACmB;AACnB,cAAMY,SAA8B,CAAC;AAErC,mBAAW,CAACC,cAAcC,WAAAA,KAAgBC,OAAOC,QAAQd,MAAAA,GAAS;AAC9D,cAAIY,YAAYG,WAAW,OAAA,GAAU;AACjCL,mBAAOC,YAAAA,IAAgB,KAAKK,eAAelB,KAAKmB,MAAML,YAAYM,MAAM,CAAA,CAAA;UAC5E,OAAO;AACHR,mBAAOC,YAAAA,IAAgBF,cAAcG,WAAAA,KAAgB;UACzD;QACJ;AAEA,eAAOF;MACX;MAEQM,eAAeG,KAAUC,OAAmB;AAChD,cAAMC,QAAQD,MAAKE,MAAM,GAAA;AACzB,YAAIC,UAAUJ;AACd,mBAAWK,QAAQH,OAAO;AACtB,cAAIE,WAAW,KAAM,QAAO;AAC5BA,oBAAUA,QAAQC,IAAAA;QACtB;AACA,eAAOD,WAAW;MACtB;IACJ;;;;;;;;;;AC9DA,OAAO;AACP,SAAQE,QAAQC,cAAAA,oBAAiB;;;;;;;;;;;;;;;IAepBC;;;;AAdb;AACA,IAAAC;AAGA,IAAAC;AAEA;AACA,IAAAC;AACA;AACA;AACA;;;;AAIO,IAAMH,eAAN,cAA2BI,YAAAA;aAAAA;;;;;;;;;;MAE9B,YACqBC,qBACgCC,gBACzCC,WACAC,YACAC,gBACAC,kBACAC,gBACV;AACE,cAAK,GAAA,KARYN,sBAAAA,qBAAAA,KACgCC,iBAAAA,gBAAAA,KACzCC,YAAAA,WAAAA,KACAC,aAAAA,YAAAA,KACAC,iBAAAA,gBAAAA,KACAC,mBAAAA,kBAAAA,KACAC,iBAAAA;AAGR,aAAKC,IAAIC,KAAK,0BAAA;MAClB;MAEA,MAAMC,WAAWC,QAA0C;AACvD,cAAMC,UAAS,KAAKC,KAAK,KAAKH,UAAU;AACxC,cAAMI,YAAYC,KAAKC,IAAG;AAE1B,YAAI;AACA,gBAAMC,KAAK,MAAM,KAAKhB,oBAAoBiB,oBAAoBP,OAAOQ,SAASC,EAAE;AAChF,gBAAMC,oBAAoB,MAAMJ,GAAGK,aAAaX,MAAAA;AAEhD,gBAAMY,YAAiC;YACnCC,SAASH;YACTI,MAAMd;UACV;AAGA,gBAAM,KAAKR,UAAUuB,OAAOL,iBAAAA;AAC5BT,UAAAA,QAAOH,KAAK,kBAAkBY,kBAAkBM,UAAU,OAAOZ,KAAKC,IAAG,IAAKF,SAAAA,IAAa;AAE3F,gBAAMc,aAAa,MAAM,KAAKtB,iBAAiBuB,oBAAmB;AAClE,cAAID,WAAWE,SAAS,GAAG;AACvB,kBAAM,KAAKC,mBAAmBH,YAAYL,WAAWZ,OAAOqB,WAAWlB,SAAAA;UAC3E;QACJ,SAASmB,OAAO;AACZrB,UAAAA,QAAOqB,MAAM,0BAA0BA,iBAAiBC,QAAQD,MAAME,UAAU,eAAA,IAAmB;YAC/FH,WAAWrB,OAAOqB;YAClBC;YACAG,UAAUrB,KAAKC,IAAG,IAAKF;UAC3B,CAAA;AACA,gBAAMmB;QACV;MACJ;MAEA,MAAMI,YAAY1B,QAA0C;AACxD,cAAMC,UAAS,KAAKC,KAAK,KAAKwB,WAAW;AACzC,cAAMvB,YAAYC,KAAKC,IAAG;AAE1B,YAAI;AACA,gBAAMC,KAAK,MAAM,KAAKhB,oBAAoBiB,oBAAoBP,OAAOQ,SAASC,EAAE;AAChF,gBAAMkB,WAAW,MAAMrB,GAAGsB,QAAQC,6BAA6B7B,QAAQA,OAAO8B,QAAQ;AACtF,gBAAMC,qBAAqB,MAAMzB,GAAG0B,cAAcL,UAAU3B,OAAOiC,aAAa;AAEhF,cAAIC,WAAuC;AAC3C,cAAI;AACAA,uBAAW,MAAM,KAAKxC,eAAeyC,eAAe;cAChD,GAAGJ;cACHtB,IAAI;YACR,CAAA;UACJ,SAAS2B,cAAc;AACnBnC,YAAAA,QAAOoC,KAAK,4BAA4BD,wBAAwBb,QAAQa,aAAaZ,UAAU,eAAA,EAAiB;UACpH;AAEA,gBAAMZ,YAAiC;YACnCE,MAAMd;YACNsC,UAAUP;UACd;AACA,cAAIG,UAAU;AACVtB,sBAAU2B,OAAOL;UACrB;AAEA,gBAAMM,SAAS,MAAM,KAAK/C,WAAWsB,OAAOgB,kBAAAA;AAC5C9B,UAAAA,QAAOwC,MAAM,mBAAmBV,mBAAmBf,UAAU,SAASwB,QAAQ/B,EAAAA,QAAUL,KAAKC,IAAG,IAAKF,SAAAA,IAAa;AAElH,cAAIqC,QAAQ/B,IAAI;AACZ,gBAAI;AACA,oBAAM,KAAKf,eAAegD,wBAAwBF,OAAO/B,IAAI;gBACzD,GAAGsB;gBACHtB,IAAI+B,OAAO/B;cACf,CAAA;YACJ,SAAS2B,cAAc;AACnBnC,cAAAA,QAAOoC,KAAK,mCAAmCG,OAAO/B,EAAE,KAAK2B,wBAAwBb,QAAQa,aAAaZ,UAAU,eAAA,EAAiB;YACzI;UACJ;AAEA,gBAAMP,aAAa,MAAM,KAAKtB,iBAAiBuB,oBAAmB;AAClE,cAAID,WAAWE,SAAS,GAAG;AACvB,kBAAM,KAAKC,mBAAmBH,YAAYL,WAAWZ,OAAOqB,WAAWlB,SAAAA;UAC3E;QACJ,SAASmB,OAAO;AACZrB,UAAAA,QAAOqB,MAAM,2BAA2BA,iBAAiBC,QAAQD,MAAME,UAAU,eAAA,IAAmB;YAChGH,WAAWrB,OAAOqB;YAClBC;YACAG,UAAUrB,KAAKC,IAAG,IAAKF;UAC3B,CAAA;AACA,gBAAMmB;QACV;MACJ;MAEA,MAAMqB,gBAAgBC,SAA2C;AAC7D,cAAM3C,UAAS,KAAKC,KAAK,KAAKyC,eAAe;AAC7C1C,QAAAA,QAAOwC,MAAM,yBAAyBI,KAAKC,UAAUF,OAAAA,CAAAA,EAAU;AAC/D,cAAMzC,YAAYC,KAAKC,IAAG;AAC1B,YAAI;AACA,gBAAM,KAAKd,eAAewB,OAAO6B,OAAAA;QACrC,SAAStB,OAAO;AACZrB,UAAAA,QAAOqB,MAAM,+BAA+BA,iBAAiBC,QAAQD,MAAME,UAAU,eAAA,IAAmB;YACpGF;YACAG,UAAUrB,KAAKC,IAAG,IAAKF;UAC3B,CAAA;AACA,gBAAMmB;QACV;MACJ;MAEA,MAAcF,mBACVH,YACAL,WACAS,WACAlB,WACa;AACb,cAAMF,UAAS,KAAKC,KAAK,KAAKkB,kBAAkB;AAChD,cAAM2B,UAAU,MAAMC,QAAQC,WAC1BhC,WAAWiC,IAAI,CAAC,EAACC,MAAMC,QAAO,MAC1B,KAAKC,iBAAiBF,MAAMC,SAASxC,SAAAA,CAAAA,CAAAA;AAI7C,mBAAW,CAAC0C,GAAGd,MAAAA,KAAWO,QAAQQ,QAAO,GAAI;AACzC,gBAAMC,KAAKvC,WAAWqC,CAAAA,EAAGG;AACzB,gBAAMC,SAAS;YACXC,aAAaH,GAAG/C;YAChBmD,eAAeJ,GAAGK;YAClBC,UAAUN,GAAGO;YACb1C;YACAI,UAAUrB,KAAKC,IAAG,IAAKF;UAC3B;AACA,cAAIqC,OAAOwB,WAAW,YAAY;AAC9B/D,YAAAA,QAAOqB,MAAM,sBAAsB;cAAC,GAAGoC;cAAQpC,OAAOkB,OAAOyB;YAAM,CAAA;UACvE,OAAO;AACHhE,YAAAA,QAAOwC,MAAM,yBAAyBiB,MAAAA;UAC1C;QACJ;MACJ;MAEA,MAAcL,iBACVF,MACAC,SACAc,MACa;AACb,YAAId,QAAQvC,WAAWqD,KAAKrD,SAAS;AACjC,gBAAMb,SAAS,KAAKJ,eAAeuE,oBAAoBf,QAAQvC,SAASqD,IAAAA;AACxE,gBAAMf,KAAKiB,MAAMhB,QAAQvC,QAAQwD,OAAOrE,MAAAA;QAC5C;AAEA,YAAIoD,QAAQd,YAAY4B,KAAK5B,UAAU;AACnC,gBAAMgC,iBAAiB,KAAK1E,eAAe2E,qBAAqBnB,QAAQd,UAAU4B,IAAAA;AAClF,cAAIA,KAAK3B,MAAM;AACX+B,2BAAe/B,OAAO2B,KAAK3B,KAAKiC,cAAc;UAClD;AACA,gBAAMhC,SAAS,MAAMW,KAAKiB,MAAMhB,QAAQd,SAAS+B,OAAOC,cAAAA;AAExD,cAAIlB,QAAQb,QAAQ2B,KAAK3B,QAAQC,OAAO/B,IAAI;AACxC,kBAAMgE,aAAa,KAAK7E,eAAe8E,iBAAiBtB,QAAQb,MAAM2B,MAAM1B,OAAO/B,EAAE;AACrF,kBAAM0C,KAAKiB,MAAMhB,QAAQb,KAAK8B,OAAOI,UAAAA;AACrC,gBAAItB,KAAKwB,oBAAoB;AACzB,oBAAMxB,KAAKwB,mBAAmBvB,QAAQd,SAAS+B,OAAO7B,OAAO/B,IAAIyD,KAAK3B,KAAKiC,cAAc,CAAA;YAC7F;UACJ;QACJ;MACJ;IAEJ;;;;;;;;;;;;;;;;;;;AC7LA;;;;;;;ACeA;;;;;;;ACJA;;;;;;;ACXA,IAAAI,eAAA;;;;;;;;ACAA,SAAQC,QAAAA,aAAW;AAAnB,IAaaC,0BAEAC,0BAIAC,sBAEAC;AArBb;;;AAaO,IAAMH,2BAA2BD,MAAK;MAACK,QAAQ;IAAM,CAAA,EAAGC,MAAM,0BAAA;AAE9D,IAAMJ,2BAA2BF,MAAK;MACzCK,QAAQ;MAASE,QAAQ;IAC7B,CAAA,EAAGD,MAAM,0BAAA;AAEF,IAAMH,uBAAuBF,yBAAyBO,GAAGN,wBAAAA,EAA0BI,MAAM,sBAAA;AAEzF,IAAMF,oBAAoB;MAC7B,QAAQ;MACR,cAAc;QACV,UAAU;UACN,QAAQ;QACZ;QACA,UAAU;UACN,QAAQ;UACR,SAAS;YACL,QAAQ;UACZ;QACJ;MACJ;MACA,YAAY;QAAC;QAAU;;MACvB,wBAAwB;IAC5B;;;;;ACpCA,IAAAK,cAAA;;;;AACA;AACA;AACA,IAAAC;AACA;;;;;ACKO,SAASC,aACZC,IAAgF;AAEhF,SAAO,CAACC,KAAKC,KAAKC,SAAAA;AACdH,OAAGC,KAAuBC,KAAoBC,IAAAA,EAAMC,MAAMD,IAAAA;EAC9D;AACJ;AAyBA,eAAsBE,oBAClBC,QACAJ,KAAa;AAEb,MAAIK,cAAc;AAClB,mBAAiBC,QAAQF,QAAQ;AAC7B,QAAIE,KAAKC,WAAW,CAACF,aAAa;AAC9B,UAAIC,KAAKE,OAAQR,KAAIQ,OAAOF,KAAKE,MAAM;AACvCC,aAAOC,QAAQJ,KAAKC,OAAO,EAAEI,QAAQ,CAAC,CAACC,GAAGC,CAAAA,MAAOb,IAAIc,UAAUF,GAAGC,CAAAA,CAAAA;AAClER,oBAAc;IAClB;AAEA,QAAIC,KAAKS,MAAM;AACX,UAAI,CAACf,IAAIgB,MAAMV,KAAKS,IAAI,GAAG;AACvB,cAAM,IAAIE,QAAcC,CAAAA,aAAWlB,IAAImB,KAAK,SAASD,QAAAA,CAAAA;MACzD;IACJ;AAEA,QAAIZ,KAAKc,MAAM;AACXpB,UAAIqB,IAAG;IACX;EACJ;AACJ;AA7DA,IAgBsBC;AAhBtB,IAAAC,YAAA;;;IAAAC;AAQgB3B;AAQT,IAAeyB,iBAAf,cAAsCG,YAAAA;MAhB7C,OAgB6CA;;;MAC/BC,YACN1B,KACA2B,OACAC,UAAkB,yBAClBC,aAAqB,KACjB;AACJ,cAAMC,UAAS,KAAKC,KAAK,KAAKL,WAAW;AACzCI,QAAAA,QAAOH,MAAM,GAAGC,OAAAA,KAAYI,KAAKC,UAAUN,MAAMC,SAAS,MAAM,CAAA,CAAA,IAAM;UAClEM,YAAY;QAChB,CAAA;AACAlC,YAAIQ,OAAOqB,UAAAA,EAAYM,KAAK;UACxBC,SAAS;UACTT,OAAO;YACHC;YACAS,MAAMV,MAAMW,QAAQ;YACpB,GAAIC,QAAQC,IAAIC,aAAa,iBAAiB;cAACC,OAAOf,MAAMe;YAAK;UACrE;UACAC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QACrC,CAAA;MACJ;IACJ;AAEsB1C;;;;;ACdf,SAAS2C,gBAAgBC,KAAcC,cAAc,cAAY;AACpE,QAAMC,OAAOC,KAAKC,IAAI,GAAGC,SAASL,IAAIM,MAAMJ,IAAI,KAAe,CAAA;AAC/D,QAAMK,QAAQJ,KAAKK,IAAIC,WAAWN,KAAKC,IAAI,GAAGC,SAASL,IAAIM,MAAMC,KAAK,KAAeG,aAAAA,CAAAA;AACrF,QAAMC,UAAWX,IAAIM,MAAMK,WAAsBV;AACjD,QAAMW,SAAUZ,IAAIM,MAAMO,UAAqBC,YAAAA;AAC/C,QAAMD,WAAWE,kBAAkBC,IAAIJ,MAAAA,IAAWA,SAA2B;AAE7E,SAAO;IAACV;IAAMK;IAAOU,SAASf,OAAO,KAAKK;IAAOI;IAASE;EAAQ;AACtE;AAEO,SAASK,kBAAqBC,MAAWC,OAAeC,QAAwB;AACnF,SAAO;IACHC,SAAS;IACTH;IACAI,YAAY;MACRrB,MAAMmB,OAAOnB;MACbK,OAAOc,OAAOd;MACda;MACAI,aAAarB,KAAKsB,KAAKL,QAAQC,OAAOd,KAAK;IAC/C;IACAmB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;EACrC;AACJ;AA1BA,IAAMb,mBACAN,WACAC;AAFN;;;IAAMK,oBAAoB,oBAAIc,IAAI;MAAC;MAAO;KAAO;AACjD,IAAMpB,YAAY;AAClB,IAAMC,gBAAgB;AAENX;AAUAmB;;;;;ACpChB;;;;;;;ACAA;;;;;;;ACAO,SAASY,SAAYC,KAAmBC,MAAuB;AAClE,WAASC,IAAIF,IAAIG,SAAS,GAAGD,KAAK,GAAGA,KAAK;AACtC,UAAME,IAAIJ,IAAIE,CAAAA;AACd,QAAID,KAAKG,CAAAA,EAAI,QAAOA;EACxB;AACA,SAAOC;AACX;AAEO,SAASC,WACZC,OACAC,WACAC,UACAC,YAAY,MAAI;AAEhB,MAAIC,MAAM;AACV,aAAWC,QAAQL,OAAO;AACtB,QAAI,CAACC,UAAUI,IAAAA,EAAO;AACtB,UAAMC,IAAIJ,SAASG,IAAAA;AACnB,QAAI,CAACD,IAAKA,OAAME;QACXF,QAAOD,YAAYG;EAC5B;AACA,SAAOF;AACX;AAtBA;;;AAAgBZ;AAQAO;;;;;ACRhB;;;;;;;;ACAA;;;;AACA,IAAAQ;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA,OAAO;AAEP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAUZC;;;;AAXb;AAIA,IAAAC;AACA,IAAAC;AAGA,IAAAC;;;AAGO,IAAMH,kBAAN,cAA8BI,YAAAA;aAAAA;;;;MACzBC,WAAmBC,IAAIC,IAAIC;MAClBC,gBAAgBH,IAAII,MAAMD;MAC1BE,kBAAkBL,IAAII,MAAMC;MAC5BC,SAAS,oBAAIC,IAAAA;MAE9B,YACYC,cACV;AACE,cAAK,GAAA,KAFGA,eAAAA;MAGZ;MAEA,MAAMC,yBAAyBV,UAAmB;AAC9C,aAAKA,WAAWA,YAAY,KAAKA;AACjC,cAAMW,YAAY,GAAG,KAAKP,aAAa,IAAI,KAAKJ,QAAQ;AAExD,cAAM,KAAKS,aAAaG,QACpBD,WACA,OAAOE,IAAYC,YAAiB,KAAKC,iBAAiBF,IAAIC,OAAAA,GAC9D,IAAA;MAER;MAEA,MAAMC,iBAAiBC,KAAaC,MAAiB;AACjD,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,gBAAgB;AAE9C,cAAM,EAACK,UAAS,IAAIH;AACpB,cAAMZ,QAAQ,KAAKE,OAAOc,IAAID,SAAAA;AAE9B,YAAI,CAACf,OAAO;AACRa,UAAAA,QAAOI,KAAK,0CAA0CF,SAAAA,EAAW;AACjE;QACJ;AAEAf,cAAMkB,KAAKN,IAAAA;AACX,YAAIA,KAAKO,MAAM;AACXN,UAAAA,QAAOO,MAAM,6BAA6BR,KAAKS,YAAYT,KAAKU,IAAI,EAAE;AACtEtB,gBAAMuB,IAAG;AACT,eAAKrB,OAAOsB,OAAOT,SAAAA;QACvB;MACJ;MAEA,MAAMU,YAAYC,KAAqBC,KAAeC,SAA4B;AAC9E,cAAMf,UAAS,KAAKC,KAAK,KAAKW,WAAW;AACzC,cAAM,EAACV,UAAS,IAAIa;AAEpB,cAAM5B,QAAQ,IAAI6B,gBAAAA;AAClB,aAAK3B,OAAO4B,IAAIf,WAAWf,KAAAA;AAE3B0B,YAAIK,GAAG,SAAS,MAAA;AACZlB,UAAAA,QAAOmB,KAAK,qCAAqCjB,SAAAA,EAAW;AAC5Df,gBAAMuB,IAAG;AACT,eAAKrB,OAAOsB,OAAOT,SAAAA;QACvB,CAAA;AAEA,cAAM,KAAKkB,sBAAsBL,SAASb,SAAAA;AAE1C,YAAI;AACA,gBAAMmB,oBAAoBlC,OAAO2B,GAAAA;QACrC,SAASQ,OAAO;AACZtB,UAAAA,QAAOsB,MAAM,6BAA8BA,MAAgBC,OAAO,EAAE;AACpE,cAAI,CAACT,IAAIU,aAAa;AAClBV,gBAAIW,OAAO,GAAA,EAAKf,IAAG;UACvB;QACJ,UAAA;AACI,eAAKrB,OAAOsB,OAAOT,SAAAA;QACvB;MACJ;MAEA,MAAMwB,YAAwBX,SAA4BY,YAAY,KAAmB;AACrF,cAAM,EAACzB,UAAS,IAAIa;AAEpB,cAAM5B,QAAQ,IAAI6B,gBAAAA;AAClB,aAAK3B,OAAO4B,IAAIf,WAAWf,KAAAA;AAE3B,cAAM,KAAKiC,sBAAsBL,SAASb,SAAAA;AAE1C,cAAM0B,UAAU,IAAIC,QAAe,CAACC,GAAGC,WACnCC,WAAW,MAAMD,OAAO,IAAIE,MAAM,4BAA4BN,SAAAA,iBAA0BzB,SAAAA,GAAY,CAAA,GAAIyB,SAAAA,CAAAA;AAG5G,YAAI;AACA,cAAIO,MAAM;AAEV,iBAAO,MAAML,QAAQM,KAAK;aACrB,YAAA;AACG,+BAAiBpC,QAAQZ,OAAO;AAC5B,oBAAIY,KAAKU,KAAMyB,QAAOnC,KAAKU;AAC3B,oBAAIV,KAAKO,KAAM;cACnB;AACA,qBAAO4B;YACX,GAAA;YACAN;WACH;QACL,UAAA;AACI,eAAKvC,OAAOsB,OAAOT,SAAAA;QACvB;MACJ;MAEA,MAAMkB,sBAAsBL,SAA4BqB,eAAuBC,WAAmB,KAAKjD,iBAAiB;AACpH,cAAM,KAAKG,aAAa+C,eAAeD,UAAU,IAAItB,SAAS;UAACqB;QAAa,CAAA;MAChF;MAEA,MAAMG,kBAAkBC,UAAkBtC,WAAmBuC,MAAc;AACvE,cAAM,KAAKlD,aAAa+C,eAAevD,IAAII,MAAMuD,kBAAkBF,UAAUC,MAAM;UAACL,eAAelC;QAAS,CAAA;MAChH;MAEA,MAAMyC,YAAYF,MAAyB;AACvC,cAAM,KAAKlD,aAAa+C,eAAevD,IAAII,MAAMuD,kBAAkB,SAASD,MAAM;UAACL,eAAeK,KAAKvC;QAAS,CAAA;MACpH;IACJ;;;;;;;;;;;;ACzHA,IAQa0C;AARb,IAAAC,+BAAA;;;;AACA,IAAAC;AACA,IAAAC;AAMO,IAAMH,uBAAN,MAAMA;MARb,OAQaA;;;MACT,OAAOI,SAASA,eAAOC,MAAM;QAACC,WAAW;MAAsB,CAAA;MAE/D,OAAOC,YACHC,UACAC,UACAC,KACAC,UACAC,aACAC,gBAAyB,OACR;AACjB,cAAM,EAACC,MAAMC,MAAMC,SAASC,OAAOC,MAAAA,OAAMC,OAAM,IAAIT;AAEnD,YAAI,CAACF,SAAU,OAAM,IAAIY,MAAM,sBAAA;AAE/B,cAAM,EAACC,WAAWC,WAAW,GAAGC,QAAAA,IAAWR;AAE3C,cAAMS,gBAAgB,KAAKC,OACvBjB,UACAC,UACAc,SACAZ,UACAG,MACAY,YAAY;UAACR,MAAAA;UAAMC;UAAQH;UAASC;QAAK,CAAA,GACzCI,WACAC,WACAV,WAAAA;AAGJ,YAAIC,eAAe;AACfW,wBAAcX,gBAAgB;AAC9BW,wBAAcG,kBAAkBT,MAAKU,QAAQ,QAAQpB,SAASqB,IAAI,IAAI,EAAA;QAC1E;AAEA,eAAOL;MACX;MAEA,OAAOC,OACHjB,UACAC,UACAc,SACAZ,UACAG,MACAgB,oBACAT,WACAC,WACAV,aACF;AACE,YAAImB,aAAkC,CAAC;AACvC,YAAIjB,MAAM;AACN,gBAAM,EAACkB,gBAAgBC,QAAQC,WAAWC,iBAAgB,IAAIrB;AAC9D,gBAAMsB,UAAUxB,aAAayB,YAAY7B,SAAS8B;AAClDP,uBAAa;YACTC;YACAC;YACAG;YACAD;YACAD;UACJ;QACJ;AAEA,eAAOK,oBAAoB;UACvB/B;UACAC;UACAc;UACAZ;UACA6B,aAAajB,QAAQkB,WAAW;UAChCX;UACAlB;UACA8B,UAAUrB;UACVsB,UAAUrB;UACV,GAAGS;QACP,CAAA;MACJ;IACJ;;;;;ACnFA,OAAO;AACP,SAAQa,cAAAA,oBAAiB;;;;;;;;;;IAmBZC;;;;AAlBb,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA;AAKA;AACA,IAAAC;AACA;AACA,IAAAC;AACA,IAAAC;;;AAMO,IAAMN,eAAN,cAA2BO,YAAAA;aAAAA;;;;;;;MACtBC,WAAmBC,IAAIC,IAAIC;MAEnC,YACYC,iBACAC,iBACAC,eACAC,uBACV;AACE,cAAK,GAAA,KALGH,kBAAAA,iBAAAA,KACAC,kBAAAA,iBAAAA,KACAC,gBAAAA,eAAAA,KACAC,wBAAAA;MAGZ;MAEA,MAAMC,MAAMC,UAAqBC,eAAkCC,QAAkBC,MAAY;AAC7F,cAAMC,UAAS,KAAKC,KAAK,KAAKN,KAAK;AAEnCK,QAAAA,QAAOE,MAAM,wCAAwCJ,QAAQK,UAAU,CAAA,eAAgBN,cAAcO,SAAS,iBAAiBP,aAAAA,EAAe;AAE9I,YAAI,CAACC,UAAU,CAACA,OAAOK,QAAQ;AAC3BH,UAAAA,QAAOE,MAAM,wCAAwC;AACrD;QACJ;AAEA,cAAMG,gBAAgBT,SAASU;AAC/B,YAAI,CAACD,eAAe;AAChB,gBAAM,IAAIE,MAAM,iCAAiCV,cAAcD,SAASY,IAAI,EAAE;QAClF;AAEA,cAAMC,UAAU,MAAMJ,cAAcK,WAAWC,cAAcd,cAAce,OAAO;AAElF,cAAMC,eAAeJ,QAAQK;AAC7B,YAAI,CAACD,gBAAgB,CAACA,aAAaV,OAAQ;AAE3C,cAAMY,cAAcC,SAASH,cAAcI,CAAAA,MAAAA;AACvC,cAAIA,MAAMC,UAAaD,MAAM,MAAM;AAC/BjB,YAAAA,QAAOmB,KAAK,eAAeF,MAAM,OAAO,SAAS,WAAA,4BAAuC;cAACb,WAAWP,cAAcO;YAAS,CAAA;AAC3H,mBAAO;UACX;AACA,iBAAOa,EAAEG,SAAS;QACtB,CAAA;AAEA,YAAI,CAACL,aAAa;AACdf,UAAAA,QAAOmB,KAAK,4BAA4B;YAACE,YAAY;YAASjB,WAAWP,cAAcO;UAAS,CAAA;AAChG;QACJ;AAEA,cAAMkB,cAAcC,MAAMC,QAAQT,YAAYU,OAAO,IACjDC,WAAwBX,YAAYU,SAASE,CAAAA,MAAKA,EAAEC,SAAS,QAAQD,CAAAA,MAAMA,EAAsBE,MAAM,MAAA,IACvGd,YAAYU;AAEhB,YAAI,CAACH,YAAYnB,OAAQ;AAEzB,YAAI;AACAN,wBAAcC,SAASA;AACvBE,UAAAA,QAAOE,MAAM,aAAaJ,OAAOK,MAAM,6BAA6B;AACpE,gBAAM2B,UAAU,MAAMC,QAAQC,IAC1BlC,OAAOmC,IAAI,OAAOtC,OAAOuC,UAAAA;AACrBlC,YAAAA,QAAOE,MAAM,wBAAwBgC,QAAQ,CAAA,IAAKpC,OAAOK,MAAM,QAAQR,MAAMwC,EAAE,WAAWxC,MAAMyC,KAAK,cAAczC,MAAMC,QAAQ,EAAE;AACnI,kBAAMyC,YAAYC,KAAKC,IAAG;AAC1B,gBAAI;AACA,kBAAI,CAAC5C,MAAM6C,aAAa;AACpBxC,gBAAAA,QAAOmB,KAAK,SAASxB,MAAMwC,EAAE,qBAAqB;AAClD,uBAAO;kBAACM,QAAQ;gBAAI;cACxB;AACA,oBAAMC,gBAAgB,MAAM,KAAKlD,gBAAgBmD,QAAQhD,MAAM6C,WAAW;AAC1E,kBAAI,CAACE,eAAe;AAChB1C,gBAAAA,QAAOmB,KAAK,6BAA6BxB,MAAM6C,WAAW,EAAE;AAC5D,uBAAO;kBAACC,QAAQ;gBAAI;cACxB;AACA,oBAAMG,cAAc,MAAM,KAAKnD,cAAcoD,YAAYH,cAAcI,SAAS;AAChF,kBAAI,CAACF,aAAa;AACd5C,gBAAAA,QAAOmB,KAAK,iCAAiCuB,cAAclC,IAAI,EAAE;AACjE,uBAAO;kBAACiC,QAAQ;gBAAI;cACxB;AAEA,oBAAMM,gBAAgB,KAAKrD,sBAAsBsD,wBAAwBN,cAAcI,WAAWG,mBAAmBC,IAAI,KAClH,MAAM,KAAKxD,sBAAsByD,YAAYT,cAAcI,WAAWF,YAAYQ,eAAe;AAExG,oBAAMC,cAA2BC,YAAY;gBACzClB,OAAOzC,MAAMyC;gBACbtB,UAAU;kBAAC;oBACPM,MAAM;oBACNK,SAAS9B,MAAM4D,cAAc,SAASjC;kBAC1C;;gBACAkC,iBAAiB;kBAAC5B,MAAM;kBAAe6B,QAAQC;kBAAmBC,QAAQ;gBAAI;gBAC9EC,QAAQ;gBACR,GAAIjE,MAAMkE,iBAAiB;kBAACC,QAAQnE,MAAMkE;gBAAa;cAC3D,CAAA;AAEA,oBAAMjD,UAAU,MAAMgC,YAAYlC,WAAWqD,gBAAgBV,WAAAA;AAC7D,oBAAMW,eAAeC,qBAAqBC,OACtCxB,eACAK,eACAnC,SACA,KAAKzB,UACLY,MACAmB,QACArB,cAAcsE,UACdtE,cAAcuE,QAAQ;AAE1BpE,cAAAA,QAAOqE,KAAKC,KAAKC,UAAUP,YAAAA,CAAAA;AAC3B,oBAAMQ,WAAW,MAAM,KAAKjF,gBAAgBkF,YAAoBT,YAAAA;AAEhE,oBAAMU,MAAMJ,KAAKK,MAAMH,QAAAA;AACvBxE,cAAAA,QAAOE,MAAM,uBAAuBoE,KAAKC,UAAUG,GAAAA,CAAAA,IAAQ;gBAACtE,WAAWP,cAAcO;cAAS,CAAA;AAC9F,oBAAMwE,eAAe,MAAMhC,YAAYlC,WAAWmE,eAAeH,GAAAA;AACjE,kBAAI,CAACE,aAAaE,QAAQ3E,OAAQ,QAAO;gBACrCsC,QAAQ;gBACRsC,QAAQ;kBAAC;;cACb;AAEA,oBAAMC,gBAAgBJ,aAAaE,OAAO,CAAA,EAAGrD;AAC7C,kBAAI,CAACuD,eAAe;AAChBhF,gBAAAA,QAAOmB,KAAK,8BAA8B;AAC1C,uBAAO;kBAACsB,QAAQ;kBAAMsC,QAAQ;oBAAC;;gBAAgC;cACnE;AACA,oBAAME,SAASX,KAAKK,MAAMK,aAAAA;AAC1B,oBAAME,WAAW5C,KAAKC,IAAG,IAAKF;AAC9BrC,cAAAA,QAAOE,MAAM,eAAegC,QAAQ,CAAA,IAAKpC,OAAOK,MAAM,kBAAkBR,MAAMwC,EAAE,YAAY8C,OAAOxC,MAAM,cAAcyC,QAAAA,IAAY;AACnI,qBAAOD;YACX,SAASE,GAAQ;AACb,oBAAMD,WAAW5C,KAAKC,IAAG,IAAKF;AAC9BrC,cAAAA,QAAOoF,MAAM,eAAelD,QAAQ,CAAA,IAAKpC,OAAOK,MAAM,eAAeR,MAAMwC,EAAE,WAAWgD,GAAGE,WAAWC,OAAOH,CAAAA,CAAAA,cAAgBD,QAAAA,MAAc;gBAAC9E,WAAWP,cAAcO;cAAS,CAAA;AAC9K,qBAAO;gBAACqC,QAAQ;gBAAMsC,QAAQ;kBAACI,GAAGE,WAAWC,OAAOH,CAAAA;;cAAG;YAC3D;UACJ,CAAA,CAAA;AAGJnF,UAAAA,QAAOE,MAAM,OAAOJ,OAAOK,MAAM,+CAA+C;AAEhF,gBAAMoF,UAAUzD,QAAQ0D,OACpB,CAACC,KAAKC,MAAAA;AACFD,gBAAIhD,SAASgD,IAAIhD,UAAU,CAAC,CAACiD,EAAEjD;AAC/B,gBAAI,CAACgD,IAAIhD,UAAUiD,GAAGjD,WAAW,SAASiD,EAAEX,QAAQ5E,QAAQ;AACxD,kBAAI,CAACsF,IAAIV,OAAQU,KAAIV,SAAS,CAAA;AAC9BU,kBAAIV,OAAOY,KAAI,GAAID,EAAEX,MAAM;YAC/B;AACA,mBAAOU;UACX,GACA;YAAChD,QAAQ;UAAI,CAAA;AAGjB5C,wBAAc+F,cAAcL;AAC5B,cAAIA,QAAQ9C,QAAQ;AAChBzC,YAAAA,QAAOE,MAAM,mCAAmC;UACpD,OAAO;AACH,kBAAM2F,aAAaN,QAAQR,QAAQ5E,UAAU;AAC7CH,YAAAA,QAAOE,MAAM,kDAAkD2F,UAAAA,EAAY;AAC3E,gBAAIN,QAAQR,QAAQ5E,QAAQ;AACxBH,cAAAA,QAAOmB,KAAK,2BAA2BoE,QAAQR,OAAOe,KAAK,IAAA,CAAA,EAAO;YACtE;UACJ;AACA,iBAAOP;QACX,SAASJ,GAAG;AACRnF,UAAAA,QAAOoF,MAAM,6BAA8BD,EAAYE,OAAO,IAAI;YAC9DhE,YAAY;YACZjB,WAAWP,cAAcO;YACzB2F,OAAQZ,EAAYY;UACxB,CAAA;AACA,iBAAO;YAACtD,QAAQ;YAAOsC,QAAQ;cAAEI,EAAYE;;UAAQ;QACzD;MACJ;IACJ;;;;;;;;;;;;;;;ACrLA,OAAO;AAEP,SAAQW,cAAAA,oBAAiB;;;;;;;;;;IAgBZC;;;;AAjBb;AAEA,IAAAC;AACA;AACA,IAAAC;AAQA;AACA;AACA;;;AAGO,IAAMF,cAAN,MAAMA;aAAAA;;;;;;;;;;;;;MACDG,WAAmBC,IAAIC,IAAIC;MAEnC,YACYC,eACAC,wBACAC,wBACAC,gBACAC,sBACAC,qBACAC,iBACAC,cACAC,cACAC,UACV;aAVUT,gBAAAA;aACAC,yBAAAA;aACAC,yBAAAA;aACAC,iBAAAA;aACAC,uBAAAA;aACAC,sBAAAA;aACAC,kBAAAA;aACAC,eAAAA;aACAC,eAAAA;aACAC,WAAAA;MAGZ;MAEA,MAAMC,KAAKd,UAAiC;AACxC,aAAKA,WAAWA;AAChB,cAAM,KAAKY,aAAaG,QAAO;AAE/B,cAAMC,aAAa,MAAM,KAAKH,SAASI,uBAAuB,EAAA;AAC9D,YAAID,aAAa,GAAG;AAChBE,yBAAOC,KAAK,eAAeH,UAAAA,kBAA4B;QAC3D;AAGA,cAAM,KAAKX,uBAAuBe,iBAAgB;AAClD,cAAM,KAAKf,uBAAuBgB,eAAc;AAGhD,cAAM,KAAKd,eAAee,cAAa;AAGvC,aAAKhB,uBAAuBiB,YAAYvB,QAAAA;AACxC,cAAM,KAAKS,oBAAoBe,QAAO;AAGtC,cAAM,KAAKpB,cAAcqB,wBAAwBzB,QAAAA;AAGjD,cAAM,KAAK0B,YAAY1B,QAAAA;AACvB,cAAM,KAAKU,gBAAgBiB,yBAAwB;AAGnD,YAAI1B,IAAIC,IAAI0B,oBAAoB;AAC5B,gBAAM,KAAKpB,qBAAqBqB,cAAa;QACjD;MACJ;MAEA,MAAMH,YAAY1B,UAAmB;AACjCkB,uBAAOY,MAAM,2BAA2B9B,QAAAA,EAAU;AAClD,aAAKA,WAAWA,YAAY,KAAKA;AACjC,cAAM,KAAK+B,sBAAqB;AAChC,cAAM,KAAKC,oBAAmB;AAC9B,cAAM,KAAKC,qBAAoB;AAC/B,cAAM,KAAKC,yBAAwB;MACvC;MAEA,MAAMH,wBAAwB;AAC1B,cAAM,KAAKpB,aAAawB,eAAelC,IAAImC,MAAMC,iBAAiB,QAAA;AAClE,cAAM,KAAK1B,aAAawB,eAAelC,IAAImC,MAAME,kBAAkB,QAAA;AACnE,cAAM,KAAK3B,aAAawB,eAAelC,IAAImC,MAAMG,sBAAsB,OAAA;AACvE,cAAM,KAAK5B,aAAawB,eAAelC,IAAImC,MAAMI,eAAe,OAAA;AAChE,cAAM,KAAK7B,aAAawB,eAAelC,IAAImC,MAAMK,uBAAuB,QAAA;AACxE,cAAM,KAAK9B,aAAawB,eAAelC,IAAImC,MAAMM,gBAAgB,QAAA;MACrE;MAEA,MAAMV,sBAAsB;AACxB,cAAM,KAAKrB,aAAagC,YAAY1C,IAAImC,MAAMQ,cAAc;UAACC,SAAS;QAAI,GAAG5C,IAAImC,MAAMC,eAAe;AACtG,cAAM,KAAK1B,aAAagC,YAAY1C,IAAImC,MAAMU,mBAAmB;UAACD,SAAS;QAAI,GAAG5C,IAAImC,MAAMC,eAAe;MAC/G;MAEA,MAAMJ,uBAAuB;AACzB,cAAMc,oBAAoB,GAAG9C,IAAImC,MAAMY,aAAa,IAAI,KAAKhD,QAAQ;AACrE,cAAM,KAAKW,aAAagC,YACpBI,mBACA;UACIF,SAAS;UACTI,WAAW;YACP,aAAahD,IAAImC,MAAMc;UAC3B;QACJ,GACAjD,IAAImC,MAAME,kBACV,KAAKtC,QAAQ;AAEjB,cAAM,KAAKW,aAAagC,YACpB1C,IAAImC,MAAMe,oBACV;UACIN,SAAS;QACb,GACA5C,IAAImC,MAAME,kBACVrC,IAAImC,MAAMgB,eAAe;MACjC;MAEA,MAAMlB,2BAA2B;AAC7B,cAAM,KAAKvB,aAAagC,YAAY1C,IAAImC,MAAMiB,wBAAwB;UAACR,SAAS;QAAI,GAAG5C,IAAImC,MAAMG,sBAAsB,GAAA;MAC3H;IAEJ;;;;;;;;;;;;;;;;;;;;;ACtHA,OAAO;AACP,SAAQe,cAAAA,oBAAiB;AAYzB,SAAQC,cAAAA,mBAAiB;;;;;;;;;;IAOZC;;;;AAlBb,IAAAC;AAOA,IAAAC;AACA;AACA,IAAAC;AACA;;;AAQO,IAAMH,sBAAN,cAAkCI,YAAAA;aAAAA;;;;MACpBC,WAAWC,IAAIC,MAAMC;MACrBC,cAAcH,IAAIC,MAAMG;MAEjCC,YAAY,oBAAIC,IAAAA;MAEhBC,cAAc,oBAAID,IAAAA;MAElBE,OAAO,oBAAIF,IAAAA;MAEnB,YAA6BG,cAA4B;AACrD,cAAK,GAAA,KADoBA,eAAAA;AAEzB,aAAKA,aAAaC,GAAG,gBAAgB,MAAM,KAAKC,kBAAiB,CAAA;MACrE;MAEA,MAAMC,QAAQC,OAAyC;AACnD,cAAMC,KAAKC,kBAAkBC,WAAWH,MAAMI,gBAAgBJ,MAAMK,QAAQL,MAAMM,OAAO;AACzF,cAAM,KAAKV,aAAaW,eAAe,KAAKrB,UAAUe,IAAID,OAAO;UAC7DQ,eAAeR,MAAMS;QACzB,CAAA;MACJ;MAEA,MAAMC,UAAUC,QAAgE;AAC5E,cAAM,EAACP,gBAAgBC,QAAQC,QAAO,IAAIK;AAE1C,YAAI,CAACP,kBAAkB,CAACC,QAAQ;AAC5B,gBAAM,IAAIO,MAAM,8DAAA;QACpB;AAGA,cAAMC,UAAUX,kBAAkBW,QAAQT,gBAAgBC,MAAAA;AAC1D,cAAMI,KAAK7B,YAAAA;AACX,cAAMkC,IAAI,IAAIC,gBAAAA;AAEd,cAAM,KAAKC,wBAAwBH,OAAAA;AAEnC,cAAMI,aAAaf,kBAAkBgB,QAAQd,gBAAgB,KAAKE,OAAAA;AAClE,cAAM,KAAKa,cAAcN,SAASI,UAAAA;AAElC,YAAIG,IAAI,KAAKzB,KAAK0B,IAAIR,OAAAA;AACtB,YAAI,CAACO,EAAG,MAAKzB,KAAK2B,IAAIT,SAAUO,IAAI,oBAAI3B,IAAAA,CAAAA;AAExC,cAAM8B,MAAMC,YAAY;UAACf;UAAIE;UAAQG;UAAGR;QAAO,CAAA;AAC/Cc,UAAEE,IAAIb,IAAIc,GAAAA;AACV,eAAOA;MACX;MAGA,MAAME,YAAYhB,IAA8B;AAC5C,mBAAW,CAACI,SAASlB,IAAAA,KAAS,KAAKA,KAAK+B,QAAO,GAAI;AAC/C,gBAAMH,MAAM5B,KAAK0B,IAAIZ,EAAAA;AACrB,cAAI,CAACc,IAAK;AAEV5B,eAAKgC,OAAOlB,EAAAA;AACZc,cAAIT,EAAEc,IAAG;AAET,gBAAM,EAACxB,gBAAgBE,QAAO,IAAIiB,IAAIZ;AACtC,gBAAM,KAAKkB,kBAAkBhB,SAASX,kBAAkBgB,QAAQd,gBAAgB,KAAKE,OAAAA,CAAAA;AAErF,cAAIX,KAAKmC,SAAS,GAAG;AACjB,iBAAKnC,KAAKgC,OAAOd,OAAAA;UACrB;AAEA,iBAAO;QACX;AACA,eAAO;MACX;MAEA,MAAcG,wBAAwBH,SAAiB;AACnD,cAAMkB,WAAW,KAAKvC,UAAU6B,IAAIR,OAAAA;AACpC,YAAIkB,UAAUC,QAAS;AAEvB,cAAMC,YAAY,GAAG,KAAK3C,WAAW,IAAIuB,OAAAA,IAAW1B,IAAI+C,IAAIC,WAAW;AAEvE,cAAM,KAAKvC,aAAawC,YACpBH,WACA;UACII,SAAS;UACTC,WAAW;YAAC,aAAanD,IAAIC,MAAMmD;UAAe;QACtD,CAAA;AAGJ,cAAM,KAAK3C,aAAa4C,QACpBP,WACA,OAAOQ,KAAaC,YAAiB,KAAKC,aAAa9B,SAAS6B,OAAAA,GAChE,IAAA;AAGJ,aAAKlD,UAAU8B,IAAIT,SAAS;UAACoB;UAAWD,SAAS;QAAI,CAAA;MACzD;MAEA,MAAcb,cAAcN,SAAiB+B,SAAiB;AAC1D,YAAIxB,IAAI,KAAK1B,YAAY2B,IAAIR,OAAAA;AAC7B,YAAI,CAACO,EAAG,MAAK1B,YAAY4B,IAAIT,SAAUO,IAAI,oBAAI3B,IAAAA,CAAAA;AAE/C,cAAMoD,KAAKzB,EAAEC,IAAIuB,OAAAA,KAAY,KAAK;AAClCxB,UAAEE,IAAIsB,SAASC,CAAAA;AACf,YAAIA,IAAI,EAAG;AAEX,cAAMC,IAAI,KAAKtD,UAAU6B,IAAIR,OAAAA;AAC7B,YAAI,CAACiC,EAAG,OAAM,IAAIlC,MAAM,gBAAgBC,OAAAA,EAAS;AAEjD,cAAM,KAAKjB,aAAamD,UAAUD,EAAEb,WAAW,KAAK/C,UAAU0D,OAAAA;MAClE;MAEA,MAAcf,kBAAkBhB,SAAiB+B,SAAiB;AAC9D,cAAMxB,IAAI,KAAK1B,YAAY2B,IAAIR,OAAAA;AAC/B,YAAI,CAACO,EAAG;AAER,cAAMyB,KAAKzB,EAAEC,IAAIuB,OAAAA,KAAY,KAAK;AAClC,YAAIC,IAAI,GAAG;AACPzB,YAAEE,IAAIsB,SAASC,CAAAA;AACf;QACJ;AAEAzB,UAAEO,OAAOiB,OAAAA;AACT,YAAIxB,EAAEU,SAAS,EAAG,MAAKpC,YAAYiC,OAAOd,OAAAA;AAE1C,cAAMiC,IAAI,KAAKtD,UAAU6B,IAAIR,OAAAA;AAC7B,YAAI,CAACiC,EAAG;AAER,cAAM,KAAKlD,aAAaoD,YAAYF,EAAEb,WAAW,KAAK/C,UAAU0D,OAAAA;MACpE;MAEQD,aAAa9B,SAAiBoC,IAAuB;AACzD,cAAMC,UAAS,KAAKC,KAAK,KAAKR,YAAY;AAC1C,cAAMhD,OAAO,KAAKA,KAAK0B,IAAIR,OAAAA;AAC3B,YAAI,CAAClB,QAAQA,KAAKmC,SAAS,EAAG;AAE9B,YAAIsB,WAAW;AACf,mBAAW7B,OAAO5B,KAAK0D,OAAM,GAAI;AAC7B,cAAI,CAAC,KAAKC,cAAc/B,IAAIZ,QAAQsC,EAAAA,EAAK;AACzC1B,cAAIT,EAAEyC,KAAKN,EAAAA;AACXG;QACJ;AACAF,QAAAA,QAAOM,KAAK,gBAAgBP,GAAGQ,IAAI,aAAa5C,OAAAA,eAAsBlB,KAAKmC,IAAI,cAAcsB,QAAAA,EAAU;MAC3G;MAEQtD,oBAA0B;AAC9B,cAAMoD,UAAS,KAAKC,KAAK,KAAKrD,iBAAiB;AAC/C,cAAM4D,MAAM,IAAI9C,MAAM,gBAAA;AACtB,YAAI+C,SAAS;AAEb,mBAAWhE,QAAQ,KAAKA,KAAK0D,OAAM,GAAI;AACnC,qBAAW9B,OAAO5B,KAAK0D,OAAM,GAAI;AAC7B9B,gBAAIT,EAAE8C,KAAKF,GAAAA;AACXC;UACJ;QACJ;AAEA,aAAKhE,KAAKkE,MAAK;AACf,aAAKrE,UAAUqE,MAAK;AACpB,aAAKnE,YAAYmE,MAAK;AAEtBX,QAAAA,QAAOY,KAAK,wBAAwBH,MAAAA,8CAAoD;MAC5F;MAEQL,cAAc3C,QAAqCsC,IAAgC;AACvF,YAAIA,GAAG7C,mBAAmBO,OAAOP,eAAgB,QAAO;AACxD,YAAIO,OAAOL,WAAW2C,GAAG3C,YAAYK,OAAOL,QAAS,QAAO;AAE5D,cAAMyD,cAAcpD,OAAON,SAAS4C,GAAG5C,WAAWM,OAAON,SAAS;AAClE,YAAI0D,YAAa,QAAO;AAExB,cAAMC,gBAAgB,CAAC,CAACf,GAAGgB,YAAY,CAAC,CAACtD,OAAOuD,WAAWC,SAASlB,GAAGgB,QAAQ;AAC/E,YAAI,CAACD,cAAe,QAAO;AAC3B,YAAIrD,OAAOyD,YAAYC,WAAW,CAACpB,GAAGqB,aAAa,CAAC3D,OAAOyD,WAAWD,SAASlB,GAAGqB,SAAS,GAAI,QAAO;AACtG,YAAI3D,OAAO4D,WAAWF,WAAW,CAACpB,GAAGuB,YAAY,CAAC7D,OAAO4D,UAAUJ,SAASlB,GAAGuB,QAAQ,GAAI,QAAO;AAClG,YAAI7D,OAAO8D,OAAOJ,UAAU,CAAC1D,OAAO8D,MAAMN,SAASlB,GAAGQ,IAAI,EAAG,QAAO;AAEpE,eAAO;MACX;IAEJ;;;;;;;;;;;;ACjMA,OAAO;AACP,SAAQiB,UAAAA,SAAQC,cAAAA,oBAAiB;;;;;;;;;;;;;;;AA4PjC,SAASC,WAAWC,QAA2BC,QAAgBC,YAAkB;AAC7E,QAAMC,aAAaF,OAAOG,YAAW;AACrC,QAAMC,kBAAkBH,WAAWI,MAAM,GAAA,EAAKC,OAAOC,CAAAA,MAAKA,EAAEC,SAAS,CAAA;AACrE,aAAWC,SAASV,QAAQ;AACxB,QAAIU,MAAMT,OAAOG,YAAW,MAAOD,WAAY;AAC/C,eAAWQ,SAAQD,MAAME,OAAO;AAC5B,YAAMC,gBAAgBF,MAAKL,MAAM,GAAA,EAAKC,OAAOC,CAAAA,MAAKA,EAAEC,SAAS,CAAA;AAC7D,UAAII,cAAcJ,WAAWJ,gBAAgBI,OAAQ;AACrD,UAAIK,QAAQ;AACZ,eAASC,IAAI,GAAGA,IAAIF,cAAcJ,QAAQM,KAAK;AAC3C,YAAIF,cAAcE,CAAAA,EAAGC,WAAW,GAAA,EAAM;AACtC,YAAIH,cAAcE,CAAAA,MAAOV,gBAAgBU,CAAAA,GAAI;AACzCD,kBAAQ;AACR;QACJ;MACJ;AACA,UAAIA,MAAO,QAAOJ;IACtB;EACJ;AACA,SAAOO;AACX;IA7PaC;;;;AAhBb;AACA,IAAAC;AACA;AACA,IAAAC;AACA,IAAAC;AAEA,IAAAC;AAGA,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA;;;;AAIO,IAAMP,iBAAN,cAA6BQ,YAAAA;aAAAA;;;;;;;;;;;;MACxBC,WAAmBC,IAAIC,IAAIC;MAEnC,YACqBC,iBACAC,cACAC,qBACAC,uBACAC,eACAC,UACAC,gBACAC,iBAC0BC,qBAC7C;AACE,cAAK,GAAA,KAVYR,kBAAAA,iBAAAA,KACAC,eAAAA,cAAAA,KACAC,sBAAAA,qBAAAA,KACAC,wBAAAA,uBAAAA,KACAC,gBAAAA,eAAAA,KACAC,WAAAA,UAAAA,KACAC,iBAAAA,gBAAAA,KACAC,kBAAAA,iBAAAA,KAC0BC,sBAAAA;MAG/C;MAEA,MAAMC,qBACFC,YACAC,SACAxC,YACAyC,KACAC,KACF;AACE,cAAMC,UAAS,KAAKC,KAAK,KAAKN,oBAAoB;AAClDG,YAAID,UAAUA;AAEd,cAAMK,aAAa,KAAKV,eAAeW,aAAaP,UAAAA;AACpD,cAAM/B,QAAQX,WAAWgD,WAAWE,UAAS,GAAIN,IAAI1C,QAAQC,UAAAA;AAC7D,YAAI,CAACQ,OAAO;AACR,gBAAMwC,UAAUC,SAAS,yBAAyBR,IAAI1C,MAAM,KAAKC,UAAAA,cAAwBuC,UAAAA,EAAY;QACzG;AAEA,YAAI/B,MAAM0C,UAAWT,KAAIU,KAAKC,SAAS;AACvC,YAAIX,IAAIY,MAAMC,QAAQ,MAAOb,KAAIU,KAAKC,SAAS;AAE/C,cAAMG,eAAe/C,MAAMgD,SAASC;AACpCd,QAAAA,QAAOe,MAAM,iCAAiCnB,UAAAA,QAAkBC,OAAAA,aAAoBe,YAAAA,EAAc;AAElG,cAAMI,OAAOlB,IAAIkB;AACjB,YAAI,CAACA,KAAM,OAAM,IAAIC,MAAM,6CAAA;AAE3B,cAAMC,cAAcF,KAAKE;AACzB,YAAI,CAACA,aAAa;AACd,gBAAMb,UAAUc,aAAa,gBAAgBtB,OAAAA,+BAAsC;QACvF;AAKA,YAAIhC,MAAMgD,SAASO,eAAe,UAAU;AACxCrB,cAAIsB,OAAO,GAAA,EAAKC,KAAK,MAAM,KAAKC,kBAAkB;YAACL;aAActB,UAAAA,CAAAA;AACjE;QACJ;AAGA,YAAI/B,MAAMgD,SAASO,eAAe,WAAW;AACzC,iBAAO,KAAKI,eAAe5B,YAAYgB,cAAcd,KAAKC,GAAAA;QAC9D;AAEA,cAAM0B,YAAYvB,WAAWwB,wBAAwB5B,IAAIU,MAAMI,YAAAA;AAC/D,YAAI,CAACa,WAAW;AACZ,gBAAMpB,UAAUsB,WAAW,sDAAsDf,YAAAA,EAAc;QACnG;AAEA,cAAM,EAACgB,OAAOC,UAAUC,eAAc,IAAI,MAAM,KAAKC,qBAAqBb,aAAaO,SAAAA;AACvF,YAAIT,KAAKgB,UAAU,CAAE,MAAM,KAAK1C,cAAc2C,eAAejB,KAAKkB,gBAAgBlB,KAAKgB,QAAQd,YAAYiB,IAAIV,SAAAA,GAAa;AACxH,gBAAMpB,UAAU+B,UAAU,uCAAuCX,SAAAA,qBAA8B5B,OAAAA,GAAU;QAC7G;AAEA,cAAMwC,kBAAkB,MAAM,KAAK9C,SAAS+C,QAAQR,eAAeS,SAAS;AAC5E,cAAMC,eAAeH,iBAAiBI,OAAOlF,YAAAA,KAAiB;AAE9D,cAAMmF,kBAAkB9C,WAAWrC,YAAW;AAC9C,cAAMoF,oBAAoBzB,YAAYW,YAAYD,MAAMgB,gBAAgB1B,YAAYW,SAASM;AAE7F,YAAIK,iBAAiBE,mBAAmBC,mBAAmB;AACvD,iBAAO,KAAKnB,eAAe5B,YAAYgB,cAAcd,KAAKC,GAAAA;QAC9D;AAEA,cAAM8C,eAAe,MAAM,KAAKrD,eAAesD,UAAUhB,eAAeS,SAAS;AACjF,cAAMQ,qBAAsBF,aAAqBG,0BAA0BnF,MAAMgD,SAASO,UAAU;AACpG,YAAI,CAAC2B,oBAAoB;AACrB,gBAAM1C,UAAUsB,WAAW,iBAAiBa,YAAAA,+CAA2D3E,MAAMgD,SAASO,UAAU,EAAE;QACtI;AACA,cAAM6B,iBAAiB,MAAM,KAAK5D,sBAAsB6D,YAAYpB,eAAeS,WAAWQ,kBAAAA;AAC9F,YAAI,CAACE,gBAAgB;AACjB,gBAAM5C,UAAUC,SAAS,mBAAmByC,kBAAAA,8BAAgDjB,eAAeS,SAAS,EAAE;QAC1H;AAEAvC,QAAAA,QAAOmD,KAAK,2BAA2BvD,UAAAA,IAAcgB,YAAAA,kBAAyB4B,YAAAA,IAAgBO,kBAAAA,EAAoB;AAElH,cAAMK,gBAAgB,MAAM,KAAKC,aAAavB,gBAAgBmB,gBAAgBnD,KAAKoB,WAAAA;AACnFkC,sBAAcE,eAAe;AAC7BF,sBAAcxD,aAAa8C;AAC3BU,sBAAcG,mBAAmB3C;AAEjC,cAAM,KAAKlB,oBAAoB8D,QAAQC,yBAAyBC,mBAAmB,mBAAmB1C,MAAMoC,eAAe,iBAAA,CAAA;AAC3H,cAAM,KAAKlE,gBAAgByE,YAAY7D,KAAKC,KAAKqD,aAAAA;AAEjDpD,QAAAA,QAAOmD,KAAK,yCAAyCC,cAAcQ,SAAS,EAAE;MAClF;;;;;;;;;;;;;MAcA,MAAMrC,kBAAkBsC,MAAqBjE,YAAsC;AAC/E,cAAMkE,kBAAkB,oBAAIC,IAAAA;AAC5B,mBAAWC,KAAKH,MAAM;AAClB,qBAAWI,KAAMD,EAAEE,UAAU,CAAA,GAAK;AAC9B,gBAAI,CAACD,EAAErB,YAAa;AACpB,gBAAIuB,QAAQL,gBAAgBM,IAAIH,EAAErB,WAAW;AAC7C,gBAAI,CAACuB,MAAOL,iBAAgBO,IAAIJ,EAAErB,aAAauB,QAAQ,oBAAIG,IAAAA,CAAAA;AAC3DH,kBAAMI,IAAIN,EAAEnD,IAAI;UACpB;QACJ;AAEA,cAAM0D,kBAAkB,MAAMC,QAAQC,IAClCC,MAAMC,KAAKd,gBAAgBe,QAAO,CAAA,EAAIC,IAAI,OAAO,CAACC,YAAYZ,KAAAA,MAAM;AAChE,gBAAMa,OAAO,MAAM,KAAK5F,oBAAoB6F,oBAAoBF,UAAAA;AAChE,gBAAML,MAAM,MAAMM,KAAKE,eAAc;AACrC,iBAAOR,IAAIhH,OAAOuG,CAAAA,MAAKE,MAAMgB,IAAIlB,EAAEnD,IAAI,KAAKqD,MAAMgB,IAAIlB,EAAEmB,WAAW,CAAA;QACvE,CAAA,CAAA;AAEJ,cAAMC,YAAYb,gBAAgBc,KAAI;AAEtC,cAAMpF,aAAa,KAAKV,eAAeW,aAAaP,UAAAA;AACpD,eAAOM,WAAWqF,qBAAqBF,SAAAA;MAC3C;MAEA,MAAMtD,qBAAqBb,aAA0BO,WAGlD;AACC,cAAMG,SAASV,YAAYgD,UAAU,CAAA,GAAIsB,KAAKvB,CAAAA,MAAKA,EAAEwB,iBAAiBhE,aAAawC,EAAEnD,SAASW,SAAAA;AAC9F,YAAI,CAACG,OAAO;AACR,gBAAMvB,UAAU+B,UAAU,UAAUX,SAAAA,mCAA4CP,YAAYwE,QAAQ,GAAG;QAC3G;AACA,YAAI,CAAC9D,MAAMgB,aAAa;AACpB,gBAAMvC,UAAUC,SAAS,UAAUmB,SAAAA,8BAAuC;QAC9E;AACA,YAAIP,YAAYW,YAAYD,MAAMgB,gBAAgB1B,YAAYW,SAASM,IAAI;AACvE,iBAAO;YAACP;YAAOC,UAAUX,YAAYW;UAAQ;QACjD;AACA,cAAMA,WAAW,MAAM,KAAKpC,gBAAgB6C,QAAQV,MAAMgB,WAAW;AACrE,YAAI,CAACf,UAAU;AACX,gBAAMxB,UAAUC,SAAS,YAAYsB,MAAMgB,WAAW,eAAenB,SAAAA,aAAsB;QAC/F;AACA,eAAO;UAACG;UAAOC;QAAQ;MAC3B;MAEA,MAAML,eAAeiB,QAAgB7B,cAAsBd,KAAqBC,KAAe4F,gBAAyB,OAAO;AAC3H,cAAM3F,UAAS,KAAKC,KAAK,KAAKuB,cAAc;AAC5C,cAAM,EAACR,KAAI,IAAIlB;AAEf,YAAI,CAACkB,MAAM;AACP,gBAAM,IAAIC,MAAM,6CAAA;QACpB;AAEA,YAAI,EAACC,aAAa0E,aAAY,IAAI5E;AAClC,YAAIa,WAAW;AACf,cAAMgE,cAAcpD,OAAOlF,YAAW;AAEtC,YAAI,CAAC2D,aAAa;AACd,cAAI,CAAC0E,aAAahI,QAAQ;AACtB,kBAAM,IAAIqD,MAAM,uDAAA;UACpB;AACAjB,UAAAA,QAAOe,MAAM,2BAA2B0B,MAAAA,kBAAwB;AAChE,qBAAWqD,aAAaF,cAAc;AAClC,kBAAMG,oBAAoBD,UAAUjE;AACpC,kBAAMmE,kBAAkB,MAAM,KAAKzG,SAAS+C,QAAQyD,kBAAkBxD,SAAS;AAC/E,gBAAIyD,iBAAiBvD,OAAOlF,YAAAA,MAAkBsI,YAAa;AAE3DhE,uBAAW,MAAM,KAAKzC,oBAAoB6F,oBAAoBc,kBAAkB5D,EAAE;AAClF,kBAAMV,YAAYI,SAASoE,OAAOvE,wBAAwB5B,IAAIU,MAAMI,YAAAA;AACpE,gBAAIa,aAAaT,KAAKgB,UAAU,MAAM,KAAK1C,cAAc2C,eAAejB,KAAKkB,gBAAgBlB,KAAKgB,QAAQ8D,UAAU3D,IAAIV,SAAAA,GAAY;AAChIzB,cAAAA,QAAOe,MAAM,mCAAmC+E,UAAUJ,QAAQ,EAAE;AACpExE,4BAAc4E;AACd;YACJ;UACJ;AAEA,cAAI,CAAC5E,aAAa;AACd,kBAAM,IAAID,MAAM,oEAAA;UACpB;QACJ;AAEAnB,YAAIkB,KAAME,cAAcA;AACxB,cAAML,WAAW,MAAM,KAAKxB,sBAAsB6D,YAAYhC,YAAYW,SAAUU,WAAW3B,YAAAA;AAC/F,YAAI,CAACC,UAAU;AACX,gBAAM,IAAII,MAAM,UAAUC,YAAYW,SAAUU,SAAS,8BAA8B3B,YAAAA,EAAc;QACzG;AAEAZ,QAAAA,QAAOmD,KAAK,qCAAqCjC,YAAYJ,IAAI,kBAAkBI,YAAYW,SAAUf,IAAI,EAAE;AAC/G,cAAMsC,gBAAgB,MAAM,KAAKC,aAAanC,YAAYW,UAAWhB,UAAUf,KAAKoB,aAAayE,aAAAA;AAEjG,YAAIzE,YAAYgF,QAAQtI,QAAQ;AAC5B,cAAI,CAACiE,UAAU;AACXA,uBAAW,MAAM,KAAKzC,oBAAoB6F,oBAAoB/D,YAAYW,SAAUM,EAAE;UAC1F;AACA,gBAAMgE,eAAejF,YAAYgF,OAAOpB,IAAIsB,CAAAA,OAAM;YAC9CjE,IAAIiE,EAAEjE;YACNrB,MAAMsF,EAAExE;YACRC,UAAUuE,EAAEvE;UAChB,EAAA;AACA7B,UAAAA,QAAOe,MAAM,aAAaG,YAAYgF,OAAOtI,MAAM,0BAA0ByI,KAAKC,UAAUH,YAAAA,CAAAA,EAAe;AAC3G,gBAAM,KAAKzG,oBAAoB8D,QAAQC,yBAAyBC,mBAAmB,iBAAiB1C,MAAMoC,eAAe,gBAAA,CAAA;AACzH,gBAAMmD,UAAU,MAAM,KAAKpH,aAAaqH,MAAM3E,UAAUuB,eAAelC,YAAYgF,QAAQlF,IAAAA;AAC3F,gBAAM,KAAKtB,oBAAoB8D,QAAQC,yBAAyBC,mBAAmB6C,SAASE,SAAS,iBAAiB,gBAAgBzF,MAAMoC,eAAe,gBAAA,CAAA;QAC/J;AAEA,cAAM,KAAK1D,oBAAoB8D,QAAQC,yBAAyBC,mBAAmB,mBAAmB1C,MAAMoC,eAAe,iBAAA,CAAA;AAC3H,cAAM,KAAKlE,gBAAgByE,YAAY7D,KAAKC,KAAKqD,aAAAA;AAEjDpD,QAAAA,QAAOmD,KAAK,sBAAsBtC,SAASC,IAAI,IAAI;UAC/C8C,WAAWR,cAAcQ;QAC7B,CAAA;MACJ;MAEA,MAAMP,aAAaxB,UAAoBhB,UAAoBf,KAAqBoB,aAA0ByE,gBAAyB,OAAO;AACtI,eAAOe,qBAAqBC,YAAY9E,UAAUhB,UAAUf,KAAK,KAAKhB,UAAUoC,aAAayE,aAAAA;MACjG;IACJ;;;;;;;;;;;;;;;;;AAESzI;;;;;AC7PT,OAAO;AACP,SAAQ0J,cAAAA,oBAAiB;;;;;;;;;;IAQZC;;;;AAPb;AACA,IAAAC;AACA;AACA;;;AAIO,IAAMD,eAAN,MAAMA;aAAAA;;;;;MAET,YACYE,cACSC,UACnB;aAFUD,eAAAA;aACSC,WAAAA;MAErB;MAEA,MAAMC,eAAeC,MAAcC,OAAkB;AACjD,cAAMC,UAAS,MAAM,KAAKJ,SAASK,OAAOH,MAAMC,KAAAA;AAEhD,YAAI,CAACC,SAAQ;AACT,gBAAM,IAAIE,MAAM,4BAA4B;QAChD;MACJ;MAEA,MAAMC,cAAcC,UAAkBC,UAAkB;AACpD,YAAI;AACAC,yBAAOC,KAAK,uCAAuCH,QAAAA,EAAU;AAG7D,gBAAMI,WAAiD;YACnDJ;YACAK,QAAQ;UACZ;AAGAC,qBAAW,MAAA;AACPJ,2BAAOC,KAAK,UAAUH,QAAAA,sCAA8C;AACpEO,oBAAQC,KAAK,CAAA;UACjB,GAAG,GAAA;AAEH,iBAAOJ;QACX,SAASK,OAAY;AACjBP,yBAAOO,MAAM,mCAAmCA,MAAMC,OAAO,EAAE;AAC/D,gBAAMD;QACV;MACJ;MAEA,MAAME,kBAAkBX,UAAkBY,YAAoBC,WAAmBC,MAAc;AAC3F,cAAM,KAAKvB,aAAawB,eACpBC,IAAIC,MAAMC,uBACVN,YACA;UACIC;UACAb;UACAmB,WAAWC,KAAKC,IAAG;UACnB,GAAGP;QACP,CAAA;MAER;IACJ;;;;;;;;;;;;;AC5DA,OAAO;AACP,SAAQQ,cAAAA,oBAAiB;AACzB,SAAQC,MAAMC,SAAQC,YAAYC,cAAa;;;;;;;;;;IAmBlCC;;;;AAlBb,IAAAC;AACA;AACA,IAAAC;AAKA;AACA,IAAAC;;;AAUO,IAAMH,qBAAN,cAAiCI,YAAAA;aAAAA;;;;;;;;MAC5BC,WAAmBC,IAAIC,IAAIC;MAEnC,YACqBC,SACAC,YACAC,eACAC,YACAC,uBACnB;AACE,cAAK,GAAA,KANYJ,UAAAA,SAAAA,KACAC,aAAAA,YAAAA,KACAC,gBAAAA,eAAAA,KACAC,aAAAA,YAAAA,KACAC,wBAAAA;MAGrB;MAEA,MAAMC,cAAcC,MAAYC,SAAmD;AAC/E,YAAIA,QAAQC,aAAa;AACrB,iBAAO,KAAKC,uBAAuBH,MAAMC,OAAAA;QAC7C;AAEA,YAAIA,QAAQG,OAAO;AACf,iBAAO,KAAKC,iBAAiBL,MAAMC,OAAAA;QACvC;AAEA,cAAMK,UAAUC,WAAW,+CAAA;MAC/B;MAEA,MAAMC,2BACFR,MACAC,SACAQ,YACAC,cAC2B;AAC3B,YAAIT,QAAQU,UAAU;AAClB,gBAAMA,WAAW,MAAM,KAAKC,gBAAgBX,QAAQU,QAAQ;AAC5D,gBAAME,WAAW,MAAM,KAAKC,gBAAgBH,SAASI,WAAWL,cAAcD,UAAAA;AAC9E,iBAAO;YAACE;YAAUE;YAAUT,OAAO;UAAE;QACzC;AACA,cAAMY,SAAS,MAAM,KAAKjB,cAAcC,MAAMC,OAAAA;AAC9Ce,eAAOH,WAAW,MAAM,KAAKC,gBAAgBE,OAAOL,SAASI,WAAWL,cAAcD,UAAAA;AACtF,eAAOO;MACX;MAEA,MAAMC,yBAAyBC,UAAkBT,YAAmD;AAChG,cAAMU,SAAS,KAAKrB,sBAAsBsB,wBAAwBF,UAAUT,UAAAA;AAC5E,YAAIU,OAAQ,QAAOA;AAEnB,cAAME,YAAY,MAAM,KAAKxB,WAAWyB,YAAYJ,QAAAA;AACpD,cAAML,WAAWQ,UAAUE,KAAKC,CAAAA,MAAKA,EAAEf,eAAeA,UAAAA;AACtD,YAAI,CAACI,UAAU;AACX,gBAAMP,UAAUC,WAAW,MAAME,UAAAA,+BAAyCS,QAAAA,EAAU;QACxF;AACA,eAAOL;MACX;MAEA,MAAMC,gBAAgBI,UAAkBR,cAAuBe,qBAAyCC,mBAAmBC,MAAyB;AAChJ,YAAI,CAACjB,cAAc;AACf,iBAAO,KAAKO,yBAAyBC,UAAUO,kBAAAA;QACnD;AAEA,cAAMJ,YAAY,MAAM,KAAKxB,WAAWyB,YAAYJ,QAAAA;AACpD,cAAML,WAAWQ,UAAUE,KAAKC,CAAAA,MAAKA,EAAEI,SAASlB,YAAAA;AAChD,YAAI,CAACG,UAAU;AACX,gBAAMP,UAAUC,WAAW,aAAaG,YAAAA,2BAAuCQ,QAAAA,EAAU;QAC7F;AACA,eAAOL;MACX;MAEAgB,mBACI7B,MACAgB,QACAf,SACA6B,YACiB;AACjB,cAAM,EAACnB,UAAUE,UAAUX,YAAW,IAAIc;AAE1C,eAAOe,YAAY;UACfC,gBAAgBhC,KAAKgC;UACrB9B;UACAS;UACAE;UACAoB,UAAU,KAAK3C;UACf4C,SAAShC,aAAaiC;UACtBC,QAAQpC,KAAKoC;UACbC,kBAAkBrC,KAAKqC;UACvBC,WAAWtC,KAAKsC;UAChBC,WAAWzD,QAAAA;UACX0D,SAASvC;UACTwC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;UACjCC,aAAa3C,QAAQ4C,WAAW;UAChCC,UAAU7C,QAAQ8C;UAClBC,UAAU/C,QAAQgD;UAClBC,oBAAoBpB;UACpBqB,cAAc;UACdC,QAAQlD,aAAakD;UACrBC,cAAcnD,aAAaoD;QAC/B,CAAA;MACJ;MAEA,MAAcnD,uBAAuBH,MAAYC,SAAmD;AAChG,cAAMsD,UAAS,KAAKC,KAAK,KAAKrD,sBAAsB;AACpD,cAAMsD,OAAOxD,QAAQC;AAErB,cAAMA,cAAc,MAAM,KAAKN,cAAc8D,UAAU1D,KAAKgC,gBAAgByB,IAAAA;AAC5E,YAAI,CAACvD,aAAa;AACd,gBAAMI,UAAUqD,SAAS,gBAAgBF,IAAAA,GAAO;QACpD;AAEA,cAAM9C,WAAWT,YAAYS;AAC7B,cAAME,WAAW,MAAM,KAAK+C,iBAAiBjD,SAASI,SAAS;AAE/D,cAAMX,QAAQH,QAAQG,SAAS,KAAKyD,gBAAgB3D,WAAAA;AAEpDqD,QAAAA,QAAOO,KAAK,wBAAwBL,IAAAA,oBAAmB9C,SAASiB,IAAI,WAAWxB,KAAAA,EAAO;AACtF,eAAO;UAACO;UAAUE;UAAUX;UAAaE;QAAK;MAClD;MAEA,MAAcC,iBAAiBL,MAAYC,SAAmD;AAC1F,cAAMsD,UAAS,KAAKC,KAAK,KAAKnD,gBAAgB;AAC9C,cAAM0D,WAAW9D,QAAQG;AAEzB,YAAIpB,OAAO+E,QAAAA,GAAW;AAClB,gBAAM3D,SAAQ,MAAM,KAAKV,QAAQsE,QAAQD,QAAAA;AACzC,cAAI,CAAC3D,QAAO;AACR,kBAAME,UAAUqD,SAAS,UAAUI,QAAAA,GAAW;UAClD;AACA,gBAAMpD,YAAW,MAAM,KAAKhB,WAAWqE,QAAQ5D,OAAM6D,WAAW;AAChE,cAAI,CAACtD,WAAU;AACX,kBAAML,UAAUqD,SAAS,uBAAuBI,QAAAA,GAAW;UAC/D;AACA,gBAAMlD,YAAW,MAAM,KAAK+C,iBAAiBjD,UAASI,SAAS;AAC/DwC,UAAAA,QAAOO,KAAK,uBAAuBC,QAAAA,oBAAuBpD,UAASiB,IAAI,EAAE;AACzE,iBAAO;YAACjB,UAAAA;YAAUE,UAAAA;YAAUT,OAAOA,OAAM8D,gBAAgB9D,OAAMwB;UAAI;QACvE;AAEA,YAAI3B,QAAQU,UAAU;AAClB,gBAAMA,YAAW,MAAM,KAAKC,gBAAgBX,QAAQU,QAAQ;AAC5D,gBAAMwD,UAAS,MAAM,KAAKzE,QAAQ0E,eAAezD,UAAS0D,EAAE;AAC5D,gBAAMjE,SAAQ+D,QAAO5C,KAAK+C,CAAAA,MAAKA,EAAEJ,iBAAiBH,YAAYO,EAAE1C,SAASmC,QAAAA;AACzE,cAAI,CAAC3D,QAAO;AACR,kBAAME,UAAUqD,SAAS,UAAUI,QAAAA,mBAA2BpD,UAASiB,IAAI,GAAG;UAClF;AACA,gBAAMf,YAAW,MAAM,KAAK+C,iBAAiBjD,UAASI,SAAS;AAC/DwC,UAAAA,QAAOO,KAAK,kBAAkBC,QAAAA,oBAAuBpD,UAASiB,IAAI,oBAAoB;AACtF,iBAAO;YAACjB,UAAAA;YAAUE,UAAAA;YAAUT,OAAO2D;UAAQ;QAC/C;AAEA,cAAMI,SAAS,MAAM,KAAKzE,QAAQ6E,KAAI;AACtC,cAAMnE,QAAQ+D,OAAO5C,KAAK+C,CAAAA,MAAKA,EAAEJ,iBAAiBH,YAAYO,EAAE1C,SAASmC,QAAAA;AACzE,YAAI,CAAC3D,OAAO;AACR,gBAAME,UAAUqD,SAAS,UAAUI,QAAAA,GAAW;QAClD;AAEA,cAAMpD,WAAW,MAAM,KAAKhB,WAAWqE,QAAQ5D,MAAM6D,WAAW;AAChE,YAAI,CAACtD,UAAU;AACX,gBAAML,UAAUqD,SAAS,uBAAuBI,QAAAA,GAAW;QAC/D;AAEA,YAAI/D,KAAKoC,QAAQ;AACb,gBAAMoC,OAAOxE,KAAKyE,gBAAgB,CAAA;AAClC,gBAAMC,YAAYF,KAAKG,KAAKC,CAAAA,QACxBA,IAAIX,gBAAgBtD,SAAS0D,EAAE;AAEnC,cAAI,CAACK,WAAW;AACZ,kBAAMpE,UAAUuE,UAAU,uBAAuBd,QAAAA,EAAU;UAC/D;QACJ;AAEA,cAAMlD,WAAW,MAAM,KAAK+C,iBAAiBjD,SAASI,SAAS;AAE/DwC,QAAAA,QAAOO,KAAK,kBAAkBC,QAAAA,oBAAuBpD,SAASiB,IAAI,EAAE;AACpE,eAAO;UAACjB;UAAUE;UAAUT,OAAO2D;QAAQ;MAC/C;MAEA,MAAcnD,gBAAgBkE,KAAgC;AAC1D,YAAI9F,OAAO8F,GAAAA,GAAM;AACb,gBAAMnE,YAAW,MAAM,KAAKhB,WAAWqE,QAAQc,GAAAA;AAC/C,cAAI,CAACnE,UAAU,OAAML,UAAUqD,SAAS,aAAamB,GAAAA,GAAM;AAC3D,iBAAOnE;QACX;AACA,cAAMA,WAAW,MAAM,KAAKhB,WAAWoF,IAAID,GAAAA;AAC3C,YAAI,CAACnE,SAAU,OAAML,UAAUqD,SAAS,aAAamB,GAAAA,GAAM;AAC3D,eAAOnE;MACX;MAEA,MAAciD,iBAAiB1C,UAAqC;AAChE,eAAO,KAAKD,yBAAyBC,UAAUQ,mBAAmBC,IAAI;MAC1E;MAEQkC,gBAAgB3D,aAAkC;AACtD,cAAMiE,SAASjE,YAAYiE,UAAU,CAAA;AACrC,YAAIA,OAAOa,SAAS,GAAG;AACnB,iBAAOb,OAAO,CAAA,EAAGD,gBAAgBC,OAAO,CAAA,EAAGvC;QAC/C;AACA,cAAMtB,UAAUC,WAAW,gBAAgBL,YAAY0B,IAAI,4BAA4B;MAC3F;IACJ;;;;;;;;;;;;;;;;ACvNA;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAqD;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;;;;;ACfA,IAGaC;AAHb;;;;AACA,IAAAC;AAEO,IAAMD,kBAAkB,8BAC3BE,KACAC,KACAC,KACAC,UAAAA;AAEA,YAAMC,cAAcJ,eAAeK;AACnC,YAAMC,aAAaF,cAAcJ,IAAIM,aAAa;AAClD,YAAMC,OAAOH,cAAcJ,IAAIO,OAAO;AAEtC,YAAMC,QAAQF,aAAa,MAAMG,eAAOC,OAAOD,eAAOE;AACtDH,YAAM,GAAGR,IAAIY,OAAO,IAAI;QACpBC,OAAOb,IAAIa;QACXC,KAAKb,IAAIa;QACTC,QAAQd,IAAIc;QACZT;QACAC;MACJ,CAAA;AAEAL,UAAIc,OAAOV,UAAAA,EAAYW,KAAK;QACxBC,SAAS;QACTP,OAAO;UACHC,SAASZ,IAAIY,WAAW;UACxBL;UACA,GAAIY,QAAQC,IAAIC,aAAa,iBAAiB;YAACR,OAAOb,IAAIa;UAAK;QACnE;QACAS,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;MACrC,CAAA;IACJ,GA5B+B;;;;;ACD/B,SAASC,eAAeC,QAAgBC,SAAe;AACnD,MAAI,CAACA,QAAQC,SAAS,GAAA,EAAM,QAAOD,YAAYD;AAC/C,QAAMG,UAAUF,QAAQG,QAAQ,sBAAsB,MAAA,EAAQA,QAAQ,OAAO,IAAA;AAC7E,SAAO,IAAIC,OAAO,IAAIF,OAAAA,GAAU,EAAEG,KAAKN,MAAAA;AAC3C;AAEA,SAASO,gBAAgBP,QAA0B;AAC/C,SAAO,CAAC,CAACA,UAAUQ,IAAIC,SAASC,mBAAmBC,KAAKC,CAAAA,MAAKb,eAAeC,QAAQY,CAAAA,CAAAA;AACxF;AAVA,IAYaC;AAZb;;;IAAAC;AAESf;AAMAQ;AAIF,IAAMM,iBAAiB,8BAC1BE,KACAC,KACAC,SAAAA;AAEA,YAAMjB,SAASe,IAAIG,QAAQlB;AAC3B,UAAIO,gBAAgBP,MAAAA,GAAS;AACzBgB,YAAIG,OAAO,+BAA+BnB,MAAAA;AAC1CgB,YAAIG,OAAO,QAAQ,QAAA;AACnBH,YAAIG,OAAO,gCAAgC,GAAA;AAC3CH,YAAIG,OAAO,gCAAgC,iCAAA;MAC/C;AAEA,UAAIJ,IAAIK,WAAW,WAAW;AAC1BJ,YAAIK,OAAOd,gBAAgBP,MAAAA,IAAU,MAAM,GAAA,EAAKsB,IAAG;AACnD;MACJ;AAEAL,WAAAA;IACJ,GAnB8B;;;;;ACCvB,SAASM,mBAAmBC,aAA0BC,OAAoB,CAAC,GAAC;AAC/E,QAAM,EACFC,WAAW,MACXC,WAAW,OACXC,WAAW,MACXC,iBAAiB,MACjBC,iBAAiB,OACjBC,eAAc,IACdN;AAEJ,SAAO,sCAAeO,aAAaC,KAAqBC,MAAgBC,MAAkB;AACtF,UAAMC,QAAQC,aAAaJ,GAAAA;AAC3B,UAAMK,mBAAmBL,IAAIM,QAAQ,eAAA;AACrC,UAAMC,UAAUC,eAAeR,GAAAA;AAE/B,QAAI;AACA,UAAIG,OAAOM,WAAW,OAAA,KAAYb,gBAAgB;AAC9CI,YAAIU,OAAO,MAAMnB,YAAYoB,sBAAsBR,OAAOI,SAAST,cAAAA;MACvE,WAAWK,SAAS,CAACA,MAAMM,WAAW,OAAA,KAAYd,UAAU;AACxDK,YAAIU,OAAO,MAAMnB,YAAYqB,gBAAgBT,OAAOI,SAAST,gBAAgBL,QAAAA;MACjF,WAAWc,WAAWV,gBAAgB;AAClCG,YAAIU,OAAO,MAAMnB,YAAYsB,sBAAsBN,SAAST,cAAAA;MAChE;IACJ,SAASgB,OAAO;AACZ,YAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,UAAUC,OAAOJ,KAAAA;AACrEZ,WAAKiB,UAAUC,UAAUL,YAAAA,CAAAA;AACzB;IACJ;AAEA,QAAI,CAACf,IAAIU,QAAQ,CAAChB,UAAU;AACxBQ,WAAKiB,UAAUE,aAAa,yBAAA,CAAA;AAC5B;IACJ;AAEA,QAAIrB,IAAIU,QAAQL,kBAAkB;AAC9BL,UAAIU,KAAKL,mBAAmBA;IAChC;AAEAH,SAAAA;EACJ,GA7BO;AA8BX;AApDA;;;;AACA,IAAAoB;AAWgBhC;;;;;ACdhB;;;;AACA;AACA;;;;;ACFA,OAAO;AACP,SAAQiC,cAAAA,oBAAiB;AAIzB,SAA2BC,cAAa;;;;;;;;;;IAU3BC;;;;AAbb,IAAAC;AACA;AACA;AAKA;AACA;AACA,IAAAC;AACA;;;AAGO,IAAMF,qBAAN,cAAiCG,YAAAA;aAAAA;;;;;;;MAC5BC,YAA2B;MAEnC,YACYC,aACAC,gBACAC,gBACAC,UACV;AACE,cAAK,GAAA,KALGH,cAAAA,aAAAA,KACAC,iBAAAA,gBAAAA,KACAC,iBAAAA,gBAAAA,KACAC,WAAAA;MAGZ;MAEA,MAAMC,eAAeC,QAA+B;AAChD,aAAKN,YAAYM;AACjB,cAAMC,MAAM,KAAKC,KAAK,KAAKH,cAAc;AACzCE,YAAIE,KAAK,8BAAA;AAET,cAAMC,qBAAqB,oBAAIC,IAAAA;AAE/B,mBAAW,CAACC,UAAUC,MAAAA,KAAW,KAAKX,eAAeY,UAAS,GAAI;AAC9D,cAAID,OAAOE,SAASC,WAAWC,SAAU;AAEzC,gBAAMC,SAASL,OAAOK,QAAQC,YAAAA;AAC9B,cAAI,CAACD,UAAUR,mBAAmBU,IAAIF,MAAAA,EAAS;AAC/CR,6BAAmBW,IAAIH,MAAAA;AAEvB,gBAAMI,YAAY,MAAM,KAAKlB,SAASmB,QAAQX,QAAAA;AAC9C,cAAI,CAACU,UAAW;AAEhB,gBAAM,KAAKE,oBAAoBF,WAAWT,QAA2BP,MAAAA;QACzE;MACJ;MAEA,MAAMkB,oBAAoBX,QAAgBY,YAA6BnB,QAAgC;AACnG,cAAMC,MAAM,KAAKC,KAAK,KAAKgB,mBAAmB;AAC9C,cAAME,SAASpB,UAAU,KAAKN;AAC9B,YAAI,CAAC0B,QAAQ;AACTnB,cAAIoB,KAAK,gDAAA;AACT;QACJ;AAEA,cAAMT,SAASL,OAAOK,OAAOU,YAAW;AACxCrB,YAAIE,KAAK,kCAAkCS,MAAAA,6BAAmCO,WAAWI,IAAI,GAAG;AAEhG,cAAMC,eAAenC,OAAAA;AACrB,cAAMoC,iBAAiBC,mBAAmB,KAAK/B,aAAa;UAACgC,UAAU;UAAMC,gBAAgBhB;QAAM,CAAA;AAMnG,mBAAWiB,SAASV,WAAWW,UAAS,GAAI;AACxC,cAAIC;AACJ,kBAAQF,MAAME,SAAO;YACjB,KAAKC,aAAaC;AACdF,wBAAU,KAAKG,oBAAoBtB,MAAAA;AACnC;YACJ,KAAKoB,aAAaG,SAAS;AACvBJ,wBAAU,KAAKK,qBAAqBxB,QAAQiB,MAAMQ,SAASd,IAAI;AAC/D;YACJ;YACA;AACIQ,wBAAU,KAAKO,kBAAkB1B,MAAAA;AACjC;UACR;AAEA,gBAAM2B,SAASV,MAAMU,OAAOjB,YAAW;AACvC,gBAAMkB,gBAAgB,KAAKC,oBAAoBZ,KAAAA;AAC/C,qBAAWa,SAAQb,MAAMc,OAAO;AAC5BnB,yBAAae,MAAAA,EAAQ,GAAGG,KAAAA,IAAQjB,gBAAgBe,eAAeT,OAAAA;UACnE;QACJ;AAEA,YAAIxB,OAAOqC,QAAQ;AACfxB,iBAAOyB,IAAI,IAAIjC,MAAAA,IAAUY,YAAAA;QAC7B;MACJ;MAEQiB,oBAAoBZ,OAAwB;AAChD,eAAO,CAACiB,KAAqBC,MAAmBC,SAAAA;AAC5C,cAAIF,IAAIG,QAAQ;AACZ,uBAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQP,IAAIG,MAAM,GAAG;AACnD,kBAAIH,IAAIQ,KAAKJ,GAAAA,MAASK,QAAW;AAC7BT,oBAAIQ,KAAKJ,GAAAA,IAAOC;cACpB;YACJ;UACJ;AACA,cAAItB,MAAM2B,WAAW;AACjBV,gBAAIQ,KAAKG,SAAS;UACtB;AACA,cAAIX,IAAIY,MAAMC,QAAQ,OAAO;AACzBb,gBAAIQ,KAAKG,SAAS;UACtB;AACAT,eAAAA;QACJ;MACJ;MAEQd,oBAAoBtB,QAAgB;AACxC,eAAO,OAAOkC,KAAqBc,QAAAA;AAC/B,gBAAM,EAACC,KAAI,IAAIf;AACf,cAAI,CAACe,MAAM;AACPD,gBAAIE,OAAO,GAAA,EAAKC,KAAK;cAACC,OAAO;YAAc,CAAA;AAC3C;UACJ;AACA,cAAI;AACA,kBAAMC,OAAOJ,KAAKK,cAAc;cAACL,KAAKK;gBAAeL,KAAKM;AAC1DP,gBAAIE,OAAO,GAAA,EAAKC,KAAK,MAAM,KAAKlE,eAAeuE,kBAAkBH,MAAMrD,MAAAA,CAAAA;UAC3E,SAASoD,OAAO;AACZJ,gBAAIE,OAAO,GAAA,EAAKC,KAAK;cAACC,OAAQA,MAAgBK;YAAO,CAAA;UACzD;QACJ;MACJ;MAEQjC,qBAAqBxB,QAAgB0D,cAAsB;AAC/D,eAAO,OAAOxB,KAAqBc,QAAAA;AAC/B,cAAI;AACA,kBAAM,KAAK/D,eAAe0E,eAAe3D,QAAQ0D,cAAcxB,KAAKc,GAAAA;UACxE,SAASY,GAAQ;AACb,iBAAKvE,IAAI+D,MAAM,kBAAkBpD,MAAAA,IAAU0D,YAAAA,aAAyBE,GAAGH,WAAWG,CAAAA,EAAG;AACrFZ,gBAAIE,OAAO,GAAA,EAAKC,KAAK;cAACC,OAAO;YAA2B,CAAA;UAC5D;QACJ;MACJ;MAEQ1B,kBAAkBV,gBAAwB;AAC9C,eAAO,OAAOkB,KAAqBc,QAAAA;AAC/B,gBAAM3D,MAAM,KAAKC,KAAK,GAAG0B,cAAAA,aAA2B;AACpD3B,cAAIwE,MAAM,kBAAkBC,KAAKC,UAAU7B,IAAIQ,IAAI,CAAA,EAAG;AACtDM,cAAIE,OAAO,GAAA;QACf;MACJ;IACJ;;;;;;;;;;;;;;;AC/FA,eAAsBc,wBAAAA;AAClB,QAAMC,MAAMC,KAAKD,IAAG;AACpB,MAAIE,gBAAgBF,MAAMG,YAAa,QAAOD;AAE9C,QAAME,MAAM,MAAMC,MAAMC,kBAAAA;AACxB,MAAI,CAACF,IAAIG,GAAI,OAAM,IAAIC,MAAM,2BAA2BJ,IAAIK,MAAM,EAAE;AAEpE,QAAMC,OAAO,MAAMN,IAAIO,KAAI;AAC3BT,iBAAeQ,KAAKE;AACpBT,gBAAcH,MAAMa;AACpB,SAAOX;AACX;AAEO,SAASY,eAAeC,UAA2B;AACtD,QAAMC,UAAoC,CAAA;AAE1C,aAAWC,WAAWF,UAAU;AAC5B,UAAMG,QAAQD,QAAQE,GAAGC,QAAQ,GAAA;AACjC,QAAIF,QAAQ,EAAG;AAEf,UAAMG,SAASJ,QAAQE,GAAGG,UAAU,GAAGJ,KAAAA;AACvC,UAAMK,UAASN,QAAQE,GAAGG,UAAUJ,QAAQ,CAAA;AAC5C,UAAMM,iBAAiBC,0BAA0BJ,MAAAA,KAAWA;AAC5D,UAAMK,OAAOT,QAAQU;AACrB,UAAMC,UAAUX,QAAQW;AAExBZ,YAAQa,KAAK;MACTC,QAAQ;MACRC,YAAYd,QAAQE;MACpBa,oBAAoBf,QAAQgB,kBAAkBhB,QAAQE;MACtDe,MAAMjB,QAAQiB,QAAQX;MACtBC;MACAW,WAAW;MACX,GAAGC,YAAY;QACXC,aAAapB,QAAQoB;QACrBC,eAAerB,QAAQsB;QACvBC,UAAUd,MAAMc;QAChBC,iBAAiBf,MAAMgB;QACvBC,kBAAkBjB,MAAMkB;QACxBC,qBAAqB5B,QAAQ6B;QAC7BC,cAAc9B,QAAQ+B,qBAAqB;UAACA,oBAAoB/B,QAAQ+B;QAAkB,IAAIC;MAClG,CAAA;MACA,GAAGb,YAAY;QACXR,SAASA,UAAUQ,YAAY;UAC3Bc,OAAOtB,QAAQuB,SAASC,WAAWxB,QAAQuB,MAAM,IAAIF;UACrDI,QAAQzB,QAAQ0B,aAAaF,WAAWxB,QAAQ0B,UAAU,IAAIL;QAClE,CAAA,IAA0CA;QAC1CM,UAAUnB,YAAY;UAClBoB,WAAW9B,MAAM8B;UACjBC,SAASxC,QAAQwC;UACjBxB,gBAAgBhB,QAAQgB;QAC5B,CAAA;MACJ,CAAA;IACJ,CAAA;EACJ;AAEA,SAAOjB;AACX;AA5GA,IAiCaS,2BAYPnB,oBACAO,cAEFX,cACAC;AAjDJ;;;IAAAuD;AAiCO,IAAMjC,4BAAoD;MAC7DkC,WAAW;MACXC,QAAQ;MACRC,QAAQ;MACRC,MAAM;MACN,cAAc;MACdC,WAAW;MACXC,QAAQ;MACRC,UAAU;MACVC,MAAM;IACV;AAEA,IAAM5D,qBAAqB;AAC3B,IAAMO,eAAe,KAAK,KAAK;AAE/B,IAAIX,eAAyC;AAC7C,IAAIC,cAAc;AAEIJ;AAaNe;;;;;ACpBT,SAASqD,YAAYC,KAAW;AACnC,MAAIC,iBAAiBC,KAAKC,CAAAA,MAAKH,IAAII,WAAWD,CAAAA,CAAAA,EAAK,QAAO;AAC1D,MAAIE,iBAAiBH,KAAKI,CAAAA,MAAKN,IAAIO,SAASD,CAAAA,CAAAA,EAAK,QAAO;AACxD,MAAIN,QAAQ,cAAe,QAAO;AAClC,SAAO;AACX;AAEO,SAASQ,mBAAmBR,KAAW;AAC1C,QAAMS,WAAWT,IAAIU,QAAQ,GAAA;AAC7B,MAAID,YAAY,EAAG,QAAOT,IAAIW,UAAUF,WAAW,CAAA;AAEnD,QAAMG,SAASZ,IAAIU,QAAQ,GAAA;AAC3B,MAAIE,UAAU,GAAG;AACb,UAAMC,SAASb,IAAIW,UAAU,GAAGC,MAAAA;AAChC,QAAIE,2BAA2BD,MAAAA,GAAS;AACpC,aAAOb,IAAIW,UAAUC,SAAS,CAAA;IAClC;EACJ;AAEA,SAAOZ;AACX;AAEA,eAAsBe,qBAAAA;AAClB,QAAMC,MAAMC,KAAKD,IAAG;AACpB,MAAIE,cAAcF,MAAMG,aAAa,QAAOD;AAE5C,QAAME,MAAM,MAAMC,MAAMC,WAAAA;AACxB,MAAI,CAACF,IAAIG,GAAI,OAAM,IAAIC,MAAM,0BAA0BJ,IAAIK,MAAM,EAAE;AAEnEP,eAAa,MAAME,IAAIM,KAAI;AAC3BP,EAAAA,eAAcH,MAAMW;AACpB,SAAOT;AACX;AAEA,SAASU,kBAAkBC,OAAmB;AAC1C,QAAMC,OAAgC,CAAC;AACvC,MAAID,MAAME,0BAA2BD,MAAKE,mBAAmB;AAC7D,MAAIH,MAAMI,gBAAiBH,MAAKI,SAAS;AACzC,MAAIL,MAAMM,wBAAyBL,MAAKM,iBAAiB;AACzD,MAAIP,MAAMQ,mBAAoBP,MAAKQ,YAAY;AAC/C,MAAIT,MAAMU,mBAAoBT,MAAKU,YAAY;AAC/C,MAAIX,MAAMY,sBAAuBX,MAAKY,eAAe;AACrD,SAAOC,OAAOC,KAAKd,IAAAA,EAAMe,SAAS,IAAIf,OAAOgB;AACjD;AAEA,SAASC,oBAAoB/C,KAAa6B,OAAmB;AACzD,MAAIA,MAAMmB,kBAAkB;AACxB,UAAMC,SAASnC,2BAA2Be,MAAMmB,gBAAgB;AAChE,QAAIC,OAAQ,QAAOA;EACvB;AAEA,QAAMxC,WAAWT,IAAIU,QAAQ,GAAA;AAC7B,MAAID,YAAY,GAAG;AACf,UAAMI,SAASb,IAAIW,UAAU,GAAGF,QAAAA;AAChC,UAAMwC,SAASnC,2BAA2BD,MAAAA;AAC1C,QAAIoC,OAAQ,QAAOA;EACvB;AAEA,SAAOH;AACX;AAEO,SAASI,sBAAsBC,MAAkC;AACpE,QAAMC,UAAoC,CAAA;AAE1C,aAAW,CAACpD,KAAK6B,KAAAA,KAAUc,OAAOU,QAAQF,IAAAA,GAAO;AAC7C,QAAI,CAACpD,YAAYC,GAAAA,EAAM;AAEvB,UAAMsD,SAAS9C,mBAAmBR,GAAAA;AAClC,UAAMuD,iBAAiBR,oBAAoB/C,KAAK6B,KAAAA;AAChD,UAAM2B,gBAAgB3B,MAAM4B,oBAAoB5B,MAAM6B;AAEtDN,YAAQO,KAAK;MACTC,QAAQ;MACRC,YAAY7D;MACZ8D,oBAAoBR;MACpBS,MAAMT;MACNU,WAAW;MACX,GAAGC,YAAY;QACXV;QACAC;QACAU,cAActC,kBAAkBC,KAAAA;QAChCsC,SAASF,YAAY;UACjBG,OAAOvC,MAAMwC;UACbC,QAAQzC,MAAM0C;UACdC,WAAW3C,MAAM4C;UACjBC,YAAY7C,MAAM8C;QACtB,CAAA;QACAC,UAAUX,YAAY;UAClBY,MAAMhD,MAAMgD;UACZ7B,kBAAkBnB,MAAMmB;UACxB8B,mBAAmBjD,MAAMiD;QAC7B,CAAA;MACJ,CAAA;IACJ,CAAA;EACJ;AAEA,SAAO1B;AACX;AA7IA,IAqBM9B,aACAK,eAEFT,YACAC,cAEElB,kBAMAI,kBAEOS;AAnCb;;;IAAAiE;AAqBA,IAAMzD,cAAc;AACpB,IAAMK,gBAAe,KAAK,KAAK;AAE/B,IAAIT,aAAkD;AACtD,IAAIC,eAAc;AAElB,IAAMlB,mBAAmB;MACrB;MAAU;MAAY;MAAc;MAAmB;MACvD;MAAgB;MAAiB;MAAa;MAAc;MAC5D;MAAS;MAAS;;AAGtB,IAAMI,mBAAmB;MAAC;MAAQ;MAAQ;MAAa;MAAa;MAAQ;;AAErE,IAAMS,6BAAqD;MAC9DkE,QAAQ;MACRC,WAAW;MACXC,QAAQ;MACRC,SAAS;MACTC,QAAQ;MACRC,UAAU;IACd;AAEgBtF;AAOAS;AAeMO;AAYba;AAWAmB;AAgBOG;;;;;AC3DT,SAASoC,kBAAkBC,OAAqB;AACnD,QAAMC,KAAKD,MAAMC,GAAGC,YAAW;AAE/B,MAAI,CAACC,qBAAoBH,KAAAA,EAAQ,QAAO;AAExC,MAAII,sBAAsBC,KAAKC,CAAAA,MAAKL,GAAGM,SAASD,CAAAA,CAAAA,EAAK,QAAO;AAC5D,MAAIL,GAAGO,SAAS,OAAA,KAAYP,GAAGO,SAAS,OAAA,KAAYP,GAAGO,SAAS,MAAA,EAAS,QAAO;AAEhF,MAAIP,GAAGO,SAAS,GAAA,KAAQ,CAACP,GAAGQ,WAAW,aAAA,KAAkB,CAACR,GAAGQ,WAAW,YAAA,GAAe;AACnF,UAAMC,SAAST,GAAGU,UAAU,GAAGV,GAAGW,QAAQ,GAAA,CAAA;AAC1C,UAAMC,mBAAmB;MAAC;MAAU;MAAa;MAAU;MAAc;MAAa;MAAU;MAAY;;AAC5G,QAAI,CAACA,iBAAiBL,SAASE,MAAAA,EAAS,QAAO;EACnD;AAEA,SAAO;AACX;AAEA,SAASP,qBAAoBH,OAAqB;AAC9C,MAAIA,MAAMc,QAAQ;AACd,UAAMA,SAASC,mBAAmBf,MAAMc,OAAOZ,YAAW,CAAA;AAC1D,QAAIY,OAAQ,QAAOA;EACvB;AAEA,QAAMb,KAAKD,MAAMC,GAAGC,YAAW;AAC/B,aAAW,CAACQ,QAAQI,MAAAA,KAAWE,OAAOC,QAAQF,kBAAAA,GAAqB;AAC/D,QAAId,GAAGQ,WAAWC,MAAAA,EAAS,QAAOI;EACtC;AAEA,SAAOI;AACX;AAEA,SAASC,mBAAkBnB,OAAqB;AAC5C,QAAMoB,OAAgC,CAAC;AACvC,MAAIpB,MAAMqB,UAAWD,MAAKC,YAAY;AACtC,MAAIrB,MAAMsB,UAAWF,MAAKE,YAAY;AACtC,MAAItB,MAAMuB,WAAYH,MAAKG,aAAa;AACxC,MAAIvB,MAAMwB,kBAAmBJ,MAAKI,oBAAoB;AACtD,SAAOR,OAAOS,KAAKL,IAAAA,EAAMM,SAAS,IAAIN,OAAOF;AACjD;AAEA,SAASS,cAAcC,QAAe;AAClC,MAAI,CAACA,OAAQ,QAAOV;AACpB,QAAMZ,IAAIsB,OAAO1B,YAAW;AAC5B,MAAII,MAAM,QAAQA,MAAM,YAAYA,MAAM,SAAU,QAAO;AAC3D,MAAIA,MAAM,aAAaA,MAAM,UAAUA,MAAM,eAAgB,QAAO;AACpE,MAAIA,MAAM,gBAAgBA,MAAM,SAAU,QAAO;AACjD,MAAIA,MAAM,cAAcA,MAAM,eAAgB,QAAO;AACrD,SAAOY;AACX;AAUA,eAAsBW,uBAAAA;AAClB,QAAMC,MAAMC,KAAKD,IAAG;AACpB,MAAIE,iBAAgBF,MAAMG,aAAa,QAAOD;AAE9C,QAAME,MAAM,MAAMC,MAAMC,aAAAA;AACxB,MAAI,CAACF,IAAIG,GAAI,OAAM,IAAIC,MAAM,2BAA2BJ,IAAIN,MAAM,EAAE;AAEpE,QAAMW,OAAO,MAAML,IAAIM,KAAI;AAE3B,QAAMC,OAAyB,CAAA;AAC/B,aAAWC,YAAY1B,OAAO2B,OAAOJ,IAAAA,GAAO;AACxC,QAAI,CAACG,SAASE,OAAQ;AACtB,eAAW5C,SAASgB,OAAO2B,OAAOD,SAASE,MAAM,GAAG;AAChD,UAAI5C,MAAMC,GAAIwC,MAAKI,KAAK7C,KAAAA;IAC5B;EACJ;AAEAgC,EAAAA,gBAAeS;AACfR,EAAAA,eAAcH,MAAMgB;AACpB,SAAOd;AACX;AAEO,SAASe,wBAAwBH,QAAwB;AAC5D,QAAMI,UAAoC,CAAA;AAC1C,QAAMC,cAAc;AAEpB,aAAWjD,SAAS4C,QAAQ;AACxB,QAAI,CAAC5C,MAAMC,GAAI;AAEf,UAAMiD,iBAAiB/C,qBAAoBH,KAAAA;AAC3C,UAAMmD,YAAYpD,kBAAkBC,KAAAA;AACpC,UAAMoD,OAAOpD,MAAMoD;AACnB,UAAMC,QAAQrD,MAAMqD;AACpB,UAAMzB,SAASD,cAAc3B,MAAM4B,MAAM;AAEzC,UAAM0B,QAAgC;MAClCC,QAAQ;MACRC,YAAYxD,MAAMC;MAClBwD,MAAMzD,MAAMyD,QAAQzD,MAAMC;MAC1BkD;IACJ;AACA,QAAID,eAAgBI,OAAMJ,iBAAiBA;AAC3C,QAAIG,OAAOK,WAAW,KAAMJ,OAAMK,gBAAgBN,MAAMK;AACxD,QAAI1D,MAAM4D,YAAYC,MAAOP,OAAMQ,kBAAkB9D,MAAM4D,WAAWC;AACtE,QAAI7D,MAAM4D,YAAYG,OAAQT,OAAMU,mBAAmBhE,MAAM4D,WAAWG;AACxE,QAAI/D,MAAMiE,gBAAgB,KAAMX,OAAMY,eAAelE,MAAMiE;AAC3D,QAAIjE,MAAMmE,aAAcb,OAAMc,cAAcpE,MAAMmE;AAClD,UAAM/C,OAAOD,mBAAkBnB,KAAAA;AAC/B,QAAIoB,KAAMkC,OAAMe,eAAejD;AAC/B,QAAIgC,MAAM;AACN,YAAMkB,IAAoD,CAAC;AAC3D,UAAIlB,KAAKS,SAAS,KAAMS,GAAET,QAAQT,KAAKS,QAAQZ;AAC/C,UAAIG,KAAKW,UAAU,KAAMO,GAAEP,SAASX,KAAKW,SAASd;AAClD,UAAIG,KAAKmB,cAAc,KAAMD,GAAEE,YAAYpB,KAAKmB,aAAatB;AAC7D,UAAIG,KAAKqB,eAAe,KAAMH,GAAEI,aAAatB,KAAKqB,cAAcxB;AAChE,UAAIjC,OAAOS,KAAK6C,CAAAA,EAAG5C,SAAS,EAAG4B,OAAMqB,UAAUL;IACnD;AACA,UAAMM,OAAgC,CAAC;AACvC,QAAIhD,OAAQgD,MAAK,QAAA,IAAYhD;AAC7B,QAAI5B,MAAM6E,UAAWD,MAAK,WAAA,IAAe5E,MAAM6E;AAC/C,QAAIxB,OAAOQ,SAAS,KAAMe,MAAK,kBAAA,IAAsBvB,MAAMQ;AAC3D,QAAIR,OAAOU,UAAU,KAAMa,MAAK,mBAAA,IAAuBvB,MAAMU;AAC7D,QAAI/C,OAAOS,KAAKmD,IAAAA,EAAMlD,SAAS,EAAG4B,OAAMwB,WAAWF;AAEnD5B,YAAQH,KAAKS,KAAAA;EACjB;AAEA,SAAON;AACX;AAnJA,IAAMZ,eACAU,eAEFd,eACAC,cAEElB,oBAaAX;AAnBN;;;IAAMgC,gBAAgB;AACtB,IAAMU,gBAAe,KAAK,KAAK;AAE/B,IAAId,gBAAwC;AAC5C,IAAIC,eAAc;AAElB,IAAMlB,qBAA6C;MAC/CgE,KAAK;MAAU,MAAM;MAAU,MAAM;MAAU,MAAM;MACrDC,QAAQ;MACRC,QAAQ;MACRC,OAAO;MACPC,SAAS;MACTC,SAAS;MACTC,UAAU;MACVC,MAAM;MACNC,KAAK;MACLC,OAAO;IACX;AAEA,IAAMpF,wBAAwB;MAAC;MAAQ;MAAS;MAAS;MAAO;MAAO;MAAO;MAAS;MAAS;MAAQ;;AAExFL;AAiBPI,WAAAA,sBAAAA;AAcAgB,WAAAA,oBAAAA;AASAQ;AAkBaE;AAsBNkB;;;;;AC7HhB;;;;AAMA;AAQA;;;;;ACVO,SAAS0C,gBACZC,cACAC,aACAC,gBACAC,eAAsB;AAEtB,QAAMC,UAAwB,CAAA;AAC9B,QAAMC,OAAO,oBAAIC,IAAAA;AAEjB,QAAMC,MAAM,wBAACC,KAAaC,OAAsBC,WAAAA;AAC5C,UAAMC,QAAOC,mBAAmBJ,GAAAA;AAChC,UAAMK,MAAM,GAAGF,MAAKG,UAAU,IAAIZ,cAAAA;AAClC,QAAIG,KAAKU,IAAIF,GAAAA,EAAM;AACnBR,SAAKE,IAAIM,GAAAA;AACTT,YAAQY,KAAK;MACTC,eAAejB;MACfkB,OAAOV;MACPW,kBAAkBR,MAAKG;MACvBM,YAAYX;MACZY,iBAAiBnB;MACjBoB,QAAQ;MACRC,YAAY;MACZb;MACAc,QAAQ;IACZ,CAAA;EACJ,GAhBY;AAoBZjB,MAAIN,aAAa,YAAY,GAAA;AAE7B,QAAMwB,QAAQxB,YAAYyB,QAAQ,GAAA;AAClC,QAAMC,UAASF,SAAS,IAAIxB,YAAY2B,UAAUH,QAAQ,CAAA,IAAKI;AAC/D,MAAIF,SAAQ;AACRpB,QAAIoB,SAAQ,YAAY,EAAA;AACxB,QAAIA,QAAOG,SAAS,GAAA,GAAM;AACtBvB,UAAIoB,QAAOI,QAAQ,OAAO,GAAA,GAAM,gBAAgB,EAAA;IACpD;EACJ;AAEA,MAAI5B,iBAAiBA,kBAAkBF,aAAa;AAChDM,QAAIJ,eAAe,YAAY,EAAA;AAC/B,UAAM6B,YAAY7B,cAAcuB,QAAQ,GAAA;AACxC,QAAIM,aAAa,GAAG;AAChB,YAAMC,aAAa9B,cAAcyB,UAAUI,YAAY,CAAA;AACvDzB,UAAI0B,YAAY,YAAY,EAAA;AAC5B,UAAIA,WAAWH,SAAS,GAAA,GAAM;AAC1BvB,YAAI0B,WAAWF,QAAQ,OAAO,GAAA,GAAM,gBAAgB,EAAA;MACxD;AAEA,YAAMG,YAAYD,WAAWE,MAAM,8BAAA;AACnC,UAAID,WAAW;AACX,cAAME,aAAa,GAAGF,UAAU,CAAA,CAAE,GAAGA,UAAU,CAAA,CAAE,IAAIA,UAAU,CAAA,CAAE,IAAIA,UAAU,CAAA,CAAE;AACjF3B,YAAI6B,YAAY,gBAAgB,EAAA;AAChC,YAAIA,WAAWN,SAAS,GAAA,GAAM;AAC1BvB,cAAI6B,WAAWL,QAAQ,OAAO,GAAA,GAAM,gBAAgB,EAAA;QACxD;MACJ;IACJ;EACJ;AAKA,QAAMM,aAAalC,iBAAiBwB,WAAU1B;AAC9C,QAAMU,OAAOC,mBAAmByB,UAAAA;AAChC,QAAMC,OAAO3B,KAAKG;AAGlB,QAAMyB,eAAe5B,KAAK6B,WAAWC,UAAUH,IAAAA,IAAQT;AACvD,MAAIU,cAAc;AACdhC,QAAIgC,cAAc,aAAa,EAAA;EACnC;AAGA,QAAMG,mBAAmBC,sBAAsBL,IAAAA;AAC/C,MAAII,kBAAkB;AAClBnC,QAAImC,kBAAkB,aAAa,EAAA;EACvC;AAGA,QAAME,kBAAkBC,aAAaP,IAAAA;AACrC,MAAIM,iBAAiB;AACjBrC,QAAIqC,iBAAiB,aAAa,EAAA;EACtC;AAIA,QAAME,oBAAoBP,gBAAgBG;AAC1C,MAAII,mBAAmB;AACnB,UAAMC,iBAAiBF,aAAaC,iBAAAA;AACpC,QAAIC,gBAAgB;AAChBxC,UAAIwC,gBAAgB,aAAa,EAAA;IACrC;EACJ;AAGA,QAAMC,gBAAgBT,gBAAgBG;AAGtC,QAAMO,WAAWD,iBAAiBV;AAClC,MAAIW,SAASnB,SAAS,GAAA,GAAM;AACxBvB,QAAI0C,SAASlB,QAAQ,OAAO,GAAA,GAAM,aAAa,EAAA;EACnD,WAAWpB,KAAKuC,eAAevC,KAAKuC,YAAYpB,SAAS,GAAA,GAAM;AAC3D,UAAMqB,cAAcxC,KAAKuC,YAAYnB,QAAQ,OAAO,GAAA;AACpD,UAAMqB,aAAazC,KAAKuC;AACxB,QAAID,SAASnB,SAASqB,WAAAA,GAAc;AAChC5C,UAAI0C,SAASlB,QAAQoB,aAAaC,UAAAA,GAAa,aAAa,EAAA;IAChE;EACJ;AAMA,MAAIzC,KAAKuC,eAAevC,KAAK0C,YAAY1C,KAAK2C,YAAY;AACtD,UAAMC,SAAS5C,KAAK2C;AACpB,UAAME,UAAU7C,KAAKuC;AACrB,UAAMO,OAAO9C,KAAK0C;AAElB9C,QAAI,GAAGgD,MAAAA,GAASC,OAAAA,IAAWC,IAAAA,IAAQ,WAAW,EAAA;AAE9C,QAAI9C,KAAK+C,aAAa;AAClBnD,UAAI,GAAGgD,MAAAA,GAASC,OAAAA,IAAW7C,KAAK+C,WAAW,IAAID,IAAAA,IAAQ,WAAW,EAAA;IACtE;EACJ;AAEA,SAAOrD;AACX;AArIA;;;;AAKgBL;;;;;ACLhB;;;AAGA;;;;;ACqDA,SAAS4D,aAAaC,IAAU;AAC5B,SAAOC,mBAAmBD,EAAAA,EAAIE;AAClC;AAEA,SAASC,iBAAiBD,YAAkB;AACxC,QAAME,WAAqB,CAAA;AAC3B,QAAMC,KAAKC,UAAUJ,UAAAA;AACrB,MAAIG,GAAID,UAASG,KAAKF,EAAAA;AACtB,QAAMG,KAAKC,sBAAsBP,UAAAA;AACjC,MAAIM,GAAIJ,UAASG,KAAKC,EAAAA;AACtB,QAAME,KAAKC,aAAaT,UAAAA;AACxB,MAAIQ,GAAIN,UAASG,KAAKG,EAAAA;AACtB,SAAON;AACX;AAEA,SAASQ,gBACLC,aACAC,UACAC,cAAiC;AAEjC,QAAMb,aAAaH,aAAac,WAAAA;AAEhC,QAAMG,YAAYD,aAAaE,IAAIf,UAAAA;AACnC,MAAIc,UAAW,QAAOF,SAASG,IAAID,SAAAA;AAEnC,aAAWE,WAAWf,iBAAiBD,UAAAA,GAAa;AAChD,UAAMiB,aAAaJ,aAAaE,IAAIC,OAAAA;AACpC,QAAIC,WAAY,QAAOL,SAASG,IAAIE,UAAAA;EACxC;AAEA,SAAOC;AACX;AAEA,SAASC,aACLC,OACAC,cACAC,WAAyD;AAEzD,QAAMC,aAAaC,iBAAiBJ,KAAAA;AACpC,MAAI,CAACG,WAAY,QAAOL;AAExB,aAAWO,UAAUF,YAAY;AAC7B,eAAWG,OAAOL,cAAc;AAC5B,UAAIK,IAAID,WAAWA,QAAQ;AACvB,cAAME,MAAML,UAAUI,GAAAA;AACtB,YAAIC,OAAO,KAAM,QAAOA;MAC5B;IACJ;EACJ;AACA,SAAOT;AACX;AAEA,SAASU,kBAAkBP,cAAsC;AAC7D,QAAME,aAAaC,iBAAiB,cAAA;AACpC,QAAMK,SAAkC,CAAC;AACzC,MAAIC,SAAS;AAEb,aAAWL,UAAU;OAAIF;IAAYQ,QAAO,GAAI;AAC5C,eAAWL,OAAOL,cAAc;AAC5B,UAAIK,IAAID,WAAWA,UAAUC,IAAIM,gBAAgBC,OAAOC,KAAKR,IAAIM,YAAY,EAAEG,SAAS,GAAG;AACvFF,eAAOG,OAAOP,QAAQH,IAAIM,YAAY;AACtCF,iBAAS;MACb;IACJ;EACJ;AAEA,SAAOA,SAASD,SAASX;AAC7B;AAEA,SAASmB,eAAeC,SAAgB;AACpC,QAAMZ,MAAMY,QAAQjB;AAEpB,QAAMkB,YAAqC;IACvCC,aAAaF,QAAQE;IACrBC,uBAAuBH,QAAQG;IAC/BC,MAAMJ,QAAQI;IACdC,gBAAgBL,QAAQK;IACxBC,SAAS;SAAI,IAAIC,IAAInB,IAAIoB,IAAIC,CAAAA,MAAKA,EAAEtB,MAAM,CAAA;;IAC1CJ,cAAcK;EAClB;AAEA,QAAMsB,cAAc7B,aAAa,eAAeO,KAAKqB,CAAAA,MAAKA,EAAEC,WAAW;AACvE,MAAIA,eAAe,KAAMT,WAAUS,cAAcA;AAEjD,QAAMC,gBAAgB9B,aAAa,iBAAiBO,KAAKqB,CAAAA,MAAKA,EAAEE,aAAa;AAC7E,MAAIA,iBAAiB,KAAMV,WAAUU,gBAAgBA;AAErD,QAAMC,kBAAkB/B,aAAa,mBAAmBO,KAAKqB,CAAAA,MAAKA,EAAEG,iBAAiBf,SAASY,EAAEG,kBAAkBhC,MAAAA;AAClH,MAAIgC,gBAAiBX,WAAUW,kBAAkBA;AAEjD,QAAMC,mBAAmBhC,aAAa,oBAAoBO,KAAKqB,CAAAA,MAAKA,EAAEI,kBAAkBhB,SAASY,EAAEI,mBAAmBjC,MAAAA;AACtH,MAAIiC,iBAAkBZ,WAAUY,mBAAmBA;AAEnD,QAAMC,sBAAsBjC,aAAa,uBAAuBO,KAAKqB,CAAAA,MAAKA,EAAEK,qBAAqBjB,SAASY,EAAEK,sBAAsBlC,MAAAA;AAClI,MAAIkC,oBAAqBb,WAAUa,sBAAsBA;AAEzD,QAAMC,oBAAoBlC,aAAa,qBAAqBO,KAAKqB,CAAAA,MAAAA;AAC7D,UAAMO,KAAMP,EAAEf,cAAsCuB;AACpD,WAAOD,MAAMrB,OAAOC,KAAKoB,EAAAA,EAAInB,SAAS,IAAImB,KAAKpC;EACnD,CAAA;AACA,MAAImC,kBAAmBd,WAAUc,oBAAoBA;AAErD,QAAMrB,eAAeJ,kBAAkBF,GAAAA;AACvC,MAAIM,aAAcO,WAAUP,eAAeA;AAE3C,QAAMwB,YAAYrC,aAAa,aAAaO,KAAKqB,CAAAA,MAAMA,EAAEU,UAAkCD,SAAAA;AAC3F,MAAIA,aAAa,KAAMjB,WAAUiB,YAAYA;AAE7C,QAAME,eAAevC,aAAa,gBAAgBO,KAAKqB,CAAAA,MAAKA,EAAEW,YAAY;AAC1E,MAAIA,gBAAgB,KAAMnB,WAAUmB,eAAeA;AAEnD,QAAMC,cAAcxC,aAAa,eAAeO,KAAKqB,CAAAA,MAAKA,EAAEY,WAAW;AACvE,MAAIA,eAAe,KAAMpB,WAAUoB,cAAcA;AAEjD,QAAMC,UAAUzC,aAAa,WAAWO,KAAKqB,CAAAA,MAAKA,EAAEa,OAAO;AAC3D,MAAIA,QAASrB,WAAUqB,UAAUA;AAEjC,SAAOrB;AACX;AAEO,SAASsB,yBACZxC,cAAsC;AAMtC,QAAMT,WAAW,oBAAIkD,IAAAA;AACrB,QAAMjD,eAAe,oBAAIiD,IAAAA;AACzB,QAAMC,YAAwC,CAAA;AAC9C,QAAMC,sBAAgD,CAAA;AAEtD,QAAMC,gBAAgB5C,aAAa6C,OAAOnB,CAAAA,MAAKA,EAAEoB,SAAS;AAC1D,QAAMC,iBAAiB/C,aAAa6C,OAAOnB,CAAAA,MAAK,CAACA,EAAEoB,SAAS;AAE5D,QAAME,cAA4B;IAAC;IAAc;;AACjDJ,gBAAcK,KAAK,CAACC,GAAGC,MAAAA;AACnB,UAAMC,KAAKJ,YAAYK,QAAQH,EAAE9C,MAAM;AACvC,UAAMkD,KAAKN,YAAYK,QAAQF,EAAE/C,MAAM;AACvC,YAAQgD,OAAO,KAAK,KAAKA,OAAOE,OAAO,KAAK,KAAKA;EACrD,CAAA;AAEA,aAAWjD,OAAOuC,eAAe;AAC7B,UAAMtD,cAAce,IAAIkD,sBAAsBlD,IAAImD;AAClD,UAAMC,WAAWpE,gBAAgBC,aAAaC,UAAUC,YAAAA;AAExD,QAAIiE,UAAU;AACVA,eAASzD,aAAahB,KAAKqB,GAAAA;IAC/B,OAAO;AACH,YAAM1B,aAAaH,aAAac,WAAAA;AAChC,YAAMoE,MAAM/E;AACZ,YAAMsC,UAAmB;QACrByC;QACAvC,aAAa7B;QACb8B,uBAAuBzC;QACvB0C,MAAMhB,IAAIgB;QACVC,gBAAgBjB,IAAIiB,kBAAkB;QACtCtB,cAAc;UAACK;;MACnB;AACAd,eAASoE,IAAID,KAAKzC,OAAAA;AAClBzB,mBAAamE,IAAIhF,YAAY+E,GAAAA;AAE7B,iBAAW/D,WAAWf,iBAAiBD,UAAAA,GAAa;AAChD,YAAI,CAACa,aAAaoE,IAAIjE,OAAAA,GAAU;AAC5BH,uBAAamE,IAAIhE,SAAS+D,GAAAA;QAC9B;MACJ;IACJ;EACJ;AAEA,aAAWrD,OAAO0C,gBAAgB;AAC9B,UAAMzD,cAAce,IAAIkD,sBAAsBlD,IAAImD;AAClD,UAAMC,WAAWpE,gBAAgBC,aAAaC,UAAUC,YAAAA;AAExD,QAAIiE,UAAU;AACVA,eAASzD,aAAahB,KAAKqB,GAAAA;IAC/B,OAAO;AACHsC,0BAAoB3D,KAAKqB,GAAAA;IAC7B;EACJ;AAEA,QAAMwD,WAAsC,CAAA;AAC5C,aAAW5C,WAAW1B,SAASuE,OAAM,GAAI;AACrCD,aAAS7E,KAAKgC,eAAeC,OAAAA,CAAAA;AAE7ByB,cAAU1D,KAAK;MACX+E,cAAc9C,QAAQyC;MACtBM,uBAAuB/C,QAAQjB,aAAayB,IAAIC,CAAAA,MAAK,GAAGA,EAAEtB,MAAM,IAAIsB,EAAE8B,UAAU,EAAE;MAClFS,yBAAyB,CAAA;MACzBC,SAAS;QAAC,gBAAgB;aAAI,IAAI1C,IAAIP,QAAQjB,aAAayB,IAAIC,CAAAA,MAAKA,EAAEtB,MAAM,CAAA;UAAI+D,KAAK,IAAA,CAAA;;IACzF,CAAA;EACJ;AAEA,aAAW9D,OAAOsC,qBAAqB;AACnCD,cAAU1D,KAAK;MACX+E,cAAc,aAAa1D,IAAID,MAAM,IAAIC,IAAImD,UAAU;MACvDQ,uBAAuB,CAAA;MACvBC,yBAAyB;QAAC,GAAG5D,IAAID,MAAM,IAAIC,IAAImD,UAAU;;MACzDU,SAAS;QAAC,+CAA+C7D,IAAID,MAAM;;IACvE,CAAA;EACJ;AAEA,SAAO;IAACyD;IAAUlB;IAAqBD;EAAS;AACpD;AAnQA,IA0CMvC;AA1CN;;;;AA0CA,IAAMA,mBAAiD;MACnDoC,SAAS;QAAC;QAAW;QAAc;;MACnCX,eAAe;QAAC;QAAa;QAAW;;MACxCjB,cAAc;QAAC;QAAa;QAAW;;MACvCkB,iBAAiB;QAAC;QAAa;;MAC/BC,kBAAkB;QAAC;QAAa;;MAChCO,cAAc;QAAC;;MACfC,aAAa;QAAC;;MACdP,qBAAqB;QAAC;;MACtBC,mBAAmB;QAAC;;MACpBG,WAAW;QAAC;;MACZR,aAAa;QAAC;QAAc;;IAChC;AAESnD;AAIAI;AAWAS;AAkBAS;AAmBAS;AAiBAS;AAmDOwB;;;;;AC7HhB,SAAS4B,wBACLC,cACAC,WAAkC;AAElC,QAAMC,UAAwB,CAAA;AAC9B,QAAMC,OAAO,oBAAIC,IAAAA;AAEjB,aAAWC,OAAOJ,UAAUK,cAAc;AACtC,UAAMC,OAAOC,mBAAmBH,IAAII,UAAU;AAC9C,UAAMC,MAAM,GAAGH,KAAKI,UAAU,IAAIN,IAAIO,kBAAkB,EAAA,IAAMP,IAAIQ,MAAM;AACxE,QAAIV,KAAKW,IAAIJ,GAAAA,EAAM;AACnBP,SAAKY,IAAIL,GAAAA;AAET,QAAIM,YAAYC,qBAAqBZ,IAAIQ,MAAM,KAAK;AACpD,QAAIR,IAAIQ,WAAW,gBAAgBR,IAAII,WAAWS,SAAS,GAAA,GAAM;AAC7D,YAAMC,SAASd,IAAII,WAAWW,UAAU,GAAGf,IAAII,WAAWY,QAAQ,GAAA,CAAA;AAClE,UAAIF,WAAWlB,UAAUW,kBAAkBO,WAAW,YAAYA,WAAW,eAAeA,WAAW,UAAU;AAC7GH,oBAAY;MAChB;IACJ;AAEA,UAAMM,QAAoB;MACtBC,eAAevB;MACfsB,OAAOjB,IAAII;MACXe,kBAAkBjB,KAAKI;MACvBc,YAAYT;MACZH,QAAQR,IAAIQ;MACZa,YAAYrB,IAAIQ;MAChBc,QAAQX,cAAc,aAAa,MAAMA,cAAc,aAAa,KAAK;MACzEY,QAAQ;IACZ;AACA,QAAIvB,IAAIO,eAAgBU,OAAMO,kBAAkBxB,IAAIO;AAEpDV,YAAQ4B,KAAKR,KAAAA;EACjB;AAEA,SAAOpB;AACX;AAEA,SAAS6B,aAAa9B,WAAkC;AACpD,QAAM+B,UAAmC;IACrCC,cAAchC,UAAUiC;IACxBC,yBAAyBlC,UAAUmC;IACnCC,MAAMpC,UAAUoC;IAChBR,iBAAiB5B,UAAUW;IAC3B0B,SAASrC,UAAUqC;EACvB;AACA,MAAIrC,UAAUsC,eAAe,KAAMP,SAAQO,cAActC,UAAUsC;AACnE,MAAItC,UAAUuC,iBAAiB,KAAMR,SAAQS,iBAAiBxC,UAAUuC;AACxE,MAAIvC,UAAUyC,gBAAiBV,SAAQW,mBAAmB1C,UAAUyC;AACpE,MAAIzC,UAAU2C,iBAAkBZ,SAAQa,oBAAoB5C,UAAU2C;AACtE,MAAI3C,UAAU6C,oBAAqBd,SAAQe,uBAAuB9C,UAAU6C;AAC5E,MAAI7C,UAAU+C,kBAAmBhB,SAAQiB,qBAAqBhD,UAAU+C;AACxE,MAAI/C,UAAUiD,aAAclB,SAAQkB,eAAejD,UAAUiD;AAC7D,MAAIjD,UAAUkD,aAAa,KAAMnB,SAAQmB,YAAYlD,UAAUkD;AAC/D,MAAIlD,UAAUmD,QAAQ,KAAMpB,SAAQoB,OAAOnD,UAAUmD;AACrD,MAAInD,UAAUoD,gBAAgB,KAAMrB,SAAQsB,iBAAiBrD,UAAUoD;AACvE,MAAIpD,UAAUsD,eAAe,KAAMvB,SAAQwB,eAAevD,UAAUsD;AACpE,MAAItD,UAAUwD,SAASC,SAAS,KAAM1B,SAAQ2B,kBAAkB1D,UAAUwD,QAAQC;AAClF,MAAIzD,UAAUwD,SAASG,UAAU,KAAM5B,SAAQ6B,mBAAmB5D,UAAUwD,QAAQG;AACpF,MAAI3D,UAAUwD,SAASK,aAAa,KAAM9B,SAAQ+B,uBAAuB9D,UAAUwD,QAAQK;AAC3F,MAAI7D,UAAUwD,SAASO,cAAc,KAAMhC,SAAQiC,wBAAwBhE,UAAUwD,QAAQO;AAC7F,SAAOhC;AACX;AAEA,eAAsBkC,2BAClBC,YACAC,MAAiB;AAEjB,MAAIC,WAAW;AACf,MAAIC,UAAU;AACd,MAAIC,iBAAiB;AACrB,QAAMC,SAAmB,CAAA;AAEzB,aAAWvE,aAAakE,YAAY;AAChC,QAAI;AACA,YAAMnC,UAAUD,aAAa9B,SAAAA;AAC7B,YAAMwE,MAAM,MAAML,KAAKM,mBAAmB1C,OAAAA;AAC1CqC;AAEA,YAAMM,QAAQ1E,UAAUK,aAAasE,KAAKC,CAAAA,MAAKA,EAAEhE,WAAW,YAAA;AAC5D,YAAMiE,gBAAgBH,OAAOI,WACtBJ,MAAMI,SAAiC,gBAAA,IACxCC;AAEN,YAAMC,mBAAmBC,gBACrBT,IAAIU,IACJlF,UAAUiC,aACVjC,UAAUW,gBACVkE,aAAAA;AAGJ,YAAMM,qBAAqBrF,wBAAwB0E,IAAIU,IAAIlF,SAAAA;AAE3D,YAAMoF,aAAaC,mBAAmB;WAAIL;WAAqBG;OAAmB;AAElF,UAAIC,WAAWE,SAAS,GAAG;AACvB,cAAMC,QAAQ,MAAMpB,KAAKqB,kBAAkBJ,UAAAA;AAC3Cd,0BAAkBiB;MACtB;IACJ,SAASE,KAAK;AACVlB,aAAO1C,KAAK,GAAG7B,UAAUiC,WAAW,KAAKwD,eAAeC,QAAQD,IAAIE,UAAUC,OAAOH,GAAAA,CAAAA,EAAM;IAC/F;EACJ;AAEA,SAAO;IAACrB;IAAUC;IAASC;IAAgBC;EAAM;AACrD;AAEA,SAASc,mBAAmBpF,SAAqB;AAC7C,QAAMC,OAAO,oBAAI2F,IAAAA;AAEjB,aAAWxE,SAASpB,SAAS;AACzB,UAAMQ,MAAM,GAAGY,MAAME,gBAAgB,IAAIF,MAAMO,mBAAmB,EAAA,IAAMP,MAAMI,cAAc,EAAA;AAC5F,UAAMqE,WAAW5F,KAAK6F,IAAItF,GAAAA;AAC1B,QAAI,CAACqF,YAAYzE,MAAMK,SAASoE,SAASpE,QAAQ;AAC7CxB,WAAK8F,IAAIvF,KAAKY,KAAAA;IAClB;EACJ;AAEA,SAAO;OAAInB,KAAK+F,OAAM;;AAC1B;AA3KA,IA6CMjF;AA7CN;;;;AAIA;AAyCA,IAAMA,uBAA+C;MACjDkF,YAAY;MACZC,SAAS;MACTC,WAAW;IACf;AAEStG;AAuCAgC;AA0BamC;AA2CboB;;;;;AC5HT,SAASgB,mBACLC,YACAC,MACAC,gBAAuB;AAEvB,SAAOC,cAAcH,YAAYC,MAAMC,cAAAA;AAC3C;AAEA,eAAeC,cACXH,YACAC,MACAC,gBAAuB;AAEvB,QAAME,SAAS,MAAMH,KAAKI,iBAAiBL,UAAAA;AAC3C,MAAII,OAAQ,QAAOA;AAEnB,QAAME,QAAQ,MAAML,KAAKM,sBAAsBP,YAAYE,cAAAA;AAC3D,MAAII,MAAO,QAAOA;AAElB,QAAME,YAAsD;IACxDC;IAAWC;IAAuBC;IAAmBC;;AAGzD,aAAWC,SAASL,WAAW;AAC3B,UAAMM,WAAWD,MAAMb,UAAAA;AACvB,QAAIc,YAAYA,aAAad,YAAY;AACrC,YAAMe,QAAQ,MAAMd,KAAKI,iBAAiBS,QAAAA;AAC1C,UAAIC,MAAO,QAAOA;AAElB,YAAMC,aAAa,MAAMf,KAAKM,sBAAsBO,UAAUZ,cAAAA;AAC9D,UAAIc,WAAY,QAAOA;IAC3B;EACJ;AAEA,SAAO;AACX;AAEA,SAASC,oBAAoBC,KAA2B;AACpD,QAAMC,SAAuB,CAAC;AAC9B,MAAID,IAAIE,iBAAiB,KAAMD,QAAOC,gBAAgBF,IAAIE;AAC1D,MAAIF,IAAIG,QAASF,QAAOE,UAAUH,IAAIG;AACtC,MAAIH,IAAII,gBAAgBC,OAAOC,KAAKN,IAAII,YAAY,EAAEG,SAAS,EAAGN,QAAOG,eAAeJ,IAAII;AAC5F,MAAIJ,IAAIQ,gBAAgB,KAAMP,QAAOO,eAAeR,IAAIQ;AACxD,MAAIR,IAAIS,YAAaR,QAAOQ,cAAcT,IAAIS;AAC9C,SAAOR;AACX;AAEA,SAASS,uBAAuBC,QAAc;AAC1C,MAAIA,WAAW,UAAW,QAAO;IAAC;;AAClC,MAAIA,WAAW,YAAa,QAAO;IAAC;IAAiB;IAAgB;IAAgB;;AACrF,SAAO,CAAA;AACX;AAEA,eAAsBC,4BAClBC,cACA9B,MAAgB;AAEhB,MAAI+B,UAAU;AACd,MAAIC,WAAW;AACf,MAAIC,YAAY;AAChB,QAAMC,SAAmB,CAAA;AAEzB,aAAWjB,OAAOa,cAAc;AAC5B,QAAI;AACA,YAAMK,cAAclB,IAAImB,sBAAsBnB,IAAIoB;AAClD,YAAMtC,aAAauC,mBAAmBH,WAAAA,EAAapC;AAEnD,YAAMe,QAAQ,MAAMhB,mBAAmBC,YAAYC,MAAMiB,IAAIhB,cAAc;AAC3E,UAAI,CAACa,OAAO;AACRmB;AACA;MACJ;AACAF;AAEA,YAAMb,SAASF,oBAAoBC,GAAAA;AACnC,UAAIK,OAAOC,KAAKL,MAAAA,EAAQM,WAAW,EAAG;AAEtC,YAAMe,gBAAgBZ,uBAAuBV,IAAIW,MAAM;AACvD,YAAM5B,KAAKwC,aAAa1B,MAAM2B,IAAIvB,QAAQqB,eAAetB,IAAIW,MAAM;AACnEI;IACJ,SAASU,KAAK;AACVR,aAAOS,KAAK,GAAG1B,IAAIoB,UAAU,KAAKK,eAAeE,QAAQF,IAAIG,UAAUC,OAAOJ,GAAAA,CAAAA,EAAM;IACxF;EACJ;AAEA,SAAO;IAACX;IAASC;IAAUC;IAAWC;EAAM;AAChD;AAzHA;;;;AAmCSpC;AAQMI;AA6BNc;AAUAW;AAMaE;;;;;ACzEtB,eAAsBkB,YAAYC,MAAkB;AAChD,QAAM,CAACC,UAAUC,aAAaC,eAAAA,IAAmB,MAAMC,QAAQC,IAAI;IAC/DC,sBAAAA,EAAwBC,KAAKC,cAAAA;IAC7BC,mBAAAA,EAAqBF,KAAKG,qBAAAA;IAC1BC,qBAAAA,EAAuBJ,KAAKK,uBAAAA;GAC/B;AAED,QAAM,EAACC,UAAUC,oBAAmB,IAAIC,yBACpC;OAAId;OAAaC;OAAgBC;GAAgB;AAGrD,QAAMa,YAAY,MAAMC,2BAA2BJ,UAAUb,IAAAA;AAE7D,QAAMkB,WAAW,MAAMC,4BAA4BL,qBAAqBd,IAAAA;AAExE,SAAO;IAACgB;IAAWE;EAAQ;AAC/B;AA/BA;;;;AACA;AACA;AACA;AACA;AACA;AAUsBnB;;;;;ACftB;;;;AAEA;AACA;AAEA;AAEA;AAEA;;;;;ACTA,IAAAqB,YAAA;;;;AACA;AAGA;AAIA;AAEA;AAEA;AAEA;AAEA;;;;;AChBA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IA+BZC;;;;AA9Bb;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AAGA;;;AAwBO,IAAMH,wBAAN,cAAoCI,YAAAA;aAAAA;;;;;;;;MAEvC,YACYC,SACAC,cACAC,qBACAC,iBACAC,iBACV;AACE,cAAK,GAAA,KANGJ,UAAAA,SAAAA,KACAC,eAAAA,cAAAA,KACAC,sBAAAA,qBAAAA,KACAC,kBAAAA,iBAAAA,KACAC,kBAAAA;MAGZ;MAEA,MAAMC,WAAqC;AACvC,cAAMC,kBAAkB,MAAM,KAAKC,sBAAqB;AACxD,cAAM,KAAKC,aAAY;AACvB,eAAO;UAACC,WAAWH;QAAe;MACtC;MAEA,MAAME,eAA+D;AACjE,cAAME,UAAS,KAAKC,KAAK,KAAKH,YAAY;AAC1C,cAAMI,WAAW,MAAM,KAAKZ,QAAQa,aAAY;AAChD,YAAIC,SAAS;AACb,YAAIC,YAAY;AAEhB,mBAAWC,SAASJ,UAAU;AAC1B,gBAAMK,cAAcD,MAAME;AAC1B,cAAI,CAACD,YAAa;AAElB,gBAAME,SAAS,MAAM,KAAKf,gBAAgBgB,QAAQH,aAAa;YAC3DI,YAAYL,MAAMM;YAClBC,YAAY;YACZ,GAAGC,YAAY;cAACC,gBAAgBT,MAAMU;YAAa,CAAA;UACvD,CAAA;AAEA,cAAIP,OAAOQ,cAAc;AACrB,kBAAMC,YAAY,MAAM,KAAK3B,aAAa4B,kBAAkBV,OAAOW,WAAW;AAC9E,kBAAM,KAAK9B,QAAQ+B,OAAOf,MAAMgB,IAAI;cAChCC,eAAed,OAAOQ;cACtBO,UAAUjB;cACVkB,iBAAiBhB,OAAOiB;cACxBC,cAAclB,OAAOmB;cACrBC,kBAAkBpB,OAAOqB;cACzBC,cAActB,OAAOuB;cACrBC,gBAAgBxB,OAAOyB;cACvBC,aAAY,oBAAIC,KAAAA,GAAOC,YAAW;cAClCC,aAAa;cACbC,iBAAiBrB,WAAWsB;cAC5B,GAAItB,YAAYJ,YAAY;gBACxB2B,UAAUvB,UAAUuB;cACxB,CAAA,IAAK,CAAC;YACV,CAAA;AACArC;UACJ,OAAO;AACH,kBAAM,KAAKd,QAAQ+B,OAAOf,MAAMgB,IAAI;cAChCE,UAAUjB;cACVkB,iBAAiBhB,OAAOiB;cACxBC,cAAclB,OAAOmB;cACrBG,cAActB,OAAOuB;YACzB,CAAA;AACA3B;UACJ;QACJ;AAEAL,QAAAA,QAAO0C,KAAK,oBAAoBtC,MAAAA,YAAkBC,SAAAA,qBAA8BH,SAASyC,MAAM,SAAS;AACxG,eAAO;UAACvC;UAAQC;QAAS;MAC7B;MAEA,MAAMuC,mBAAmBjC,YAAiD;AACtE,cAAMX,UAAS,KAAKC,KAAK,KAAK2C,kBAAkB;AAChD,cAAMnC,SAA6B;UAC/BE;UACAkC,SAAS;UACTC,SAAS;UACTC,aAAa;UACbC,SAAS;UACT3C,WAAW,CAAA;UACX4C,QAAQ,CAAA;QACZ;AAEA,YAAI;AACA,gBAAMC,OAAO,MAAM,KAAK1D,oBAAoB2D,oBAAoBxC,UAAAA;AAChE,gBAAMyC,WAAW,MAAM,KAAK3D,gBAAgB4D,QAAQ1C,UAAAA;AACpD,gBAAMI,iBAAiBqC,UAAUE;AAEjC,gBAAMC,aAAa,MAAML,KAAKM,eAAc;AAC5C,gBAAMC,WAAW,MAAM,KAAKnE,QAAQoE,kBAAkB/C,UAAAA;AACtD,gBAAMgD,mBAAmB,IAAIC,IAAIH,SAASI,IAAIC,CAAAA,MAAK;YAACA,EAAEtD;YAAcsD;WAAE,CAAA;AACtE,gBAAMC,yBAAyB,oBAAIC,IAAAA;AAEnC,qBAAW1D,SAASiD,YAAY;AAC5BQ,mCAAuBE,IAAI3D,MAAMC,WAAW;AAC5C,kBAAM2D,KAAKP,iBAAiBQ,IAAI7D,MAAMC,WAAW;AAEjD,gBAAI2D,IAAI;AACJ,oBAAME,eAA+B;gBAACC,WAAW;cAAI;AACrD,kBAAI/D,MAAMgE,SAASJ,GAAGI,KAAMF,cAAaE,OAAOhE,MAAMgE;AACtD,kBAAIhE,MAAMiE,eAAejE,MAAMiE,gBAAgBL,GAAGK,YAAaH,cAAaG,cAAcjE,MAAMiE;AAChG,kBAAIjE,MAAMkE,WAAWlE,MAAMkE,YAAYN,GAAGM,QAASJ,cAAaI,UAAUlE,MAAMkE;AAChF,kBAAIlE,MAAMmE,iBAAiBnE,MAAMmE,kBAAkBP,GAAGQ,eAAgBN,cAAaM,iBAAiBpE,MAAMmE;AAC1G,kBAAInE,MAAMqE,SAAUP,cAAaO,WAAWrE,MAAMqE;AAClD,oBAAM,KAAKrF,QAAQ+B,OAAO6C,GAAG5C,IAAK8C,YAAAA;AAClC3D,qBAAOqC;YACX,OAAO;AACH,oBAAM8B,cAAc,MAAM,KAAKlF,gBAAgBgB,QAAQJ,MAAMC,aAAa;gBACtEI;gBACAE,YAAY;gBACZ,GAAGC,YAAY;kBAACC;gBAAc,CAAA;cAClC,CAAA;AAEA,oBAAM8D,SAA8B;gBAChCP,MAAMhE,MAAMgE;gBACZ9D,cAAcF,MAAMC;gBACpBK,aAAaD;gBACb6D,SAASlE,MAAMkE,WAAW;gBAC1BD,aAAajE,MAAMiE,eAAe,aAAajE,MAAMC,WAAW;gBAChEmE,gBAAgBpE,MAAMmE,iBAAiB;gBACvCK,YAAY,CAAC;gBACbH,UAAUrE,MAAMqE,YAAY,CAAC;gBAC7BI,SAAS;gBACTV,WAAW;gBACXW,SAAS;gBACTxD,UAAUlB,MAAMC;gBAChBkB,iBAAiBmD,YAAYlD;gBAC7BC,cAAciD,YAAYhD;gBAC1BC,kBAAkB+C,YAAY9C;gBAC9BC,cAAc6C,YAAY5C;gBAC1BC,gBAAgB2C,YAAY1C,iBAAiB;gBAC7CC,YAAYyC,YAAY3D,gBAAe,oBAAImB,KAAAA,GAAOC,YAAW,IAAK;gBAClEC,aAAa;gBACb2C,YAAYlE;gBACZwB,iBAAiB2C;gBACjBC,kBAAkB7E,MAAM8E,mBAAmB,CAAA;gBAC3CC,mBAAmB/E,MAAMgF,oBAAoB,CAAA;gBAC7CC,sBAAsB,CAAA;cAC1B;AAEA,kBAAIX,YAAY3D,cAAc;AAC1B,sBAAMC,YAAY,MAAM,KAAK3B,aAAa4B,kBAAkByD,YAAYxD,WAAW;AACnF,oBAAIF,WAAW;AACX2D,yBAAOtD,gBAAgBL,UAAUI;AACjCuD,yBAAON,cAAcrD,UAAUqD,eAAeM,OAAON;AACrDM,yBAAOH,iBAAiBxD,UAAUwD,kBAAkBG,OAAOH;AAC3DG,yBAAOpC,WAAWvB,UAAUuB;AAC5BoC,yBAAOM,mBAAmBjE,UAAUiE;AACpCN,yBAAOQ,oBAAoBnE,UAAUmE;AACrCR,yBAAOU,uBAAuBrE,UAAUqE;AACxCV,yBAAOtC,kBAAkBrB,UAAUsB;gBACvC;AACA/B,uBAAOuC;cACX,OAAO;AACHvC,uBAAOJ,UAAUmF,KAAKlF,MAAMC,WAAW;cAC3C;AAEA,oBAAM,KAAKjB,QAAQmG,OAAOZ,MAAAA;AAC1BpE,qBAAOoC;YACX;UACJ;AAEA,qBAAWqB,MAAMT,UAAU;AACvB,gBAAIS,GAAGG,aAAa,CAACN,uBAAuB2B,IAAIxB,GAAG1D,YAAY,GAAI;AAC/D,oBAAM,KAAKlB,QAAQ+B,OAAO6C,GAAG5C,IAAK;gBAAC+C,WAAW;cAAK,CAAA;AACnD5D,qBAAOsC;YACX;UACJ;QACJ,SAAS4C,KAAK;AACV,gBAAMC,MAAMD,eAAeE,QAAQF,IAAIG,UAAUC,OAAOJ,GAAAA;AACxD3F,UAAAA,QAAOgG,MAAM,4BAA4BrF,UAAAA,KAAeiF,GAAAA,EAAK;AAC7DnF,iBAAOwC,OAAOuC,KAAKI,GAAAA;QACvB;AAEA5F,QAAAA,QAAO0C,KAAK,gCAAgC;UACxC/B;UACAkC,SAASpC,OAAOoC;UAChBC,SAASrC,OAAOqC;UAChBC,aAAatC,OAAOsC;UACpBC,SAASvC,OAAOuC;UAChB3C,WAAWI,OAAOJ,UAAUsC;QAChC,CAAA;AAEA,eAAOlC;MACX;MAEA,MAAcZ,wBAA+D;AACzE,cAAMG,UAAS,KAAKC,KAAK,KAAKJ,qBAAqB;AACnD,cAAMoG,gBAAgB,KAAKzG,oBAAoB0G,oBAAmB;AAClE,cAAMnG,YAAY,MAAM,KAAKN,gBAAgB0G,aAAY;AACzD,cAAMC,cAAc,IAAIxC,IAAI7D,UAAU8D,IAAIwC,CAAAA,MAAK;UAACA,EAAE/E;UAAI+E;SAAE,CAAA;AAExD,cAAMC,UAAwC,CAAA;AAE9C,mBAAW,CAAC3F,YAAYuC,IAAAA,KAAS+C,eAAe;AAC5C,gBAAM7C,WAAWgD,YAAYjC,IAAIxD,UAAAA;AACjC,cAAI,CAACyC,SAAU;AAEf,gBAAM3C,SAAS;YACXa,IAAIX;YACJ2D,MAAMlB,SAASkB;YACfzB,SAAS;YACTC,SAAS;YACTC,aAAa;YACbE,QAAQ,CAAA;UACZ;AAEA,cAAI;AACA,kBAAMM,aAAa,MAAML,KAAKM,eAAc;AAC5C,kBAAMC,WAAW,MAAM,KAAKnE,QAAQoE,kBAAkB/C,UAAAA;AACtD,kBAAMgD,mBAAmB,IAAIC,IAAIH,SAASI,IAAIC,CAAAA,MAAK;cAACA,EAAEtD;cAAcsD;aAAE,CAAA;AACtE,kBAAMC,yBAAyB,oBAAIC,IAAAA;AAEnC,uBAAW1D,SAASiD,YAAY;AAC5BQ,qCAAuBE,IAAI3D,MAAMC,WAAW;AAC5C,oBAAM2D,KAAKP,iBAAiBQ,IAAI7D,MAAMC,WAAW;AAEjD,kBAAI,CAAC2D,IAAI;AACL,sBAAM,KAAKqC,YAAY5F,YAAYL,KAAAA;AACnCG,uBAAOoC;cACX,WAAW,KAAK2D,YAAYtC,IAAI5D,KAAAA,GAAQ;AACpC,sBAAM8D,eAA+B;kBAACC,WAAW;gBAAI;AACrD,oBAAI/D,MAAMgE,SAASJ,GAAGI,KAAMF,cAAaE,OAAOhE,MAAMgE;AACtD,oBAAIhE,MAAMiE,eAAejE,MAAMiE,gBAAgBL,GAAGK,YAAaH,cAAaG,cAAcjE,MAAMiE;AAChG,oBAAIjE,MAAMkE,WAAWlE,MAAMkE,YAAYN,GAAGM,QAASJ,cAAaI,UAAUlE,MAAMkE;AAChF,oBAAIlE,MAAMmE,iBAAiBnE,MAAMmE,kBAAkBP,GAAGQ,eAAgBN,cAAaM,iBAAiBpE,MAAMmE;AAC1G,oBAAInE,MAAMqE,SAAUP,cAAaO,WAAWrE,MAAMqE;AAClD,sBAAM,KAAKrF,QAAQ+B,OAAO6C,GAAG5C,IAAK8C,YAAAA;AAClC3D,uBAAOqC;cACX,WAAW,CAACoB,GAAGG,WAAW;AACtB,sBAAM,KAAK/E,QAAQ+B,OAAO6C,GAAG5C,IAAK;kBAAC+C,WAAW;gBAAI,CAAA;AAClD5D,uBAAOqC;cACX;YACJ;AAEA,uBAAWoB,MAAMT,UAAU;AACvB,kBAAIS,GAAGG,aAAa,CAACN,uBAAuB2B,IAAIxB,GAAG1D,YAAY,GAAI;AAC/D,sBAAM,KAAKlB,QAAQ+B,OAAO6C,GAAG5C,IAAK;kBAAC+C,WAAW;gBAAK,CAAA;AACnD5D,uBAAOsC;cACX;YACJ;UACJ,SAAS4C,KAAK;AACV,kBAAMC,MAAMD,eAAeE,QAAQF,IAAIG,UAAUC,OAAOJ,GAAAA;AACxD3F,YAAAA,QAAOgG,MAAM,iCAAiC5C,SAASkB,IAAI,KAAKsB,GAAAA,EAAK;AACrEnF,mBAAOwC,OAAOuC,KAAKI,GAAAA;UACvB;AAEAU,kBAAQd,KAAK/E,MAAAA;QACjB;AAEAT,QAAAA,QAAO0C,KAAK,+BAA+B;UACvC+D,OAAOH,QAAQ3D;UACfE,SAASyD,QAAQI,OAAO,CAACC,GAAGC,MAAMD,IAAIC,EAAE/D,SAAS,CAAA;UACjDC,SAASwD,QAAQI,OAAO,CAACC,GAAGC,MAAMD,IAAIC,EAAE9D,SAAS,CAAA;UACjDC,aAAauD,QAAQI,OAAO,CAACC,GAAGC,MAAMD,IAAIC,EAAE7D,aAAa,CAAA;QAC7D,CAAA;AAEA,eAAOuD;MACX;MAEA,MAAcC,YAAY5F,YAAoBL,OAAuC;AACjF,cAAMY,YAAY,MAAM,KAAK3B,aAAasH,YAAYvG,MAAMC,WAAW;AAEvE,cAAMsE,SAA8B;UAChCP,MAAMhE,MAAMgE;UACZ9D,cAAcF,MAAMC;UACpBK,aAAaD;UACb6D,SAASlE,MAAMkE,WAAW;UAC1BD,aAAarD,WAAWqD,eAAejE,MAAMiE,eAAe,aAAajE,MAAMC,WAAW;UAC1FmE,gBAAgBxD,WAAWwD,kBAAkBpE,MAAMmE,iBAAiB;UACpEhC,UAAUvB,WAAWuB,YAAY;UACjC0C,kBAAkBjE,WAAWiE,kBAAkBxC,SAASzB,UAAUiE,mBAAmB7E,MAAM8E,mBAAmB,CAAA;UAC9GC,mBAAmBnE,WAAWmE,mBAAmB1C,SAASzB,UAAUmE,oBAAoB/E,MAAMgF,oBAAoB,CAAA;UAClHC,sBAAsBrE,WAAWqE,wBAAwB,CAAA;UACzDT,YAAY,CAAC;UACbH,UAAUrE,MAAMqE,YAAY,CAAC;UAC7BI,SAAS;UACTV,WAAW;UACXW,SAAS;UACTzD,eAAeL,WAAWI,MAAM;QACpC;AACA,cAAM,KAAKhC,QAAQmG,OAAOZ,MAAAA;MAC9B;MAEQ2B,YAAY/C,UAAiBF,YAAsC;AACvE,YAAIE,SAASa,SAASf,WAAWe,KAAM,QAAO;AAC9C,YAAIb,SAASc,gBAAgBhB,WAAWgB,YAAa,QAAO;AAC5D,YAAId,SAASe,aAAajB,WAAWiB,WAAW,OAAQ,QAAO;AAC/D,YAAIjB,WAAWkB,iBAAiBhB,SAASiB,mBAAmBnB,WAAWkB,cAAe,QAAO;AAC7F,eAAO;MACX;IACJ;;;;;;;;;;;;;;;;AC/TA,OAAO;AACP,SAAQqC,cAAAA,oBAAiB;;;;;;;;;;IAQZC;;;;AAPb,IAAAC;AACA;AAEA,IAAAA;AACA;;;AAGO,IAAMD,wBAAN,cAAoCE,YAAAA;aAAAA;;;;;;MACvC,YACYC,cACAC,SACAC,kBACV;AACE,cAAK,GAAA,KAJGF,eAAAA,cAAAA,KACAC,UAAAA,SAAAA,KACAC,mBAAAA;MAGZ;MAEA,MAAMC,UAAuF;AACzF,cAAMC,UAAS,KAAKC,KAAK,KAAKF,OAAO;AACrCC,QAAAA,QAAOE,KAAK,uCAAA;AAEZ,cAAMC,SAAS,MAAMC,YAAY;UAC7BC,oBAAoB,wBAACC,UAAU,KAAKV,aAAaW,gBAAgBD,KAAAA,GAA7C;UACpBE,mBAAmB,wBAACC,YAAY,KAAKZ,QAAQa,WAAWD,OAAAA,GAArC;UACnBE,kBAAkB,wBAACC,MAAM,KAAKhB,aAAaiB,4BAA4BD,CAAAA,EAClEE,KAAKC,CAAAA,MAAKA,IAAI;YAACC,IAAID,EAAEC;YAAIC,cAAcF,EAAEE;UAAY,IAAI,IAAA,GAD5C;UAElBC,uBAAuB,wBAACN,GAAGO,OAAO,KAAKtB,QAAQc,iBAAiBC,GAAGO,EAAAA,EAC9DL,KAAKM,CAAAA,SAAQA,KAAKC,SAAS,IAAI;YAC5BL,IAAII,KAAK,CAAA,EAAIE;YACbL,cAAcG,KAAK,CAAA,EAAIH;UAC3B,IAAI,IAAA,GAJe;UAKvBM,cAAc,wBAACP,IAAIQ,GAAGC,IAAIC,MAAM,KAAK9B,aAAa2B,aAAaP,IAAIQ,GAAGC,IAAIC,CAAAA,GAA5D;QAClB,CAAA;AAEA1B,QAAAA,QAAOE,KAAK,kBAAkBC,OAAOwB,UAAUC,QAAQ,eAAezB,OAAOwB,UAAUE,cAAc,aAAa1B,OAAO2B,SAASA,QAAQ,WAAW;AAErJ,cAAMC,SAAS,MAAM,KAAKjC,iBAAiBkC,aAAY;AAEvD,eAAO;UAAC,GAAG7B;UAAQ4B;QAAM;MAC7B;IACJ;;;;;;;;;;;;;;ACzCA,OAAO;AACP,SAAQE,aAAAA,YAAWC,iBAAgB;AADnC,IA4BMC,oBAIAC;AAhCN;;;AAEA;AACA;AAWA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AAEA,IAAMH,qBACFI,IAAIC,OAAOC,eAAeF,IAAIG,IAAID,cAClCF,IAAII,MAAMF,eAAeF,IAAIG,IAAID;AAErC,IAAML,qBAAqBD,qBAAqBD,UAAUU,YAAYV,UAAUW;AAEhFZ,IAAAA,WACKa,kBAAkBC,KAAAA,EAClBD,kBAAkBE,YAAAA,EAClBF,kBAAkBG,aAAAA,EAClBH,kBAAkBI,0BAA0BC,mBAAAA,EAC5CL,kBAAkBM,wBAAwBC,yBAAAA,EAC1CP,kBAAkBQ,aAAAA,EAClBR,kBAAkBS,sBAAAA,EAClBT,kBAAkBU,mBAAAA,EAClBV,kBAAkBW,qBAAAA,EAClBX,kBAAkBY,mBAAAA,EAClBZ,kBAAkBa,eAAAA,EAClBb,kBAAkBc,kBAAAA,EAClBC,SAASC,wBAAwB;MAACC,UAAUD;IAAsB,GAAG;MAACE,WAAW5B;IAAkB,CAAA,EACnGyB,SAASI,wBAAwB;MAACF,UAAUE;IAAsB,GAAG;MAACD,WAAW9B,UAAUU;IAAS,CAAA,EACpGE,kBAAkBoB,cAAAA,EAClBpB,kBAAkBqB,oBAAAA,EAClBrB,kBAAkBsB,sBAAAA,EAClBtB,kBAAkBuB,oBAAAA,EAClBvB,kBAAkBwB,oBAAAA,EAClBxB,kBAAkByB,qBAAAA,EAClBzB,kBAAkB0B,WAAAA,EAClB1B,kBAAkB2B,sBAAAA,EAClB3B,kBAAkB4B,gBAAAA,EAClB5B,kBAAkB6B,mBAAAA;;;;;AC1DvB,SAAQC,aAAAA,kBAAgB;AAAxB;;;AACA;AAYA;AAQA;AAEAA,IAAAA,WACKC,kBAAkBC,eAAAA,EAClBD,kBAAkBE,YAAAA,EAClBF,kBAAkBG,WAAAA,EAClBH,kBAAkBI,gBAAAA,EAClBJ,kBAAkBK,UAAAA,EAClBL,kBAAkBM,QAAAA,EAClBN,kBAAkBO,aAAAA,EAClBP,kBAAkBQ,kBAAAA,EAClBR,kBAAkBS,aAAAA,EAClBT,kBAAkBU,OAAAA,EAClBV,kBAAkBW,SAAAA,EAClBX,kBAAkBY,UAAAA,EAClBZ,kBAAkBa,SAAAA,EAClBb,kBAAkBc,sBAAAA,EAClBd,kBAAkBe,cAAAA,EAClBf,kBAAkBgB,UAAAA,EAClBhB,kBAAkBiB,kBAAAA;;;;;ACxCvB,OAAO;AAAP,IAaaC;AAbb;;;AACA,IAAAC;AAEA;AAUO,IAAMD,aAAN,cAAyBE,YAAAA;MAbhC,OAagCA;;;MAC5BC;MACAC;MACUC,cAAc;MAChBC,eAAe;MAEvB,eAAeC,MAAa;AACxB,cAAK;AACL,aAAKJ,KAAKI,KAAK,CAAA;AACf,aAAKH,OAAOG,KAAK,CAAA;AACjB,aAAKC,cAAc,GAAG,KAAK,YAAYC,IAAI,IAAI,KAAKN,EAAE;MAC1D;MAEA,MAAMO,OAAO;AACT,cAAMC,MAAM,KAAKC,KAAK,KAAKF,IAAI;AAC/B,cAAM,KAAKG,OAAM;AACjB,aAAKR,cAAc;AACnBM,YAAIG,KAAK,WAAW,KAAKX,EAAE,yBAAyB;MACxD;MAEA,MAAMY,WAAW;AACb,YAAI,KAAKT,aAAc;AACvB,aAAKA,eAAe;AACpB,cAAMK,MAAM,KAAKC,KAAK,KAAKG,QAAQ;AACnCJ,YAAIG,KAAK,yBAAyB,KAAKX,EAAE,MAAM;AAC/C,cAAM,KAAKa,WAAU;AACrBL,YAAIG,KAAK,6BAAA;MACb;MAEA,MAAMG,QAAQ;AACV,cAAMN,MAAM,KAAKC,KAAK,KAAKK,KAAK;AAEhC,aAAKC,wBAAuB;AAE5B,YAAI;AACA,gBAAM,KAAKR,KAAI;AACfC,cAAIG,KAAK,sBAAA;QACb,SAASK,OAAO;AACZ,gBAAM,KAAKC,YAAYD,KAAAA;AACvBE,kBAAQC,KAAK,CAAA;QACjB;MACJ;MAEAT,SAAwB;AACpB,eAAOU,QAAQC,QAAO;MAC1B;MAEAR,aAA4B;AACxB,eAAOO,QAAQC,QAAO;MAC1B;MAEAC,QAAQC,QAA8B;AAClC,eAAOH,QAAQC,QAAO;MAC1B;MAEQN,0BAA0B;AAC9B,mBAAWS,UAAU;UAAC;UAAU;UAAW;WAAa;AACpDN,kBAAQO,GAAGD,QAAQ,YAAA;AACfE,2BAAOf,KAAK,GAAGa,MAAAA,4BAAkC,KAAKxB,EAAE,KAAK;AAC7D,kBAAM,KAAKY,SAAQ;AACnBM,oBAAQC,KAAK,CAAA;UACjB,CAAA;QACJ;AAEAD,gBAAQO,GAAG,qBAAqB,CAACE,QAAAA;AAC7BD,yBAAOV,MAAM,yBAAyB,KAAKhB,EAAE,KAAK2B,IAAIC,OAAO,IAAI;YAACC,OAAOF,IAAIE;UAAK,CAAA;AAClFX,kBAAQC,KAAK,CAAA;QACjB,CAAA;AAEAD,gBAAQO,GAAG,sBAAsB,CAACK,WAAAA;AAC9B,gBAAMH,MAAMG,kBAAkBC,QAAQD,SAAS,IAAIC,MAAMC,OAAOF,MAAAA,CAAAA;AAChEJ,yBAAOV,MAAM,0BAA0B,KAAKhB,EAAE,KAAK2B,IAAIC,OAAO,IAAI;YAACC,OAAOF,IAAIE;UAAK,CAAA;QACvF,CAAA;MACJ;MAEA,MAAcZ,YAAYD,OAAc;AACpC,cAAMR,MAAM,KAAKC,KAAK,KAAKQ,WAAW;AACtCT,YAAIQ,MAAM,iBAAiBA,MAAMY,OAAO,IAAI;UAACC,OAAOb,MAAMa;QAAK,CAAA;AAC/D,cAAM,KAAKP,QAAQN,KAAAA;MACvB;IACJ;;;;;AC7FA,OAAO;AAIP,SAAQiB,aAAAA,YAAWC,cAAAA,oBAAiB;;;;;;;;;;AAS7B,SAASC,OAA8CC,MAAW;AACrE,MACMC,eADN,MACMA,qBAAqBD,KAAAA;WAAAA;;;IACvBE;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IAEA,eAAeC,MAAa;AACxB,YAAK,GAAIA,IAAAA;AAET,WAAKP,KAAKL,WAAUa,QAAQC,KAAAA;AAE5B,UAAI,CAAC,KAAKT,IAAI;AACVU,uBAAOC,MAAM,gEAAA;AACb,YAAIC,IAAIC,OAAO;AACX,gBAAM,IAAIC,MAAM,4DAAA;QACpB;AACA,aAAKd,KAAK,IAAIS,MAAMG,IAAIC,KAAK;MACjC;AAEA,UAAI,CAAC,KAAKb,IAAI;AACV,cAAM,IAAIc,MAAM,8CAAA;MACpB;AAEA,WAAKX,WAAWR,WAAUa,QAAQO,QAAAA;IACtC;IAEA,MAAMC,QAAQC,OAA6B;AACvC,YAAM,MAAMD,QAAQC,KAAAA;IACxB;IAEA,MAAMC,SAAwB;AAC1BR,qBAAOC,MAAM,0BAAA;AACb,YAAM,MAAMO,OAAAA;AACZ,YAAM,KAAKlB,GAAGmB,QAAO;AAErB,YAAMC,UAAS,MAAM,KAAKjB,SAASkB,OAAO,KAAKpB,IAAI,KAAKC,IAAI;AAC5D,UAAI,CAACkB,SAAQ;AACT,cAAM,IAAIN,MAAM,8BAA8B,KAAKb,EAAE,EAAE;MAC3D;AACA,WAAKK,WAAWc,QAAOnB;AACvBS,qBAAOY,KAAK,sBAAsB,KAAKrB,EAAE,KAAK,KAAKC,IAAI,GAAG;AAE1D,YAAM,KAAKC,SAASoB,gBAAgBH,QAAOnB,EAAE;AAE7C,WAAKG,YAAYoB,YAAY,YAAA;AACzB,YAAI;AACA,gBAAM,KAAKrB,SAASsB,KAAK,KAAKnB,QAAQ;QAC1C,SAASoB,KAAK;AACVhB,yBAAOO,MAAM,uBAAwBS,IAAcC,OAAO,EAAE;QAChE;MACJ,GAAGC,gBAAAA;AAEH,WAAKvB,iBAAiBmB,YAAY,YAAA;AAC9B,YAAI;AACA,gBAAM,KAAKrB,SAASoB,gBAAgB,KAAKjB,QAAQ;QACrD,SAASoB,KAAK;AACVhB,yBAAOO,MAAM,qBAAsBS,IAAcC,OAAO,EAAE;QAC9D;MACJ,GAAGE,qBAAAA;IACP;IAEA,MAAMC,aAA4B;AAC9BpB,qBAAOC,MAAM,2BAAA;AACb,UAAI,KAAKP,UAAW2B,eAAc,KAAK3B,SAAS;AAChD,UAAI,KAAKC,eAAgB0B,eAAc,KAAK1B,cAAc;AAC1D,YAAM,MAAMyB,WAAAA;AACZ,YAAM,KAAK9B,GAAGgC,WAAU;IAC5B;EACJ;;;;;;;;AAEA,SAAOjC;AACX;IA/EM6B,kBACAC;;;;AATN;AACA;AAGA,IAAAI;;;AAIA,IAAML,mBAAmB;AACzB,IAAMC,wBAAwB,KAAK;AAEnBhC;;;;;ACbhB,OAAO;AAGP,SAAQqC,aAAAA,YAAWC,cAAAA,oBAAiB;;;;;;;;;;AAO7B,SAASC,UAAiDC,MAAW;AACxE,MACMC,kBADN,MACMA,wBAAwBD,KAAAA;WAAAA;;;IAEjBE;IAET,eAAeC,MAAa;AACxB,YAAK,GAAIA,IAAAA;AACT,WAAKD,eAAeL,WAAUO,QAAQC,YAAAA;AACtC,UAAI,CAAC,KAAKH,cAAc;AACpB,cAAM,IAAII,MAAM,sDAAA;MACpB;IACJ;IAGA,MAAMC,QAAQC,OAA6B;AACvC,YAAM,MAAMD,QAAQC,KAAAA;IACxB;IAEA,MAAMC,SAAwB;AAC1BC,qBAAOC,MAAM,uBAAA;AACb,YAAM,MAAMF,OAAAA;AACZ,YAAM,KAAKP,aAAaU,QAAO;IACnC;IAEA,MAAMC,aAA4B;AAC9BH,qBAAOC,MAAM,wBAAA;AACb,YAAM,MAAME,WAAAA;AACZ,YAAM,KAAKX,aAAaY,WAAU;IACtC;EACJ;;;;;;;;AAEA,SAAOb;AACX;;;;AA1CA;AACA;;;AAQgBF;;;;;ACVhB,OAAO;AACP,SAAQgB,aAAAA,YAAWC,cAAAA,oBAAiB;;;;;;;;;;AAc7B,SAASC,UAAiDC,MAAW;AAExE,MACMC,kBADN,MACMA,wBAAwBC,UAAUF,IAAAA,EAAAA;WAAAA;;;IACpCG;IACAC;IACAC,gBAAgB,oBAAIC,IAAAA;IACpBC;IACAC;IACSC;IACAC;IAET,eAAeC,MAAa;AACxB,YAAK,GAAIA,IAAAA;AACT,WAAKR,KAAKQ,KAAK,CAAA;AACf,WAAKP,OAAOO,KAAK,CAAA;AACjB,WAAKJ,oBAAoBK,IAAIC,MAAMN;AACnC,WAAKC,gBAAgBI,IAAIC,MAAML;AAC/B,WAAKC,eAAeZ,WAAUiB,QAAQC,YAAAA;AACtC,WAAKL,yBAAyBb,WAAUiB,QAAQE,sBAAAA;IACpD;IAEA,MAAMC,SAAwB;AAC1B,YAAM,MAAMA,OAAAA;AAEZC,qBAAOC,MAAM,GAAG,KAAKhB,EAAE,iBAAiB;AACxC,UAAIiB,eAAe,GAAGR,IAAIC,MAAMN,iBAAiB,IAAI,KAAKJ,EAAE;AAC5D,UAAIkB,WAAWT,IAAIC,MAAML;AACzB,YAAM,KAAKc,aAAaC,eAAeF,UAAU,OAAA;AACjD,YAAM,KAAKC,aAAaE,YAAYJ,cAAc;QAC9CK,WAAW;QACXC,SAAS;QACTC,YAAY;MAChB,GAAGN,UAAU,SAAA;AAEb,YAAM,KAAKC,aAAaM,UAAUR,cAAcC,UAAU,UAAA;AAC1D,YAAM,KAAKC,aAAaM,UAAUR,cAAcC,UAAU,UAAA;AAC1D,YAAM,KAAKC,aAAaM,UAAUR,cAAcC,UAAU,YAAA;AAC1D,YAAM,KAAKC,aAAaM,UAAUR,cAAcC,UAAU,aAAA;AAE1D,WAAKX,uBAAuBmB,YAAY,KAAK1B,EAAE;AAC/C,WAAKE,cAAcyB,IAAI,kBAAkB,OAAOC,WAAWC,YAAAA;AACvD,cAAM,KAAKtB,uBAAuBuB,mBAAmBD,OAAAA;AACrD,eAAO;UAACE,SAAS;QAAI;MACzB,CAAA;AACA,WAAK7B,cAAcyB,IAAI,mBAAmB,OAAOC,WAAWC,YAAAA;AACxD,cAAM,KAAKtB,uBAAuByB,oBAAoBH,OAAAA;AACtD,eAAO;UAACE,SAAS;QAAI;MACzB,CAAA;AACA,WAAK7B,cAAcyB,IAAI,kBAAkB,OAAOC,WAAWC,YAAAA;AACvD,cAAM,KAAKtB,uBAAuB0B,mBAAmBJ,OAAAA;AACrD,eAAO;UAACE,SAAS;QAAI;MACzB,CAAA;AACA,iBAAWG,UAAU;QAAC;QAAoB;SAA+B;AACrE,aAAKhC,cAAcyB,IAAIO,QAAQ,OAAON,WAAWC,YAAAA;AAC7C,gBAAM,KAAKtB,uBAAuB4B,oBAAoBN,OAAAA;AACtD,iBAAO;YAACE,SAAS;UAAI;QACzB,CAAA;MACJ;AAEA,WAAKZ,aAAaiB,YAAY,YAAA;AAC1BrB,uBAAOsB,KAAK,GAAG,KAAKrC,EAAE,4CAA4C;AAClE,cAAM,KAAKO,uBAAuB+B,iBAAgB;MACtD,CAAA;AAEA,UAAI7B,IAAI8B,IAAIC,4BAA4B,GAAG;AACvC,aAAKjC,uBAAuBkC,4BAA4BhC,IAAI8B,IAAIC,yBAAyB;MAC7F;AAEA,YAAM,KAAKrB,aAAauB,QAAQzB,cAAc,OAAO0B,WAAWC,SAASC,aAAAA;AACrE,cAAM,EAACX,QAAQY,UAAUC,WAAW,GAAGlB,QAAAA,IAAWe;AAClD7B,uBAAOsB,KAAK,WAAW,KAAKrC,EAAE,6BAA6BkC,MAAAA,gBAAsBS,SAAAA,EAAW;AAG5F,YAAIK,UAAU,KAAK9C,cAAc+C,IAAIf,MAAAA;AACrC,YAAIgB,WAAW,CAAC;AAChB,YAAI,CAACF,SAAS;AACVjC,yBAAOoC,KAAK,4CAA4CjB,MAAAA,EAAQ;AAChEgB,qBAAW;YAACnB,SAAS;YAAOqB,SAAS,4CAA4ClB,MAAAA;UAAQ;QAC7F,OAAO;AACH,cAAI;AACAgB,uBAAW,MAAMF,QAAQ,KAAKhD,IAAI6B,OAAAA;UACtC,SAASwB,OAAO;AACZtC,2BAAOsC,MAAM,iCAAiCnB,MAAAA,MAAamB,MAAgBD,OAAO,EAAE;AACpFF,uBAAW;cAACnB,SAAS;cAAOqB,SAAUC,MAAgBD;YAAO;UACjE;QACJ;AACA,cAAM,KAAK9C,aAAagD,kBAAkB,KAAKtD,IAAI8C,UAAUH,WAAWO,QAAAA;MAC5E,CAAA;IAEJ;IAEA,MAAMK,aAA4B;AAC9BxC,qBAAOC,MAAM,uCAAA;AACb,YAAM,MAAMuC,WAAAA;IAChB;IAEA,MAAMC,QAAQH,OAA6B;AACvC,YAAM,MAAMG,QAAQH,KAAAA;IACxB;EACJ;;;;;;;;AAEA,SAAOvD;AACX;;;;AApHA;AAEA;AACA,IAAA2D;AAEA;AACA;;;AAOgB7D;;;;;ACfhB,OAAO;AACP,SAAQ8D,cAAAA,oBAAiB;;;;;;;;;;AAwBlB,SAASC,UAAiDC,MAAW;AACxE,MACMC,kBADN,MACMA,wBAAwBD,KAAAA;WAAAA;;;IAC1BE;IAEA,eAAeC,MAAa;AACxB,YAAK,GAAIA,IAAAA;AAET,WAAKD,QAAQ;QACTE,YAAY;QACZC,cAAc;QACdC,eAAe;QACfC,UAAU;QACVC,gBAAgB;QAChBC,kBAAkB;QAClBC,mBAAmB;QACnBC,cAAc;QACdC,WAAW,oBAAIC,KAAAA;QACfC,aAAa;QACbC,qBAAqB;QACrBC,eAAe;QACfC,gBAAgB;MACpB;IACJ;IAEA,MAAMC,QAAQC,OAA6B;AACvC,YAAM,MAAMD,QAAQC,KAAAA;IACxB;IAEA,MAAMC,SAAwB;AAC1B,YAAM,MAAMA,OAAAA;IAChB;IAEA,MAAMC,aAA4B;AAC9B,YAAM,MAAMA,WAAAA;IAChB;EACJ;;;;;;;;AAEA,SAAOpB;AACX;;;;;;AAvCgBF;;;;;ACzBhB,IAAAuB,eAAA;;;;AACA;AACA;AACA;;;;;ACHA,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAMZC;;;;AAJb;AACA;;;AAGO,IAAMA,gBAAN,cAA4BC,eAAAA;aAAAA;;;;MAE/B,YAA6BC,gBAAgC;AACzD,cAAK,GAAA,KADoBA,iBAAAA;MAE7B;MAEOC,iBAAiB,8BAAOC,KAAqBC,QAAAA;AAChD,cAAM,EAACC,UAAUC,QAAO,IAAIH,IAAII;AAChC,cAAMC,aAAaL,IAAII,OAAO,CAAA,KAAM;AACpC,cAAM,KAAKN,eAAeQ,qBAAqBJ,UAAUC,SAASE,YAAYL,KAAKC,GAAAA;MACvF,GAJwB;IAK5B;;;;;;;;;;;;AClBA,OAAO;AACP,OAAOM,aAAa;AACpB,SAAQC,aAAAA,kBAAgB;AAMjB,SAASC,gCAAAA;AACZ,QAAMC,YAAYH,QAAQI,OAAM;AAChC,QAAMC,sBAAqCJ,WAAUK,QAAQC,aAAAA;AAC7D,QAAMC,cAAcP,WAAUK,QAAQG,WAAAA;AACtC,QAAMC,OAAOC,mBAAmBH,WAAAA;AA0EhCL,YAAUS,IAAI,yBAAyBF,MAAMG,aAAaR,oBAAoBS,cAAc,CAAA;AAC5F,SAAOX;AACX;AAxFA;;;AAGA;AACA,IAAAY;AACA;AACA;AAEgBb;;;;;ACRhB,OAAO;AAEP,SAAQc,UAAAA,SAAQC,cAAAA,oBAAiB;;;;;;;;;;;;;;;AAajC,SAASC,wBAAwBC,QAAiB;AAC9C,QAAMC,aAAaD,OACdE,QAAQ,CAACC,UAAUC,MAAMC,QAAQF,KAAAA,IAASA,QAAQ;IAACA;GAAM,EACzDD,QAAQ,CAACC,UAAU,OAAOA,UAAU,WAAWA,MAAMG,MAAM,GAAA,IAAO,CAAA,CAAE,EACpEC,IAAI,CAACJ,UAAUA,MAAMK,KAAI,CAAA,EACzBC,OAAOC,OAAAA;AAEZ,SAAOT,WAAWU,SAASV,aAAaW;AAC5C;IAGaC;;;;AAvBb,IAAAC;AACA;AAOA,IAAAC;;;;AAIShB;AAWF,IAAMc,yBAAN,cAAqCG,eAAAA;aAAAA;;;;MACxC,YACuDC,qBAA2C;AAC9F,cAAK,GAAA,KAD8CA,sBAAAA;MAEvD;MAEAC,SAAS,8BAAOC,KAAqBC,QAAAA;AACjC,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,MAAM;AAEpC,YAAI,CAACC,IAAII,MAAM;AACXH,cAAII,OAAO,GAAA,EAAKC,KAAK,CAAC,CAAA;AACtB;QACJ;AAEA,cAAM,EAACC,gBAAgBC,QAAQC,kBAAkBC,YAAW,IAAIV,IAAII;AACpE,cAAMO,YAAY/B,qBAAqBoB,IAAIY,MAAMC,UAAUb,IAAIY,MAAMD,WAAWX,IAAIY,MAAME,SAAS;AAEnG,cAAMxB,SAASyB,YAAY;UACvBR;UACAC,QAAQA,UAAUC;UAClBO,SAASN,aAAaO;UACtBN;QACJ,CAAA;AAGAV,YAAII,OAAO,GAAA;AACXJ,YAAIiB,UAAU,gBAAgB,kCAAA;AAC9BjB,YAAIiB,UAAU,iBAAiB,wBAAA;AAC/BjB,YAAIiB,UAAU,cAAc,YAAA;AAC5BjB,YAAIiB,UAAU,qBAAqB,IAAA;AACnCjB,YAAIkB,eAAY;AAChBlB,YAAImB,MAAM;;CAAiB;AAG3B,cAAMC,KAAKC,YAAY,MAAA;AACnBrB,cAAImB,MAAM,UAAUG,KAAKC,IAAG,CAAA;;CAAQ;QACxC,GAAG,IAAA;AAEH,YAAIC;AAEJ,YAAIC,SAAS;AAEb,cAAMC,QAAQ,mCAAA;AACV,cAAID,OAAQ;AACZA,mBAAS;AACTE,wBAAcP,EAAAA;AAEd,cAAI;AACA,gBAAII,IAAK,OAAM,KAAK3B,oBAAoB+B,YAAYJ,IAAIK,EAAE;UAC9D,SAASC,GAAG;UAEZ;AAEA,cAAI;AACA9B,gBAAI+B,IAAG;UACX,QAAQ;UAER;QACJ,GAhBc;AAkBdhC,YAAIiC,GAAG,SAASN,KAAAA;AAChB3B,YAAIiC,GAAG,SAASN,KAAAA;AAEhB,cAAMP,QAAQ,8BAAOc,OAAAA;AACjB,cAAIR,OAAQ;AACZ,cAAIQ,GAAG3B,mBAAmBA,eAAgB;AAC1C,cAAIjB,OAAO0B,WAAWkB,GAAGlB,YAAY1B,OAAO0B,QAAS;AACrD,gBAAMmB,cAAc7C,OAAOkB,SAAS0B,GAAG1B,WAAWlB,OAAOkB,SAAS;AAClE,cAAI,CAAC2B,aAAa;AACd,kBAAMC,gBAAgB,CAAC,CAACF,GAAGrB,YAAY,CAAC,CAACvB,OAAOqB,WAAW0B,SAASH,GAAGrB,QAAQ;AAC/E,gBAAI,CAACuB,cAAe;UACxB;AAEA,gBAAME,QACF,OAAOJ,GAAGJ,EAAE;SACFI,GAAGK,IAAI;QACRC,KAAKC,UAAUP,EAAAA,CAAAA;;;AAE5B,cAAI,CAACjC,IAAImB,MAAMkB,KAAAA,GAAQ;AACnB,kBAAM,IAAII,QAAc,CAACC,aAAY1C,IAAI2C,KAAK,SAASD,QAAAA,CAAAA;UAC3D;QACJ,GAlBc;AAoBd,YAAI;AACAlB,gBAAM,MAAM,KAAK3B,oBAAoB+C,UAAUvD,MAAAA;AAC/C,2BAAiB4C,MAAMT,IAAIqB,GAAG;AAC1B,kBAAM1B,MAAMc,EAAAA;UAChB;AAEA,gBAAMP,MAAAA;QACV,SAASI,GAAQ;AACb7B,UAAAA,QAAO6C,MAAM,8BAA8BhB,GAAGiB,WAAWjB,CAAAA,EAAG;AAE5D,cAAI;AACA,kBAAMX,MAAML,YAAY;cACpBe,IAAI,OAAOP,KAAKC,IAAG,CAAA;cACnByB,IAAI1B,KAAKC,IAAG;cACZjB;cACAS,SAASN,aAAaO;cACtBT;cACA+B,MAAM;cACNW,UAAU;cACVF,SAAS;cACTG,SAAS;gBAACJ,OAAOK,aAAarB,GAAGiB,WAAWjB,CAAAA;cAAE;YAClD,CAAA,CAAA;UACJ,QAAQ;UAER;AAEA,gBAAMJ,MAAAA;QACV;MACJ,GAzGS;IA0Gb;;;;;;;;;;;;;AC1IA,OAAO0B,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,2BAAAA;AACZ,QAAMC,YAAYH,SAAQI,OAAM;AAChC,QAAMC,yBAAyBJ,YAAUK,QAAQC,sBAAAA;AAgCjDJ,YAAUK,IAAI,WAAWC,aAAaJ,uBAAuBK,MAAM,CAAA;AACnE,SAAOP;AACX;AAzCA;;;AAEA;AACA,IAAAQ;AAEgBT;;;;;ACLhB,OAAO;AACP,SAAQU,cAAAA,oBAAiB;;;;;;;;;;AAQzB,SAASC,UAAUC,OAAgB;AAC/B,QAAM,EAACC,UAAU,GAAGC,KAAAA,IAAQF;AAC5B,SAAOE;AACX;IAGaC;;;;AAbb,IAAAC;AACA;AAEA;AACA;;;AAGSL;AAMF,IAAMI,kBAAN,cAA8BE,eAAAA;aAAAA;;;;;MACjC,YACYC,kBACAC,aACV;AACE,cAAK,GAAA,KAHGD,mBAAAA,kBAAAA,KACAC,cAAAA;MAGZ;MAEAC,SAAS,8BAAOC,KAAqBC,QAAAA;AACjC,cAAMC,OAAOF,IAAIE;AACjB,cAAM,EAACC,SAASC,gBAAgBC,MAAMC,WAAU,IAAIN,IAAIO;AAExD,YAAI,CAACJ,WAAW,CAACC,eAAgB,OAAMI,UAAUC,WAAW,8CAAA;AAC5D,YAAIN,WAAWC,eAAgB,OAAMI,UAAUC,WAAW,oDAAA;AAE1D,cAAM,EAAClB,OAAOmB,OAAM,IAAI,MAAM,KAAKb,iBAAiBc,SAChDT,KAAKU,gBACLC,YAAY;UACRV;UACAC;UACAC;UACAC,YAAYA,aAAa,IAAIQ,KAAKR,UAAAA,IAAcS;QACpD,CAAA,CAAA;AAGJd,YAAIe,OAAO,GAAA,EAAKC,KAAK;UACjB1B;UACAmB,QAAQpB,UAAUoB,MAAAA;QACtB,CAAA;MACJ,GArBS;MAuBTQ,OAAO,8BAAOlB,KAAqBC,QAAAA;AAC/B,cAAMC,OAAOF,IAAIE;AACjB,cAAM,EAACC,SAASC,eAAc,IAAIJ,IAAImB;AAEtC,YAAIC;AACJ,YAAIjB,SAAS;AACTiB,mBAAS,MAAM,KAAKtB,YAAYuB,UAAUlB,OAAAA;QAC9C,WAAWC,gBAAgB;AACvBgB,mBAAS,MAAM,KAAKtB,YAAYwB,iBAAiBlB,cAAAA;QACrD,OAAO;AACHgB,mBAAS,MAAM,KAAKtB,YAAYyB,kBAAkBrB,KAAKU,cAAc;QACzE;AAEAX,YAAIe,OAAO,GAAA,EAAKC,KAAKG,OAAOI,IAAIlC,SAAAA,CAAAA;MACpC,GAdO;MAgBPmC,MAAM,8BAAOzB,KAAqBC,QAAAA;AAC9B,cAAMC,OAAOF,IAAIE;AACjB,cAAMX,QAAQ,MAAM,KAAKO,YAAY4B,QAAQ1B,IAAI2B,OAAOC,EAAE;AAC1D,YAAI,CAACrC,SAASA,MAAMsC,oBAAoB3B,KAAKU,eAAgB,OAAMJ,UAAUsB,SAAS,OAAA;AAEtF7B,YAAIe,OAAO,GAAA,EAAKC,KAAK3B,UAAUC,KAAAA,CAAAA;MACnC,GANM;MAQNwC,aAAa,8BAAO/B,KAAqBC,QAAAA;AACrC,cAAMC,OAAOF,IAAIE;AACjB,cAAMX,QAAQ,MAAM,KAAKO,YAAY4B,QAAQ1B,IAAI2B,OAAOC,EAAE;AAC1D,YAAI,CAACrC,SAASA,MAAMsC,oBAAoB3B,KAAKU,eAAgB,OAAMJ,UAAUsB,SAAS,OAAA;AAEtF,cAAM,KAAKjC,iBAAiBkC,WAAWxC,MAAMqC,IAAIrC,MAAMC,QAAQ;AAC/D,cAAMwC,cAAc,MAAM,KAAKlC,YAAY4B,QAAQnC,MAAMqC,EAAE;AAC3D3B,YAAIe,OAAO,GAAA,EAAKC,KAAK3B,UAAU0C,WAAAA,CAAAA;MACnC,GARa;IASjB;;;;;;;;;;;;;AC/EA,OAAOC,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,oBAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,eAAAA;AAoDrCJ,SAAOK,KAAK,KAAKC,aAAaJ,WAAWK,MAAM,CAAA;AA2C/CP,SAAOQ,IAAI,KAAKF,aAAaJ,WAAWO,IAAI,CAAA;AAwC5CT,SAAOQ,IAAI,QAAQF,aAAaJ,WAAWM,GAAG,CAAA;AAuC9CR,SAAOU,OAAO,QAAQJ,aAAaJ,WAAWS,UAAU,CAAA;AAExD,SAAOX;AACX;AAxLA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQa,cAAAA,oBAAiB;;;;;;;;;;IAOZC;;;;AANb,IAAAC;AACA;AAEA;;;AAGO,IAAMD,oBAAN,cAAgCE,eAAAA;aAAAA;;;;MACnC,YAAoBC,gBAAgC;AAChD,cAAK,GAAA,KADWA,iBAAAA;MAEpB;MAEAC,cAAc,8BAAOC,KAAqBC,QAAAA;AACtC,cAAM,EAACC,MAAMC,IAAIC,YAAW,IAAIJ,IAAIK;AAEpC,YAAI,CAACH,QAAQ,CAACC,GAAI,OAAMG,UAAUC,WAAW,0BAAA;AAE7C,cAAMC,WAAW,IAAIC,KAAKP,IAAAA;AAC1B,cAAMQ,SAAS,IAAID,KAAKN,EAAAA;AAExB,YAAIQ,MAAMH,SAASI,QAAO,CAAA,KAAOD,MAAMD,OAAOE,QAAO,CAAA,EAAK,OAAMN,UAAUC,WAAW,iCAAA;AAErF,cAAMM,SAAS,MAAM,KAAKf,eAAegB,6BAA6BN,UAAUE,QAAQN,WAAAA;AAExFH,YAAIc,KAAK;UACLC,SAAS;UACTC,MAAM;YACFC,WAAWL,OAAOM;YAClBC,YAAYP,OAAOQ;YACnBnB,MAAMM,SAASc,YAAW;YAC1BnB,IAAIO,OAAOY,YAAW;YACtBlB,aAAaA,eAAe;UAChC;UACAmB,YAAW,oBAAId,KAAAA,GAAOa,YAAW;QACrC,CAAA;MACJ,GAvBc;IAwBlB;;;;;;;;;;;;ACrCA,OAAOE,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,sBAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,iBAAAA;AAmDrCJ,SAAOK,KAAK,gBAAgBC,aAAaJ,WAAWK,WAAW,CAAA;AAE/D,SAAOP;AACX;AA7DA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQS,cAAAA,oBAAiB;;;;;;;;;;IAWZC;;;;AAVb,IAAAC;AACA;AAEA;AACA;AACA;AACA,IAAAC;;;AAIO,IAAMF,kBAAN,cAA8BG,eAAAA;aAAAA;;;;;;;;MACjC,YACYC,OACAC,cACAC,YACAC,aACAC,UACV;AACE,cAAK,GAAA,KANGJ,QAAAA,OAAAA,KACAC,eAAAA,cAAAA,KACAC,aAAAA,YAAAA,KACAC,cAAAA,aAAAA,KACAC,WAAAA;MAGZ;MAEAC,qBAAqB,8BAAOC,KAAqBC,QAAAA;AAC7C,cAAM,EAACC,aAAaC,QAAQC,cAAa,IAAIJ,IAAIK;AACjD,aAAKC,IAAIC,KAAK,gCAAgC;UAC1CL;UACAC;UACAC;UACAI,QAAQR,IAAIS,MAAMC;QACtB,CAAA;AACA,YAAIC,UAAU;AAEd,YAAIT,aAAa;AACb,cAAI,MAAM,KAAKR,MAAMkB,IAAI,YAAYV,WAAAA,EAAa,EAAGS;QACzD;AAEA,YAAIR,UAAUC,eAAe;AACzB,cAAI,MAAM,KAAKV,MAAMkB,IAAI,OAAOT,MAAAA,kBAAwBC,aAAAA,EAAe,EAAGO;QAC9E;AAEA,YAAIR,QAAQ;AACRQ,qBAAW,MAAM,KAAKE,WAAW,OAAOV,MAAAA,aAAmB;QAC/D;AAEA,aAAKG,IAAIC,KAAK,gDAA2CI,OAAAA,iBAAwB;AAEjF,YAAI;AACA,cAAIT,aAAa;AACb,kBAAMY,WAAW,MAAM,KAAKlB,WAAWmB,QAAQb,WAAAA;AAC/C,kBAAM,KAAKc,uBAAuB,oBAAoBd,aAAaY,UAAUG,SAAAA;UACjF,WAAWd,QAAQ;AACf,kBAAMe,YAAY,MAAM,KAAKtB,WAAWuB,kBAAkBhB,MAAAA;AAC1D,uBAAWiB,KAAKF,WAAW;AACvB,oBAAM,KAAKF,uBAAuB,oBAAoBI,EAAEC,IAAID,EAAEH,SAAS;YAC3E;UACJ;QACJ,SAASK,GAAG;AACR,eAAKhB,IAAIiB,KAAK,2CAA4CD,EAAYE,OAAO,EAAE;QACnF;AAEAvB,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GAvCqB;MAyCrBC,sBAAsB,8BAAO/B,KAAqBC,QAAAA;AAC9C,cAAM,EAAC+B,cAAc7B,OAAM,IAAIH,IAAIK;AACnC,aAAKC,IAAIC,KAAK,iCAAiC;UAACyB;UAAc7B;UAAQK,QAAQR,IAAIS,MAAMC;QAAM,CAAA;AAC9F,YAAIC,UAAU;AAEd,YAAIqB,cAAc;AACd,cAAI,MAAM,KAAKtC,MAAMkB,IAAI,aAAaoB,YAAAA,EAAc,EAAGrB;QAC3D;AAEA,YAAIR,QAAQ;AACRQ,qBAAW,MAAM,KAAKE,WAAW,OAAOV,MAAAA,cAAoB;QAChE;AAEA,aAAKG,IAAIC,KAAK,iDAA4CI,OAAAA,iBAAwB;AAElF,YAAI;AACA,cAAIqB,cAAc;AACd,kBAAMC,KAAK,MAAM,KAAKpC,YAAYkB,QAAQiB,YAAAA;AAC1C,kBAAM,KAAKhB,uBAAuB,qBAAqBgB,cAAcC,IAAIhB,SAAAA;UAC7E,WAAWd,QAAQ;AACf,kBAAM+B,aAAa,MAAM,KAAKrC,YAAYsC,SAAShC,MAAAA;AACnD,uBAAW8B,MAAMC,YAAY;AACzB,oBAAM,KAAKlB,uBAAuB,qBAAqBiB,GAAGZ,IAAIY,GAAGhB,SAAS;YAC9E;UACJ;QACJ,SAASK,GAAG;AACR,eAAKhB,IAAIiB,KAAK,4CAA6CD,EAAYE,OAAO,EAAE;QACpF;AAEAvB,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GA9BsB;MAgCtBM,wBAAwB,8BAAOpC,KAAqBC,QAAAA;AAChD,cAAM,EAACoC,gBAAgBlC,QAAQmC,SAAQ,IAAItC,IAAIK;AAC/C,aAAKC,IAAIC,KAAK,mCAAmC;UAC7C8B;UACAlC;UACAmC;UACA9B,QAAQR,IAAIS,MAAMC;QACtB,CAAA;AACA,YAAIC,UAAU;AAEd,YAAI0B,gBAAgB;AAChB,cAAI,MAAM,KAAK3C,MAAMkB,IAAI,UAAUyB,cAAAA,EAAgB,EAAG1B;QAC1D;AAEA,YAAI2B,UAAU;AACV,cAAI,MAAM,KAAK5C,MAAMkB,IAAI,YAAY0B,QAAAA,EAAU,EAAG3B;AAClDA,qBAAW,MAAM,KAAKE,WAAW,UAAUyB,QAAAA,EAAU;QACzD;AAEA,YAAInC,UAAUmC,UAAU;AACpB,cAAI,MAAM,KAAK5C,MAAMkB,IAAI,OAAOT,MAAAA,gBAAsBmC,QAAAA,EAAU,EAAG3B;QACvE;AAEA,YAAIR,QAAQ;AACRQ,qBAAW,MAAM,KAAKE,WAAW,OAAOV,MAAAA,gBAAsB;QAClE;AAEA,aAAKG,IAAIC,KAAK,mDAA8CI,OAAAA,iBAAwB;AACpFV,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GA7BwB;MA+BxBS,mBAAmB,8BAAOvC,KAAqBC,QAAAA;AAC3C,cAAM,EAACuC,SAASC,MAAK,IAAIzC,IAAIK;AAC7B,aAAKC,IAAIC,KAAK,8BAA8B;UAACiC;UAASC;UAAOjC,QAAQR,IAAIS,MAAMC;QAAM,CAAA;AACrF,YAAIC,UAAU;AAEd,YAAI6B,SAAS;AACT7B,qBAAW,MAAM,KAAKE,WAAW,UAAU2B,OAAAA,IAAW;QAC1D;AAEA,YAAIC,OAAO;AACP,cAAI,MAAM,KAAK/C,MAAMkB,IAAI,gBAAgB6B,MAAMC,KAAI,EAAGC,YAAW,CAAA,EAAI,EAAGhC;QAC5E;AAEA,aAAKL,IAAIC,KAAK,8CAAyCI,OAAAA,iBAAwB;AAC/EV,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GAfmB;MAiBnBc,iBAAiB,8BAAO5C,KAAqBC,QAAAA;AACzC,cAAM,EAACuC,SAASC,MAAK,IAAIzC,IAAIK;AAC7B,aAAKC,IAAIC,KAAK,4BAA4B;UAACiC;UAASC;UAAOjC,QAAQR,IAAIS,MAAMC;QAAM,CAAA;AACnF,YAAIC,UAAU;AAEd,YAAI6B,SAAS;AACT7B,qBAAW,MAAM,KAAKE,WAAW,UAAU2B,OAAAA,IAAW;AACtD7B,qBAAW,MAAM,KAAKE,WAAW,QAAQ2B,OAAAA,IAAW;QACxD;AAEA,YAAIC,OAAO;AACP,cAAI,MAAM,KAAK/C,MAAMkB,IAAI,gBAAgB6B,MAAMC,KAAI,EAAGC,YAAW,CAAA,EAAI,EAAGhC;QAC5E;AAEA,aAAKL,IAAIC,KAAK,4CAAuCI,OAAAA,iBAAwB;AAC7EV,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GAhBiB;MAkBjBe,iBAAiB,8BAAO7C,KAAqBC,QAAAA;AACzC,cAAM,EAAC6C,YAAYC,SAAQ,IAAI/C,IAAIK;AACnC,aAAKC,IAAIC,KAAK,4BAA4B;UACtCuC,YAAYA,aAAa,GAAGA,WAAWE,UAAU,GAAG,CAAA,CAAA,QAAUC;UAC9DF;UACAvC,QAAQR,IAAIS,MAAMC;QACtB,CAAA;AACA,YAAIC,UAAU;AAEd,YAAImC,YAAY;AACZ,cAAI,MAAM,KAAKpD,MAAMkB,IAAI,cAAckC,UAAAA,EAAY,EAAGnC;AACtDA,qBAAW,MAAM,KAAKE,WAAW,QAAQiC,UAAAA,IAAc;QAC3D;AAEA,YAAIC,UAAU;AACVpC,qBAAW,MAAM,KAAKE,WAAW,UAAUkC,QAAAA,EAAU;QACzD;AAEA,aAAKzC,IAAIC,KAAK,4CAAuCI,OAAAA,iBAAwB;AAC7EV,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GApBiB;MAsBjBoB,gBAAgB,8BAAOlD,KAAqBC,QAAAA;AACxC,cAAM,EAACE,OAAM,IAAIH,IAAIK;AACrB,YAAI,CAACF,OAAQ,OAAMgD,UAAUC,WAAW,oBAAA;AAExC,aAAK9C,IAAIC,KAAK,2BAA2B;UAACJ;UAAQK,QAAQR,IAAIS,MAAMC;QAAM,CAAA;AAC1E,YAAIC,UAAU;AACdA,mBAAW,MAAM,KAAKE,WAAW,OAAOV,MAAAA,IAAU;AAElD,aAAKG,IAAIC,KAAK,2CAAsCI,OAAAA,iBAAwB;AAC5EV,YAAIwB,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChB;UAAO;UAAGiB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACjF,GAVgB;MAYhB,MAAcd,uBACVqC,QACAC,UACAC,UACa;AACb,YAAIC,SAAS;AACb,YAAID,UAAU;AACV,gBAAME,SAAS,MAAM,KAAK3D,SAASiB,QAAQwC,QAAAA;AAC3C,cAAIE,OAAQD,UAASC,OAAOD;QAChC;AAEA,cAAME,QAA4B;UAC9BL;UACAM,UAAU;UACVL;UACAC,UAAUA,YAAY;UACtBC;UACAI,UAAUC,IAAIC,IAAIC;UAClBC,IAAInC,KAAKoC,IAAG;QAChB;AAEA,cAAM,KAAKtE,aAAauE,eAAeL,IAAIM,MAAMC,eAAef,QAAQK,KAAAA;AACxE,aAAKpD,IAAIC,KAAK,aAAa8C,MAAAA,QAAcC,QAAAA,EAAU;MACvD;MAEA,MAAczC,WAAWwD,SAAkC;AACvD,cAAMC,OAAO,MAAM,KAAK5E,MAAM4E,KAAKD,OAAAA;AACnC,YAAI1D,UAAU;AACd,mBAAW4D,OAAOD,MAAM;AACpB,cAAI,MAAM,KAAK5E,MAAMkB,IAAI2D,GAAAA,EAAM5D;QACnC;AACA,eAAOA;MACX;IACJ;;;;;;;;;;;;;;;;ACrOA,OAAO6D,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,oBAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,eAAAA;AAyCrCJ,SAAOK,KAAK,wBAAwBC,aAAaJ,WAAWK,kBAAkB,CAAA;AAuC9EP,SAAOK,KAAK,yBAAyBC,aAAaJ,WAAWM,mBAAmB,CAAA;AAyChFR,SAAOK,KAAK,2BAA2BC,aAAaJ,WAAWO,qBAAqB,CAAA;AAuCpFT,SAAOK,KAAK,sBAAsBC,aAAaJ,WAAWQ,gBAAgB,CAAA;AAqC1EV,SAAOK,KAAK,oBAAoBC,aAAaJ,WAAWS,cAAc,CAAA;AAsCtEX,SAAOK,KAAK,mBAAmBC,aAAaJ,WAAWU,aAAa,CAAA;AAuCpEZ,SAAOK,KAAK,oBAAoBC,aAAaJ,WAAWW,cAAc,CAAA;AAEtE,SAAOb;AACX;AA5RA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQe,cAAAA,oBAAiB;;;;;;;;;;IAYZC;;;;AAXb,IAAAC;AACA;AAEA;AACA;AACA;AACA,IAAAC;AACA;;;AAIO,IAAMF,yBAAN,cAAqCG,eAAAA;aAAAA;;;;;;;MACxC,YACYC,YACAC,UACAC,cACAC,qBACV;AACE,cAAK,GAAA,KALGH,aAAAA,YAAAA,KACAC,WAAAA,UAAAA,KACAC,eAAAA,cAAAA,KACAC,sBAAAA;MAGZ;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,IAAIC,gBAAgBH,GAAAA;AAC1B,cAAM,EAACI,QAAQC,SAASC,OAAM,IAAIN,IAAIO;AACtC,cAAMC,UAAmE,CAAC;AAC1E,YAAIJ,OAAQI,SAAQJ,SAASA;AAC7B,YAAIC,YAAYI,OAAWD,SAAQH,UAAUA,YAAY;AACzD,YAAIC,OAAQE,SAAQF,SAASA;AAC7B,cAAMI,SAAS,MAAM,KAAKf,WAAWgB,cACjCH,SAASN,EAAEU,OAAOV,EAAEW,QAAQX,EAAEY,SAASZ,EAAEa,QAAQ;AAErDd,YAAIe,KAAKC,kBAAkBP,OAAOQ,MAAMR,OAAOS,OAAOjB,CAAAA,CAAAA;MAC1D,GAXO;MAaPkB,MAAM,8BAAOpB,KAAqBC,QAAAA;AAC9B,cAAMoB,WAAW,MAAM,KAAK1B,WAAW2B,QAAQtB,IAAIuB,OAAOC,EAAE;AAC5D,YAAI,CAACH,SAAU,OAAMI,UAAUC,SAAS,UAAA;AACxCzB,YAAIe,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAUQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAChF,GAJM;MAMNC,SAAS,8BAAOhC,KAAqBC,QAAAA;AACjC,cAAMoB,WAAW,MAAM,KAAK1B,WAAWqC,OAAOhC,IAAIiC,IAAI;AACtD,YAAI,CAACZ,SAAU,OAAMI,UAAUS,WAAW,2BAAA;AAC1C,cAAM,KAAKC,yBAAyB,WAAWd,SAASG,IAAIH,SAASe,SAAS;AAC9EnC,YAAIoC,OAAO,GAAA,EAAKrB,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAUQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC5F,GALS;MAOTO,SAAS,8BAAOtC,KAAqBC,QAAAA;AACjC,cAAMoB,WAAW,MAAM,KAAK1B,WAAW2C,OAAOtC,IAAIuB,OAAOC,IAAIxB,IAAIiC,IAAI;AACrE,YAAI,CAACZ,SAAU,OAAMI,UAAUC,SAAS,UAAA;AACxC,cAAM,KAAKS,yBAAyB,WAAWd,SAASG,IAAIH,SAASe,SAAS;AAC9EnC,YAAIe,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAUQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAChF,GALS;MAOTQ,SAAS,8BAAOvC,KAAqBC,QAAAA;AACjC,cAAMuC,WAAW,MAAM,KAAK7C,WAAW2B,QAAQtB,IAAIuB,OAAOC,EAAE;AAC5D,cAAMiB,UAAU,MAAM,KAAK9C,WAAW+C,WAAW1C,IAAIuB,OAAOC,EAAE;AAC9D,YAAI,CAACiB,QAAS,OAAMhB,UAAUC,SAAS,UAAA;AACvC,cAAM,KAAKS,yBAAyB,WAAWnC,IAAIuB,OAAOC,IAAIgB,UAAUJ,SAAAA;AACxEnC,YAAIe,KAAK;UAACW,SAAS;UAAME,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAChE,GANS;MAQTY,gBAAgB,8BAAO3C,KAAqBC,QAAAA;AACxC,cAAM,EAAC2C,cAAa,IAAI5C,IAAIiC;AAC5B,YAAI,CAACW,cAAe,OAAMnB,UAAUS,WAAW,2BAAA;AAE/C,cAAMb,WAAW,MAAM,KAAK1B,WAAW2B,QAAQtB,IAAIuB,OAAOC,EAAE;AAC5D,YAAI,CAACH,SAAU,OAAMI,UAAUC,SAAS,UAAA;AAExC,cAAMmB,gBAAgBxB,SAASe,YAAY,MAAM,KAAKxC,SAAS0B,QAAQD,SAASe,SAAS,IAAI;AAC7F,YAAI,CAACS,cAAe,OAAMpB,UAAUS,WAAW,mCAAA;AAE/C,cAAMY,eAAe,MAAM,KAAKlD,SAASmD,sBAAsBF,cAAcG,QAAQJ,aAAAA;AACrF,YAAI,CAACE,aAAc,OAAMrB,UAAUC,SAAS,kBAAkBkB,aAAAA,QAAqBC,cAAcG,MAAM,EAAE;AAEzG,cAAM,KAAKrD,WAAW2C,OAAOtC,IAAIuB,OAAOC,IAAI;UAACY,WAAWU,aAAatB;QAAE,CAAA;AACvE,cAAM,KAAKW,yBAAyB,WAAWnC,IAAIuB,OAAOC,IAAIsB,aAAatB,EAAE;AAE7EvB,YAAIe,KAAK;UACLW,SAAS;UACTC,MAAM;YAACqB,YAAYjD,IAAIuB,OAAOC;YAAIoB;YAAeM,UAAUJ,aAAatB;UAAE;UAC1EK,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QACrC,CAAA;MACJ,GArBgB;MAuBhBoB,iBAAiB,8BAAOnD,KAAqBC,QAAAA;AACzC,cAAMS,SAAS,MAAM,KAAKZ,oBAAoBqD,eAAenD,IAAIuB,OAAOC,EAAE;AAC1EvB,YAAIe,KAAK;UAACW,SAAS;UAAMC,MAAMlB;UAAQmB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC9E,GAHiB;MAKjBqB,2BAA2B,8BAAOpD,KAAqBC,QAAAA;AACnD,cAAM,EAACmC,WAAWiB,kBAAiB,IAAIrD,IAAIiC;AAC3C,YAAI,CAACG,UAAW,OAAMX,UAAUS,WAAW,uBAAA;AAC3C,YAAI,CAACmB,kBAAmB,OAAM5B,UAAUS,WAAW,+BAAA;AACnD,cAAMxB,SAAS,MAAM,KAAKZ,oBAAoBsD,yBAAyBhB,WAAWiB,iBAAAA;AAClFpD,YAAIe,KAAK;UAACW,SAAS;UAAMC,MAAMlB;UAAQmB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC9E,GAN2B;MAQ3B,MAAcI,yBACVmB,UACAL,YACAC,UACa;AACb,YAAIF,SAAS;AACb,YAAIE,UAAU;AACV,gBAAMK,SAAS,MAAM,KAAK3D,SAAS0B,QAAQ4B,QAAAA;AAC3C,cAAIK,OAAQP,UAASO,OAAOP;QAChC;AAEA,cAAMQ,QAA4B;UAC9BC,QAAQ;UACRH;UACAI,UAAUT;UACVC,UAAUA,YAAY;UACtBF;UACAW,UAAUC,IAAIC,IAAIC;UAClBC,IAAIjC,KAAKkC,IAAG;QAChB;AAEA,YAAI;AACA,gBAAM,KAAKnE,aAAaoE,eACpBL,IAAIM,MAAMC,eAAe,oBAAoBX,KAAAA;QAErD,SAASY,GAAG;AACR,eAAKC,IAAIC,KAAK,yCAA0CF,EAAYG,OAAO,EAAE;QACjF;MACJ;IACJ;;;;;;;;;;;;;;;ACjIA,OAAOC,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,uBAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,sBAAAA;AA0HrCJ,SAAOK,KAAK,SAASC,aAAaJ,WAAWK,wBAAwB,CAAA;AACrEP,SAAOQ,IAAI,KAAKF,aAAaJ,WAAWO,IAAI,CAAA;AA8D5CT,SAAOQ,IAAI,QAAQF,aAAaJ,WAAWM,GAAG,CAAA;AAyE9CR,SAAOK,KAAK,KAAKC,aAAaJ,WAAWQ,MAAM,CAAA;AA+E/CV,SAAOW,IAAI,QAAQL,aAAaJ,WAAWU,MAAM,CAAA;AA4CjDZ,SAAOa,OAAO,QAAQP,aAAaJ,WAAWY,MAAM,CAAA;AAsDpDd,SAAOK,KAAK,uBAAuBC,aAAaJ,WAAWa,aAAa,CAAA;AAwCxEf,SAAOK,KAAK,aAAaC,aAAaJ,WAAWc,cAAc,CAAA;AAE/D,SAAOhB;AACX;AAreA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQkB,cAAAA,oBAAiB;;;;;;;;;;IAQZC;;;;AAPb,IAAAC;AACA;AAEA;AACA;;;AAGO,IAAMD,4BAAN,cAAwCE,eAAAA;aAAAA;;;;MAC3C,YAAoBC,eAA8B;AAC9C,cAAK,GAAA,KADWA,gBAAAA;MAEpB;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,IAAIC,gBAAgBH,GAAAA;AAC1B,cAAM,EAACI,QAAQC,aAAaC,OAAM,IAAIN,IAAIO;AAC1C,cAAMC,SAAS,MAAM,KAAKV,cAAcW,cAAc;UAClDL;UACAC;UACAC;QACJ,GAAGJ,EAAEQ,OAAOR,EAAES,QAAQT,EAAEU,SAASV,EAAEW,QAAQ;AAC3CZ,YAAIa,KAAKC,kBAAkBP,OAAOQ,MAAMR,OAAOS,OAAOf,CAAAA,CAAAA;MAC1D,GATO;MAWPgB,MAAM,8BAAOlB,KAAqBC,QAAAA;AAC9B,cAAMkB,MAAM,MAAM,KAAKrB,cAAcsB,QAAQpB,IAAIqB,OAAOC,EAAE;AAC1D,YAAI,CAACH,IAAK,OAAMI,UAAUC,SAAS,aAAA;AACnCvB,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAKQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC3E,GAJM;MAMNC,SAAS,8BAAO9B,KAAqBC,QAAAA;AACjC,cAAMkB,MAAM,MAAM,KAAKrB,cAAcgC,OAAO9B,IAAI+B,IAAI;AACpD,YAAI,CAACZ,IAAK,OAAMI,UAAUS,WAAW,8BAAA;AACrC/B,YAAIgC,OAAO,GAAA,EAAKnB,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAKQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACvF,GAJS;MAMTK,SAAS,8BAAOlC,KAAqBC,QAAAA;AACjC,cAAMkB,MAAM,MAAM,KAAKrB,cAAcoC,OAAOlC,IAAIqB,OAAOC,IAAItB,IAAI+B,IAAI;AACnE,YAAI,CAACZ,IAAK,OAAMI,UAAUC,SAAS,aAAA;AACnCvB,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAKQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC3E,GAJS;MAMTM,SAAS,8BAAOnC,KAAqBC,QAAAA;AACjC,cAAMmC,UAAU,MAAM,KAAKtC,cAAcuC,WAAWrC,IAAIqB,OAAOC,EAAE;AACjE,YAAI,CAACc,QAAS,OAAMb,UAAUC,SAAS,aAAA;AACvCvB,YAAIa,KAAK;UAACW,SAAS;UAAME,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAChE,GAJS;IAKb;;;;;;;;;;;;AChDA,OAAOS,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,0BAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,yBAAAA;AAmFrCJ,SAAOK,IAAI,KAAKC,aAAaJ,WAAWK,IAAI,CAAA;AAuE5CP,SAAOK,IAAI,QAAQC,aAAaJ,WAAWG,GAAG,CAAA;AAwF9CL,SAAOQ,KAAK,KAAKF,aAAaJ,WAAWO,MAAM,CAAA;AA+F/CT,SAAOU,IAAI,QAAQJ,aAAaJ,WAAWS,MAAM,CAAA;AA4CjDX,SAAOY,OAAO,QAAQN,aAAaJ,WAAWW,MAAM,CAAA;AAEpD,SAAOb;AACX;AAvYA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQe,cAAAA,oBAAiB;;;;;;;;;;IAUZC;;;;AATb,IAAAC;AACA;AAEA;AACA;AACA;AACA;;;AAGO,IAAMD,sBAAN,cAAkCE,eAAAA;aAAAA;;;;;;MACrC,YACYC,SACAC,kBACAC,uBACV;AACE,cAAK,GAAA,KAJGF,UAAAA,SAAAA,KACAC,mBAAAA,kBAAAA,KACAC,wBAAAA;MAGZ;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,IAAIC,gBAAgBH,KAAK,MAAA;AAC/B,cAAM,EAACI,QAAQC,aAAaC,OAAM,IAAIN,IAAIO;AAC1C,cAAMC,SAAS,MAAM,KAAKZ,QAAQa,cAAc;UAC5CL;UACAC;UACAC;QACJ,GAAGJ,EAAEQ,OAAOR,EAAES,QAAQT,EAAEU,SAASV,EAAEW,QAAQ;AAC3CZ,YAAIa,KAAKC,kBAAkBP,OAAOQ,MAAMR,OAAOS,OAAOf,CAAAA,CAAAA;MAC1D,GATO;MAWPgB,MAAM,8BAAOlB,KAAqBC,QAAAA;AAC9B,cAAMkB,QAAQ,MAAM,KAAKvB,QAAQwB,QAAQpB,IAAIqB,OAAOC,EAAE;AACtD,YAAI,CAACH,MAAO,OAAMI,UAAUC,SAAS,OAAA;AACrCvB,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAOQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC7E,GAJM;MAMNC,SAAS,8BAAO9B,KAAqBC,QAAAA;AACjC,cAAMkB,QAAQ,MAAM,KAAKvB,QAAQkC,OAAO9B,IAAI+B,IAAI;AAChD,YAAI,CAACZ,MAAO,OAAMI,UAAUS,WAAW,wBAAA;AACvC/B,YAAIgC,OAAO,GAAA,EAAKnB,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAOQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACzF,GAJS;MAMTK,SAAS,8BAAOlC,KAAqBC,QAAAA;AACjC,cAAMkB,QAAQ,MAAM,KAAKvB,QAAQsC,OAAOlC,IAAIqB,OAAOC,IAAItB,IAAI+B,IAAI;AAC/D,YAAI,CAACZ,MAAO,OAAMI,UAAUC,SAAS,OAAA;AACrCvB,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAAOQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC7E,GAJS;MAMTM,SAAS,8BAAOnC,KAAqBC,QAAAA;AACjC,cAAMmC,UAAU,MAAM,KAAKxC,QAAQyC,WAAWrC,IAAIqB,OAAOC,EAAE;AAC3D,YAAI,CAACc,QAAS,OAAMb,UAAUC,SAAS,OAAA;AACvCvB,YAAIa,KAAK;UAACW,SAAS;UAAME,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAChE,GAJS;MAMTS,OAAO,8BAAOC,MAAsBtC,QAAAA;AAChC,cAAMO,SAAS,MAAM,KAAKX,iBAAiB2C,SAAQ;AACnDvC,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMlB;UAAQmB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC9E,GAHO;MAKPY,iBAAiB,8BAAOF,MAAsBtC,QAAAA;AAC1C,cAAMO,SAAS,MAAM,KAAKV,sBAAsB4C,QAAO;AACvDzC,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMlB;UAAQmB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC9E,GAHiB;MAKjBc,eAAe,8BAAO3C,KAAqBC,QAAAA;AACvC,cAAM,EAAC2C,WAAU,IAAI5C,IAAIqB;AACzB,YAAI,CAACuB,WAAY,OAAMrB,UAAUS,WAAW,wBAAA;AAC5C,cAAMxB,SAAS,MAAM,KAAKX,iBAAiBgD,mBAAmBD,UAAAA;AAC9D3C,YAAIa,KAAK;UAACW,SAAS;UAAMC,MAAMlB;UAAQmB,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC9E,GALe;IAMnB;;;;;;;;;;;;;;ACvEA,OAAOiB,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,oBAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,mBAAAA;AA8ErCJ,SAAOK,IAAI,KAAKC,aAAaJ,WAAWK,IAAI,CAAA;AAsB5CP,SAAOQ,KAAK,SAASF,aAAaJ,WAAWO,IAAI,CAAA;AAsBjDT,SAAOQ,KAAK,oBAAoBF,aAAaJ,WAAWQ,cAAc,CAAA;AA8BtEV,SAAOQ,KAAK,+BAA+BF,aAAaJ,WAAWS,YAAY,CAAA;AAkE/EX,SAAOK,IAAI,QAAQC,aAAaJ,WAAWG,GAAG,CAAA;AA+E9CL,SAAOQ,KAAK,KAAKF,aAAaJ,WAAWU,MAAM,CAAA;AAqF/CZ,SAAOa,IAAI,QAAQP,aAAaJ,WAAWY,MAAM,CAAA;AA4CjDd,SAAOe,OAAO,QAAQT,aAAaJ,WAAWc,MAAM,CAAA;AAEpD,SAAOhB;AACX;AApbA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQkB,cAAAA,oBAAiB;;;;;;;;;;IAQZC;;;;AAPb,IAAAC;AACA;AAEA;AACA;;;AAGO,IAAMD,yBAAN,cAAqCE,eAAAA;aAAAA;;;;;MACxC,YACYC,YACAC,QACV;AACE,cAAK,GAAA,KAHGD,aAAAA,YAAAA,KACAC,SAAAA;MAGZ;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,IAAIC,gBAAgBH,GAAAA;AAC1B,cAAMI,IAAIJ,IAAIK;AACd,cAAMC,SAAS,MAAM,KAAKT,WAAWU,cACjC;UACIC,QAAQJ,EAAEI;UAAQC,gBAAgBL,EAAEK;UAAgBC,aAAaN,EAAEM;UACnEC,cAAcP,EAAEO;UAAcC,SAASR,EAAEQ;UAASC,mBAAmBT,EAAES;UACvEC,QAAQV,EAAEU;UAAQC,MAAMX,EAAEW;UAAMC,IAAIZ,EAAEY;QAC1C,GACAd,EAAEe,OAAOf,EAAEgB,QAAQhB,EAAEiB,SAASjB,EAAEkB,QAAQ;AAE5CnB,YAAIoB,KAAKC,kBAAkBhB,OAAOiB,MAAMjB,OAAOkB,OAAOtB,CAAAA,CAAAA;MAC1D,GAZO;MAcPuB,MAAM,8BAAOzB,KAAqBC,QAAAA;AAC9B,cAAMyB,WAAW,MAAM,KAAK7B,WAAW8B,QAAQ3B,IAAI4B,OAAOC,EAAE;AAC5D,YAAI,CAACH,SAAU,OAAMI,UAAUC,SAAS,UAAA;AACxC,cAAMC,QAAQ,MAAM,KAAKlC,OAAOmC,iBAAiBjC,IAAI4B,OAAOC,EAAE;AAC9D5B,YAAIoB,KAAK;UAACa,SAAS;UAAMC,MAAM;YAAC,GAAGT;YAAUM;UAAK;UAAGI,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC5F,GALM;MAONC,UAAU,8BAAOvC,KAAqBC,QAAAA;AAClC,cAAMkC,OAAO,MAAM,KAAKtC,WAAW2C,WAAWxC,IAAIK,MAAMG,MAAM;AAC9DP,YAAIoB,KAAK;UAACa,SAAS;UAAMC;UAAMC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACtE,GAHU;IAId;;;;;;;;;;;;;AC1CA,OAAOG,cAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,uBAAAA;AACZ,QAAMC,SAASH,SAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,sBAAAA;AAmDrCJ,SAAOK,IAAI,YAAYC,aAAaJ,WAAWK,OAAO,CAAA;AAwCtDP,SAAOK,IAAI,QAAQC,aAAaJ,WAAWG,GAAG,CAAA;AA8E9CL,SAAOK,IAAI,KAAKC,aAAaJ,WAAWM,IAAI,CAAA;AAE5C,SAAOR;AACX;AAnLA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQU,cAAAA,oBAAiB;;;;;;;;;;IAQZC;;;;AAPb,IAAAC;AACA;AAEA;AACA;;;AAGO,IAAMD,wBAAN,cAAoCE,eAAAA;aAAAA;;;;MACvC,YAAoBC,WAAsB;AACtC,cAAK,GAAA,KADWA,YAAAA;MAEpB;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,IAAIC,gBAAgBH,KAAK,WAAA;AAC/B,cAAMI,IAAIJ,IAAIK;AACd,cAAMC,SAAS,MAAM,KAAKR,UAAUS,cAChC;UACIC,QAAQJ,EAAEI;UAAQC,gBAAgBL,EAAEK;UAAgBC,aAAaN,EAAEM;UACnEC,cAAcP,EAAEO;UAAcC,SAASR,EAAEQ;UAASC,MAAMT,EAAES;UAAMC,IAAIV,EAAEU;QAC1E,GACAZ,EAAEa,OAAOb,EAAEc,QAAQd,EAAEe,SAASf,EAAEgB,QAAQ;AAE5CjB,YAAIkB,KAAKC,kBAAkBd,OAAOe,MAAMf,OAAOgB,OAAOpB,CAAAA,CAAAA;MAC1D,GAXO;MAaPqB,MAAM,8BAAOvB,KAAqBC,QAAAA;AAC9B,cAAMuB,UAAU,MAAM,KAAK1B,UAAU2B,QAAQzB,IAAI0B,OAAOC,EAAE;AAC1D,YAAI,CAACH,QAAS,OAAMI,UAAUC,SAAS,SAAA;AACvC5B,YAAIkB,KAAK;UAACW,SAAS;UAAMC,MAAMP;UAASQ,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC/E,GAJM;IAKV;;;;;;;;;;;;AChCA,OAAOC,eAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,sBAAAA;AACZ,QAAMC,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,qBAAAA;AAuCrCJ,SAAOK,IAAI,QAAQC,aAAaJ,WAAWG,GAAG,CAAA;AAqE9CL,SAAOK,IAAI,KAAKC,aAAaJ,WAAWK,IAAI,CAAA;AAE5C,SAAOP;AACX;AAtHA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQS,UAAAA,SAAQC,cAAAA,oBAAiB;;;;;;;;;;;;;;;IAYpBC;;;;AAXb,IAAAC;AACA;AAEA;AACA;AAEA,IAAAC;AAEA;;;;AAGO,IAAMF,iBAAN,cAA6BG,eAAAA;aAAAA;;;;;;;;;;;MAChC,YACqBC,oBACAC,iBACAC,cACAC,qBACAC,SACAC,eACAC,YACkCC,qBACrD;AACE,cAAK,GAAA,KATYP,qBAAAA,oBAAAA,KACAC,kBAAAA,iBAAAA,KACAC,eAAAA,cAAAA,KACAC,sBAAAA,qBAAAA,KACAC,UAAAA,SAAAA,KACAC,gBAAAA,eAAAA,KACAC,aAAAA,YAAAA,KACkCC,sBAAAA;MAGvD;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,UAAS,KAAKC,KAAK,KAAKJ,IAAI;AAClC,cAAM,EAACK,KAAI,IAAIJ;AACf,YAAI,CAACI,KAAM,OAAMC,UAAUC,aAAY;AAEvC,cAAMC,cAA2BP,IAAIQ;AAErC,cAAMC,UAAUT,IAAIU,QAAQ,oBAAA;AAC5B,YAAID,WAAW,CAACF,YAAYI,aAAa;AACrCJ,sBAAYI,cAAcF;QAC9B;AAEA,cAAMG,SAAS,MAAM,KAAKrB,mBAAmBsB,cAAcT,MAAMG,WAAAA;AAEjE,YAAIA,YAAYO,UAAU;AACtBF,iBAAOE,WAAW,MAAM,KAAKvB,mBAAmBwB,gBAC5CH,OAAOI,SAASC,WAAWV,YAAYO,UAAUI,mBAAmBC,IAAI;QAEhF;AAEA,cAAMC,gBAAgB,KAAK7B,mBAAmB8B,mBAC1CjB,MACAQ,QACAL,aACA;UAACe,MAAMtB,IAAIsB;UAAMC,QAAQvB,IAAIuB;UAAQb,SAASV,IAAIU,WAAW,CAAC;UAAGc,OAAOxB,IAAIwB,SAAS,CAAC;QAAC,CAAA;AAG3F,YAAIZ,OAAOD,aAAac,QAAQC,QAAQ;AACpC,gBAAMV,WAAW,MAAM,KAAKtB,oBAAoBiC,oBAAoBf,OAAOI,SAASY,EAAE;AACtF,gBAAM,KAAK9B,oBAAoB+B,QAC3BC,yBAAyBC,mBAAmB,iBAAiB3B,MAAMgB,eAAe,gBAAA,CAAA;AAEtF,gBAAMY,SAAS,MAAM,KAAKvC,aAAawC,MAAMjB,UAAUI,eAAeR,OAAOD,YAAYc,QAAQrB,IAAAA;AACjG,gBAAM,KAAKN,oBAAoB+B,QAC3BC,yBAAyBC,mBACrBC,QAAQE,SAAS,iBAAiB,gBAClC9B,MAAMgB,eAAe,gBAAA,CAAA;QAGjC;AAEA,cAAM,KAAKtB,oBAAoB+B,QAC3BC,yBAAyBC,mBAAmB,mBAAmB3B,MAAMgB,eAAe,iBAAA,CAAA;AAExF,cAAM,KAAK5B,gBAAgB2C,YAAYnC,KAAKC,KAAKmB,aAAAA;AAEjDlB,QAAAA,QAAOkC,KAAK,+BAA+B;UAACC,WAAWjB,cAAciB;QAAS,CAAA;MAClF,GA/CO;MAiDPC,WAAW,8BAAOtC,KAAqBC,QAAAA;AACnC,cAAMC,UAAS,KAAKC,KAAK,KAAKmC,QAAQ;AACtC,cAAM,EAAClC,KAAI,IAAIJ;AACf,YAAI,CAACI,KAAM,OAAMC,UAAUC,aAAY;AAEvC,cAAME,OAAOR,IAAIQ;AACjB,cAAMD,cAA2B;UAC7BgC,OAAO/B,KAAK+B;UACZC,UAAU;YAAC;cAACC,MAAM;cAAQC,SAASlC,KAAKmC;YAAM;;UAC9CC,QAAQpC,KAAKoC;UACbC,YAAYrC,KAAKqC;UACjBC,aAAatC,KAAKsC;UAClBC,OAAOvC,KAAKuC;UACZC,gBAAgBxC,KAAKwC;UACrBhC,UAAUR,KAAKQ;UACfL,aAAaH,KAAKG;QACtB;AAEA,cAAMC,SAAS,MAAM,KAAKrB,mBAAmB0D,2BACzC7C,MAAMG,aAAaW,mBAAmBgC,UAAU1C,KAAKM,QAAQ;AAGjE,cAAMM,gBAAgB,KAAK7B,mBAAmB8B,mBAC1CjB,MACAQ,QACAL,aACA;UAACe,MAAMtB,IAAIsB;UAAMC,QAAQvB,IAAIuB;UAAQb,SAASV,IAAIU,WAAW,CAAC;UAAGc,OAAOxB,IAAIwB,SAAS,CAAC;QAAC,CAAA;AAE3FJ,sBAAc+B,UAAU3C;AAExB,cAAM,KAAKV,oBAAoB+B,QAC3BC,yBAAyBC,mBAAmB,mBAAmB3B,MAAMgB,eAAe,iBAAA,CAAA;AAExF,cAAM,KAAK5B,gBAAgB2C,YAAYnC,KAAKC,KAAKmB,aAAAA;AAEjDlB,QAAAA,QAAOkC,KAAK,mCAAmC;UAACC,WAAWjB,cAAciB;QAAS,CAAA;MACtF,GApCW;MAsCXe,QAAQ,8BAAOpD,KAAqBC,QAAAA;AAChC,cAAMC,UAAS,KAAKC,KAAK,KAAKiD,KAAK;AACnC,cAAM,EAAChD,KAAI,IAAIJ;AACf,YAAI,CAACI,KAAM,OAAMC,UAAUC,aAAY;AAEvC,cAAME,OAAOR,IAAIQ;AACjB,cAAMD,cAA2B;UAC7BgC,OAAO/B,KAAK+B;UACZvB,UAAUR,KAAKQ;UACfL,aAAaH,KAAKG;QACtB;AAEA,cAAMC,SAAS,MAAM,KAAKrB,mBAAmB0D,2BACzC7C,MAAMG,aAAaW,mBAAmBmC,OAAO7C,KAAKM,QAAQ;AAG9D,cAAMM,gBAAgB,KAAK7B,mBAAmB8B,mBAC1CjB,MACAQ,QACA;UAAC,GAAGL;UAAaqC,QAAQ;QAAK,GAC9B;UAACtB,MAAMtB,IAAIsB;UAAMC,QAAQvB,IAAIuB;UAAQb,SAASV,IAAIU,WAAW,CAAC;UAAGc,OAAOxB,IAAIwB,SAAS,CAAC;QAAC,CAAA;AAE3FJ,sBAAc+B,UAAU3C;AAExB,cAAM,KAAKhB,gBAAgB2C,YAAYnC,KAAKC,KAAKmB,aAAAA;AAEjDlB,QAAAA,QAAOkC,KAAK,gCAAgC;UAACC,WAAWjB,cAAciB;QAAS,CAAA;MACnF,GA3BQ;MA6BRiB,cAAc,8BAAOtD,KAAqBC,QAAAA;AACtC,cAAMC,UAAS,KAAKC,KAAK,KAAKmD,WAAW;AACzC,cAAM,EAAClD,KAAI,IAAIJ;AACf,YAAI,CAACI,KAAM,OAAMC,UAAUC,aAAY;AAEvC,cAAME,OAAOR,IAAIQ;AACjB,cAAMD,cAA2B;UAC7BgC,OAAO/B,KAAK+B;UACZC,UAAUhC,KAAKgC;UACfxB,UAAUR,KAAKQ;QACnB;AAEA,cAAMJ,SAAS,MAAM,KAAKrB,mBAAmB0D,2BACzC7C,MAAMG,aAAaW,mBAAmBqC,SAAS/C,KAAKM,QAAQ;AAGhE,cAAMM,gBAAgB,KAAK7B,mBAAmB8B,mBAC1CjB,MACAQ,QACA;UAAC,GAAGL;UAAaqC,QAAQ;QAAK,GAC9B;UAACtB,MAAMtB,IAAIsB;UAAMC,QAAQvB,IAAIuB;UAAQb,SAASV,IAAIU,WAAW,CAAC;UAAGc,OAAOxB,IAAIwB,SAAS,CAAC;QAAC,CAAA;AAE3FJ,sBAAc+B,UAAU3C;AAExB,cAAM,KAAKhB,gBAAgB2C,YAAYnC,KAAKC,KAAKmB,aAAAA;AAEjDlB,QAAAA,QAAOkC,KAAK,sCAAsC;UAACC,WAAWjB,cAAciB;QAAS,CAAA;MACzF,GA3Bc;MA6BdmB,SAAS,8BAAOxD,KAAqBC,QAAAA;AACjC,cAAM,EAAC2B,GAAE,IAAI5B,IAAIyD;AACjBxD,YAAIyD,KAAK;UAACC,SAAS;UAAMC,MAAM;YAAChC;YAAIiC,WAAW;UAAI;UAAGC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MAC7F,GAHS;MAKTC,aAAa,8BAAOjE,KAAqBC,QAAAA;AACrC,cAAM,CAACiE,QAAQC,YAAAA,IAAgB,MAAMC,QAAQC,IAAI;UAC7C,KAAK1E,QAAQ2E,iBAAgB;UAC7B,KAAKzE,WAAW0E,kBAAiB;SACpC;AACD,cAAMC,SAASxE,IAAIwB,MAAMgD;AACzB,cAAMC,aAAazE,IAAIwB,MAAMiD;AAC7B,cAAMC,gBAAgB1E,IAAIwB,MAAMmD;AAEhC,YAAIf,OAAwBM,OAAOU,IAAIC,CAAAA,MAAAA;AACnC,iBAAOC,YAAY;YACflD,IAAIiD,EAAEE,gBAAgBF,EAAEG;YACxBA,MAAMH,EAAEG;YACRC,iBAAiBJ,EAAEK,iBAAiB;YACpCC,cAAeN,EAAE5D,aAAakD,aAAaiB,IAAIP,EAAE5D,SAAS,KAAM;cAAC;;YACjEoE,gBAAgBR,EAAEQ;YAClBC,UAAUT,EAAES;YACZC,kBAAkBV,EAAEU,oBAAoB,CAAA;YACxCC,mBAAmBX,EAAEW,qBAAqB,CAAA;YAC1CC,sBAAsBZ,EAAEY,wBAAwB,CAAA;YAChDC,UAAUb,EAAEa,YAAY,CAAC;UAC7B,CAAA;QACJ,CAAA;AAEA,YAAIlB,QAAQ;AACRZ,iBAAOA,KAAK+B,OAAOd,CAAAA,MAAKA,EAAEI,gBAAgBW,YAAW,MAAOpB,OAAOoB,YAAW,CAAA;QAClF;AACA,YAAInB,YAAY;AACZb,iBAAOA,KAAK+B,OAAOd,CAAAA,MAAKA,EAAEM,aAAaU,SAASpB,UAAAA,CAAAA;QACpD;AACA,YAAIC,eAAe;AACfd,iBAAOA,KAAK+B,OAAOd,CAAAA,MAAKA,EAAEU,kBAAkBM,SAASnB,aAAAA,CAAAA;QACzD;AAEAzE,YAAIyD,KAAK;UAACC,SAAS;UAAMC;UAAME,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACtE,GAnCa;MAqCb8B,mBAAmB,8BAAO9F,KAAqBC,QAAAA;AAC3C,cAAM,EAACG,KAAI,IAAIJ;AACf,YAAI,CAACI,KAAM,OAAMC,UAAUC,aAAY;AAEvC,cAAMyF,OAAO,MAAM,KAAKnG,cAAcoG,YAAY5F,KAAK6F,cAAc;AACrE,cAAMrC,OAA8BmC,KAAKnB,IAAIsB,CAAAA,QAAAA;AACzC,gBAAM9D,OAA4B;YAC9B+D,MAAMD,IAAIE;YACVpB,MAAMkB,IAAIlB;YACVC,iBAAiBiB,IAAIlF,UAAUqF,QAAQ;YACvCC,mBAAmB,CAAC,CAACJ,IAAIK;YACzBC,YAAY,CAAC,CAAEN,IAAIzE,QAAQC;UAC/B;AACA,gBAAM+E,eAAeP,IAAIhC,SAAS,CAAA,GAAIa,gBAAgBmB,IAAIhC,SAAS,CAAA,GAAIc;AACvE,cAAIyB,aAAcrE,MAAKsE,gBAAgBD;AACvC,iBAAOrE;QACX,CAAA;AACAnC,YAAIyD,KAAK;UAACC,SAAS;UAAMC;UAAME,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACtE,GAlBmB;MAoBnB2C,iBAAiB,8BAAO3G,KAAqBC,QAAAA;AACzC,cAAM,EAACG,KAAI,IAAIJ;AACf,YAAI,CAACI,KAAM,OAAMC,UAAUC,aAAY;AAEvC,cAAM4F,MAAM,MAAM,KAAKtG,cAAcgH,UAAUxG,KAAK6F,gBAAgBjG,IAAIyD,OAAO0C,IAAI;AACnF,YAAI,CAACD,IAAK,OAAM7F,UAAUwG,SAAS,aAAA;AAEnC,cAAMjD,OAA4B;UAC9BuC,MAAMD,IAAIE;UACVpB,MAAMkB,IAAIlB;UACVC,iBAAiBiB,IAAIlF,UAAUqF,QAAQ;UACvCC,mBAAmB,CAAC,CAACJ,IAAIK;UACzBC,YAAY,CAAC,CAAEN,IAAIzE,QAAQC;QAC/B;AACA,cAAM+E,eAAeP,IAAIhC,SAAS,CAAA,GAAIa,gBAAgBmB,IAAIhC,SAAS,CAAA,GAAIc;AACvE,YAAIyB,aAAc7C,MAAK8C,gBAAgBD;AACvCxG,YAAIyD,KAAK;UAACC,SAAS;UAAMC;UAAME,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;QAAE,CAAA;MACtE,GAjBiB;IAkBrB;;;;;;;;;;;;;;;;;;;;AC5PA,OAAO8C,eAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,uBAAAA;AACZ,QAAMC,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,cAAAA;AA6FrCJ,SAAOK,KAAK,KAAKC,aAAaJ,WAAWK,IAAI,CAAA;AAuC7CP,SAAOK,KAAK,eAAeC,aAAaJ,WAAWM,MAAM,CAAA;AAEzD,SAAOR;AACX;AAEO,SAASS,2BAAAA;AACZ,QAAMT,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,cAAAA;AAgFrCJ,SAAOK,KAAK,KAAKC,aAAaJ,WAAWQ,QAAQ,CAAA;AAEjD,SAAOV;AACX;AAEO,SAASW,wBAAAA;AACZ,QAAMX,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,cAAAA;AAqErCJ,SAAOK,KAAK,KAAKC,aAAaJ,WAAWU,KAAK,CAAA;AAE9C,SAAOZ;AACX;AAEO,SAASa,0BAAAA;AACZ,QAAMb,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,cAAAA;AAqErCJ,SAAOK,KAAK,iBAAiBC,aAAaJ,WAAWY,WAAW,CAAA;AAEhE,SAAOd;AACX;AAEO,SAASe,wBAAAA;AACZ,QAAMf,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,cAAAA;AAwErCJ,SAAOgB,IAAI,KAAKV,aAAaJ,WAAWe,UAAU,CAAA;AAElD,SAAOjB;AACX;AAEO,SAASkB,8BAAAA;AACZ,QAAMlB,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,cAAAA;AAgDrCJ,SAAOgB,IAAI,KAAKV,aAAaJ,WAAWiB,gBAAgB,CAAA;AA2DxDnB,SAAOgB,IAAI,UAAUV,aAAaJ,WAAWkB,cAAc,CAAA;AAE3D,SAAOpB;AACX;AA9jBA;;;AAEA;AACA;AAEgBD;AA2IAU;AAuFAE;AA4EAE;AA4EAE;AA+EAG;;;;;AC9chB,OAAO;AACP,SAAQG,cAAAA,oBAAiB;;;;;;;;;;IAYZC;;;;AAXb,IAAAC;AACA;AAEA;AACA;AACA;AACA;AACA;;;AAIO,IAAMD,mBAAN,cAA+BE,eAAAA;aAAAA;;;;;;;;MAClC,YACYC,WACAC,UACAC,eACAC,gBACAC,UACV;AACE,cAAK,GAAA,KANGJ,YAAAA,WAAAA,KACAC,WAAAA,UAAAA,KACAC,gBAAAA,eAAAA,KACAC,iBAAAA,gBAAAA,KACAC,WAAAA;MAGZ;MAEAC,OAAO,8BAAOC,MAAsBC,QAAAA;AAChC,cAAMC,WAAW,MAAM,KAAKP,SAASQ,QAAO;AAC5C,cAAMC,UAAU,MAAM,KAAKR,cAAcS,WAAU;AACnDJ,YAAIK,KAAK;UACLJ,UAAUA,SAASK,IAAIC,CAAAA,MAAK,KAAKC,iBAAiBD,CAAAA,CAAAA;UAClDJ,SAASA,QAAQG,IAAIC,CAAAA,MAAK,KAAKC,iBAAiBD,CAAAA,CAAAA;QACpD,CAAA;MACJ,GAPO;MASPE,SAAS,8BAAOC,KAAqBV,QAAAA;AACjC,cAAMW,SAASD,IAAIE,OAAOD,OAAOE,YAAW;AAC5C,cAAMV,UAAU,MAAM,KAAKR,cAAcS,WAAWG,CAAAA,MAAKA,EAAEI,WAAWA,MAAAA;AACtE,cAAMG,UAAU,MAAM,KAAKpB,SAASQ,QAAO;AAC3C,cAAMa,MAAMD,QAAQE,KAAKT,CAAAA,MAAKA,EAAEI,WAAWA,MAAAA;AAC3CX,YAAIK,KAAK;UACLY,QAAQd,QAAQ,CAAA,IAAK,KAAKK,iBAAiBL,QAAQ,CAAA,CAAE,IAAI;UACzDe,SAASH,MAAM,KAAKP,iBAAiBO,GAAAA,IAAO;QAChD,CAAA;MACJ,GATS;MAWTI,SAAS,8BAAOT,KAAqBV,QAAAA;AACjC,YAAI,CAACU,IAAIU,QAAQ,CAACC,OAAOC,SAASZ,IAAIU,IAAI,KAAKV,IAAIU,KAAKG,WAAW,GAAG;AAClE,gBAAMC,UAAUC,WAAW,8CAAA;QAC/B;AACA,cAAMC,OAAO,MAAM,KAAKjC,UAAUkC,mBAAmBjB,IAAIU,MAAMV,IAAIkB,MAAMC,MAAAA;AACzE7B,YAAIK,KAAK;UAACI,QAAQ;UAAa,GAAGiB;QAAI,CAAA;MAC1C,GANS;MAQTI,UAAU,8BAAOpB,KAAqBV,QAAAA;AAClC,cAAM,EAAC+B,aAAaC,QAAO,IAAItB,IAAIU;AACnC,YAAI,CAACW,YAAa,OAAMP,UAAUC,WAAW,yBAAA;AAC7C,cAAMC,OAAO,MAAM,KAAKjC,UAAUqC,QAAQC,aAAaC,SAAStB,IAAIkB,MAAMC,MAAAA;AAC1E7B,YAAIK,KAAK;UAACI,QAAQ;UAAa,GAAGiB;QAAI,CAAA;MAC1C,GALU;MAOVO,SAAS,8BAAOvB,KAAqBV,QAAAA;AACjC,cAAMe,MAAM,MAAM,KAAKmB,aAAaxB,IAAIE,OAAOD,MAAM;AACrD,cAAM,KAAKlB,UAAUwC,OAAOlB,IAAIoB,MAAMzB,IAAIkB,MAAMC,UAAU,OAAA;AAC1D7B,YAAIK,KAAK;UAACI,QAAQ;UAAWE,QAAQD,IAAIE,OAAOD;QAAM,CAAA;MAC1D,GAJS;MAMTyB,UAAU,8BAAO1B,KAAqBV,QAAAA;AAClC,cAAMe,MAAM,MAAM,KAAKmB,aAAaxB,IAAIE,OAAOD,MAAM;AACrD,cAAM,KAAKlB,UAAU2C,QAAQrB,IAAIoB,IAAI;AACrCnC,YAAIK,KAAK;UAACI,QAAQ;UAAYE,QAAQD,IAAIE,OAAOD;QAAM,CAAA;MAC3D,GAJU;MAMV0B,SAAS,8BAAO3B,KAAqBV,QAAAA;AACjC,cAAMe,MAAM,MAAM,KAAKmB,aAAaxB,IAAIE,OAAOD,MAAM;AACrD,cAAM,KAAKlB,UAAU4C,OAAOtB,IAAIoB,MAAMzB,IAAIkB,MAAMC,UAAU,OAAA;AAC1D7B,YAAIK,KAAK;UAACI,QAAQ;UAAYE,QAAQD,IAAIE,OAAOD;QAAM,CAAA;MAC3D,GAJS;MAMT2B,YAAY,8BAAO5B,KAAqBV,QAAAA;AACpC,cAAM,EAAC+B,YAAW,IAAIrB,IAAIU;AAC1B,YAAI,CAACW,YAAa,OAAMP,UAAUC,WAAW,yBAAA;AAC7C,cAAM,KAAKhC,UAAU6C,UAAUP,aAAa;UAACQ,OAAO7B,IAAIU,KAAKmB,UAAU;QAAI,CAAA;AAC3EvC,YAAIK,KAAK;UAACI,QAAQ;UAAesB;QAAW,CAAA;MAChD,GALY;MAOZS,gBAAgB,8BAAO9B,KAAqBV,QAAAA;AACxC,cAAMG,UAAU,MAAM,KAAKN,SAAS4C,mBAAmB/B,IAAIE,OAAO8B,UAAU;AAC5E1C,YAAIK,KAAK;UAACsC,QAAQjC,IAAIE,OAAO8B;UAAYvC;QAAO,CAAA;MACpD,GAHgB;MAKRK,iBAAiBS,QAAgB;AACrC,YAAIA,OAAO2B,OAAQ,QAAO3B;AAC1B,cAAM4B,OAAO,KAAKjD,eAAekD,IAAI7B,OAAO8B,EAAE;AAC9C,eAAO;UAAC,GAAG9B;UAAQ2B,QAAQC,MAAMG,YAAAA,KAAiB;QAAI;MAC1D;MAEA,MAAcd,aAAavB,QAAiC;AACxD,cAAMV,WAAW,MAAM,KAAKP,SAASQ,QAAO;AAC5C,cAAMa,MAAMd,SAASe,KAAKT,CAAAA,MAAKA,EAAEI,WAAWA,OAAOE,YAAW,CAAA;AAC9D,YAAI,CAACE,IAAK,OAAMS,UAAUyB,SAAS,kCAAkCtC,MAAAA,EAAQ;AAC7E,eAAOI;MACX;IACJ;;;;;;;;;;;;;;;;ACrGA,OAAOmC,eAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,qBAAAA;AACZ,QAAMC,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,gBAAAA;AA6BrCJ,SAAOK,IAAI,KAAKC,aAAaJ,WAAWK,IAAI,CAAA;AAmC5CP,SAAOK,IAAI,mBAAmBC,aAAaJ,WAAWM,MAAM,CAAA;AA8C5DR,SAAOS,KAAK,WACRZ,UAAQa,IAAI;IAACC,MAAM;MAAC;MAAoB;MAAsB;;IAA6BC,OAAO;EAAM,CAAA,GACxGN,aAAaJ,WAAWW,MAAM,CAAA;AAoDlCb,SAAOS,KAAK,YAAYH,aAAaJ,WAAWY,OAAO,CAAA;AAsCvDd,SAAOS,KAAK,mBAAmBH,aAAaJ,WAAWa,MAAM,CAAA;AAsC7Df,SAAOS,KAAK,oBAAoBH,aAAaJ,WAAWc,OAAO,CAAA;AAsC/DhB,SAAOS,KAAK,mBAAmBH,aAAaJ,WAAWe,MAAM,CAAA;AA8C7DjB,SAAOS,KAAK,cAAcH,aAAaJ,WAAWgB,SAAS,CAAA;AAiC3DlB,SAAOK,IAAI,uBAAuBC,aAAaJ,WAAWiB,aAAa,CAAA;AAEvE,SAAOnB;AACX;AA/WA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAO;AACP,SAAQqB,cAAAA,oBAAiB;;;;;;;;;;IAWZC;;;;AAVb,IAAAC;AACA;AAEA;AACA;AACA;AACA,IAAAC;;;AAIO,IAAMF,sBAAN,cAAkCG,eAAAA;aAAAA;;;;;;;MACrC,YACYC,kBACAC,aACAC,cACAC,UACV;AACE,cAAK,GAAA,KALGH,mBAAAA,kBAAAA,KACAC,cAAAA,aAAAA,KACAC,eAAAA,cAAAA,KACAC,WAAAA;MAGZ;MAEAC,OAAO,8BAAOC,KAAqBC,QAAAA;AAC/B,cAAMC,QAAQ,KAAKC,WAAWH,GAAAA;AAC9B,cAAMI,aAAa,MAAM,KAAKR,YAAYS,SAASH,KAAAA;AACnDD,YAAIK,KAAKF,WAAWG,IAAIC,CAAAA,OAAM,KAAKb,iBAAiBc,oBAAoBD,IAAIA,GAAGE,SAAS,CAAA,CAAA;MAC5F,GAJO;MAMPC,UAAU,8BAAOX,KAAqBC,QAAAA;AAClC,cAAMC,QAAQ,KAAKC,WAAWH,GAAAA;AAC9B,cAAM,EAACY,GAAE,IAAIZ,IAAIa;AAEjB,cAAML,KAAK,MAAM,KAAKZ,YAAYkB,cAAcF,IAAIV,KAAAA;AACpD,YAAI,CAACM,GAAI,OAAMO,UAAUC,SAAS,WAAA;AAClCf,YAAIK,KAAK,KAAKX,iBAAiBc,oBAAoBD,IAAIA,GAAGE,SAAS,CAAA;MACvE,GAPU;MASVO,SAAS,8BAAOjB,KAAqBC,QAAAA;AACjC,cAAMC,QAAQ,KAAKC,WAAWH,GAAAA;AAC9B,cAAM,EAACkB,MAAMR,WAAWS,mBAAmBC,SAASC,SAASC,kBAAiB,IAAItB,IAAIuB;AAEtF,YAAI,CAACL,QAAQ,CAACR,UAAW,OAAMK,UAAUS,WAAW,iCAAA;AAEpD,YAAIL,mBAAmB;AACnB,gBAAMM,eAAe,KAAK9B,iBAAiB+B,eAAehB,WAAWS,mBAAmBG,iBAAAA;AACxF,cAAI,CAACG,aAAaE,MAAO,OAAMZ,UAAUS,WAAW,mBAAmBC,aAAaG,OAAOC,KAAK,IAAA,CAAA,EAAO;QAC3G;AAEA,YAAIT,SAAS;AACT,gBAAMU,gBAAgB,KAAKnC,iBAAiBoC,gBAAgBX,OAAAA;AAC5D,cAAI,CAACU,cAAcH,MAAO,OAAMZ,UAAUS,WAAW,oBAAoBM,cAAcF,OAAOC,KAAK,IAAA,CAAA,EAAO;QAC9G;AAEA,cAAMrB,KAAK,MAAM,KAAKZ,YAAYoC,OAAO9B,OAAO;UAC5CgB;UACAR;UACAuB,iBAAiB/B;UACjBoB;UACAH,mBAAmBA,qBAAqB,CAAC;UACzCC,SAASA,WAAW,CAAC;UACrBC,SAASA,WAAW;QACxB,CAAA;AAEA,YAAIb,IAAI;AACJ,gBAAM,KAAK0B,0BAA0B,WAAW1B,GAAGI,IAAIJ,GAAGE,SAAS;QACvE;AAEAT,YAAIK,KAAKE,EAAAA;MACb,GA/BS;MAiCT2B,SAAS,8BAAOnC,KAAqBC,QAAAA;AACjC,cAAMC,QAAQ,KAAKC,WAAWH,GAAAA;AAC9B,cAAM,EAACY,GAAE,IAAIZ,IAAIa;AAEjB,cAAMuB,WAAW,MAAM,KAAKxC,YAAYkB,cAAcF,IAAIV,KAAAA;AAC1D,YAAI,CAACkC,SAAU,OAAMrB,UAAUC,SAAS,WAAA;AAExC,cAAM,EAACE,MAAMC,mBAAmBC,SAASC,SAASC,kBAAiB,IAAItB,IAAIuB;AAC3E,cAAMc,wBAAwBf,qBAAqBc,SAASd;AAE5D,YAAIH,mBAAmB;AACnB,gBAAMM,eAAe,KAAK9B,iBAAiB+B,eAAeU,SAAS1B,WAAWS,mBAAmBkB,qBAAAA;AACjG,cAAI,CAACZ,aAAaE,MAAO,OAAMZ,UAAUS,WAAW,mBAAmBC,aAAaG,OAAOC,KAAK,IAAA,CAAA,EAAO;QAC3G;AAEA,YAAIT,SAAS;AACT,gBAAMU,gBAAgB,KAAKnC,iBAAiBoC,gBAAgBX,OAAAA;AAC5D,cAAI,CAACU,cAAcH,MAAO,OAAMZ,UAAUS,WAAW,oBAAoBM,cAAcF,OAAOC,KAAK,IAAA,CAAA,EAAO;QAC9G;AAEA,cAAMrB,KAAK,MAAM,KAAKZ,YAAYuC,OAAOjC,OAAOU,IAAI;UAChDM;UACAC;UACAC;UACAC;UACAC;QACJ,CAAA;AAEA,YAAId,IAAI;AACJ,gBAAM,KAAK0B,0BAA0B,WAAW1B,GAAGI,IAAIJ,GAAGE,SAAS;QACvE;AAEAT,YAAIK,KAAKE,EAAAA;MACb,GAjCS;MAmCT8B,SAAS,8BAAOtC,KAAqBC,QAAAA;AACjC,cAAMC,QAAQ,KAAKC,WAAWH,GAAAA;AAC9B,cAAM,EAACY,GAAE,IAAIZ,IAAIa;AAEjB,cAAMuB,WAAW,MAAM,KAAKxC,YAAYkB,cAAcF,IAAIV,KAAAA;AAC1D,YAAI,CAACkC,SAAU,OAAMrB,UAAUC,SAAS,WAAA;AAExC,cAAM,KAAKpB,YAAY2C,WAAWrC,OAAOU,EAAAA;AACzC,cAAM,KAAKsB,0BAA0B,WAAWtB,IAAIwB,SAAS1B,SAAS;AACtET,YAAIK,KAAK;UAACkC,QAAQ;QAAS,CAAA;MAC/B,GAVS;MAYTC,iBAAiB,8BAAOzC,KAAqBC,QAAAA;AACzC,cAAMC,QAAQ,KAAKC,WAAWH,GAAAA;AAC9B,cAAM,EAACY,GAAE,IAAIZ,IAAIa;AAEjB,cAAMuB,WAAW,MAAM,KAAKxC,YAAYkB,cAAcF,IAAIV,KAAAA;AAC1D,YAAI,CAACkC,SAAU,OAAMrB,UAAUC,SAAS,WAAA;AAExC,cAAM0B,SAAS,MAAM,KAAK/C,iBAAiB8C,eAAe7B,EAAAA;AAC1DX,YAAIK,KAAKoC,MAAAA;MACb,GATiB;MAWjBC,2BAA2B,8BAAO3C,KAAqBC,QAAAA;AACnD,cAAM,EAACS,WAAWS,kBAAiB,IAAInB,IAAIuB;AAC3C,YAAI,CAACb,aAAa,CAACS,mBAAmB;AAClC,gBAAMJ,UAAUS,WAAW,8CAAA;QAC/B;AACA,cAAMkB,SAAS,MAAM,KAAK/C,iBAAiBgD,yBAAyBjC,WAAWS,iBAAAA;AAC/ElB,YAAIK,KAAKoC,MAAAA;MACb,GAP2B;MAS3B,MAAcR,0BACVU,UACAC,aACAC,UACa;AACb,YAAIC,SAAS;AACb,YAAID,UAAU;AACV,gBAAME,SAAS,MAAM,KAAKlD,SAASa,QAAQmC,QAAAA;AAC3C,cAAIE,OAAQD,UAASC,OAAOD;QAChC;AAEA,cAAME,QAA4B;UAC9BC,QAAQ;UACRN;UACAO,UAAUN;UACVC,UAAUA,YAAY;UACtBC;UACAK,UAAUC,IAAIC,IAAIC;UAClBC,IAAIC,KAAKC,IAAG;QAChB;AAEA,YAAI;AACA,gBAAM,KAAK7D,aAAa8D,eAAeN,IAAIO,MAAMC,eAAe,qBAAqBZ,KAAAA;QACzF,SAASa,GAAG;AACR,eAAKC,IAAIC,KAAK,0CAA2CF,EAAYG,OAAO,EAAE;QAClF;MACJ;MAEQ9D,WAAWH,KAA6B;AAC5C,cAAME,QAAQF,IAAIkE,MAAMC;AACxB,YAAI,CAACjE,MAAO,OAAMa,UAAUqD,aAAa,uBAAA;AACzC,eAAOlE;MACX;IACJ;;;;;;;;;;;;;;;AC1KA,OAAOmE,eAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAIjB,SAASC,wBAAAA;AACZ,QAAMC,SAASH,UAAQI,OAAM;AAC7B,QAAMC,aAAaJ,YAAUK,QAAQC,mBAAAA;AAqDrCJ,SAAOK,IAAI,KAAKC,aAAaJ,WAAWK,IAAI,CAAA;AAyD5CP,SAAOK,IAAI,QAAQC,aAAaJ,WAAWM,OAAO,CAAA;AAkElDR,SAAOS,KAAK,KAAKH,aAAaJ,WAAWQ,MAAM,CAAA;AAqE/CV,SAAOW,IAAI,QAAQL,aAAaJ,WAAWU,MAAM,CAAA;AAqCjDZ,SAAOa,OAAO,QAAQP,aAAaJ,WAAWY,MAAM,CAAA;AAsCpDd,SAAOS,KAAK,aAAaH,aAAaJ,WAAWa,cAAc,CAAA;AA2C/Df,SAAOS,KAAK,SAASH,aAAaJ,WAAWc,wBAAwB,CAAA;AAErE,SAAOhB;AACX;AArXA;;;AAEA;AACA;AAEgBD;;;;;ACLhB,OAAOkB,eAAa;AACpB,SAAQC,aAAAA,mBAAgB;AAyBxB,eAAsBC,4BAAAA;AAClB,QAAMC,SAASH,UAAQI,OAAM;AAE7B,QAAMC,qBAAqBJ,YAAUK,QAAQC,kBAAAA;AAC7C,QAAMF,mBAAmBG,eAAeL,MAAAA;AAExCA,SAAOM,IAAI,YAAYC,8BAAAA,CAAAA;AACvB,SAAOP;AACX;AAEO,SAASQ,mBAAAA;AACZ,QAAMR,SAASH,UAAQI,OAAM;AAE7B,QAAMQ,cAAcX,YAAUK,QAAQO,WAAAA;AACtC,QAAMC,OAAOC,mBAAmBH,WAAAA;AAGhCT,SAAOM,IAAI,SAASK,MAAME,qBAAAA,CAAAA;AAC1Bb,SAAOM,IAAI,aAAaK,MAAMG,yBAAAA,CAAAA;AAC9Bd,SAAOM,IAAI,UAAUK,MAAMI,sBAAAA,CAAAA;AAC3Bf,SAAOM,IAAI,YAAYK,MAAMK,wBAAAA,CAAAA;AAC7BhB,SAAOM,IAAI,WAAWK,MAAMM,sBAAAA,CAAAA;AAC5BjB,SAAOM,IAAI,iBAAiBK,MAAMO,4BAAAA,CAAAA;AAClC,SAAOlB;AACX;AAEO,SAASmB,oBAAAA;AACZ,QAAMnB,SAASH,UAAQI,OAAM;AAE7B,QAAMQ,cAAcX,YAAUK,QAAQO,WAAAA;AACtC,QAAMC,OAAOC,mBAAmBH,WAAAA;AAEhCT,SAAOM,IAAI,kBAAkBK,MAAMS,yBAAAA,CAAAA;AACnCpB,SAAOM,IAAI,WAAWK,MAAMU,kBAAAA,CAAAA;AAC5BrB,SAAOM,IAAI,YAAYK,MAAMW,oBAAAA,CAAAA;AAC7BtB,SAAOM,IAAI,UAAUK,MAAMY,kBAAAA,CAAAA;AAC3BvB,SAAOM,IAAI,cAAcK,MAAMa,qBAAAA,CAAAA;AAC/BxB,SAAOM,IAAI,iBAAiBK,MAAMc,wBAAAA,CAAAA;AAClCzB,SAAOM,IAAI,WAAWK,MAAMe,kBAAAA,CAAAA;AAC5B1B,SAAOM,IAAI,cAAcK,MAAMgB,qBAAAA,CAAAA;AAC/B3B,SAAOM,IAAI,aAAaK,MAAMiB,oBAAAA,CAAAA;AAC9B5B,SAAOM,IAAI,YAAYK,MAAMkB,mBAAAA,CAAAA;AAC7B7B,SAAOM,IAAI,eAAeK,MAAMmB,sBAAAA,CAAAA;AAChC,SAAO9B;AACX;AAtEA,IAAA+B,eAAA;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AAEsBhC;AAUNS;AAgBAW;;;;;ACpDhB,IACaa;AADb,IAAAC,gBAAA;;;AACO,IAAMD,UAAU;;;;;ACDvB,OAAOE,kBAAkB;AAAzB,IAGMC,SAuIOC;AA1Ib;;;AACA,IAAAC;AAEA,IAAMF,UAAgC;MAClCG,YAAY;QACRC,SAAS;QACTC,MAAM;UACFC,OAAO;UACPC,SAASC;UACTC,aAAa;QACjB;QACAC,SAAS;UACL;YAACC,KAAK;YAAgBF,aAAa;UAAwB;UAC3D;YAACE,KAAK;YAAQF,aAAa;UAAgB;;QAE/CG,MAAM;UACF;YAACC,MAAM;YAAQJ,aAAa;UAA4B;UACxD;YAACI,MAAM;YAAUJ,aAAa;UAAqB;UACnD;YAACI,MAAM;YAAgBJ,aAAa;UAA2B;UAC/D;YAACI,MAAM;YAAwBJ,aAAa;UAA6B;UACzE;YAACI,MAAM;YAAaJ,aAAa;UAA0B;UAC3D;YAACI,MAAM;YAAkBJ,aAAa;UAAuB;UAC7D;YAACI,MAAM;YAAUJ,aAAa;UAAsB;UACpD;YAACI,MAAM;YAAYJ,aAAa;UAAoB;UACpD;YAACI,MAAM;YAAaJ,aAAa;UAAqB;UACtD;YAACI,MAAM;YAAWJ,aAAa;UAAoB;UACnD;YAACI,MAAM;YAASJ,aAAa;UAAoB;UACjD;YAACI,MAAM;YAAiBJ,aAAa;UAA8B;UACnE;YAACI,MAAM;YAAWJ,aAAa;UAA6B;UAC5D;YAACI,MAAM;YAAcJ,aAAa;UAA2B;UAC7D;YAACI,MAAM;YAAYJ,aAAa;UAA2B;UAC3D;YAACI,MAAM;YAASJ,aAAa;UAAqB;UAClD;YAACI,MAAM;YAAWJ,aAAa;UAA4B;UAC3D;YAACI,MAAM;YAASJ,aAAa;UAA0B;UACvD;YAACI,MAAM;YAAUJ,aAAa;UAAqB;;QAEvDK,YAAY;UACRC,iBAAiB;YACbC,YAAY;cACRC,MAAM;cACNC,QAAQ;cACRC,cAAc;cACdV,aAAa;YACjB;YACAW,WAAW;cACPH,MAAM;cACNI,IAAI;cACJR,MAAM;cACNJ,aAAa;YACjB;UACJ;UACAa,YAAY;YACRC,MAAM;cACFV,MAAM;cACNQ,IAAI;cACJG,QAAQ;gBAACP,MAAM;gBAAWQ,SAAS;gBAAGC,SAAS;cAAC;cAChDjB,aAAa;YACjB;YACAkB,OAAO;cACHd,MAAM;cACNQ,IAAI;cACJG,QAAQ;gBAACP,MAAM;gBAAWQ,SAAS;gBAAIG,SAAS;cAAG;cACnDnB,aAAa;YACjB;YACAoB,SAAS;cACLhB,MAAM;cACNQ,IAAI;cACJG,QAAQ;gBAACP,MAAM;gBAAUa,MAAM;kBAAC;kBAAO;;gBAASL,SAAS;cAAM;cAC/DhB,aAAa;YACjB;YACAsB,OAAO;cACHlB,MAAM;cACNQ,IAAI;cACJG,QAAQ;gBAACP,MAAM;gBAAUe,QAAQ;cAAM;cACvCvB,aAAa;YACjB;YACAwB,iBAAiB;cACbpB,MAAM;cACNQ,IAAI;cACJG,QAAQ;gBAACP,MAAM;cAAQ;cACvBR,aAAa;YACjB;YACAyB,YAAY;cACRrB,MAAM;cACNQ,IAAI;cACJG,QAAQ;gBAACP,MAAM;cAAQ;cACvBR,aAAa;YACjB;UACJ;UACA0B,SAAS;YACLC,eAAe;cACXnB,MAAM;cACNoB,YAAY;gBACRC,SAAS;kBAACrB,MAAM;kBAAWsB,SAAS;gBAAK;gBACzCC,OAAO;kBACHvB,MAAM;kBACNoB,YAAY;oBACRI,SAAS;sBAACxB,MAAM;oBAAQ;oBACxByB,MAAM;sBACFzB,MAAM;sBACNa,MAAM;wBAAC;wBAAgB;wBAAa;wBAAoB;wBAAa;wBAAiB;wBAAkB;;oBAC5G;kBACJ;gBACJ;gBACAa,WAAW;kBAAC1B,MAAM;kBAAUe,QAAQ;gBAAW;cACnD;YACJ;YACAY,YAAY;cACR3B,MAAM;cACNoB,YAAY;gBACRQ,MAAM;kBAAC5B,MAAM;gBAAS;gBACtB6B,OAAO;kBAAC7B,MAAM;gBAAS;gBACvB8B,OAAO;kBAAC9B,MAAM;gBAAS;gBACvB+B,aAAa;kBAAC/B,MAAM;gBAAS;cACjC;YACJ;YACAgC,gBAAgB;cACZhC,MAAM;cACNoB,YAAY;gBACRa,QAAQ;kBAACjC,MAAM;kBAAUsB,SAAS;gBAAI;gBACtCI,WAAW;kBAAC1B,MAAM;kBAAUe,QAAQ;gBAAW;gBAC/CmB,QAAQ;kBAAClC,MAAM;gBAAQ;gBACvBV,SAAS;kBAACU,MAAM;gBAAQ;cAC5B;YACJ;UACJ;QACJ;QACAmC,UAAU;UACN;YAACpC,YAAY,CAAA;UAAE;UACf;YAACI,WAAW,CAAA;UAAE;;MAEtB;MACAiC,MAAM;QACF;QACA;;IAER;AAEO,IAAMpD,cAAcF,aAAaC,OAAAA;;;;;AC1IxC,OAAO;AACP,OAAOsD,eAAgE;AACvE,OAAOC,gBAAgB;AACvB,OAAOC,YAAY;AACnB,OAAOC,YAAY;AACnB,OAAOC,mBAAmB;AAC1B,SAAQC,cAAAA,oBAAiB;AASzB,OAAOC,eAAe;;;;;;;;;;IAITC;;;;AAZb;AACA,IAAAC;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA,IAAAC;AAEA;;;AAGO,IAAMH,YAAN,cAAwBI,UAAUC,OAAOC,UAAAA,CAAAA,EAAAA;aAAAA;;;;MAC3BC;MACTC;MAER,YACYC,aACV;AACE,cAAMC,IAAIC,IAAIC,aAAaC,WAAWC,GAAG,GAAA,KAFjCL,cAAAA;AAGR,aAAKF,aAAad,UAAAA;AAClB,aAAKsB,gBAAe;MACxB;MAEA,MAAMC,SAAwB;AAC1B,cAAM,MAAMA,OAAAA;AACZ,cAAM,KAAKP,YAAYQ,KAAK,KAAKC,EAAE;AAEnC,aAAKX,WAAWY,IAAI,uBAAuB,CAACC,MAAeC,QAAAA;AACvDA,cAAIC,KAAKC,WAAAA;QACb,CAAA;AACA,aAAKhB,WAAWiB,IAAI,aAAazB,UAAU0B,OAAO1B,UAAU2B,MAAMH,WAAAA,CAAAA;AAElE,aAAKhB,WAAWiB,IAAI,QAAQ,MAAMG,0BAAAA,CAAAA;AAClC,aAAKpB,WAAWiB,IAAI,gBAAgBI,iBAAAA,CAAAA;AACpC,aAAKrB,WAAWiB,IAAI,gBAAgBK,kBAAAA,CAAAA;AACpC,aAAKtB,WAAWiB,IAAIM,eAAAA;AACpB,cAAM,KAAKC,eAAc;MAC7B;MAEA,MAAMC,aAA4B;AAC9B,YAAI,KAAKxB,YAAY;AACjB,gBAAM,IAAIyB,QAAc,CAACC,aAAY,KAAK1B,WAAY2B,MAAM,MAAMD,SAAAA,CAAAA,CAAAA;QACtE;AACA,cAAM,MAAMF,WAAAA;MAChB;MAEQjB,kBAAkB;AACtB,aAAKR,WAAWiB,IAAI7B,OAAOyC,cAAa,CAAA;AACxC,aAAK7B,WAAWiB,IAAI7B,OAAO0C,QAAO,CAAA;AAClC,aAAK9B,WAAWiB,IAAI7B,OAAO2C,WAAW;UAACC,QAAQ;QAAM,CAAA,CAAA;AACrD,aAAKhC,WAAWiB,IAAI7B,OAAO6C,KAAK;UAACC,QAAQ;UAAUC,mBAAmB;QAAI,CAAA,CAAA;AAC1E,aAAKnC,WAAWiB,IAAI7B,OAAOgD,sBAAsB;UAC7CC,YAAY;YACRC,YAAY;cAAC;;YACbC,WAAW;cAAC;;YACZC,UAAU;cAAC;cAAU;;YACrBC,QAAQ;cAAC;cAAU;;YACnBC,gBAAgB;cAAC;;YACjBC,YAAY;cAAC;;UACjB;QACJ,CAAA,CAAA;AACA,aAAK3C,WAAWiB,IAAI5B,OAAO,OAAO;UAC9BuD,MAAM,wBAACC,QAAQA,IAAIC,SAAS,WAAtB;QACV,CAAA,CAAA;AACA,aAAK9C,WAAWiB,IAAI9B,WAAW4B,KAAK;UAACgC,OAAO;QAAM,CAAA,CAAA;AAClD,aAAK/C,WAAWiB,IAAI+B,cAAAA;AAmBpB,aAAKhD,WAAWY,IAAI,WAAW,CAACC,MAAeC,QAAAA;AAC3CA,cAAImC,OAAO,GAAA,EAAKlC,KAAK;YACjBkC,QAAQ;YACRC,YAAW,oBAAIC,KAAAA,GAAOC,YAAW;YACjCC,QAAQC,QAAQD,OAAM;YACtBE,SAASD,QAAQnD,IAAIqD,uBAAuB;UAChD,CAAA;QACJ,CAAA;MACJ;MAEQhC,iBAAgC;AACpC,cAAMiC,OAAOtD,IAAIC,IAAIqD,QAAQ;AAC7B,eAAO,IAAI/B,QAAQ,CAACC,UAAS+B,WAAAA;AACzB,eAAKzD,aAAa,KAAKD,WAAW2D,OAAOF,MAAM,MAAA;AAC3CG,2BAAOC,KAAK,8BAA8BJ,IAAAA,EAAM;AAChDG,2BAAOC,KAAK,gBAAgBP,QAAQnD,IAAI2D,YAAY,aAAA,EAAe;AACnE,kBAAMC,YAAYzE,cAAc,KAAKU,UAAU;AAC/CgE,oBAAQC,MAAMF,SAAAA;AACdpC,YAAAA,SAAAA;UACJ,CAAA;AAEA,eAAK1B,WAAWiE,GAAG,SAAS,CAACC,UAAAA;AACzB,gBAAIA,MAAMC,YAAY,UAAU;AAC5B,kBAAID,MAAME,SAAS,UAAU;AACzBT,+BAAOO,MAAM,QAAQV,IAAAA,+BAAmC;cAC5D,WAAWU,MAAME,SAAS,cAAc;AACpCT,+BAAOO,MAAM,QAAQV,IAAAA,oBAAwB;cACjD;YACJ;AACAC,mBAAOS,KAAAA;UACX,CAAA;QACJ,CAAA;MACJ;IACJ;;;;;;;;;;;;AC7HA;AAEA,SAAQG,aAAAA,mBAAgB;AAFxB,IAKMC;AALN;;;;AACA;AAEA;AAEA,IAAMA,SAASD,YAAUE,QAAQC,SAAAA;AACjC,UAAMF,OAAOG,MAAK;;;;;ACNlB,SAAQC,aAAAA,mBAAgB;AAAxB;;;AACA;AAEAA,IAAAA,YACKC,kBAAkBC,eAAAA;;;;;ACJvB,OAAO;AACP,SAAQC,UAAAA,SAAQC,cAAAA,oBAAiB;;;;;;;;;;;;;;;IA4BpBC;;;;AA3Bb,IAAAC;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AACA,IAAAC;AASA;AAGA,IAAAC;;;;AAUO,IAAML,eAAN,cAA2BM,UAAWC,OAAOC,UAAUC,UAAAA,CAAAA,CAAAA,EAAAA;aAAAA;;;;;;;MAEhDC,cAAc,GAAG,KAAK,YAAYC,IAAI,IAAIC,IAAIC,OAAOC,QAAQ;MAEvE,YACYC,uBACAC,gBACAC,iBAC2CC,qBACrD;AACE,cAAMN,IAAIC,OAAOC,UAAUK,WAAWC,MAAM,GAAA,KALpCL,wBAAAA,uBAAAA,KACAC,iBAAAA,gBAAAA,KACAC,kBAAAA,iBAAAA,KAC2CC,sBAAAA;MAGvD;MAEA,MAAMG,SAAwB;AAC1B,cAAM,MAAMA,OAAAA;AACZ,aAAKC,uBAAuBC,cAAcX,IAAIC,OAAOW,UAAU;AAC/D,cAAM,KAAKR,eAAeS,cAAa;AACvC,cAAM,KAAKV,sBAAsBW,QAAO;AACxC,aAAKC,cAAcC,IAAI,kBAAkB,KAAKC,aAAaC,aAAa;AACxE,YAAIC,eAAenB,IAAIoB,MAAMD;AAE7B,cAAME,UAAS,KAAKC,KAAK,eAAA;AACzB,cAAM,KAAKC,aAAaC,QAAQL,cAAc,OAAOM,WAAWC,kBAAAA;AAC5D,eAAKC,MAAMC;AACXP,UAAAA,QAAOQ,KAAK,UAAU,KAAKC,EAAE,sBAAsBL,SAAAA,cAAuBC,cAAcK,SAAShC,IAAI,gBAAgB2B,cAAcM,QAAQ,cAAcb,YAAAA,KAAiB;AAC1K,gBAAMc,KAAgB,MAAM,KAAK9B,sBAAsB+B,oBAAoBR,cAAcK,SAASD,EAAE;AACpG,gBAAMK,SAASF,GAAGE;AAClBd,UAAAA,QAAOQ,KAAK,yBAAyBI,GAAGlC,IAAI,EAAE;AAE9C,gBAAM,EAACiC,UAAUI,YAAW,IAAIV;AAChC,gBAAMW,WAAW,MAAMJ,GAAGK,QAAQC,6BAA6Bb,eAAe,KAAKI,EAAE;AAErF,cAAI;AACA,gBAAIM,eAAe,CAACA,YAAYI,QAAQ;AACpCnB,cAAAA,QAAOQ,KAAK,2CAAA;AAEZ,oBAAMY,OAAO,MAAMN,OAAOO,kBAAkB;gBACxCjB;gBACAkB,aAAa;gBACbC,UAAUX,GAAGE,OAAOU;cACxB,CAAA;AAEA,oBAAMC,eAAeV,YAAYW,QAAQC,KAAK,MAAA,KAAW;AAEzD,oBAAMC,MAAM;gBACRC,MAAM;gBACNzB;gBACA0B,KAAK;gBACLC,IAAIC,KAAKC,IAAG;gBACZC,QAAQ;gBACRC,SAAS;kBACLC,aAAa;kBACbC,cAAc;kBACdC,kBAAkB;kBAClBC,qBAAqB;kBACrBC,aAAa;gBACjB;gBACAC,MAAMhB;gBACNiB,OAAO9B,GAAG+B,gBAAgBC,YAAYnB,YAAAA;cAC1C;AAEA,yBAAWoB,aAAa,MAAMzB,KAAK0B,kBAAkBlB,GAAAA,GAAM;AACvD5B,gBAAAA,QAAO+C,MAAM,0BAA0BC,KAAKC,UAAUJ,SAAAA,CAAAA,EAAY;AAClE,sBAAM,KAAK7D,gBAAgBkE,kBAAkBvC,UAAUP,WAAWyC,SAAAA;cACtE;AACA,oBAAM,KAAK7D,gBAAgBmE,YAAY;gBAAC,GAAG9C;gBAAe+C,eAAexB;gBAAKyB,UAAU,KAAK5C;cAAE,CAAA;AAC/F,oBAAM,KAAKxB,oBAAoBqE,QAC3BC,yBAAyBT,kBAAkB9B,UAAUY,GAAAA,CAAAA;YAE7D,OAAO;AACH,oBAAM4B,aAAa,KAAKC,kBAAkBpD,eAAeS,MAAAA;AACzD,kBAAI0C,YAAY;AACZxD,gBAAAA,QAAOQ,KAAK,wBAAwBgD,WAAWE,MAAM,IAAIrD,cAAcsD,gBAAgB,uBAAa7C,OAAO4C,MAAM,IAAIrD,cAAckB,SAAS7C,IAAI,EAAE;AAClJ,sBAAM,KAAKkF,wBAAwBvD,eAAemD,UAAAA;cACtD;AAEA,oBAAMpC,OAAO,MAAM,KAAKC,kBAAkBjB,WAAWC,eAAemD,YAAY1C,MAAAA;AAEhF,oBAAM+C,YAAY,MAAMjD,GAAGkD,qBAAqBzD,aAAAA;AAChD,oBAAM0D,SAASP,aACTQ,wBAAwBH,WAAW/C,OAAOmD,YAAYT,WAAWS,UAAU,IAC3EJ;AAEN,oBAAMK,sBAAsBH,QAAQ3C,MAAMf,eAAeW,UAAU;gBAC/DmD,cAAc,KAAKnF,gBAAgBkE,kBAAkBkB,KAAK,IAAI;gBAC9DC,cAAc,8BAAOC,UAAAA;AAGjB,wBAAM,KAAKtF,gBAAgBmE,YAAYmB,KAAAA;AACvC,wBAAM,KAAKrF,oBAAoBqE,QAAQC,yBAAyBT,kBAAkB9B,UAAUsD,MAAMlB,aAAa,CAAA;gBACnH,GALc;cAMlB,CAAA;YACJ;UACJ,SAASV,OAAO;AACZ1C,YAAAA,QAAO0C,MAAM,2BAA2BtC,SAAAA,MAAgBsC,MAAgB6B,OAAO,EAAE;AACjF,gBAAI;AACA,oBAAM9C,eAAgBiB,MAAgB6B;AACtC,oBAAMC,aAAa;gBACf3C,MAAM;gBACNzB;gBACA0B,KAAK;gBACLC,IAAIC,KAAKC,IAAG;gBACZC,QAAQ;gBACRQ,OAAO9B,GAAG+B,gBAAgBC,YAAYnB,YAAAA;gBACtCgB,MAAMhB;gBACNU,SAAS;kBACLC,aAAa;kBACbC,cAAc;kBACdC,kBAAkB;kBAClBC,qBAAqB;kBACrBC,aAAa;gBACjB;cACJ;AAEA,oBAAMpB,OAAOf,cAAcoE,eACrB,IAAIC,gBAAgBtE,WAAW,OAAOC,cAAcsE,SAASC,KAAAA,IAC7D,MAAM9D,OAAOO,kBAAkB;gBAC7BjB;gBACAkB,aAAa;gBACbC,UAAUlB,cAAckB,UAAU7C,QAAQkC,GAAGE,OAAOU;cACxD,CAAA;AAEJ,yBAAWqB,aAAa,MAAMzB,KAAK0B,kBAAkB0B,UAAAA,GAAa;AAC9D,sBAAM,KAAKxF,gBAAgBkE,kBAAkBvC,UAAUP,WAAWyC,SAAAA;cACtE;AAEA,oBAAM,KAAK7D,gBAAgBmE,YAAY;gBACnC,GAAG9C;gBACH+C,eAAeoB;gBACfnB,UAAU,KAAK5C;cACnB,CAAA;YACJ,SAASoE,YAAY;AACjB7E,cAAAA,QAAO0C,MAAM,sCAAsCtC,SAAAA,MAAgByE,WAAqBN,OAAO,EAAE;YACrG;AACA,kBAAM,KAAKO,QAAQpC,KAAAA;UACvB;QACJ,CAAA;MACJ;MAEA,MAAMqC,aAA4B;AAC9B,cAAM,MAAMA,WAAAA;MAChB;MAEA,MAAMD,QAAQpC,OAA6B;AACvC,cAAM,MAAMoC,QAAQpC,KAAAA;AACpB,aAAKpC,MAAM0E;MACf;MAEA,MAAMC,WAAWC,cAA6B;AAC1C,aAAK5E,MAAM0E,eAAeE,aAAaxC;AACvC,aAAKpC,MAAM6E,kBAAkBD,aAAaE;AAC1C,aAAK9E,MAAMiC,uBAAuB2C,aAAaG;AAC/C,gBAAQH,aAAarD,MAAI;UACrB,KAAK;AACD,iBAAKvB,MAAMgF,qBAAqBJ,aAAaE;AAC7C,iBAAK9E,MAAMiF,kBAAkBL,aAAaxC;AAC1C,iBAAKpC,MAAMkF,gBAAgBN,aAAaG;AACxC;UACJ,KAAK;AACD,iBAAK/E,MAAMmF,iBAAiBP,aAAaE;AACzC,iBAAK9E,MAAMoF,cAAcR,aAAaxC;AACtC,iBAAKpC,MAAMqF,YAAYT,aAAaG;AACpC;UACJ;AACI;QACR;MACJ;MAEQ5B,kBAAkBpD,eAAkCS,QAAsD;AAC9G,cAAM8E,aAAavF,cAAcuF;AACjC,YAAI,CAACA,cAAcA,eAAe9E,OAAO4C,OAAOmC,YAAW,EAAI,QAAOC;AACtE,eAAO,KAAK/G,eAAegH,aAAaH,UAAAA;MAC5C;MAEA,MAAchC,wBAAwBvD,eAAkCmD,YAA4C;AAChHnD,sBAAc2F,kBAAkB3F,cAAcsE;AAC9CtE,sBAAc4F,mBAAoBzC,WAAmB/C;AACrDJ,sBAAcsE,UAAU,MAAMnB,WAAWS,WAAWiC,cAAc7F,cAAcsE,OAAO;AACvFtE,sBAAcoE,eAAe;MACjC;MAEA,MAAcpD,kBACVjB,WACAC,eACAmD,YACA1C,QACqB;AACrB,YAAI0C,YAAY;AACZ,iBAAOA,WAAWnC,kBAAkB;YAChCjB;YACAkB,aAAajB,cAAciB;YAC3BC,UAAUlB,cAAcsD,oBAAoBH,WAAWhC;UAC3D,CAAA;QACJ;AACA,YAAInB,cAAcoE,cAAc;AAC5B,iBAAO,IAAIC,gBACPtE,WACAC,cAAciB,aACdjB,cAAcsE,SAASC,OACvBvE,cAAckB,UAAU4E,UAAAA;QAEhC;AACA,eAAOrF,OAAOO,kBAAkB;UAC5BjB;UACAkB,aAAajB,cAAciB;UAC3BC,UAAUlB,cAAckB,SAAS7C;QACrC,CAAA;MACJ;IACJ;;;;;;;;;;;;;;;;AC7OA;AAEA,SAAQ0H,aAAAA,mBAAgB;AAFxB,IAKMC;AALN,IAAAC,eAAA;;;;AACA;AAEA;AAEA,IAAMD,UAASD,YAAUG,QAAQC,YAAAA;AACjC,UAAMH,QAAOI,MAAK;;;;;ACNlB,OAAO;AACP,SAAQC,aAAAA,mBAAgB;AADxB;;;AAEA;AACA;AAEAA,IAAAA,YACKC,kBAAkBC,SAAAA,EAClBD,kBAAkBE,sBAAAA,EAClBF,kBAAkBG,cAAAA;;;;;ACRvB,OAAO;AACP,SAAQC,cAAAA,oBAAiB;;;;;;;;;;IAWZC;;;;AAVb;AACA,IAAAC;AACA,IAAAC;AACA;AACA,IAAAC;AAGA;;;AAGO,IAAMH,cAAN,cAA0BI,UAAUC,UAAUC,OAAOC,UAAAA,CAAAA,CAAAA,EAAAA;aAAAA;;;;;;MAExD,YACYC,cACAC,qBACAC,gBACV;AACE,cAAMC,IAAIC,MAAMC,UAAUC,WAAWC,KAAK,GAAA,KAJlCP,eAAAA,cAAAA,KACAC,sBAAAA,qBAAAA,KACAC,iBAAAA;MAGZ;MAEA,MAAMM,SAAwB;AAC1B,cAAM,MAAMA,OAAAA;AACZ,aAAKC,uBAAuBC,cAAcP,IAAIC,MAAMO,UAAU;AAC9D,cAAM,KAAKT,eAAeU,cAAa;AACvC,cAAM,KAAKX,oBAAoBY,QAAO;AAEtC,cAAM,KAAKC,aAAaC,QAAQZ,IAAIa,MAAMC,wBAAwB,OAAOC,KAAKC,YAAAA;AAC1E,gBAAM,KAAKnB,aAAaoB,gBAAgBD,OAAAA;QAC5C,CAAA;AAEA,cAAM,KAAKL,aAAaC,QAAQZ,IAAIa,MAAMK,mBAAmB,OAAOH,KAAKC,YAAAA;AACrE,gBAAM,KAAKnB,aAAasB,WAAWH,OAAAA;QACvC,CAAA;AAEA,cAAM,KAAKL,aAAaC,QAAQZ,IAAIa,MAAMO,oBAAoB,OAAOL,KAAKC,YAAAA;AACtE,gBAAM,KAAKnB,aAAawB,YAAYL,OAAAA;QACxC,CAAA;MACJ;MAEA,MAAMM,aAA4B;AAC9B,cAAM,MAAMA,WAAAA;MAChB;MAEA,MAAMC,QAAQC,OAA6B;AACvC,cAAM,MAAMD,QAAQC,KAAAA;MACxB;IACJ;;;;;;;;;;;;;;AChDA;AAEA,SAAQC,aAAAA,mBAAgB;AAFxB,IAKMC;AALN,IAAAC,cAAA;;;;AACA;AAEA;AAEA,IAAMD,UAASD,YAAUG,QAAQC,WAAAA;AACjC,UAAMH,QAAOI,MAAK;;;;;ACNlB;AAIA,SAAQC,aAAAA,mBAAgB;AAJxB,IASMC,KACAC,QACAC;AAXN;;;;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA,IAAMF,MAAMD,YAAUI,QAAQC,SAAAA;AAC9B,IAAMH,SAASF,YAAUI,QAAQE,YAAAA;AACjC,IAAMH,QAAQH,YAAUI,QAAQG,WAAAA;AAEhC,UAAMN,IAAIO,MAAK;AACf,UAAMC,QAAQC,IAAI;MAACR,OAAOM,MAAK;MAAIL,MAAMK,MAAK;KAAG;;;;;ACdjD,OAAO;AACP,SAAQG,gBAAAA,qBAAmB;AAC3B,SAAQC,WAAAA,UAASC,QAAAA,aAAW;AAC5B,SAAQC,iBAAAA,sBAAoB;AAC5B,SAAQC,WAAAA,gBAAc;;;ACAtB;AACA;AALA,SAAQC,mBAAkB;AAC1B,SAAQC,cAAAA,mBAAiB;AACzB,SAAQC,eAAc;AACtB,SAAQC,SAASC,OAAOC,gBAAe;AAsBvC,SAASC,OAAOC,OAAa;AACzB,SAAOC,YAAYD,KAAAA,EAAOE,SAAS,KAAA;AACvC;AAFSH;AAIT,SAASI,UAAUH,OAAa;AAC5B,SAAOC,YAAYD,KAAAA,EAAOE,SAAS,QAAA;AACvC;AAFSC;AAIT,SAASC,SAAAA;AACL,SAAOH,YAAY,CAAA,EAAGC,SAAS,KAAA;AACnC;AAFSE;AAIT,eAAeC,kBAAkBC,UAA6B;AAC1D,QAAMC,MAAMD,YAAY,CAAC;AACzBE,UAAQC,IAAI,2FAAA;AAEZ,QAAMC,aAAa,MAAMC,MAAM;IAC3BC,SAAS;IACTC,SAASN,IAAIO,KAAKC,UAAU;EAChC,CAAA;AACA,QAAMC,iBAAiB,MAAML,MAAM;IAC/BC,SAAS;IACTC,SAASN,IAAIU,YAAYD,kBAAkB;EAC/C,CAAA;AACA,QAAME,UAAU,MAAMP,MAAM;IAACC,SAAS;IAAiBC,SAASN,IAAIY,UAAUC,QAAQ;EAAW,CAAA;AACjG,QAAMC,UAAU,MAAMV,MAAM;IAACC,SAAS;IAAiBC,SAASS,OAAOf,IAAIY,UAAUI,QAAQ,IAAA;EAAK,CAAA;AAClG,QAAMC,UAAU,MAAMb,MAAM;IAACC,SAAS;IAAiBC,SAASN,IAAIY,UAAUM,QAAQ;EAAM,CAAA;AAC5F,QAAMC,cAAc,MAAMC,SAAS;IAC/Bf,SAAS;IACTgB,MAAM;EACV,CAAA;AACA,QAAMC,cAAc,MAAMlB,MAAM;IAACC,SAAS;IAAqBC,SAASN,IAAIY,UAAUW,YAAY;EAAS,CAAA;AAC3G,QAAMC,eAAe,MAAMpB,MAAM;IAACC,SAAS;IAAgBC,SAASN,IAAIyB,UAAUC,OAAO;EAAuB,CAAA;AAChH,QAAMC,YAAY,MAAMvB,MAAM;IAACC,SAAS;IAAaC,SAASN,IAAI4B,OAAOF,OAAO;EAAwB,CAAA;AACxG,QAAMG,WAAW,MAAMzB,MAAM;IAACC,SAAS;IAAYC,SAASN,IAAI8B,MAAMJ,OAAO;EAAuB,CAAA;AACpG,QAAMK,SAAS,MAAM3B,MAAM;IAACC,SAAS;IAAiBC,SAASN,IAAIgC,SAASD,UAAU,OAAOlC,OAAAA,CAAAA;EAAU,CAAA;AACvG,QAAMoC,YAAY,MAAM7B,MAAM;IAACC,SAAS;IAAoBC,SAASN,IAAIgC,SAASC,aAAa,UAAUpC,OAAAA,CAAAA;EAAU,CAAA;AACnH,QAAMqC,WAAW,MAAM9B,MAAM;IAACC,SAAS;IAAmBC,SAASN,IAAIgC,SAASE,YAAY,SAASrC,OAAAA,CAAAA;EAAU,CAAA;AAE/G,SAAO;IACHU,KAAK;MAACC,QAAQL,cAAcX,OAAO,EAAA;IAAG;IACtCkB,YAAY;MAACD,gBAAgBA,kBAAkBb,UAAU,EAAA;IAAG;IAC5DgB,UAAU;MACNC,MAAMF;MACNK,MAAMmB,SAASrB,SAAS,EAAA;MACxBI,MAAMD;MACNG,UAAUD,eAAenB,IAAIY,UAAUQ;MACvCG,UAAUD;IACd;IACAG,UAAU;MAACC,KAAKF;IAAY;IAC5BI,OAAO;MAACF,KAAKC;IAAS;IACtBG,MAAM;MAACJ,KAAKG;IAAQ;IACpBG,SAAS;MAACD;MAAQE;MAAWC;IAAQ;EACzC;AACJ;AA1CepC;AA4Cf,SAASsC,iBAAiBC,OAAkBtC,UAA6B;AACrE,QAAMC,MAAMD,YAAY,CAAC;AACzB,SAAO;IACHQ,KAAK;MACDC,QAAQ6B,MAAMC,aAAatC,IAAIO,KAAKC,UAAUhB,OAAO,EAAA;IACzD;IACAkB,YAAY;MACRD,gBAAgB4B,MAAME,iBAAiBvC,IAAIU,YAAYD,kBAAkBb,UAAU,EAAA;IACvF;IACAgB,UAAU;MACNC,MAAMwB,MAAMG,UAAUxC,IAAIY,UAAUC;MACpCG,MAAMqB,MAAMI,SAASN,SAASE,MAAMI,QAAQ,EAAA,IAAMzC,IAAIY,UAAUI;MAChEE,MAAMmB,MAAMK,UAAU1C,IAAIY,UAAUM;MACpCE,UAAUiB,MAAMM,cAAc3C,IAAIY,UAAUQ;MAC5CG,UAAUc,MAAMO,cAAc5C,IAAIY,UAAUW;IAChD;IACAE,UAAU;MAACC,KAAKW,MAAMQ,eAAe7C,IAAIyB,UAAUC;IAAG;IACtDE,OAAO;MAACF,KAAKW,MAAMS,YAAY9C,IAAI4B,OAAOF;IAAG;IAC7CI,MAAM;MAACJ,KAAKW,MAAMU,WAAW/C,IAAI8B,MAAMJ;IAAG;IAC1CM,SAAS;MACLD,QAAQM,MAAMW,SAAShD,IAAIgC,SAASD,UAAU,OAAOlC,OAAAA,CAAAA;MACrDoC,WAAWI,MAAMY,YAAYjD,IAAIgC,SAASC,aAAa,UAAUpC,OAAAA,CAAAA;MACjEqC,UAAUG,MAAMa,WAAWlD,IAAIgC,SAASE,YAAY,SAASrC,OAAAA,CAAAA;IACjE;EACJ;AACJ;AAzBSuC;AA2BF,IAAMe,cAAc,IAAIC,QAAQ,MAAA,EAClCC,YAAY,8DAAA,EACZC,OAAO,qBAAqB,sDAAA,EAC5BA,OAAO,WAAW,4CAAA,EAClBA,OAAO,uBAAA,EACPA,OAAO,wBAAA,EACPA,OAAO,kBAAA,EACPA,OAAO,kBAAA,EACPA,OAAO,kBAAA,EACPA,OAAO,0BAAA,EACPA,OAAO,0BAAA,EACPA,OAAO,sBAAA,EACPA,OAAO,mBAAA,EACPA,OAAO,kBAAA,EACPA,OAAO,eAAA,EACPA,OAAO,kBAAA,EACPA,OAAO,iBAAA,EACPC,OAAO,OAAOlB,UAAAA;AACXmB,oBAAAA;AACA,QAAMzD,WAAW0D,aAAAA;AACjB,MAAIC,YAAWC,aAAAA,KAAkB,CAACtB,MAAMuB,SAAS,CAACvB,MAAMwB,gBAAgB;AACpE,UAAMC,YAAY,MAAMC,QAAQ;MAC5B1D,SAAS,6BAA6BsD,aAAAA;MACtCrD,SAAS;IACb,CAAA;AACA,QAAI,CAACwD,WAAW;AACZ7D,cAAQC,IAAI,UAAA;AACZ;IACJ;EACJ;AACA,QAAM8D,WAAW3B,MAAMwB,iBACjBzB,iBAAiBC,OAAOtC,QAAAA,IACxB,MAAMD,kBAAkBC,QAAAA;AAC9BkE,gBAAcD,QAAAA;AACd/D,UAAQC,IAAI;eAAayD,aAAAA,EAAe;AACxC1D,UAAQC,IAAI,0DAAA;AAChB,CAAA;;;AChJJ,SAAQgE,WAAAA,gBAAc;AAEtB,IAAMC,UAAU;EAAC;EAAO;EAAU;EAAS;;AAG3C,IAAMC,UAAsD;EACxDC,KAAK,6BAAM,oCAAN;EACLC,QAAQ,6BAAM,2CAAN;EACRC,OAAO,6BAAM,yCAAN;EACPC,KAAK,6BAAM,oCAAN;AACT;AAEO,IAAMC,eAAe,IAAIC,SAAQ,OAAA,EACnCC,YAAY,oCAAA,EACZC,SAAS,YAAY,oBAAoBT,QAAQU,KAAK,GAAA,CAAA,IAAQ,KAAA,EAC9DC,OAAO,OAAOC,YAAAA;AACX,MAAI,CAACZ,QAAQa,SAASD,OAAAA,GAAuB;AACzCE,YAAQC,MAAM,mBAAmBH,OAAAA,kBAAwBZ,QAAQU,KAAK,IAAA,CAAA,GAAQ;AAC9EM,YAAQC,KAAK,CAAA;EACjB;AACA,QAAMhB,QAAQW,OAAAA,EAAqB;AACvC,CAAA;;;ACjBJ;AAJA,SAAQM,cAAAA,mBAAiB;AACzB,SAAQC,WAAAA,gBAAc;AACtB,SAAQC,WAAAA,gBAAc;AACtB,OAAOC,aAAY;AASnB,IAAMC,eAAe,oBAAIC,IAAI;EACzB;EACA;EACA;CACH;AAED,IAAMC,qBAAqB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ,SAASC,KAAKC,OAAkC;AAC5C,MAAIA,SAAS,KAAM,QAAO;AAC1B,QAAMC,IAAIC,OAAOF,KAAAA;AACjB,MAAIC,EAAEE,UAAU,EAAG,QAAO,IAAIC,OAAOH,EAAEE,MAAM;AAC7C,SAAO,GAAGF,EAAEI,MAAM,GAAG,CAAA,CAAA,SAAMJ,EAAEI,MAAM,EAAC,CAAA,MAAQJ,EAAEE,MAAM;AACxD;AALSJ;AAOT,SAASO,UAAUC,OAAcP,OAAc;AAC3C,MAAIJ,aAAaY,IAAID,KAAAA,EAAO,QAAOR,KAAKC,KAAAA;AACxC,SAAOA;AACX;AAHSM;AAKT,SAASG,cAAcC,KAA8BC,SAAS,IAAE;AAC5D,QAAMC,MAA+B,CAAC;AACtC,aAAW,CAACC,GAAGC,CAAAA,KAAMC,OAAOC,QAAQN,GAAAA,GAAM;AACtC,UAAMH,QAAOI,SAAS,GAAGA,MAAAA,IAAUE,CAAAA,KAAMA;AACzC,QAAIC,KAAK,OAAOA,MAAM,YAAY,CAACG,MAAMC,QAAQJ,CAAAA,GAAI;AACjDF,UAAIC,CAAAA,IAAKJ,cAAcK,GAA8BP,KAAAA;IACzD,OAAO;AACHK,UAAIC,CAAAA,IAAKP,UAAUC,OAAMO,CAAAA;IAC7B;EACJ;AACA,SAAOF;AACX;AAXSH;AAaT,SAASU,YAAYC,UAAmCC,QAAe;AACnE,QAAMC,WAAWD,SAASD,WAAWX,cAAcW,QAAAA;AACnD,QAAMG,QAAkB,CAAA;AACxB,QAAMC,OAAO,wBAACd,KAA8Be,UAAAA;AACxC,UAAMC,MAAM,KAAKtB,OAAOqB,KAAAA;AACxB,eAAW,CAACZ,GAAGC,CAAAA,KAAMC,OAAOC,QAAQN,GAAAA,GAAM;AACtC,UAAII,KAAK,OAAOA,MAAM,YAAY,CAACG,MAAMC,QAAQJ,CAAAA,GAAI;AACjDS,cAAMI,KAAK,GAAGD,GAAAA,GAAMb,CAAAA,GAAI;AACxBW,aAAKV,GAA8BW,QAAQ,CAAA;MAC/C,OAAO;AACHF,cAAMI,KAAK,GAAGD,GAAAA,GAAMb,EAAEe,OAAO,EAAA,CAAA,KAAQd,KAAK,EAAA,EAAI;MAClD;IACJ;EACJ,GAVa;AAWbU,OAAKF,UAAU,CAAA;AACf,SAAOC,MAAMM,KAAK,IAAA;AACtB;AAhBSV;AAkBT,SAASW,gBAAgBT,QAAe;AACpC,QAAME,QAAkB,CAAA;AACxB,aAAWQ,QAAQjC,oBAAoB;AACnC,UAAMgB,IAAIkB,QAAQC,IAAIF,IAAAA;AACtB,QAAIjB,KAAK,QAAQA,MAAM,IAAI;AACvBS,YAAMI,KAAK,KAAKI,KAAKH,OAAO,EAAA,CAAA,YAAe;AAC3C;IACJ;AACA,UAAMM,WAAW,sBAAsBC,KAAKJ,IAAAA;AAC5C,UAAMK,UAAUF,YAAY,CAACb,SAAStB,KAAKe,CAAAA,IAAKA;AAChDS,UAAMI,KAAK,KAAKI,KAAKH,OAAO,EAAA,CAAA,MAASQ,OAAAA,EAAS;EAClD;AACA,SAAOb,MAAMM,KAAK,IAAA;AACtB;AAbSC;AAeF,IAAMO,cAAc,IAAIC,SAAQ,MAAA,EAClCC,YAAY,4DAAA,EACZC,OAAO,UAAU,2CAAA,EACjBA,OAAO,YAAY,0EAAA,EACnBA,OAAO,eAAe,0EAAA,EACtBC,OAAO,CAACC,UAAAA;AACL,MAAIA,MAAMC,WAAW;AAEjBC,IAAAA,QAAOC,OAAO;MAACtC,MAAM;QAACuC,SAAQ,YAAYC,SAAS,eAAA;QAAkB;;IAAO,CAAA;AAC5EC,uBAAAA;EACJ;AACA,QAAM5B,WAAW6B,aAAAA;AACjB,MAAI,CAAC7B,YAAY,CAAC8B,YAAWC,aAAAA,GAAgB;AACzCC,YAAQC,IAAI,uBAAuBF,aAAAA,GAAgB;AACnDC,YAAQC,IAAI,8DAAA;AACZ,QAAIX,MAAMC,WAAW;AACjBS,cAAQC,IAAI,0CAAA;AACZD,cAAQC,IAAIvB,gBAAgBY,MAAMrB,UAAU,KAAA,CAAA;IAChD;AACA;EACJ;AAEA,MAAIqB,MAAMrB,QAAQ;AACd+B,YAAQE,KAAK,sFAAA;EACjB;AAEA,MAAIZ,MAAMa,MAAM;AACZ,UAAM7C,MAAMgC,MAAMrB,SAASD,WAAWX,cAAcW,QAAAA;AACpDgC,YAAQC,IAAIG,KAAKC,UAAU/C,KAAK,MAAM,CAAA,CAAA;AACtC;EACJ;AAEA0C,UAAQC,IAAIF,aAAAA;AACZC,UAAQC,IAAI,SAAIjD,OAAO,EAAA,CAAA;AACvBgD,UAAQC,IAAIlC,YAAYC,UAAgDsB,MAAMrB,UAAU,KAAA,CAAA;AAExF,MAAIqB,MAAMC,WAAW;AACjBS,YAAQC,IAAI,gDAAA;AACZD,YAAQC,IAAIvB,gBAAgBY,MAAMrB,UAAU,KAAA,CAAA;EAChD;AACJ,CAAA;;;ACrIJ,SAAQqC,WAAAA,gBAAc;AAEf,IAAMC,gBAAgB,IAAID,SAAQ,QAAA,EACpCE,YAAY,+CAAA,EACZC,OAAO,MAAA;AACJC,UAAQC,IAAI,mCAAA;AACZD,UAAQC,IAAI,uGAAA;AAChB,CAAA;;;ACPJ,SAAQC,WAAAA,gBAAc;AAEf,IAAMC,gBAAgB,IAAID,SAAQ,QAAA,EACpCE,YAAY,2CAAA;AAEjBD,cACKE,QAAQ,MAAA,EACRD,YAAY,wBAAA,EACZE,OAAO,MAAA;AACJC,UAAQC,IAAI,wCAAA;AAChB,CAAA;AAEJL,cACKE,QAAQ,mBAAA,EACRD,YAAY,2BAAA,EACZE,OAAO,CAACG,QAAAA;AACLF,UAAQC,IAAI,uBAAuBC,GAAAA,wBAA2B;AAClE,CAAA;;;ALNJ,SAASC,cAAAA;AACL,MAAI;AACA,UAAMC,OAAOC,SAAQC,eAAc,YAAYC,GAAG,CAAA;AAClD,UAAMC,MAAMC,KAAKC,MAAMC,cAAaC,MAAKR,MAAM,MAAM,cAAA,GAAiB,MAAA,CAAA;AACtE,WAAOI,IAAIK;EACf,QAAQ;AACJ,WAAO;EACX;AACJ;AARSV;AAUT,IAAMW,UAAU,IAAIC,SAAAA;AACpBD,QACKE,KAAK,MAAA,EACLC,YAAY,mDAAA,EACZJ,QAAQV,YAAAA,CAAAA;AAEbW,QAAQI,WAAWC,WAAAA;AACnBL,QAAQI,WAAWE,YAAAA;AACnBN,QAAQI,WAAWG,WAAAA;AACnBP,QAAQI,WAAWI,aAAAA;AACnBR,QAAQI,WAAWK,aAAAA;AAEnB,MAAMT,QAAQU,WAAU;","names":["existsSync","mkdirSync","os","join","resolve","resolveHolokaiHome","process","env","HOLOKAI_HOME","legacy","homedir","XDG_DATA_HOME","ensureHolokaiDirs","dir","PLUGINS_DIR","CONFIG_DIR","LOGS_DIR","DATA_DIR","recursive","HOLO_PLUGINS_DIR","HOLOKAI_CONFIG_DIR","LOG_DIR","HOLOKAI_DATA_DIR","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","loadSettings","SETTINGS_FILE","JSON","parse","writeSettings","settings","recursive","stringify","applySettingsToEnv","s","set","key","val","process","env","String","jwt","secret","algorithm","encryption","credential_key","postgres","host","port","user","password","database","rabbitmq","url","redis","moku","servers","api_id","worker_id","audit_id","CONFIG_DIR","existsSync","createRequire","dirname","join","resolve","fileURLToPath","resolveAppModulesDir","process","env","API_PLUGINS_DIR","startDir","URL","url","probe","i","split","pop","parent","outermost","candidate","require","parseBoolean","value","defaultValue","toLowerCase","parseNumber","parsed","parseInt","isNaN","parseArray","split","map","item","trim","resolve","dotenv","init_env","config","path","dirname","applySettingsToEnv","ensureHolokaiDirs","env","NODE_ENV","process","id","PORT","Math","random","toString","substring","logDir","LOGS_DIR","api","apiServerId","API_SERVER_ID","port","parseNumber","configMode","API_CONFIG_MODE","configFile","API_CONFIG_FILE","configTimeoutMs","API_CONFIG_TIMEOUT","appModulesDir","resolveAppModulesDir","pluginsDir","PLUGINS_DIR","skipInitialPlugins","parseBoolean","SKIP_INITIAL_PLUGINS","pluginWatchEnabled","PLUGIN_WATCH_ENABLED","pluginWatchIntervalMs","PLUGIN_WATCH_INTERVAL_MS","pluginReconcileIntervalMs","PLUGIN_RECONCILE_INTERVAL_MS","notifications","sseHeartbeatMs","NOTIF_SSE_HEARTBEAT_MS","replayDefaultLimit","NOTIF_REPLAY_DEFAULT_LIMIT","replayMaxLimit","NOTIF_REPLAY_MAX_LIMIT","exchange","NOTIF_EXCHANGE","routingKeyPrefix","NOTIF_ROUTING_KEY_PREFIX","queueNamePrefix","NOTIF_QUEUE_PREFIX","defaultTypes","parseArray","NOTIF_DEFAULT_TYPES","appDb","host","APP_PG_HOST","AUDIT_PG_HOST","APP_PG_PORT","AUDIT_PG_PORT","database","APP_PG_DATABASE","AUDIT_PG_DATABASE","user","APP_PG_USER","AUDIT_PG_USER","password","APP_PG_PASSWORD","AUDIT_PG_PASSWORD","ssl","APP_PG_SSL","AUDIT_PG_SSL","maxConnections","APP_PG_MAX_CONNECTIONS","AUDIT_PG_MAX_CONNECTIONS","idleTimeout","APP_PG_IDLE_TIMEOUT","AUDIT_PG_IDLE_TIMEOUT","max","idleTimeoutMillis","auditDb","redis","url","REDIS_URL","queue","RABBITMQ_URL","reconnectAttempts","RABBITMQ_RECONNECT_ATTEMPTS","reconnectDelayMs","RABBITMQ_RECONNECT_DELAY_MS","prefix","QUEUE_PREFIX","q","name","requestQueue","RABBITMQ_REQUEST_QUEUE","requestExchange","RABBITMQ_REQUEST_EXCHANGE","responseQueue","RABBITMQ_RESPONSE_QUEUE","responseExchange","RABBITMQ_RESPONSE_EXCHANGE","adminExchange","RABBITMQ_ADMIN_EXCHANGE","directExchange","RABBITMQ_DIRECT_EXCHANGE","adminCommandQueue","RABBITMQ_ADMIN_COMMAND_QUEUE","adminResponseExchange","RABBITMQ_ADMIN_RESPONSE_EXCHANGE","adminResponseQueue","RABBITMQ_ADMIN_RESPONSE_QUEUE","platformExchange","RABBITMQ_PLATFORM_EXCHANGE","auditRequestQueue","RABBITMQ_AUDIT_REQUEST_QUEUE","auditResponseQueue","RABBITMQ_AUDIT_RESPONSE_QUEUE","auditRoutingKey","AUDIT_ROUTING_KEY","batchQueue","RABBITMQ_BATCH_QUEUE","batchRoutingKey","BATCH_ROUTING_KEY","queueExpiration","QUEUE_EXPIRATION","managementQueue","PROXY_MANAGEMENT_QUEUE","notificationExchange","RABBITMQ_NOTIFICATION_EXCHANGE","notificationQueue","RABBITMQ_NOTIFICATION_QUEUE","auditNotificationQueue","RABBITMQ_AUDIT_NOTIFICATION_QUEUE","worker","serverId","WORKER_ID","WORKER_PLUGINS_DIR","audit","AUDIT_ID","AUDIT_PLUGINS_DIR","batch","BATCH_ID","JWT_SECRET","Error","jwtConfig","secret","expiresIn","JWT_EXPIRES_IN","algorithm","mokuUrl","MOKU_URL","security","encryptionKey","CREDENTIAL_ENCRYPTION_KEY","corsAllowedOrigins","CORS_ALLOWED_ORIGINS","winston","fs","path","container","formatTime","ts","d","Date","hh","String","getHours","padStart","mm","getMinutes","ss","getSeconds","ms","getMilliseconds","initialism","name","caps","match","length","join","slice","truncate","s","width","padEnd","Math","max","shortRid","rid","n","formatLocation","cls","mth","c","m","full","init","roomForClass","truncCls","trim","createLoggerFormat","serverId","W_LVL","W_SRV","W_LOC","W_RID","lvl3","lvl","l","toLowerCase","toUpperCase","format","combine","timestamp","printf","level","message","className","methodName","requestId","metadata","time","cleanLevel","replace","srv","loc","trimEnd","msg","Object","keys","JSON","stringify","colorize","all","createLoggerOptions","levels","transports","logDir","colors","baseLogger","logger","LoggerFactoryToken","init_env","env","existsSync","mkdirSync","recursive","error","console","warn","fatal","info","http","verbose","debug","trace","addColors","Console","accessSync","constants","W_OK","push","File","filename","NODE_ENV","createLogger","id","log","bind","register","useFactory","childLogger","child","Pool","AppDB","init_env","pool","disconnected","config","env","appDb","connect","now","query","logger","info","rows","error","message","disconnect","end","getPool","Error","text","params","then","result","queryResult","queryOne","queryScalar","length","firstRow","Object","values","queryBatch","queries","transaction","client","results","push","asUser","orgId","callback","asSystem","systemQuery","systemQueryOne","systemQueryScalar","release","isConnected","injectable","POPULATED_APPLICATION_QUERY","ApplicationDB","db","getById","id","systemQueryOne","getBySlug","orgId","urlSlug","getBySlugUnscoped","getAllByOrg","systemQuery","listPaginated","filters","limit","offset","sortBy","sortDir","conditions","params","idx","org_id","push","provider_id","search","where","join","allowedSorts","Set","col","has","dir","limitIdx","offsetIdx","asSystem","client","rowsResult","countResult","Promise","all","query","rows","total","parseInt","count","create","app","organization_id","name","url_slug","description","system_prompt_id","enabled","available","update","fields","sets","updatable","key","undefined","length","softDelete","result","injectable","ProviderDB","db","list","query","systemQuery","get","name","systemQueryOne","getById","id","listActiveByOrgId","orgId","findByPluginId","pluginId","migrateToLatestPlugin","family","latestPluginId","result","toUpperCase","length","listPaginated","filters","limit","offset","sortBy","sortDir","conditions","params","idx","org_id","push","enabled","undefined","search","where","join","allowedSorts","Set","col","has","dir","limitIdx","offsetIdx","asSystem","client","rowsResult","countResult","Promise","all","rows","total","parseInt","count","create","provider","organization_id","type","description","JSON","stringify","config","api_credential_id","plugin_id","pricing_plan_id","available","deleted","active","update","fields","sets","updatable","key","softDelete","findByPluginFamily","excludePluginId","PluginType","PluginState","PROVIDER","DATASTORE","UNINITIALIZED","INITIALIZING","READY","ERROR","DESTROYING","DESTROYED","HoloErrorCode","init_errors","UNAUTHORIZED","FORBIDDEN","VALIDATION_ERROR","NOT_FOUND","GUARD_FAILURE","INTERNAL_ERROR","NOT_IMPLEMENTED","TIMEOUT","init_errors","HoloError","init_errors","Error","statusCode","message","code","HoloErrorCode","INTERNAL_ERROR","name","notFound","resource","NOT_FOUND","badRequest","VALIDATION_ERROR","unauthorized","UNAUTHORIZED","forbidden","FORBIDDEN","notImplemented","NOT_IMPLEMENTED","container","Transform","getLoggerFactory","cachedFactory","isRegistered","LoggerFactoryToken","resolve","HoloLoggerError","withClassLogger","Base","WithClassLogger","log","name","mlog","methodName","child","ClassLogger","ObservableClassLogger","init_logger","Error","message","__className","_log","AsyncEventQueue","q","pending","ended","err","push","item","r","shift","value","done","end","length","undefined","fail","e","Symbol","asyncIterator","next","Promise","reject","resolve","sanitizeObject","obj","Object","entries","reduce","acc","key","value","pickDefined","obj","out","key","Object","prototype","hasOwnProperty","call","typedKey","value","undefined","setByPath","obj","path","value","result","keys","split","length","current","i","stringifyAny","err","JSON","stringify","encoding_for_model","init_errors","init_logger","promises","fs","path","init_plugin","init_types","init_types","init_base","ProtocolCapability","CHAT","GENERATE","EMBED","MODELS","METRICS","ServerType","API","AUDIT","WORKER","BATCH","CostType","PROVIDER","INTERNAL","init_base","init_logger","init_logger","NotificationEventType","init_types","REQUEST_STARTED","GUARD_STARTED","GUARD_PASSED","GUARD_FAILED","STATUS","PROVIDER_REQUEST_STARTED","PROVIDER_RESPONSE_COMPLETED","RESPONSE_COMPLETED","PROVIDER_ERROR","init_types","init_protocol","ProviderEventType","init_types","STREAM_EVENT","TEXT_DELTA","TOOL_CALL_DELTA","DONE","ERROR","init_protocol","init_types","RouteHandler","MODELS","REQUEST","PASSTHROUGH","NOOP","init_logger","init_base","init_base","init_base","translateProviderEvents","events","source","wire","toHoloStream","ev","ctx","lastStreamEvent","pendingDone","pendingError","passThrough","holoIter","type","event","message","push","wireChunk","fromHoloStream","ref","done","baseResp","holoResponse","toHoloResponse","m","metrics","holoResp","existing","usage","maxTokens","existingVal","mVal","e","w","undefined","Math","max","input","input_tokens","inputTokens","output","output_tokens","outputTokens","total","total_tokens","totalTokens","existingTimings","timings","ms2ns","ms","totalProcessingTime","prompt_eval","timeToFirstToken","eval","Object","keys","length","assign","fromHoloResponse","err","init_base","init_base","BaseWireAdapter","init_base","ClassLogger","wireSeq","requestId","isStreaming","fromProviderEvent","ev","fromNonStreaming","fromStreaming","nonStreamingHeaders","streamingHeaders","defaultHeadersForFirst","type","chunkify","bodyFn","done","options","isFirst","seq","body","fullText","chunk","pickDefined","eventSeq","status","headers","undefined","stringifyAny","message","error","onStreamEvent","onDoneStreaming","onErrorStreaming","defaultStreamEventFormatter","bind","defaultDoneStreamFormatter","text","defaultStreamErrorFormatter","formatWire","event","mapFinishReason","ev","msg","message","reason","stop_reason","finish_reason","choices","HoloWireAdapter","init_base","BaseWireAdapter","textAccumulator","toolCalls","Map","responseId","model","firstEvent","capability","requestId","isStreaming","initialModel","formatWire","data","type","JSON","stringify","emitCreated","id","response","output","created","Date","now","usage","emitTextDelta","index","text","delta","emitReasoningDelta","emitToolCallDelta","existing","get","name","arguments_delta","arguments","entry","set","tool_call_delta","emitHoloEvent","holoEvent","chunkify","fromNonStreaming","holoResponse","buildFinalResponse","status","errorBody","error","errorEvent","String","code","opts","headers","fromStreaming","chunks","createdEvent","push","deltaEvent","tcEv","log","debug","size","onDoneStreaming","onErrorStreaming","completedEvent","pickDefined","fullText","wireSeq","hasToolCalls","sortedCalls","entries","sort","a","b","contentBlocks","tc","args","parse","block","toolCallProjections","map","call","function","role","content","tool_calls","metrics","inputTokens","input_tokens","outputTokens","output_tokens","total","total_tokens","init_base","processProviderEvents","events","wireAdapter","workerRequest","envelope","publisher","result","text","evt","type","ProviderEventType","TEXT_DELTA","chunk","fromProviderEvent","publishChunk","source_id","request_id","DONE","ERROR","acc","final","providerEvent","worker_id","workerId","publishFinal","v4","uuidv4","createWorkerRequest","params","pickDefined","provider","protocol","payload","sourceId","isStreaming","requestId","organizationId","timestamp","Date","toISOString","httpRequestDetails","path","method","application","threadId","branchId","userId","clientIdentifier","tokenType","appSlug","init_provider","init_base","init_content","init_holo","init_content","init_src","init_plugin","init_provider","init_holo","injectable","RequestDB","init_src","ClassLogger","db","getById","id","queryOne","getByRequestId","requestId","listPaginated","filters","limit","offset","sortBy","sortDir","conditions","params","idx","org_id","push","application_id","provider_id","access_model","user_id","from","to","where","length","join","allowedSorts","Set","col","has","dir","rows","countResult","Promise","all","query","total","parseInt","count","insert","request","organization_id","request_id","protocol_id","client_identifier","has_tools","thread_id","created_at","metadata","request_raw","system_prompt","last_user_prompt","injectable","ResponseDB","db","getById","id","queryOne","listPaginated","filters","limit","offset","sortBy","sortDir","conditions","params","idx","org_id","push","application_id","provider_id","access_model","user_id","client_identifier","status","from","to","where","length","join","allowedSorts","Set","col","has","dir","baseQuery","rows","countResult","Promise","all","query","total","parseInt","count","getFilters","orgId","applications","providers","models","statuses","map","r","name","insert","response","organization_id","request_id","protocol_id","finish_reason","responseText","response_raw","input_tokens","output_tokens","time_to_first_token","total_processing_time","cost","score","created_at","metadata","usage_raw","total_tokens","injectable","ApiCredentialDB","init_src","ClassLogger","db","get","id","query","queryOne","getByOrganization","organizationId","injectable","HoloTokenDB","init_src","ClassLogger","db","getById","id","query","queryOne","getByHash","keyHash","getByUser","userId","getByApplication","applicationId","getByOrganization","orgId","create","token","result","organization_id","user_id","application_id","key_hash","key_prefix","key_suffix","name","expires_at","deactivate","updateLastUsed","injectable","ModelDB","db","list","systemQuery","listWithProvider","get","name","systemQueryOne","getByAccessModel","accessModel","providerId","getById","id","listByProvider","listAllByProvider","listUnlinked","listByOrganization","orgId","listPaginated","filters","limit","offset","sortBy","sortDir","conditions","params","idx","org_id","push","provider_id","search","where","join","allowedSorts","Set","col","has","dir","limitIdx","offsetIdx","asSystem","client","rowsResult","countResult","Promise","all","query","rows","total","parseInt","count","create","model","access_model","version","description","context_length","modality","JSON","stringify","input_modalities","output_modalities","supported_parameters","parameters","metadata","pricing_per_tokens","benchmarks","customization","enabled","available","deleted","dictionary_id","raw_name","normalized_name","match_status","match_confidence","match_method","match_metadata","matched_at","source_type","source_key","family_detected","update","fields","sets","simple","key","undefined","json","length","updateModalities","softDelete","result","injectable","AccessDB","ACCESS_CHECK_QUERY","ACCESSIBLE_APPS_QUERY","MODEL_ACCESS_QUERY","init_src","ClassLogger","db","hasAccess","orgId","userId","applicationId","asUser","client","result","query","rows","exists","getAccessibleApplicationIds","map","r","id","getUserEmailById","email","getUserIdByEmail","hasModelAccess","accessModel","injectable","PLUGIN_COLS","PluginDB","init_src","ClassLogger","db","upsert","family","name","version","type","opts","query","queryOne","toUpperCase","tarball","sha256","length","source","installedBy","schema","JSON","stringify","store","updateSchema","pluginId","getSha256","row","getTarball","getTarballById","hasVersion","count","queryScalar","listActive","listAll","getByName","getByNameAndVersion","listByType","active","setDefaultPricingPlan","planId","deactivate","hardDelete","getById","id","getByFamilyAndVersion","getAvailableVersions","injectable","ProtocolDB","init_src","ClassLogger","db","upsert","pluginId","name","capability","path","query","result","queryOne","getByPluginAndKey","getByPlugin","listActiveRoutes","listActiveGrouped","rows","map","Map","row","set","plugin_id","capabilities","os","injectable","ServerDB","init_src","ClassLogger","db","upsert","name","type","query","queryOne","ping","serverId","getByName","registerPlugin","serverName","pluginId","result","recordHeartbeat","nets","networkInterfaces","ip","Object","values","flat","find","n","internal","family","address","hostname","platform","arch","process","version","totalmem","freemem","cpus","length","Math","floor","uptime","pid","getPluginsByServer","syncPlugins","activePluginIds","rowCount","placeholders","map","_","i","join","deactivateStaleServers","thresholdMinutes","toString","count","injectable","PricingDB","init_src","ClassLogger","db","upsertPlan","pluginFamily","name","source","isDefault","readOnly","description","currency","existing","findDefaultPlan","queryOne","id","toUpperCase","findPlanById","upsertSheet","planId","version","effectiveFrom","effectiveTo","notes","findEffectiveSheet","at","toISOString","findSheetsByPlanId","query","upsertSheetModel","sheetId","modelName","costs","linkage","input_cost","output_cost","cache_read_cost","cache_write_cost","batch_input_cost","batch_output_cost","context_threshold","extended_input_cost","extended_output_cost","token_costs","JSON","stringify","dictionary_id","model_id","normalized_model_name","match_status","match_confidence","match_method","resolveModelPricing","accessModel","context","modelId","dictionaryId","normalizedName","findModelPricing","findModelPricingByModelId","findModelPricingByDictionaryId","findModelPricingByNormalizedName","findModelsBySheetId","deleteStaleModels","currentModelNames","length","placeholders","map","_","i","join","result","queryResult","rowCount","injectable","ProviderResponseCostDB","db","insert","cost","query","queryOne","response_id","cost_type","pricing_sheet_id","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","input_cost","output_cost","cache_read_cost","cache_write_cost","total_cost","currency","metadata","JSON","stringify","findByResponseId","responseId","deleteByResponseId","normalizeModelName","input","raw","s","trim","toLowerCase","providerHint","prefixKey","prefix","PROVIDER_PREFIXES","startsWith","slice","PREFIX_TO_PROVIDER","length","replace","dateHint","compactDate","match","DATE_TRAILING_COMPACT","hyphenDate","DATE_TRAILING_HYPHEN","versionHint","versionMatch","dotVersion","sizeHint","sizeMatch","SIZE_PATTERN","variantHint","channelHint","variantMatches","matchAll","VARIANT_PATTERN","semantics","m","v","CHANNEL_MARKERS","includes","push","sort","a","b","VARIANT_PRIORITY","familyHint","PREFIX_TO_FAMILY","pattern","family","FAMILY_PATTERNS","test","kindHint","kind","KIND_SIGNALS","tokens","split","filter","t","Object","assign","normalized","pickDefined","stripDate","compact","hyphen","undefined","stripProviderRevision","PROVIDER_REVISION","stripQuantization","QUANTIZATION","stripChannel","CHANNEL_SUFFIX","SEMANTIC_VARIANTS","ALL_VARIANT_TOKENS","init_normalize","RegExp","join","fromEntries","map","i","init_normalize","injectable","ModelDictionaryDB","db","findByAlias","alias","systemQueryOne","JSON","stringify","findByCanonicalId","canonicalId","findByCanonicalIdNormalized","normalized","insert","entry","canonicalNorm","normalizeModelName","canonical_id","nameNorm","name","params","normalized_name","family","provider_family","version_label","versionHint","variant","variantHint","size_label","sizeHint","architecture_family","aliases","description","context_length","modality","input_modalities","output_modalities","supported_parameters","default_parameters","capabilities","tokenizer","kind","status","is_open_source","release_date","shutdown_date","base_input_cost","base_output_cost","base_cache_read_cost","base_cache_write_cost","sources","last_synced_at","upsertAliases","lookupAliases","newAliases","source","fields","Date","toISOString","upsertCanonical","payload","norm","row","Error","enrichUpdate","id","overwriteKeys","setClauses","idx","isOverwrite","key","includes","contextLength","push","pricing","p","input","output","cacheRead","cacheWrite","Object","keys","length","isOpenSource","releaseDate","systemQuery","join","list","filters","limit","offset","conditions","search","where","limitIdx","offsetIdx","asSystem","client","rowsResult","countResult","Promise","all","query","rows","total","parseInt","count","injectable","ModelDictionaryAliasDB","db","findByNormalized","normalized","providerFamily","runtimeFamily","systemQuery","findAllByDictionaryId","dictionaryId","upsert","alias","systemQueryOne","dictionary_id","alias_normalized","alias_type","provider_family","runtime_family","source","source_key","weight","active","bulkInsert","aliases","length","values","params","idx","a","push","result","asSystem","client","res","query","join","rowCount","deactivate","aliasNormalized","injectable","ModelMatchOverrideDB","db","findMatch","normalizedName","context","systemQueryOne","organizationId","providerId","sourceType","sourceKey","upsert","override","organization_id","source_type","source_key","provider_id","raw_name","normalized_name","dictionary_id","reason","active","created_by","list","filters","limit","offset","conditions","params","idx","push","undefined","where","length","join","systemQuery","injectable","DatastoreDB","init_src","ClassLogger","db","getAll","systemQuery","getEnabled","getById","id","systemQueryOne","getByOrg","orgId","asUser","client","result","query","rows","getByIdAndOrg","insert","datastore","name","plugin_id","organization_id","api_credential_id","JSON","stringify","connection_config","mapping","enabled","update","updates","sets","params","idx","undefined","push","length","join","deactivate","delete","NotificationServiceToken","NotificationTopic","Symbol","userKey","orgId","userId","userApp","appSlug","publishKey","broadcastApp","NotificationStoreToken","Symbol","v4","uuidv4","NotificationEventFactory","init_types","fromAuthAndRequest","type","auth","request","message","payload","severity","organizationId","application","userId","requestId","threadId","branchId","appSlug","url_slug","pickDefined","id","ts","Date","now","fromRequest","fromProviderEvent","envelope","event","NotificationEventType","RESPONSE_COMPLETED","organization_id","user_id","ProviderEventType","ERROR","request_id","status","DONE","eventType","error","undefined","thread_id","branch_id","init_notification","init_types","injectable","PostgresNotificationStore","init_src","db","insert","event","id","ts","organizationId","appSlug","userId","threadId","requestId","branchId","type","severity","message","payload","query","JSON","stringify","params","threadIds","requestIds","branchIds","types","afterId","limit","afterTs","row","queryOne","where","values","i","length","push","Math","max","join","rows","map","r","pickDefined","Number","organization_id","app_slug","user_id","thread_id","request_id","branch_id","injectable","promises","fs","path","PluginDiscoveryService","init_src","init_env","ClassLogger","pluginsDir","resolve","env","api","create","instance","discoverPlugins","logger","mlog","discovered","scanHotPlugins","length","pluginNames","map","p","packageName","join","debug","error","discoverSingle","packagePath","packageDir","basename","parsePackage","discoverPluginsByType","pluginType","allPlugins","filter","plugin","results","topEntries","readdir","withFileTypes","scanVersions","pkgDir","subEntries","catch","sub","isDirectory","isSymbolicLink","versionDir","name","push","entry","startsWith","entryPath","scopeEntries","scopeEntry","packageJsonPath","packageJsonContent","readFile","packageJson","JSON","parse","version","warn","hasName","hasVersion","inferPluginType","entryPoint","main","Error","message","String","holoPlugin","type","t","toUpperCase","PluginType","PROVIDER","DATASTORE","test","injectable","Redis","RedisService","init_env","init_src","ClassLogger","client","logger","mlog","env","redis","url","lazyConnect","maxRetriesPerRequest","retryStrategy","times","Math","min","on","err","error","message","info","connect","disconnect","quit","get","key","raw","JSON","parse","set","value","ttlSeconds","serialized","stringify","undefined","del","count","keys","pattern","result","cursor","nextCursor","batch","scan","push","injectable","EventEmitter","pathToFileURL","PluginLoaderService","init_src","withClassLogger","loadPlugins","discovered","loaded","discoveryInfo","result","loadPlugin","push","modulePath","packagePath","entryPoint","isWindowsPath","test","process","platform","replace","_match","drive","toLowerCase","moduleURL","href","Date","now","module","default","Error","plugin","manifest","name","version","pluginType","console","log","packageName","emit","error","err","String","warn","message","type","HoloPluginPackageJson","name","version","holoPlugin","injectable","execFile","promisify","createHash","existsSync","promises","fs","path","os","ArkErrors","execFileAsync","REDIS_TARBALL_PREFIX","PluginInstallerService","init_src","init_env","ClassLogger","pluginsDir","appModulesDir","installLock","Promise","resolve","redis","pluginDB","discovery","loader","env","api","create","db","d","PluginDiscoveryService","l","PluginLoaderService","instance","setPluginsDir","dir","ensurePluginsDir","log","mlog","mkdir","recursive","cleanStaleDownloads","info","registerFromDir","sourceDir","source","installedBy","pkg","JSON","parse","readFile","join","name","version","Error","installDeps","validated","validatePlugin","family","type","schema","existingSha","getSha256","HoloError","badRequest","slice","tarball","packPlugin","sha256","hash","versionedDir","split","safeWriteDir","meta","store","cacheTarball","length","seedAppModules","skipInitialPlugins","packages","scanAppModulePackages","seeded","packageDir","discovered","discoverSingle","push","e","error","message","installFromTarball","withLock","tmpDir","tmpdir","Date","now","Math","random","toString","extractTarball","rm","force","catch","installFromRegistry","packageName","spec","writeFile","stringify","private","npmCommand","installedPkgPath","installedDir","dirname","targetDir","suffix","downloadingDir","tmpFile","unlink","rename","code","uninstall","getByName","deactivate","id","del","ensurePluginById","pluginId","findOnDisk","getCachedTarball","getTarballById","actualHash","ensurePlugin","row","getByNameAndVersion","getPluginsDir","stdout","cwd","last","trim","pop","tarballPath","isAbsolute","key","set","providedPkgJson","raw","parsed","HoloPluginPackageJson","summary","pkgJson","main","entryPoint","access","lifecycleScripts","scripts","script","dangerousExts","Set","files","walkDir","totalSize","file","ext","extname","toLowerCase","has","relative","stat","size","toFixed","loaded","loadPlugin","plugin","pluginContext","logger","config","process","initialize","getState","PluginState","READY","getSchema","undefined","destroy","appModulePath","parentDir","entries","readdir","downloading","find","startsWith","i","r","setTimeout","finalDir","cp","filter","src","basename","baseDir","withFileTypes","entry","includes","fullPath","isDirectory","pluginDir","pkgPath","deps","dependencies","Object","keys","missing","require","paths","results","full","scopeDirs","entryPath","scopeEntries","pkgDir","realpath","holoPlugin","data","update","digest","get","Buffer","from","args","stderr","timeout","warn","fn","prev","then","finally","injectable","ProviderPluginService","init_src","ClassLogger","pluginProtocols","Map","protocolDB","registerProtocols","pluginId","routes","logger","mlog","protocols","get","set","routeDef","protocol","path","paths","join","dbProtocol","upsert","name","capability","warn","loadProtocolsFromDB","getByPlugin","map","p","removeProtocols","delete","getProtocol","protocolName","getProtocolByCapability","undefined","values","BaseEntityService","init_src","ClassLogger","redis","config","invalidate","id","orgId","logger","mlog","info","prefix","del","key","invalidateByOrg","keys","cached","query","get","log","result","set","ttl","suffix","injectable","ApplicationService","BaseEntityService","redis","applicationDB","prefix","ttl","getBySlug","orgId","urlSlug","cached","key","getBySlugs","slugs","results","slug","app","push","getById","applicationId","getBySlugUnscoped","invalidate","id","authKeys","keys","del","getAllByOrg","injectable","ProviderService","BaseEntityService","serverId","providerDB","redis","prefix","ttl","getProviders","list","getByName","orgId","providerName","cached","key","provider","get","organization_id","getById","id","findByPluginId","pluginId","migrateToLatestPlugin","family","latestPluginId","updatePluginId","providerId","update","plugin_id","findByPluginFamily","excludePluginId","init_entities","injectable","PluginRegistry","init_src","ClassLogger","plugins","Map","loading","installer","discovery","loader","pluginDB","getOrLoad","pluginId","existing","get","inflight","promise","loadPlugin","set","plugin","delete","has","getAsProvider","findByFamily","family","wanted","toLowerCase","candidates","values","type","PluginType","PROVIDER","push","length","Error","sort","a","b","version","localeCompare","undefined","numeric","remove","destroy","catch","loadAllActive","log","mlog","active","listActive","info","row","id","e","warn","name","message","size","allLoaded","getById","dir","ensurePluginById","sha256","discovered","discoverSingle","loaded","pluginContext","logger","config","env","process","initialize","getState","PluginState","READY","injectable","AccessService","init_entities","BaseEntityService","accessDB","redis","prefix","ttl","hasAccess","orgId","userId","applicationId","key","config","cached","get","result","set","hasModelAccess","accessModel","getAccessibleApplicationIds","getUserEmailById","getUserIdByEmail","email","trim","toLowerCase","invalidateUser","keys","del","invalidateEmail","MokuApiError","MokuTimeoutError","init_errors","Error","status","body","message","name","timeoutMs","toQueryString","params","entries","Object","filter","v","undefined","length","map","k","encodeURIComponent","String","join","MokuFetchTransport","init_errors","baseUrl","tokenSource","_fetch","timeout","options","replace","token","fetch","globalThis","bind","request","url","path","query","headers","resolveToken","body","init","method","JSON","stringify","effectiveSignal","applyTimeout","signal","response","ok","handleErrorResponse","text","parse","e","classifyError","MokuApiError","status","statusText","externalSignal","timeoutSignal","AbortSignal","any","MokuTimeoutError","DOMException","name","aborted","BaseNamespace","init_base","client","get","path","query","request","undefined","post","body","put","patch","del","AuthNamespace","init_base","BaseNamespace","validateApiKey","apiKey","post","exchangeCode","body","me","get","test","getUser","loginSuccess","params","generateUser","generateToken","userId","encodeURIComponent","getAuthProviders","listRegistrations","updateCredentials","registrationId","put","refreshRegistrations","ApplicationsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","history","filters","validateSlug","slug","byTeam","byTeamPath","path","ProvidersNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","testConnectivity","testConfig","syncModels","setEnabled","enabled","patch","ModelsNamespace","init_models","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","OrganizationsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","toggleByok","organizationId","patch","getSegments","createSegment","TeamsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","addUser","teamId","userId","removeUser","getUsers","getApplications","search","byPath","path","descendants","children","allUsers","byLevel","level","hierarchy","hierarchyFromTeam","userTeams","UsersNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","updateStatus","patch","updateRoles","checkEmail","email","CredentialsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","system","availableForProvider","listSecrets","path","getSecret","createOrUpdateSecret","deleteSecret","PromptsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","history","references","byTag","tag","filters","applicationsUsing","ProjectsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","patch","remove","del","getMembers","addMember","projectId","removeMember","memberId","updateMemberRole","getUpdates","PricingNamespace","init_pricing","init_base","BaseNamespace","listPlans","params","get","getPlan","id","encodeURIComponent","createPlan","body","post","updatePlan","put","deletePlan","del","plansByFamily","family","listSheets","planId","getSheet","sheetId","createSheet","updateSheet","deleteSheet","updateSheetModels","PluginsNamespace","init_base","BaseNamespace","list","get","getById","id","encodeURIComponent","DatasetsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","getSamples","addSamples","clearSamples","getReference","getReferences","exists","EvaluationsNamespace","init_base","BaseNamespace","listPlans","params","get","getPlan","id","encodeURIComponent","createPlan","body","post","updatePlan","put","deletePlan","del","planReference","planReferences","planExists","plansByEvaluatorPrompt","promptId","listSessions","getSession","createSession","planId","startSession","cancelSession","sessionSummary","sessionResults","sessionOverview","modelAnalytics","evaluatorAnalysis","datasetResults","getResult","resultId","sessionReferences","sessionsForComparison","exportDatasetResults","DashboardsNamespace","init_base","BaseNamespace","list","get","getById","id","encodeURIComponent","save","body","post","update","put","remove","del","refresh","generate","getSettings","saveSettings","AnalyticsNamespace","init_base","BaseNamespace","query","body","post","generateQuery","generateWidget","ServersNamespace","init_base","BaseNamespace","list","get","getById","id","encodeURIComponent","proxies","MonitoringNamespace","init_base","BaseNamespace","getRequests","params","get","getFilters","getSummary","getSchedulerStats","listQueues","queueHistory","name","encodeURIComponent","queueMetrics","queueMetricsByName","listExchanges","exchangeHistory","exchangeMetrics","healthStatus","testConnectivity","forceCollection","post","AuditNamespace","init_base","BaseNamespace","health","get","recentChanges","params","changesByUser","username","encodeURIComponent","userRevisions","userId","userAtDate","SchemasNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","put","remove","del","restore","getVersions","getVersion","versionId","getVersionById","createVersionWithMigration","suggestNextVersion","validateCompatibility","generate","getMigrationHistory","schemaId","getMigrationDetail","migrationId","rollbackMigration","reviewPerPrompt","parentId","preview","getAvailableEntities","ThreadsNamespace","init_threads","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","create","body","post","update","patch","remove","del","getMessages","AgentsNamespace","init_base","BaseNamespace","list","params","get","getById","id","encodeURIComponent","RefNamespace","init_base","BaseNamespace","teams","get","roles","roleHierarchy","providers","modelsByProvider","providerId","encodeURIComponent","prompts","models","schemas","init_models","init_pricing","init_threads","MokuClient","auth","applications","providers","models","organizations","teams","users","credentials","prompts","projects","pricing","plugins","datasets","evaluations","dashboards","analytics","servers","monitoring","audit","schemas","threads","agents","ref","transport","options","MokuFetchTransport","AuthNamespace","ApplicationsNamespace","ProvidersNamespace","ModelsNamespace","OrganizationsNamespace","TeamsNamespace","UsersNamespace","CredentialsNamespace","PromptsNamespace","ProjectsNamespace","PricingNamespace","PluginsNamespace","DatasetsNamespace","EvaluationsNamespace","DashboardsNamespace","AnalyticsNamespace","ServersNamespace","MonitoringNamespace","AuditNamespace","SchemasNamespace","ThreadsNamespace","AgentsNamespace","RefNamespace","request","method","path","body","query","init_src","init_errors","injectable","jwt","DEFAULT_TTL","TokenService","init_env","init_src","inFlight","Map","moku","redis","env","mokuUrl","MokuClient","baseUrl","getAppSlugs","token","useCache","hit","get","logger","debug","existing","p","refreshToken","then","accessToken","extractAppSlugs","slugs","length","set","finally","delete","invalidate","del","decodeToken","verify","jwtConfig","secret","algorithms","algorithm","clockTolerance","originalToken","error","data","auth","validateApiKey","warn","e","MokuApiError","status","body","name","message","appSlugs","Array","isArray","hasAppSlugs","appSlugsType","ttl","Math","max","exp","floor","Date","now","err","kind","TokenExpiredError","JsonWebTokenError","msg","tokenLen","crypto","injectable","TOKEN_PREFIX","REDIS_KEY_PREFIX","REDIS_TTL_SECONDS","HoloTokenService","init_src","ClassLogger","holoTokenDB","redisService","deactivate","id","keyHash","del","authKeys","keys","key","generate","organizationId","opts","rawToken","randomBytes","toString","createHash","update","digest","keySuffix","slice","record","create","organization_id","key_hash","key_prefix","key_suffix","pickDefined","token","verify","logger","mlog","cached","get","expires_at","Date","updateLastUsed","catch","err","error","message","getByHash","active","set","crypto","injectable","UnauthorizedError","buildAuth","tokenType","organizationId","applications","application","userId","clientIdentifier","pickDefined","extractToken","req","token","headers","h","authorization","startsWith","slice","trim","extractAppSlug","appSlug","paramsAppSlug","params","AUTH_CACHE_TTL","AuthService","init_src","init_entities","ClassLogger","tokenService","holoTokenService","applicationService","accessService","redis","authenticateHoloToken","rawToken","provider","tokenHash","createHash","update","digest","cacheKey","cached","get","holoToken","verify","message","auth","application_id","resolveAppToken","user_id","resolveUserToken","set","catch","err","log","error","authenticateJwt","useCache","logger","mlog","appSlugs","getAppSlugs","Promise","reject","includes","decodedToken","decodeToken","sub","email","getUserEmailById","info","allApplications","getBySlugs","find","a","url_slug","type","toUpperCase","filtered","filter","length","authenticateAnonymous","getBySlugUnscoped","access_level","organization_id","invalidateByTokenHash","keys","key","del","invalidateByAppSlug","getById","orgId","getBySlug","allowed","hasAccess","id","accessibleIds","getAccessibleApplicationIds","allApps","getAllByOrg","accessible","undefined","injectable","createDecipheriv","CryptoService","init_src","init_env","ClassLogger","algorithm","tagLength","encryptionKey","key","env","security","Error","Buffer","from","length","decrypt","encryptedValue","initializationVector","logger","mlog","iv","encryptedData","authTag","subarray","ciphertext","decipher","setAuthTag","decrypted","update","concat","final","toString","error","message","init_auth","injectable","DatastorePluginService","init_src","init_auth","ClassLogger","pluginDefinitions","Map","connectedImpls","datastoreDB","cryptoService","pluginRegistry","registerPluginDefinition","pluginId","plugin","set","getPluginDefinition","get","getAllPluginDefinitions","createDatastoreImpls","_plugin","logger","mlog","datastores","getEnabled","error","message","stack","ds","plugin_id","refreshDatastore","id","info","name","datastoreId","existing","instance","disconnect","e","warn","delete","datastore","getById","enabled","loaded","type","PluginType","DATASTORE","Error","config","decryptAndInjectCredential","createInstance","connect","removeImpl","getOrCreate","impl","getImplById","getAllActiveImpls","has","log","Array","from","values","removeAllImpls","connection_config","encrypted_value","initialization_vector","fieldPath","getSchema","connection","encrypted","decrypted","decrypt","setByPath","injectable","ModelMatchingService","init_src","ClassLogger","aliasDB","dictionaryDB","overrideDB","resolve","input","context","norm","normalizeModelName","normalized","unmatched","status","method","confidence","normalizedInput","candidateIds","length","sourceType","override","findMatch","pickDefined","organizationId","providerId","sourceKey","dictionaryId","dictionary_id","canonicalId","canonical_id","matchMetadata","overrideId","id","canonicalMatch","findByCanonicalIdNormalized","aliasResult","resolveByAlias","dateStripped","stripDate","strippedResult","Math","min","dateMetadata","hints","original","stripped","canonicalStripped","revisionResult","tryStrippedLookup","stripProviderRevision","quantResult","stripQuantization","channelResult","stripChannel","chainedCandidates","Set","chainedStrips","has","add","chainedResult","structuredResult","resolveByStructuredQuery","providerFamily","result","checkAliasHits","undefined","runtimeFamily","hits","findByNormalized","effective","distinctDictIds","map","h","best","aliasId","candidates","did","hit","find","score","explanation","competingCandidates","maxConfidence","logger","mlog","debug","semanticFamily","familyHint","conditions","params","idx","specificity","push","variantHint","versionHint","sizeHint","kind","kindHint","rows","systemQuery","join","baseConfidence","family","variant","version","size","r","injectable","PluginService","init_entities","init_src","BaseEntityService","versionedPlugins","Map","pluginImpls","pluginDB","serverDB","pricingDB","aliasDB","matchingService","discovery","loader","providerPluginService","pluginRegistry","datastorePluginService","redis","prefix","ttl","initializePluginSystem","serverName","log","mlog","info","discovered","discoverPluginsByType","PluginType","PROVIDER","length","loaded","loadPlugins","plugin","discoveryInfo","registerPlugin","packageName","pluginContext","logger","config","env","process","initialize","getState","PluginState","READY","manifest","name","version","warn","discoveredDatastores","DATASTORE","loadedDatastores","registeredIds","Array","from","keys","removed","syncPlugins","registerPluginProtocols","registered","pluginId","allLoaded","pluginRow","getById","set","schema","getSchema","updateSchema","family","toUpperCase","has","get","pluginType","type","tag","providerPlugin","routes","getRoutes","registerProtocols","pricingResult","registerDefaultPricing","datastorePlugin","registerPluginDefinition","createDatastoreImpls","error","message","_isLatest","npmName","Error","pluginVersion","upsert","id","loadPluginLocally","familyKey","loadProtocolsFromDB","registerServerAssociation","removePlugin","impl","destroy","e","delete","versions","deactivate","unregisterPlugin","size","getPlugins","filter","result","versionMap","values","push","getImpls","getImplById","getImplByFamily","impls","p","sheets","getPricingSheets","fallbackSheet","getDefaultPricing","undefined","sheetMap","sorted","sort","a","b","effective_from","localeCompare","latestSheet","plan","upsertPlan","setDefaultPricingPlan","totalModels","pricingData","sheet","upsertSheet","effective_to","model","models","upsertSheetModel","model_name","pickDefined","input_cost","output_cost","cache_read_cost","cache_write_cost","batch_input_cost","batch_output_cost","context_threshold","extended_input_cost","extended_output_cost","token_costs","currentModelNames","map","m","deleteStaleModels","dictResult","registerModelIdsInDictionary","modelIds","getPricingModelIds","providerFamily","toLowerCase","matched","unmatched","mid","shutdown_date","Date","resolve","model_id","sourceType","status","dictionaryId","insertPluginAliases","normalizedInput","err","String","rawModelId","normalized","baseAlias","dictionary_id","provider_family","source","source_key","active","alias","alias_normalized","alias_type","weight","dateStripped","stripDate","injectable","randomUUID","ProviderImplService","init_src","init_entities","init_auth","ClassLogger","providerImpls","Map","providerService","cryptoService","pluginRegistry","providerDB","getOrCreate","providerId","existing","get","log","mlog","provider","getById","Error","plugin_id","plugin","getOrLoad","config","decryptAndInjectCredential","impl","createProvider","id","name","set","info","getProviderImplById","warmAll","providers","list","length","pluginIds","Set","map","p","pluginId","e","error","message","has","size","getAllProviderImpls","refreshProvider","removeImpl","debug","dispose","delete","removeImplsByPluginId","toRemove","push","removeImplsByProviderIds","providerIds","upgradeProviderPlugin","targetPluginId","updatePluginId","testConnection","discoverModels","ok","String","testConnectionWithConfig","sanitizeObject","encrypted_value","initialization_vector","schema","getSchema","connection","encrypted","properties","field","prop","default","undefined","setByPath","fieldPath","decrypted","decrypt","connect","EventEmitter","injectable","QueueService","init_env","init_src","withClassLogger","isConnected","reconnectAttempts","config","env","queue","connection","channel","recreatingChannel","reconnectCallbacks","onReconnect","callback","push","logger","mlog","recreateChannel","loggedUrl","URL","url","password","info","toString","createChannel","on","err","error","message","emit","reconnect","warn","delay","reconnectDelayMs","Math","pow","setTimeout","cb","e","closeChannel","ch","close","disconnect","conn","consume","queueName","ignoreErrors","options","noAck","content","JSON","parse","requestId","ack","fields","redelivered","nack","sendToQueue","buffer","Buffer","from","stringify","defaultOptions","persistent","contentType","messageOptions","sent","debug","id","sendToExchange","exchange","routingKey","publish","stop","cancel","assertExchange","type","durable","assertQueue","pattern","bindQueue","unbindQueue","deleteQueue","catch","injectable","PluginLifecycleService","init_src","init_env","ClassLogger","serverId","loadedState","Map","reconcileTimer","installer","pluginDB","pluginService","pluginRegistry","providerImplService","providerPluginService","datastorePluginService","queueService","setServerId","setPluginsDir","dir","install","packageName","version","installedBy","log","mlog","info","meta","installFromRegistry","enable","name","installFromTarball","tarball","length","_enabledBy","pkg","getByName","Error","plugin","getOrLoad","id","registerPlugin","broadcast","pluginId","family","sha256","disable","active","removeImplsByPluginId","removeProtocols","removePlugin","uninstall","opts","force","source","unloadPlugin","catch","e","warn","message","hardDelete","reload","enabledBy","handleRemoteEnable","payload","ensurePluginById","has","loadPluginLocally","debug","handleRemoteDisable","syncEnabledPlugins","serverName","ensurePluginsDir","enabled","listActive","pluginRow","registerServerAssociation","error","handleRemoteUpdate","event","current","get","toUpperCase","slice","remove","handleEntityChanged","action","mutation","entityId","refreshProvider","removeImpl","refreshDatastore","reconcilePlugins","enabledFamilies","Set","add","set","packageDir","loadedAt","Date","now","delete","startPeriodicReconciliation","intervalMs","setInterval","stopPeriodicReconciliation","clearInterval","data","sendToExchange","env","queue","adminExchange","timestamp","container","injectable","createHash","promises","fs","watch","path","RELOAD_TIMEOUT_MS","PluginWatcherService","init_src","init_env","ClassLogger","watcher","knownHashes","Map","reloadInFlight","Set","reloadTimeouts","debounceTimers","debounceMs","pluginsDir","installer","discovery","pluginDB","resolve","env","api","create","instance","startWatching","log","mlog","access","warn","pluginDirs","scanPluginDirs","dir","hash","hashDistContents","set","key","recursive","_event","filename","onFileChange","info","length","stopWatching","close","timer","values","clearTimeout","clear","timeout","includes","startsWith","fullPath","join","findPluginDir","then","pluginDir","relative","has","debounce","handleChange","knownDir","handleRemoval","catch","e","debug","message","fn","existing","get","setTimeout","delete","error","add","discovered","discoverSingle","newHash","previousHash","isNewVersion","meta","registerFromDir","isRegistered","LoggerFactoryToken","family","PluginLifecycleService","lifecycle","packageName","version","enable","reload","t","parts","split","pop","pluginRow","getByNameAndVersion","deactivate","id","changedPath","i","stat","isDirectory","dirname","results","scanVersions","pkgDir","subEntries","readdir","withFileTypes","sub","isSymbolicLink","versionDir","name","push","topEntries","entry","entryPath","scopeEntries","scopeEntry","distDir","files","walkDir","sort","file","content","readFile","update","slice","digest","entries","full","init_plugin","injectable","PRICING_CACHE_TTL","PricingService","init_src","ClassLogger","pricingDB","costDB","providerDB","pluginDB","pluginService","db","dictionaryDB","modelDB","redis","calculateAndInsertCosts","responseId","response","logger","mlog","provider","getById","provider_id","warn","plan","pricing_plan_id","cachedPlan","plugin_id","plugin","default_pricing_plan_id","debug","name","type","responseTime","Date","created_at","sheet","cachedSheet","id","modelPricing","resolveModelPricing","access_model","tokenBreakdown","metadata","token_breakdown","pluginImpl","getImplByFamily","costResult","calculateCost","costRecord","response_id","cost_type","CostType","PROVIDER","pricing_sheet_id","input_tokens","input","output_tokens","output","cache_read_tokens","cache_read","cache_write_tokens","cache_write","input_cost","output_cost","cache_read_cost","detail","cost","cache_write_cost","total_cost","currency","insert","updateResponseCost","toFixed","tokens","extractTokens","computeCost","cacheRead","cacheWrite","inputCost","outputCost","cacheReadCost","cacheWriteCost","totalCost","calculateCosts","findPlanById","findEffectiveSheet","recalculateCosts","result","bulkRecalculate","recalculateCostsForDateRange","from","to","providerId","conditions","params","toISOString","push","length","info","join","rowCount","planId","key","cached","get","set","date","dateStr","slice","whereClause","asSystem","client","query","insertQuery","insertResult","rows","row_count","sheetId","accessModel","model","getByAccessModel","normalized","normalizeModelName","pickDefined","modelId","dictionaryId","dictionary_id","normalizedName","dictEntry","findByAlias","family","findModelPricing","usageRaw","usage_raw","cache_read_input_tokens","cached_tokens","cache_creation_input_tokens","pricing","inputCostPerToken","Number","outputCostPerToken","context_threshold","extended_input_cost","extended_output_cost","totalInput","injectable","IDENTIFIER_RE","CANONICAL_REQUEST_KEYS","CANONICAL_RESPONSE_KEYS","CANONICAL_COST_KEYS","DatastoreService","init_src","Set","ClassLogger","datastorePluginService","getActiveDatastores","impls","getAllActiveImpls","map","datastore","instance","impl","mapping","testConnection","datastoreId","getOrCreate","error","ok","Error","message","String","testConnectionWithConfig","pluginId","config","plugin","getPluginDefinition","createInstance","connect","result","disconnect","validateMapping","errors","section","m","test","table","push","canonicalKeys","targetCol","sourceField","Object","entries","fields","startsWith","has","valid","length","validateConfig","apiCredentialId","schema","getSchema","required","connection","encrypted","field","undefined","maskEncryptedFields","maskedConfig","connection_config","key","keys","masked","injectable","AuditMappingService","init_src","ClassLogger","applyRequestMapping","mappingSection","data","applyFields","fields","request","applyResponseMapping","response","applyCostMapping","responseId","costSource","cost","response_id","primarySource","result","targetColumn","sourceField","Object","entries","startsWith","getNestedValue","_raw","slice","obj","path","parts","split","current","part","inject","injectable","AuditService","init_src","init_notification","init_plugin","ClassLogger","providerImplService","notificationDB","requestDB","responseDB","pricingService","datastoreService","mappingService","log","info","logRequest","record","logger","mlog","startTime","Date","now","ai","getProviderImplById","provider","id","normalizedRequest","auditRequest","auditData","request","_raw","insert","request_id","datastores","getActiveDatastores","length","fanOutToDatastores","requestId","error","Error","message","duration","logResponse","envelope","auditor","createWorkerResponseEnvelope","workerId","normalizedResponse","auditResponse","providerEvent","costData","calculateCosts","pricingError","warn","response","cost","result","debug","calculateAndInsertCosts","logNotification","content","JSON","stringify","results","Promise","allSettled","map","impl","mapping","writeToDatastore","i","entries","ds","datastore","fields","datastoreId","datastoreName","name","pluginId","plugin_id","status","reason","data","applyRequestMapping","write","table","responseRecord","applyResponseMapping","total_cost","costRecord","applyCostMapping","updateResponseCost","init_errors","type","GuardResultPassValidator","GuardResultFailValidator","GuardResultValidator","GuardResultSchema","passed","brand","errors","or","init_types","init_errors","asyncHandler","fn","req","res","next","catch","writeWireToResponse","chunks","headersSent","wire","headers","status","Object","entries","forEach","k","v","setHeader","body","write","Promise","resolve","once","done","end","BaseController","init_api","init_src","ClassLogger","handleError","error","message","statusCode","logger","mlog","JSON","stringify","methodName","json","success","code","name","process","env","NODE_ENV","stack","timestamp","Date","toISOString","parsePagination","req","defaultSort","page","Math","max","parseInt","query","limit","min","MAX_LIMIT","DEFAULT_LIMIT","sort_by","rawDir","sort_dir","toLowerCase","ALLOWED_SORT_DIRS","has","offset","paginatedResponse","data","total","params","success","pagination","total_pages","ceil","timestamp","Date","toISOString","Set","findLast","arr","pred","i","length","v","undefined","filterJoin","items","predicate","toString","separator","out","item","s","init_api","injectable","ResponseService","init_env","init_src","init_api","ClassLogger","serverId","env","api","apiServerId","responseQueue","queue","requestExchange","queues","Map","queueService","startLLMResponseConsumer","queueName","consume","id","content","processWireChunk","_id","wire","logger","mlog","requestId","get","warn","push","done","debug","fullText","body","end","delete","sendRequest","req","res","request","AsyncEventQueue","set","on","info","sendRequestToExchange","writeWireToResponse","error","message","headersSent","status","requestOnce","timeoutMs","timeout","Promise","_","reject","setTimeout","Error","acc","race","correlationId","exchange","sendToExchange","sendResponseChunk","sourceId","data","responseExchange","sendToAudit","WorkerRequestFactory","init_worker_request_factory","init_src","init_provider","logger","child","className","fromRequest","provider","protocol","req","sourceId","application","isPassthrough","auth","body","headers","query","path","method","Error","thread_id","branch_id","payload","workerRequest","create","pickDefined","passthroughPath","replace","type","httpRequestDetails","authFields","organizationId","userId","tokenType","clientIdentifier","appSlug","url_slug","name","createWorkerRequest","isStreaming","stream","threadId","branchId","injectable","GuardService","init_types","init_env","init_src","init_plugin","init_worker_request_factory","init_entities","ClassLogger","serverId","env","api","apiServerId","responseService","providerService","pluginService","providerPluginService","guard","provider","workerRequest","guards","auth","logger","mlog","debug","length","requestId","requestPlugin","plugin","Error","name","request","translator","toHoloRequest","payload","holoMessages","messages","lastMessage","findLast","m","undefined","warn","role","methodName","lastContent","Array","isArray","content","filterJoin","x","type","text","results","Promise","all","map","index","id","model","startTime","Date","now","provider_id","passed","guardProvider","getById","guardPlugin","getImplById","plugin_id","guardProtocol","getProtocolByCapability","ProtocolCapability","CHAT","getProtocol","defaultProtocol","holoRequest","pickDefined","user_prompt","response_format","schema","GuardResultSchema","strict","stream","system_prompt","system","fromHoloRequest","guardRequest","WorkerRequestFactory","create","threadId","branchId","info","JSON","stringify","response","requestOnce","raw","parse","holoResponse","toHoloResponse","output","errors","guardResponse","result","duration","e","error","message","String","reduced","reduce","acc","r","push","guardResult","errorCount","join","stack","injectable","InitService","init_env","init_plugin","serverId","env","api","apiServerId","pluginService","pluginInstallerService","pluginLifecycleService","pluginRegistry","pluginWatcherService","providerImplService","responseService","queueService","redisService","serverDB","init","connect","staleCount","deactivateStaleServers","logger","info","ensurePluginsDir","seedAppModules","loadAllActive","setServerId","warmAll","registerPluginProtocols","setupQueues","startLLMResponseConsumer","pluginWatchEnabled","startWatching","debug","_setupGlobalExchanges","_setupRequestQueues","_setupResponseQueues","_setupNotificationQueues","assertExchange","queue","requestExchange","responseExchange","notificationExchange","adminExchange","adminResponseExchange","directExchange","assertQueue","requestQueue","durable","auditRequestQueue","responseQueueName","responseQueue","arguments","queueExpiration","auditResponseQueue","auditRoutingKey","auditNotificationQueue","injectable","randomUUID","NotificationService","init_src","init_notification","init_env","ClassLogger","exchange","env","queue","notificationExchange","queuePrefix","notificationQueue","consumers","Map","bindingRefs","subs","queueService","on","handleChannelLost","publish","event","rk","NotificationTopic","publishKey","organizationId","userId","appSlug","sendToExchange","correlationId","id","subscribe","filter","Error","userKey","q","AsyncEventQueue","ensureUserQueueConsumer","bindingKey","userApp","addBindingRef","m","get","set","sub","pickDefined","unsubscribe","entries","delete","end","releaseBindingRef","size","existing","started","queueName","api","apiServerId","assertQueue","durable","arguments","queueExpiration","consume","_id","content","fanoutToUser","binding","n","c","bindQueue","unbindQueue","ev","logger","mlog","notified","values","matchesFilter","push","info","type","err","failed","fail","clear","warn","matchesUser","matchesThread","threadId","threadIds","includes","requestIds","length","requestId","branchIds","branchId","types","inject","injectable","matchRoute","routes","method","nativePath","wantMethod","toLowerCase","requestSegments","split","filter","s","length","route","path","paths","routeSegments","match","i","startsWith","undefined","RequestService","init_env","init_worker_request_factory","init_src","init_notification","init_plugin","init_entities","init_auth","ClassLogger","serverId","env","api","apiServerId","responseService","guardService","providerImplService","providerPluginService","accessService","pluginDB","pluginRegistry","providerService","notificationService","processCustomRequest","wireFamily","appSlug","req","res","logger","mlog","wirePlugin","findByFamily","getRoutes","HoloError","notFound","streaming","body","stream","query","alt","protocolName","protocol","name","debug","auth","Error","application","unauthorized","capability","status","json","listModelsForApps","processRequest","modelName","getModelNameFromRequest","badRequest","model","provider","targetProvider","resolveModelProvider","userId","hasModelAccess","organizationId","id","forbidden","targetPluginRow","getById","plugin_id","targetFamily","family","wireFamilyLower","sameProviderAsApp","provider_id","targetPlugin","getOrLoad","targetProtocolName","getProtocolByCapability","targetProtocol","getProtocol","info","workerRequest","parseRequest","isHoloNative","wireProtocolName","publish","NotificationEventFactory","fromAuthAndRequest","sendRequest","requestId","apps","providerToNames","Map","a","m","models","names","get","set","Set","add","canonicalGroups","Promise","all","Array","from","entries","map","providerId","impl","getProviderImplById","discoverModels","has","accessModel","canonical","flat","formatModelsResponse","find","access_model","url_slug","isPassthrough","applications","familyLower","candidate","candidateProvider","candidatePlugin","plugin","guards","guardDetails","g","JSON","stringify","results","guard","passed","WorkerRequestFactory","fromRequest","injectable","AdminService","init_env","queueService","serverDB","registerServer","name","type","server","upsert","Error","restartWorker","workerId","_payload","logger","info","response","status","setTimeout","process","exit","error","message","sendAdminResponse","routingKey","messageId","data","sendToExchange","env","queue","adminResponseExchange","timestamp","Date","now","injectable","v4","uuidv4","validate","isUUID","HoloRequestService","init_src","init_plugin","init_env","ClassLogger","serverId","env","api","apiServerId","modelDB","providerDB","applicationDB","protocolDB","providerPluginService","resolveTarget","auth","request","application","resolveFromApplication","model","resolveFromModel","HoloError","badRequest","resolveTargetForCapability","capability","protocolName","provider","resolveProvider","protocol","resolveProtocol","plugin_id","target","findProtocolByCapability","pluginId","cached","getProtocolByCapability","protocols","getByPlugin","find","p","fallbackCapability","ProtocolCapability","CHAT","name","buildWorkerRequest","rawRequest","pickDefined","organizationId","sourceId","appSlug","url_slug","userId","clientIdentifier","tokenType","requestId","payload","timestamp","Date","toISOString","isStreaming","stream","threadId","thread_id","branchId","branch","httpRequestDetails","isHoloNative","guards","systemPrompt","system_prompt","logger","mlog","slug","getBySlug","notFound","findChatProtocol","getDefaultModel","info","modelRef","getById","provider_id","access_model","models","listByProvider","id","m","list","apps","applications","hasAccess","some","app","forbidden","ref","get","length","init_worker_request_factory","init_auth","init_entities","init_plugin","errorMiddleware","init_src","err","req","res","_next","isHoloError","HoloError","statusCode","code","logFn","logger","warn","error","message","stack","url","method","status","json","success","process","env","NODE_ENV","timestamp","Date","toISOString","matchesPattern","origin","pattern","includes","escaped","replace","RegExp","test","isOriginAllowed","env","security","corsAllowedOrigins","some","p","corsMiddleware","init_env","req","res","next","headers","header","method","status","end","makeAuthMiddleware","authService","opts","useCache","optional","allowJwt","allowHoloToken","allowAnonymous","providerFamily","authenticate","req","_res","next","token","extractToken","clientIdentifier","headers","appSlug","extractAppSlug","startsWith","auth","authenticateHoloToken","authenticateJwt","authenticateAnonymous","error","errorMessage","Error","message","String","HoloError","forbidden","unauthorized","init_src","injectable","Router","PluginRouteService","init_src","init_auth","ClassLogger","apiRouter","authService","pluginRegistry","requestService","pluginDB","registerRoutes","router","log","mlog","info","registeredFamilies","Set","pluginId","plugin","allLoaded","type","PluginType","PROVIDER","family","toUpperCase","has","add","pluginRow","getById","registerPluginRoute","pluginImpl","target","warn","toLowerCase","name","pluginRouter","authMiddleware","makeAuthMiddleware","useCache","providerFamily","route","getRoutes","handler","RouteHandler","MODELS","createModelsHandler","REQUEST","createRequestHandler","protocol","createNoOpHandler","method","paramInjector","createParamInjector","path","paths","active","use","req","_res","next","params","key","value","Object","entries","body","undefined","streaming","stream","query","alt","res","auth","status","json","error","apps","application","applications","listModelsForApps","message","protocolName","processRequest","e","debug","JSON","stringify","fetchOpenRouterModels","now","Date","cachedModels","cacheExpiry","res","fetch","OPENROUTER_API_URL","ok","Error","status","body","json","data","CACHE_TTL_MS","toSourceModels","orModels","results","orModel","slash","id","indexOf","prefix","substring","suffix","providerFamily","PROVIDER_PREFIX_TO_FAMILY","arch","architecture","pricing","push","source","externalId","canonicalCandidate","canonical_slug","name","canInsert","pickDefined","description","contextLength","context_length","modality","inputModalities","input_modalities","outputModalities","output_modalities","supportedParameters","supported_parameters","capabilities","default_parameters","undefined","input","prompt","parseFloat","output","completion","metadata","tokenizer","created","init_src","anthropic","openai","google","meta","mistralai","cohere","deepseek","qwen","isBaseModel","key","GATEWAY_PREFIXES","some","p","startsWith","REGIONAL_MARKERS","m","includes","extractBaseModelId","slashIdx","indexOf","substring","dotIdx","prefix","LITELLM_PROVIDER_TO_FAMILY","fetchLiteLLMModels","now","Date","cachedData","cacheExpiry","res","fetch","LITELLM_URL","ok","Error","status","json","CACHE_TTL_MS","buildCapabilities","model","caps","supports_function_calling","function_calling","supports_vision","vision","supports_prompt_caching","prompt_caching","supports_reasoning","reasoning","supports_pdf_input","pdf_input","supports_computer_use","computer_use","Object","keys","length","undefined","inferProviderFamily","litellm_provider","family","toLiteLLMSourceModels","data","results","entries","baseId","providerFamily","contextLength","max_input_tokens","max_tokens","push","source","externalId","canonicalCandidate","name","canInsert","pickDefined","capabilities","pricing","input","input_cost_per_token","output","output_cost_per_token","cacheRead","cache_read_input_token_cost","cacheWrite","cache_creation_input_token_cost","metadata","mode","max_output_tokens","init_src","openai","anthropic","google","mistral","cohere","deepseek","isLikelyBaseModel","model","id","toLowerCase","inferProviderFamily","QUANTIZATION_SUFFIXES","some","s","endsWith","includes","startsWith","prefix","substring","indexOf","knownOrgPrefixes","family","FAMILY_TO_PROVIDER","Object","entries","undefined","buildCapabilities","caps","reasoning","tool_call","attachment","structured_output","keys","length","convertStatus","status","fetchModelsDevModels","now","Date","cachedModels","cacheExpiry","res","fetch","MODELSDEV_URL","ok","Error","body","json","flat","provider","values","models","push","CACHE_TTL_MS","toModelsDevSourceModels","results","PER_MILLION","providerFamily","canInsert","cost","limit","entry","source","externalId","name","context","contextLength","modalities","input","inputModalities","output","outputModalities","open_weights","isOpenSource","release_date","releaseDate","capabilities","p","cache_read","cacheRead","cache_write","cacheWrite","pricing","meta","knowledge","metadata","gpt","claude","gemini","llama","mistral","command","deepseek","qwen","phi","gemma","generateAliases","dictionaryId","canonicalId","providerFamily","canonicalSlug","aliases","seen","Set","add","raw","type","weight","norm","normalizeModelName","key","normalized","has","push","dictionary_id","alias","alias_normalized","alias_type","provider_family","source","source_key","active","slash","indexOf","suffix","substring","undefined","includes","replace","slugSlash","slugSuffix","dateMatch","match","hyphenated","sourceBase","base","dateStripped","dateHint","stripDate","revisionStripped","stripProviderRevision","channelStripped","stripChannel","dateOrRevStripped","chainedChannel","shorthandBase","permBase","versionHint","dashVersion","dotVersion","sizeHint","familyHint","family","version","size","variantHint","normalizeKey","id","normalizeModelName","normalized","strippedVariants","variants","ds","stripDate","push","rs","stripProviderRevision","cs","stripChannel","tryMatchCluster","candidateId","clusters","clusterIndex","directKey","get","variant","variantKey","undefined","resolveField","field","observations","extractor","precedence","FIELD_PRECEDENCE","source","obs","val","mergeCapabilities","merged","hasAny","reverse","capabilities","Object","keys","length","assign","buildCandidate","cluster","candidate","canonicalId","canonicalIdNormalized","name","providerFamily","sources","Set","map","o","description","contextLength","inputModalities","outputModalities","supportedParameters","defaultParameters","dp","default_parameters","tokenizer","metadata","isOpenSource","releaseDate","pricing","buildCanonicalCandidates","Map","decisions","unmatchedEnrichment","insertCapable","filter","canInsert","enrichmentOnly","sourceOrder","sort","a","b","ai","indexOf","bi","canonicalCandidate","externalId","existing","key","set","has","resolved","values","candidateKey","matchedObservationIds","unmatchedObservationIds","reasons","join","buildObservationAliases","dictionaryId","candidate","aliases","seen","Set","obs","observations","norm","normalizeModelName","externalId","key","normalized","providerFamily","source","has","add","aliasType","SOURCE_TO_ALIAS_TYPE","includes","prefix","substring","indexOf","alias","dictionary_id","alias_normalized","alias_type","source_key","weight","active","provider_family","push","buildPayload","payload","canonical_id","canonicalId","canonical_id_normalized","canonicalIdNormalized","name","sources","description","contextLength","context_length","inputModalities","input_modalities","outputModalities","output_modalities","supportedParameters","supported_parameters","defaultParameters","default_parameters","capabilities","tokenizer","kind","isOpenSource","is_open_source","releaseDate","release_date","pricing","input","base_input_cost","output","base_output_cost","cacheRead","base_cache_read_cost","cacheWrite","base_cache_write_cost","publishCanonicalCandidates","candidates","deps","inserted","updated","aliasesCreated","errors","row","upsertCanonicalRow","orObs","find","o","canonicalSlug","metadata","undefined","generatedAliases","generateAliases","id","observationAliases","allAliases","deduplicateAliases","length","count","bulkInsertAliases","err","Error","message","String","Map","existing","get","set","values","openrouter","litellm","modelsdev","tryMatchDictionary","normalized","deps","providerFamily","tryMatchChain","direct","findByNormalized","alias","findByAliasNormalized","strippers","stripDate","stripProviderRevision","stripQuantization","stripChannel","strip","stripped","match","aliasMatch","extractEnrichFields","obs","fields","contextLength","pricing","capabilities","Object","keys","length","isOpenSource","releaseDate","determineOverwriteKeys","source","enrichUnmatchedObservations","observations","matched","enriched","unmatched","errors","candidateId","canonicalCandidate","externalId","normalizeModelName","overwriteKeys","enrichUpdate","id","err","push","Error","message","String","runPipeline","deps","orModels","litellmData","modelsdevModels","Promise","all","fetchOpenRouterModels","then","toSourceModels","fetchLiteLLMModels","toLiteLLMSourceModels","fetchModelsDevModels","toModelsDevSourceModels","resolved","unmatchedEnrichment","buildCanonicalCandidates","published","publishCanonicalCandidates","enriched","enrichUnmatchedObservations","init_src","injectable","ModelDiscoveryService","init_plugin","init_entities","init_src","ClassLogger","modelDB","dictionaryDB","providerImplService","providerService","matchingService","discover","providerResults","discoverFromProviders","relinkModels","providers","logger","mlog","unlinked","listUnlinked","linked","unmatched","model","accessModel","access_model","result","resolve","providerId","provider_id","sourceType","pickDefined","providerFamily","provider_type","dictionaryId","dictEntry","findByCanonicalId","canonicalId","update","id","dictionary_id","raw_name","normalized_name","normalizedInput","match_status","status","match_confidence","confidence","match_method","method","match_metadata","matchMetadata","matched_at","Date","toISOString","source_type","family_detected","family","modality","info","length","syncProviderModels","created","updated","unavailable","matched","errors","impl","getProviderImplById","provider","getById","type","discovered","discoverModels","existing","listAllByProvider","existingByAccess","Map","map","m","discoveredAccessModels","Set","add","ex","get","updateFields","available","name","description","version","contextLength","context_length","metadata","matchResult","record","parameters","enabled","deleted","source_key","undefined","input_modalities","inputModalities","output_modalities","outputModalities","supported_parameters","push","create","has","err","msg","Error","message","String","error","providerImpls","getAllProviderImpls","getProviders","providerMap","p","results","createModel","needsUpdate","total","reduce","s","r","findByAlias","injectable","DictionarySyncService","init_src","ClassLogger","dictionaryDB","aliasDB","discoveryService","syncAll","logger","mlog","info","result","runPipeline","upsertCanonicalRow","entry","upsertCanonical","bulkInsertAliases","aliases","bulkInsert","findByNormalized","n","findByCanonicalIdNormalized","then","r","id","canonical_id","findByAliasNormalized","pf","rows","length","dictionary_id","enrichUpdate","f","ok","s","published","inserted","aliasesCreated","enriched","relink","relinkModels","container","Lifecycle","separatePluginDirs","installerLifecycle","init_notification","init_env","env","worker","pluginsDir","api","audit","Transient","Singleton","registerSingleton","AppDB","RedisService","CryptoService","NotificationServiceToken","NotificationService","NotificationStoreToken","PostgresNotificationStore","PluginService","PluginDiscoveryService","PluginLoaderService","ProviderPluginService","ProviderImplService","ProviderService","PluginRouteService","register","PluginInstallerService","useClass","lifecycle","PluginLifecycleService","PluginRegistry","PluginWatcherService","ModelDictionaryAliasDB","ModelMatchOverrideDB","ModelMatchingService","DictionarySyncService","DatastoreDB","DatastorePluginService","DatastoreService","AuditMappingService","container","registerSingleton","ResponseService","TokenService","HoloTokenDB","HoloTokenService","ProviderDB","AccessDB","AccessService","ApplicationService","ApplicationDB","ModelDB","RequestDB","ResponseDB","PricingDB","ProviderResponseCostDB","PricingService","ProtocolDB","HoloRequestService","BaseServer","init_src","ClassLogger","id","type","initialized","shuttingDown","args","__className","name","init","log","mlog","onInit","info","shutdown","onShutdown","start","registerProcessHandlers","error","handleError","process","exit","Promise","resolve","onError","_error","signal","on","logger","err","message","stack","reason","Error","String","container","injectable","withDB","Base","WithDBServer","db","id","type","serverDB","pingTimer","heartbeatTimer","serverId","args","resolve","AppDB","logger","debug","env","appDb","Error","ServerDB","onError","error","onInit","connect","server","upsert","info","recordHeartbeat","setInterval","ping","err","message","PING_INTERVAL_MS","HEARTBEAT_INTERVAL_MS","onShutdown","clearInterval","disconnect","init_env","container","injectable","withQueue","Base","WithQueueServer","queueService","args","resolve","QueueService","Error","onError","error","onInit","logger","debug","connect","onShutdown","disconnect","container","injectable","withAdmin","Base","WithAdminServer","withQueue","id","type","adminHandlers","Map","adminCommandQueue","adminExchange","adminService","pluginLifecycleService","args","env","queue","resolve","AdminService","PluginLifecycleService","onInit","logger","debug","commandQueue","exchange","queueService","assertExchange","assertQueue","exclusive","durable","autoDelete","bindQueue","setServerId","set","_serverId","payload","handleRemoteEnable","success","handleRemoteDisable","handleRemoteUpdate","action","handleEntityChanged","onReconnect","info","reconcilePlugins","api","pluginReconcileIntervalMs","startPeriodicReconciliation","consume","messageId","content","_message","serverId","timestamp","handler","get","response","warn","message","error","sendAdminResponse","onShutdown","onError","init_env","injectable","withStats","Base","WithStatsServer","stats","args","chatErrors","chatRequests","chatSuccesses","chatTime","generateErrors","generateRequests","generateSuccesses","generateTime","startTime","Date","totalErrors","totalProcessingTime","totalRequests","totalSuccesses","onError","error","onInit","onShutdown","init_mixins","injectable","AppController","BaseController","requestService","resolveRequest","req","res","provider","appSlug","params","nativePath","processCustomRequest","express","container","createCustomApplicationRoutes","apiRouter","Router","customUrlController","resolve","AppController","authService","AuthService","auth","makeAuthMiddleware","all","asyncHandler","resolveRequest","init_api","inject","injectable","normalizeQueryValues","values","normalized","flatMap","value","Array","isArray","split","map","trim","filter","Boolean","length","undefined","NotificationController","init_src","init_notification","BaseController","notificationService","stream","req","res","logger","mlog","auth","status","send","organizationId","userId","clientIdentifier","application","threadIds","query","threadId","thread_id","pickDefined","appSlug","url_slug","setHeader","flushHeaders","write","hb","setInterval","Date","now","sub","closed","close","clearInterval","unsubscribe","id","e","end","on","ev","matchesUser","matchesThread","includes","chunk","type","JSON","stringify","Promise","resolve","once","subscribe","q","error","message","ts","severity","payload","stringifyAny","express","container","createNotificationRoutes","apiRouter","Router","notificationController","resolve","NotificationController","get","asyncHandler","stream","init_api","injectable","maskToken","token","key_hash","rest","TokenController","init_src","BaseController","holoTokenService","holoTokenDB","create","req","res","auth","user_id","application_id","name","expires_at","body","HoloError","badRequest","record","generate","organizationId","pickDefined","Date","undefined","status","json","list","query","tokens","getByUser","getByApplication","getByOrganization","map","get","getById","params","id","organization_id","notFound","deactivate","deactivated","express","container","createTokenRoutes","router","Router","controller","resolve","TokenController","post","asyncHandler","create","get","list","delete","deactivate","injectable","PricingController","init_src","BaseController","pricingService","recalculate","req","res","from","to","provider_id","body","HoloError","badRequest","fromDate","Date","toDate","isNaN","getTime","result","recalculateCostsForDateRange","json","success","data","row_count","rowCount","total_cost","totalCost","toISOString","timestamp","express","container","createPricingRoutes","router","Router","controller","resolve","PricingController","post","asyncHandler","recalculate","injectable","CacheController","init_src","init_env","BaseController","redis","queueService","providerDB","datastoreDB","pluginDB","invalidateProvider","req","res","provider_id","org_id","provider_name","body","log","info","caller","auth","userId","deleted","del","scanDelete","provider","getById","broadcastEntityChanged","plugin_id","providers","listActiveByOrgId","p","id","e","warn","message","json","success","data","timestamp","Date","toISOString","invalidateDatastore","datastore_id","ds","datastores","getByOrg","invalidateApplication","application_id","url_slug","invalidateAccess","user_id","email","trim","toLowerCase","invalidateUser","invalidateAuth","token_hash","app_slug","substring","undefined","invalidateOrg","HoloError","badRequest","action","entityId","pluginId","family","plugin","event","mutation","serverId","env","api","apiServerId","ts","now","sendToExchange","queue","adminExchange","pattern","keys","key","express","container","createCacheRoutes","router","Router","controller","resolve","CacheController","post","asyncHandler","invalidateProvider","invalidateDatastore","invalidateApplication","invalidateAccess","invalidateAuth","invalidateOrg","invalidateUser","injectable","ProviderCrudController","init_src","init_env","BaseController","providerDB","pluginDB","queueService","providerImplService","list","req","res","p","parsePagination","org_id","enabled","search","query","filters","undefined","result","listPaginated","limit","offset","sort_by","sort_dir","json","paginatedResponse","rows","total","get","provider","getById","params","id","HoloError","notFound","success","data","timestamp","Date","toISOString","create","body","badRequest","broadcastProviderChanged","plugin_id","status","update","remove","existing","deleted","softDelete","upgradePlugin","pluginVersion","currentPlugin","targetPlugin","getByFamilyAndVersion","family","providerId","pluginId","testConnection","testConnectionWithConfig","connection_config","mutation","plugin","event","action","entityId","serverId","env","api","apiServerId","ts","now","sendToExchange","queue","adminExchange","e","log","warn","message","express","container","createProviderRoutes","router","Router","controller","resolve","ProviderCrudController","post","asyncHandler","testConnectionWithConfig","get","list","create","put","update","delete","remove","upgradePlugin","testConnection","injectable","ApplicationCrudController","init_src","BaseController","applicationDB","list","req","res","p","parsePagination","org_id","provider_id","search","query","result","listPaginated","limit","offset","sort_by","sort_dir","json","paginatedResponse","rows","total","get","app","getById","params","id","HoloError","notFound","success","data","timestamp","Date","toISOString","create","body","badRequest","status","update","remove","deleted","softDelete","express","container","createApplicationRoutes","router","Router","controller","resolve","ApplicationCrudController","get","asyncHandler","list","post","create","put","update","delete","remove","injectable","ModelCrudController","init_src","BaseController","modelDB","discoveryService","dictionarySyncService","list","req","res","p","parsePagination","org_id","provider_id","search","query","result","listPaginated","limit","offset","sort_by","sort_dir","json","paginatedResponse","rows","total","get","model","getById","params","id","HoloError","notFound","success","data","timestamp","Date","toISOString","create","body","badRequest","status","update","remove","deleted","softDelete","sync","_req","discover","syncDictionary","syncAll","syncProvider","providerId","syncProviderModels","express","container","createModelRoutes","router","Router","controller","resolve","ModelCrudController","get","asyncHandler","list","post","sync","syncDictionary","syncProvider","create","put","update","delete","remove","injectable","ResponseCrudController","init_src","BaseController","responseDB","costDB","list","req","res","p","parsePagination","q","query","result","listPaginated","org_id","application_id","provider_id","access_model","user_id","client_identifier","status","from","to","limit","offset","sort_by","sort_dir","json","paginatedResponse","rows","total","get","response","getById","params","id","HoloError","notFound","costs","findByResponseId","success","data","timestamp","Date","toISOString","filters","getFilters","express","container","createResponseRoutes","router","Router","controller","resolve","ResponseCrudController","get","asyncHandler","filters","list","injectable","RequestCrudController","init_src","BaseController","requestDB","list","req","res","p","parsePagination","q","query","result","listPaginated","org_id","application_id","provider_id","access_model","user_id","from","to","limit","offset","sort_by","sort_dir","json","paginatedResponse","rows","total","get","request","getById","params","id","HoloError","notFound","success","data","timestamp","Date","toISOString","express","container","createRequestRoutes","router","Router","controller","resolve","RequestCrudController","get","asyncHandler","list","inject","injectable","HoloController","init_src","init_notification","BaseController","holoRequestService","responseService","guardService","providerImplService","modelDB","applicationDB","protocolDB","notificationService","chat","req","res","logger","mlog","auth","HoloError","unauthorized","holoRequest","body","appSlug","headers","application","target","resolveTarget","protocol","resolveProtocol","provider","plugin_id","ProtocolCapability","CHAT","workerRequest","buildWorkerRequest","path","method","query","guards","length","getProviderImplById","id","publish","NotificationEventFactory","fromAuthAndRequest","result","guard","passed","sendRequest","info","requestId","generate","model","messages","role","content","prompt","stream","max_tokens","temperature","top_p","stop_sequences","resolveTargetForCapability","GENERATE","payload","embed","EMBED","countTokens","METRICS","cancel","params","json","success","data","cancelled","timestamp","Date","toISOString","listModels","models","capsByPlugin","Promise","all","listWithProvider","listActiveGrouped","family","capability","inputModality","input_modality","map","m","pickDefined","access_model","name","provider_family","provider_type","capabilities","get","context_length","modality","input_modalities","output_modalities","supported_parameters","metadata","filter","toLowerCase","includes","listApplications","apps","getAllByOrg","organizationId","app","slug","url_slug","type","has_system_prompt","system_prompt","has_guards","defaultModel","default_model","getApplication","getBySlug","notFound","express","container","createHoloChatRoutes","router","Router","controller","resolve","HoloController","post","asyncHandler","chat","cancel","createHoloGenerateRoutes","generate","createHoloEmbedRoutes","embed","createHoloMetricsRoutes","countTokens","createHoloModelRoutes","get","listModels","createHoloApplicationRoutes","listApplications","getApplication","injectable","PluginController","init_src","BaseController","lifecycle","pluginDB","pluginService","pluginRegistry","serverDB","list","_req","res","packages","listAll","plugins","getPlugins","json","map","p","enrichWithSchema","status","req","family","params","toUpperCase","allPkgs","pkg","find","plugin","package","upload","body","Buffer","isBuffer","length","HoloError","badRequest","meta","installFromTarball","auth","userId","install","packageName","version","enable","findByFamily","name","disable","reload","uninstall","force","serverPlugins","getPluginsByServer","serverName","server","schema","impl","get","id","getSchema","notFound","express","container","createPluginRoutes","router","Router","controller","resolve","PluginController","get","asyncHandler","list","status","post","raw","type","limit","upload","install","enable","disable","reload","uninstall","serverPlugins","injectable","DatastoreController","init_src","init_env","BaseController","datastoreService","datastoreDB","queueService","pluginDB","list","req","res","orgId","requireOrg","datastores","getByOrg","json","map","ds","maskEncryptedFields","plugin_id","getById","id","params","getByIdAndOrg","HoloError","notFound","create","name","connection_config","mapping","enabled","api_credential_id","body","badRequest","configResult","validateConfig","valid","errors","join","mappingResult","validateMapping","insert","organization_id","broadcastDatastoreChanged","update","existing","effectiveCredentialId","remove","deactivate","status","testConnection","result","testConnectionWithConfig","mutation","datastoreId","pluginId","family","plugin","event","action","entityId","serverId","env","api","apiServerId","ts","Date","now","sendToExchange","queue","adminExchange","e","log","warn","message","auth","organizationId","unauthorized","express","container","createDatastoreRoutes","router","Router","controller","resolve","DatastoreController","get","asyncHandler","list","getById","post","create","put","update","delete","remove","testConnection","testConnectionWithConfig","express","container","createProviderProxyRoutes","router","Router","pluginRouteService","resolve","PluginRouteService","registerRoutes","use","createCustomApplicationRoutes","createHoloRoutes","authService","AuthService","auth","makeAuthMiddleware","createHoloChatRoutes","createHoloGenerateRoutes","createHoloEmbedRoutes","createHoloMetricsRoutes","createHoloModelRoutes","createHoloApplicationRoutes","createAdminRoutes","createNotificationRoutes","createTokenRoutes","createPricingRoutes","createCacheRoutes","createProviderRoutes","createApplicationRoutes","createModelRoutes","createResponseRoutes","createRequestRoutes","createPluginRoutes","createDatastoreRoutes","init_routes","VERSION","init_version","swaggerJsdoc","options","swaggerSpec","init_version","definition","openapi","info","title","version","VERSION","description","servers","url","tags","name","components","securitySchemes","BearerAuth","type","scheme","bearerFormat","HoloToken","in","parameters","Page","schema","default","minimum","Limit","maximum","SortDir","enum","OrgId","format","HoloApplication","ClientUser","schemas","ErrorResponse","properties","success","example","error","message","code","timestamp","Pagination","page","limit","total","total_pages","HealthResponse","status","uptime","security","apis","express","bodyParser","helmet","morgan","listEndpoints","injectable","swaggerUi","ApiServer","init_mixins","init_env","init_routes","withAdmin","withDB","BaseServer","expressApp","httpServer","initService","env","api","apiServerId","ServerType","API","setupMiddleware","onInit","init","id","get","_req","res","json","swaggerSpec","use","serve","setup","createProviderProxyRoutes","createHoloRoutes","createAdminRoutes","errorMiddleware","startListening","onShutdown","Promise","resolve","close","hidePoweredBy","noSniff","frameguard","action","hsts","maxAge","includeSubDomains","contentSecurityPolicy","directives","defaultSrc","scriptSrc","styleSrc","imgSrc","frameAncestors","formAction","skip","req","path","limit","corsMiddleware","status","timestamp","Date","toISOString","uptime","process","version","npm_package_version","port","reject","listen","logger","info","NODE_ENV","endpoints","console","table","on","error","syscall","code","container","server","resolve","ApiServer","start","container","registerSingleton","ResponseService","inject","injectable","WorkerServer","init_mixins","init_env","init_plugin","init_notification","init_provider","withAdmin","withDB","withStats","BaseServer","__className","name","env","worker","serverId","providerPluginService","pluginRegistry","responseService","notificationService","ServerType","WORKER","onInit","pluginLifecycleService","setPluginsDir","pluginsDir","loadAllActive","warmAll","adminHandlers","set","adminService","restartWorker","requestQueue","queue","logger","mlog","queueService","consume","requestId","workerRequest","stats","totalRequests","info","id","provider","sourceId","ai","getProviderImplById","plugin","guardResult","envelope","auditor","createWorkerResponseEnvelope","passed","wire","createWireAdapter","isStreaming","protocol","defaultProtocol","errorMessage","errors","join","evt","type","seq","ts","Date","now","status","metrics","inputTokens","outputTokens","timeToFirstToken","totalProcessingTime","totalTokens","text","error","responseFactory","createError","wireChunk","fromProviderEvent","debug","JSON","stringify","sendResponseChunk","sendToAudit","providerEvent","workerId","publish","NotificationEventFactory","wirePlugin","resolveWirePlugin","family","wireProtocolName","applyInboundTranslation","rawEvents","processWorkerRequest","events","translateProviderEvents","translator","processProviderEvents","publishChunk","bind","publishFinal","final","message","errorEvent","isHoloNative","HoloWireAdapter","payload","model","auditError","onError","onShutdown","totalErrors","mergeStats","requestStats","totalSuccesses","success","duration","generateSuccesses","generateErrors","generateTime","chatSuccesses","chatErrors","chatTime","wireFamily","toLowerCase","undefined","findByFamily","originalRequest","originalPluginId","toHoloRequest","capability","container","server","init_worker","resolve","WorkerServer","start","container","registerSingleton","PricingDB","ProviderResponseCostDB","PricingService","injectable","AuditServer","init_mixins","init_env","init_plugin","withAdmin","withQueue","withDB","BaseServer","auditService","providerImplService","pluginRegistry","env","audit","serverId","ServerType","AUDIT","onInit","pluginLifecycleService","setPluginsDir","pluginsDir","loadAllActive","warmAll","queueService","consume","queue","auditNotificationQueue","_id","content","logNotification","auditRequestQueue","logRequest","auditResponseQueue","logResponse","onShutdown","onError","error","container","server","init_audit","resolve","AuditServer","start","container","api","worker","audit","resolve","ApiServer","WorkerServer","AuditServer","start","Promise","all","readFileSync","dirname","join","fileURLToPath","Command","randomBytes","existsSync","Command","confirm","input","password","genHex","bytes","randomBytes","toString","genBase64","suffix","promptInteractive","existing","pre","console","log","jwt_secret","input","message","default","jwt","secret","credential_key","encryption","pg_host","postgres","host","pg_port","String","port","pg_user","user","pg_password","password","mask","pg_database","database","rabbitmq_url","rabbitmq","url","redis_url","redis","moku_url","moku","api_id","servers","worker_id","audit_id","parseInt","collectFromFlags","flags","jwtSecret","credentialKey","pgHost","pgPort","pgUser","pgPassword","pgDatabase","rabbitmqUrl","redisUrl","mokuUrl","apiId","workerId","auditId","initCommand","Command","description","option","action","ensureHolokaiDirs","loadSettings","existsSync","SETTINGS_FILE","force","nonInteractive","overwrite","confirm","settings","writeSettings","Command","SERVERS","ENTRIES","api","worker","audit","aio","startCommand","Command","description","argument","join","action","server","includes","console","error","process","exit","existsSync","resolve","Command","dotenv","MASKED_PATHS","Set","EFFECTIVE_ENV_VARS","mask","value","s","String","length","repeat","slice","maskValue","path","has","deepMaskClone","obj","prefix","out","k","v","Object","entries","Array","isArray","formatHuman","settings","reveal","rendered","lines","walk","depth","pad","push","padEnd","join","formatEffective","name","process","env","isSecret","test","display","viewCommand","Command","description","option","action","flags","effective","dotenv","config","resolve","dirname","applySettingsToEnv","loadSettings","existsSync","SETTINGS_FILE","console","log","warn","json","JSON","stringify","Command","doctorCommand","description","action","console","log","Command","pluginCommand","description","command","action","console","log","pkg","readVersion","here","dirname","fileURLToPath","url","pkg","JSON","parse","readFileSync","join","version","program","Command","name","description","addCommand","initCommand","startCommand","viewCommand","doctorCommand","pluginCommand","parseAsync"]}
|