{"version":3,"file":"index.cjs","names":["EventEmitter","sleep","retryDelayMs","PgBoss","retryDelayMs","PgBoss","DEFAULT_DATABASE_URL","defineSchedulerPlugin","sharedJobQueue"],"sources":["../src/cancel-channel.ts","../src/database-queue.ts","../src/schedule-ticker.ts","../src/resolve-schedule.ts","../src/sync-trigger-schedules.ts","../src/database-trigger-scheduler.ts","../src/pg-boss-client.ts","../src/pg-cancel-channel.ts","../src/pg-boss-queue.ts","../src/pg-boss-trigger-scheduler.ts","../src/plugin.ts","../src/create-scheduler.ts","../src/memory.ts","../src/shared-pgboss-queue.ts","../src/shared-scheduler.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\n\nimport type { CancelHandler, StopFn } from \"./types\";\n\n/** In-process cancel pub/sub for single-process queues (memory, db polling). */\nexport function createInProcessCancelChannel(): {\n  publishCancel(runId: string): Promise<void>;\n  subscribeCancel(handler: CancelHandler): Promise<StopFn>;\n} {\n  const emitter = new EventEmitter();\n  return {\n    async publishCancel(runId) {\n      emitter.emit(\"cancel\", runId);\n    },\n\n    async subscribeCancel(handler) {\n      const listener = (runId: string) => {\n        void handler(runId);\n      };\n      emitter.on(\"cancel\", listener);\n      return async () => {\n        emitter.off(\"cancel\", listener);\n      };\n    },\n  };\n}\n","import {\n  claimNextJob,\n  enqueueJob,\n  failAgentSession,\n  failWorkflowRun,\n  markJobComplete,\n  markJobFailed,\n  requeueExpiredLeases,\n  scheduleJobRetry,\n} from \"@keystrokehq/database\";\nimport type { ClaimedJob } from \"@keystrokehq/database\";\nimport { createInProcessCancelChannel } from \"./cancel-channel\";\nimport type { JobHandler, JobQueue, StopFn, WorkerOptions } from \"./types\";\nimport { retryDelayMs } from \"./types\";\n\nfunction toJobPayload(job: ClaimedJob): Parameters<JobHandler>[0] {\n  return {\n    jobId: job.id,\n    kind: job.kind,\n    targetId: job.targetId,\n    runId: job.runId,\n    trigger: job.trigger,\n    payload: job.payload,\n    attempt: job.attempt,\n    maxAttempts: job.maxAttempts,\n    scheduledAt: job.scheduledAt,\n    ...(job.parent ? { parent: job.parent } : {}),\n  };\n}\n\nexport function createDatabaseJobQueue(): JobQueue {\n  const cancelChannel = createInProcessCancelChannel();\n  let handler: JobHandler | undefined;\n  let running = false;\n  let lentSlots = 0;\n  let activeLoops = 0;\n  let workerIdBase = \"\";\n  let pollIntervalMs = 250;\n  let leaseSweepIntervalMs = 30_000;\n  let leaseTimer: ReturnType<typeof setInterval> | undefined;\n\n  const desiredConcurrency = () => 1 + lentSlots;\n\n  const loop = async (workerId: string): Promise<void> => {\n    try {\n      while (running && handler) {\n        // A loan may have been released while this loop was idle. Let excess\n        // workers leave after their current job so the database queue returns\n        // to its normal single-worker behavior.\n        if (activeLoops > desiredConcurrency()) {\n          return;\n        }\n\n        try {\n          const job = await claimNextJob(workerId);\n          if (!job) {\n            await sleep(pollIntervalMs);\n            continue;\n          }\n\n          try {\n            await handler(toJobPayload(job));\n            await markJobComplete(job.id);\n          } catch (error) {\n            if (job.attempt < job.maxAttempts) {\n              await scheduleJobRetry(job.id, job.attempt + 1, retryDelayMs(job.attempt));\n            } else {\n              await markJobFailed(job.id, error);\n              // Last-resort run finalization: the dispatcher's own\n              // finalization covers everything inside dispatch, but errors\n              // before it (project resolution, scope setup) would otherwise\n              // strand the run in a non-terminal status forever.\n              if (job.kind === \"workflow\") {\n                await failWorkflowRun(job.runId, error);\n              }\n              if (job.kind === \"agent\") {\n                const sessionId = (job.payload as { sessionId?: string } | null)?.sessionId;\n                if (sessionId) {\n                  await failAgentSession(sessionId, error);\n                }\n              }\n            }\n          }\n        } catch {\n          await sleep(pollIntervalMs);\n        }\n      }\n    } finally {\n      activeLoops -= 1;\n      ensureWorkers();\n    }\n  };\n\n  const ensureWorkers = (): void => {\n    while (running && handler && activeLoops < desiredConcurrency()) {\n      activeLoops += 1;\n      const workerId = `${workerIdBase}:${activeLoops}`;\n      void loop(workerId);\n    }\n  };\n\n  return {\n    async enqueue(input) {\n      return enqueueJob(input);\n    },\n\n    async startWorker(nextHandler: JobHandler, options: WorkerOptions = {}): Promise<StopFn> {\n      handler = nextHandler;\n      running = true;\n      workerIdBase = options.workerId ?? crypto.randomUUID();\n      pollIntervalMs = options.pollIntervalMs ?? 250;\n      leaseSweepIntervalMs = options.leaseSweepIntervalMs ?? 30_000;\n      leaseTimer = setInterval(() => {\n        void requeueExpiredLeases();\n      }, leaseSweepIntervalMs);\n      ensureWorkers();\n\n      return async () => {\n        running = false;\n        clearInterval(leaseTimer);\n        leaseTimer = undefined;\n      };\n    },\n\n    async withLentSlot(fn) {\n      lentSlots += 1;\n      ensureWorkers();\n      try {\n        return await fn();\n      } finally {\n        lentSlots -= 1;\n      }\n    },\n\n    publishCancel: (runId) => cancelChannel.publishCancel(runId),\n    subscribeCancel: (handler) => cancelChannel.subscribeCancel(handler),\n  };\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { claimDueTriggers, claimDueTriggersForOrg } from \"@keystrokehq/database\";\nimport { getProjectScopeId } from \"@keystrokehq/database\";\nimport { nextTriggerRunAt } from \"@keystrokehq/trigger\";\nimport type { EnqueueInput, JobQueue, ScheduleTickerOptions, StopFn } from \"./types\";\n\nexport type ScheduleTickerContext = {\n  jobQueue: JobQueue;\n  pollIntervalMs?: number;\n  batchSize?: number;\n  scope?: \"project\" | \"organization\";\n};\n\nfunction enqueueTriggerJob(\n  jobQueue: JobQueue,\n  row: { slug: string; kind: \"cron\" | \"poll\"; projectId: string },\n  scheduledAt?: Date,\n): Promise<string> {\n  const input: EnqueueInput = {\n    kind: \"trigger\",\n    targetId: row.slug,\n    runId: crypto.randomUUID(),\n    trigger: row.kind,\n    payload: {},\n    projectId: row.projectId,\n  };\n\n  if (scheduledAt) {\n    input.scheduledAt = scheduledAt;\n  }\n\n  return jobQueue.enqueue(input);\n}\n\nasync function claimDue(\n  scope: \"project\" | \"organization\",\n  asOf: Date,\n  resolveNextRunAt: (schedule: string, timezone?: string) => Date,\n  limit: number,\n) {\n  if (scope === \"organization\") {\n    return claimDueTriggersForOrg(asOf, resolveNextRunAt, limit);\n  }\n\n  return claimDueTriggers(asOf, resolveNextRunAt, limit).then((rows) =>\n    rows.map((row) => ({ ...row, projectId: getProjectScopeId() })),\n  );\n}\n\nexport function createScheduleTicker(ctx: ScheduleTickerContext) {\n  const pollIntervalMs = ctx.pollIntervalMs ?? 1_000;\n  const batchSize = ctx.batchSize ?? 10;\n\n  async function fireDueSchedules(asOf = new Date()): Promise<number> {\n    const scope = ctx.scope ?? \"project\";\n    const claimed = await claimDue(\n      scope,\n      asOf,\n      (schedule, timezone) => nextTriggerRunAt(schedule, asOf, timezone),\n      batchSize,\n    );\n\n    for (const row of claimed) {\n      if (row.kind !== \"cron\" && row.kind !== \"poll\") {\n        continue;\n      }\n      // Claim uses `asOf` to decide which schedules are due, but the job must be\n      // processable immediately — stamping `scheduledAt: asOf` (e.g. a far-future\n      // test clock) would leave the job pending forever under `scheduledAt <= now`.\n      await enqueueTriggerJob(ctx.jobQueue, {\n        slug: row.slug,\n        kind: row.kind,\n        projectId: row.projectId,\n      });\n    }\n\n    return claimed.length;\n  }\n\n  async function startScheduleTicker(options: ScheduleTickerOptions = {}): Promise<StopFn> {\n    const intervalMs = options.pollIntervalMs ?? pollIntervalMs;\n    const limit = options.batchSize ?? batchSize;\n    const scope = options.scope ?? ctx.scope ?? \"project\";\n    let running = true;\n\n    const loop = async () => {\n      while (running) {\n        try {\n          const claimed = await claimDue(\n            scope,\n            new Date(),\n            (schedule, timezone) => nextTriggerRunAt(schedule, new Date(), timezone),\n            limit,\n          );\n\n          for (const row of claimed) {\n            if (row.kind !== \"cron\" && row.kind !== \"poll\") {\n              continue;\n            }\n            await enqueueTriggerJob(ctx.jobQueue, {\n              slug: row.slug,\n              kind: row.kind,\n              projectId: row.projectId,\n            });\n          }\n        } catch {\n          // keep ticking\n        }\n\n        await sleep(intervalMs);\n      }\n    };\n\n    void loop();\n\n    return async () => {\n      running = false;\n    };\n  }\n\n  return { fireDueSchedules, startScheduleTicker };\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { resolveCronSchedule } from \"@keystrokehq/trigger\";\n\nexport type ScheduleOverrideOptions = {\n  global?: string;\n  byTrigger?: Record<string, string>;\n};\n\nexport function resolveTriggerSchedule(\n  triggerSlug: string,\n  schedule: string,\n  overrides?: ScheduleOverrideOptions,\n): string {\n  return resolveCronSchedule(triggerSlug, schedule, {\n    cronScheduleOverride: overrides?.global,\n    attachmentScheduleOverrides: overrides?.byTrigger,\n  });\n}\n","import {\n  disableAllTriggerSchedules,\n  disableTriggerSchedulesNotInSlugs,\n  listExecutableAttachmentsByTriggerIds,\n  selectActiveEphemeralScheduledTriggerSlugs,\n  selectTriggerBySlug,\n  triggerTimezoneFromConfig,\n  upsertTriggerScheduleFields,\n} from \"@keystrokehq/database\";\nimport { nextTriggerRunAt } from \"@keystrokehq/trigger\";\nimport type { ScheduleSyncOptions } from \"./types\";\nimport { resolveTriggerSchedule } from \"./resolve-schedule\";\n\nexport async function syncTriggerSchedules(options: ScheduleSyncOptions): Promise<void> {\n  const now = new Date();\n  const projectSlugs = options.schedules.map((schedule) => schedule.triggerSlug);\n  // Ephemeral cron/poll schedules are managed by set_trigger, not project discovery — keep them out\n  // of the disable sweep so a deploy/restart does not wipe agent-created triggers.\n  const ephemeralSlugs = await selectActiveEphemeralScheduledTriggerSlugs();\n  const slugs = [...projectSlugs, ...ephemeralSlugs];\n\n  if (slugs.length === 0) {\n    await disableAllTriggerSchedules(now);\n    return;\n  }\n\n  await disableTriggerSchedulesNotInSlugs(slugs, now);\n\n  for (const spec of options.schedules) {\n    const schedule = resolveTriggerSchedule(\n      spec.triggerSlug,\n      spec.schedule,\n      options.scheduleOverrides,\n    );\n    const existing = await selectTriggerBySlug(spec.triggerSlug);\n    if (!existing) {\n      continue;\n    }\n\n    const existingTimezone = triggerTimezoneFromConfig(existing.config);\n    const scheduleChanged = existing.schedule !== schedule || existingTimezone !== spec.timezone;\n    const nextRunAt =\n      !scheduleChanged && existing.enabled === 1\n        ? existing.nextRunAt\n        : nextTriggerRunAt(schedule, now, spec.timezone);\n\n    const executable = await listExecutableAttachmentsByTriggerIds([existing.id]);\n    const enabled = executable.length > 0;\n\n    await upsertTriggerScheduleFields({\n      triggerSlug: spec.triggerSlug,\n      schedule,\n      nextRunAt: nextRunAt ?? now,\n      enabled,\n      updatedAt: now,\n    });\n  }\n}\n","import { setTriggerScheduleEnabled } from \"@keystrokehq/database\";\n\nimport { createScheduleTicker } from \"./schedule-ticker\";\nimport { syncTriggerSchedules } from \"./sync-trigger-schedules\";\nimport type {\n  TriggerScheduleSpec,\n  TriggerScheduleSyncOptions,\n  TriggerScheduler,\n  TriggerSchedulerStartOptions,\n} from \"./contract\";\nimport type { JobQueue } from \"./types\";\n\nexport type DatabaseTriggerSchedulerOptions = {\n  jobQueue: JobQueue;\n  scope?: \"project\" | \"organization\";\n  pollIntervalMs?: number;\n  batchSize?: number;\n};\n\n/** Postgres poll loop — default trigger scheduler for pg-boss, polling, and memory paths. */\nexport function createDatabaseTriggerScheduler(\n  options: DatabaseTriggerSchedulerOptions,\n): TriggerScheduler {\n  const ticker = createScheduleTicker({\n    jobQueue: options.jobQueue,\n    scope: options.scope,\n    pollIntervalMs: options.pollIntervalMs,\n    batchSize: options.batchSize,\n  });\n\n  return {\n    sync: (syncOptions: TriggerScheduleSyncOptions) => syncTriggerSchedules(syncOptions),\n    start: (startOptions?: TriggerSchedulerStartOptions) =>\n      ticker.startScheduleTicker(startOptions),\n    fireDue: (asOf?: Date) => ticker.fireDueSchedules(asOf),\n    async remove(triggerSlug: string) {\n      await setTriggerScheduleEnabled(triggerSlug, false, new Date());\n    },\n    async upsert(_spec: TriggerScheduleSpec) {\n      // DB rows are the firing source of truth; callers update triggers before upsert.\n    },\n  };\n}\n","import { resolvePostgresUrlFromEnv } from \"@keystrokehq/database\";\nimport { PgBoss } from \"pg-boss\";\n\nlet boss: PgBoss | undefined;\n\nfunction resolveDatabaseUrl(url?: string): string {\n  const resolved = url ?? resolvePostgresUrlFromEnv(process.env);\n  if (!resolved) {\n    throw new Error(\n      \"DATABASE_URL or POSTGRES_HOST/POSTGRES_USER/POSTGRES_PASSWORD/POSTGRES_DB is required\",\n    );\n  }\n  return resolved;\n}\n\nexport async function startPgBoss(url?: string): Promise<PgBoss> {\n  if (boss) {\n    return boss;\n  }\n\n  const next = new PgBoss({\n    connectionString: resolveDatabaseUrl(url),\n    schema: \"pgboss\",\n  });\n  next.on(\"error\", (error) => {\n    console.error(\"[pg-boss]\", error);\n  });\n\n  await next.start();\n  boss = next;\n  return next;\n}\n\nexport function getPgBoss(): PgBoss {\n  if (!boss) {\n    throw new Error(\"PgBoss not started. Call startPgBoss() first.\");\n  }\n  return boss;\n}\n\nexport async function stopPgBoss(): Promise<void> {\n  if (!boss) {\n    return;\n  }\n\n  await boss.stop();\n  boss = undefined;\n}\n","export { createPostgresCancelChannel as createPgCancelChannel } from \"@keystrokehq/database\";\n\n/** Postgres NOTIFY channel — lowercase identifier (project ids are UUIDs, well under 63 chars). */\nexport function pgCancelChannelName(\n  scope: \"platform\" | \"project\" | \"organization\",\n  id?: string,\n): string {\n  if (scope === \"platform\") {\n    return \"keystroke_cancel_platform\";\n  }\n\n  if (scope === \"organization\") {\n    const sanitized = (id ?? \"default\").replace(/[^a-z0-9_]/gi, \"_\").toLowerCase();\n    return `keystroke_cancel_org_${sanitized}`;\n  }\n\n  const sanitized = (id ?? \"default\").replace(/[^a-z0-9_]/gi, \"_\").toLowerCase();\n  return `keystroke_cancel_${sanitized}`;\n}\n","import { createHash } from \"node:crypto\";\nimport { PgBoss, type JobWithMetadata } from \"pg-boss\";\nimport { createPgCancelChannel, pgCancelChannelName } from \"./pg-cancel-channel\";\nimport type { JobHandler, JobParent, JobQueue, StopFn } from \"./types\";\nimport { retryDelayMs } from \"./types\";\n\n/** Shared queue name for the platform control-plane scope. */\nexport const DEFAULT_QUEUE_NAME = \"keystroke\";\nconst PGBOSS_SCHEMA = \"pgboss\";\n\n/**\n * Derive a per-project pg-boss queue name. pg-boss queue names must be <= 50\n * chars, contain only [A-Za-z0-9_], and not start with a digit. Project ids are\n * usually UUIDs (hyphens, may start with a digit), so we sanitize, and fall back\n * to a hash when the sanitized name would exceed the length limit.\n */\nexport function pgBossProjectQueueName(projectId: string): string {\n  const sanitized = projectId.replace(/[^a-zA-Z0-9_]/g, \"_\");\n  const name = `${DEFAULT_QUEUE_NAME}_${sanitized}`;\n  if (name.length <= 50) {\n    return name;\n  }\n  return `${DEFAULT_QUEUE_NAME}_${createHash(\"sha1\").update(projectId).digest(\"hex\").slice(0, 40)}`;\n}\n\nexport function pgBossOrgQueueName(organizationId: string): string {\n  const sanitized = organizationId.replace(/[^a-zA-Z0-9_]/g, \"_\");\n  const name = `${DEFAULT_QUEUE_NAME}_org_${sanitized}`;\n  if (name.length <= 50) {\n    return name;\n  }\n  return `${DEFAULT_QUEUE_NAME}_org_${createHash(\"sha1\").update(organizationId).digest(\"hex\").slice(0, 36)}`;\n}\n\nexport type PgBossQueueOptions = {\n  connectionString: string;\n  queueName?: string;\n  projectId?: string;\n  organizationId?: string;\n  cancelScope?: \"platform\" | \"project\" | \"organization\";\n};\n\ntype PgBossJobData = {\n  kind: \"workflow\" | \"agent\" | \"trigger\" | \"runtime\";\n  targetId: string;\n  runId: string;\n  trigger: \"api\" | \"cron\" | \"webhook\" | \"poll\" | \"retry\" | \"prompt\";\n  payload?: unknown;\n  attempt?: number;\n  maxAttempts?: number;\n  scheduledAt?: string;\n  projectId?: string;\n  parent?: JobParent;\n  traceContext?: Record<string, string>;\n};\n\ntype BuildPgBossJobQueueOptions = {\n  connectionString: string;\n  stopBossOnWorkerStop?: boolean;\n  queueName?: string;\n  cancelScope?: \"platform\" | \"project\" | \"organization\";\n  projectId?: string;\n  organizationId?: string;\n};\n\n/**\n * A {@link JobQueue} that also exposes its underlying pg-boss instance and queue\n * name so the trigger scheduler can register native cron schedules\n * (`boss.schedule`) against the same queue the worker drains.\n */\nexport type PgBossJobQueue = JobQueue & {\n  boss: PgBoss;\n  queueName: string;\n};\n\nexport function buildPgBossJobQueue(\n  boss: PgBoss,\n  options: BuildPgBossJobQueueOptions,\n): PgBossJobQueue {\n  const queueName = options.queueName ?? DEFAULT_QUEUE_NAME;\n  const cancelChannel = createPgCancelChannel(\n    options.connectionString,\n    pgCancelChannelName(\n      options.cancelScope ?? \"platform\",\n      options.cancelScope === \"organization\" ? options.organizationId : options.projectId,\n    ),\n  );\n\n  return {\n    boss,\n    queueName,\n    async enqueue(input) {\n      const jobId = await boss.send(\n        queueName,\n        {\n          ...input,\n          payload: input.payload,\n        },\n        {\n          retryLimit: (input.maxAttempts ?? 3) - 1,\n          retryDelay: Math.ceil(retryDelayMs(1) / 1000),\n          startAfter: input.scheduledAt,\n          singletonKey: input.dedupeKey,\n        },\n      );\n\n      if (!jobId) {\n        if (input.dedupeKey) {\n          return input.dedupeKey;\n        }\n        throw new Error(\"Failed to enqueue job\");\n      }\n\n      return jobId;\n    },\n\n    async startWorker(handler: JobHandler): Promise<StopFn> {\n      let stopped = false;\n\n      const workerId = await boss.work<PgBossJobData>(\n        queueName,\n        { batchSize: 1, includeMetadata: true },\n        async (jobs: JobWithMetadata<PgBossJobData>[]) => {\n          if (stopped) {\n            return;\n          }\n\n          const job = jobs[0];\n          if (!job) {\n            return;\n          }\n\n          const data = job.data;\n          const maxAttempts = data.maxAttempts ?? (job.retryLimit ?? 0) + 1;\n          const attempt = (job.retryCount ?? 0) + 1;\n\n          await handler({\n            jobId: job.id,\n            kind: data.kind,\n            targetId: data.targetId,\n            runId: data.runId,\n            trigger: data.trigger,\n            payload: data.payload ?? {},\n            attempt,\n            maxAttempts,\n            exhaustedRetries: attempt >= maxAttempts,\n            scheduledAt: data.scheduledAt ? new Date(data.scheduledAt) : new Date(),\n            projectId: data.projectId,\n            parent: data.parent,\n            ...(data.traceContext ? { traceContext: data.traceContext } : {}),\n          });\n        },\n      );\n\n      return async () => {\n        stopped = true;\n        await boss.offWork(queueName, { id: workerId });\n        if (options.stopBossOnWorkerStop) {\n          await boss.stop({ graceful: true, timeout: 5_000 });\n        }\n      };\n    },\n\n    publishCancel: (runId) => cancelChannel.publishCancel(runId),\n    subscribeCancel: (handler) => cancelChannel.subscribeCancel(handler),\n  };\n}\n\nexport async function createPgBossQueue(options: PgBossQueueOptions): Promise<PgBossJobQueue> {\n  const queueName = options.queueName ?? DEFAULT_QUEUE_NAME;\n  const boss = new PgBoss({\n    connectionString: options.connectionString,\n    schema: PGBOSS_SCHEMA,\n  });\n  await boss.start();\n  await boss.createQueue(queueName);\n\n  return buildPgBossJobQueue(boss, {\n    stopBossOnWorkerStop: true,\n    queueName,\n    connectionString: options.connectionString,\n    cancelScope: options.cancelScope ?? \"project\",\n    projectId: options.projectId,\n    organizationId: options.organizationId,\n  });\n}\n\nexport async function createSharedPgBossJobQueue(\n  boss: PgBoss,\n  options: { connectionString: string; queueName?: string },\n): Promise<PgBossJobQueue> {\n  const queueName = options.queueName ?? DEFAULT_QUEUE_NAME;\n  await boss.createQueue(queueName);\n  return buildPgBossJobQueue(boss, {\n    queueName,\n    connectionString: options.connectionString,\n    cancelScope: \"platform\",\n  });\n}\n","import {\n  getProjectScopeId,\n  listEnabledScheduledTriggers,\n  triggerTimezoneFromConfig,\n  type StoredTriggerConfig,\n} from \"@keystrokehq/database\";\n\nimport type {\n  SchedulerPluginContext,\n  TriggerScheduleSpec,\n  TriggerScheduleSyncOptions,\n  TriggerScheduler,\n  TriggerSchedulerStartOptions,\n} from \"./contract\";\nimport type { PgBossJobQueue } from \"./pg-boss-queue\";\nimport { resolveTriggerSchedule } from \"./resolve-schedule\";\nimport { syncTriggerSchedules } from \"./sync-trigger-schedules\";\n\n/**\n * pg-boss schedule key for one trigger. Mirrors {@link bullmqTriggerSchedulerId}\n * so the firing backend is interchangeable: `trigger-<projectId>-<slug>`. pg-boss\n * keys allow hyphens, so colons (legal in ids) are swapped for `-`.\n */\nexport function pgBossTriggerScheduleKey(\n  spec: Pick<TriggerScheduleSpec, \"triggerSlug\" | \"projectId\">,\n): string {\n  const projectId = (spec.projectId ?? getProjectScopeId()).replaceAll(\":\", \"-\");\n  const slug = spec.triggerSlug.replaceAll(\":\", \"-\");\n  return `trigger-${projectId}-${slug}`;\n}\n\n/** Key prefix scoping reconcile cleanup to the active project (org queues are shared). */\nexport function pgBossTriggerScheduleKeyPrefix(projectId?: string): string {\n  const scopedProjectId = (projectId ?? getProjectScopeId()).replaceAll(\":\", \"-\");\n  return `trigger-${scopedProjectId}-`;\n}\n\nfunction triggerJobData(spec: TriggerScheduleSpec): {\n  kind: \"trigger\";\n  targetId: string;\n  runId: string;\n  trigger: \"cron\" | \"poll\";\n  payload: Record<string, never>;\n  projectId: string;\n} {\n  return {\n    kind: \"trigger\",\n    targetId: spec.triggerSlug,\n    // Empty: the worker fans out to attachment runs, each with its own run id.\n    runId: \"\",\n    trigger: spec.kind,\n    payload: {},\n    projectId: spec.projectId ?? getProjectScopeId(),\n  };\n}\n\nfunction rowToSpec(row: {\n  slug: string;\n  kind: string;\n  schedule: string | null;\n  projectId: string;\n  config?: StoredTriggerConfig | null;\n}): TriggerScheduleSpec | undefined {\n  if (row.kind !== \"cron\" && row.kind !== \"poll\") {\n    return undefined;\n  }\n\n  if (!row.schedule) {\n    return undefined;\n  }\n\n  const timezone = triggerTimezoneFromConfig(row.config ?? null);\n\n  return {\n    triggerSlug: row.slug,\n    kind: row.kind,\n    schedule: row.schedule,\n    ...(timezone ? { timezone } : {}),\n    projectId: row.projectId,\n  };\n}\n\n/**\n * Trigger scheduler backed by pg-boss native cron scheduling. Mirrors\n * {@link createBullmqTriggerScheduler}: `boss.schedule` registers a recurring job\n * onto the project/org queue (no per-second DB poll), and reconcile keeps the\n * `pgboss.schedule` table in sync with the `triggers` table (source of truth).\n *\n * Granularity: pg-boss cron is minute-level (it checks schedules every ~30s and\n * dedupes per minute), so sub-minute schedules effectively fire at most once per\n * minute — unlike the DB ticker's 1s loop.\n */\nexport function createPgBossTriggerScheduler(\n  _ctx: SchedulerPluginContext,\n  queue: PgBossJobQueue,\n): TriggerScheduler {\n  async function upsertScheduler(\n    spec: TriggerScheduleSpec,\n    overrides?: TriggerScheduleSyncOptions[\"scheduleOverrides\"],\n  ): Promise<void> {\n    const schedule = resolveTriggerSchedule(spec.triggerSlug, spec.schedule, overrides);\n    const key = pgBossTriggerScheduleKey(spec);\n    await queue.boss.schedule(queue.queueName, schedule, triggerJobData({ ...spec, schedule }), {\n      key,\n      ...(spec.timezone ? { tz: spec.timezone } : {}),\n    });\n  }\n\n  async function reconcileFromDatabase(\n    overrides?: TriggerScheduleSyncOptions[\"scheduleOverrides\"],\n  ): Promise<void> {\n    const projectPrefix = pgBossTriggerScheduleKeyPrefix();\n    const rows = await listEnabledScheduledTriggers();\n    const expectedKeys = new Set<string>();\n    const failures: Array<{ triggerSlug: string; error: unknown }> = [];\n\n    for (const row of rows) {\n      const spec = rowToSpec(row);\n      if (!spec) {\n        continue;\n      }\n\n      expectedKeys.add(pgBossTriggerScheduleKey(spec));\n      try {\n        await upsertScheduler(spec, overrides);\n      } catch (error) {\n        failures.push({ triggerSlug: spec.triggerSlug, error });\n        console.error(`[pg-boss-trigger-scheduler] failed to schedule ${spec.triggerSlug}`, error);\n      }\n    }\n\n    const schedules = await queue.boss.getSchedules(queue.queueName);\n    for (const schedule of schedules) {\n      const key = schedule.key;\n      if (!key || !key.startsWith(projectPrefix)) {\n        continue;\n      }\n\n      if (!expectedKeys.has(key)) {\n        try {\n          await queue.boss.unschedule(queue.queueName, key);\n        } catch (error) {\n          failures.push({ triggerSlug: key, error });\n          console.error(`[pg-boss-trigger-scheduler] failed to unschedule stale ${key}`, error);\n        }\n      }\n    }\n\n    if (failures.length > 0) {\n      throw new Error(\n        `pg-boss trigger scheduler reconcile failed for ${failures.length} trigger(s)`,\n      );\n    }\n  }\n\n  return {\n    async sync(syncOptions: TriggerScheduleSyncOptions) {\n      await syncTriggerSchedules(syncOptions);\n      await reconcileFromDatabase(syncOptions.scheduleOverrides);\n    },\n\n    async start(_options?: TriggerSchedulerStartOptions) {\n      // pg-boss fires schedules from its own timekeeper; no DB poll loop to run.\n      return async () => undefined;\n    },\n\n    fireDue: async () => 0,\n\n    upsert: upsertScheduler,\n\n    async remove(triggerSlug: string, projectId?: string) {\n      await queue.boss.unschedule(\n        queue.queueName,\n        pgBossTriggerScheduleKey({ triggerSlug, projectId }),\n      );\n    },\n  };\n}\n","import {\n  DEFAULT_DATABASE_URL,\n  getProjectScopeId,\n  inferDialect,\n  resolveProjectDatabaseUrlFromEnv,\n} from \"@keystrokehq/database\";\n\nimport {\n  defineSchedulerPlugin,\n  type SchedulerPlugin,\n  type SchedulerPluginContext,\n  type TriggerScheduler,\n} from \"./contract\";\nimport { createDatabaseJobQueue } from \"./database-queue\";\nimport { createDatabaseTriggerScheduler } from \"./database-trigger-scheduler\";\nimport { getPgBoss, startPgBoss } from \"./pg-boss-client\";\nimport {\n  createPgBossQueue,\n  createSharedPgBossJobQueue,\n  type PgBossJobQueue,\n  pgBossOrgQueueName,\n  pgBossProjectQueueName,\n} from \"./pg-boss-queue\";\nimport { createPgBossTriggerScheduler } from \"./pg-boss-trigger-scheduler\";\nimport type { JobQueue } from \"./types\";\n\nexport type { SchedulerPlugin, SchedulerPluginContext, SchedulerScope } from \"./contract\";\nexport { defineSchedulerPlugin } from \"./contract\";\n\nfunction resolveUrl(ctx: SchedulerPluginContext): string {\n  return ctx.url ?? resolveProjectDatabaseUrlFromEnv(process.env) ?? DEFAULT_DATABASE_URL;\n}\n\n/** DB poll-loop trigger scheduler — used by the SQLite/self-host polling backend. */\nfunction createPollingTriggerScheduler(\n  ctx: SchedulerPluginContext,\n  queue: JobQueue,\n): Promise<TriggerScheduler> {\n  const scope = ctx.scope === \"organization\" ? \"organization\" : \"project\";\n  return Promise.resolve(createDatabaseTriggerScheduler({ jobQueue: queue, scope }));\n}\n\nfunction isPgBossJobQueue(queue: JobQueue): queue is PgBossJobQueue {\n  return \"boss\" in queue && \"queueName\" in queue;\n}\n\n/** Native pg-boss cron scheduler; falls back to the DB ticker if the queue isn't pg-boss. */\nfunction createPgBossTriggerSchedulerForPlugin(\n  ctx: SchedulerPluginContext,\n  queue: JobQueue,\n): Promise<TriggerScheduler> {\n  if (!isPgBossJobQueue(queue)) {\n    return createPollingTriggerScheduler(ctx, queue);\n  }\n  return Promise.resolve(createPgBossTriggerScheduler(ctx, queue));\n}\n\n/** Postgres pg-boss backend. Platform scope shares one queue; org scope gets one queue per org. */\nexport function pgBossSchedulerPlugin(): SchedulerPlugin {\n  return defineSchedulerPlugin({\n    name: \"pg-boss\",\n    async createJobQueue(ctx) {\n      const url = resolveUrl(ctx);\n\n      if (ctx.scope === \"platform\") {\n        await startPgBoss(url);\n        return createSharedPgBossJobQueue(getPgBoss(), { connectionString: url });\n      }\n\n      if (ctx.scope === \"organization\") {\n        const organizationId = ctx.organizationId;\n        if (!organizationId) {\n          throw new Error(\"organizationId is required for organization-scoped pg-boss queue\");\n        }\n\n        return createPgBossQueue({\n          connectionString: url,\n          queueName: pgBossOrgQueueName(organizationId),\n          cancelScope: \"organization\",\n          organizationId,\n        });\n      }\n\n      const projectId = ctx.projectId ?? getProjectScopeId();\n      return createPgBossQueue({\n        connectionString: url,\n        queueName: pgBossProjectQueueName(projectId),\n        projectId,\n      });\n    },\n    createTriggerScheduler: createPgBossTriggerSchedulerForPlugin,\n  });\n}\n\n/** DB-table queue (Drizzle `jobs`), for SQLite / self-host. */\nexport function pollingSchedulerPlugin(): SchedulerPlugin {\n  return defineSchedulerPlugin({\n    name: \"polling\",\n    async createJobQueue() {\n      return createDatabaseJobQueue();\n    },\n    createTriggerScheduler: createPollingTriggerScheduler,\n  });\n}\n\n/** Auto-selects pg-boss (postgres) or polling (sqlite) by dialect. */\nexport function defaultSchedulerPlugin(): SchedulerPlugin {\n  return defineSchedulerPlugin({\n    name: \"default\",\n    async createJobQueue(ctx) {\n      const url = resolveUrl(ctx);\n      const dialect = inferDialect(url, ctx.dialect);\n\n      if (dialect === \"postgres\") {\n        return pgBossSchedulerPlugin().createJobQueue(ctx);\n      }\n\n      return pollingSchedulerPlugin().createJobQueue(ctx);\n    },\n    async createTriggerScheduler(ctx, queue) {\n      const url = resolveUrl(ctx);\n      const dialect = inferDialect(url, ctx.dialect);\n\n      if (dialect === \"postgres\") {\n        return pgBossSchedulerPlugin().createTriggerScheduler!(ctx, queue);\n      }\n\n      return pollingSchedulerPlugin().createTriggerScheduler!(ctx, queue);\n    },\n  });\n}\n","import { defaultSchedulerPlugin } from \"./plugin\";\nimport { createDatabaseTriggerScheduler } from \"./database-trigger-scheduler\";\nimport type { SchedulerPluginContext, TriggerScheduler } from \"./contract\";\nimport type {\n  CreateJobQueueOptions,\n  CreateSchedulerOptions,\n  JobQueue,\n  ScheduleSyncOptions,\n  ScheduleTickerOptions,\n  Scheduler,\n  StopFn,\n  TriggerScheduleSpec,\n} from \"./types\";\n\nasync function createUnderlyingJobQueue(options: CreateJobQueueOptions = {}): Promise<JobQueue> {\n  if (options.adapter) {\n    return options.adapter;\n  }\n\n  const plugin = options.plugin ?? defaultSchedulerPlugin();\n  return plugin.createJobQueue({\n    scope: options.scope ?? \"project\",\n    url: options.url,\n    dialect: options.dialect,\n    projectId: options.projectId,\n    organizationId: options.organizationId,\n  });\n}\n\nfunction pluginContext(options: CreateSchedulerOptions = {}): SchedulerPluginContext {\n  return {\n    scope: options.scope ?? \"project\",\n    url: options.url,\n    dialect: options.dialect,\n    projectId: options.projectId,\n    organizationId: options.organizationId,\n  };\n}\n\nasync function createTriggerScheduler(\n  options: CreateSchedulerOptions,\n  jobQueue: JobQueue,\n): Promise<TriggerScheduler> {\n  const scope = options.scope === \"organization\" ? \"organization\" : \"project\";\n  const plugin = options.plugin ?? defaultSchedulerPlugin();\n  const ctx = pluginContext(options);\n\n  if (plugin.createTriggerScheduler) {\n    return plugin.createTriggerScheduler(ctx, jobQueue);\n  }\n\n  return createDatabaseTriggerScheduler({ jobQueue, scope });\n}\n\nfunction wrapScheduler(jobQueue: JobQueue, triggerScheduler: TriggerScheduler): Scheduler {\n  return {\n    enqueue: (input) => jobQueue.enqueue(input),\n    startWorker: (handler, workerOptions) => jobQueue.startWorker(handler, workerOptions),\n    ...(jobQueue.withLentSlot\n      ? { withLentSlot: <T>(fn: () => Promise<T>) => jobQueue.withLentSlot!(fn) }\n      : {}),\n    publishCancel: (runId) => jobQueue.publishCancel(runId),\n    subscribeCancel: (handler) => jobQueue.subscribeCancel(handler),\n    syncTriggerSchedules: (options: ScheduleSyncOptions) => triggerScheduler.sync(options),\n    startScheduleTicker: (options?: ScheduleTickerOptions) => triggerScheduler.start(options),\n    fireDueSchedules: (asOf?: Date) => triggerScheduler.fireDue?.(asOf) ?? Promise.resolve(0),\n    ...(triggerScheduler.upsert\n      ? {\n          upsertTriggerSchedule: (\n            spec: TriggerScheduleSpec,\n            overrides?: ScheduleSyncOptions[\"scheduleOverrides\"],\n          ) => triggerScheduler.upsert!(spec, overrides),\n        }\n      : {}),\n    ...(triggerScheduler.remove\n      ? {\n          removeTriggerSchedule: (triggerSlug: string, projectId?: string) =>\n            triggerScheduler.remove!(triggerSlug, projectId),\n        }\n      : {}),\n  };\n}\n\nexport async function createScheduler(options: CreateSchedulerOptions = {}): Promise<Scheduler> {\n  const jobQueue = await createUnderlyingJobQueue(options);\n  const triggerScheduler = await createTriggerScheduler(options, jobQueue);\n  return wrapScheduler(jobQueue, triggerScheduler);\n}\n\nexport async function createJobQueue(options: CreateJobQueueOptions = {}): Promise<JobQueue> {\n  return createUnderlyingJobQueue(options);\n}\n\nexport async function wrapJobQueueAsScheduler(\n  jobQueue: JobQueue,\n  scope?: \"project\" | \"organization\",\n): Promise<Scheduler> {\n  const triggerScheduler = createDatabaseTriggerScheduler({\n    jobQueue,\n    scope,\n  });\n  return wrapScheduler(jobQueue, triggerScheduler);\n}\n\nexport type { StopFn };\n","import { createInProcessCancelChannel } from \"./cancel-channel\";\nimport type { EnqueueInput, JobHandler, JobQueue, StopFn, WorkerOptions } from \"./types\";\nimport { retryDelayMs } from \"./types\";\n\nexport type MemoryJobQueueOptions = {\n  sync?: boolean;\n};\n\nexport function createMemoryJobQueue(options: MemoryJobQueueOptions = {}): JobQueue {\n  const cancelChannel = createInProcessCancelChannel();\n  const pending: Array<{ id: string; input: EnqueueInput; enqueuedAt: Date }> = [];\n  let handler: JobHandler | undefined;\n  let draining = false;\n\n  async function drain(): Promise<void> {\n    if (!handler || draining) {\n      return;\n    }\n\n    draining = true;\n    try {\n      while (pending.length > 0) {\n        const next = pending.shift();\n        if (!next) {\n          break;\n        }\n\n        const input = next.input;\n        await handler({\n          jobId: next.id,\n          kind: input.kind,\n          targetId: input.targetId,\n          runId: input.runId,\n          trigger: input.trigger,\n          payload: input.payload ?? {},\n          attempt: input.attempt ?? 1,\n          maxAttempts: input.maxAttempts ?? 3,\n          scheduledAt: input.scheduledAt ?? next.enqueuedAt,\n          ...(input.parent ? { parent: input.parent } : {}),\n          ...(input.traceContext ? { traceContext: input.traceContext } : {}),\n        });\n      }\n    } finally {\n      draining = false;\n    }\n  }\n\n  return {\n    async enqueue(input) {\n      const id = crypto.randomUUID();\n      pending.push({ id, input, enqueuedAt: new Date() });\n\n      if (options.sync) {\n        await drain();\n      }\n\n      return id;\n    },\n\n    async startWorker(nextHandler: JobHandler, _opts: WorkerOptions = {}): Promise<StopFn> {\n      handler = nextHandler;\n\n      if (!options.sync) {\n        void drain();\n      }\n\n      return async () => {\n        handler = undefined;\n      };\n    },\n\n    publishCancel: (runId) => cancelChannel.publishCancel(runId),\n    subscribeCancel: (handler) => cancelChannel.subscribeCancel(handler),\n  };\n}\n\nexport { retryDelayMs };\n","import { resolvePostgresUrlFromEnv } from \"@keystrokehq/database\";\nimport { getPgBoss } from \"./pg-boss-client\";\nimport { wrapJobQueueAsScheduler } from \"./create-scheduler\";\nimport { createSharedPgBossJobQueue } from \"./pg-boss-queue\";\nimport type { JobQueue, Scheduler } from \"./types\";\n\nlet sharedJobQueue: JobQueue | undefined;\n\nexport async function createSharedPgBossScheduler(): Promise<Scheduler> {\n  const jobQueue = await getSharedPgBossJobQueue();\n  return await wrapJobQueueAsScheduler(jobQueue);\n}\n\nexport async function getSharedPgBossJobQueue(): Promise<JobQueue> {\n  if (sharedJobQueue) {\n    return sharedJobQueue;\n  }\n\n  const connectionString = resolvePostgresUrlFromEnv(process.env);\n  if (!connectionString) {\n    throw new Error(\"Postgres connection string is required for shared pg-boss queue\");\n  }\n\n  sharedJobQueue = await createSharedPgBossJobQueue(getPgBoss(), { connectionString });\n  return sharedJobQueue;\n}\n\nexport function resetSharedPgBossJobQueueForTests(): void {\n  sharedJobQueue = undefined;\n}\n","import type { SchedulerPlugin } from \"./contract\";\nimport { wrapJobQueueAsScheduler } from \"./create-scheduler\";\nimport { defaultSchedulerPlugin } from \"./plugin\";\nimport {\n  createSharedPgBossScheduler,\n  resetSharedPgBossJobQueueForTests,\n} from \"./shared-pgboss-queue\";\nimport type { JobQueue, Scheduler } from \"./types\";\n\nlet configuredPlugin: SchedulerPlugin | undefined;\nlet sharedJobQueue: JobQueue | undefined;\n\nexport function configureSharedScheduler(plugin: SchedulerPlugin): void {\n  configuredPlugin = plugin;\n  sharedJobQueue = undefined;\n}\n\nexport async function createSharedScheduler(): Promise<Scheduler> {\n  const plugin = configuredPlugin ?? defaultSchedulerPlugin();\n\n  if (plugin.name === \"default\") {\n    return createSharedPgBossScheduler();\n  }\n\n  if (!sharedJobQueue) {\n    sharedJobQueue = await plugin.createJobQueue({ scope: \"platform\" });\n  }\n\n  return await wrapJobQueueAsScheduler(sharedJobQueue);\n}\n\nexport function resetSharedSchedulerForTests(): void {\n  configuredPlugin = undefined;\n  sharedJobQueue = undefined;\n  resetSharedPgBossJobQueueForTests();\n}\n"],"mappings":";;;;;;;;;AAKA,SAAgB,+BAGd;CACA,MAAM,UAAU,IAAIA,YAAAA,aAAa;CACjC,OAAO;EACL,MAAM,cAAc,OAAO;GACzB,QAAQ,KAAK,UAAU,KAAK;EAC9B;EAEA,MAAM,gBAAgB,SAAS;GAC7B,MAAM,YAAY,UAAkB;IAClC,QAAa,KAAK;GACpB;GACA,QAAQ,GAAG,UAAU,QAAQ;GAC7B,OAAO,YAAY;IACjB,QAAQ,IAAI,UAAU,QAAQ;GAChC;EACF;CACF;AACF;;;ACVA,SAAS,aAAa,KAA4C;CAChE,OAAO;EACL,OAAO,IAAI;EACX,MAAM,IAAI;EACV,UAAU,IAAI;EACd,OAAO,IAAI;EACX,SAAS,IAAI;EACb,SAAS,IAAI;EACb,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,aAAa,IAAI;EACjB,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;CAC7C;AACF;AAEA,SAAgB,yBAAmC;CACjD,MAAM,gBAAgB,6BAA6B;CACnD,IAAI;CACJ,IAAI,UAAU;CACd,IAAI,YAAY;CAChB,IAAI,cAAc;CAClB,IAAI,eAAe;CACnB,IAAI,iBAAiB;CACrB,IAAI,uBAAuB;CAC3B,IAAI;CAEJ,MAAM,2BAA2B,IAAI;CAErC,MAAM,OAAO,OAAO,aAAoC;EACtD,IAAI;GACF,OAAO,WAAW,SAAS;IAIzB,IAAI,cAAc,mBAAmB,GACnC;IAGF,IAAI;KACF,MAAM,MAAM,OAAA,GAAA,sBAAA,cAAmB,QAAQ;KACvC,IAAI,CAAC,KAAK;MACR,MAAMC,QAAM,cAAc;MAC1B;KACF;KAEA,IAAI;MACF,MAAM,QAAQ,aAAa,GAAG,CAAC;MAC/B,OAAA,GAAA,sBAAA,iBAAsB,IAAI,EAAE;KAC9B,SAAS,OAAO;MACd,IAAI,IAAI,UAAU,IAAI,aACpB,OAAA,GAAA,sBAAA,kBAAuB,IAAI,IAAI,IAAI,UAAU,GAAGC,iBAAAA,aAAa,IAAI,OAAO,CAAC;WACpE;OACL,OAAA,GAAA,sBAAA,eAAoB,IAAI,IAAI,KAAK;OAKjC,IAAI,IAAI,SAAS,YACf,OAAA,GAAA,sBAAA,iBAAsB,IAAI,OAAO,KAAK;OAExC,IAAI,IAAI,SAAS,SAAS;QACxB,MAAM,YAAa,IAAI,SAA2C;QAClE,IAAI,WACF,OAAA,GAAA,sBAAA,kBAAuB,WAAW,KAAK;OAE3C;MACF;KACF;IACF,QAAQ;KACN,MAAMD,QAAM,cAAc;IAC5B;GACF;EACF,UAAU;GACR,eAAe;GACf,cAAc;EAChB;CACF;CAEA,MAAM,sBAA4B;EAChC,OAAO,WAAW,WAAW,cAAc,mBAAmB,GAAG;GAC/D,eAAe;GAEf,KAAU,GADU,aAAa,GAAG,aAClB;EACpB;CACF;CAEA,OAAO;EACL,MAAM,QAAQ,OAAO;GACnB,QAAA,GAAA,sBAAA,YAAkB,KAAK;EACzB;EAEA,MAAM,YAAY,aAAyB,UAAyB,CAAC,GAAoB;GACvF,UAAU;GACV,UAAU;GACV,eAAe,QAAQ,YAAY,OAAO,WAAW;GACrD,iBAAiB,QAAQ,kBAAkB;GAC3C,uBAAuB,QAAQ,wBAAwB;GACvD,aAAa,kBAAkB;IAC7B,CAAA,GAAA,sBAAA,sBAA0B;GAC5B,GAAG,oBAAoB;GACvB,cAAc;GAEd,OAAO,YAAY;IACjB,UAAU;IACV,cAAc,UAAU;IACxB,aAAa,KAAA;GACf;EACF;EAEA,MAAM,aAAa,IAAI;GACrB,aAAa;GACb,cAAc;GACd,IAAI;IACF,OAAO,MAAM,GAAG;GAClB,UAAU;IACR,aAAa;GACf;EACF;EAEA,gBAAgB,UAAU,cAAc,cAAc,KAAK;EAC3D,kBAAkB,YAAY,cAAc,gBAAgB,OAAO;CACrE;AACF;AAEA,SAASA,QAAM,IAA2B;CACxC,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;ACjIA,SAAS,kBACP,UACA,KACA,aACiB;CACjB,MAAM,QAAsB;EAC1B,MAAM;EACN,UAAU,IAAI;EACd,OAAO,OAAO,WAAW;EACzB,SAAS,IAAI;EACb,SAAS,CAAC;EACV,WAAW,IAAI;CACjB;CAEA,IAAI,aACF,MAAM,cAAc;CAGtB,OAAO,SAAS,QAAQ,KAAK;AAC/B;AAEA,eAAe,SACb,OACA,MACA,kBACA,OACA;CACA,IAAI,UAAU,gBACZ,QAAA,GAAA,sBAAA,wBAA8B,MAAM,kBAAkB,KAAK;CAG7D,QAAA,GAAA,sBAAA,kBAAwB,MAAM,kBAAkB,KAAK,EAAE,MAAM,SAC3D,KAAK,KAAK,SAAS;EAAE,GAAG;EAAK,YAAA,GAAA,sBAAA,mBAA6B;CAAE,EAAE,CAChE;AACF;AAEA,SAAgB,qBAAqB,KAA4B;CAC/D,MAAM,iBAAiB,IAAI,kBAAkB;CAC7C,MAAM,YAAY,IAAI,aAAa;CAEnC,eAAe,iBAAiB,uBAAO,IAAI,KAAK,GAAoB;EAElE,MAAM,UAAU,MAAM,SADR,IAAI,SAAS,WAGzB,OACC,UAAU,cAAA,GAAA,qBAAA,kBAA8B,UAAU,MAAM,QAAQ,GACjE,SACF;EAEA,KAAK,MAAM,OAAO,SAAS;GACzB,IAAI,IAAI,SAAS,UAAU,IAAI,SAAS,QACtC;GAKF,MAAM,kBAAkB,IAAI,UAAU;IACpC,MAAM,IAAI;IACV,MAAM,IAAI;IACV,WAAW,IAAI;GACjB,CAAC;EACH;EAEA,OAAO,QAAQ;CACjB;CAEA,eAAe,oBAAoB,UAAiC,CAAC,GAAoB;EACvF,MAAM,aAAa,QAAQ,kBAAkB;EAC7C,MAAM,QAAQ,QAAQ,aAAa;EACnC,MAAM,QAAQ,QAAQ,SAAS,IAAI,SAAS;EAC5C,IAAI,UAAU;EAEd,MAAM,OAAO,YAAY;GACvB,OAAO,SAAS;IACd,IAAI;KACF,MAAM,UAAU,MAAM,SACpB,uBACA,IAAI,KAAK,IACR,UAAU,cAAA,GAAA,qBAAA,kBAA8B,0BAAU,IAAI,KAAK,GAAG,QAAQ,GACvE,KACF;KAEA,KAAK,MAAM,OAAO,SAAS;MACzB,IAAI,IAAI,SAAS,UAAU,IAAI,SAAS,QACtC;MAEF,MAAM,kBAAkB,IAAI,UAAU;OACpC,MAAM,IAAI;OACV,MAAM,IAAI;OACV,WAAW,IAAI;MACjB,CAAC;KACH;IACF,QAAQ,CAER;IAEA,MAAM,MAAM,UAAU;GACxB;EACF;EAEA,KAAU;EAEV,OAAO,YAAY;GACjB,UAAU;EACZ;CACF;CAEA,OAAO;EAAE;EAAkB;CAAoB;AACjD;AAEA,SAAS,MAAM,IAA2B;CACxC,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;ACrHA,SAAgB,uBACd,aACA,UACA,WACQ;CACR,QAAA,GAAA,qBAAA,qBAA2B,aAAa,UAAU;EAChD,sBAAsB,WAAW;EACjC,6BAA6B,WAAW;CAC1C,CAAC;AACH;;;ACHA,eAAsB,qBAAqB,SAA6C;CACtF,MAAM,sBAAM,IAAI,KAAK;CACrB,MAAM,eAAe,QAAQ,UAAU,KAAK,aAAa,SAAS,WAAW;CAG7E,MAAM,iBAAiB,OAAA,GAAA,sBAAA,4CAAiD;CACxE,MAAM,QAAQ,CAAC,GAAG,cAAc,GAAG,cAAc;CAEjD,IAAI,MAAM,WAAW,GAAG;EACtB,OAAA,GAAA,sBAAA,4BAAiC,GAAG;EACpC;CACF;CAEA,OAAA,GAAA,sBAAA,mCAAwC,OAAO,GAAG;CAElD,KAAK,MAAM,QAAQ,QAAQ,WAAW;EACpC,MAAM,WAAW,uBACf,KAAK,aACL,KAAK,UACL,QAAQ,iBACV;EACA,MAAM,WAAW,OAAA,GAAA,sBAAA,qBAA0B,KAAK,WAAW;EAC3D,IAAI,CAAC,UACH;EAGF,MAAM,oBAAA,GAAA,sBAAA,2BAA6C,SAAS,MAAM;EAElE,MAAM,YACJ,EAFsB,SAAS,aAAa,YAAY,qBAAqB,KAAK,aAE9D,SAAS,YAAY,IACrC,SAAS,aAAA,GAAA,qBAAA,kBACQ,UAAU,KAAK,KAAK,QAAQ;EAGnD,MAAM,WAAU,OAAA,GAAA,sBAAA,uCAD+C,CAAC,SAAS,EAAE,CAAC,GACjD,SAAS;EAEpC,OAAA,GAAA,sBAAA,6BAAkC;GAChC,aAAa,KAAK;GAClB;GACA,WAAW,aAAa;GACxB;GACA,WAAW;EACb,CAAC;CACH;AACF;;;;ACrCA,SAAgB,+BACd,SACkB;CAClB,MAAM,SAAS,qBAAqB;EAClC,UAAU,QAAQ;EAClB,OAAO,QAAQ;EACf,gBAAgB,QAAQ;EACxB,WAAW,QAAQ;CACrB,CAAC;CAED,OAAO;EACL,OAAO,gBAA4C,qBAAqB,WAAW;EACnF,QAAQ,iBACN,OAAO,oBAAoB,YAAY;EACzC,UAAU,SAAgB,OAAO,iBAAiB,IAAI;EACtD,MAAM,OAAO,aAAqB;GAChC,OAAA,GAAA,sBAAA,2BAAgC,aAAa,uBAAO,IAAI,KAAK,CAAC;EAChE;EACA,MAAM,OAAO,OAA4B,CAEzC;CACF;AACF;;;ACvCA,IAAI;AAEJ,SAAS,mBAAmB,KAAsB;CAChD,MAAM,WAAW,QAAA,GAAA,sBAAA,2BAAiC,QAAQ,GAAG;CAC7D,IAAI,CAAC,UACH,MAAM,IAAI,MACR,uFACF;CAEF,OAAO;AACT;AAEA,eAAsB,YAAY,KAA+B;CAC/D,IAAI,MACF,OAAO;CAGT,MAAM,OAAO,IAAIE,QAAAA,OAAO;EACtB,kBAAkB,mBAAmB,GAAG;EACxC,QAAQ;CACV,CAAC;CACD,KAAK,GAAG,UAAU,UAAU;EAC1B,QAAQ,MAAM,aAAa,KAAK;CAClC,CAAC;CAED,MAAM,KAAK,MAAM;CACjB,OAAO;CACP,OAAO;AACT;AAEA,SAAgB,YAAoB;CAClC,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,+CAA+C;CAEjE,OAAO;AACT;AAEA,eAAsB,aAA4B;CAChD,IAAI,CAAC,MACH;CAGF,MAAM,KAAK,KAAK;CAChB,OAAO,KAAA;AACT;;;;AC5CA,SAAgB,oBACd,OACA,IACQ;CACR,IAAI,UAAU,YACZ,OAAO;CAGT,IAAI,UAAU,gBAEZ,OAAO,yBADY,MAAM,WAAW,QAAQ,gBAAgB,GAAG,EAAE,YAC1B;CAIzC,OAAO,qBADY,MAAM,WAAW,QAAQ,gBAAgB,GAAG,EAAE,YAC9B;AACrC;;;;ACXA,MAAa,qBAAqB;AAClC,MAAM,gBAAgB;;;;;;;AAQtB,SAAgB,uBAAuB,WAA2B;CAEhE,MAAM,OAAO,GAAG,mBAAmB,GADjB,UAAU,QAAQ,kBAAkB,GACR;CAC9C,IAAI,KAAK,UAAU,IACjB,OAAO;CAET,OAAO,GAAG,mBAAmB,IAAA,GAAA,YAAA,YAAc,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAChG;AAEA,SAAgB,mBAAmB,gBAAgC;CAEjE,MAAM,OAAO,GAAG,mBAAmB,OADjB,eAAe,QAAQ,kBAAkB,GACT;CAClD,IAAI,KAAK,UAAU,IACjB,OAAO;CAET,OAAO,GAAG,mBAAmB,QAAA,GAAA,YAAA,YAAkB,MAAM,EAAE,OAAO,cAAc,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACzG;AA2CA,SAAgB,oBACd,MACA,SACgB;CAChB,MAAM,YAAY,QAAQ,aAAA;CAC1B,MAAM,iBAAA,GAAA,sBAAA,6BACJ,QAAQ,kBACR,oBACE,QAAQ,eAAe,YACvB,QAAQ,gBAAgB,iBAAiB,QAAQ,iBAAiB,QAAQ,SAC5E,CACF;CAEA,OAAO;EACL;EACA;EACA,MAAM,QAAQ,OAAO;GACnB,MAAM,QAAQ,MAAM,KAAK,KACvB,WACA;IACE,GAAG;IACH,SAAS,MAAM;GACjB,GACA;IACE,aAAa,MAAM,eAAe,KAAK;IACvC,YAAY,KAAK,KAAKC,iBAAAA,aAAa,CAAC,IAAI,GAAI;IAC5C,YAAY,MAAM;IAClB,cAAc,MAAM;GACtB,CACF;GAEA,IAAI,CAAC,OAAO;IACV,IAAI,MAAM,WACR,OAAO,MAAM;IAEf,MAAM,IAAI,MAAM,uBAAuB;GACzC;GAEA,OAAO;EACT;EAEA,MAAM,YAAY,SAAsC;GACtD,IAAI,UAAU;GAEd,MAAM,WAAW,MAAM,KAAK,KAC1B,WACA;IAAE,WAAW;IAAG,iBAAiB;GAAK,GACtC,OAAO,SAA2C;IAChD,IAAI,SACF;IAGF,MAAM,MAAM,KAAK;IACjB,IAAI,CAAC,KACH;IAGF,MAAM,OAAO,IAAI;IACjB,MAAM,cAAc,KAAK,gBAAgB,IAAI,cAAc,KAAK;IAChE,MAAM,WAAW,IAAI,cAAc,KAAK;IAExC,MAAM,QAAQ;KACZ,OAAO,IAAI;KACX,MAAM,KAAK;KACX,UAAU,KAAK;KACf,OAAO,KAAK;KACZ,SAAS,KAAK;KACd,SAAS,KAAK,WAAW,CAAC;KAC1B;KACA;KACA,kBAAkB,WAAW;KAC7B,aAAa,KAAK,cAAc,IAAI,KAAK,KAAK,WAAW,oBAAI,IAAI,KAAK;KACtE,WAAW,KAAK;KAChB,QAAQ,KAAK;KACb,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;IACjE,CAAC;GACH,CACF;GAEA,OAAO,YAAY;IACjB,UAAU;IACV,MAAM,KAAK,QAAQ,WAAW,EAAE,IAAI,SAAS,CAAC;IAC9C,IAAI,QAAQ,sBACV,MAAM,KAAK,KAAK;KAAE,UAAU;KAAM,SAAS;IAAM,CAAC;GAEtD;EACF;EAEA,gBAAgB,UAAU,cAAc,cAAc,KAAK;EAC3D,kBAAkB,YAAY,cAAc,gBAAgB,OAAO;CACrE;AACF;AAEA,eAAsB,kBAAkB,SAAsD;CAC5F,MAAM,YAAY,QAAQ,aAAA;CAC1B,MAAM,OAAO,IAAIC,QAAAA,OAAO;EACtB,kBAAkB,QAAQ;EAC1B,QAAQ;CACV,CAAC;CACD,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,YAAY,SAAS;CAEhC,OAAO,oBAAoB,MAAM;EAC/B,sBAAsB;EACtB;EACA,kBAAkB,QAAQ;EAC1B,aAAa,QAAQ,eAAe;EACpC,WAAW,QAAQ;EACnB,gBAAgB,QAAQ;CAC1B,CAAC;AACH;AAEA,eAAsB,2BACpB,MACA,SACyB;CACzB,MAAM,YAAY,QAAQ,aAAA;CAC1B,MAAM,KAAK,YAAY,SAAS;CAChC,OAAO,oBAAoB,MAAM;EAC/B;EACA,kBAAkB,QAAQ;EAC1B,aAAa;CACf,CAAC;AACH;;;;;;;;AC/KA,SAAgB,yBACd,MACQ;CAGR,OAAO,YAFY,KAAK,cAAA,GAAA,sBAAA,mBAA+B,GAAG,WAAW,KAAK,GAEhD,EAAE,GADf,KAAK,YAAY,WAAW,KAAK,GACZ;AACpC;;AAGA,SAAgB,+BAA+B,WAA4B;CAEzE,OAAO,YADkB,cAAA,GAAA,sBAAA,mBAA+B,GAAG,WAAW,KAAK,GAC3C,EAAE;AACpC;AAEA,SAAS,eAAe,MAOtB;CACA,OAAO;EACL,MAAM;EACN,UAAU,KAAK;EAEf,OAAO;EACP,SAAS,KAAK;EACd,SAAS,CAAC;EACV,WAAW,KAAK,cAAA,GAAA,sBAAA,mBAA+B;CACjD;AACF;AAEA,SAAS,UAAU,KAMiB;CAClC,IAAI,IAAI,SAAS,UAAU,IAAI,SAAS,QACtC;CAGF,IAAI,CAAC,IAAI,UACP;CAGF,MAAM,YAAA,GAAA,sBAAA,2BAAqC,IAAI,UAAU,IAAI;CAE7D,OAAO;EACL,aAAa,IAAI;EACjB,MAAM,IAAI;EACV,UAAU,IAAI;EACd,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,WAAW,IAAI;CACjB;AACF;;;;;;;;;;;AAYA,SAAgB,6BACd,MACA,OACkB;CAClB,eAAe,gBACb,MACA,WACe;EACf,MAAM,WAAW,uBAAuB,KAAK,aAAa,KAAK,UAAU,SAAS;EAClF,MAAM,MAAM,yBAAyB,IAAI;EACzC,MAAM,MAAM,KAAK,SAAS,MAAM,WAAW,UAAU,eAAe;GAAE,GAAG;GAAM;EAAS,CAAC,GAAG;GAC1F;GACA,GAAI,KAAK,WAAW,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC;EAC/C,CAAC;CACH;CAEA,eAAe,sBACb,WACe;EACf,MAAM,gBAAgB,+BAA+B;EACrD,MAAM,OAAO,OAAA,GAAA,sBAAA,8BAAmC;EAChD,MAAM,+BAAe,IAAI,IAAY;EACrC,MAAM,WAA2D,CAAC;EAElE,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,OAAO,UAAU,GAAG;GAC1B,IAAI,CAAC,MACH;GAGF,aAAa,IAAI,yBAAyB,IAAI,CAAC;GAC/C,IAAI;IACF,MAAM,gBAAgB,MAAM,SAAS;GACvC,SAAS,OAAO;IACd,SAAS,KAAK;KAAE,aAAa,KAAK;KAAa;IAAM,CAAC;IACtD,QAAQ,MAAM,kDAAkD,KAAK,eAAe,KAAK;GAC3F;EACF;EAEA,MAAM,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,SAAS;EAC/D,KAAK,MAAM,YAAY,WAAW;GAChC,MAAM,MAAM,SAAS;GACrB,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,aAAa,GACvC;GAGF,IAAI,CAAC,aAAa,IAAI,GAAG,GACvB,IAAI;IACF,MAAM,MAAM,KAAK,WAAW,MAAM,WAAW,GAAG;GAClD,SAAS,OAAO;IACd,SAAS,KAAK;KAAE,aAAa;KAAK;IAAM,CAAC;IACzC,QAAQ,MAAM,0DAA0D,OAAO,KAAK;GACtF;EAEJ;EAEA,IAAI,SAAS,SAAS,GACpB,MAAM,IAAI,MACR,kDAAkD,SAAS,OAAO,YACpE;CAEJ;CAEA,OAAO;EACL,MAAM,KAAK,aAAyC;GAClD,MAAM,qBAAqB,WAAW;GACtC,MAAM,sBAAsB,YAAY,iBAAiB;EAC3D;EAEA,MAAM,MAAM,UAAyC;GAEnD,OAAO,YAAY,KAAA;EACrB;EAEA,SAAS,YAAY;EAErB,QAAQ;EAER,MAAM,OAAO,aAAqB,WAAoB;GACpD,MAAM,MAAM,KAAK,WACf,MAAM,WACN,yBAAyB;IAAE;IAAa;GAAU,CAAC,CACrD;EACF;CACF;AACF;;;ACpJA,SAAS,WAAW,KAAqC;CACvD,OAAO,IAAI,QAAA,GAAA,sBAAA,kCAAwC,QAAQ,GAAG,KAAKC,sBAAAA;AACrE;;AAGA,SAAS,8BACP,KACA,OAC2B;CAC3B,MAAM,QAAQ,IAAI,UAAU,iBAAiB,iBAAiB;CAC9D,OAAO,QAAQ,QAAQ,+BAA+B;EAAE,UAAU;EAAO;CAAM,CAAC,CAAC;AACnF;AAEA,SAAS,iBAAiB,OAA0C;CAClE,OAAO,UAAU,SAAS,eAAe;AAC3C;;AAGA,SAAS,sCACP,KACA,OAC2B;CAC3B,IAAI,CAAC,iBAAiB,KAAK,GACzB,OAAO,8BAA8B,KAAK,KAAK;CAEjD,OAAO,QAAQ,QAAQ,6BAA6B,KAAK,KAAK,CAAC;AACjE;;AAGA,SAAgB,wBAAyC;CACvD,OAAOC,iBAAAA,sBAAsB;EAC3B,MAAM;EACN,MAAM,eAAe,KAAK;GACxB,MAAM,MAAM,WAAW,GAAG;GAE1B,IAAI,IAAI,UAAU,YAAY;IAC5B,MAAM,YAAY,GAAG;IACrB,OAAO,2BAA2B,UAAU,GAAG,EAAE,kBAAkB,IAAI,CAAC;GAC1E;GAEA,IAAI,IAAI,UAAU,gBAAgB;IAChC,MAAM,iBAAiB,IAAI;IAC3B,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,kEAAkE;IAGpF,OAAO,kBAAkB;KACvB,kBAAkB;KAClB,WAAW,mBAAmB,cAAc;KAC5C,aAAa;KACb;IACF,CAAC;GACH;GAEA,MAAM,YAAY,IAAI,cAAA,GAAA,sBAAA,mBAA+B;GACrD,OAAO,kBAAkB;IACvB,kBAAkB;IAClB,WAAW,uBAAuB,SAAS;IAC3C;GACF,CAAC;EACH;EACA,wBAAwB;CAC1B,CAAC;AACH;;AAGA,SAAgB,yBAA0C;CACxD,OAAOA,iBAAAA,sBAAsB;EAC3B,MAAM;EACN,MAAM,iBAAiB;GACrB,OAAO,uBAAuB;EAChC;EACA,wBAAwB;CAC1B,CAAC;AACH;;AAGA,SAAgB,yBAA0C;CACxD,OAAOA,iBAAAA,sBAAsB;EAC3B,MAAM;EACN,MAAM,eAAe,KAAK;GAIxB,KAAA,GAAA,sBAAA,cAHY,WAAW,GACQ,GAAG,IAAI,OAE5B,MAAM,YACd,OAAO,sBAAsB,EAAE,eAAe,GAAG;GAGnD,OAAO,uBAAuB,EAAE,eAAe,GAAG;EACpD;EACA,MAAM,uBAAuB,KAAK,OAAO;GAIvC,KAAA,GAAA,sBAAA,cAHY,WAAW,GACQ,GAAG,IAAI,OAE5B,MAAM,YACd,OAAO,sBAAsB,EAAE,uBAAwB,KAAK,KAAK;GAGnE,OAAO,uBAAuB,EAAE,uBAAwB,KAAK,KAAK;EACpE;CACF,CAAC;AACH;;;ACpHA,eAAe,yBAAyB,UAAiC,CAAC,GAAsB;CAC9F,IAAI,QAAQ,SACV,OAAO,QAAQ;CAIjB,QADe,QAAQ,UAAU,uBAAuB,GAC1C,eAAe;EAC3B,OAAO,QAAQ,SAAS;EACxB,KAAK,QAAQ;EACb,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,gBAAgB,QAAQ;CAC1B,CAAC;AACH;AAEA,SAAS,cAAc,UAAkC,CAAC,GAA2B;CACnF,OAAO;EACL,OAAO,QAAQ,SAAS;EACxB,KAAK,QAAQ;EACb,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,gBAAgB,QAAQ;CAC1B;AACF;AAEA,eAAe,uBACb,SACA,UAC2B;CAC3B,MAAM,QAAQ,QAAQ,UAAU,iBAAiB,iBAAiB;CAClE,MAAM,SAAS,QAAQ,UAAU,uBAAuB;CACxD,MAAM,MAAM,cAAc,OAAO;CAEjC,IAAI,OAAO,wBACT,OAAO,OAAO,uBAAuB,KAAK,QAAQ;CAGpD,OAAO,+BAA+B;EAAE;EAAU;CAAM,CAAC;AAC3D;AAEA,SAAS,cAAc,UAAoB,kBAA+C;CACxF,OAAO;EACL,UAAU,UAAU,SAAS,QAAQ,KAAK;EAC1C,cAAc,SAAS,kBAAkB,SAAS,YAAY,SAAS,aAAa;EACpF,GAAI,SAAS,eACT,EAAE,eAAkB,OAAyB,SAAS,aAAc,EAAE,EAAE,IACxE,CAAC;EACL,gBAAgB,UAAU,SAAS,cAAc,KAAK;EACtD,kBAAkB,YAAY,SAAS,gBAAgB,OAAO;EAC9D,uBAAuB,YAAiC,iBAAiB,KAAK,OAAO;EACrF,sBAAsB,YAAoC,iBAAiB,MAAM,OAAO;EACxF,mBAAmB,SAAgB,iBAAiB,UAAU,IAAI,KAAK,QAAQ,QAAQ,CAAC;EACxF,GAAI,iBAAiB,SACjB,EACE,wBACE,MACA,cACG,iBAAiB,OAAQ,MAAM,SAAS,EAC/C,IACA,CAAC;EACL,GAAI,iBAAiB,SACjB,EACE,wBAAwB,aAAqB,cAC3C,iBAAiB,OAAQ,aAAa,SAAS,EACnD,IACA,CAAC;CACP;AACF;AAEA,eAAsB,gBAAgB,UAAkC,CAAC,GAAuB;CAC9F,MAAM,WAAW,MAAM,yBAAyB,OAAO;CAEvD,OAAO,cAAc,UAAU,MADA,uBAAuB,SAAS,QAAQ,CACxB;AACjD;AAEA,eAAsB,eAAe,UAAiC,CAAC,GAAsB;CAC3F,OAAO,yBAAyB,OAAO;AACzC;AAEA,eAAsB,wBACpB,UACA,OACoB;CAKpB,OAAO,cAAc,UAJI,+BAA+B;EACtD;EACA;CACF,CAC8C,CAAC;AACjD;;;AC9FA,SAAgB,qBAAqB,UAAiC,CAAC,GAAa;CAClF,MAAM,gBAAgB,6BAA6B;CACnD,MAAM,UAAwE,CAAC;CAC/E,IAAI;CACJ,IAAI,WAAW;CAEf,eAAe,QAAuB;EACpC,IAAI,CAAC,WAAW,UACd;EAGF,WAAW;EACX,IAAI;GACF,OAAO,QAAQ,SAAS,GAAG;IACzB,MAAM,OAAO,QAAQ,MAAM;IAC3B,IAAI,CAAC,MACH;IAGF,MAAM,QAAQ,KAAK;IACnB,MAAM,QAAQ;KACZ,OAAO,KAAK;KACZ,MAAM,MAAM;KACZ,UAAU,MAAM;KAChB,OAAO,MAAM;KACb,SAAS,MAAM;KACf,SAAS,MAAM,WAAW,CAAC;KAC3B,SAAS,MAAM,WAAW;KAC1B,aAAa,MAAM,eAAe;KAClC,aAAa,MAAM,eAAe,KAAK;KACvC,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;KAC/C,GAAI,MAAM,eAAe,EAAE,cAAc,MAAM,aAAa,IAAI,CAAC;IACnE,CAAC;GACH;EACF,UAAU;GACR,WAAW;EACb;CACF;CAEA,OAAO;EACL,MAAM,QAAQ,OAAO;GACnB,MAAM,KAAK,OAAO,WAAW;GAC7B,QAAQ,KAAK;IAAE;IAAI;IAAO,4BAAY,IAAI,KAAK;GAAE,CAAC;GAElD,IAAI,QAAQ,MACV,MAAM,MAAM;GAGd,OAAO;EACT;EAEA,MAAM,YAAY,aAAyB,QAAuB,CAAC,GAAoB;GACrF,UAAU;GAEV,IAAI,CAAC,QAAQ,MACX,MAAW;GAGb,OAAO,YAAY;IACjB,UAAU,KAAA;GACZ;EACF;EAEA,gBAAgB,UAAU,cAAc,cAAc,KAAK;EAC3D,kBAAkB,YAAY,cAAc,gBAAgB,OAAO;CACrE;AACF;;;ACpEA,IAAIC;AAEJ,eAAsB,8BAAkD;CAEtE,OAAO,MAAM,wBAAwB,MADd,wBAAwB,CACF;AAC/C;AAEA,eAAsB,0BAA6C;CACjE,IAAIA,kBACF,OAAOA;CAGT,MAAM,oBAAA,GAAA,sBAAA,2BAA6C,QAAQ,GAAG;CAC9D,IAAI,CAAC,kBACH,MAAM,IAAI,MAAM,iEAAiE;CAGnF,mBAAiB,MAAM,2BAA2B,UAAU,GAAG,EAAE,iBAAiB,CAAC;CACnF,OAAOA;AACT;AAEA,SAAgB,oCAA0C;CACxD,mBAAiB,KAAA;AACnB;;;ACpBA,IAAI;AACJ,IAAI;AAEJ,SAAgB,yBAAyB,QAA+B;CACtE,mBAAmB;CACnB,iBAAiB,KAAA;AACnB;AAEA,eAAsB,wBAA4C;CAChE,MAAM,SAAS,oBAAoB,uBAAuB;CAE1D,IAAI,OAAO,SAAS,WAClB,OAAO,4BAA4B;CAGrC,IAAI,CAAC,gBACH,iBAAiB,MAAM,OAAO,eAAe,EAAE,OAAO,WAAW,CAAC;CAGpE,OAAO,MAAM,wBAAwB,cAAc;AACrD;AAEA,SAAgB,+BAAqC;CACnD,mBAAmB,KAAA;CACnB,iBAAiB,KAAA;CACjB,kCAAkC;AACpC"}