{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/transport.ts","../src/session-recorder.ts","../src/session-lifecycle.ts","../src/default-attributes.ts","../src/debug-ids.ts","../src/stack-trace.ts","../src/global-handlers.ts","../src/fetch-instrumentation.ts","../src/xhr-instrumentation.ts","../src/console-instrumentation.ts","../src/navigation-instrumentation.ts"],"sourcesContent":["import { nowISO, generateUUID } from \"@tracewayapp/core\";\nimport type { ExceptionStackTrace } from \"@tracewayapp/core\";\nimport {\n  TracewayFrontendClient,\n  type TracewayFrontendOptions,\n} from \"./client.js\";\nimport { formatBrowserStackTrace } from \"./stack-trace.js\";\nimport { installGlobalHandlers } from \"./global-handlers.js\";\nimport {\n  installFetchInstrumentation,\n  getActiveDistributedTraceId,\n} from \"./fetch-instrumentation.js\";\nimport { installXhrInstrumentation } from \"./xhr-instrumentation.js\";\nimport { installConsoleInstrumentation } from \"./console-instrumentation.js\";\nimport { installNavigationInstrumentation } from \"./navigation-instrumentation.js\";\n\nlet client: TracewayFrontendClient | null = null;\n\nexport function init(\n  connectionString: string,\n  options: TracewayFrontendOptions = {},\n): void {\n  client = new TracewayFrontendClient(connectionString, options);\n  if (typeof window !== \"undefined\") {\n    installGlobalHandlers(client);\n    installFetchInstrumentation(client);\n    installXhrInstrumentation(client);\n    if (client.captureLogs) {\n      installConsoleInstrumentation(client);\n    }\n    if (client.captureNavigation) {\n      installNavigationInstrumentation(client);\n    }\n  }\n}\n\nexport function captureException(\n  error: Error,\n  options?: { distributedTraceId?: string },\n): void {\n  if (!client) return;\n  client.addException({\n    traceId: null,\n    stackTrace: formatBrowserStackTrace(error),\n    recordedAt: nowISO(),\n    isMessage: false,\n    distributedTraceId:\n      options?.distributedTraceId ?? getActiveDistributedTraceId(),\n  });\n}\n\nexport function captureExceptionWithAttributes(\n  error: Error,\n  attributes?: Record<string, string>,\n  options?: { distributedTraceId?: string },\n): void {\n  if (!client) return;\n  client.addException({\n    traceId: null,\n    stackTrace: formatBrowserStackTrace(error),\n    recordedAt: nowISO(),\n    attributes,\n    isMessage: false,\n    distributedTraceId:\n      options?.distributedTraceId ?? getActiveDistributedTraceId(),\n  });\n}\n\nexport function captureMessage(msg: string): void {\n  if (!client) return;\n  client.addException({\n    traceId: null,\n    stackTrace: msg,\n    recordedAt: nowISO(),\n    isMessage: true,\n  });\n}\n\n/**\n * Records a custom user-defined breadcrumb. Use to log any app-level action\n * that should ride along with the next exception (\"user_tapped_pay\",\n * \"cart_synced\", etc.).\n */\nexport function recordAction(\n  category: string,\n  name: string,\n  data?: Record<string, unknown>,\n): void {\n  if (!client) return;\n  client.recordAction(category, name, data);\n}\n\nexport async function flush(timeoutMs?: number): Promise<void> {\n  if (!client) return;\n  await client.flush(timeoutMs);\n}\n\n/**\n * Attach a key/value attribute to every session and exception emitted from\n * here on (e.g. `setAttribute(\"userId\", \"42\")`). Persists in memory until\n * cleared. If a session is already open, the attribute lands on it via a\n * refresh upsert.\n */\nexport function setAttribute(key: string, value: string): void {\n  if (!client) return;\n  client.setAttribute(key, value);\n}\n\n/** Bulk version of setAttribute. Caller's keys overwrite existing scope. */\nexport function setAttributes(attrs: Record<string, string>): void {\n  if (!client) return;\n  client.setAttributes(attrs);\n}\n\n/** Remove a single key from the global scope. */\nexport function removeAttribute(key: string): void {\n  if (!client) return;\n  client.removeAttribute(key);\n}\n\n/** Clear all attributes set via setAttribute / setAttributes. */\nexport function clearAttributes(): void {\n  if (!client) return;\n  client.clearAttributes();\n}\n\nexport { TracewayFrontendClient, DEFAULT_IGNORE_PATTERNS } from \"./client.js\";\nexport type { TracewayFrontendOptions } from \"./client.js\";\nexport { formatBrowserStackTrace } from \"./stack-trace.js\";\nexport { installGlobalHandlers } from \"./global-handlers.js\";\nexport { installConsoleInstrumentation } from \"./console-instrumentation.js\";\nexport { installNavigationInstrumentation } from \"./navigation-instrumentation.js\";\n\nexport type {\n  ExceptionStackTrace,\n  CollectionFrame,\n  ReportRequest,\n  SessionRecordingPayload,\n  TracewayEvent,\n  LogEvent,\n  NetworkEvent,\n  NavigationEvent,\n  CustomEvent,\n} from \"@tracewayapp/core\";\n\nexport const DISTRIBUTED_TRACE_HEADER = \"traceway-trace-id\";\n\nexport { getActiveDistributedTraceId } from \"./fetch-instrumentation.js\";\n\nexport function createAxiosInterceptor() {\n  return (config: any) => {\n    config.headers = config.headers || {};\n    config.headers[\"traceway-trace-id\"] = generateUUID();\n    return config;\n  };\n}\n","import type {\n  ExceptionStackTrace,\n  ReportRequest,\n  CollectionFrame,\n  SessionPayload,\n  SessionRecordingPayload,\n  LogEvent,\n  NetworkEvent,\n  NavigationEvent,\n  CustomEvent,\n  TracewayEvent,\n} from \"@tracewayapp/core\";\nimport { parseConnectionString, generateUUID, EventBuffer, nowISO } from \"@tracewayapp/core\";\nimport { sendReport } from \"./transport.js\";\nimport { SessionRecorder } from \"./session-recorder.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\nimport { collectDefaultAttributes } from \"./default-attributes.js\";\nimport { debugIdsForStackTrace } from \"./debug-ids.js\";\n\ninterface RrwebLikeEvent {\n  timestamp?: number;\n}\n\nfunction epochMsToISO(ms: number): string {\n  return new Date(ms).toISOString();\n}\n\n/**\n * Computes the wall-clock window covered by a recording. Prefers rrweb events\n * (each carries a `timestamp` epoch ms); falls back to the timestamp range of\n * the buffered logs/actions when there's no replay data — that path is what\n * fires when `sessionRecording: false` but logs/actions are still being kept.\n */\nfunction computeRecordingAnchors(\n  recorderEvents: unknown[],\n  logs: LogEvent[],\n  actions: Array<NetworkEvent | NavigationEvent | CustomEvent>,\n): { startedAt?: string; endedAt?: string } {\n  if (recorderEvents.length > 0) {\n    const stamps: number[] = [];\n    for (const e of recorderEvents) {\n      const ts = (e as RrwebLikeEvent)?.timestamp;\n      if (typeof ts === \"number\" && Number.isFinite(ts)) stamps.push(ts);\n    }\n    if (stamps.length > 0) {\n      return {\n        startedAt: epochMsToISO(Math.min(...stamps)),\n        endedAt: epochMsToISO(Math.max(...stamps)),\n      };\n    }\n  }\n\n  const eventStamps = [\n    ...logs.map((e) => Date.parse(e.timestamp)),\n    ...actions.map((e) => Date.parse(e.timestamp)),\n  ].filter((n) => Number.isFinite(n));\n  if (eventStamps.length === 0) return {};\n  return {\n    startedAt: epochMsToISO(Math.min(...eventStamps)),\n    endedAt: epochMsToISO(Math.max(...eventStamps)),\n  };\n}\n\nexport const DEFAULT_IGNORE_PATTERNS: Array<string | RegExp> = [\n  // Network errors (browser-specific messages)\n  \"Failed to fetch\",\n  \"NetworkError when attempting to fetch resource\",\n  \"Load failed\",\n  \"Network Error\",\n  // RN-style network error (surfaces here when an app shares code with React Native)\n  \"Network request failed\",\n  // Timeout / Abort\n  \"The operation was aborted\",\n  /timeout/i,\n  // 4xx HTTP errors (common library patterns)\n  /status code 4\\d{2}/,\n  /failed: 4\\d{2}/,\n];\n\nexport interface TracewayFrontendOptions {\n  debug?: boolean;\n  debounceMs?: number;\n  retryDelayMs?: number;\n  version?: string;\n  sessionRecording?: boolean;\n  sessionRecordingSegmentDuration?: number;\n  /**\n   * Upload every segment of the session regardless of whether an exception\n   * fires. Each segment (default ~30 s, see `sessionRecordingSegmentDuration`)\n   * becomes its own `session_recordings` row on the backend, all linked to a\n   * parent `sessions` row by `sessionId`.\n   *\n   *   - Inactivity timeout: 15 min ends the session.\n   *   - Max duration: 60 min ends the session.\n   *   - `pagehide` ends the session and triggers a final flush.\n   *\n   * Defaults to false to preserve the existing exception-only behaviour.\n   */\n  recordAllSessions?: boolean;\n  ignoreErrors?: Array<string | RegExp>;\n  beforeCapture?: (exception: ExceptionStackTrace) => boolean;\n  /** Mirror console.{log,info,warn,error,debug} into the rolling log buffer. Default true. */\n  captureLogs?: boolean;\n  /** Record fetch / XHR requests as network actions. Default true. */\n  captureNetwork?: boolean;\n  /** Record History API push/replace/pop as navigation actions. Default true. */\n  captureNavigation?: boolean;\n  /** Window kept in the rolling log/action buffers. Default 10_000ms. */\n  eventsWindowMs?: number;\n  /** Hard cap applied independently to logs and actions. Default 200. */\n  eventsMaxCount?: number;\n  /**\n   * When `true`, every `fetch` / `XHR` response with `status >= 500` is also\n   * reported to Traceway as a synthetic exception (in addition to the network\n   * action it already records). 4xx responses are intentionally not captured\n   * by this flag — see `DEFAULT_IGNORE_PATTERNS`. Default `false`.\n   */\n  captureHttpServerErrors?: boolean;\n}\n\nexport class TracewayFrontendClient {\n  private apiUrl: string;\n  private token: string;\n  private debug: boolean;\n  private debounceMs: number;\n  private retryDelayMs: number;\n  private version: string;\n\n  private pendingExceptions: ExceptionStackTrace[] = [];\n  private pendingRecordings: SessionRecordingPayload[] = [];\n  private pendingSessions: SessionPayload[] = [];\n  private isSyncing = false;\n  private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n  private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n  private recorder: SessionRecorder | null = null;\n  private lifecycle: SessionLifecycle | null = null;\n  private readonly recordAllSessions: boolean;\n  private sessionId: string | null = null;\n  private sessionStartedAt: string | null = null;\n  private segmentIndex = 0;\n  /**\n   * App-defined attributes attached to every session and exception emitted by\n   * this client. Set via setAttribute() / setAttributes(). Auto-collected\n   * defaults take a back seat to these; per-call exception attributes win\n   * over both.\n   */\n  private globalAttributes: Record<string, string> = {};\n  /**\n   * Set true once the page begins unloading (`pagehide`). Forces the next\n   * sync to dispatch via `fetch(..., { keepalive: true })` with a raw JSON\n   * body so the closing-session payload survives the navigation.\n   */\n  private unloading = false;\n\n  private ignoreErrors: Array<string | RegExp>;\n  private beforeCapture:\n    | ((exception: ExceptionStackTrace) => boolean)\n    | null;\n\n  readonly captureLogs: boolean;\n  readonly captureNetwork: boolean;\n  readonly captureNavigation: boolean;\n  readonly captureHttpServerErrors: boolean;\n  private readonly logs: EventBuffer<LogEvent>;\n  private readonly actions: EventBuffer<NetworkEvent | NavigationEvent | CustomEvent>;\n\n  constructor(connectionString: string, options: TracewayFrontendOptions = {}) {\n    const { token, apiUrl } = parseConnectionString(connectionString);\n    this.apiUrl = apiUrl;\n    this.token = token;\n    this.debug = options.debug ?? false;\n    this.debounceMs = options.debounceMs ?? 1500;\n    this.retryDelayMs = options.retryDelayMs ?? 10000;\n    this.version = options.version ?? \"\";\n    this.ignoreErrors = options.ignoreErrors ?? DEFAULT_IGNORE_PATTERNS;\n    this.beforeCapture = options.beforeCapture ?? null;\n\n    this.captureLogs = options.captureLogs ?? true;\n    this.captureNetwork = options.captureNetwork ?? true;\n    this.captureNavigation = options.captureNavigation ?? true;\n    this.captureHttpServerErrors = options.captureHttpServerErrors ?? false;\n\n    // When always-on session recording is on, segments rotate every 30 s and\n    // drain the logs/actions buffers on each rotation. The window/cap need to\n    // span a full segment so we don't ship a partial slice. When always-on is\n    // off, keep the legacy 10 s / 200 cap — the rolling buffer powers the\n    // exception-bound clip and shouldn't grow unbounded.\n    const alwaysOn = options.recordAllSessions === true;\n    const bufferOpts = {\n      windowMs: options.eventsWindowMs ?? (alwaysOn ? 30_000 : 10_000),\n      maxSize: options.eventsMaxCount ?? (alwaysOn ? 600 : 200),\n    };\n    this.logs = new EventBuffer<LogEvent>(bufferOpts);\n    this.actions = new EventBuffer<NetworkEvent | NavigationEvent | CustomEvent>(bufferOpts);\n\n    this.recordAllSessions = options.recordAllSessions ?? false;\n    const hasWindow = typeof window !== \"undefined\";\n\n    // The always-on session/lifecycle path runs even when sessionRecording is\n    // disabled — exceptions still get stamped with sessionId and the parent\n    // sessions row is still created. Without a recorder, no rrweb segments\n    // ride along, but the linkage in the dashboard remains intact.\n    if (this.recordAllSessions && hasWindow) {\n      this.beginSession();\n      this.lifecycle = new SessionLifecycle({\n        onUnloading: () => {\n          this.unloading = true;\n        },\n        onSessionEnd: () => this.endSession(),\n        onSessionRestart: () => this.restartSession(),\n        onSoftFlush: () => {\n          if (this.pendingSessions.length > 0 || this.pendingRecordings.length > 0) {\n            this.scheduleSync();\n          }\n        },\n      });\n      this.lifecycle.install();\n    }\n\n    if (options.sessionRecording !== false && hasWindow) {\n      const recorderOptions: ConstructorParameters<typeof SessionRecorder>[0] = {\n        segmentDuration: options.sessionRecordingSegmentDuration,\n      };\n      if (this.recordAllSessions) {\n        recorderOptions.onSegmentReady = (seg) => this.handleSegmentReady(seg);\n        // rrweb's emit fires for every DOM mutation/input event — use it as\n        // the lifecycle's activity heartbeat so we don't double-listen on\n        // window for mousedown/keydown/scroll/etc.\n        recorderOptions.onActivity = () => this.lifecycle?.markActivity();\n      }\n      this.recorder = new SessionRecorder(recorderOptions);\n      this.recorder.start();\n    }\n  }\n\n  // ── Session lifecycle (always-on) ──────────────────────────────────────\n\n  private beginSession(): void {\n    this.sessionId = generateUUID();\n    this.sessionStartedAt = nowISO();\n    this.segmentIndex = 0;\n    this.pendingSessions.push({\n      id: this.sessionId,\n      startedAt: this.sessionStartedAt,\n      attributes: this.composedSessionAttributes(),\n    });\n    this.scheduleSync();\n  }\n\n  /**\n   * Merge browser defaults with whatever app-level scope was set via\n   * setAttribute(). App attrs override defaults on key collision.\n   */\n  private composedSessionAttributes(): Record<string, string> {\n    return {\n      ...collectDefaultAttributes(),\n      ...this.globalAttributes,\n    };\n  }\n\n  // ── Global scope ────────────────────────────────────────────────────────\n\n  /**\n   * Attach a key/value attribute to every subsequent session and exception\n   * emitted by this client. If a session is already open, its attributes are\n   * refreshed on the backend immediately. Setting the same key replaces the\n   * previous value.\n   */\n  setAttribute(key: string, value: string): void {\n    if (!key) return;\n    this.globalAttributes[key] = value;\n    this.refreshOpenSessionAttributes();\n  }\n\n  /**\n   * Bulk version of setAttribute. Caller's keys override existing scope.\n   * Triggers one session refresh after the merge, not one per key.\n   */\n  setAttributes(attrs: Record<string, string>): void {\n    if (!attrs) return;\n    let changed = false;\n    for (const k of Object.keys(attrs)) {\n      if (!k) continue;\n      this.globalAttributes[k] = attrs[k]!;\n      changed = true;\n    }\n    if (changed) this.refreshOpenSessionAttributes();\n  }\n\n  removeAttribute(key: string): void {\n    if (key in this.globalAttributes) {\n      delete this.globalAttributes[key];\n      this.refreshOpenSessionAttributes();\n    }\n  }\n\n  clearAttributes(): void {\n    if (Object.keys(this.globalAttributes).length === 0) return;\n    this.globalAttributes = {};\n    this.refreshOpenSessionAttributes();\n  }\n\n  /** @internal — exposed for tests. */\n  currentAttributes(): Record<string, string> {\n    return { ...this.globalAttributes };\n  }\n\n  /**\n   * When the global scope changes mid-session, push a session-refresh\n   * payload (no endedAt) so the backend's ON CONFLICT update writes the new\n   * attribute blob into the existing row. Without this the new attrs would\n   * only land at session close.\n   */\n  private refreshOpenSessionAttributes(): void {\n    if (!this.sessionId || !this.sessionStartedAt) return;\n    if (this.recordAllSessions !== true) return;\n    this.pendingSessions.push({\n      id: this.sessionId,\n      startedAt: this.sessionStartedAt,\n      attributes: this.composedSessionAttributes(),\n    });\n    this.scheduleSync();\n  }\n\n  private endSession(): void {\n    if (!this.sessionId || !this.sessionStartedAt) return;\n\n    if (this.recorder) {\n      const drained = this.recorder.drainCurrent();\n      if (drained && drained.events.length > 0) {\n        this.queueSegment(drained);\n      }\n    }\n\n    this.pendingSessions.push({\n      id: this.sessionId,\n      startedAt: this.sessionStartedAt,\n      endedAt: nowISO(),\n      // Re-snapshot attributes so the upsert doesn't clobber the opening\n      // attribute blob with an empty map. Also picks up URL changes and any\n      // global-scope attributes set during the session.\n      attributes: this.composedSessionAttributes(),\n    });\n\n    // On unload paths the debounce timer never fires — flush directly so the\n    // closing payload rides out on fetch keepalive.\n    if (this.unloading) {\n      if (this.debounceTimer !== null) {\n        clearTimeout(this.debounceTimer);\n        this.debounceTimer = null;\n      }\n      void this.doSync();\n    } else {\n      this.scheduleSync();\n    }\n  }\n\n  /**\n   * Begin a fresh session after the page came back from bfcache. The previous\n   * session was closed by `pagehide`; we generate a new sessionId and reset\n   * the unloading flag so subsequent syncs go back to the gzipped path.\n   */\n  private restartSession(): void {\n    this.unloading = false;\n    this.beginSession();\n  }\n\n  private handleSegmentReady(segment: { events: unknown[]; startedAt: string; endedAt: string }): void {\n    if (!this.sessionId) return;\n    this.queueSegment(segment);\n    this.scheduleSync();\n  }\n\n  private queueSegment(segment: { events: unknown[]; startedAt: string; endedAt: string }): void {\n    if (!this.sessionId) return;\n    // Drain the rolling logs/actions buffers and attach them to this segment.\n    // Clearing prevents segment N+1 from re-shipping the same entries.\n    const logs = this.logs.snapshot();\n    const actions = this.actions.snapshot();\n    if (logs.length > 0) this.logs.clear();\n    if (actions.length > 0) this.actions.clear();\n\n    const payload: SessionRecordingPayload = {\n      sessionId: this.sessionId,\n      segmentIndex: this.segmentIndex++,\n      events: segment.events,\n      startedAt: segment.startedAt,\n      endedAt: segment.endedAt,\n    };\n    if (logs.length > 0) payload.logs = logs;\n    if (actions.length > 0) payload.actions = actions;\n    this.pendingRecordings.push(payload);\n  }\n\n  /** @internal — exposed for tests. */\n  currentSessionId(): string | null {\n    return this.sessionId;\n  }\n\n  // ── Timeline event recording ────────────────────────────────────────────\n\n  recordLog(level: LogEvent[\"level\"], message: string): void {\n    if (!this.captureLogs) return;\n    this.logs.add({ type: \"log\", timestamp: nowISO(), level, message });\n  }\n\n  recordNetworkEvent(event: Omit<NetworkEvent, \"type\" | \"timestamp\"> & { timestamp?: string }): void {\n    if (!this.captureNetwork) return;\n    // Don't record the SDK's own report uploads — otherwise every segment\n    // flush would be captured as a \"network action\" and end up in the next\n    // segment's actions buffer, creating a self-referential tail.\n    if (this.isOwnReportUrl(event.url)) return;\n    this.actions.add({\n      type: \"network\",\n      timestamp: event.timestamp ?? nowISO(),\n      method: event.method,\n      url: event.url,\n      durationMs: event.durationMs,\n      statusCode: event.statusCode,\n      requestBytes: event.requestBytes,\n      responseBytes: event.responseBytes,\n      error: event.error,\n    });\n  }\n\n  private isOwnReportUrl(url: string): boolean {\n    if (!url) return false;\n    if (url === this.apiUrl) return true;\n    // Defensive: match URLs that start with apiUrl plus a query/fragment\n    // suffix, in case the transport ever appends one for diagnostics.\n    if (url.startsWith(this.apiUrl + \"?\") || url.startsWith(this.apiUrl + \"#\")) return true;\n    return false;\n  }\n\n  recordNavigationEvent(event: Omit<NavigationEvent, \"type\" | \"timestamp\"> & { timestamp?: string }): void {\n    if (!this.captureNavigation) return;\n    this.actions.add({\n      type: \"navigation\",\n      timestamp: event.timestamp ?? nowISO(),\n      action: event.action,\n      from: event.from,\n      to: event.to,\n    });\n  }\n\n  /**\n   * Records a custom user-defined breadcrumb. Use to log any app-level action\n   * that should ride along with the next exception (\"user_tapped_pay\",\n   * \"cart_synced\", etc.). Always recorded — there is no per-category opt-out.\n   */\n  recordAction(category: string, name: string, data?: Record<string, unknown>): void {\n    this.actions.add({\n      type: \"custom\",\n      timestamp: nowISO(),\n      category,\n      name,\n      data,\n    });\n  }\n\n  /** @internal — exposed for tests. */\n  bufferedLogs(): LogEvent[] {\n    return this.logs.snapshot();\n  }\n\n  /** @internal — exposed for tests. */\n  bufferedActions(): TracewayEvent[] {\n    return this.actions.snapshot();\n  }\n\n  // ── Exception lifecycle ─────────────────────────────────────────────────\n\n  /**\n   * Promote a 5xx HTTP response into a captured exception. Called from the\n   * fetch / XHR wrappers when `captureHttpServerErrors` is enabled.\n   */\n  captureHttpServerError(\n    method: string,\n    url: string,\n    statusCode: number,\n  ): void {\n    this.addException({\n      traceId: null,\n      stackTrace: `HTTP ${statusCode} ${method} ${url}`,\n      recordedAt: nowISO(),\n      attributes: {\n        \"http.method\": method,\n        \"http.url\": url,\n        \"http.status_code\": String(statusCode),\n      },\n      isMessage: true,\n    });\n  }\n\n  addException(exception: ExceptionStackTrace): void {\n    if (this.shouldIgnore(exception)) {\n      if (this.debug) {\n        console.debug(\n          \"Traceway: exception suppressed by filter\",\n          exception.stackTrace.slice(0, 120),\n        );\n      }\n      return;\n    }\n\n    // Merge in browser-context defaults plus the global scope. Caller-\n    // supplied keys win over both. Order matters: defaults < global < caller.\n    exception.attributes = {\n      ...collectDefaultAttributes(),\n      ...this.globalAttributes,\n      ...(exception.attributes ?? {}),\n    };\n\n    if (!exception.isMessage && !exception.debugIds) {\n      const debugIds = debugIdsForStackTrace(exception.stackTrace);\n      if (debugIds) {\n        exception.debugIds = debugIds;\n      }\n    }\n\n    const recorderEvents =\n      this.recorder && this.recorder.hasSegments()\n        ? this.recorder.getSegments().flatMap((s) => s.events)\n        : [];\n    const logSnapshot = this.logs.snapshot();\n    const actionSnapshot = this.actions.snapshot();\n    const hasTimelineData =\n      recorderEvents.length > 0 ||\n      logSnapshot.length > 0 ||\n      actionSnapshot.length > 0;\n\n    // Tag the exception with the parent session id (if always-on is on) so\n    // the dashboard can show a \"View full session\" link. Sessions and the\n    // per-exception clip are independent attachments — both ride along. The\n    // clip captures the rolling timeline window (default 10 s; bumped to\n    // match `sessionRecordingSegmentDuration` when always-on is active).\n    if (this.recordAllSessions && this.sessionId) {\n      exception.sessionId = this.sessionId;\n    }\n\n    if (hasTimelineData) {\n      const exceptionId = generateUUID();\n      exception.sessionRecordingId = exceptionId;\n      const payload: SessionRecordingPayload = {\n        exceptionId,\n        events: recorderEvents,\n      };\n      const anchors = computeRecordingAnchors(\n        recorderEvents,\n        logSnapshot,\n        actionSnapshot,\n      );\n      if (anchors.startedAt) payload.startedAt = anchors.startedAt;\n      if (anchors.endedAt) payload.endedAt = anchors.endedAt;\n      if (logSnapshot.length > 0) payload.logs = logSnapshot;\n      if (actionSnapshot.length > 0) payload.actions = actionSnapshot;\n      this.pendingRecordings.push(payload);\n    }\n\n    this.pendingExceptions.push(exception);\n    this.scheduleSync();\n  }\n\n  private shouldIgnore(exception: ExceptionStackTrace): boolean {\n    if (this.ignoreErrors.length > 0) {\n      const text = exception.stackTrace;\n      for (const pattern of this.ignoreErrors) {\n        if (typeof pattern === \"string\") {\n          if (text.includes(pattern)) return true;\n        } else {\n          pattern.lastIndex = 0;\n          if (pattern.test(text)) return true;\n        }\n      }\n    }\n\n    if (this.beforeCapture !== null) {\n      try {\n        const result = this.beforeCapture(exception);\n        if (result === false) return true;\n      } catch (err) {\n        if (this.debug) {\n          console.error(\"Traceway: beforeCapture callback threw:\", err);\n        }\n      }\n    }\n\n    return false;\n  }\n\n  private scheduleSync(): void {\n    if (this.debounceTimer !== null) {\n      clearTimeout(this.debounceTimer);\n    }\n    this.debounceTimer = setTimeout(() => {\n      this.debounceTimer = null;\n      this.doSync();\n    }, this.debounceMs);\n  }\n\n  private async doSync(): Promise<void> {\n    if (this.isSyncing) return;\n    if (\n      this.pendingExceptions.length === 0 &&\n      this.pendingRecordings.length === 0 &&\n      this.pendingSessions.length === 0\n    ) {\n      return;\n    }\n\n    this.isSyncing = true;\n    const batch = this.pendingExceptions.splice(0);\n    const recordings = this.pendingRecordings.splice(0);\n    const sessions = this.pendingSessions.splice(0);\n\n    const frame: CollectionFrame = {\n      stackTraces: batch,\n      metrics: [],\n      traces: [],\n      sessionRecordings: recordings.length > 0 ? recordings : undefined,\n      sessions: sessions.length > 0 ? sessions : undefined,\n    };\n\n    const payload: ReportRequest = {\n      collectionFrames: [frame],\n      appVersion: this.version,\n      serverName: \"\",\n    };\n\n    let failed = false;\n    try {\n      const success = await sendReport(\n        this.apiUrl,\n        this.token,\n        JSON.stringify(payload),\n        this.unloading ? { keepalive: true } : undefined,\n      );\n      if (!success) {\n        failed = true;\n        this.pendingExceptions.unshift(...batch);\n        this.pendingRecordings.unshift(...recordings);\n        this.pendingSessions.unshift(...sessions);\n        if (this.debug) {\n          console.error(\"Traceway: sync failed, re-queued exceptions\");\n        }\n      }\n    } catch (err) {\n      failed = true;\n      this.pendingExceptions.unshift(...batch);\n      this.pendingRecordings.unshift(...recordings);\n      this.pendingSessions.unshift(...sessions);\n      if (this.debug) {\n        console.error(\"Traceway: sync error:\", err);\n      }\n    } finally {\n      this.isSyncing = false;\n      if (\n        this.pendingExceptions.length > 0 ||\n        this.pendingRecordings.length > 0 ||\n        this.pendingSessions.length > 0\n      ) {\n        if (failed) {\n          this.scheduleRetry();\n        } else {\n          this.doSync();\n        }\n      }\n    }\n  }\n\n  private scheduleRetry(): void {\n    if (this.retryTimer !== null) return;\n    this.retryTimer = setTimeout(() => {\n      this.retryTimer = null;\n      this.doSync();\n    }, this.retryDelayMs);\n  }\n\n  async flush(timeoutMs?: number): Promise<void> {\n    if (this.debounceTimer !== null) {\n      clearTimeout(this.debounceTimer);\n      this.debounceTimer = null;\n    }\n    if (this.retryTimer !== null) {\n      clearTimeout(this.retryTimer);\n      this.retryTimer = null;\n    }\n    if (this.lifecycle) {\n      this.lifecycle.uninstall();\n    }\n    if (this.recordAllSessions) {\n      this.endSession();\n    }\n    if (this.recorder) {\n      this.recorder.stop();\n    }\n\n    const syncPromise = this.doSync();\n\n    if (timeoutMs !== undefined) {\n      await Promise.race([\n        syncPromise,\n        new Promise<void>((resolve) => setTimeout(resolve, timeoutMs)),\n      ]);\n    } else {\n      await syncPromise;\n    }\n  }\n}\n","export async function compressGzip(data: string): Promise<Uint8Array> {\n  const encoder = new TextEncoder();\n  const inputBytes = encoder.encode(data);\n\n  const cs = new CompressionStream(\"gzip\");\n  const writer = cs.writable.getWriter();\n  writer.write(inputBytes);\n  writer.close();\n\n  const reader = cs.readable.getReader();\n  const chunks: Uint8Array[] = [];\n  let totalLength = 0;\n\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    chunks.push(value);\n    totalLength += value.length;\n  }\n\n  const result = new Uint8Array(totalLength);\n  let offset = 0;\n  for (const chunk of chunks) {\n    result.set(chunk, offset);\n    offset += chunk.length;\n  }\n\n  return result;\n}\n\nexport interface SendReportOptions {\n  /**\n   * Set to true on session-end paths (pagehide/unload). Skips gzip and\n   * dispatches synchronously with `fetch(..., { keepalive: true })` so the\n   * request survives navigation. Body is plain JSON — the backend's gzip\n   * middleware bypasses decompression when `Content-Encoding` is absent.\n   * Browser keepalive caps bodies at 64 KB, plenty for a closing-session\n   * payload (final drained segment + closing `ClientSession` row).\n   */\n  keepalive?: boolean;\n}\n\nexport async function sendReport(\n  apiUrl: string,\n  token: string,\n  body: string,\n  options: SendReportOptions = {},\n): Promise<boolean> {\n  if (options.keepalive) {\n    // The pagehide handler returns within microseconds; we cannot `await`\n    // anything (including the async CompressionStream) before dispatching,\n    // or the page unloads before the request is queued.\n    //\n    // We also cannot use navigator.sendBeacon — it can't set Authorization\n    // and the backend's UseClientAuth middleware requires the Bearer header.\n    //\n    // Solution: skip gzip on this path and call fetch synchronously with\n    // keepalive: true. The backend's UseGzip middleware bypasses\n    // decompression when Content-Encoding is absent. Body is plain JSON.\n    // (Browser keepalive cap is 64 KB, plenty for a closing payload.)\n    try {\n      void fetch(apiUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${token}`,\n        },\n        body,\n        keepalive: true,\n      });\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  const compressed = await compressGzip(body);\n  // The compressed Uint8Array is a BodyInit at runtime; the TS lib bundled\n  // with this project narrows it through ArrayBufferLike and trips the type\n  // checker. Cast once at the boundary.\n  const fetchBody = compressed as unknown as BodyInit;\n\n  const resp = await fetch(apiUrl, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      \"Content-Encoding\": \"gzip\",\n      Authorization: `Bearer ${token}`,\n    },\n    body: fetchBody,\n  });\n\n  return resp.status === 200;\n}\n","import type { eventWithTime } from \"rrweb\";\nimport { record } from \"rrweb\";\n\nexport interface SessionRecorderOptions {\n  segmentDuration?: number;\n  /**\n   * Fires when a segment fills up and rotates out (i.e., when `current`\n   * becomes `previous`). The handed-off segment is not yet uploaded — the\n   * caller decides whether to flush it. Used by the always-on path to drop\n   * each completed segment onto the upload queue immediately. Segment length\n   * is set by `segmentDuration` (default 30 s).\n   */\n  onSegmentReady?: (segment: { events: eventWithTime[]; startedAt: string; endedAt: string }) => void;\n  /**\n   * Fires once per rrweb event. Used by the lifecycle layer as the activity\n   * heartbeat — every DOM mutation/input rrweb sees becomes an activity tick,\n   * so we don't need to re-listen for mouse/keyboard/scroll on `window`.\n   */\n  onActivity?: () => void;\n}\n\ninterface Segment {\n  events: eventWithTime[];\n  startedAt: string;\n  startedAtMs: number;\n}\n\nexport class SessionRecorder {\n  private segmentDuration: number;\n  private current: Segment;\n  private previous: Segment | null = null;\n  private stopFn: (() => void) | null = null;\n  private onSegmentReady: SessionRecorderOptions[\"onSegmentReady\"];\n  private onActivity: SessionRecorderOptions[\"onActivity\"];\n\n  constructor(options: SessionRecorderOptions = {}) {\n    this.segmentDuration = options.segmentDuration ?? 30_000;\n    this.current = this.newSegment();\n    this.onSegmentReady = options.onSegmentReady;\n    this.onActivity = options.onActivity;\n  }\n\n  start(): void {\n    this.stopFn = record({\n      emit: (event) => {\n        this.onEvent(event);\n      },\n    });\n  }\n\n  stop(): void {\n    if (this.stopFn) {\n      this.stopFn();\n      this.stopFn = null;\n    }\n  }\n\n  // Rotation is driven off rrweb event timestamps rather than wall-clock\n  // setInterval — when a tab is backgrounded the timer can be throttled or\n  // suspended for arbitrarily long, which used to leave page-load events\n  // sitting in `current` for tens of minutes and inflate the reported\n  // recording duration.\n  private onEvent(event: eventWithTime): void {\n    if (this.onActivity) {\n      try {\n        this.onActivity();\n      } catch {\n        // Subscriber errors must not break recording.\n      }\n    }\n    if (\n      this.current.events.length > 0 &&\n      event.timestamp - this.current.startedAtMs >= this.segmentDuration\n    ) {\n      const completed = this.current;\n      const tooStale =\n        event.timestamp - this.current.startedAtMs >= 2 * this.segmentDuration;\n      this.previous = tooStale ? null : this.current;\n      this.current = this.newSegment();\n      record.takeFullSnapshot();\n      // Notify subscribers about the completed segment after we've rotated so\n      // they observe a stable recorder state. `endedAt` is the timestamp of\n      // the last event included in the segment.\n      if (this.onSegmentReady && completed.events.length > 0) {\n        const lastTs = completed.events[completed.events.length - 1].timestamp;\n        try {\n          this.onSegmentReady({\n            events: completed.events,\n            startedAt: completed.startedAt,\n            endedAt: new Date(lastTs).toISOString(),\n          });\n        } catch {\n          // Subscriber errors must not break recording — rrweb keeps emitting.\n        }\n      }\n    }\n    if (this.current.events.length === 0) {\n      this.current.startedAtMs = event.timestamp;\n      this.current.startedAt = new Date(event.timestamp).toISOString();\n    }\n    this.current.events.push(event);\n  }\n\n  /**\n   * Forcibly rotates the current segment and returns it. Used on session-end\n   * triggers (pagehide / inactivity) to drain the in-flight segment before\n   * upload. Returns `null` when there are no events to drain.\n   */\n  drainCurrent(): { events: eventWithTime[]; startedAt: string; endedAt: string } | null {\n    if (this.current.events.length === 0) return null;\n    const completed = this.current;\n    this.current = this.newSegment();\n    const lastTs = completed.events[completed.events.length - 1].timestamp;\n    return {\n      events: completed.events,\n      startedAt: completed.startedAt,\n      endedAt: new Date(lastTs).toISOString(),\n    };\n  }\n\n  private newSegment(): Segment {\n    const now = Date.now();\n    return {\n      events: [],\n      startedAt: new Date(now).toISOString(),\n      startedAtMs: now,\n    };\n  }\n\n  getSegments(): { events: eventWithTime[]; timestamp: string }[] {\n    const segments: { events: eventWithTime[]; timestamp: string }[] = [];\n    if (this.previous && this.previous.events.length > 0) {\n      segments.push({\n        events: this.previous.events,\n        timestamp: this.previous.startedAt,\n      });\n    }\n    if (this.current.events.length > 0) {\n      segments.push({\n        events: this.current.events,\n        timestamp: this.current.startedAt,\n      });\n    }\n    return segments;\n  }\n\n  hasSegments(): boolean {\n    return (\n      this.current.events.length > 0 ||\n      (this.previous !== null && this.previous.events.length > 0)\n    );\n  }\n\n  flush(): void {\n    this.previous = null;\n    this.current = this.newSegment();\n    if (this.stopFn) {\n      record.takeFullSnapshot();\n    }\n  }\n}\n","/**\n * Tracks user-session boundaries when `recordAllSessions: true`.\n *\n *   - Inactivity timeout: 15 minutes since the last `markActivity()` call.\n *   - Max duration: 60 minutes from session start ends the session unconditionally.\n *   - Page unload: `pagehide` ends the session and triggers a final flush.\n *   - Visibility transitions to `hidden` trigger a soft flush without ending the session.\n *\n * Activity detection itself is delegated to the caller — `client.ts` taps\n * rrweb's `emit` callback and forwards each event to `markActivity()`. That\n * single hook covers every input rrweb captures (mouse, keyboard, touch,\n * scroll, navigation) without re-registering the same listeners on `window`.\n */\n\nexport interface SessionLifecycleOptions {\n  inactivityMs?: number;\n  maxDurationMs?: number;\n  /** Polling interval for inactivity/max checks. Defaults to 30 s. */\n  checkIntervalMs?: number;\n  onSessionEnd: () => void;\n  onSoftFlush?: () => void;\n  /**\n   * Fires synchronously *before* `onSessionEnd` when the page is actually\n   * unloading (`pagehide`). The client uses this to flip an `unloading`\n   * flag so the closing flush picks the keepalive transport path.\n   */\n  onUnloading?: () => void;\n  /**\n   * Fires when the page is restored from the back/forward (bfcache) — i.e.\n   * `pageshow` with `event.persisted === true`. The previous session was\n   * closed at `pagehide`; this is the SDK's signal to start a fresh one\n   * with a new sessionId.\n   */\n  onSessionRestart?: () => void;\n}\n\nexport class SessionLifecycle {\n  private inactivityMs: number;\n  private maxDurationMs: number;\n  private checkIntervalMs: number;\n  private onSessionEnd: () => void;\n  private onSoftFlush: () => void;\n  private onUnloading: () => void;\n  private onSessionRestart: () => void;\n\n  private startedAtMs: number;\n  private lastActivityMs: number;\n  private timer: ReturnType<typeof setInterval> | null = null;\n  private installed = false;\n  private ended = false;\n\n  private boundPagehide = () => this.handlePagehide();\n  private boundVisibility = () => this.handleVisibility();\n  private boundPageshow = (e: PageTransitionEvent) => this.handlePageshow(e);\n\n  constructor(options: SessionLifecycleOptions) {\n    this.inactivityMs = options.inactivityMs ?? 15 * 60_000;\n    this.maxDurationMs = options.maxDurationMs ?? 60 * 60_000;\n    this.checkIntervalMs = options.checkIntervalMs ?? 30_000;\n    this.onSessionEnd = options.onSessionEnd;\n    this.onSoftFlush = options.onSoftFlush ?? (() => {});\n    this.onUnloading = options.onUnloading ?? (() => {});\n    this.onSessionRestart = options.onSessionRestart ?? (() => {});\n\n    const now = Date.now();\n    this.startedAtMs = now;\n    this.lastActivityMs = now;\n  }\n\n  install(): void {\n    if (this.installed || typeof window === \"undefined\") return;\n    window.addEventListener(\"pagehide\", this.boundPagehide);\n    window.addEventListener(\"pageshow\", this.boundPageshow);\n    document.addEventListener(\"visibilitychange\", this.boundVisibility);\n    this.timer = setInterval(() => this.tick(), this.checkIntervalMs);\n    this.installed = true;\n  }\n\n  uninstall(): void {\n    if (!this.installed) return;\n    window.removeEventListener(\"pagehide\", this.boundPagehide);\n    window.removeEventListener(\"pageshow\", this.boundPageshow);\n    document.removeEventListener(\"visibilitychange\", this.boundVisibility);\n    if (this.timer !== null) {\n      clearInterval(this.timer);\n      this.timer = null;\n    }\n    this.installed = false;\n  }\n\n  /**\n   * Bump the last-activity timestamp. Wire this to rrweb's `emit` callback —\n   * every DOM mutation/input rrweb captures becomes an activity tick here.\n   */\n  markActivity(): void {\n    this.lastActivityMs = Date.now();\n  }\n\n  /** Start fresh — used after a previous session ended via timeout. */\n  reset(): void {\n    const now = Date.now();\n    this.startedAtMs = now;\n    this.lastActivityMs = now;\n    this.ended = false;\n  }\n\n  startedAt(): Date {\n    return new Date(this.startedAtMs);\n  }\n\n  private tick(): void {\n    if (this.ended) return;\n    const now = Date.now();\n    if (now - this.lastActivityMs >= this.inactivityMs || now - this.startedAtMs >= this.maxDurationMs) {\n      this.endSession();\n    }\n  }\n\n  private handlePagehide(): void {\n    try {\n      this.onUnloading();\n    } catch {\n      // ignore\n    }\n    this.endSession();\n  }\n\n  private handlePageshow(event: PageTransitionEvent): void {\n    // event.persisted === true means the browser restored the page from\n    // bfcache (back/forward navigation). The previous session was already\n    // closed by pagehide; the client needs a fresh one. The persisted ===\n    // false case is just the initial page load, which the SDK handled at\n    // construction time — nothing to do.\n    if (!event.persisted) return;\n    this.reset();\n    try {\n      this.onSessionRestart();\n    } catch {\n      // ignore\n    }\n  }\n\n  private handleVisibility(): void {\n    if (typeof document === \"undefined\") return;\n    if (document.visibilityState === \"hidden\") {\n      this.onSoftFlush();\n    }\n  }\n\n  private endSession(): void {\n    if (this.ended) return;\n    this.ended = true;\n    try {\n      this.onSessionEnd();\n    } catch {\n      // Caller errors must not bubble into a unload handler.\n    }\n  }\n}\n","/**\n * Snapshot of browser-visible context that's useful to attach to every\n * exception and session — the standard set of fields most observability\n * SDKs collect by default. Each call re-reads `window` / `navigator` so\n * attributes reflect the current state (e.g. URL changes after SPA\n * navigation).\n *\n * Returns an empty object on the server (no `window`).\n */\nexport function collectDefaultAttributes(): Record<string, string> {\n  if (typeof window === \"undefined\") return {};\n\n  const attrs: Record<string, string> = {};\n\n  try {\n    attrs.url = window.location.href;\n    attrs.path = window.location.pathname;\n  } catch {\n    // ignore — sandboxed iframes can throw on location access\n  }\n\n  try {\n    if (document.referrer) attrs.referrer = document.referrer;\n  } catch {\n    // ignore\n  }\n\n  try {\n    if (navigator.userAgent) attrs.userAgent = navigator.userAgent;\n    if (navigator.language) attrs.language = navigator.language;\n    if (navigator.platform) attrs.platform = navigator.platform;\n  } catch {\n    // ignore\n  }\n\n  try {\n    const w = window.innerWidth;\n    const h = window.innerHeight;\n    if (Number.isFinite(w) && Number.isFinite(h)) {\n      attrs.viewport = `${w}x${h}`;\n    }\n  } catch {\n    // ignore\n  }\n\n  try {\n    if (window.screen) {\n      const sw = window.screen.width;\n      const sh = window.screen.height;\n      if (Number.isFinite(sw) && Number.isFinite(sh)) {\n        attrs.screen = `${sw}x${sh}`;\n      }\n    }\n  } catch {\n    // ignore\n  }\n\n  try {\n    const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n    if (tz) attrs.timezone = tz;\n  } catch {\n    // ignore\n  }\n\n  return attrs;\n}\n","const FRAME_PATTERNS = [\n  /^\\s+at\\s+.+?\\s+\\((.+):\\d+:\\d+\\)$/,\n  /^\\s+at\\s+(.+):\\d+:\\d+$/,\n  /^(?:.*@)?(.+):\\d+:\\d+$/,\n];\n\nfunction filenameFromStack(stack: string): string | undefined {\n  for (const line of stack.split(\"\\n\")) {\n    for (const pattern of FRAME_PATTERNS) {\n      const match = line.match(pattern);\n      if (match) {\n        const parts = match[1].split(\"/\");\n        return parts[parts.length - 1];\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction isRegistry(value: unknown): value is Record<string, string> {\n  return typeof value === \"object\" && value !== null;\n}\n\nlet cachedKeyCount = -1;\nlet cachedMap: Record<string, string> = {};\n\n/**\n * Builds a filename → debugId map from the registries that\n * `@tracewayapp/bundler-plugin` (or Sentry's bundler plugins) inject into\n * bundles. Each registry key is the stack of a synthetic error thrown at the\n * top of a bundle, so its first frame points at the bundle's own runtime URL.\n */\nexport function collectDebugIds(): Record<string, string> | undefined {\n  const g = globalThis as Record<string, unknown>;\n  const registries = [g._tracewayDebugIds, g._sentryDebugIds].filter(isRegistry);\n  if (registries.length === 0) {\n    return undefined;\n  }\n\n  let keyCount = 0;\n  for (const registry of registries) {\n    keyCount += Object.keys(registry).length;\n  }\n  if (keyCount !== cachedKeyCount) {\n    const map: Record<string, string> = {};\n    for (const registry of registries) {\n      for (const stackKey of Object.keys(registry)) {\n        const filename = filenameFromStack(stackKey);\n        if (filename && !(filename in map)) {\n          map[filename] = String(registry[stackKey]);\n        }\n      }\n    }\n    cachedKeyCount = keyCount;\n    cachedMap = map;\n  }\n\n  return Object.keys(cachedMap).length > 0 ? cachedMap : undefined;\n}\n\nexport function debugIdsForStackTrace(\n  stackTrace: string,\n): Record<string, string> | undefined {\n  const all = collectDebugIds();\n  if (!all) {\n    return undefined;\n  }\n  let relevant: Record<string, string> | undefined;\n  for (const [filename, debugId] of Object.entries(all)) {\n    if (stackTrace.includes(filename)) {\n      (relevant ??= {})[filename] = debugId;\n    }\n  }\n  return relevant;\n}\n\nexport function resetDebugIdCache(): void {\n  cachedKeyCount = -1;\n  cachedMap = {};\n}\n","export function formatBrowserStackTrace(error: Error): string {\n  const lines: string[] = [];\n  const typeName = error.constructor?.name || \"Error\";\n  lines.push(`${typeName}: ${error.message}`);\n\n  if (error.stack) {\n    const stackLines = error.stack.split(\"\\n\");\n    for (const line of stackLines) {\n      // V8 format: \"    at funcName (file:line:col)\"\n      const v8Match = line.match(/^\\s+at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)$/);\n      if (v8Match) {\n        const funcName = shortenFunctionName(v8Match[1]);\n        const [file, lineNo, colNo] = unwrapEvalLocation(\n          v8Match[2],\n          v8Match[3],\n          v8Match[4],\n        );\n        lines.push(`${funcName}()`);\n        lines.push(`    ${shortenFilePath(file)}:${lineNo}:${colNo}`);\n        continue;\n      }\n\n      // V8 anonymous: \"    at file:line:col\"\n      const v8AnonMatch = line.match(/^\\s+at\\s+(.+):(\\d+):(\\d+)$/);\n      if (v8AnonMatch) {\n        const file = shortenFilePath(v8AnonMatch[1]);\n        lines.push(`<anonymous>()`);\n        lines.push(`    ${file}:${v8AnonMatch[2]}:${v8AnonMatch[3]}`);\n        continue;\n      }\n\n      // Firefox format: \"funcName@file:line:col\"\n      const ffMatch = line.match(/^(.+)@(.+):(\\d+):(\\d+)$/);\n      if (ffMatch) {\n        let rawFn = ffMatch[1];\n        const starIdx = rawFn.lastIndexOf(\"*\");\n        if (starIdx !== -1) {\n          rawFn = rawFn.slice(starIdx + 1);\n          if (!rawFn) {\n            continue;\n          }\n        }\n        const funcName = shortenFunctionName(rawFn) || \"<anonymous>\";\n        const [file, lineNo, colNo] = unwrapEvalLocation(\n          ffMatch[2],\n          ffMatch[3],\n          ffMatch[4],\n        );\n        lines.push(`${funcName}()`);\n        lines.push(`    ${shortenFilePath(file)}:${lineNo}:${colNo}`);\n        continue;\n      }\n\n      // Firefox anonymous: \"@file:line:col\"\n      const ffAnonMatch = line.match(/^@(.+):(\\d+):(\\d+)$/);\n      if (ffAnonMatch) {\n        const [file, lineNo, colNo] = unwrapEvalLocation(\n          ffAnonMatch[1],\n          ffAnonMatch[2],\n          ffAnonMatch[3],\n        );\n        lines.push(`<anonymous>()`);\n        lines.push(`    ${shortenFilePath(file)}:${lineNo}:${colNo}`);\n        continue;\n      }\n    }\n  }\n\n  return lines.join(\"\\n\") + \"\\n\";\n}\n\nfunction unwrapEvalLocation(\n  file: string,\n  lineNo: string,\n  colNo: string,\n): [string, string, string] {\n  if (file.startsWith(\"eval at \")) {\n    const site = file.match(/\\(([^()]+):(\\d+):(\\d+)\\)/);\n    if (site) {\n      return [site[1], site[2], site[3]];\n    }\n  }\n  const gecko = file.match(/^(.*?) line (\\d+) > (?:eval|Function)(?: line \\d+ > (?:eval|Function))*$/);\n  if (gecko) {\n    return [gecko[1], gecko[2], \"1\"];\n  }\n  return [file, lineNo, colNo];\n}\n\nfunction shortenFunctionName(fn: string): string {\n  const slashIdx = fn.lastIndexOf(\"/\");\n  if (slashIdx >= 0) {\n    fn = fn.slice(slashIdx + 1);\n  }\n  const dotIdx = fn.indexOf(\".\");\n  if (dotIdx >= 0) {\n    fn = fn.slice(dotIdx + 1);\n  }\n  return fn;\n}\n\nfunction shortenFilePath(filePath: string): string {\n  const parts = filePath.split(\"/\");\n  return parts[parts.length - 1];\n}\n","import type { TracewayFrontendClient } from \"./client.js\";\nimport { formatBrowserStackTrace } from \"./stack-trace.js\";\nimport { nowISO } from \"@tracewayapp/core\";\nimport { getActiveDistributedTraceId } from \"./fetch-instrumentation.js\";\n\nexport function installGlobalHandlers(client: TracewayFrontendClient): void {\n  const prevOnError = window.onerror;\n  window.onerror = (message, source, lineno, colno, error) => {\n    if (error) {\n      client.addException({\n        traceId: null,\n        stackTrace: formatBrowserStackTrace(error),\n        recordedAt: nowISO(),\n        isMessage: false,\n        distributedTraceId: getActiveDistributedTraceId(),\n      });\n    } else {\n      client.addException({\n        traceId: null,\n        stackTrace: String(message),\n        recordedAt: nowISO(),\n        isMessage: false,\n        distributedTraceId: getActiveDistributedTraceId(),\n      });\n    }\n    if (typeof prevOnError === \"function\") {\n      return prevOnError(message, source, lineno, colno, error);\n    }\n    return false;\n  };\n\n  const prevOnUnhandledRejection = window.onunhandledrejection;\n  window.onunhandledrejection = (event: PromiseRejectionEvent) => {\n    const reason = event.reason;\n    if (reason instanceof Error) {\n      client.addException({\n        traceId: null,\n        stackTrace: formatBrowserStackTrace(reason),\n        recordedAt: nowISO(),\n        isMessage: false,\n        distributedTraceId: getActiveDistributedTraceId(),\n      });\n    } else {\n      client.addException({\n        traceId: null,\n        stackTrace: String(reason),\n        recordedAt: nowISO(),\n        isMessage: false,\n        distributedTraceId: getActiveDistributedTraceId(),\n      });\n    }\n    if (typeof prevOnUnhandledRejection === \"function\") {\n      prevOnUnhandledRejection.call(window, event);\n    }\n  };\n}\n","import { generateUUID } from \"@tracewayapp/core\";\nimport type { TracewayFrontendClient } from \"./client.js\";\n\nlet activeDistributedTraceId: string | null = null;\n\nexport function getActiveDistributedTraceId(): string | null {\n  return activeDistributedTraceId;\n}\n\nexport function setActiveDistributedTraceId(id: string | null): void {\n  activeDistributedTraceId = id;\n}\n\nexport function clearActiveDistributedTraceId(traceId: string): void {\n  if (activeDistributedTraceId === traceId) {\n    activeDistributedTraceId = null;\n  }\n}\n\nfunction isSameOrigin(input: RequestInfo | URL): boolean {\n  try {\n    const url = new URL(\n      typeof input === \"string\"\n        ? input\n        : input instanceof Request\n          ? input.url\n          : input.href,\n      window.location.origin,\n    );\n    return url.origin === window.location.origin;\n  } catch {\n    return true;\n  }\n}\n\nfunction urlOf(input: RequestInfo | URL): string {\n  if (typeof input === \"string\") return input;\n  if (input instanceof URL) return input.href;\n  if (input instanceof Request) return input.url;\n  return String(input);\n}\n\nfunction methodOf(input: RequestInfo | URL, init?: RequestInit): string {\n  if (init?.method) return init.method;\n  if (input instanceof Request) return input.method;\n  return \"GET\";\n}\n\nfunction requestBytesOf(init?: RequestInit): number | undefined {\n  if (!init?.body) return undefined;\n  if (typeof init.body === \"string\") return init.body.length;\n  if (init.body instanceof Blob) return init.body.size;\n  if (init.body instanceof ArrayBuffer) return init.body.byteLength;\n  if (ArrayBuffer.isView(init.body)) return init.body.byteLength;\n  return undefined;\n}\n\nfunction responseBytesOf(response: Response): number | undefined {\n  const contentLength = response.headers.get(\"content-length\");\n  if (contentLength === null) return undefined;\n  const parsed = Number(contentLength);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function installFetchInstrumentation(\n  client?: TracewayFrontendClient,\n): void {\n  const originalFetch = window.fetch;\n\n  window.fetch = function (\n    input: RequestInfo | URL,\n    init?: RequestInit,\n  ): Promise<Response> {\n    const sameOrigin = isSameOrigin(input);\n    const method = methodOf(input, init);\n    const url = urlOf(input);\n    const requestBytes = requestBytesOf(init);\n    const start = performance.now();\n    const startedAt = new Date().toISOString();\n\n    let nextInit = init;\n    let traceId: string | null = null;\n    if (sameOrigin) {\n      traceId = generateUUID();\n      activeDistributedTraceId = traceId;\n      const headers = new Headers(init?.headers);\n      headers.set(\"traceway-trace-id\", traceId);\n      nextInit = { ...init, headers };\n    }\n\n    const recordEvent = (\n      response: Response | null,\n      error: unknown,\n    ): void => {\n      if (!client) return;\n      try {\n        client.recordNetworkEvent({\n          method: method.toUpperCase(),\n          url,\n          durationMs: Math.round(performance.now() - start),\n          statusCode: response?.status,\n          requestBytes,\n          responseBytes: response ? responseBytesOf(response) : undefined,\n          error: error ? String(error) : undefined,\n          timestamp: startedAt,\n        });\n      } catch {\n        // Never let event recording break the host app's networking.\n      }\n    };\n\n    return originalFetch\n      .call(this, input, nextInit)\n      .then((response) => {\n        recordEvent(response, null);\n        if (\n          client &&\n          client.captureHttpServerErrors &&\n          response.status >= 500\n        ) {\n          client.captureHttpServerError(\n            method.toUpperCase(),\n            url,\n            response.status,\n          );\n        }\n        return response;\n      })\n      .catch((err) => {\n        recordEvent(null, err);\n        throw err;\n      })\n      .finally(() => {\n        if (traceId !== null && activeDistributedTraceId === traceId) {\n          activeDistributedTraceId = null;\n        }\n      });\n  };\n}\n","import { generateUUID } from \"@tracewayapp/core\";\nimport type { TracewayFrontendClient } from \"./client.js\";\nimport {\n  setActiveDistributedTraceId,\n  clearActiveDistributedTraceId,\n} from \"./fetch-instrumentation.js\";\n\nfunction isSameOriginUrl(url: string): boolean {\n  try {\n    const resolved = new URL(url, window.location.origin);\n    return resolved.origin === window.location.origin;\n  } catch {\n    return true;\n  }\n}\n\ninterface TracewayXHR extends XMLHttpRequest {\n  _tracewaySameOrigin?: boolean;\n  _tracewayMethod?: string;\n  _tracewayUrl?: string;\n  _tracewayStart?: number;\n  _tracewayStartedAt?: string;\n  _tracewayRequestBytes?: number;\n  _tracewayRecorded?: boolean;\n}\n\nfunction bodyBytes(body?: Document | XMLHttpRequestBodyInit | null): number | undefined {\n  if (body === undefined || body === null) return undefined;\n  if (typeof body === \"string\") return body.length;\n  if (body instanceof Blob) return body.size;\n  if (body instanceof ArrayBuffer) return body.byteLength;\n  if (ArrayBuffer.isView(body)) return body.byteLength;\n  if (body instanceof FormData) return undefined;\n  return undefined;\n}\n\nexport function installXhrInstrumentation(\n  client?: TracewayFrontendClient,\n): void {\n  const originalOpen = XMLHttpRequest.prototype.open;\n  const originalSend = XMLHttpRequest.prototype.send;\n\n  XMLHttpRequest.prototype.open = function (\n    this: TracewayXHR,\n    method: string,\n    url: string | URL,\n    ...rest: any[]\n  ) {\n    const urlStr = String(url);\n    this._tracewaySameOrigin = isSameOriginUrl(urlStr);\n    this._tracewayMethod = method;\n    this._tracewayUrl = urlStr;\n    this._tracewayRecorded = false;\n    return originalOpen.apply(this, [method, url, ...rest] as any);\n  };\n\n  XMLHttpRequest.prototype.send = function (\n    this: TracewayXHR,\n    body?: Document | XMLHttpRequestBodyInit | null,\n  ) {\n    this._tracewayStart = performance.now();\n    this._tracewayStartedAt = new Date().toISOString();\n    this._tracewayRequestBytes = bodyBytes(body);\n\n    let traceId: string | null = null;\n    if (this._tracewaySameOrigin) {\n      traceId = generateUUID();\n      setActiveDistributedTraceId(traceId);\n      this.setRequestHeader(\"traceway-trace-id\", traceId);\n    }\n\n    const finalize = (errorEvent: boolean): void => {\n      if (this._tracewayRecorded) return;\n      this._tracewayRecorded = true;\n      if (client) {\n        try {\n          const contentLength = this.getResponseHeader(\"content-length\");\n          const responseBytes =\n            contentLength !== null && Number.isFinite(Number(contentLength))\n              ? Number(contentLength)\n              : undefined;\n          client.recordNetworkEvent({\n            method: (this._tracewayMethod ?? \"GET\").toUpperCase(),\n            url: this._tracewayUrl ?? \"\",\n            durationMs: Math.round(\n              performance.now() - (this._tracewayStart ?? performance.now()),\n            ),\n            statusCode: this.status || undefined,\n            requestBytes: this._tracewayRequestBytes,\n            responseBytes,\n            error: errorEvent ? `XHR ${this.statusText || \"error\"}` : undefined,\n            timestamp: this._tracewayStartedAt ?? new Date().toISOString(),\n          });\n        } catch {\n          // ignore\n        }\n      }\n      if (traceId !== null) clearActiveDistributedTraceId(traceId);\n      this.removeEventListener(\"load\", onLoad);\n      this.removeEventListener(\"error\", onError);\n      this.removeEventListener(\"abort\", onAbort);\n      this.removeEventListener(\"timeout\", onTimeout);\n    };\n\n    const onLoad = () => finalize(false);\n    const onError = () => finalize(true);\n    const onAbort = () => finalize(true);\n    const onTimeout = () => finalize(true);\n\n    this.addEventListener(\"load\", onLoad);\n    this.addEventListener(\"error\", onError);\n    this.addEventListener(\"abort\", onAbort);\n    this.addEventListener(\"timeout\", onTimeout);\n\n    return originalSend.call(this, body);\n  };\n}\n","import type { TracewayFrontendClient } from \"./client.js\";\nimport type { LogEvent } from \"@tracewayapp/core\";\n\nconst METHODS: Array<{ name: keyof Console; level: LogEvent[\"level\"] }> = [\n  { name: \"debug\", level: \"debug\" },\n  { name: \"log\", level: \"info\" },\n  { name: \"info\", level: \"info\" },\n  { name: \"warn\", level: \"warn\" },\n  { name: \"error\", level: \"error\" },\n];\n\nfunction stringifyArg(arg: unknown): string {\n  if (typeof arg === \"string\") return arg;\n  if (arg instanceof Error) return arg.stack ?? arg.message;\n  if (arg === null || arg === undefined) return String(arg);\n  if (typeof arg === \"object\") {\n    try {\n      return JSON.stringify(arg);\n    } catch {\n      return Object.prototype.toString.call(arg);\n    }\n  }\n  return String(arg);\n}\n\n/**\n * Mirrors `console.{debug,log,info,warn,error}` calls into the client's log\n * buffer. The original console output is preserved — we only piggyback on the\n * call.\n */\nexport function installConsoleInstrumentation(\n  client: TracewayFrontendClient,\n): void {\n  if (typeof console === \"undefined\") return;\n\n  for (const { name, level } of METHODS) {\n    const original = console[name] as ((...args: unknown[]) => void) | undefined;\n    if (typeof original !== \"function\") continue;\n\n    (console as unknown as Record<string, unknown>)[name as string] =\n        function (...args: unknown[]) {\n      try {\n        const message = args.map(stringifyArg).join(\" \");\n        client.recordLog(level, message);\n      } catch {\n        // Never let log capture break the host app.\n      }\n      return original.apply(console, args);\n    };\n  }\n}\n","import type { TracewayFrontendClient } from \"./client.js\";\n\nfunction locationPath(): string {\n  if (typeof window === \"undefined\" || !window.location) return \"\";\n  return window.location.pathname + window.location.search + window.location.hash;\n}\n\n/**\n * Records SPA navigation transitions reported via the History API.\n *\n * Patches `history.pushState` / `history.replaceState` and listens for\n * `popstate`. Hash-only changes are also captured via `hashchange`.\n *\n * Static `<a>`-driven full-page loads do not flow through here (the document\n * unloads before we can record). Use server-side analytics for those.\n */\nexport function installNavigationInstrumentation(\n  client: TracewayFrontendClient,\n): void {\n  if (typeof window === \"undefined\" || !window.history) return;\n\n  let lastPath = locationPath();\n  const record = (action: string) => {\n    const next = locationPath();\n    if (next === lastPath) return;\n    try {\n      client.recordNavigationEvent({\n        action,\n        from: lastPath,\n        to: next,\n      });\n    } catch {\n      // never break navigation\n    }\n    lastPath = next;\n  };\n\n  const originalPush = window.history.pushState;\n  window.history.pushState = function (\n    this: History,\n    ...args: Parameters<History[\"pushState\"]>\n  ) {\n    const result = originalPush.apply(this, args);\n    record(\"push\");\n    return result;\n  };\n\n  const originalReplace = window.history.replaceState;\n  window.history.replaceState = function (\n    this: History,\n    ...args: Parameters<History[\"replaceState\"]>\n  ) {\n    const result = originalReplace.apply(this, args);\n    record(\"replace\");\n    return result;\n  };\n\n  window.addEventListener(\"popstate\", () => record(\"pop\"));\n  window.addEventListener(\"hashchange\", () => record(\"push\"));\n}\n"],"mappings":";AAAA,SAAS,UAAAA,SAAQ,gBAAAC,qBAAoB;;;ACYrC,SAAS,uBAAuB,cAAc,aAAa,cAAc;;;ACZzE,eAAsB,aAAa,MAAmC;AACpE,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,aAAa,QAAQ,OAAO,IAAI;AAEtC,QAAM,KAAK,IAAI,kBAAkB,MAAM;AACvC,QAAM,SAAS,GAAG,SAAS,UAAU;AACrC,SAAO,MAAM,UAAU;AACvB,SAAO,MAAM;AAEb,QAAM,SAAS,GAAG,SAAS,UAAU;AACrC,QAAM,SAAuB,CAAC;AAC9B,MAAI,cAAc;AAElB,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,WAAO,KAAK,KAAK;AACjB,mBAAe,MAAM;AAAA,EACvB;AAEA,QAAM,SAAS,IAAI,WAAW,WAAW;AACzC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,OAAO,MAAM;AACxB,cAAU,MAAM;AAAA,EAClB;AAEA,SAAO;AACT;AAcA,eAAsB,WACpB,QACA,OACA,MACA,UAA6B,CAAC,GACZ;AAClB,MAAI,QAAQ,WAAW;AAYrB,QAAI;AACF,WAAK,MAAM,QAAQ;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,aAAa,IAAI;AAI1C,QAAM,YAAY;AAElB,QAAM,OAAO,MAAM,MAAM,QAAQ;AAAA,IAC/B,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AAED,SAAO,KAAK,WAAW;AACzB;;;AC5FA,SAAS,cAAc;AA0BhB,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,WAA2B;AAAA,EAC3B,SAA8B;AAAA,EAC9B;AAAA,EACA;AAAA,EAER,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,OAAO;AAAA,MACnB,MAAM,CAAC,UAAU;AACf,aAAK,QAAQ,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO;AACZ,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAQ,OAA4B;AAC1C,QAAI,KAAK,YAAY;AACnB,UAAI;AACF,aAAK,WAAW;AAAA,MAClB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QACE,KAAK,QAAQ,OAAO,SAAS,KAC7B,MAAM,YAAY,KAAK,QAAQ,eAAe,KAAK,iBACnD;AACA,YAAM,YAAY,KAAK;AACvB,YAAM,WACJ,MAAM,YAAY,KAAK,QAAQ,eAAe,IAAI,KAAK;AACzD,WAAK,WAAW,WAAW,OAAO,KAAK;AACvC,WAAK,UAAU,KAAK,WAAW;AAC/B,aAAO,iBAAiB;AAIxB,UAAI,KAAK,kBAAkB,UAAU,OAAO,SAAS,GAAG;AACtD,cAAM,SAAS,UAAU,OAAO,UAAU,OAAO,SAAS,CAAC,EAAE;AAC7D,YAAI;AACF,eAAK,eAAe;AAAA,YAClB,QAAQ,UAAU;AAAA,YAClB,WAAW,UAAU;AAAA,YACrB,SAAS,IAAI,KAAK,MAAM,EAAE,YAAY;AAAA,UACxC,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,OAAO,WAAW,GAAG;AACpC,WAAK,QAAQ,cAAc,MAAM;AACjC,WAAK,QAAQ,YAAY,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY;AAAA,IACjE;AACA,SAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAuF;AACrF,QAAI,KAAK,QAAQ,OAAO,WAAW,EAAG,QAAO;AAC7C,UAAM,YAAY,KAAK;AACvB,SAAK,UAAU,KAAK,WAAW;AAC/B,UAAM,SAAS,UAAU,OAAO,UAAU,OAAO,SAAS,CAAC,EAAE;AAC7D,WAAO;AAAA,MACL,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,SAAS,IAAI,KAAK,MAAM,EAAE,YAAY;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,aAAsB;AAC5B,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,WAAW,IAAI,KAAK,GAAG,EAAE,YAAY;AAAA,MACrC,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,cAAgE;AAC9D,UAAM,WAA6D,CAAC;AACpE,QAAI,KAAK,YAAY,KAAK,SAAS,OAAO,SAAS,GAAG;AACpD,eAAS,KAAK;AAAA,QACZ,QAAQ,KAAK,SAAS;AAAA,QACtB,WAAW,KAAK,SAAS;AAAA,MAC3B,CAAC;AAAA,IACH;AACA,QAAI,KAAK,QAAQ,OAAO,SAAS,GAAG;AAClC,eAAS,KAAK;AAAA,QACZ,QAAQ,KAAK,QAAQ;AAAA,QACrB,WAAW,KAAK,QAAQ;AAAA,MAC1B,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAuB;AACrB,WACE,KAAK,QAAQ,OAAO,SAAS,KAC5B,KAAK,aAAa,QAAQ,KAAK,SAAS,OAAO,SAAS;AAAA,EAE7D;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU,KAAK,WAAW;AAC/B,QAAI,KAAK,QAAQ;AACf,aAAO,iBAAiB;AAAA,IAC1B;AAAA,EACF;AACF;;;AC5HO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA,QAA+C;AAAA,EAC/C,YAAY;AAAA,EACZ,QAAQ;AAAA,EAER,gBAAgB,MAAM,KAAK,eAAe;AAAA,EAC1C,kBAAkB,MAAM,KAAK,iBAAiB;AAAA,EAC9C,gBAAgB,CAAC,MAA2B,KAAK,eAAe,CAAC;AAAA,EAEzE,YAAY,SAAkC;AAC5C,SAAK,eAAe,QAAQ,gBAAgB,KAAK;AACjD,SAAK,gBAAgB,QAAQ,iBAAiB,KAAK;AACnD,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,eAAe,QAAQ;AAC5B,SAAK,cAAc,QAAQ,gBAAgB,MAAM;AAAA,IAAC;AAClD,SAAK,cAAc,QAAQ,gBAAgB,MAAM;AAAA,IAAC;AAClD,SAAK,mBAAmB,QAAQ,qBAAqB,MAAM;AAAA,IAAC;AAE5D,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,cAAc;AACnB,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,aAAa,OAAO,WAAW,YAAa;AACrD,WAAO,iBAAiB,YAAY,KAAK,aAAa;AACtD,WAAO,iBAAiB,YAAY,KAAK,aAAa;AACtD,aAAS,iBAAiB,oBAAoB,KAAK,eAAe;AAClE,SAAK,QAAQ,YAAY,MAAM,KAAK,KAAK,GAAG,KAAK,eAAe;AAChE,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,YAAkB;AAChB,QAAI,CAAC,KAAK,UAAW;AACrB,WAAO,oBAAoB,YAAY,KAAK,aAAa;AACzD,WAAO,oBAAoB,YAAY,KAAK,aAAa;AACzD,aAAS,oBAAoB,oBAAoB,KAAK,eAAe;AACrE,QAAI,KAAK,UAAU,MAAM;AACvB,oBAAc,KAAK,KAAK;AACxB,WAAK,QAAQ;AAAA,IACf;AACA,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAqB;AACnB,SAAK,iBAAiB,KAAK,IAAI;AAAA,EACjC;AAAA;AAAA,EAGA,QAAc;AACZ,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,cAAc;AACnB,SAAK,iBAAiB;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,YAAkB;AAChB,WAAO,IAAI,KAAK,KAAK,WAAW;AAAA,EAClC;AAAA,EAEQ,OAAa;AACnB,QAAI,KAAK,MAAO;AAChB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,KAAK,kBAAkB,KAAK,gBAAgB,MAAM,KAAK,eAAe,KAAK,eAAe;AAClG,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,iBAAuB;AAC7B,QAAI;AACF,WAAK,YAAY;AAAA,IACnB,QAAQ;AAAA,IAER;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,eAAe,OAAkC;AAMvD,QAAI,CAAC,MAAM,UAAW;AACtB,SAAK,MAAM;AACX,QAAI;AACF,WAAK,iBAAiB;AAAA,IACxB,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,OAAO,aAAa,YAAa;AACrC,QAAI,SAAS,oBAAoB,UAAU;AACzC,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ;AACb,QAAI;AACF,WAAK,aAAa;AAAA,IACpB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACrJO,SAAS,2BAAmD;AACjE,MAAI,OAAO,WAAW,YAAa,QAAO,CAAC;AAE3C,QAAM,QAAgC,CAAC;AAEvC,MAAI;AACF,UAAM,MAAM,OAAO,SAAS;AAC5B,UAAM,OAAO,OAAO,SAAS;AAAA,EAC/B,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,QAAI,SAAS,SAAU,OAAM,WAAW,SAAS;AAAA,EACnD,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,QAAI,UAAU,UAAW,OAAM,YAAY,UAAU;AACrD,QAAI,UAAU,SAAU,OAAM,WAAW,UAAU;AACnD,QAAI,UAAU,SAAU,OAAM,WAAW,UAAU;AAAA,EACrD,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AACjB,QAAI,OAAO,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,GAAG;AAC5C,YAAM,WAAW,GAAG,CAAC,IAAI,CAAC;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,QAAI,OAAO,QAAQ;AACjB,YAAM,KAAK,OAAO,OAAO;AACzB,YAAM,KAAK,OAAO,OAAO;AACzB,UAAI,OAAO,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,GAAG;AAC9C,cAAM,SAAS,GAAG,EAAE,IAAI,EAAE;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAM,KAAK,KAAK,eAAe,EAAE,gBAAgB,EAAE;AACnD,QAAI,GAAI,OAAM,WAAW;AAAA,EAC3B,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;;;ACjEA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,kBAAkB,OAAmC;AAC5D,aAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,eAAW,WAAW,gBAAgB;AACpC,YAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,UAAI,OAAO;AACT,cAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG;AAChC,eAAO,MAAM,MAAM,SAAS,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAiD;AACnE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,IAAI,iBAAiB;AACrB,IAAI,YAAoC,CAAC;AAQlC,SAAS,kBAAsD;AACpE,QAAM,IAAI;AACV,QAAM,aAAa,CAAC,EAAE,mBAAmB,EAAE,eAAe,EAAE,OAAO,UAAU;AAC7E,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACf,aAAW,YAAY,YAAY;AACjC,gBAAY,OAAO,KAAK,QAAQ,EAAE;AAAA,EACpC;AACA,MAAI,aAAa,gBAAgB;AAC/B,UAAM,MAA8B,CAAC;AACrC,eAAW,YAAY,YAAY;AACjC,iBAAW,YAAY,OAAO,KAAK,QAAQ,GAAG;AAC5C,cAAM,WAAW,kBAAkB,QAAQ;AAC3C,YAAI,YAAY,EAAE,YAAY,MAAM;AAClC,cAAI,QAAQ,IAAI,OAAO,SAAS,QAAQ,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,qBAAiB;AACjB,gBAAY;AAAA,EACd;AAEA,SAAO,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,YAAY;AACzD;AAEO,SAAS,sBACd,YACoC;AACpC,QAAM,MAAM,gBAAgB;AAC5B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI;AACJ,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,GAAG,GAAG;AACrD,QAAI,WAAW,SAAS,QAAQ,GAAG;AACjC,OAAC,aAAa,CAAC,GAAG,QAAQ,IAAI;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;;;ALnDA,SAAS,aAAa,IAAoB;AACxC,SAAO,IAAI,KAAK,EAAE,EAAE,YAAY;AAClC;AAQA,SAAS,wBACP,gBACA,MACA,SAC0C;AAC1C,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,SAAmB,CAAC;AAC1B,eAAW,KAAK,gBAAgB;AAC9B,YAAM,KAAM,GAAsB;AAClC,UAAI,OAAO,OAAO,YAAY,OAAO,SAAS,EAAE,EAAG,QAAO,KAAK,EAAE;AAAA,IACnE;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO;AAAA,QACL,WAAW,aAAa,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,QAC3C,SAAS,aAAa,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,GAAG,KAAK,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,SAAS,CAAC;AAAA,IAC1C,GAAG,QAAQ,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/C,EAAE,OAAO,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAClC,MAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AACtC,SAAO;AAAA,IACL,WAAW,aAAa,KAAK,IAAI,GAAG,WAAW,CAAC;AAAA,IAChD,SAAS,aAAa,KAAK,IAAI,GAAG,WAAW,CAAC;AAAA,EAChD;AACF;AAEO,IAAM,0BAAkD;AAAA;AAAA,EAE7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AACF;AA2CO,IAAM,yBAAN,MAA6B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,oBAA2C,CAAC;AAAA,EAC5C,oBAA+C,CAAC;AAAA,EAChD,kBAAoC,CAAC;AAAA,EACrC,YAAY;AAAA,EACZ,gBAAsD;AAAA,EACtD,aAAmD;AAAA,EAEnD,WAAmC;AAAA,EACnC,YAAqC;AAAA,EAC5B;AAAA,EACT,YAA2B;AAAA,EAC3B,mBAAkC;AAAA,EAClC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,mBAA2C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5C,YAAY;AAAA,EAEZ;AAAA,EACA;AAAA,EAIC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EAEjB,YAAY,kBAA0B,UAAmC,CAAC,GAAG;AAC3E,UAAM,EAAE,OAAO,OAAO,IAAI,sBAAsB,gBAAgB;AAChE,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,gBAAgB,QAAQ,iBAAiB;AAE9C,SAAK,cAAc,QAAQ,eAAe;AAC1C,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,0BAA0B,QAAQ,2BAA2B;AAOlE,UAAM,WAAW,QAAQ,sBAAsB;AAC/C,UAAM,aAAa;AAAA,MACjB,UAAU,QAAQ,mBAAmB,WAAW,MAAS;AAAA,MACzD,SAAS,QAAQ,mBAAmB,WAAW,MAAM;AAAA,IACvD;AACA,SAAK,OAAO,IAAI,YAAsB,UAAU;AAChD,SAAK,UAAU,IAAI,YAA0D,UAAU;AAEvF,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,UAAM,YAAY,OAAO,WAAW;AAMpC,QAAI,KAAK,qBAAqB,WAAW;AACvC,WAAK,aAAa;AAClB,WAAK,YAAY,IAAI,iBAAiB;AAAA,QACpC,aAAa,MAAM;AACjB,eAAK,YAAY;AAAA,QACnB;AAAA,QACA,cAAc,MAAM,KAAK,WAAW;AAAA,QACpC,kBAAkB,MAAM,KAAK,eAAe;AAAA,QAC5C,aAAa,MAAM;AACjB,cAAI,KAAK,gBAAgB,SAAS,KAAK,KAAK,kBAAkB,SAAS,GAAG;AACxE,iBAAK,aAAa;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAC;AACD,WAAK,UAAU,QAAQ;AAAA,IACzB;AAEA,QAAI,QAAQ,qBAAqB,SAAS,WAAW;AACnD,YAAM,kBAAoE;AAAA,QACxE,iBAAiB,QAAQ;AAAA,MAC3B;AACA,UAAI,KAAK,mBAAmB;AAC1B,wBAAgB,iBAAiB,CAAC,QAAQ,KAAK,mBAAmB,GAAG;AAIrE,wBAAgB,aAAa,MAAM,KAAK,WAAW,aAAa;AAAA,MAClE;AACA,WAAK,WAAW,IAAI,gBAAgB,eAAe;AACnD,WAAK,SAAS,MAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIQ,eAAqB;AAC3B,SAAK,YAAY,aAAa;AAC9B,SAAK,mBAAmB,OAAO;AAC/B,SAAK,eAAe;AACpB,SAAK,gBAAgB,KAAK;AAAA,MACxB,IAAI,KAAK;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK,0BAA0B;AAAA,IAC7C,CAAC;AACD,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,4BAAoD;AAC1D,WAAO;AAAA,MACL,GAAG,yBAAyB;AAAA,MAC5B,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,KAAa,OAAqB;AAC7C,QAAI,CAAC,IAAK;AACV,SAAK,iBAAiB,GAAG,IAAI;AAC7B,SAAK,6BAA6B;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,OAAqC;AACjD,QAAI,CAAC,MAAO;AACZ,QAAI,UAAU;AACd,eAAW,KAAK,OAAO,KAAK,KAAK,GAAG;AAClC,UAAI,CAAC,EAAG;AACR,WAAK,iBAAiB,CAAC,IAAI,MAAM,CAAC;AAClC,gBAAU;AAAA,IACZ;AACA,QAAI,QAAS,MAAK,6BAA6B;AAAA,EACjD;AAAA,EAEA,gBAAgB,KAAmB;AACjC,QAAI,OAAO,KAAK,kBAAkB;AAChC,aAAO,KAAK,iBAAiB,GAAG;AAChC,WAAK,6BAA6B;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,kBAAwB;AACtB,QAAI,OAAO,KAAK,KAAK,gBAAgB,EAAE,WAAW,EAAG;AACrD,SAAK,mBAAmB,CAAC;AACzB,SAAK,6BAA6B;AAAA,EACpC;AAAA;AAAA,EAGA,oBAA4C;AAC1C,WAAO,EAAE,GAAG,KAAK,iBAAiB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,+BAAqC;AAC3C,QAAI,CAAC,KAAK,aAAa,CAAC,KAAK,iBAAkB;AAC/C,QAAI,KAAK,sBAAsB,KAAM;AACrC,SAAK,gBAAgB,KAAK;AAAA,MACxB,IAAI,KAAK;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK,0BAA0B;AAAA,IAC7C,CAAC;AACD,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAmB;AACzB,QAAI,CAAC,KAAK,aAAa,CAAC,KAAK,iBAAkB;AAE/C,QAAI,KAAK,UAAU;AACjB,YAAM,UAAU,KAAK,SAAS,aAAa;AAC3C,UAAI,WAAW,QAAQ,OAAO,SAAS,GAAG;AACxC,aAAK,aAAa,OAAO;AAAA,MAC3B;AAAA,IACF;AAEA,SAAK,gBAAgB,KAAK;AAAA,MACxB,IAAI,KAAK;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA,MAIhB,YAAY,KAAK,0BAA0B;AAAA,IAC7C,CAAC;AAID,QAAI,KAAK,WAAW;AAClB,UAAI,KAAK,kBAAkB,MAAM;AAC/B,qBAAa,KAAK,aAAa;AAC/B,aAAK,gBAAgB;AAAA,MACvB;AACA,WAAK,KAAK,OAAO;AAAA,IACnB,OAAO;AACL,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAuB;AAC7B,SAAK,YAAY;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,mBAAmB,SAA0E;AACnG,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAa,SAA0E;AAC7F,QAAI,CAAC,KAAK,UAAW;AAGrB,UAAM,OAAO,KAAK,KAAK,SAAS;AAChC,UAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,QAAI,KAAK,SAAS,EAAG,MAAK,KAAK,MAAM;AACrC,QAAI,QAAQ,SAAS,EAAG,MAAK,QAAQ,MAAM;AAE3C,UAAM,UAAmC;AAAA,MACvC,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,IACnB;AACA,QAAI,KAAK,SAAS,EAAG,SAAQ,OAAO;AACpC,QAAI,QAAQ,SAAS,EAAG,SAAQ,UAAU;AAC1C,SAAK,kBAAkB,KAAK,OAAO;AAAA,EACrC;AAAA;AAAA,EAGA,mBAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIA,UAAU,OAA0B,SAAuB;AACzD,QAAI,CAAC,KAAK,YAAa;AACvB,SAAK,KAAK,IAAI,EAAE,MAAM,OAAO,WAAW,OAAO,GAAG,OAAO,QAAQ,CAAC;AAAA,EACpE;AAAA,EAEA,mBAAmB,OAAgF;AACjG,QAAI,CAAC,KAAK,eAAgB;AAI1B,QAAI,KAAK,eAAe,MAAM,GAAG,EAAG;AACpC,SAAK,QAAQ,IAAI;AAAA,MACf,MAAM;AAAA,MACN,WAAW,MAAM,aAAa,OAAO;AAAA,MACrC,QAAQ,MAAM;AAAA,MACd,KAAK,MAAM;AAAA,MACX,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM;AAAA,MACrB,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,KAAsB;AAC3C,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,QAAQ,KAAK,OAAQ,QAAO;AAGhC,QAAI,IAAI,WAAW,KAAK,SAAS,GAAG,KAAK,IAAI,WAAW,KAAK,SAAS,GAAG,EAAG,QAAO;AACnF,WAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,OAAmF;AACvG,QAAI,CAAC,KAAK,kBAAmB;AAC7B,SAAK,QAAQ,IAAI;AAAA,MACf,MAAM;AAAA,MACN,WAAW,MAAM,aAAa,OAAO;AAAA,MACrC,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,IAAI,MAAM;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,UAAkB,MAAc,MAAsC;AACjF,SAAK,QAAQ,IAAI;AAAA,MACf,MAAM;AAAA,MACN,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAA2B;AACzB,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA;AAAA,EAGA,kBAAmC;AACjC,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBACE,QACA,KACA,YACM;AACN,SAAK,aAAa;AAAA,MAChB,SAAS;AAAA,MACT,YAAY,QAAQ,UAAU,IAAI,MAAM,IAAI,GAAG;AAAA,MAC/C,YAAY,OAAO;AAAA,MACnB,YAAY;AAAA,QACV,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,oBAAoB,OAAO,UAAU;AAAA,MACvC;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,WAAsC;AACjD,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,UAAI,KAAK,OAAO;AACd,gBAAQ;AAAA,UACN;AAAA,UACA,UAAU,WAAW,MAAM,GAAG,GAAG;AAAA,QACnC;AAAA,MACF;AACA;AAAA,IACF;AAIA,cAAU,aAAa;AAAA,MACrB,GAAG,yBAAyB;AAAA,MAC5B,GAAG,KAAK;AAAA,MACR,GAAI,UAAU,cAAc,CAAC;AAAA,IAC/B;AAEA,QAAI,CAAC,UAAU,aAAa,CAAC,UAAU,UAAU;AAC/C,YAAM,WAAW,sBAAsB,UAAU,UAAU;AAC3D,UAAI,UAAU;AACZ,kBAAU,WAAW;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,iBACJ,KAAK,YAAY,KAAK,SAAS,YAAY,IACvC,KAAK,SAAS,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,IACnD,CAAC;AACP,UAAM,cAAc,KAAK,KAAK,SAAS;AACvC,UAAM,iBAAiB,KAAK,QAAQ,SAAS;AAC7C,UAAM,kBACJ,eAAe,SAAS,KACxB,YAAY,SAAS,KACrB,eAAe,SAAS;AAO1B,QAAI,KAAK,qBAAqB,KAAK,WAAW;AAC5C,gBAAU,YAAY,KAAK;AAAA,IAC7B;AAEA,QAAI,iBAAiB;AACnB,YAAM,cAAc,aAAa;AACjC,gBAAU,qBAAqB;AAC/B,YAAM,UAAmC;AAAA,QACvC;AAAA,QACA,QAAQ;AAAA,MACV;AACA,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,QAAQ,UAAW,SAAQ,YAAY,QAAQ;AACnD,UAAI,QAAQ,QAAS,SAAQ,UAAU,QAAQ;AAC/C,UAAI,YAAY,SAAS,EAAG,SAAQ,OAAO;AAC3C,UAAI,eAAe,SAAS,EAAG,SAAQ,UAAU;AACjD,WAAK,kBAAkB,KAAK,OAAO;AAAA,IACrC;AAEA,SAAK,kBAAkB,KAAK,SAAS;AACrC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAa,WAAyC;AAC5D,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,YAAM,OAAO,UAAU;AACvB,iBAAW,WAAW,KAAK,cAAc;AACvC,YAAI,OAAO,YAAY,UAAU;AAC/B,cAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AAAA,QACrC,OAAO;AACL,kBAAQ,YAAY;AACpB,cAAI,QAAQ,KAAK,IAAI,EAAG,QAAO;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,kBAAkB,MAAM;AAC/B,UAAI;AACF,cAAM,SAAS,KAAK,cAAc,SAAS;AAC3C,YAAI,WAAW,MAAO,QAAO;AAAA,MAC/B,SAAS,KAAK;AACZ,YAAI,KAAK,OAAO;AACd,kBAAQ,MAAM,2CAA2C,GAAG;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,kBAAkB,MAAM;AAC/B,mBAAa,KAAK,aAAa;AAAA,IACjC;AACA,SAAK,gBAAgB,WAAW,MAAM;AACpC,WAAK,gBAAgB;AACrB,WAAK,OAAO;AAAA,IACd,GAAG,KAAK,UAAU;AAAA,EACpB;AAAA,EAEA,MAAc,SAAwB;AACpC,QAAI,KAAK,UAAW;AACpB,QACE,KAAK,kBAAkB,WAAW,KAClC,KAAK,kBAAkB,WAAW,KAClC,KAAK,gBAAgB,WAAW,GAChC;AACA;AAAA,IACF;AAEA,SAAK,YAAY;AACjB,UAAM,QAAQ,KAAK,kBAAkB,OAAO,CAAC;AAC7C,UAAM,aAAa,KAAK,kBAAkB,OAAO,CAAC;AAClD,UAAM,WAAW,KAAK,gBAAgB,OAAO,CAAC;AAE9C,UAAM,QAAyB;AAAA,MAC7B,aAAa;AAAA,MACb,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,MACT,mBAAmB,WAAW,SAAS,IAAI,aAAa;AAAA,MACxD,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,IAC7C;AAEA,UAAM,UAAyB;AAAA,MAC7B,kBAAkB,CAAC,KAAK;AAAA,MACxB,YAAY,KAAK;AAAA,MACjB,YAAY;AAAA,IACd;AAEA,QAAI,SAAS;AACb,QAAI;AACF,YAAM,UAAU,MAAM;AAAA,QACpB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,UAAU,OAAO;AAAA,QACtB,KAAK,YAAY,EAAE,WAAW,KAAK,IAAI;AAAA,MACzC;AACA,UAAI,CAAC,SAAS;AACZ,iBAAS;AACT,aAAK,kBAAkB,QAAQ,GAAG,KAAK;AACvC,aAAK,kBAAkB,QAAQ,GAAG,UAAU;AAC5C,aAAK,gBAAgB,QAAQ,GAAG,QAAQ;AACxC,YAAI,KAAK,OAAO;AACd,kBAAQ,MAAM,6CAA6C;AAAA,QAC7D;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,eAAS;AACT,WAAK,kBAAkB,QAAQ,GAAG,KAAK;AACvC,WAAK,kBAAkB,QAAQ,GAAG,UAAU;AAC5C,WAAK,gBAAgB,QAAQ,GAAG,QAAQ;AACxC,UAAI,KAAK,OAAO;AACd,gBAAQ,MAAM,yBAAyB,GAAG;AAAA,MAC5C;AAAA,IACF,UAAE;AACA,WAAK,YAAY;AACjB,UACE,KAAK,kBAAkB,SAAS,KAChC,KAAK,kBAAkB,SAAS,KAChC,KAAK,gBAAgB,SAAS,GAC9B;AACA,YAAI,QAAQ;AACV,eAAK,cAAc;AAAA,QACrB,OAAO;AACL,eAAK,OAAO;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,eAAe,KAAM;AAC9B,SAAK,aAAa,WAAW,MAAM;AACjC,WAAK,aAAa;AAClB,WAAK,OAAO;AAAA,IACd,GAAG,KAAK,YAAY;AAAA,EACtB;AAAA,EAEA,MAAM,MAAM,WAAmC;AAC7C,QAAI,KAAK,kBAAkB,MAAM;AAC/B,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,KAAK,eAAe,MAAM;AAC5B,mBAAa,KAAK,UAAU;AAC5B,WAAK,aAAa;AAAA,IACpB;AACA,QAAI,KAAK,WAAW;AAClB,WAAK,UAAU,UAAU;AAAA,IAC3B;AACA,QAAI,KAAK,mBAAmB;AAC1B,WAAK,WAAW;AAAA,IAClB;AACA,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,KAAK;AAAA,IACrB;AAEA,UAAM,cAAc,KAAK,OAAO;AAEhC,QAAI,cAAc,QAAW;AAC3B,YAAM,QAAQ,KAAK;AAAA,QACjB;AAAA,QACA,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AMrsBO,SAAS,wBAAwB,OAAsB;AAC5D,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAW,MAAM,aAAa,QAAQ;AAC5C,QAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,OAAO,EAAE;AAE1C,MAAI,MAAM,OAAO;AACf,UAAM,aAAa,MAAM,MAAM,MAAM,IAAI;AACzC,eAAW,QAAQ,YAAY;AAE7B,YAAM,UAAU,KAAK,MAAM,wCAAwC;AACnE,UAAI,SAAS;AACX,cAAM,WAAW,oBAAoB,QAAQ,CAAC,CAAC;AAC/C,cAAM,CAAC,MAAM,QAAQ,KAAK,IAAI;AAAA,UAC5B,QAAQ,CAAC;AAAA,UACT,QAAQ,CAAC;AAAA,UACT,QAAQ,CAAC;AAAA,QACX;AACA,cAAM,KAAK,GAAG,QAAQ,IAAI;AAC1B,cAAM,KAAK,OAAO,gBAAgB,IAAI,CAAC,IAAI,MAAM,IAAI,KAAK,EAAE;AAC5D;AAAA,MACF;AAGA,YAAM,cAAc,KAAK,MAAM,4BAA4B;AAC3D,UAAI,aAAa;AACf,cAAM,OAAO,gBAAgB,YAAY,CAAC,CAAC;AAC3C,cAAM,KAAK,eAAe;AAC1B,cAAM,KAAK,OAAO,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE;AAC5D;AAAA,MACF;AAGA,YAAM,UAAU,KAAK,MAAM,yBAAyB;AACpD,UAAI,SAAS;AACX,YAAI,QAAQ,QAAQ,CAAC;AACrB,cAAM,UAAU,MAAM,YAAY,GAAG;AACrC,YAAI,YAAY,IAAI;AAClB,kBAAQ,MAAM,MAAM,UAAU,CAAC;AAC/B,cAAI,CAAC,OAAO;AACV;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAW,oBAAoB,KAAK,KAAK;AAC/C,cAAM,CAAC,MAAM,QAAQ,KAAK,IAAI;AAAA,UAC5B,QAAQ,CAAC;AAAA,UACT,QAAQ,CAAC;AAAA,UACT,QAAQ,CAAC;AAAA,QACX;AACA,cAAM,KAAK,GAAG,QAAQ,IAAI;AAC1B,cAAM,KAAK,OAAO,gBAAgB,IAAI,CAAC,IAAI,MAAM,IAAI,KAAK,EAAE;AAC5D;AAAA,MACF;AAGA,YAAM,cAAc,KAAK,MAAM,qBAAqB;AACpD,UAAI,aAAa;AACf,cAAM,CAAC,MAAM,QAAQ,KAAK,IAAI;AAAA,UAC5B,YAAY,CAAC;AAAA,UACb,YAAY,CAAC;AAAA,UACb,YAAY,CAAC;AAAA,QACf;AACA,cAAM,KAAK,eAAe;AAC1B,cAAM,KAAK,OAAO,gBAAgB,IAAI,CAAC,IAAI,MAAM,IAAI,KAAK,EAAE;AAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAEA,SAAS,mBACP,MACA,QACA,OAC0B;AAC1B,MAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,UAAM,OAAO,KAAK,MAAM,0BAA0B;AAClD,QAAI,MAAM;AACR,aAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,IACnC;AAAA,EACF;AACA,QAAM,QAAQ,KAAK,MAAM,0EAA0E;AACnG,MAAI,OAAO;AACT,WAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG;AAAA,EACjC;AACA,SAAO,CAAC,MAAM,QAAQ,KAAK;AAC7B;AAEA,SAAS,oBAAoB,IAAoB;AAC/C,QAAM,WAAW,GAAG,YAAY,GAAG;AACnC,MAAI,YAAY,GAAG;AACjB,SAAK,GAAG,MAAM,WAAW,CAAC;AAAA,EAC5B;AACA,QAAM,SAAS,GAAG,QAAQ,GAAG;AAC7B,MAAI,UAAU,GAAG;AACf,SAAK,GAAG,MAAM,SAAS,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAA0B;AACjD,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,SAAO,MAAM,MAAM,SAAS,CAAC;AAC/B;;;ACtGA,SAAS,UAAAC,eAAc;;;ACFvB,SAAS,gBAAAC,qBAAoB;AAG7B,IAAI,2BAA0C;AAEvC,SAAS,8BAA6C;AAC3D,SAAO;AACT;AAEO,SAAS,4BAA4B,IAAyB;AACnE,6BAA2B;AAC7B;AAEO,SAAS,8BAA8B,SAAuB;AACnE,MAAI,6BAA6B,SAAS;AACxC,+BAA2B;AAAA,EAC7B;AACF;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI;AACF,UAAM,MAAM,IAAI;AAAA,MACd,OAAO,UAAU,WACb,QACA,iBAAiB,UACf,MAAM,MACN,MAAM;AAAA,MACZ,OAAO,SAAS;AAAA,IAClB;AACA,WAAO,IAAI,WAAW,OAAO,SAAS;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,MAAM,OAAkC;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,iBAAiB,IAAK,QAAO,MAAM;AACvC,MAAI,iBAAiB,QAAS,QAAO,MAAM;AAC3C,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,SAAS,OAA0BC,OAA4B;AACtE,MAAIA,OAAM,OAAQ,QAAOA,MAAK;AAC9B,MAAI,iBAAiB,QAAS,QAAO,MAAM;AAC3C,SAAO;AACT;AAEA,SAAS,eAAeA,OAAwC;AAC9D,MAAI,CAACA,OAAM,KAAM,QAAO;AACxB,MAAI,OAAOA,MAAK,SAAS,SAAU,QAAOA,MAAK,KAAK;AACpD,MAAIA,MAAK,gBAAgB,KAAM,QAAOA,MAAK,KAAK;AAChD,MAAIA,MAAK,gBAAgB,YAAa,QAAOA,MAAK,KAAK;AACvD,MAAI,YAAY,OAAOA,MAAK,IAAI,EAAG,QAAOA,MAAK,KAAK;AACpD,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAwC;AAC/D,QAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB;AAC3D,MAAI,kBAAkB,KAAM,QAAO;AACnC,QAAM,SAAS,OAAO,aAAa;AACnC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEO,SAAS,4BACdC,SACM;AACN,QAAM,gBAAgB,OAAO;AAE7B,SAAO,QAAQ,SACb,OACAD,OACmB;AACnB,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,SAAS,SAAS,OAAOA,KAAI;AACnC,UAAM,MAAM,MAAM,KAAK;AACvB,UAAM,eAAe,eAAeA,KAAI;AACxC,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,QAAI,WAAWA;AACf,QAAI,UAAyB;AAC7B,QAAI,YAAY;AACd,gBAAUD,cAAa;AACvB,iCAA2B;AAC3B,YAAM,UAAU,IAAI,QAAQC,OAAM,OAAO;AACzC,cAAQ,IAAI,qBAAqB,OAAO;AACxC,iBAAW,EAAE,GAAGA,OAAM,QAAQ;AAAA,IAChC;AAEA,UAAM,cAAc,CAClB,UACA,UACS;AACT,UAAI,CAACC,QAAQ;AACb,UAAI;AACF,QAAAA,QAAO,mBAAmB;AAAA,UACxB,QAAQ,OAAO,YAAY;AAAA,UAC3B;AAAA,UACA,YAAY,KAAK,MAAM,YAAY,IAAI,IAAI,KAAK;AAAA,UAChD,YAAY,UAAU;AAAA,UACtB;AAAA,UACA,eAAe,WAAW,gBAAgB,QAAQ,IAAI;AAAA,UACtD,OAAO,QAAQ,OAAO,KAAK,IAAI;AAAA,UAC/B,WAAW;AAAA,QACb,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,cACJ,KAAK,MAAM,OAAO,QAAQ,EAC1B,KAAK,CAAC,aAAa;AAClB,kBAAY,UAAU,IAAI;AAC1B,UACEA,WACAA,QAAO,2BACP,SAAS,UAAU,KACnB;AACA,QAAAA,QAAO;AAAA,UACL,OAAO,YAAY;AAAA,UACnB;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,kBAAY,MAAM,GAAG;AACrB,YAAM;AAAA,IACR,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,YAAY,QAAQ,6BAA6B,SAAS;AAC5D,mCAA2B;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACL;AACF;;;ADrIO,SAAS,sBAAsBC,SAAsC;AAC1E,QAAM,cAAc,OAAO;AAC3B,SAAO,UAAU,CAAC,SAAS,QAAQ,QAAQ,OAAO,UAAU;AAC1D,QAAI,OAAO;AACT,MAAAA,QAAO,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,wBAAwB,KAAK;AAAA,QACzC,YAAYC,QAAO;AAAA,QACnB,WAAW;AAAA,QACX,oBAAoB,4BAA4B;AAAA,MAClD,CAAC;AAAA,IACH,OAAO;AACL,MAAAD,QAAO,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,OAAO,OAAO;AAAA,QAC1B,YAAYC,QAAO;AAAA,QACnB,WAAW;AAAA,QACX,oBAAoB,4BAA4B;AAAA,MAClD,CAAC;AAAA,IACH;AACA,QAAI,OAAO,gBAAgB,YAAY;AACrC,aAAO,YAAY,SAAS,QAAQ,QAAQ,OAAO,KAAK;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,2BAA2B,OAAO;AACxC,SAAO,uBAAuB,CAAC,UAAiC;AAC9D,UAAM,SAAS,MAAM;AACrB,QAAI,kBAAkB,OAAO;AAC3B,MAAAD,QAAO,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,wBAAwB,MAAM;AAAA,QAC1C,YAAYC,QAAO;AAAA,QACnB,WAAW;AAAA,QACX,oBAAoB,4BAA4B;AAAA,MAClD,CAAC;AAAA,IACH,OAAO;AACL,MAAAD,QAAO,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,OAAO,MAAM;AAAA,QACzB,YAAYC,QAAO;AAAA,QACnB,WAAW;AAAA,QACX,oBAAoB,4BAA4B;AAAA,MAClD,CAAC;AAAA,IACH;AACA,QAAI,OAAO,6BAA6B,YAAY;AAClD,+BAAyB,KAAK,QAAQ,KAAK;AAAA,IAC7C;AAAA,EACF;AACF;;;AEvDA,SAAS,gBAAAC,qBAAoB;AAO7B,SAAS,gBAAgB,KAAsB;AAC7C,MAAI;AACF,UAAM,WAAW,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AACpD,WAAO,SAAS,WAAW,OAAO,SAAS;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYA,SAAS,UAAU,MAAqE;AACtF,MAAI,SAAS,UAAa,SAAS,KAAM,QAAO;AAChD,MAAI,OAAO,SAAS,SAAU,QAAO,KAAK;AAC1C,MAAI,gBAAgB,KAAM,QAAO,KAAK;AACtC,MAAI,gBAAgB,YAAa,QAAO,KAAK;AAC7C,MAAI,YAAY,OAAO,IAAI,EAAG,QAAO,KAAK;AAC1C,MAAI,gBAAgB,SAAU,QAAO;AACrC,SAAO;AACT;AAEO,SAAS,0BACdC,SACM;AACN,QAAM,eAAe,eAAe,UAAU;AAC9C,QAAM,eAAe,eAAe,UAAU;AAE9C,iBAAe,UAAU,OAAO,SAE9B,QACA,QACG,MACH;AACA,UAAM,SAAS,OAAO,GAAG;AACzB,SAAK,sBAAsB,gBAAgB,MAAM;AACjD,SAAK,kBAAkB;AACvB,SAAK,eAAe;AACpB,SAAK,oBAAoB;AACzB,WAAO,aAAa,MAAM,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAQ;AAAA,EAC/D;AAEA,iBAAe,UAAU,OAAO,SAE9B,MACA;AACA,SAAK,iBAAiB,YAAY,IAAI;AACtC,SAAK,sBAAqB,oBAAI,KAAK,GAAE,YAAY;AACjD,SAAK,wBAAwB,UAAU,IAAI;AAE3C,QAAI,UAAyB;AAC7B,QAAI,KAAK,qBAAqB;AAC5B,gBAAUC,cAAa;AACvB,kCAA4B,OAAO;AACnC,WAAK,iBAAiB,qBAAqB,OAAO;AAAA,IACpD;AAEA,UAAM,WAAW,CAAC,eAA8B;AAC9C,UAAI,KAAK,kBAAmB;AAC5B,WAAK,oBAAoB;AACzB,UAAID,SAAQ;AACV,YAAI;AACF,gBAAM,gBAAgB,KAAK,kBAAkB,gBAAgB;AAC7D,gBAAM,gBACJ,kBAAkB,QAAQ,OAAO,SAAS,OAAO,aAAa,CAAC,IAC3D,OAAO,aAAa,IACpB;AACN,UAAAA,QAAO,mBAAmB;AAAA,YACxB,SAAS,KAAK,mBAAmB,OAAO,YAAY;AAAA,YACpD,KAAK,KAAK,gBAAgB;AAAA,YAC1B,YAAY,KAAK;AAAA,cACf,YAAY,IAAI,KAAK,KAAK,kBAAkB,YAAY,IAAI;AAAA,YAC9D;AAAA,YACA,YAAY,KAAK,UAAU;AAAA,YAC3B,cAAc,KAAK;AAAA,YACnB;AAAA,YACA,OAAO,aAAa,OAAO,KAAK,cAAc,OAAO,KAAK;AAAA,YAC1D,WAAW,KAAK,uBAAsB,oBAAI,KAAK,GAAE,YAAY;AAAA,UAC/D,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AACA,UAAI,YAAY,KAAM,+BAA8B,OAAO;AAC3D,WAAK,oBAAoB,QAAQ,MAAM;AACvC,WAAK,oBAAoB,SAAS,OAAO;AACzC,WAAK,oBAAoB,SAAS,OAAO;AACzC,WAAK,oBAAoB,WAAW,SAAS;AAAA,IAC/C;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,UAAM,UAAU,MAAM,SAAS,IAAI;AACnC,UAAM,UAAU,MAAM,SAAS,IAAI;AACnC,UAAM,YAAY,MAAM,SAAS,IAAI;AAErC,SAAK,iBAAiB,QAAQ,MAAM;AACpC,SAAK,iBAAiB,SAAS,OAAO;AACtC,SAAK,iBAAiB,SAAS,OAAO;AACtC,SAAK,iBAAiB,WAAW,SAAS;AAE1C,WAAO,aAAa,KAAK,MAAM,IAAI;AAAA,EACrC;AACF;;;ACjHA,IAAM,UAAoE;AAAA,EACxE,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,EAChC,EAAE,MAAM,OAAO,OAAO,OAAO;AAAA,EAC7B,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,EAC9B,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,EAC9B,EAAE,MAAM,SAAS,OAAO,QAAQ;AAClC;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,eAAe,MAAO,QAAO,IAAI,SAAS,IAAI;AAClD,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO,OAAO,GAAG;AACxD,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI;AACF,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B,QAAQ;AACN,aAAO,OAAO,UAAU,SAAS,KAAK,GAAG;AAAA,IAC3C;AAAA,EACF;AACA,SAAO,OAAO,GAAG;AACnB;AAOO,SAAS,8BACdE,SACM;AACN,MAAI,OAAO,YAAY,YAAa;AAEpC,aAAW,EAAE,MAAM,MAAM,KAAK,SAAS;AACrC,UAAM,WAAW,QAAQ,IAAI;AAC7B,QAAI,OAAO,aAAa,WAAY;AAEpC,IAAC,QAA+C,IAAc,IAC1D,YAAa,MAAiB;AAChC,UAAI;AACF,cAAM,UAAU,KAAK,IAAI,YAAY,EAAE,KAAK,GAAG;AAC/C,QAAAA,QAAO,UAAU,OAAO,OAAO;AAAA,MACjC,QAAQ;AAAA,MAER;AACA,aAAO,SAAS,MAAM,SAAS,IAAI;AAAA,IACrC;AAAA,EACF;AACF;;;AChDA,SAAS,eAAuB;AAC9B,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,SAAU,QAAO;AAC9D,SAAO,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS;AAC7E;AAWO,SAAS,iCACdC,SACM;AACN,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAS;AAEtD,MAAI,WAAW,aAAa;AAC5B,QAAMC,UAAS,CAAC,WAAmB;AACjC,UAAM,OAAO,aAAa;AAC1B,QAAI,SAAS,SAAU;AACvB,QAAI;AACF,MAAAD,QAAO,sBAAsB;AAAA,QAC3B;AAAA,QACA,MAAM;AAAA,QACN,IAAI;AAAA,MACN,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AACA,eAAW;AAAA,EACb;AAEA,QAAM,eAAe,OAAO,QAAQ;AACpC,SAAO,QAAQ,YAAY,YAEtB,MACH;AACA,UAAM,SAAS,aAAa,MAAM,MAAM,IAAI;AAC5C,IAAAC,QAAO,MAAM;AACb,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,QAAQ;AACvC,SAAO,QAAQ,eAAe,YAEzB,MACH;AACA,UAAM,SAAS,gBAAgB,MAAM,MAAM,IAAI;AAC/C,IAAAA,QAAO,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,YAAY,MAAMA,QAAO,KAAK,CAAC;AACvD,SAAO,iBAAiB,cAAc,MAAMA,QAAO,MAAM,CAAC;AAC5D;;;AZ3CA,IAAI,SAAwC;AAErC,SAAS,KACd,kBACA,UAAmC,CAAC,GAC9B;AACN,WAAS,IAAI,uBAAuB,kBAAkB,OAAO;AAC7D,MAAI,OAAO,WAAW,aAAa;AACjC,0BAAsB,MAAM;AAC5B,gCAA4B,MAAM;AAClC,8BAA0B,MAAM;AAChC,QAAI,OAAO,aAAa;AACtB,oCAA8B,MAAM;AAAA,IACtC;AACA,QAAI,OAAO,mBAAmB;AAC5B,uCAAiC,MAAM;AAAA,IACzC;AAAA,EACF;AACF;AAEO,SAAS,iBACd,OACA,SACM;AACN,MAAI,CAAC,OAAQ;AACb,SAAO,aAAa;AAAA,IAClB,SAAS;AAAA,IACT,YAAY,wBAAwB,KAAK;AAAA,IACzC,YAAYC,QAAO;AAAA,IACnB,WAAW;AAAA,IACX,oBACE,SAAS,sBAAsB,4BAA4B;AAAA,EAC/D,CAAC;AACH;AAEO,SAAS,+BACd,OACA,YACA,SACM;AACN,MAAI,CAAC,OAAQ;AACb,SAAO,aAAa;AAAA,IAClB,SAAS;AAAA,IACT,YAAY,wBAAwB,KAAK;AAAA,IACzC,YAAYA,QAAO;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,IACX,oBACE,SAAS,sBAAsB,4BAA4B;AAAA,EAC/D,CAAC;AACH;AAEO,SAAS,eAAe,KAAmB;AAChD,MAAI,CAAC,OAAQ;AACb,SAAO,aAAa;AAAA,IAClB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAYA,QAAO;AAAA,IACnB,WAAW;AAAA,EACb,CAAC;AACH;AAOO,SAAS,aACd,UACA,MACA,MACM;AACN,MAAI,CAAC,OAAQ;AACb,SAAO,aAAa,UAAU,MAAM,IAAI;AAC1C;AAEA,eAAsB,MAAM,WAAmC;AAC7D,MAAI,CAAC,OAAQ;AACb,QAAM,OAAO,MAAM,SAAS;AAC9B;AAQO,SAAS,aAAa,KAAa,OAAqB;AAC7D,MAAI,CAAC,OAAQ;AACb,SAAO,aAAa,KAAK,KAAK;AAChC;AAGO,SAAS,cAAc,OAAqC;AACjE,MAAI,CAAC,OAAQ;AACb,SAAO,cAAc,KAAK;AAC5B;AAGO,SAAS,gBAAgB,KAAmB;AACjD,MAAI,CAAC,OAAQ;AACb,SAAO,gBAAgB,GAAG;AAC5B;AAGO,SAAS,kBAAwB;AACtC,MAAI,CAAC,OAAQ;AACb,SAAO,gBAAgB;AACzB;AAqBO,IAAM,2BAA2B;AAIjC,SAAS,yBAAyB;AACvC,SAAO,CAAC,WAAgB;AACtB,WAAO,UAAU,OAAO,WAAW,CAAC;AACpC,WAAO,QAAQ,mBAAmB,IAAIC,cAAa;AACnD,WAAO;AAAA,EACT;AACF;","names":["nowISO","generateUUID","nowISO","generateUUID","init","client","client","nowISO","generateUUID","client","generateUUID","client","client","record","nowISO","generateUUID"]}