{"version":3,"file":"index.mjs","sources":["../../../src/errors.ts","../../../src/rate-limit.ts","../../../src/castle.ts","../../../src/requests.ts","../../../src/xpff.ts","../../../src/auth.ts","../../../src/platform/platform-interface.ts","../../../src/platform/index.ts","../../../src/xctxid.ts","../../../src/chrome-fingerprint.ts","../../../src/api.ts","../../../src/auth-user.ts","../../../src/api-data.ts","../../../src/profile.ts","../../../src/timeline-async.ts","../../../src/type-util.ts","../../../src/timeline-tweet-util.ts","../../../src/timeline-v2.ts","../../../src/timeline-search.ts","../../../src/search.ts","../../../src/timeline-relationship.ts","../../../src/relationships.ts","../../../src/trends.ts","../../../src/timeline-list.ts","../../../src/tweets.ts","../../../src/direct-messages-async.ts","../../../src/direct-messages.ts","../../../src/scraper.ts"],"sourcesContent":["export class ApiError extends Error {\n  constructor(readonly response: Response, readonly data: any) {\n    super(\n      `Response status: ${response.status} | headers: ${JSON.stringify(\n        headersToString(response.headers),\n      )} | data: ${typeof data === 'string' ? data : JSON.stringify(data)}`,\n    );\n  }\n\n  static async fromResponse(response: Response) {\n    // Try our best to parse the result, but don't bother if we can't\n    let data: string | object | undefined = undefined;\n    try {\n      if (response.headers.get('content-type')?.includes('application/json')) {\n        data = await response.json();\n      } else {\n        data = await response.text();\n      }\n    } catch {\n      try {\n        data = await response.text();\n      } catch {}\n    }\n\n    return new ApiError(response, data);\n  }\n}\n\nfunction headersToString(headers: Headers): string {\n  const result: string[] = [];\n  headers.forEach((value, key) => {\n    result.push(`${key}: ${value}`);\n  });\n  return result.join('\\n');\n}\n\nexport class AuthenticationError extends Error {\n  constructor(message?: string) {\n    super(message || 'Authentication failed');\n    this.name = 'AuthenticationError';\n  }\n}\n\nexport interface TwitterApiErrorPosition {\n  line: number;\n  column: number;\n}\n\nexport interface TwitterApiErrorTraceInfo {\n  trace_id: string;\n}\n\nexport interface TwitterApiErrorExtensions {\n  code?: number;\n  kind?: string;\n  name?: string;\n  source?: string;\n  tracing?: TwitterApiErrorTraceInfo;\n}\n\nexport interface TwitterApiErrorRaw extends TwitterApiErrorExtensions {\n  message?: string;\n  locations?: TwitterApiErrorPosition[];\n  path?: string[];\n  extensions?: TwitterApiErrorExtensions;\n}\n","import { FetchParameters } from './api-types';\nimport { ApiError } from './errors';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:rate-limit');\n\n/**\n * Information about a rate-limiting event. Both the request and response\n * information are provided.\n */\nexport interface RateLimitEvent {\n  /** The complete arguments that were passed to the fetch function. */\n  fetchParameters: FetchParameters;\n  /** The failing HTTP response. */\n  response: Response;\n}\n\n/**\n * The public interface for all rate-limiting strategies. Library consumers are\n * welcome to provide their own implementations of this interface in the Scraper\n * constructor options.\n *\n * The {@link RateLimitEvent} object contains both the request and response\n * information associated with the event.\n *\n * @example\n * import { Scraper, RateLimitStrategy } from \"@the-convocation/twitter-scraper\";\n *\n * // A custom rate-limiting implementation that just logs request/response information.\n * class ConsoleLogRateLimitStrategy implements RateLimitStrategy {\n *   async onRateLimit(event: RateLimitEvent): Promise<void> {\n *     console.log(event.fetchParameters, event.response);\n *   }\n * }\n *\n * const scraper = new Scraper({\n *   rateLimitStrategy: new ConsoleLogRateLimitStrategy(),\n * });\n */\nexport interface RateLimitStrategy {\n  /**\n   * Called when the scraper is rate limited.\n   * @param event The event information, including the request and response info.\n   */\n  onRateLimit(event: RateLimitEvent): Promise<void>;\n}\n\n/**\n * A rate-limiting strategy that simply waits for the current rate limit period to expire.\n * This has been known to take up to 13 minutes, in some cases.\n */\nexport class WaitingRateLimitStrategy implements RateLimitStrategy {\n  async onRateLimit({ response: res }: RateLimitEvent): Promise<void> {\n    /*\n      Known headers at this point:\n      - x-rate-limit-limit: Maximum number of requests per time period?\n      - x-rate-limit-reset: UNIX timestamp when the current rate limit will be reset.\n      - x-rate-limit-remaining: Number of requests remaining in current time period?\n      */\n    const xRateLimitLimit = res.headers.get('x-rate-limit-limit');\n    const xRateLimitRemaining = res.headers.get('x-rate-limit-remaining');\n    const xRateLimitReset = res.headers.get('x-rate-limit-reset');\n\n    log(\n      `Rate limit event: limit=${xRateLimitLimit}, remaining=${xRateLimitRemaining}, reset=${xRateLimitReset}`,\n    );\n\n    if (xRateLimitRemaining == '0' && xRateLimitReset) {\n      const currentTime = new Date().valueOf() / 1000;\n      const timeDeltaMs = 1000 * (parseInt(xRateLimitReset) - currentTime);\n\n      // I have seen this block for 800s (~13 *minutes*)\n      await new Promise((resolve) => setTimeout(resolve, timeDeltaMs));\n    }\n  }\n}\n\n/**\n * A rate-limiting strategy that throws an {@link ApiError} when a rate limiting event occurs.\n */\nexport class ErrorRateLimitStrategy implements RateLimitStrategy {\n  async onRateLimit({ response: res }: RateLimitEvent): Promise<void> {\n    throw await ApiError.fromResponse(res);\n  }\n}\n","/**\n * castle.ts - Local Castle.io v11 token generation for Twitter/X login flow.\n *\n * Ported from yubie-re/castleio-gen (Python, MIT license, archived May 2025)\n * to TypeScript. Generates device fingerprint tokens required by Twitter's\n * login flow to avoid error 399 (\"suspicious activity\").\n *\n * This generates Castle.io SDK v2.6.0 compatible tokens (version 11).\n *\n * Token structure overview:\n *   1. Collect device/browser fingerprint data (3 parts)\n *   2. Collect behavioral event data (mouse/keyboard/touch metrics)\n *   3. Apply layered XOR encryption with timestamp and UUID keys\n *   4. Prepend header (timestamp, SDK version, publisher key, UUID)\n *   5. XXTEA-encrypt the entire payload\n *   6. Base64URL-encode with version prefix and random XOR byte\n */\n\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:castle');\n\n// ─── Field Encoding Types ────────────────────────────────────────────────────\n\n/**\n * How a fingerprint field's value is serialized into the token.\n * Each field has a 1-byte header (5-bit index + 3-bit encoding type),\n * followed by encoding-specific body bytes.\n */\n/** @internal Exported for testing */\nexport enum FieldEncoding {\n  /** No body bytes (field presence alone is the signal) */\n  Empty = -1,\n  /** Marker field, no body bytes */\n  Marker = 1,\n  /** Single byte value */\n  Byte = 3,\n  /** XXTEA-encrypted byte array with length prefix */\n  EncryptedBytes = 4,\n  /** 1 or 2 byte value (2 bytes with high bit set if > 127) */\n  CompactInt = 5,\n  /** Single byte, value is Math.round()'d first */\n  RoundedByte = 6,\n  /** Raw bytes appended directly after header */\n  RawAppend = 7,\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** Twitter's Castle.io publishable key (32-char, without pk_ prefix) */\nconst TWITTER_CASTLE_PK = 'AvRa79bHyJSYSQHnRpcVtzyxetSvFerx';\n\n/** XXTEA encryption key for the entire token */\nconst XXTEA_KEY = [1164413191, 3891440048, 185273099, 2746598870];\n\n/**\n * Per-field XXTEA key tail: field key = [fieldIndex, initTime, ...PER_FIELD_KEY_TAIL].\n * XXTEA uses 128-bit (4-word) keys, so only indices 0-3 of the assembled key participate\n * in encryption. The extra elements here are inert but kept for faithful parity with the\n * Python SDK source.\n */\nconst PER_FIELD_KEY_TAIL = [\n  16373134, 643144773, 1762804430, 1186572681, 1164413191,\n];\n\n/** Timestamp epoch offset: seconds since ~Aug 23 2018 */\nconst TS_EPOCH = 1535e6;\n\n/** SDK version 2.6.0 encoded as 16-bit: (3<<13)|(1<<11)|(6<<6)|0 = 0x6980 */\nconst SDK_VERSION = 0x6980;\n\n/** Token format version byte (v11) */\nconst TOKEN_VERSION = 0x0b;\n\n/**\n * Fingerprint part indices — each section is tagged with a part ID\n * in its size/index header byte.\n */\nconst FP_PART = {\n  DEVICE: 0, // Part 1: hardware/OS/rendering fingerprint\n  BROWSER: 4, // Part 2: browser environment fingerprint\n  TIMING: 7, // Part 3: timing-based fingerprint\n} as const;\n\n// ─── Simulated Browser Profile ──────────────────────────────────────────────\n\n/**\n * Simulated browser environment values embedded in the fingerprint.\n * These should match a realistic Chrome-on-Windows configuration.\n *\n * Users can provide a partial override via `ScraperOptions.experimental.browserProfile`\n * to customize the fingerprint. Unspecified fields are randomized from realistic pools.\n */\nexport interface BrowserProfile {\n  locale: string;\n  language: string;\n  timezone: string;\n  screenWidth: number;\n  screenHeight: number;\n  /** Available screen width (excludes OS chrome like taskbars) */\n  availableWidth: number;\n  /** Available screen height (excludes OS chrome like taskbars) */\n  availableHeight: number;\n  /** WebGL ANGLE renderer string */\n  gpuRenderer: string;\n  /** Device memory in GB (encoded as value * 10) */\n  deviceMemoryGB: number;\n  /** Logical CPU core count */\n  hardwareConcurrency: number;\n  /** Screen color depth in bits */\n  colorDepth: number;\n  /** CSS device pixel ratio (encoded as value * 10) */\n  devicePixelRatio: number;\n}\n\n/** Default fallback profile: Chrome 144 on Windows 10, NVIDIA GTX 1080 Ti, 1080p */\nconst DEFAULT_PROFILE: BrowserProfile = {\n  locale: 'en-US',\n  language: 'en',\n  timezone: 'America/New_York',\n  screenWidth: 1920,\n  screenHeight: 1080,\n  availableWidth: 1920,\n  availableHeight: 1032, // 1080 minus Windows taskbar (~48px)\n  gpuRenderer:\n    'ANGLE (NVIDIA, NVIDIA GeForce GTX 1080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  deviceMemoryGB: 8,\n  hardwareConcurrency: 24,\n  colorDepth: 24,\n  devicePixelRatio: 1.0,\n};\n\n// ─── Randomization Pools ─────────────────────────────────────────────────────\n// These pools are available for callers who want to build a custom BrowserProfile.\n//\n// WARNING: Randomizing gpuRenderer without also changing the static canvas hashes\n// (fields 13 and 18 in the token) creates an impossible fingerprint — different GPUs\n// produce different canvas renderings. Twitter cross-references these, so a mismatch\n// triggers 399 bot-detection errors. Until we have per-GPU canvas hashes, the default\n// profile uses a fixed GPU + matching canvas hashes. Only override gpuRenderer if you\n// also supply matching canvas fingerprints.\n\n/** Common desktop screen resolutions (width, height, available height with taskbar) */\nconst SCREEN_RESOLUTIONS = [\n  { w: 1920, h: 1080, ah: 1032 },\n  { w: 2560, h: 1440, ah: 1392 },\n  { w: 1366, h: 768, ah: 720 },\n  { w: 1536, h: 864, ah: 816 },\n  { w: 1440, h: 900, ah: 852 },\n  { w: 1680, h: 1050, ah: 1002 },\n  { w: 3840, h: 2160, ah: 2112 },\n];\n\n/** Common WebGL ANGLE renderer strings for Chrome on Windows.\n * Not used by default — see WARNING above about canvas hash correlation. */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst GPU_RENDERERS = [\n  'ANGLE (NVIDIA, NVIDIA GeForce GTX 1080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (NVIDIA, NVIDIA GeForce RTX 3080 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (AMD, AMD Radeon RX 580 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (AMD, AMD Radeon RX 6700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)',\n  'ANGLE (Intel, Intel(R) Iris(R) Xe Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)',\n];\n\n/** navigator.deviceMemory values reported by Chrome (in GB) */\nconst DEVICE_MEMORY_VALUES = [4, 8, 8, 16]; // 8 weighted more heavily\n\n/** navigator.hardwareConcurrency values */\nconst HARDWARE_CONCURRENCY_VALUES = [4, 8, 8, 12, 16, 24];\n\n/**\n * Generate a randomized browser profile by picking values from realistic pools.\n *\n * **Caution:** GPU renderer is NOT randomized because the canvas fingerprint\n * hashes in the token are static and correspond to the DEFAULT_PROFILE GPU.\n * Mismatching GPU + canvas hashes triggers Twitter 399 bot-detection errors.\n * Screen resolution, device memory, and CPU cores are safe to randomize since\n * they don't affect canvas rendering.\n */\nexport function randomizeBrowserProfile(): BrowserProfile {\n  const screen = SCREEN_RESOLUTIONS[randInt(0, SCREEN_RESOLUTIONS.length - 1)];\n  return {\n    ...DEFAULT_PROFILE,\n    screenWidth: screen.w,\n    screenHeight: screen.h,\n    availableWidth: screen.w,\n    availableHeight: screen.ah,\n    // gpuRenderer intentionally NOT randomized — see JSDoc above\n    deviceMemoryGB:\n      DEVICE_MEMORY_VALUES[randInt(0, DEVICE_MEMORY_VALUES.length - 1)],\n    hardwareConcurrency:\n      HARDWARE_CONCURRENCY_VALUES[\n        randInt(0, HARDWARE_CONCURRENCY_VALUES.length - 1)\n      ],\n  };\n}\n\n// ─── Utility Functions ───────────────────────────────────────────────────────\n\nfunction getRandomBytes(n: number): Uint8Array {\n  const buf = new Uint8Array(n);\n  if (\n    typeof globalThis.crypto !== 'undefined' &&\n    globalThis.crypto.getRandomValues\n  ) {\n    globalThis.crypto.getRandomValues(buf);\n  } else {\n    for (let i = 0; i < n; i++) buf[i] = Math.floor(Math.random() * 256);\n  }\n  return buf;\n}\n\nfunction randInt(min: number, max: number): number {\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\nfunction randFloat(min: number, max: number): number {\n  return min + Math.random() * (max - min);\n}\n\nfunction concat(...arrays: Uint8Array[]): Uint8Array {\n  const len = arrays.reduce((s, a) => s + a.length, 0);\n  const out = new Uint8Array(len);\n  let off = 0;\n  for (const a of arrays) {\n    out.set(a, off);\n    off += a.length;\n  }\n  return out;\n}\n\nfunction toHex(input: Uint8Array): string {\n  return Array.from(input)\n    .map((b) => b.toString(16).padStart(2, '0'))\n    .join('');\n}\n\nfunction fromHex(hex: string): Uint8Array {\n  const out = new Uint8Array(hex.length / 2);\n  for (let i = 0; i < hex.length; i += 2)\n    out[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n  return out;\n}\n\nfunction textEnc(s: string): Uint8Array {\n  return new TextEncoder().encode(s);\n}\n\n/** Create a Uint8Array from individual byte values */\nfunction u8(...vals: number[]): Uint8Array {\n  return new Uint8Array(vals);\n}\n\n/** Encode a 16-bit value as 2 big-endian bytes */\nfunction be16(v: number): Uint8Array {\n  return u8((v >>> 8) & 0xff, v & 0xff);\n}\n\n/** Encode a 32-bit value as 4 big-endian bytes */\nfunction be32(v: number): Uint8Array {\n  return u8((v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\n\nfunction xorBytes(data: Uint8Array, key: Uint8Array): Uint8Array {\n  const out = new Uint8Array(data.length);\n  for (let i = 0; i < data.length; i++) out[i] = data[i] ^ key[i % key.length];\n  return out;\n}\n\nfunction xorNibbles(nibbles: string, keyNibble: string): string {\n  const k = parseInt(keyNibble, 16);\n  return nibbles\n    .split('')\n    .map((n) => (parseInt(n, 16) ^ k).toString(16))\n    .join('');\n}\n\nfunction base64url(data: Uint8Array): string {\n  if (typeof Buffer !== 'undefined') {\n    return Buffer.from(data).toString('base64url');\n  }\n  let bin = '';\n  for (let i = 0; i < data.length; i++) bin += String.fromCharCode(data[i]);\n  return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// ─── XXTEA Encryption ───────────────────────────────────────────────────────\n\n/**\n * Encrypt data using XXTEA (Corrected Block TEA) algorithm.\n * Used for both the overall token encryption and per-field encryption.\n * @internal Exported for testing\n */\nexport function xxteaEncrypt(data: Uint8Array, key: number[]): Uint8Array {\n  // Pad to 4-byte boundary\n  const padLen = Math.ceil(data.length / 4) * 4;\n  const padded = new Uint8Array(padLen);\n  padded.set(data);\n\n  const n = padLen / 4;\n  // Read as little-endian 32-bit words\n  const v = new Uint32Array(n);\n  for (let i = 0; i < n; i++) {\n    v[i] =\n      (padded[i * 4] |\n        (padded[i * 4 + 1] << 8) |\n        (padded[i * 4 + 2] << 16) |\n        (padded[i * 4 + 3] << 24)) >>>\n      0;\n  }\n\n  if (n <= 1) return padded;\n\n  const k = new Uint32Array(key.map((x) => x >>> 0));\n  const DELTA = 0x9e3779b9;\n  const u = n - 1;\n  let sum = 0;\n  let z = v[u];\n  let y: number;\n  let rounds = 6 + Math.floor(52 / (u + 1));\n\n  while (rounds-- > 0) {\n    sum = (sum + DELTA) >>> 0;\n    const e = (sum >>> 2) & 3;\n    for (let p = 0; p < u; p++) {\n      y = v[p + 1];\n      const mx =\n        ((((z >>> 5) ^ (y << 2)) >>> 0) + (((y >>> 3) ^ (z << 4)) >>> 0)) ^\n        (((sum ^ y) >>> 0) + ((k[(p & 3) ^ e] ^ z) >>> 0));\n      v[p] = (v[p] + mx) >>> 0;\n      z = v[p];\n    }\n    y = v[0];\n    const mx =\n      ((((z >>> 5) ^ (y << 2)) >>> 0) + (((y >>> 3) ^ (z << 4)) >>> 0)) ^\n      (((sum ^ y) >>> 0) + ((k[(u & 3) ^ e] ^ z) >>> 0));\n    v[u] = (v[u] + mx) >>> 0;\n    z = v[u];\n  }\n\n  // Write back as little-endian bytes\n  const out = new Uint8Array(n * 4);\n  for (let i = 0; i < n; i++) {\n    out[i * 4] = v[i] & 0xff;\n    out[i * 4 + 1] = (v[i] >>> 8) & 0xff;\n    out[i * 4 + 2] = (v[i] >>> 16) & 0xff;\n    out[i * 4 + 3] = (v[i] >>> 24) & 0xff;\n  }\n  return out;\n}\n\n/** Encrypt a fingerprint field's data using per-field XXTEA key */\nfunction fieldEncrypt(\n  data: Uint8Array,\n  fieldIndex: number,\n  initTime: number,\n): Uint8Array {\n  return xxteaEncrypt(data, [\n    fieldIndex,\n    Math.floor(initTime),\n    ...PER_FIELD_KEY_TAIL,\n  ]);\n}\n\n// ─── Timestamp Encoding ─────────────────────────────────────────────────────\n\n/** @internal Exported for testing */\nexport function encodeTimestampBytes(ms: number): Uint8Array {\n  let t = Math.floor(ms / 1000 - TS_EPOCH);\n  t = Math.max(Math.min(t, 268435455), 0); // Clamp to 28-bit unsigned\n  return be32(t);\n}\n\nfunction xorAndAppendKey(buf: Uint8Array, key: number): string {\n  const hex = toHex(buf);\n  const keyNib = (key & 0xf).toString(16);\n  return xorNibbles(hex.substring(1), keyNib) + keyNib;\n}\n\nfunction encodeTimestampEncrypted(ms: number): string {\n  const tsBytes = encodeTimestampBytes(ms);\n  const slice = Math.floor(ms) % 1000;\n  const sliceBytes = be16(slice);\n  const k = randInt(0, 15);\n  return xorAndAppendKey(tsBytes, k) + xorAndAppendKey(sliceBytes, k);\n}\n\n// ─── Key Derivation ─────────────────────────────────────────────────────────\n\n/**\n * Derive an XOR key from a hex string by slicing, rotating, and XOR-ing.\n * Used for the two-layer XOR encryption of fingerprint data.\n */\n/**\n * @internal Exported for testing only.\n */\nexport function deriveAndXor(\n  keyHex: string,\n  sliceLen: number,\n  rotChar: string,\n  data: Uint8Array,\n): Uint8Array {\n  const sub = keyHex.substring(0, sliceLen).split('');\n  if (sub.length === 0) return data;\n  const rot = parseInt(rotChar, 16) % sub.length;\n  const rotated = sub.slice(rot).concat(sub.slice(0, rot)).join('');\n  return xorBytes(data, fromHex(rotated));\n}\n\n// ─── Custom Float Encoding ──────────────────────────────────────────────────\n\n/**\n * Encode a floating-point value into a compact format with configurable\n * exponent and mantissa bit widths. Used for behavioral metric encoding.\n */\n/** @internal Exported for testing */\nexport function customFloatEncode(\n  expBits: number,\n  manBits: number,\n  value: number,\n): number {\n  if (value === 0) return 0;\n  let n = Math.abs(value);\n  let exp = 0;\n  while (2 <= n) {\n    n /= 2;\n    exp++;\n  }\n  while (n < 1 && n > 0) {\n    n *= 2;\n    exp--;\n  }\n  exp = Math.min(exp, (1 << expBits) - 1);\n  const frac = n - Math.floor(n);\n  let mantissa = 0;\n  if (frac > 0) {\n    let pos = 1;\n    let tmp = frac;\n    while (tmp !== 0 && pos <= manBits) {\n      tmp *= 2;\n      const bit = Math.floor(tmp);\n      mantissa |= bit << (manBits - pos);\n      tmp -= bit;\n      pos++;\n    }\n  }\n  return (exp << manBits) | mantissa;\n}\n\n/**\n * Encode a behavioral float value for the token.\n * Values 0-15 use a 2-bit exponent / 4-bit mantissa format.\n * Values > 15 use a 4-bit exponent / 3-bit mantissa format.\n */\n/** @internal Exported for testing */\nexport function encodeFloatVal(v: number): number {\n  const n = Math.max(v, 0);\n  if (n <= 15) return 64 | customFloatEncode(2, 4, n + 1);\n  return 128 | customFloatEncode(4, 3, n - 14);\n}\n\n// ─── Field Serialization ────────────────────────────────────────────────────\n\n/**\n * Serialize a single fingerprint field into its binary representation.\n *\n * Format: [header byte] [optional body bytes]\n * Header: upper 5 bits = field index, lower 3 bits = encoding type\n *\n * @param index - Field index (0-31) within the fingerprint part\n * @param encoding - How the value should be serialized\n * @param val - The field value (number or byte array)\n * @param initTime - Init timestamp (required for EncryptedBytes encoding)\n */\n/** @internal Exported for testing */\nexport function encodeField(\n  index: number,\n  encoding: FieldEncoding,\n  val: number | Uint8Array,\n  initTime?: number,\n): Uint8Array {\n  // Header byte: field index in upper 5 bits, encoding type in lower 3 bits\n  // Note: FieldEncoding.Empty = -1, and 7 & -1 = 7 in JS bitwise\n  const hdr = u8(((31 & index) << 3) | (7 & encoding));\n\n  if (encoding === FieldEncoding.Empty || encoding === FieldEncoding.Marker)\n    return hdr;\n\n  let body: Uint8Array;\n  switch (encoding) {\n    case FieldEncoding.Byte:\n      body = u8(val as number);\n      break;\n    case FieldEncoding.RoundedByte:\n      body = u8(Math.round(val as number));\n      break;\n    case FieldEncoding.CompactInt: {\n      const v = val as number;\n      body = v <= 127 ? u8(v) : be16((1 << 15) | (32767 & v));\n      break;\n    }\n    case FieldEncoding.EncryptedBytes: {\n      if (initTime == null) {\n        throw new Error('initTime is required for EncryptedBytes encoding');\n      }\n      const enc = fieldEncrypt(val as Uint8Array, index, initTime);\n      body = concat(u8(enc.length), enc);\n      break;\n    }\n    case FieldEncoding.RawAppend:\n      body = val instanceof Uint8Array ? val : u8(val as number);\n      break;\n    default:\n      body = new Uint8Array(0);\n  }\n  return concat(hdr, body);\n}\n\n// ─── Bit Encoding Helpers ───────────────────────────────────────────────────\n\n/** Pack a list of set-bit positions into a fixed-size byte array (big-endian) */\nfunction encodeBits(bits: number[], byteSize: number): Uint8Array {\n  const numBytes = byteSize / 8;\n  const arr = new Uint8Array(numBytes);\n  for (const bit of bits) {\n    const bi = numBytes - 1 - Math.floor(bit / 8);\n    if (bi >= 0 && bi < numBytes) arr[bi] |= 1 << bit % 8;\n  }\n  return arr;\n}\n\n/**\n * Encode screen dimensions. If screen and available dimensions match,\n * uses a compact 2-byte form with high bit set; otherwise 4 bytes.\n */\nfunction screenDimBytes(screen: number, avail: number): Uint8Array {\n  const r = 32767 & screen;\n  const e = 65535 & avail;\n  return r === e ? be16(32768 | r) : concat(be16(r), be16(e));\n}\n\n/** Convert boolean array to a packed integer bitfield */\nfunction boolsToBin(arr: boolean[], totalBits: number): number {\n  const e = arr.length > totalBits ? arr.slice(0, totalBits) : arr;\n  const c = e.length;\n  let r = 0;\n  for (let i = c - 1; i >= 0; i--) {\n    if (e[i]) r |= 1 << (c - i - 1);\n  }\n  if (c < totalBits) r <<= totalBits - c;\n  return r;\n}\n\n// ─── Codec Playability ──────────────────────────────────────────────────────\n\n/**\n * Encode media codec support as a 2-byte bitfield.\n * Values: 0 = unsupported, 1 = maybe, 2 = probably\n */\nfunction encodeCodecPlayability(): Uint8Array {\n  const codecs = {\n    webm: 2, // VP8/VP9\n    mp4: 2, // H.264\n    ogg: 0, // Theora (Chrome dropped support)\n    aac: 2, // AAC audio\n    xm4a: 1, // M4A container\n    wav: 2, // PCM audio\n    mpeg: 2, // MP3 audio\n    ogg2: 2, // Vorbis audio\n  };\n  const bits = Object.values(codecs)\n    .map((c) => c.toString(2).padStart(2, '0'))\n    .join('');\n  return be16(parseInt(bits, 2));\n}\n\n// ─── Timezone Utilities ─────────────────────────────────────────────────────\n\n/** Known timezone enum values for compact encoding in fingerprint Part 2 */\nconst TIMEZONE_ENUM: Record<string, number> = {\n  'America/New_York': 0,\n  'America/Sao_Paulo': 1,\n  'America/Chicago': 2,\n  'America/Los_Angeles': 3,\n  'America/Mexico_City': 4,\n  'Asia/Shanghai': 5,\n};\n\n/**\n * Compute timezone offset and DST difference for fingerprinting.\n * Returns values as (minutes / 15) encoded as unsigned bytes.\n */\nfunction getTimezoneInfo(tz: string): { offset: number; dstDiff: number } {\n  const knownOffsets: Record<string, { offset: number; dstDiff: number }> = {\n    'America/New_York': { offset: 20, dstDiff: 4 },\n    'America/Chicago': { offset: 24, dstDiff: 4 },\n    'America/Los_Angeles': { offset: 32, dstDiff: 4 },\n    'America/Denver': { offset: 28, dstDiff: 4 },\n    'America/Sao_Paulo': { offset: 12, dstDiff: 4 },\n    'America/Mexico_City': { offset: 24, dstDiff: 4 },\n    'Asia/Shanghai': { offset: 246, dstDiff: 0 },\n    'Asia/Tokyo': { offset: 220, dstDiff: 0 },\n    'Europe/London': { offset: 0, dstDiff: 4 },\n    'Europe/Berlin': { offset: 252, dstDiff: 4 },\n    UTC: { offset: 0, dstDiff: 0 },\n  };\n\n  try {\n    const now = new Date();\n    const jan = new Date(now.getFullYear(), 0, 1);\n    const jul = new Date(now.getFullYear(), 6, 1);\n\n    const getOffset = (date: Date, zone: string) => {\n      const utc = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));\n      const local = new Date(date.toLocaleString('en-US', { timeZone: zone }));\n      return (utc.getTime() - local.getTime()) / 60000;\n    };\n\n    const currentOffset = getOffset(now, tz);\n    const janOffset = getOffset(jan, tz);\n    const julOffset = getOffset(jul, tz);\n    const dstDifference = Math.abs(janOffset - julOffset);\n\n    return {\n      offset: Math.floor(currentOffset / 15) & 0xff,\n      dstDiff: Math.floor(dstDifference / 15) & 0xff,\n    };\n  } catch {\n    return knownOffsets[tz] || { offset: 20, dstDiff: 4 };\n  }\n}\n\n// ─── Fingerprint Part 1: Device & Rendering ─────────────────────────────────\n\n/**\n * Build device/rendering fingerprint fields (Part 1).\n * Contains hardware info, screen dimensions, browser features,\n * canvas/WebGL render hashes, and the user agent string.\n */\nfunction buildDeviceFingerprint(\n  initTime: number,\n  profile: BrowserProfile,\n  userAgent: string,\n): Uint8Array {\n  const tz = getTimezoneInfo(profile.timezone);\n  const { Byte, EncryptedBytes, CompactInt, RoundedByte, RawAppend } =\n    FieldEncoding;\n\n  // Field 12 (user agent) uses manual XXTEA encryption with RawAppend\n  const encryptedUA = fieldEncrypt(textEnc(userAgent), 12, initTime);\n  const uaPayload = concat(u8(1), u8(encryptedUA.length), encryptedUA);\n\n  const fields: Uint8Array[] = [\n    encodeField(0, Byte, 1), // Platform: Win32\n    encodeField(1, Byte, 0), // Vendor: Google Inc.\n    encodeField(2, EncryptedBytes, textEnc(profile.locale), initTime), // Locale\n    encodeField(3, RoundedByte, profile.deviceMemoryGB * 10), // Device memory (GB * 10)\n    encodeField(\n      4,\n      RawAppend,\n      concat(\n        // Screen dimensions (width + height)\n        screenDimBytes(profile.screenWidth, profile.availableWidth),\n        screenDimBytes(profile.screenHeight, profile.availableHeight),\n      ),\n    ),\n    encodeField(5, CompactInt, profile.colorDepth), // Screen color depth\n    encodeField(6, CompactInt, profile.hardwareConcurrency), // CPU logical cores\n    encodeField(7, RoundedByte, profile.devicePixelRatio * 10), // Pixel ratio (* 10)\n    encodeField(8, RawAppend, u8(tz.offset, tz.dstDiff)), // Timezone offset info\n    // MIME type hash — captured from Chrome 144 on Windows 10.\n    // Source: yubie-re/castleio-gen (Python SDK, MIT license).\n    encodeField(9, RawAppend, u8(0x02, 0x7d, 0x5f, 0xc9, 0xa7)),\n    // Browser plugins hash — Chrome no longer exposes plugins to navigator.plugins,\n    // so this is a fixed hash. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n    encodeField(10, RawAppend, u8(0x05, 0x72, 0x93, 0x02, 0x08)),\n    encodeField(\n      11,\n      RawAppend, // Browser feature flags\n      concat(u8(12), encodeBits([0, 1, 2, 3, 4, 5, 6], 16)),\n    ),\n    encodeField(12, RawAppend, uaPayload), // User agent (encrypted)\n    // Canvas font rendering hash — generated by Castle.io SDK's canvas fingerprinting (text rendering).\n    // Captured from Chrome 144 on Windows 10. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n    encodeField(13, EncryptedBytes, textEnc('54b4b5cf'), initTime),\n    encodeField(\n      14,\n      RawAppend, // Media input devices\n      concat(u8(3), encodeBits([0, 1, 2], 8)),\n    ),\n    // Fields 15 (DoNotTrack) and 16 (JavaEnabled) intentionally omitted\n    encodeField(17, Byte, 0), // productSub type\n    // Canvas circle rendering hash — generated by Castle.io SDK's canvas fingerprinting (arc drawing).\n    // Captured from Chrome 144 on Windows 10. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n    encodeField(18, EncryptedBytes, textEnc('c6749e76'), initTime),\n    encodeField(19, EncryptedBytes, textEnc(profile.gpuRenderer), initTime), // WebGL renderer\n    encodeField(\n      20,\n      EncryptedBytes, // Epoch locale string\n      textEnc('12/31/1969, 7:00:00 PM'),\n      initTime,\n    ),\n    encodeField(\n      21,\n      RawAppend, // WebDriver flags (none set)\n      concat(u8(8), encodeBits([], 8)),\n    ),\n    encodeField(22, CompactInt, 33), // eval.toString() length\n    // Field 23 (navigator.buildID) intentionally omitted (Chrome doesn't have it)\n    encodeField(24, CompactInt, 12549), // Max recursion depth\n    encodeField(25, Byte, 0), // Recursion error message type\n    encodeField(26, Byte, 1), // Recursion error name type\n    encodeField(27, CompactInt, 4644), // Stack trace string length\n    encodeField(28, RawAppend, u8(0x00)), // Touch support metric\n    encodeField(29, Byte, 3), // Undefined call error type\n    // Navigator properties hash — hash of enumerable navigator property names.\n    // Captured from Chrome 144 on Windows 10. Source: yubie-re/castleio-gen (Python SDK, MIT license).\n    encodeField(30, RawAppend, u8(0x5d, 0xc5, 0xab, 0xb5, 0x88)),\n    encodeField(31, RawAppend, encodeCodecPlayability()), // Codec playability\n  ];\n\n  const data = concat(...fields);\n  const sizeIdx = ((7 & FP_PART.DEVICE) << 5) | (31 & fields.length);\n  return concat(u8(sizeIdx), data);\n}\n\n// ─── Fingerprint Part 2: Browser Environment ────────────────────────────────\n\n/**\n * Build browser environment fingerprint (Part 2).\n * Contains timezone, language info, Chrome-specific feature flags,\n * and various browser environment checks.\n */\nfunction buildBrowserFingerprint(\n  profile: BrowserProfile,\n  initTime: number,\n): Uint8Array {\n  const { Byte, EncryptedBytes, CompactInt, Marker, RawAppend } = FieldEncoding;\n\n  // Use compact enum encoding for known timezones, encrypted string otherwise\n  const timezoneField =\n    profile.timezone in TIMEZONE_ENUM\n      ? encodeField(1, Byte, TIMEZONE_ENUM[profile.timezone])\n      : encodeField(1, EncryptedBytes, textEnc(profile.timezone), initTime);\n\n  const fields: Uint8Array[] = [\n    encodeField(0, Byte, 0), // Constant marker\n    timezoneField, // Timezone\n    encodeField(\n      2,\n      EncryptedBytes, // Language list\n      textEnc(`${profile.locale},${profile.language}`),\n      initTime,\n    ),\n    encodeField(6, CompactInt, 0), // Expected property count\n    encodeField(\n      10,\n      RawAppend, // Castle data bitfield\n      concat(u8(4), encodeBits([1, 2, 3], 8)),\n    ),\n    encodeField(12, CompactInt, 80), // Negative error string length\n    encodeField(13, RawAppend, u8(9, 0, 0)), // Driver check values\n    encodeField(\n      17,\n      RawAppend, // Chrome feature flags\n      concat(u8(0x0d), encodeBits([1, 5, 8, 9, 10], 16)),\n    ),\n    encodeField(18, Marker, 0), // Device logic expected\n    encodeField(21, RawAppend, u8(0, 0, 0, 0)), // Class properties count\n    encodeField(22, EncryptedBytes, textEnc(profile.locale), initTime), // User locale (secondary)\n    encodeField(\n      23,\n      RawAppend, // Worker capabilities\n      concat(u8(2), encodeBits([0], 8)),\n    ),\n    encodeField(\n      24,\n      RawAppend, // Inner/outer dimension diff\n      concat(be16(0), be16(randInt(10, 30))),\n    ),\n  ];\n\n  const data = concat(...fields);\n  const sizeIdx = ((7 & FP_PART.BROWSER) << 5) | (31 & fields.length);\n  return concat(u8(sizeIdx), data);\n}\n\n// ─── Fingerprint Part 3: Timing ─────────────────────────────────────────────\n\n/**\n * Build timing fingerprint (Part 3).\n * Contains Castle SDK initialization timing data.\n */\nfunction buildTimingFingerprint(initTime: number): Uint8Array {\n  const minute = new Date(initTime).getUTCMinutes();\n\n  const fields: Uint8Array[] = [\n    encodeField(3, FieldEncoding.CompactInt, 1), // Time since window.open (ms)\n    encodeField(4, FieldEncoding.CompactInt, minute), // Castle init time (minutes)\n  ];\n\n  const data = concat(...fields);\n  const sizeIdx = ((7 & FP_PART.TIMING) << 5) | (31 & fields.length);\n  return concat(u8(sizeIdx), data);\n}\n\n// ─── Event Log ──────────────────────────────────────────────────────────────\n\n/** DOM event type IDs used in the simulated event log */\nconst EventType = {\n  CLICK: 0,\n  FOCUS: 5,\n  BLUR: 6,\n  ANIMATIONSTART: 18,\n  MOUSEMOVE: 21,\n  MOUSELEAVE: 25,\n  MOUSEENTER: 26,\n  RESIZE: 27,\n} as const;\n\n/** Flag bit set on events that include a target element ID */\nconst HAS_TARGET_FLAG = 128;\n\n/** Target element ID for \"unknown element\" */\nconst TARGET_UNKNOWN = 63;\n\n/**\n * Generate a simulated DOM event log.\n * Produces a realistic-looking sequence of mouse, keyboard, and focus events.\n */\nfunction generateEventLog(): Uint8Array {\n  const simpleEvents = [\n    EventType.MOUSEMOVE,\n    EventType.ANIMATIONSTART,\n    EventType.MOUSELEAVE,\n    EventType.MOUSEENTER,\n    EventType.RESIZE,\n  ];\n  const targetedEvents: number[] = [\n    EventType.CLICK,\n    EventType.BLUR,\n    EventType.FOCUS,\n  ];\n  const allEvents = [...simpleEvents, ...targetedEvents];\n\n  const count = randInt(30, 70);\n  const eventBytes: number[] = [];\n\n  for (let i = 0; i < count; i++) {\n    const eventId = allEvents[randInt(0, allEvents.length - 1)];\n    if (targetedEvents.includes(eventId)) {\n      eventBytes.push(eventId | HAS_TARGET_FLAG);\n      eventBytes.push(TARGET_UNKNOWN);\n    } else {\n      eventBytes.push(eventId);\n    }\n  }\n\n  // Format: [2-byte total length] [0x00] [2-byte event count] [event bytes...]\n  const inner = concat(u8(0), be16(count), new Uint8Array(eventBytes));\n  return concat(be16(inner.length), inner);\n}\n\n// ─── Behavioral Metrics ─────────────────────────────────────────────────────\n\n/**\n * Build the behavioral bitfield indicating which input types were detected.\n * Simulates a user who used mouse and keyboard (no touch).\n */\nfunction buildBehavioralBitfield(): Uint8Array {\n  // 15 flags with totalBits=16: the extra bit causes a left-shift-by-1 in boolsToBin,\n  // matching the Python SDK's behavior where the MSB is always 0.\n  const flags = new Array(15).fill(false);\n  flags[2] = true; // Has click events\n  flags[3] = true; // Has keydown events\n  flags[5] = true; // Has backspace key\n  flags[6] = true; // Not a touch device\n  flags[9] = true; // Has mouse movement\n  flags[11] = true; // Has focus events\n  flags[12] = true; // Has scroll events\n\n  const packedBits = boolsToBin(flags, 16);\n  // Encode with type prefix: (6 << 20) | (2 << 16) | value\n  const encoded = (6 << 20) | (2 << 16) | (65535 & packedBits);\n  return u8((encoded >>> 16) & 0xff, (encoded >>> 8) & 0xff, encoded & 0xff);\n}\n\n/** Sentinel: metric not available (e.g., touch metrics on desktop) */\nconst NO_DATA = -1;\n\n/**\n * Generate simulated behavioral float metrics.\n * Each value represents a statistical measurement of user input patterns\n * (mouse movement angles, key timing, click durations, etc.)\n */\nfunction buildFloatMetrics(): Uint8Array {\n  // NO_DATA (-1) encodes as 0x00 (metric not available)\n  const metrics: number[] = [\n    // ── Mouse & key timing ──\n    randFloat(40, 50), //  0: Mouse angle vector mean\n    NO_DATA, //  1: Touch angle vector (no touch device)\n    randFloat(70, 80), //  2: Key same-time difference\n    NO_DATA, //  3: (unused)\n    randFloat(60, 70), //  4: Mouse down-to-up time mean\n    NO_DATA, //  5: (unused)\n    0, //  6: (zero placeholder)\n    0, //  7: Mouse click time difference\n\n    // ── Duration distributions ──\n    randFloat(60, 80), //  8: Mouse down-up duration median\n    randFloat(5, 10), //  9: Mouse down-up duration std deviation\n    randFloat(30, 40), // 10: Key press duration median\n    randFloat(2, 5), // 11: Key press duration std deviation\n\n    // ── Touch metrics (all disabled for desktop) ──\n    NO_DATA,\n    NO_DATA,\n    NO_DATA,\n    NO_DATA, // 12-15\n    NO_DATA,\n    NO_DATA,\n    NO_DATA,\n    NO_DATA, // 16-19\n\n    // ── Mouse trajectory analysis ──\n    randFloat(150, 180), // 20: Mouse movement angle mean\n    randFloat(3, 6), // 21: Mouse movement angle std deviation\n    randFloat(150, 180), // 22: Mouse movement angle mean (500ms window)\n    randFloat(3, 6), // 23: Mouse movement angle std (500ms window)\n    randFloat(0, 2), // 24: Mouse position deviation X\n    randFloat(0, 2), // 25: Mouse position deviation Y\n    0,\n    0, // 26-27: (zero placeholders)\n\n    // ── Touch sequential/gesture metrics (disabled) ──\n    NO_DATA,\n    NO_DATA, // 28-29\n    NO_DATA,\n    NO_DATA, // 30-31\n\n    // ── Key pattern analysis ──\n    0,\n    0, // 32-33: Letter-digit transition ratio\n    0,\n    0, // 34-35: Digit-invalid transition ratio\n    0,\n    0, // 36-37: Double-invalid transition ratio\n\n    // ── Mouse vector differences ──\n    1.0,\n    0, // 38-39: Mouse vector diff (mean, std)\n    1.0,\n    0, // 40-41: Mouse vector diff 2 (mean, std)\n    randFloat(0, 4), // 42: Mouse vector diff (500ms mean)\n    randFloat(0, 3), // 43: Mouse vector diff (500ms std)\n\n    // ── Rounded movement metrics ──\n    randFloat(25, 50), // 44: Mouse time diff (rounded mean)\n    randFloat(25, 50), // 45: Mouse time diff (rounded std)\n    randFloat(25, 50), // 46: Mouse vector diff (rounded mean)\n    randFloat(25, 30), // 47: Mouse vector diff (rounded std)\n\n    // ── Speed change analysis ──\n    randFloat(0, 2), // 48: Mouse speed change mean\n    randFloat(0, 1), // 49: Mouse speed change std\n    randFloat(0, 1), // 50: Mouse vector 500ms aggregate\n\n    // ── Trailing ──\n    1, // 51: Universal flag\n    0, // 52: Terminator\n  ];\n\n  const out = new Uint8Array(metrics.length);\n  for (let i = 0; i < metrics.length; i++) {\n    out[i] = metrics[i] === NO_DATA ? 0 : encodeFloatVal(metrics[i]);\n  }\n  return out;\n}\n\n/**\n * Generate simulated event count integers.\n * Each value represents how many times a specific DOM event type occurred.\n */\nfunction buildEventCounts(): Uint8Array {\n  const counts: number[] = [\n    randInt(100, 200), //  0: mousemove events\n    randInt(1, 5), //  1: keyup events\n    randInt(1, 5), //  2: click events\n    0, //  3: touchstart events (none on desktop)\n    randInt(0, 5), //  4: keydown events\n    0, //  5: touchmove events (none)\n    0, //  6: mousedown-mouseup pairs\n    0, //  7: vector diff samples\n    randInt(0, 5), //  8: wheel events\n    randInt(0, 11), //  9: (internal counter)\n    randInt(0, 1), // 10: (internal counter)\n  ];\n  // Append the count of entries as a trailing byte\n  return concat(new Uint8Array(counts), u8(counts.length));\n}\n\n/** Combine all behavioral metrics into a single byte sequence */\nfunction buildBehavioralData(): Uint8Array {\n  return concat(\n    buildBehavioralBitfield(),\n    buildFloatMetrics(),\n    buildEventCounts(),\n  );\n}\n\n// ─── Token Assembly ─────────────────────────────────────────────────────────\n\nfunction buildTokenHeader(\n  uuid: string,\n  publisherKey: string,\n  initTime: number,\n): Uint8Array {\n  const timestamp = fromHex(encodeTimestampEncrypted(initTime));\n  const version = be16(SDK_VERSION);\n  const pkBytes = textEnc(publisherKey);\n  const uuidBytes = fromHex(uuid);\n  return concat(timestamp, version, pkBytes, uuidBytes);\n}\n\n/**\n * Generate a Castle.io v11 token for Twitter's login flow.\n *\n * The token embeds a simulated browser fingerprint and behavioral data,\n * encrypted with XXTEA and layered XOR, to satisfy Twitter's anti-bot\n * checks during the login flow.\n *\n * @param userAgent - The user agent string to embed in the fingerprint.\n *   Should match the UA used for HTTP requests.\n * @returns Object with `token` (the Castle request token) and `cuid` (for __cuid cookie)\n */\nexport function generateLocalCastleToken(\n  userAgent: string,\n  profileOverride?: Partial<BrowserProfile>,\n): {\n  token: string;\n  cuid: string;\n} {\n  const now = Date.now();\n  // Use the known-good DEFAULT_PROFILE as base. Randomization is opt-in because\n  // the static canvas hashes (fields 13, 18) must match the GPU renderer — see\n  // randomizeBrowserProfile() JSDoc for details.\n  const profile = { ...DEFAULT_PROFILE, ...profileOverride };\n\n  // Simulate page load: init_time is 2-30 minutes before current time\n  const initTime = now - randFloat(2 * 60 * 1000, 30 * 60 * 1000);\n\n  log('Generating local Castle.io v11 token');\n\n  // ── Step 1: Collect fingerprint data ──\n  const deviceFp = buildDeviceFingerprint(initTime, profile, userAgent);\n  const browserFp = buildBrowserFingerprint(profile, initTime);\n  const timingFp = buildTimingFingerprint(initTime);\n  const eventLog = generateEventLog();\n  const behavioral = buildBehavioralData();\n\n  // Concatenate all parts with 0xFF terminator\n  const fingerprintData = concat(\n    deviceFp,\n    browserFp,\n    timingFp,\n    eventLog,\n    behavioral,\n    u8(0xff),\n  );\n\n  // ── Step 2: First XOR layer (timestamp-derived key) ──\n  const sendTime = Date.now();\n  const timestampKey = encodeTimestampEncrypted(sendTime);\n  const xorPass1 = deriveAndXor(\n    timestampKey,\n    4,\n    timestampKey[3],\n    fingerprintData,\n  );\n\n  // ── Step 3: Second XOR layer (UUID-derived key) ──\n  const tokenUuid = toHex(getRandomBytes(16));\n  const withTimestampPrefix = concat(fromHex(timestampKey), xorPass1);\n  const xorPass2 = deriveAndXor(\n    tokenUuid,\n    8,\n    tokenUuid[9],\n    withTimestampPrefix,\n  );\n\n  // ── Step 4: Build header (timestamp, SDK version, publisher key, UUID) ──\n  const header = buildTokenHeader(tokenUuid, TWITTER_CASTLE_PK, initTime);\n\n  // ── Step 5: XXTEA encrypt the full payload ──\n  const plaintext = concat(header, xorPass2);\n  const encrypted = xxteaEncrypt(plaintext, XXTEA_KEY);\n\n  // ── Step 6: Prepend version and padding info ──\n  const paddingBytes = encrypted.length - plaintext.length;\n  const versioned = concat(u8(TOKEN_VERSION, paddingBytes), encrypted);\n\n  // ── Step 7: Random-byte XOR + length checksum ──\n  const randomByte = getRandomBytes(1)[0];\n  const checksum = (versioned.length * 2) & 0xff;\n  const withChecksum = concat(versioned, u8(checksum));\n  const xored = xorBytes(withChecksum, u8(randomByte));\n  const finalPayload = concat(u8(randomByte), xored);\n\n  // ── Step 8: Base64URL encode ──\n  const token = base64url(finalPayload);\n\n  log(\n    `Generated castle token: ${token.length} chars, cuid: ${tokenUuid.substring(\n      0,\n      6,\n    )}...`,\n  );\n\n  return { token, cuid: tokenUuid };\n}\n","import { Cookie, CookieJar } from 'tough-cookie';\nimport setCookie from 'set-cookie-parser';\nimport type { Headers as HeadersPolyfill } from 'headers-polyfill';\nimport debug from 'debug';\n\nconst log = debug('twitter-scraper:requests');\n\n/**\n * Updates a cookie jar with the Set-Cookie headers from the provided Headers instance.\n * @param cookieJar The cookie jar to update.\n * @param headers The response headers to populate the cookie jar with.\n */\nexport async function updateCookieJar(\n  cookieJar: CookieJar,\n  headers: Headers | HeadersPolyfill,\n) {\n  // Try to use getSetCookie() if available (proper way to get all set-cookie headers)\n  let setCookieHeaders: string[] = [];\n\n  if (typeof headers.getSetCookie === 'function') {\n    setCookieHeaders = headers.getSetCookie();\n  } else {\n    // Fallback: get the single set-cookie header\n    const setCookieHeader = headers.get('set-cookie');\n    if (setCookieHeader) {\n      // Split combined set-cookie headers\n      setCookieHeaders = setCookie.splitCookiesString(setCookieHeader);\n    }\n  }\n\n  if (setCookieHeaders.length > 0) {\n    for (const cookieStr of setCookieHeaders) {\n      const cookie = Cookie.parse(cookieStr);\n      if (!cookie) {\n        log(`Failed to parse cookie: ${cookieStr.substring(0, 100)}`);\n        continue;\n      }\n\n      // Skip cookies that are being explicitly deleted (Max-Age=0 or expired)\n      // This prevents twitter from clearing important cookies like ct0\n      if (\n        cookie.maxAge === 0 ||\n        (cookie.expires && cookie.expires < new Date())\n      ) {\n        if (cookie.key === 'ct0') {\n          log(`Skipping deletion of ct0 cookie (Max-Age=0)`);\n        }\n        continue;\n      }\n\n      try {\n        const url = `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${\n          cookie.path\n        }`;\n        await cookieJar.setCookie(cookie, url);\n        if (cookie.key === 'ct0') {\n          log(\n            `Successfully set ct0 cookie with value: ${cookie.value.substring(\n              0,\n              20,\n            )}...`,\n          );\n        }\n      } catch (err) {\n        // Log cookie setting errors\n        log(`Failed to set cookie ${cookie.key}: ${err}`);\n        if (cookie.key === 'ct0') {\n          log(`FAILED to set ct0 cookie! Error: ${err}`);\n        }\n      }\n    }\n  } else if (typeof document !== 'undefined') {\n    for (const cookie of document.cookie.split(';')) {\n      const hardCookie = Cookie.parse(cookie);\n      if (hardCookie) {\n        await cookieJar.setCookie(hardCookie, document.location.toString());\n      }\n    }\n  }\n}\n","import debug from 'debug';\n\nconst log = debug('twitter-scraper:xpff');\n\nlet isoCrypto: Crypto | null = null;\n\nasync function getCrypto(): Promise<Crypto> {\n  if (isoCrypto != null) {\n    return isoCrypto;\n  }\n\n  // In Node.js, the global `crypto` object is only available from v19.0.0 onwards.\n  // For earlier versions, we need to import the 'crypto' module.\n  if (typeof crypto === 'undefined') {\n    log('Global crypto is undefined, importing from crypto module...');\n    const { webcrypto } = await import('crypto');\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    isoCrypto = webcrypto as any;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return webcrypto as any;\n  }\n  isoCrypto = crypto;\n  return crypto;\n}\n\nasync function sha256(message: string): Promise<Uint8Array> {\n  const msgBuffer = new TextEncoder().encode(message);\n  const crypto = await getCrypto();\n  const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n  return new Uint8Array(hashBuffer);\n}\n\n// https://stackoverflow.com/a/40031979\nfunction buf2hex(buffer: ArrayBuffer): string {\n  return [...new Uint8Array(buffer)]\n    .map((x) => x.toString(16).padStart(2, '0'))\n    .join('');\n}\n\n// Adapted from https://github.com/dsekz/twitter-x-xp-forwarded-for-header\nexport class XPFFHeaderGenerator {\n  constructor(private readonly seed: string) {}\n\n  private async deriveKey(guestId: string): Promise<Uint8Array> {\n    const combined = `${this.seed}${guestId}`;\n    const result = await sha256(combined);\n    return result;\n  }\n\n  async generateHeader(plaintext: string, guestId: string): Promise<string> {\n    log(`Generating XPFF key for guest ID: ${guestId}`);\n    const key = await this.deriveKey(guestId);\n    const crypto = await getCrypto();\n    const nonce = crypto.getRandomValues(new Uint8Array(12));\n    const cipher = await crypto.subtle.importKey(\n      'raw',\n      key as BufferSource,\n      { name: 'AES-GCM' },\n      false,\n      ['encrypt'],\n    );\n    const encrypted = await crypto.subtle.encrypt(\n      {\n        name: 'AES-GCM',\n        iv: nonce,\n      },\n      cipher,\n      new TextEncoder().encode(plaintext),\n    );\n\n    // Combine nonce and encrypted data\n    const combined = new Uint8Array(nonce.length + encrypted.byteLength);\n    combined.set(nonce);\n    combined.set(new Uint8Array(encrypted), nonce.length);\n    const result = buf2hex(combined.buffer);\n\n    log(`XPFF header generated for guest ID ${guestId}: ${result}`);\n\n    return result;\n  }\n}\n\nconst xpffBaseKey =\n  '0e6be1f1e21ffc33590b888fd4dc81b19713e570e805d4e5df80a493c9571a05';\n\nfunction xpffPlain(): string {\n  const timestamp = Date.now();\n  return JSON.stringify({\n    navigator_properties: {\n      hasBeenActive: 'true',\n      userAgent:\n        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',\n      webdriver: 'false',\n    },\n    created_at: timestamp,\n  });\n}\n\nexport async function generateXPFFHeader(guestId: string): Promise<string> {\n  const generator = new XPFFHeaderGenerator(xpffBaseKey);\n  const plaintext = xpffPlain();\n  return generator.generateHeader(plaintext, guestId);\n}\n","import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport fetch from 'cross-fetch';\nimport {\n  CHROME_SEC_CH_UA,\n  CHROME_USER_AGENT,\n  FetchTransformOptions,\n  flexParseJson,\n} from './api';\nimport type { BrowserProfile } from './castle';\nimport {\n  RateLimitEvent,\n  RateLimitStrategy,\n  WaitingRateLimitStrategy,\n} from './rate-limit';\nimport { AuthenticationError } from './errors';\nimport debug from 'debug';\nimport { generateXPFFHeader } from './xpff';\n\nconst log = debug('twitter-scraper:auth');\n\nexport interface TwitterAuthOptions {\n  fetch: typeof fetch;\n  transform: Partial<FetchTransformOptions>;\n  rateLimitStrategy: RateLimitStrategy;\n  experimental: {\n    xClientTransactionId?: boolean;\n    xpff?: boolean;\n    /**\n     * Delay in milliseconds between login flow steps, to mimic human-like timing.\n     * Without a delay, Twitter may flag rapid-fire requests as bot activity (error 399).\n     * Set to 0 to disable (e.g. in tests). Default is 1-3 seconds (average ~2s) with random jitter.\n     */\n    flowStepDelay?: number;\n    /**\n     * Override the browser profile used for Castle.io fingerprint token generation.\n     * Unspecified fields are randomized from realistic value pools.\n     * Set this if you want a consistent fingerprint or need to match specific hardware.\n     */\n    browserProfile?: Partial<BrowserProfile>;\n  };\n}\n\nexport interface TwitterAuth {\n  fetch: typeof fetch;\n\n  /**\n   * How to behave when being rate-limited.\n   * @param event The event information.\n   */\n  onRateLimit(event: RateLimitEvent): Promise<void>;\n\n  /**\n   * Returns the current cookie jar.\n   */\n  cookieJar(): CookieJar;\n\n  /**\n   * Returns the current cookies.\n   */\n  getCookies(): Promise<Cookie[]>;\n\n  /**\n   * Returns if a user is logged-in to Twitter through this instance.\n   * @returns `true` if a user is logged-in; otherwise `false`.\n   */\n  isLoggedIn(): Promise<boolean>;\n\n  /**\n   * Logs into a Twitter account.\n   * @param username The username to log in with.\n   * @param password The password to log in with.\n   * @param email The email to log in with, if you have email confirmation enabled.\n   * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n   */\n  login(\n    username: string,\n    password: string,\n    email?: string,\n    twoFactorSecret?: string,\n  ): Promise<void>;\n\n  /**\n   * Logs out of the current session.\n   */\n  logout(): Promise<void>;\n\n  /**\n   * Deletes the current guest token token.\n   */\n  deleteToken(): void;\n\n  /**\n   * Returns if the authentication state has a token.\n   * @returns `true` if the authentication state has a token; `false` otherwise.\n   */\n  hasToken(): boolean;\n\n  /**\n   * Returns the time that authentication was performed.\n   * @returns The time at which the authentication token was created, or `null` if it hasn't been created yet.\n   */\n  authenticatedAt(): Date | null;\n\n  /**\n   * Installs the authentication information into a headers-like object. If needed, the\n   * authentication token will be updated from the API automatically.\n   * @param headers A Headers instance representing a request's headers.\n   * @param _url The URL being requested (currently unused, reserved for future use).\n   * @param bearerTokenOverride Optional bearer token to use instead of the default one.\n   */\n  installTo(\n    headers: Headers,\n    _url: string,\n    bearerTokenOverride?: string,\n  ): Promise<void>;\n}\n\n/**\n * Wraps the provided fetch function with transforms.\n * @param fetchFn The fetch function.\n * @param transform The transform options.\n * @returns The input fetch function, wrapped with the provided transforms.\n */\nfunction withTransform(\n  fetchFn: typeof fetch,\n  transform?: Partial<FetchTransformOptions>,\n): typeof fetch {\n  return async (input, init) => {\n    const fetchArgs = (await transform?.request?.(input, init)) ?? [\n      input,\n      init,\n    ];\n    const res = await fetchFn(...fetchArgs);\n    return (await transform?.response?.(res)) ?? res;\n  };\n}\n\n/**\n * A guest authentication token manager. Automatically handles token refreshes.\n */\nexport class TwitterGuestAuth implements TwitterAuth {\n  protected bearerToken: string;\n  protected jar: CookieJar;\n  protected guestToken?: string;\n  protected guestCreatedAt?: Date;\n  protected rateLimitStrategy: RateLimitStrategy;\n\n  fetch: typeof fetch;\n\n  constructor(\n    bearerToken: string,\n    readonly options?: Partial<TwitterAuthOptions>,\n  ) {\n    this.fetch = withTransform(options?.fetch ?? fetch, options?.transform);\n    this.rateLimitStrategy =\n      options?.rateLimitStrategy ?? new WaitingRateLimitStrategy();\n    this.bearerToken = bearerToken;\n    this.jar = new CookieJar();\n  }\n\n  async onRateLimit(event: RateLimitEvent): Promise<void> {\n    await this.rateLimitStrategy.onRateLimit(event);\n  }\n\n  cookieJar(): CookieJar {\n    return this.jar;\n  }\n\n  isLoggedIn(): Promise<boolean> {\n    return Promise.resolve(false);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  login(_username: string, _password: string, _email?: string): Promise<void> {\n    return this.updateGuestToken();\n  }\n\n  logout(): Promise<void> {\n    this.deleteToken();\n    this.jar = new CookieJar();\n    return Promise.resolve();\n  }\n\n  deleteToken() {\n    delete this.guestToken;\n    delete this.guestCreatedAt;\n  }\n\n  hasToken(): boolean {\n    return this.guestToken != null;\n  }\n\n  authenticatedAt(): Date | null {\n    if (this.guestCreatedAt == null) {\n      return null;\n    }\n\n    return new Date(this.guestCreatedAt);\n  }\n\n  /**\n   * Install only authentication credentials (bearer token, guest token, cookies)\n   * without browser fingerprint or platform headers. Useful for callers that\n   * build their own header set (e.g. the login flow).\n   */\n  protected async installAuthCredentials(\n    headers: Headers,\n    bearerTokenOverride?: string,\n  ): Promise<void> {\n    const tokenToUse = bearerTokenOverride ?? this.bearerToken;\n    headers.set('authorization', `Bearer ${tokenToUse}`);\n\n    // Only use guest tokens when not overriding the bearer token\n    // Guest tokens are tied to the bearer token they were generated with\n    if (!bearerTokenOverride) {\n      if (this.shouldUpdate()) {\n        await this.updateGuestToken();\n      }\n\n      if (this.guestToken) {\n        headers.set('x-guest-token', this.guestToken);\n      }\n    }\n\n    headers.set('cookie', await this.getCookieString());\n  }\n\n  async installTo(\n    headers: Headers,\n    url: string,\n    bearerTokenOverride?: string,\n  ): Promise<void> {\n    await this.installAuthCredentials(headers, bearerTokenOverride);\n\n    headers.set('user-agent', CHROME_USER_AGENT);\n\n    // Standard browser accept headers - required by Twitter API validation\n    if (!headers.has('accept')) {\n      headers.set('accept', '*/*');\n    }\n    headers.set('accept-language', 'en-US,en;q=0.9');\n\n    headers.set('sec-ch-ua', CHROME_SEC_CH_UA);\n    headers.set('sec-ch-ua-mobile', '?0');\n    headers.set('sec-ch-ua-platform', '\"Windows\"');\n\n    // Referer header - required by Cloudflare for GraphQL endpoints\n    headers.set('referer', 'https://x.com/');\n\n    // Origin header - required for cross-origin requests from x.com to api.x.com\n    headers.set('origin', 'https://x.com');\n\n    // Sec-Fetch headers - automatically set by browsers, required for API authentication\n    // Since we send requests from x.com origin to api.x.com, these are \"same-site\" (not same-origin)\n    headers.set('sec-fetch-site', 'same-site');\n    headers.set('sec-fetch-mode', 'cors');\n    headers.set('sec-fetch-dest', 'empty');\n\n    // Chrome priority hint - present on all API requests\n    headers.set('priority', 'u=1, i');\n\n    // Set content-type for GraphQL requests if not already set.\n    // Only match the known API base URLs (api.x.com and x.com/i/api).\n    if (\n      !headers.has('content-type') &&\n      (url.includes('api.x.com/graphql/') ||\n        url.includes('x.com/i/api/graphql/'))\n    ) {\n      headers.set('content-type', 'application/json');\n    }\n\n    await this.installCsrfToken(headers);\n\n    if (this.options?.experimental?.xpff) {\n      const guestId = await this.guestId();\n      if (guestId != null) {\n        const xpffHeader = await generateXPFFHeader(guestId);\n        headers.set('x-xp-forwarded-for', xpffHeader);\n      }\n    }\n  }\n\n  async installCsrfToken(headers: Headers): Promise<void> {\n    const cookies = await this.getCookies();\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n    if (xCsrfToken) {\n      headers.set('x-csrf-token', xCsrfToken.value);\n    }\n  }\n\n  protected async setCookie(key: string, value: string): Promise<void> {\n    const cookie = Cookie.parse(`${key}=${value}`);\n    if (!cookie) {\n      throw new Error('Failed to parse cookie.');\n    }\n\n    await this.jar.setCookie(cookie, this.getCookieJarUrl());\n\n    if (typeof document !== 'undefined') {\n      document.cookie = cookie.toString();\n    }\n  }\n\n  public async getCookies(): Promise<Cookie[]> {\n    return this.jar.getCookies(this.getCookieJarUrl());\n  }\n\n  protected async getCookieString(): Promise<string> {\n    const cookies = await this.getCookies();\n    return cookies.map((cookie) => `${cookie.key}=${cookie.value}`).join('; ');\n  }\n\n  protected async removeCookie(key: string): Promise<void> {\n    //@ts-expect-error don't care\n    const store: MemoryCookieStore = this.jar.store;\n    const cookies = await this.jar.getCookies(this.getCookieJarUrl());\n    for (const cookie of cookies) {\n      if (!cookie.domain || !cookie.path) continue;\n      await store.removeCookie(cookie.domain, cookie.path, key);\n\n      if (typeof document !== 'undefined') {\n        document.cookie = `${cookie.key}=; Max-Age=0; path=${cookie.path}; domain=${cookie.domain}`;\n      }\n    }\n  }\n\n  private getCookieJarUrl(): string {\n    return typeof document !== 'undefined'\n      ? document.location.toString()\n      : 'https://x.com';\n  }\n\n  protected async guestId(): Promise<string | null> {\n    const cookies = await this.getCookies();\n    const guestIdCookie = cookies.find((cookie) => cookie.key === 'guest_id');\n    return guestIdCookie ? guestIdCookie.value : null;\n  }\n\n  /**\n   * Updates the authentication state with a new guest token from the Twitter API.\n   */\n  protected async updateGuestToken() {\n    try {\n      await this.updateGuestTokenCore();\n    } catch (err) {\n      log('Failed to update guest token; this may cause issues:', err);\n    }\n  }\n\n  private async updateGuestTokenCore() {\n    const guestActivateUrl = 'https://api.x.com/1.1/guest/activate.json';\n\n    // Must include full browser headers - Cloudflare rejects requests\n    // that only have Authorization/Cookie without proper browser fingerprint\n    const headers = new Headers({\n      authorization: `Bearer ${this.bearerToken}`,\n      'user-agent': CHROME_USER_AGENT,\n      accept: '*/*',\n      'accept-language': 'en-US,en;q=0.9',\n      'content-type': 'application/x-www-form-urlencoded',\n      'sec-ch-ua': CHROME_SEC_CH_UA,\n      'sec-ch-ua-mobile': '?0',\n      'sec-ch-ua-platform': '\"Windows\"',\n      origin: 'https://x.com',\n      referer: 'https://x.com/',\n      'sec-fetch-site': 'same-site',\n      'sec-fetch-mode': 'cors',\n      'sec-fetch-dest': 'empty',\n      cookie: await this.getCookieString(),\n    });\n\n    log(`Making POST request to ${guestActivateUrl}`);\n\n    const res = await this.fetch(guestActivateUrl, {\n      method: 'POST',\n      headers: headers,\n    });\n\n    await updateCookieJar(this.jar, res.headers);\n\n    if (!res.ok) {\n      throw new AuthenticationError(await res.text());\n    }\n\n    const o = await flexParseJson<any>(res);\n    if (o == null || o['guest_token'] == null) {\n      throw new AuthenticationError('guest_token not found.');\n    }\n\n    const newGuestToken = o['guest_token'];\n    if (typeof newGuestToken !== 'string') {\n      throw new AuthenticationError('guest_token was not a string.');\n    }\n\n    this.guestToken = newGuestToken;\n    this.guestCreatedAt = new Date();\n\n    await this.setCookie('gt', newGuestToken);\n\n    log(`Updated guest token (length: ${newGuestToken.length})`);\n  }\n\n  /**\n   * Returns if the authentication token needs to be updated or not.\n   * @returns `true` if the token needs to be updated; `false` otherwise.\n   */\n  private shouldUpdate(): boolean {\n    return (\n      !this.hasToken() ||\n      (this.guestCreatedAt != null &&\n        this.guestCreatedAt <\n          new Date(new Date().valueOf() - 3 * 60 * 60 * 1000))\n    );\n  }\n}\n","export interface PlatformExtensions {\n  /**\n   * Randomizes the runtime's TLS ciphers to bypass TLS client fingerprinting, which\n   * hopefully avoids random 404s on some requests.\n   *\n   * **References:**\n   * - https://github.com/imputnet/cobalt/pull/574\n   */\n  randomizeCiphers(): Promise<void>;\n}\n\nexport const genericPlatform = new (class implements PlatformExtensions {\n  randomizeCiphers(): Promise<void> {\n    return Promise.resolve();\n  }\n})();\n","import { PlatformExtensions, genericPlatform } from './platform-interface';\n\nexport * from './platform-interface';\n\ndeclare const PLATFORM_NODE: boolean;\n\nexport class Platform implements PlatformExtensions {\n  async randomizeCiphers() {\n    const platform = await Platform.importPlatform();\n    await platform?.randomizeCiphers();\n  }\n\n  private static async importPlatform(): Promise<null | PlatformExtensions> {\n    if (PLATFORM_NODE) {\n      const { platform } = await import('./node/index.js');\n      return platform as PlatformExtensions;\n    }\n\n    return genericPlatform;\n  }\n}\n","import fetch from 'cross-fetch';\nimport debug from 'debug';\nimport { CHROME_SEC_CH_UA, CHROME_USER_AGENT } from './api';\n\nconst log = debug('twitter-scraper:xctxid');\n\n// @ts-expect-error import type annotation (\"the current file is a CommonJS module\")\ntype LinkeDOM = typeof import('linkedom');\n\nlet linkedom: LinkeDOM | null = null;\nasync function linkedomImport(): Promise<LinkeDOM> {\n  if (!linkedom) {\n    const mod = await import('linkedom');\n    linkedom = mod;\n    return mod;\n  }\n  return linkedom;\n}\n\nasync function parseHTML(html: string): Promise<Window & typeof globalThis> {\n  if (typeof window !== 'undefined') {\n    const { defaultView } = new DOMParser().parseFromString(html, 'text/html');\n    if (!defaultView) {\n      throw new Error('Failed to get defaultView from parsed HTML.');\n    }\n    return defaultView;\n  } else {\n    const { DOMParser } = await linkedomImport();\n    return new DOMParser().parseFromString(html, 'text/html').defaultView;\n  }\n}\n\n// Copied from https://github.com/Lqm1/x-client-transaction-id/blob/main/utils.ts with minor tweaks to support us passing a custom fetch function\nasync function handleXMigration(fetchFn: typeof fetch): Promise<Document> {\n  // Set headers to mimic a browser request\n  const headers = {\n    accept:\n      'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n    'accept-language': 'ja',\n    'cache-control': 'no-cache',\n    pragma: 'no-cache',\n    priority: 'u=0, i',\n    'sec-ch-ua': CHROME_SEC_CH_UA,\n    'sec-ch-ua-mobile': '?0',\n    'sec-ch-ua-platform': '\"Windows\"',\n    'sec-fetch-dest': 'document',\n    'sec-fetch-mode': 'navigate',\n    'sec-fetch-site': 'none',\n    'sec-fetch-user': '?1',\n    'upgrade-insecure-requests': '1',\n    'user-agent': CHROME_USER_AGENT,\n  };\n\n  // Fetch X.com homepage\n  const response = await fetchFn('https://x.com', {\n    headers,\n  });\n\n  if (!response.ok) {\n    throw new Error(`Failed to fetch X homepage: ${response.statusText}`);\n  }\n\n  const htmlText = await response.text();\n\n  // Parse HTML using linkedom\n  let dom = await parseHTML(htmlText);\n  let document = dom.window.document;\n\n  // Check for migration redirection links\n  const migrationRedirectionRegex = new RegExp(\n    '(http(?:s)?://(?:www\\\\.)?(twitter|x){1}\\\\.com(/x)?/migrate([/?])?tok=[a-zA-Z0-9%\\\\-_]+)+',\n    'i',\n  );\n\n  const metaRefresh = document.querySelector(\"meta[http-equiv='refresh']\");\n  const metaContent = metaRefresh\n    ? metaRefresh.getAttribute('content') || ''\n    : '';\n\n  const migrationRedirectionUrl =\n    migrationRedirectionRegex.exec(metaContent) ||\n    migrationRedirectionRegex.exec(htmlText);\n\n  if (migrationRedirectionUrl) {\n    // Follow redirection URL\n    const redirectResponse = await fetchFn(migrationRedirectionUrl[0]);\n\n    if (!redirectResponse.ok) {\n      throw new Error(\n        `Failed to follow migration redirection: ${redirectResponse.statusText}`,\n      );\n    }\n\n    const redirectHtml = await redirectResponse.text();\n    dom = await parseHTML(redirectHtml);\n    document = dom.window.document;\n  }\n\n  // Handle migration form if present\n  const migrationForm =\n    document.querySelector(\"form[name='f']\") ||\n    document.querySelector(\"form[action='https://x.com/x/migrate']\");\n\n  if (migrationForm) {\n    const url =\n      migrationForm.getAttribute('action') || 'https://x.com/x/migrate';\n    const method = migrationForm.getAttribute('method') || 'POST';\n\n    // Collect form input fields\n    const requestPayload = new FormData();\n\n    const inputFields = migrationForm.querySelectorAll('input');\n    for (const element of Array.from(inputFields)) {\n      const name = element.getAttribute('name');\n      const value = element.getAttribute('value');\n      if (name && value) {\n        requestPayload.append(name, value);\n      }\n    }\n\n    // Submit form using POST request\n    const formResponse = await fetchFn(url, {\n      method: method,\n      body: requestPayload,\n      headers,\n    });\n\n    if (!formResponse.ok) {\n      throw new Error(\n        `Failed to submit migration form: ${formResponse.statusText}`,\n      );\n    }\n\n    const formHtml = await formResponse.text();\n    dom = await parseHTML(formHtml);\n    document = dom.window.document;\n  }\n\n  // Return final DOM document\n  return document;\n}\n\n// Cache for the x.com document to avoid repeated fetches.\n// The document is needed to generate transaction IDs but doesn't change frequently.\n// We cache the Promise (not the result) to prevent concurrent calls from all fetching separately.\n//\n// NOTE: This cache is module-level and shared across ALL Scraper instances in the process.\n// If multiple Scraper instances use different fetch functions or auth contexts, they will\n// still share the same cached document. This is acceptable because the document content\n// (JS bundle hashes for transaction ID generation) is the same regardless of auth state.\n//\n// WARNING: When using multiple Scraper instances with different proxies (e.g., different\n// IP addresses or regions), the first instance's fetch function wins for the cache duration.\n// Subsequent instances will reuse the cached document even if their proxy would return\n// different content. If this is a problem, call clearDocumentCache() between switching\n// scraper instances to force a fresh fetch with the new proxy's fetch function.\nlet cachedDocumentPromise: Promise<Document> | null = null;\nlet cachedDocumentTimestamp = 0;\nconst DOCUMENT_CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Clear the cached x.com document. Useful for testing or when the cached\n * document may be stale (e.g., after a long-running process).\n */\nexport function clearDocumentCache(): void {\n  cachedDocumentPromise = null;\n  cachedDocumentTimestamp = 0;\n}\n\n/**\n * Returns a cached x.com Document, fetching a fresh one if stale.\n *\n * **Note:** Only the first caller's `fetchFn` is captured (first-caller-wins).\n * Subsequent callers within the cache TTL share the same cached document\n * regardless of which `fetchFn` they pass. This is acceptable because all\n * callers in practice share the same fetch configuration.\n */\nasync function getCachedDocument(fetchFn: typeof fetch): Promise<Document> {\n  const now = Date.now();\n  if (\n    !cachedDocumentPromise ||\n    now - cachedDocumentTimestamp > DOCUMENT_CACHE_TTL\n  ) {\n    log('Fetching fresh x.com document for transaction ID generation');\n    cachedDocumentTimestamp = now;\n    // Store the Promise immediately so concurrent calls share the same fetch\n    cachedDocumentPromise = handleXMigration(fetchFn).catch((err) => {\n      // On failure, clear the cache so the next call retries\n      cachedDocumentPromise = null;\n      throw err;\n    });\n  } else {\n    log('Using cached x.com document for transaction ID generation');\n  }\n  return cachedDocumentPromise;\n}\n\nlet ClientTransaction:\n  | typeof import('x-client-transaction-id')['ClientTransaction']\n  | null = null;\nasync function clientTransaction(): Promise<\n  typeof import('x-client-transaction-id')['ClientTransaction']\n> {\n  if (!ClientTransaction) {\n    const mod = await import('x-client-transaction-id');\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    ClientTransaction = mod.ClientTransaction as any;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return mod.ClientTransaction as any;\n  }\n  return ClientTransaction;\n}\n\n/**\n * Generate a client transaction ID for the given URL and HTTP method.\n *\n * Uses a module-level cached document (shared across all Scraper instances).\n * When using multiple scrapers with different proxies, call\n * {@link clearDocumentCache} between instances to avoid stale cache hits.\n */\nexport async function generateTransactionId(\n  url: string,\n  fetchFn: typeof fetch,\n  method: 'GET' | 'POST',\n) {\n  const parsedUrl = new URL(url);\n  const path = parsedUrl.pathname;\n\n  log(`Generating transaction ID for ${method} ${path}`);\n\n  const document = await getCachedDocument(fetchFn);\n  const ClientTransactionClass = await clientTransaction();\n  const transaction = await ClientTransactionClass.create(document);\n  const transactionId = await transaction.generateTransactionId(method, path);\n  log(`Transaction ID: ${transactionId}`);\n\n  return transactionId;\n}\n","/**\n * Chrome version-dependent fingerprint constants.\n *\n * IMPORTANT: All constants in this file are tied to a specific Chrome version\n * (currently Chrome 144 on Windows 10). When bumping the Chrome version:\n *   1. Update CHROME_USER_AGENT with the new version string\n *   2. Update CHROME_SEC_CH_UA with the matching Client Hints\n *   3. Update CHROME_JA3 fingerprint (capture via tls.peet.ws)\n *   4. Update CHROME_JA4R fingerprint\n *   5. Update CHROME_HTTP2_FINGERPRINT settings frame\n *   6. Review CHROME_HEADER_ORDER if Chrome changes header ordering\n *   7. Update castle.ts DEFAULT_PROFILE if Chrome version affects fingerprint fields\n *\n * All values must be consistent with each other and match a real Chrome release.\n */\n\n/**\n * User-Agent string matching Chrome 144 on Windows 10.\n * Must be consistent across all requests and match the TLS fingerprint.\n */\nexport const CHROME_USER_AGENT =\n  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36';\n\n/**\n * Chrome Client Hints header matching the Chrome 144 user-agent.\n */\nexport const CHROME_SEC_CH_UA =\n  '\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"';\n\n/**\n * JA3 TLS fingerprint for Chrome 144.\n * Captured from a real Chrome 144 browser session via tls.peet.ws.\n */\nexport const CHROME_JA3 =\n  '771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-10-35-16-11-51-27-65037-43-45-18-23-5-65281-13-17613,4588-29-23-24,0';\n\n/**\n * JA4r fingerprint for Chrome 144.\n * Format: t13d1516h2_CIPHERS_EXTENSIONS_SIG_ALGS\n */\nexport const CHROME_JA4R =\n  't13d1516h2_002f,0035,009c,009d,1301,1302,1303,c013,c014,c02b,c02c,c02f,c030,cca8,cca9_0005,000a,000b,000d,0012,0017,001b,0023,002b,002d,0033,44cd,fe0d,ff01_0403,0804,0401,0503,0805,0501,0806,0601';\n\n/**\n * Chrome 144 HTTP/2 fingerprint - mimics exact HTTP/2 SETTINGS frame.\n * Format: SETTINGS|window_size|unknown|priority_order\n */\nexport const CHROME_HTTP2_FINGERPRINT =\n  '1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p';\n\n/**\n * Exact header order that Chrome 144 uses.\n * Header ordering is critical for HTTP/2 fingerprint evasion — servers can detect\n * non-browser clients by checking if headers arrive in a non-standard order.\n */\nexport const CHROME_HEADER_ORDER = [\n  // HTTP/2 pseudo-headers (Chrome 144 order: method, authority, scheme, path)\n  ':method',\n  ':authority',\n  ':scheme',\n  ':path',\n  // Chrome Client Hints (mandatory for modern detection bypass)\n  'sec-ch-ua',\n  'sec-ch-ua-mobile',\n  'sec-ch-ua-platform',\n  // Standard browser headers\n  'upgrade-insecure-requests',\n  'user-agent',\n  'accept',\n  'origin',\n  'sec-fetch-site',\n  'sec-fetch-mode',\n  'sec-fetch-user',\n  'sec-fetch-dest',\n  'referer',\n  'accept-encoding',\n  'accept-language',\n  'priority',\n  // Authentication headers\n  'authorization',\n  'x-csrf-token',\n  'x-guest-token',\n  'x-twitter-auth-type',\n  'x-twitter-active-user',\n  'x-twitter-client-language',\n  'x-client-transaction-id',\n  'x-xp-forwarded-for',\n  // POST-specific\n  'content-type',\n  'cookie',\n];\n","import { FetchParameters } from './api-types';\nimport { TwitterAuth, TwitterGuestAuth } from './auth';\nimport { ApiError } from './errors';\nimport { Platform, PlatformExtensions } from './platform';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport debug from 'debug';\nimport { generateTransactionId } from './xctxid';\n\nconst log = debug('twitter-scraper:api');\n\nexport interface FetchTransformOptions {\n  /**\n   * Transforms the request options before a request is made. This executes after all of the default\n   * parameters have been configured, and is stateless. It is safe to return new request options\n   * objects.\n   * @param args The request options.\n   * @returns The transformed request options.\n   */\n  request: (\n    ...args: FetchParameters\n  ) => FetchParameters | Promise<FetchParameters>;\n\n  /**\n   * Transforms the response after a request completes. This executes immediately after the request\n   * completes, and is stateless. It is safe to return a new response object.\n   * @param response The response object.\n   * @returns The transformed response object.\n   */\n  response: (response: Response) => Response | Promise<Response>;\n}\n\nexport const bearerToken =\n  'AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF';\n\nexport const bearerToken2 =\n  'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';\n\n// Re-exported from chrome-fingerprint.ts — see that file for all Chrome\n// version-dependent constants that must be updated together.\nexport { CHROME_USER_AGENT, CHROME_SEC_CH_UA } from './chrome-fingerprint';\n\nexport async function jitter(maxMs: number): Promise<void> {\n  const jitter = Math.random() * maxMs;\n  await new Promise((resolve) => setTimeout(resolve, jitter));\n}\n\n/**\n * An API result container.\n */\nexport type RequestApiResult<T> =\n  | { success: true; value: T }\n  | { success: false; err: Error };\n\n/**\n * Used internally to send HTTP requests to the Twitter API.\n * @internal\n * @param url - The URL to send the request to.\n * @param auth - The instance of {@link TwitterAuth} that will be used to authorize this request.\n * @param method - The HTTP method used when sending this request.\n * @param platform - The platform extensions to use.\n * @param headers - The headers to include in the request.\n * @param bearerTokenOverride - Optional bearer token to use instead of the default one.\n * @param body - Optional JSON body to send with POST requests.\n */\nexport async function requestApi<T>(\n  url: string,\n  auth: TwitterAuth,\n  method: 'GET' | 'POST' = 'GET',\n  platform: PlatformExtensions = new Platform(),\n  headers: Headers = new Headers(),\n  bearerTokenOverride?: string,\n  body?: Record<string, unknown>,\n): Promise<RequestApiResult<T>> {\n  log(`Making ${method} request to ${url}`);\n\n  await auth.installTo(headers, url, bearerTokenOverride);\n  await platform.randomizeCiphers();\n\n  if (\n    auth instanceof TwitterGuestAuth &&\n    auth.options?.experimental?.xClientTransactionId\n  ) {\n    const transactionId = await generateTransactionId(\n      url,\n      auth.fetch.bind(auth),\n      method,\n    );\n    headers.set('x-client-transaction-id', transactionId);\n  }\n\n  if (body && method === 'POST') {\n    headers.set('content-type', 'application/json');\n  }\n\n  let res: Response;\n  do {\n    const fetchParameters: FetchParameters = [\n      url,\n      {\n        method,\n        headers,\n        credentials: 'include',\n        ...(body && method === 'POST' ? { body: JSON.stringify(body) } : {}),\n      },\n    ];\n\n    try {\n      res = await auth.fetch(...fetchParameters);\n    } catch (err) {\n      if (!(err instanceof Error)) {\n        throw err;\n      }\n\n      return {\n        success: false,\n        err,\n      };\n    }\n\n    await updateCookieJar(auth.cookieJar(), res.headers);\n\n    if (res.status === 429) {\n      log('Rate limit hit, waiting for retry...');\n      await auth.onRateLimit({\n        fetchParameters: fetchParameters,\n        response: res,\n      });\n    }\n  } while (res.status === 429);\n\n  if (!res.ok) {\n    return {\n      success: false,\n      err: await ApiError.fromResponse(res),\n    };\n  }\n\n  const value: T = await flexParseJson(res);\n  if (res.headers.get('x-rate-limit-incoming') == '0') {\n    auth.deleteToken();\n    return { success: true, value };\n  } else {\n    return { success: true, value };\n  }\n}\n\nexport async function flexParseJson<T>(res: Response): Promise<T> {\n  try {\n    return await res.json();\n  } catch {\n    log('Failed to parse response as JSON, trying text parse...');\n    const text = await res.text();\n    log('Response text:', text);\n    return JSON.parse(text);\n  }\n}\n\n/** @internal */\nexport function addApiFeatures(o: object) {\n  return {\n    ...o,\n    rweb_lists_timeline_redesign_enabled: true,\n    responsive_web_graphql_exclude_directive_enabled: true,\n    verified_phone_label_enabled: false,\n    creator_subscriptions_tweet_preview_api_enabled: true,\n    responsive_web_graphql_timeline_navigation_enabled: true,\n    responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n    tweetypie_unmention_optimization_enabled: true,\n    responsive_web_edit_tweet_api_enabled: true,\n    graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n    view_counts_everywhere_api_enabled: true,\n    longform_notetweets_consumption_enabled: true,\n    tweet_awards_web_tipping_enabled: false,\n    freedom_of_speech_not_reach_fetch_enabled: true,\n    standardized_nudges_misinfo: true,\n    longform_notetweets_rich_text_read_enabled: true,\n    responsive_web_enhance_cards_enabled: false,\n    subscriptions_verification_info_enabled: true,\n    subscriptions_verification_info_reason_enabled: true,\n    subscriptions_verification_info_verified_since_enabled: true,\n    super_follow_badge_privacy_enabled: false,\n    super_follow_exclusive_tweet_notifications_enabled: false,\n    super_follow_tweet_api_enabled: false,\n    super_follow_user_api_enabled: false,\n    android_graphql_skip_api_media_color_palette: false,\n    creator_subscriptions_subscription_count_enabled: false,\n    blue_business_profile_image_shape_enabled: false,\n    unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n      false,\n  };\n}\n\nexport function addApiParams(\n  params: URLSearchParams,\n  includeTweetReplies: boolean,\n): URLSearchParams {\n  params.set('include_profile_interstitial_type', '1');\n  params.set('include_blocking', '1');\n  params.set('include_blocked_by', '1');\n  params.set('include_followed_by', '1');\n  params.set('include_want_retweets', '1');\n  params.set('include_mute_edge', '1');\n  params.set('include_can_dm', '1');\n  params.set('include_can_media_tag', '1');\n  params.set('include_ext_has_nft_avatar', '1');\n  params.set('include_ext_is_blue_verified', '1');\n  params.set('include_ext_verified_type', '1');\n  params.set('skip_status', '1');\n  params.set('cards_platform', 'Web-12');\n  params.set('include_cards', '1');\n  params.set('include_ext_alt_text', 'true');\n  params.set('include_ext_limited_action_results', 'false');\n  params.set('include_quote_count', 'true');\n  params.set('include_reply_count', '1');\n  params.set('tweet_mode', 'extended');\n  params.set('include_ext_collab_control', 'true');\n  params.set('include_ext_views', 'true');\n  params.set('include_entities', 'true');\n  params.set('include_user_entities', 'true');\n  params.set('include_ext_media_color', 'true');\n  params.set('include_ext_media_availability', 'true');\n  params.set('include_ext_sensitive_media_warning', 'true');\n  params.set('include_ext_trusted_friends_metadata', 'true');\n  params.set('send_error_codes', 'true');\n  params.set('simple_quoted_tweet', 'true');\n  params.set('include_tweet_replies', `${includeTweetReplies}`);\n  params.set(\n    'ext',\n    'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe',\n  );\n  return params;\n}\n","import { TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { CHROME_SEC_CH_UA, CHROME_USER_AGENT, flexParseJson } from './api';\nimport { CookieJar } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport { TwitterApiErrorRaw, AuthenticationError, ApiError } from './errors';\nimport { Type, type Static } from '@sinclair/typebox';\nimport { Check } from '@sinclair/typebox/value';\nimport * as OTPAuth from 'otpauth';\nimport { FetchParameters } from './api-types';\nimport debug from 'debug';\n\nimport { generateTransactionId } from './xctxid';\nimport { generateLocalCastleToken } from './castle';\n\nconst log = debug('twitter-scraper:auth-user');\n\nexport interface TwitterUserAuthFlowInitRequest {\n  flow_name: string;\n  input_flow_data: Record<string, unknown>;\n  subtask_versions: Record<string, number>;\n}\n\nexport interface TwitterUserAuthFlowSubtaskRequest {\n  flow_token: string;\n  subtask_inputs: ({\n    subtask_id: string;\n  } & Record<string, unknown>)[];\n}\n\nexport type TwitterUserAuthFlowRequest =\n  | TwitterUserAuthFlowInitRequest\n  | TwitterUserAuthFlowSubtaskRequest;\n\nexport interface TwitterUserAuthFlowResponse {\n  errors?: TwitterApiErrorRaw[];\n  flow_token?: string;\n  status?: string;\n  subtasks?: TwitterUserAuthSubtask[];\n}\n\nconst TwitterUserAuthSubtask = Type.Object({\n  subtask_id: Type.String(),\n  enter_text: Type.Optional(Type.Object({})),\n});\ntype TwitterUserAuthSubtask = Static<typeof TwitterUserAuthSubtask>;\n\nexport type FlowTokenResultSuccess = {\n  status: 'success';\n  response: TwitterUserAuthFlowResponse;\n};\n\nexport type FlowTokenResultError = {\n  status: 'error';\n  err: Error;\n};\n\nexport type FlowTokenResult = FlowTokenResultSuccess | FlowTokenResultError;\n\nexport interface TwitterUserAuthCredentials {\n  username: string;\n  password: string;\n  email?: string;\n  twoFactorSecret?: string;\n}\n\n/**\n * The API interface provided to custom subtask handlers for interacting with the Twitter authentication flow.\n * This interface allows handlers to send flow requests and access the current flow token.\n *\n * The API is passed to each subtask handler and provides methods necessary for implementing\n * custom authentication subtasks. It abstracts away the low-level details of communicating\n * with Twitter's authentication API.\n *\n * @example\n * ```typescript\n * import { Scraper, FlowSubtaskHandler } from \"@the-convocation/twitter-scraper\";\n *\n * // A custom subtask handler that implements a hypothetical example subtask\n * const exampleHandler: FlowSubtaskHandler = async (subtaskId, response, credentials, api) => {\n *   // Process the example subtask somehow\n *   const data = await processExampleTask();\n *\n *   // Submit the processed data using the provided API\n *   return await api.sendFlowRequest({\n *     flow_token: api.getFlowToken(),\n *     subtask_inputs: [{\n *       subtask_id: subtaskId,\n *       example_data: {\n *         value: data,\n *         link: \"next_link\"\n *       }\n *     }]\n *   });\n * };\n *\n * const scraper = new Scraper();\n * scraper.registerAuthSubtaskHandler(\"ExampleSubtask\", exampleHandler);\n * ```\n */\nexport interface FlowSubtaskHandlerApi {\n  /**\n   * Send a flow request to the Twitter API.\n   * @param request The request object containing flow token and subtask inputs\n   * @returns The result of the flow task\n   */\n  sendFlowRequest: (\n    request: TwitterUserAuthFlowRequest,\n  ) => Promise<FlowTokenResult>;\n  /**\n   * Gets the current flow token.\n   * @returns The current flow token\n   */\n  getFlowToken: () => string;\n}\n\n/**\n * A handler function for processing Twitter authentication flow subtasks.\n * Library consumers can implement and register custom handlers for new or\n * existing subtask types using the Scraper.registerAuthSubtaskHandler method.\n *\n * Each subtask handler is called when its corresponding subtask ID is encountered\n * during the authentication flow. The handler receives the subtask ID, the previous\n * response data, the user's credentials, and an API interface for interacting with\n * the authentication flow.\n *\n * Handlers should process their specific subtask and return either a successful response\n * or an error. Success responses typically lead to the next subtask in the flow, while\n * errors will halt the authentication process.\n *\n * @param subtaskId - The identifier of the subtask being handled\n * @param previousResponse - The complete response from the previous authentication flow step\n * @param credentials - The user's authentication credentials including username, password, etc.\n * @param api - An interface providing methods to interact with the authentication flow\n * @returns A promise resolving to either a successful flow response or an error\n *\n * @example\n * ```typescript\n * import { Scraper, FlowSubtaskHandler } from \"@the-convocation/twitter-scraper\";\n *\n * // Custom handler for a hypothetical verification subtask\n * const verificationHandler: FlowSubtaskHandler = async (\n *   subtaskId,\n *   response,\n *   credentials,\n *   api\n * ) => {\n *   // Extract the verification data from the response\n *   const verificationData = response.subtasks?.[0].exampleData?.value;\n *   if (!verificationData) {\n *     return {\n *       status: 'error',\n *       err: new Error('No verification data found in response')\n *     };\n *   }\n *\n *   // Process the verification data somehow\n *   const result = await processVerification(verificationData);\n *\n *   // Submit the result using the flow API\n *   return await api.sendFlowRequest({\n *     flow_token: api.getFlowToken(),\n *     subtask_inputs: [{\n *       subtask_id: subtaskId,\n *       example_verification: {\n *         value: result,\n *         link: \"next_link\"\n *       }\n *     }]\n *   });\n * };\n *\n * const scraper = new Scraper();\n * scraper.registerAuthSubtaskHandler(\"ExampleVerificationSubtask\", verificationHandler);\n *\n * // Later, when logging in...\n * await scraper.login(\"username\", \"password\");\n * ```\n */\nexport type FlowSubtaskHandler = (\n  subtaskId: string,\n  previousResponse: TwitterUserAuthFlowResponse,\n  credentials: TwitterUserAuthCredentials,\n  api: FlowSubtaskHandlerApi,\n) => Promise<FlowTokenResult>;\n\n/**\n * A user authentication token manager.\n */\nexport class TwitterUserAuth extends TwitterGuestAuth {\n  private readonly subtaskHandlers: Map<string, FlowSubtaskHandler> = new Map();\n\n  constructor(bearerToken: string, options?: Partial<TwitterAuthOptions>) {\n    super(bearerToken, options);\n    this.initializeDefaultHandlers();\n  }\n\n  /**\n   * Register a custom subtask handler or override an existing one\n   * @param subtaskId The ID of the subtask to handle\n   * @param handler The handler function that processes the subtask\n   */\n  registerSubtaskHandler(subtaskId: string, handler: FlowSubtaskHandler): void {\n    this.subtaskHandlers.set(subtaskId, handler);\n  }\n\n  private initializeDefaultHandlers(): void {\n    this.subtaskHandlers.set(\n      'LoginJsInstrumentationSubtask',\n      this.handleJsInstrumentationSubtask.bind(this),\n    );\n    this.subtaskHandlers.set(\n      'LoginEnterUserIdentifierSSO',\n      this.handleEnterUserIdentifierSSO.bind(this),\n    );\n    this.subtaskHandlers.set(\n      'LoginEnterAlternateIdentifierSubtask',\n      this.handleEnterAlternateIdentifierSubtask.bind(this),\n    );\n    this.subtaskHandlers.set(\n      'LoginEnterPassword',\n      this.handleEnterPassword.bind(this),\n    );\n    this.subtaskHandlers.set(\n      'AccountDuplicationCheck',\n      this.handleAccountDuplicationCheck.bind(this),\n    );\n    this.subtaskHandlers.set(\n      'LoginTwoFactorAuthChallenge',\n      this.handleTwoFactorAuthChallenge.bind(this),\n    );\n    this.subtaskHandlers.set('LoginAcid', this.handleAcid.bind(this));\n    this.subtaskHandlers.set(\n      'LoginSuccessSubtask',\n      this.handleSuccessSubtask.bind(this),\n    );\n  }\n\n  async isLoggedIn(): Promise<boolean> {\n    const cookies = await this.getCookies();\n    // Both ct0 (CSRF token) and auth_token (session token) are required for authenticated requests.\n    // ct0 alone is NOT sufficient - without auth_token, Twitter returns 401 on all API calls.\n    return (\n      cookies.some((c) => c.key === 'ct0') &&\n      cookies.some((c) => c.key === 'auth_token')\n    );\n  }\n\n  async login(\n    username: string,\n    password: string,\n    email?: string,\n    twoFactorSecret?: string,\n  ): Promise<void> {\n    // Pre-flight: visit x.com to establish Cloudflare cookies and session context.\n    // A real browser visits the page before starting the login API flow, and skipping\n    // this step can trigger Twitter's anti-bot detection (error 399).\n    // The preflight also extracts the guest token from the page HTML (via inline <script>\n    // that sets the `gt` cookie), matching real browser behavior where no separate\n    // guest/activate.json call is made.\n    await this.preflight();\n\n    // Only call guest/activate.json if preflight didn't set the guest token.\n    // Real browsers get the guest token from inline JS in the login page HTML,\n    // not from a separate API call.\n    if (!this.guestToken) {\n      await this.updateGuestToken();\n    }\n\n    // IMPORTANT: Do NOT generate ct0 or send x-csrf-token during login.\n    // Real browsers do NOT have a ct0 cookie during the unauthenticated login flow.\n    // Sending x-csrf-token when the server doesn't expect it triggers bot detection (error 399).\n\n    const credentials: TwitterUserAuthCredentials = {\n      username,\n      password,\n      email,\n      twoFactorSecret,\n    };\n\n    let next: FlowTokenResult = await this.initLogin();\n    while (next.status === 'success' && next.response.subtasks?.length) {\n      const flowToken = next.response.flow_token;\n      if (flowToken == null) {\n        // Should never happen\n        throw new Error('flow_token not found.');\n      }\n\n      const subtaskId = next.response.subtasks[0].subtask_id;\n\n      // Add a human-like delay between flow steps.\n      // Real browsers take 1-3 seconds between steps (page render, user reading, typing).\n      // Without this delay, Twitter flags the rapid-fire request pattern as bot activity (error 399).\n      const configuredDelay = this.options?.experimental?.flowStepDelay;\n      const delay =\n        configuredDelay !== undefined\n          ? configuredDelay\n          : 1000 + Math.floor(Math.random() * 2000); // default: 1-3 seconds\n      if (delay > 0) {\n        log(`Waiting ${delay}ms before handling subtask: ${subtaskId}`);\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n\n      const handler = this.subtaskHandlers.get(subtaskId);\n\n      if (handler) {\n        next = await handler(subtaskId, next.response, credentials, {\n          sendFlowRequest: this.executeFlowTask.bind(this),\n          getFlowToken: () => flowToken,\n        });\n      } else {\n        throw new Error(`Unknown subtask ${subtaskId}`);\n      }\n    }\n    if (next.status === 'error') {\n      throw next.err;\n    }\n  }\n\n  /**\n   * Pre-flight request to establish Cloudflare cookies and session context.\n   * Mimics a real browser visiting x.com before starting the login API flow.\n   */\n  private async preflight(): Promise<void> {\n    try {\n      const headers = new Headers({\n        accept:\n          'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n        'accept-language': 'en-US,en;q=0.9',\n        'sec-ch-ua': CHROME_SEC_CH_UA,\n        'sec-ch-ua-mobile': '?0',\n        'sec-ch-ua-platform': '\"Windows\"',\n        'sec-fetch-dest': 'document',\n        'sec-fetch-mode': 'navigate',\n        'sec-fetch-site': 'none',\n        'sec-fetch-user': '?1',\n        'upgrade-insecure-requests': '1',\n        'user-agent': CHROME_USER_AGENT,\n      });\n\n      log('Pre-flight: fetching https://x.com/i/flow/login');\n      const res = await this.fetch('https://x.com/i/flow/login', {\n        redirect: 'follow',\n        headers: headers,\n      });\n\n      await updateCookieJar(this.jar, res.headers);\n      log(`Pre-flight response: ${res.status}`);\n\n      // Extract guest token from the HTML page.\n      // Real browsers get the guest token from inline <script> tags that set\n      // document.cookie=\"gt=<token>; ...\" rather than calling guest/activate.json.\n      try {\n        const html = await res.text();\n        const gtMatch = html.match(/document\\.cookie=\"gt=(\\d+)/);\n        if (gtMatch) {\n          this.guestToken = gtMatch[1];\n          this.guestCreatedAt = new Date();\n          // Also set the gt cookie in our jar (as the browser would)\n          await this.setCookie('gt', gtMatch[1]);\n          log(`Extracted guest token from HTML (length: ${gtMatch[1].length})`);\n        }\n      } catch (err) {\n        log('Failed to extract guest token from HTML (non-fatal):', err);\n      }\n    } catch (err) {\n      log('Pre-flight request failed (non-fatal):', err);\n    }\n  }\n\n  async logout(): Promise<void> {\n    if (!this.hasToken()) {\n      return;\n    }\n\n    try {\n      const logoutUrl = 'https://api.x.com/1.1/account/logout.json';\n      const headers = new Headers();\n      await this.installTo(headers, logoutUrl);\n\n      await this.fetch(logoutUrl, {\n        method: 'POST',\n        headers,\n      });\n    } catch (error) {\n      // Ignore errors during logout but still clean up state\n      log('Error during logout:', error);\n    } finally {\n      this.deleteToken();\n      this.jar = new CookieJar();\n    }\n  }\n\n  async installTo(\n    headers: Headers,\n    url: string,\n    bearerTokenOverride?: string,\n  ): Promise<void> {\n    // Reuse all shared browser + auth headers from the guest auth base class\n    await super.installTo(headers, url, bearerTokenOverride);\n\n    // CRITICAL: Tell Twitter this is an authenticated user session (not guest)\n    headers.set('x-twitter-auth-type', 'OAuth2Session');\n    headers.set('x-twitter-active-user', 'yes');\n    headers.set('x-twitter-client-language', 'en');\n\n    // Note: Transaction ID generation is NOT done here. It is handled by\n    // requestApi() (api.ts) which knows the actual HTTP method (GET vs POST).\n    // Generating it here would use the wrong method and be immediately\n    // overwritten by requestApi anyway.\n  }\n\n  private async initLogin(): Promise<FlowTokenResult> {\n    // Reset stale session cookies from previous logins.\n    // We preserve __cf_bm (Cloudflare cookie from preflight) and gt (guest token).\n    // ct0 should NOT exist during login - real browsers don't have it until authenticated.\n    await this.removeCookie('twitter_ads_id');\n    await this.removeCookie('ads_prefs');\n    await this.removeCookie('_twitter_sess');\n    await this.removeCookie('zipbox_forms_auth_token');\n    await this.removeCookie('lang');\n    await this.removeCookie('bouncer_reset_cookie');\n    await this.removeCookie('twid');\n    await this.removeCookie('twitter_ads_idb');\n    await this.removeCookie('email_uid');\n    await this.removeCookie('external_referer');\n    await this.removeCookie('aa_u');\n\n    return await this.executeFlowTask({\n      flow_name: 'login',\n      input_flow_data: {\n        flow_context: {\n          debug_overrides: {},\n          start_location: {\n            location: 'manual_link',\n          },\n        },\n      },\n      subtask_versions: {\n        action_list: 2,\n        alert_dialog: 1,\n        app_download_cta: 1,\n        check_logged_in_account: 1,\n        choice_selection: 3,\n        contacts_live_sync_permission_prompt: 0,\n        cta: 7,\n        email_verification: 2,\n        end_flow: 1,\n        enter_date: 1,\n        enter_email: 2,\n        enter_password: 5,\n        enter_phone: 2,\n        enter_recaptcha: 1,\n        enter_text: 5,\n        enter_username: 2,\n        generic_urt: 3,\n        in_app_notification: 1,\n        interest_picker: 3,\n        js_instrumentation: 1,\n        menu_dialog: 1,\n        notifications_permission_prompt: 2,\n        open_account: 2,\n        open_home_timeline: 1,\n        open_link: 1,\n        phone_verification: 4,\n        privacy_options: 1,\n        security_key: 3,\n        select_avatar: 4,\n        select_banner: 2,\n        settings_list: 7,\n        show_code: 1,\n        sign_up: 2,\n        sign_up_review: 4,\n        tweet_selection_urt: 1,\n        update_users: 1,\n        upload_media: 1,\n        user_recommendations_list: 4,\n        user_recommendations_urt: 1,\n        wait_spinner: 3,\n        web_modal: 1,\n      },\n    });\n  }\n\n  private async handleJsInstrumentationSubtask(\n    subtaskId: string,\n    prev: TwitterUserAuthFlowResponse,\n    _credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    // Extract the JS instrumentation URL from the subtask response.\n    // The script at this URL collects browser metrics (fingerprinting) that Twitter\n    // validates. Sending \"{}\" (empty) triggers bot detection (error 399).\n    const subtasks = prev.subtasks as {\n      subtask_id: string;\n      js_instrumentation?: { url: string };\n    }[];\n    const jsSubtask = subtasks?.find((s) => s.subtask_id === subtaskId);\n    const jsUrl: string | undefined = jsSubtask?.js_instrumentation?.url;\n\n    let metricsResponse = '{}';\n    if (jsUrl) {\n      try {\n        metricsResponse = await this.executeJsInstrumentation(jsUrl);\n        log(\n          `JS instrumentation executed successfully, response length: ${metricsResponse.length}`,\n        );\n      } catch (err) {\n        log('Failed to execute JS instrumentation (falling back to {})', err);\n      }\n    }\n\n    return await api.sendFlowRequest({\n      flow_token: api.getFlowToken(),\n      subtask_inputs: [\n        {\n          subtask_id: subtaskId,\n          js_instrumentation: {\n            response: metricsResponse,\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  /**\n   * Maximum allowed size (in bytes) for the JS instrumentation script.\n   * Twitter's scripts are typically ~50-100KB. Anything significantly larger\n   * may indicate tampering or an unexpected response.\n   */\n  private static readonly JS_INSTRUMENTATION_MAX_SIZE = 512 * 1024; // 512KB\n\n  /**\n   * Fetches and executes the JS instrumentation script to generate browser\n   * fingerprinting data. The result is written to an input element named\n   * 'ui_metrics'.\n   *\n   * In browser environments, uses a hidden iframe with native DOM APIs.\n   * In Node.js, uses linkedom (for DOM) and the vm module for execution.\n   *\n   * @security This method executes **remote JavaScript** fetched from Twitter's servers.\n   * - In browsers, execution is isolated in a disposable iframe.\n   * - In Node.js, `vm.runInContext` is used for convenience, NOT for security.\n   *   Node's `vm` module provides NO security sandbox — a malicious script can\n   *   trivially escape the context (e.g., via `this.constructor.constructor('return process')()`).\n   *   The only real trust boundary is that scripts are fetched from Twitter's known CDN URLs.\n   *   Setting `process: undefined` etc. in the sandbox context is cosmetic and does not\n   *   prevent escape.\n   * - A maximum script size limit (512KB) and a 5-second timeout provide basic sanity checks.\n   */\n  private async executeJsInstrumentation(url: string): Promise<string> {\n    log(`Fetching JS instrumentation from: ${url}`);\n    const response = await this.fetch(url);\n    const scriptContent = await response.text();\n    log(`JS instrumentation script fetched, length: ${scriptContent.length}`);\n\n    if (scriptContent.length > TwitterUserAuth.JS_INSTRUMENTATION_MAX_SIZE) {\n      log(\n        `WARNING: JS instrumentation script exceeds size limit (${scriptContent.length} > ${TwitterUserAuth.JS_INSTRUMENTATION_MAX_SIZE}), skipping execution`,\n      );\n      return '{}';\n    }\n\n    if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n      return this.executeJsInstrumentationBrowser(scriptContent);\n    }\n    return this.executeJsInstrumentationNode(scriptContent);\n  }\n\n  /**\n   * Execute JS instrumentation in a browser environment using a hidden iframe.\n   * The iframe provides natural isolation — the script gets its own document\n   * and window, and we can override setTimeout without affecting the host page.\n   */\n  private async executeJsInstrumentationBrowser(\n    scriptContent: string,\n  ): Promise<string> {\n    const iframe = document.createElement('iframe');\n    iframe.style.display = 'none';\n    document.body.appendChild(iframe);\n\n    try {\n      const iframeWin = iframe.contentWindow;\n      const iframeDoc = iframe.contentDocument;\n      if (!iframeWin || !iframeDoc) {\n        log('WARNING: Could not access iframe document/window');\n        return '{}';\n      }\n\n      // Add the ui_metrics input element that the script writes its result to\n      const input = iframeDoc.createElement('input');\n      input.name = 'ui_metrics';\n      input.type = 'hidden';\n      iframeDoc.body.appendChild(input);\n\n      // Override setTimeout to be synchronous — we need the result immediately\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (iframeWin as any).setTimeout = (fn: any) => fn();\n\n      // Execute the script in the iframe context via <script> tag injection\n      const script = iframeDoc.createElement('script');\n      script.textContent = scriptContent;\n      iframeDoc.body.appendChild(script);\n\n      const value = input.value;\n      if (value) {\n        log(`JS instrumentation result extracted, length: ${value.length}`);\n        return value;\n      }\n\n      log('WARNING: No ui_metrics value found after script execution');\n      return '{}';\n    } finally {\n      document.body.removeChild(iframe);\n    }\n  }\n\n  /**\n   * Execute JS instrumentation in Node.js using linkedom for DOM emulation\n   * and the vm module for sandboxed script execution.\n   *\n   * @security Node's `vm` module does NOT provide a security sandbox. A\n   * malicious script can trivially escape the context. The only real trust\n   * boundary is that scripts come from Twitter's CDN. The undefined globals\n   * (process, require, etc.) are cosmetic — they do not prevent sandbox escape.\n   */\n  private async executeJsInstrumentationNode(\n    scriptContent: string,\n  ): Promise<string> {\n    // Use linkedom to create a DOM environment with the required elements.\n    // The script needs: document.createElement, getElementsByName, getElementsByTagName,\n    // appendChild, removeChild, parentNode, children, innerText, lastElementChild, etc.\n    // We use parseHTML (not DOMParser) for a more complete window/document implementation.\n    const { parseHTML } = await import('linkedom');\n    const { document: doc, window: win } = parseHTML(\n      '<html><head></head><body><input name=\"ui_metrics\" type=\"hidden\" value=\"\" /></body></html>',\n    );\n\n    // Polyfill getElementsByName if linkedom doesn't implement it.\n    if (typeof doc.getElementsByName !== 'function') {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (doc as any).getElementsByName = (name: string) =>\n        doc.querySelectorAll(`[name=\"${name}\"]`);\n    }\n\n    // Execute the script in a sandboxed VM context.\n    // The script expects `document` and `window` as globals and uses `setTimeout`\n    // to schedule execution. We make setTimeout synchronous since we need the result\n    // immediately. The script checks document.readyState to decide between setTimeout\n    // and addEventListener('load'/'DOMContentLoaded').\n    const vm = await import('vm');\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const origSetTimeout = (win as any).setTimeout;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (win as any).setTimeout = (fn: any) => fn();\n\n    try {\n      Object.defineProperty(doc, 'readyState', {\n        value: 'complete',\n        writable: true,\n        configurable: true,\n      });\n    } catch {\n      // If readyState can't be set, the script will use event listeners\n    }\n\n    const sandbox = {\n      document: doc,\n      window: win,\n      Date: Date,\n      JSON: JSON,\n      parseInt: parseInt,\n      // Deny access to Node.js internals to limit sandbox escape surface\n      process: undefined,\n      require: undefined,\n      global: undefined,\n      globalThis: undefined,\n    };\n    vm.runInNewContext(scriptContent, sandbox, { timeout: 5000 });\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (win as any).setTimeout = origSetTimeout;\n\n    // Extract the result from the ui_metrics input element\n    const inputs = doc.getElementsByName('ui_metrics');\n    if (inputs && inputs.length > 0) {\n      const value =\n        (inputs[0] as HTMLInputElement).value ||\n        inputs[0].getAttribute('value');\n      if (value) {\n        log(`JS instrumentation result extracted, length: ${value.length}`);\n        return value;\n      }\n    }\n\n    log('WARNING: No ui_metrics value found after script execution');\n    return '{}';\n  }\n\n  private async handleEnterAlternateIdentifierSubtask(\n    subtaskId: string,\n    _prev: TwitterUserAuthFlowResponse,\n    credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    return await this.executeFlowTask({\n      flow_token: api.getFlowToken(),\n      subtask_inputs: [\n        {\n          subtask_id: subtaskId,\n          enter_text: {\n            text: credentials.email,\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleEnterUserIdentifierSSO(\n    subtaskId: string,\n    _prev: TwitterUserAuthFlowResponse,\n    credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    // Generate a Castle.io device fingerprint token.\n    // Twitter requires this token with the username submission step (settings_list).\n    // Without it, Twitter returns error 399 (\"suspicious activity\").\n    let castleToken: string | undefined;\n    try {\n      castleToken = await this.generateCastleToken();\n      log(`Castle token generated, length: ${castleToken.length}`);\n    } catch (err) {\n      log('Failed to generate castle token (continuing without it):', err);\n    }\n\n    const settingsList: {\n      setting_responses: {\n        key: string;\n        response_data: { text_data: { result: string } };\n      }[];\n      link: string;\n      castle_token?: string;\n    } = {\n      setting_responses: [\n        {\n          key: 'user_identifier',\n          response_data: {\n            text_data: { result: credentials.username },\n          },\n        },\n      ],\n      link: 'next_link',\n    };\n\n    if (castleToken) {\n      settingsList.castle_token = castleToken;\n    }\n\n    return await this.executeFlowTask({\n      flow_token: api.getFlowToken(),\n      subtask_inputs: [\n        {\n          subtask_id: subtaskId,\n          settings_list: settingsList,\n        },\n      ],\n    });\n  }\n\n  /**\n   * Generates a Castle.io device fingerprint token for the login flow.\n   * Uses local token generation (Castle.io v11 format) to avoid external\n   * API dependencies and rate limits.\n   */\n  private async generateCastleToken(): Promise<string> {\n    const userAgent = CHROME_USER_AGENT;\n\n    const browserProfile = this.options?.experimental?.browserProfile;\n    const { token, cuid } = generateLocalCastleToken(userAgent, browserProfile);\n\n    // Set the __cuid cookie (Castle.io uses this for tracking)\n    await this.setCookie('__cuid', cuid);\n\n    log(\n      `Castle token generated locally, length: ${\n        token.length\n      }, cuid: ${cuid.substring(0, 6)}...`,\n    );\n\n    return token;\n  }\n\n  private async handleEnterPassword(\n    subtaskId: string,\n    _prev: TwitterUserAuthFlowResponse,\n    credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    // Generate a fresh castle token for the password step too.\n    let castleToken: string | undefined;\n    try {\n      castleToken = await this.generateCastleToken();\n      log(`Castle token for password step, length: ${castleToken.length}`);\n    } catch (err) {\n      log(\n        'Failed to generate castle token for password (continuing without):',\n        err,\n      );\n    }\n\n    const enterPassword: {\n      password: string;\n      link: string;\n      castle_token?: string;\n    } = {\n      password: credentials.password,\n      link: 'next_link',\n    };\n\n    if (castleToken) {\n      enterPassword.castle_token = castleToken;\n    }\n\n    return await this.executeFlowTask({\n      flow_token: api.getFlowToken(),\n      subtask_inputs: [\n        {\n          subtask_id: subtaskId,\n          enter_password: enterPassword,\n        },\n      ],\n    });\n  }\n\n  private async handleAccountDuplicationCheck(\n    subtaskId: string,\n    _prev: TwitterUserAuthFlowResponse,\n    _credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    return await this.executeFlowTask({\n      flow_token: api.getFlowToken(),\n      subtask_inputs: [\n        {\n          subtask_id: subtaskId,\n          check_logged_in_account: {\n            link: 'AccountDuplicationCheck_false',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleTwoFactorAuthChallenge(\n    subtaskId: string,\n    _prev: TwitterUserAuthFlowResponse,\n    credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    if (!credentials.twoFactorSecret) {\n      return {\n        status: 'error',\n        err: new AuthenticationError(\n          'Two-factor authentication is required but no secret was provided',\n        ),\n      };\n    }\n\n    const totp = new OTPAuth.TOTP({ secret: credentials.twoFactorSecret });\n    let lastResult!: FlowTokenResult;\n    for (let attempts = 1; attempts < 4; attempts += 1) {\n      const result = await api.sendFlowRequest({\n        flow_token: api.getFlowToken(),\n        subtask_inputs: [\n          {\n            subtask_id: subtaskId,\n            enter_text: {\n              link: 'next_link',\n              text: totp.generate(),\n            },\n          },\n        ],\n      });\n\n      if (result.status === 'success') {\n        return result;\n      }\n\n      lastResult = result;\n      log(`2FA attempt ${attempts} failed: ${result.err.message}`);\n      await new Promise((resolve) => setTimeout(resolve, 2000 * attempts));\n    }\n    return lastResult;\n  }\n\n  private async handleAcid(\n    subtaskId: string,\n    _prev: TwitterUserAuthFlowResponse,\n    credentials: TwitterUserAuthCredentials,\n    api: FlowSubtaskHandlerApi,\n  ): Promise<FlowTokenResult> {\n    return await this.executeFlowTask({\n      flow_token: api.getFlowToken(),\n      subtask_inputs: [\n        {\n          subtask_id: subtaskId,\n          enter_text: {\n            text: credentials.email,\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleSuccessSubtask(): Promise<FlowTokenResult> {\n    // Login completed successfully, nothing more to do\n    log('Successfully logged in with user credentials.');\n    return {\n      status: 'success',\n      response: {},\n    };\n  }\n\n  private async executeFlowTask(\n    data: TwitterUserAuthFlowRequest,\n  ): Promise<FlowTokenResult> {\n    let onboardingTaskUrl = 'https://api.x.com/1.1/onboarding/task.json';\n    if ('flow_name' in data) {\n      onboardingTaskUrl = `https://api.x.com/1.1/onboarding/task.json?flow_name=${data.flow_name}`;\n    }\n\n    log(`Making POST request to ${onboardingTaskUrl}`);\n    log(\n      'Request data:',\n      JSON.stringify(\n        data,\n        (key, value) => (key === 'password' ? '[REDACTED]' : value),\n        2,\n      ),\n    );\n    // Match exact headers observed from real Chrome browser during login flow.\n    // Notable absences vs authenticated requests: no cache-control, no pragma,\n    // no x-csrf-token, no x-twitter-auth-type, no x-xp-forwarded-for.\n    // We use installAuthCredentials() (not installTo()) to get only the auth\n    // essentials (bearer token, guest token, cookies) without browser headers\n    // that would need to be deleted afterwards.\n    const headers = new Headers({\n      accept: '*/*',\n      'accept-language': 'en-US,en;q=0.9',\n      'content-type': 'application/json',\n      origin: 'https://x.com',\n      priority: 'u=1, i',\n      referer: 'https://x.com/',\n      'sec-ch-ua': CHROME_SEC_CH_UA,\n      'sec-ch-ua-mobile': '?0',\n      'sec-ch-ua-platform': '\"Windows\"',\n      'sec-fetch-dest': 'empty',\n      'sec-fetch-mode': 'cors',\n      'sec-fetch-site': 'same-site',\n      'user-agent': CHROME_USER_AGENT,\n      'x-twitter-active-user': 'yes',\n      'x-twitter-client-language': 'en',\n    });\n    await this.installAuthCredentials(headers);\n\n    // Generate x-client-transaction-id if enabled - real browsers send this during login.\n    if (this.options?.experimental?.xClientTransactionId) {\n      const transactionId = await generateTransactionId(\n        onboardingTaskUrl,\n        this.fetch.bind(this),\n        'POST',\n      );\n      headers.set('x-client-transaction-id', transactionId);\n    }\n\n    // Strip flow_name from the body: real browsers only send it in the URL query parameter.\n    const bodyData: Record<string, unknown> = { ...data };\n    if ('flow_name' in bodyData) {\n      delete bodyData.flow_name;\n    }\n\n    let res: Response;\n    do {\n      const fetchParameters: FetchParameters = [\n        onboardingTaskUrl,\n        {\n          credentials: 'include',\n          method: 'POST',\n          headers: headers,\n          body: JSON.stringify(bodyData),\n        },\n      ];\n\n      try {\n        res = await this.fetch(...fetchParameters);\n      } catch (err) {\n        if (!(err instanceof Error)) {\n          throw err;\n        }\n\n        return {\n          status: 'error',\n          err: err,\n        };\n      }\n\n      await updateCookieJar(this.jar, res.headers);\n\n      log(`Response status: ${res.status}`);\n      if (res.status === 429) {\n        log('Rate limit hit, waiting before retrying...');\n        await this.onRateLimit({\n          fetchParameters: fetchParameters,\n          response: res,\n        });\n      }\n    } while (res.status === 429);\n\n    // Parse the response body once - we need it for both error and success handling.\n    // Twitter sometimes returns flow errors (e.g., error 399) with HTTP 400 status,\n    // so we must parse the body before checking res.ok.\n    let flow: TwitterUserAuthFlowResponse;\n    try {\n      flow = await flexParseJson(res);\n    } catch {\n      if (!res.ok) {\n        return {\n          status: 'error',\n          err: new ApiError(res, 'Failed to parse response body'),\n        };\n      }\n      return {\n        status: 'error',\n        err: new AuthenticationError('Failed to parse flow response.'),\n      };\n    }\n    log(\n      'Flow response: status=%s subtasks=%s',\n      flow.status,\n      flow.subtasks?.map((s) => s.subtask_id).join(', '),\n    );\n\n    // Check for flow-level errors (can appear in both 200 and 400 responses)\n    if (flow.errors?.length) {\n      log('Twitter auth flow errors:', JSON.stringify(flow.errors, null, 2));\n\n      // Special handling for error 399 - suspicious activity detected\n      if (flow.errors[0].code === 399) {\n        const message = flow.errors[0].message || '';\n\n        // Extract challenge token for logging (format: \"g;...:...:...\")\n        const challengeMatch = message.match(/g;[^:]+:[^:]+:[0-9]+/);\n        if (challengeMatch) {\n          log('Twitter challenge token detected:', challengeMatch[0]);\n        }\n\n        // Provide actionable error message\n        return {\n          status: 'error',\n          err: new AuthenticationError(\n            'Twitter blocked this login attempt due to suspicious activity (error 399). ' +\n              'This is not an issue with your credentials - Twitter requires additional authentication.\\n\\n' +\n              'Solutions:\\n' +\n              '1. Use cookie-based authentication (RECOMMENDED): Export cookies from your browser ' +\n              'and use scraper.setCookies() - see README for details\\n' +\n              '2. Enable Two-Factor Authentication (2FA) on your account and provide totp_secret\\n' +\n              '3. Wait 15 minutes before retrying (Twitter rate limit for suspicious logins)\\n' +\n              '4. Login via browser first to establish device trust\\n\\n' +\n              `Original error: ${message}`,\n          ),\n        };\n      }\n\n      return {\n        status: 'error',\n        err: new AuthenticationError(\n          `Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`,\n        ),\n      };\n    }\n\n    // For non-200 responses without recognized flow errors, return generic API error\n    if (!res.ok) {\n      return { status: 'error', err: new ApiError(res, flow) };\n    }\n\n    if (flow?.flow_token == null) {\n      return {\n        status: 'error',\n        err: new AuthenticationError('flow_token not found.'),\n      };\n    }\n\n    if (typeof flow.flow_token !== 'string') {\n      return {\n        status: 'error',\n        err: new AuthenticationError('flow_token was not a string.'),\n      };\n    }\n\n    const subtask = flow.subtasks?.length ? flow.subtasks[0] : undefined;\n    if (subtask && !Check(TwitterUserAuthSubtask, subtask as unknown)) {\n      log(\n        'WARNING: Subtask failed schema validation: %s',\n        subtask.subtask_id ?? 'unknown',\n      );\n    }\n\n    if (subtask && subtask.subtask_id === 'DenyLoginSubtask') {\n      return {\n        status: 'error',\n        err: new AuthenticationError('Authentication error: DenyLoginSubtask'),\n      };\n    }\n\n    return {\n      status: 'success',\n      response: flow,\n    };\n  }\n}\n","import stringify from 'json-stable-stringify';\n\n/**\n * Examples of requests to API endpoints. These are parsed at runtime and used\n * as templates for requests to a particular endpoint. Please ensure these do\n * not contain any information that you do not want published to NPM.\n */\nconst endpoints = {\n  UserTweets:\n    'https://api.x.com/graphql/N2tFDY-MlrLxXJ9F_ZxJGA/UserTweets?variables=%7B%22userId%22%3A%2244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n  UserTweetsAndReplies:\n    'https://api.x.com/graphql/2NDLUdBmT_IB5uGwZ3tHRg/UserTweetsAndReplies?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n  UserLikedTweets:\n    'https://api.x.com/graphql/Pcw-j9lrSeDMmkgnIejJiQ/Likes?variables=%7B%22userId%22%3A%222244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withClientEventToken%22%3Afalse%2C%22withBirdwatchNotes%22%3Afalse%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n  UserByScreenName:\n    'https://api.x.com/graphql/AWbeRIdkLtqTRN7yL_H8yw/UserByScreenName?variables=%7B%22screen_name%22%3A%22elonmusk%22%2C%22withGrokTranslatedBio%22%3Atrue%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withPayments%22%3Afalse%2C%22withAuxiliaryUserLabels%22%3Atrue%7D',\n  TweetDetail:\n    'https://api.x.com/graphql/YCNdW_ZytXfV9YR3cJK9kw/TweetDetail?variables=%7B%22focalTweetId%22%3A%221985465713096794294%22%2C%22with_rux_injections%22%3Afalse%2C%22rankingMode%22%3A%22Relevance%22%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%2C%22withGrokAnalyze%22%3Afalse%2C%22withDisallowedReplyControls%22%3Afalse%7D',\n  TweetResultByRestId:\n    'https://api.x.com/graphql/4PdbzTmQ5PTjz9RiureISQ/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221985465713096794294%22%2C%22includePromotedContent%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withCommunity%22%3Atrue%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Atrue%2C%22withArticlePlainText%22%3Afalse%7D',\n  ListTweets:\n    'https://api.x.com/graphql/Uv3buKIUElzL3Iuc0L0O5g/ListLatestTweetsTimeline?variables=%7B%22listId%22%3A%221736495155002106192%22%2C%22count%22%3A20%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n  SearchTimeline:\n    'https://api.x.com/graphql/ML-n2SfAxx5S_9QMqNejbg/SearchTimeline?variables=%7B%22rawQuery%22%3A%22twitter%22%2C%22count%22%3A20%2C%22querySource%22%3A%22typed_query%22%2C%22product%22%3A%22Top%22%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n  Followers:\n    'https://api.x.com/graphql/P7m4Qr-rJEB8KUluOenU6A/Followers?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n  Following:\n    'https://api.x.com/graphql/T5wihsMTYHncY7BB4YxHSg/Following?variables=%7B%22userId%22%3A%221806359170830172162%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withGrokTranslatedBio%22%3Afalse%7D&features=%7B%22rweb_video_screen_enabled%22%3Afalse%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22responsive_web_profile_redirect_enabled%22%3Afalse%2C%22rweb_tipjar_consumption_enabled%22%3Afalse%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22premium_content_api_read_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22responsive_web_grok_analyze_button_fetch_trends_enabled%22%3Afalse%2C%22responsive_web_grok_analyze_post_followups_enabled%22%3Atrue%2C%22responsive_web_jetfuel_frame%22%3Atrue%2C%22responsive_web_grok_share_attachment_enabled%22%3Atrue%2C%22responsive_web_grok_annotations_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22responsive_web_grok_show_grok_translated_post%22%3Atrue%2C%22responsive_web_grok_analysis_button_from_backend%22%3Atrue%2C%22post_ctas_fetch_enabled%22%3Atrue%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_grok_image_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_imagine_annotation_enabled%22%3Atrue%2C%22responsive_web_grok_community_note_auto_translation_is_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n} as const;\n\nexport interface EndpointFieldInfo {\n  /**\n   * Request variables, used for providing arguments such as user IDs or result counts.\n   */\n  variables: Record<string, unknown>;\n\n  /**\n   * Request features, used for encoding feature flags into the request. These may either be\n   * boolean values or numerically-encoded booleans (1 or 0). It is possible this may change\n   * to include other representations of booleans as Twitter's backend evolves.\n   */\n  features: Record<string, unknown>;\n\n  /**\n   * Request field toggles, used for limiting how returned fields are represented. This is\n   * rarely used.\n   */\n  fieldToggles: Record<string, unknown>;\n}\n\ntype SomePartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\ntype EndpointVersion = string;\ntype EndpointName = string;\ntype EncodedVariables = string;\ntype EncodedFeatures = string;\ntype EncodedFieldToggles = string;\n\n// TODO: Set up field-level Intellisense for the QraphQL parameters in these?\ntype BaseUrl =\n  | 'https://twitter.com/i/api/graphql'\n  | 'https://x.com/i/api/graphql'\n  | 'https://api.x.com/graphql';\ntype EndpointFields<EndpointUrl> =\n  EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}&fieldToggles=${EncodedFieldToggles}`\n    ? EndpointFieldInfo\n    : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}`\n    ? SomePartial<EndpointFieldInfo, 'fieldToggles'>\n    : EndpointUrl extends `${BaseUrl}/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}`\n    ? SomePartial<EndpointFieldInfo, 'features' | 'fieldToggles'>\n    : Partial<EndpointFieldInfo>;\n\nexport type ApiRequestInfo<EndpointUrl> = EndpointFields<EndpointUrl> & {\n  /**\n   * The URL, without any GraphQL query parameters.\n   */\n  url: string;\n\n  /**\n   * Converts the request back into a URL to be sent to the Twitter API.\n   */\n  toRequestUrl(): string;\n\n  /**\n   * Converts the request into a JSON body for POST requests.\n   */\n  toRequestBody(): Record<string, unknown>;\n};\n\n/** Wrapper class for API request information. */\nclass ApiRequest<EndpointUrl> {\n  url: string;\n  variables?: Record<string, unknown> | undefined;\n  features?: Record<string, unknown> | undefined;\n  fieldToggles?: Record<string, unknown> | undefined;\n\n  constructor(info: Omit<ApiRequestInfo<EndpointUrl>, 'toRequestUrl'>) {\n    this.url = info.url;\n    this.variables = info.variables;\n    this.features = info.features;\n    this.fieldToggles = info.fieldToggles;\n  }\n\n  toRequestUrl(): string {\n    const params = new URLSearchParams();\n\n    // Only include query parameters with values\n    if (this.variables) {\n      // Stringify with the query keys in sorted order like the Go package\n      const variablesStr = stringify(this.variables);\n      if (variablesStr) params.set('variables', variablesStr);\n    }\n\n    if (this.features) {\n      const featuresStr = stringify(this.features);\n      if (featuresStr) params.set('features', featuresStr);\n    }\n\n    if (this.fieldToggles) {\n      const fieldTogglesStr = stringify(this.fieldToggles);\n      if (fieldTogglesStr) params.set('fieldToggles', fieldTogglesStr);\n    }\n\n    return `${this.url}?${params.toString()}`;\n  }\n\n  /**\n   * Converts the request into a JSON body for POST requests.\n   */\n  toRequestBody(): Record<string, unknown> {\n    const body: Record<string, unknown> = {};\n    if (this.variables) body.variables = this.variables;\n    if (this.features) body.features = this.features;\n    if (this.fieldToggles) body.fieldToggles = this.fieldToggles;\n    return body;\n  }\n}\n\n/**\n * Parses information from a Twitter API endpoint using an example request\n * URL against that endpoint. This can be used to extract GraphQL parameters\n * in order to easily reuse and/or override them later.\n * @param example An example of the endpoint to analyze.\n * @returns The parsed endpoint information.\n */\nfunction parseEndpointExample<\n  Endpoints,\n  Endpoint extends string & keyof Endpoints,\n>(example: Endpoint): ApiRequestInfo<Endpoints[Endpoint]> {\n  const { protocol, host, pathname, searchParams: query } = new URL(example);\n\n  const base = `${protocol}//${host}${pathname}`;\n  const variables = query.get('variables');\n  const features = query.get('features');\n  const fieldToggles = query.get('fieldToggles');\n\n  return new ApiRequest<Endpoints[Endpoint]>({\n    url: base,\n    variables: variables ? JSON.parse(variables) : undefined,\n    features: features ? JSON.parse(features) : undefined,\n    fieldToggles: fieldToggles ? JSON.parse(fieldToggles) : undefined,\n  } as Omit<ApiRequestInfo<Endpoints[Endpoint]>, 'toRequestUrl'>) as ApiRequestInfo<\n    Endpoints[Endpoint]\n  >;\n}\n\ntype ApiRequestFactory<Endpoints> = {\n  [Endpoint in keyof Endpoints as `create${string &\n    Endpoint}Request`]: () => ApiRequestInfo<Endpoints[Endpoint]>;\n};\n\nfunction createApiRequestFactory<Endpoints extends Record<string, string>>(\n  endpoints: Endpoints,\n): ApiRequestFactory<Endpoints> {\n  type UntypedApiRequestFactory = ApiRequestFactory<Record<string, string>>;\n\n  return Object.entries(endpoints)\n    .map<UntypedApiRequestFactory>(([endpointName, endpointExample]) => {\n      // Create a partial factory for only one endpoint\n      return {\n        [`create${endpointName}Request`]: () => {\n          // Create a new instance on each invocation so that we can safely\n          // mutate requests before sending them off\n          return parseEndpointExample<Endpoints, any>(endpointExample);\n        },\n      };\n    })\n    .reduce((agg, next) => {\n      // Merge all of our factories into one that includes every endpoint\n      return Object.assign(agg, next);\n    }) as ApiRequestFactory<Endpoints>;\n}\n\nexport const apiRequestFactory = createApiRequestFactory(endpoints);\n","import { requestApi, RequestApiResult, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { TwitterApiErrorRaw } from './errors';\nimport { apiRequestFactory } from './api-data';\n\nexport interface CoreUserRaw {\n  created_at?: string;\n  name?: string;\n  screen_name?: string;\n}\n\nexport interface LegacyUserRaw {\n  created_at?: string;\n  description?: string;\n  entities?: {\n    url?: {\n      urls?: {\n        url?: string;\n        expanded_url?: string;\n        display_url?: string;\n        indices?: [number, number];\n      }[];\n    };\n    description?: {\n      // TODO: Get the proper type of this.\n      urls?: any[];\n    };\n  };\n  favourites_count?: number;\n  followers_count?: number;\n  friends_count?: number;\n  media_count?: number;\n  statuses_count?: number;\n  id_str?: string;\n  listed_count?: number;\n  name?: string;\n  location?: string;\n  geo_enabled?: boolean;\n  pinned_tweet_ids_str?: string[];\n  profile_background_color?: string;\n  profile_banner_url?: string;\n  profile_image_url_https?: string;\n  protected?: boolean;\n  screen_name?: string;\n  verified?: boolean;\n  has_custom_timelines?: boolean;\n  has_extended_profile?: boolean;\n  url?: string;\n  can_dm?: boolean;\n  id?: number;\n  // TODO: Get the proper type of this.\n  utc_offset?: any;\n  // TODO: Get the proper type of this.\n  time_zone?: any;\n  // TODO: Get the proper type of this.\n  lang?: any;\n  contributors_enabled?: boolean;\n  is_translator?: boolean;\n  is_translation_enabled?: boolean;\n  profile_background_image_url?: string;\n  profile_background_image_url_https?: string;\n  profile_background_tile?: boolean;\n  profile_image_url?: string;\n  profile_link_color?: string;\n  profile_sidebar_border_color?: string;\n  profile_sidebar_fill_color?: string;\n  profile_text_color?: string;\n  profile_use_background_image?: boolean;\n  default_profile?: boolean;\n  default_profile_image?: boolean;\n  can_secret_dm?: boolean;\n  can_media_tag?: boolean;\n  following?: boolean;\n  follow_request_sent?: boolean;\n  notifications?: boolean;\n  blocking?: boolean;\n  subscribed_by?: boolean;\n  blocked_by?: boolean;\n  want_retweets?: boolean;\n  dm_blocked_by?: boolean;\n  dm_blocking?: boolean;\n  business_profile_state?: string;\n  translator_type?: string;\n  // TODO: Get the proper type of this.\n  withheld_in_countries?: any[];\n  followed_by?: boolean;\n}\n\n/**\n * A parsed profile object.\n */\nexport interface Profile {\n  avatar?: string;\n  banner?: string;\n  biography?: string;\n  birthday?: string;\n  followersCount?: number;\n  followingCount?: number;\n  friendsCount?: number;\n  mediaCount?: number;\n  statusesCount?: number;\n  isPrivate?: boolean;\n  isVerified?: boolean;\n  isBlueVerified?: boolean;\n  joined?: Date;\n  likesCount?: number;\n  listedCount?: number;\n  location?: string;\n  name?: string;\n  pinnedTweetIds?: string[];\n  tweetsCount?: number;\n  url?: string;\n  userId?: string;\n  username?: string;\n  website?: string;\n  canDm?: boolean;\n}\n\nexport interface UserRaw {\n  data: {\n    user: {\n      result: {\n        __typename?: string;\n        message?: string;\n        reason?: string;\n        rest_id?: string;\n        is_blue_verified?: boolean;\n        legacy: LegacyUserRaw;\n        core?: CoreUserRaw;\n        avatar?: {\n          image_url?: string;\n        };\n        location?: {\n          location?: string;\n        };\n      };\n    };\n  };\n  errors?: TwitterApiErrorRaw[];\n}\n\nfunction getAvatarOriginalSizeUrl(avatarUrl: string | undefined) {\n  return avatarUrl ? avatarUrl.replace('_normal', '') : undefined;\n}\n\nexport function parseProfile(\n  legacy: LegacyUserRaw,\n  isBlueVerified?: boolean,\n): Profile {\n  const profile: Profile = {\n    avatar: getAvatarOriginalSizeUrl(legacy.profile_image_url_https),\n    banner: legacy.profile_banner_url,\n    biography: legacy.description,\n    followersCount: legacy.followers_count,\n    followingCount: legacy.friends_count,\n    friendsCount: legacy.friends_count,\n    mediaCount: legacy.media_count,\n    isPrivate: legacy.protected ?? false,\n    isVerified: legacy.verified,\n    likesCount: legacy.favourites_count,\n    listedCount: legacy.listed_count,\n    location: legacy.location,\n    name: legacy.name,\n    pinnedTweetIds: legacy.pinned_tweet_ids_str,\n    tweetsCount: legacy.statuses_count,\n    url: `https://x.com/${legacy.screen_name}`,\n    userId: legacy.id_str,\n    username: legacy.screen_name,\n    isBlueVerified: isBlueVerified ?? false,\n    canDm: legacy.can_dm,\n  };\n\n  if (legacy.created_at != null) {\n    profile.joined = new Date(Date.parse(legacy.created_at));\n  }\n\n  const urls = legacy.entities?.url?.urls;\n  if (urls?.length != null && urls?.length > 0) {\n    profile.website = urls[0].expanded_url;\n  }\n\n  return profile;\n}\n\nexport async function getProfile(\n  username: string,\n  auth: TwitterAuth,\n): Promise<RequestApiResult<Profile>> {\n  const request = apiRequestFactory.createUserByScreenNameRequest();\n  request.variables.screen_name = username;\n\n  // Use bearerToken2 for UserByScreenName endpoint\n  const res = await requestApi<UserRaw>(\n    request.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n  if (!res.success) {\n    return res;\n  }\n\n  const { value } = res;\n  const { errors } = value;\n  if (\n    (!value.data || !value.data.user || !value.data.user.result) &&\n    errors != null &&\n    errors.length > 0\n  ) {\n    return {\n      success: false,\n      err: new Error(errors.map((e) => e.message).join('\\n')),\n    };\n  }\n\n  if (!value.data || !value.data.user || !value.data.user.result) {\n    return {\n      success: false,\n      err: new Error('User not found.'),\n    };\n  }\n  const { result: user } = value.data.user;\n  const { legacy } = user;\n\n  if (user.__typename === 'UserUnavailable' && user?.reason === 'Suspended') {\n    return {\n      success: false,\n      err: new Error('User is suspended.'),\n    };\n  }\n\n  if (user.rest_id == null || user.rest_id.length === 0) {\n    return {\n      success: false,\n      err: new Error('rest_id not found.'),\n    };\n  }\n\n  legacy.id_str = user.rest_id;\n  legacy.screen_name ??= user.core?.screen_name;\n  legacy.profile_image_url_https ??= user.avatar?.image_url;\n  legacy.created_at ??= user.core?.created_at;\n  legacy.location ??= user.location?.location;\n  legacy.name ??= user.core?.name;\n\n  if (legacy.screen_name == null || legacy.screen_name.length === 0) {\n    return {\n      success: false,\n      err: new Error(`User ${username} does not exist or is private.`),\n    };\n  }\n\n  return {\n    success: true,\n    value: parseProfile(legacy, user.is_blue_verified),\n  };\n}\n\nconst idCache = new Map<string, string>();\n\nexport async function getUserIdByScreenName(\n  screenName: string,\n  auth: TwitterAuth,\n): Promise<RequestApiResult<string>> {\n  const cached = idCache.get(screenName);\n  if (cached != null) {\n    return { success: true, value: cached };\n  }\n\n  const profileRes = await getProfile(screenName, auth);\n  if (!profileRes.success) {\n    return profileRes;\n  }\n\n  const profile = profileRes.value;\n  if (profile.userId != null) {\n    idCache.set(screenName, profile.userId);\n\n    return {\n      success: true,\n      value: profile.userId,\n    };\n  }\n\n  return {\n    success: false,\n    err: new Error('User ID is undefined.'),\n  };\n}\n","import { jitter } from './api';\nimport { Profile } from './profile';\nimport { Tweet } from './tweets';\n\nexport interface FetchProfilesResponse {\n  profiles: Profile[];\n  next?: string;\n}\n\nexport type FetchProfiles = (\n  query: string,\n  maxProfiles: number,\n  cursor: string | undefined,\n) => Promise<FetchProfilesResponse>;\n\nexport interface FetchTweetsResponse {\n  tweets: Tweet[];\n  next?: string;\n}\n\nexport type FetchTweets = (\n  query: string,\n  maxTweets: number,\n  cursor: string | undefined,\n) => Promise<FetchTweetsResponse>;\n\nexport async function* getUserTimeline(\n  query: string,\n  maxProfiles: number,\n  fetchFunc: FetchProfiles,\n): AsyncGenerator<Profile, void> {\n  let nProfiles = 0;\n  let cursor: string | undefined = undefined;\n  let consecutiveEmptyBatches = 0;\n  while (nProfiles < maxProfiles) {\n    const batch: FetchProfilesResponse = await fetchFunc(\n      query,\n      maxProfiles,\n      cursor,\n    );\n\n    const { profiles, next } = batch;\n    cursor = next;\n\n    if (profiles.length === 0) {\n      consecutiveEmptyBatches++;\n      if (consecutiveEmptyBatches > 5) break;\n    } else consecutiveEmptyBatches = 0;\n\n    for (const profile of profiles) {\n      if (nProfiles < maxProfiles) yield profile;\n      else break;\n      nProfiles++;\n    }\n\n    if (!next) break;\n\n    await jitter(1000);\n  }\n}\n\nexport async function* getTweetTimeline(\n  query: string,\n  maxTweets: number,\n  fetchFunc: FetchTweets,\n): AsyncGenerator<Tweet, void> {\n  let nTweets = 0;\n  let cursor: string | undefined = undefined;\n  while (nTweets < maxTweets) {\n    const batch: FetchTweetsResponse = await fetchFunc(\n      query,\n      maxTweets,\n      cursor,\n    );\n\n    const { tweets, next } = batch;\n\n    if (tweets.length === 0) {\n      break;\n    }\n\n    for (const tweet of tweets) {\n      if (nTweets < maxTweets) {\n        cursor = next;\n        yield tweet;\n      } else {\n        break;\n      }\n\n      nTweets++;\n    }\n\n    await jitter(1000);\n  }\n}\n","export type NonNullableField<T, K extends keyof T> = {\n  [P in K]-?: T[P];\n} & T;\n\nexport function isFieldDefined<T, K extends keyof T>(key: K) {\n  return function (value: T): value is NonNullableField<T, K> {\n    return isDefined(value[key]);\n  };\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n  return value != null;\n}\n","import { LegacyTweetRaw, TimelineMediaExtendedRaw } from './timeline-v1';\nimport { Photo, Video } from './tweets';\nimport { isFieldDefined, NonNullableField } from './type-util';\n\nconst reHashtag = /\\B(\\#\\S+\\b)/g;\nconst reCashtag = /\\B(\\$\\S+\\b)/g;\nconst reTwitterUrl = /https:(\\/\\/t\\.co\\/([A-Za-z0-9]|[A-Za-z]){10})/g;\nconst reUsername = /\\B(\\@\\S{1,15}\\b)/g;\n\nexport function parseMediaGroups(media: TimelineMediaExtendedRaw[]): {\n  sensitiveContent?: boolean;\n  photos: Photo[];\n  videos: Video[];\n} {\n  const photos: Photo[] = [];\n  const videos: Video[] = [];\n  let sensitiveContent: boolean | undefined = undefined;\n\n  for (const m of media\n    .filter(isFieldDefined('id_str'))\n    .filter(isFieldDefined('media_url_https'))) {\n    if (m.type === 'photo') {\n      photos.push({\n        id: m.id_str,\n        url: m.media_url_https,\n        alt_text: m.ext_alt_text,\n      });\n    } else if (m.type === 'video') {\n      videos.push(parseVideo(m));\n    } else if (m.type === 'animated_gif') {\n      videos.push(parseGif(m));\n    }\n\n    const sensitive = m.ext_sensitive_media_warning;\n    if (sensitive != null) {\n      sensitiveContent =\n        sensitive.adult_content ||\n        sensitive.graphic_violence ||\n        sensitive.other;\n    }\n  }\n\n  return { sensitiveContent, photos, videos };\n}\n\nfunction parseGif(\n  m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n  const gif: Video = {\n    id: m.id_str,\n    preview: m.media_url_https,\n  };\n\n  const variants = m.video_info?.variants ?? [];\n\n  const url = variants.find((v) => v.content_type === 'video/mp4')?.url;\n\n  if (url) {\n    gif.preview = url;\n    gif.url = url;\n  }\n\n  return gif;\n}\n\nfunction parseVideo(\n  m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n  const video: Video = {\n    id: m.id_str,\n    preview: m.media_url_https,\n  };\n\n  let maxBitrate = 0;\n  const variants = m.video_info?.variants ?? [];\n  for (const variant of variants) {\n    const bitrate = variant.bitrate;\n    if (bitrate != null && bitrate > maxBitrate && variant.url != null) {\n      let variantUrl = variant.url;\n      const stringStart = 0;\n      const tagSuffixIdx = variantUrl.indexOf('?tag=10');\n      if (tagSuffixIdx !== -1) {\n        variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);\n      }\n\n      video.url = variantUrl;\n      maxBitrate = bitrate;\n    }\n  }\n\n  return video;\n}\n\nexport function reconstructTweetHtml(\n  tweet: LegacyTweetRaw,\n  photos: Photo[],\n  videos: Video[],\n): string {\n  const media: string[] = [];\n\n  // HTML parsing with regex :)\n  let html = tweet.full_text ?? '';\n\n  html = html.replace(reHashtag, linkHashtagHtml);\n  html = html.replace(reCashtag, linkCashtagHtml);\n  html = html.replace(reUsername, linkUsernameHtml);\n  html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, media));\n\n  for (const { url } of photos) {\n    if (media.indexOf(url) !== -1) {\n      continue;\n    }\n\n    html += `<br><img src=\"${url}\"/>`;\n  }\n\n  for (const { preview: url } of videos) {\n    if (media.indexOf(url) !== -1) {\n      continue;\n    }\n\n    html += `<br><img src=\"${url}\"/>`;\n  }\n\n  html = html.replace(/\\n/g, '<br>');\n\n  return html;\n}\n\nfunction linkHashtagHtml(hashtag: string) {\n  return `<a href=\"https://x.com/hashtag/${hashtag.replace(\n    '#',\n    '',\n  )}\">${hashtag}</a>`;\n}\n\nfunction linkCashtagHtml(cashtag: string) {\n  return `<a href=\"https://x.com/search?q=%24${cashtag.replace(\n    '$',\n    '',\n  )}\">${cashtag}</a>`;\n}\n\nfunction linkUsernameHtml(username: string) {\n  return `<a href=\"https://x.com/${username.replace('@', '')}\">${username}</a>`;\n}\n\nfunction unwrapTcoUrlHtml(tweet: LegacyTweetRaw, foundedMedia: string[]) {\n  return function (tco: string) {\n    for (const entity of tweet.entities?.urls ?? []) {\n      if (tco === entity.url && entity.expanded_url != null) {\n        return `<a href=\"${entity.expanded_url}\">${tco}</a>`;\n      }\n    }\n\n    for (const entity of tweet.extended_entities?.media ?? []) {\n      if (tco === entity.url && entity.media_url_https != null) {\n        foundedMedia.push(entity.media_url_https);\n        return `<br><a href=\"${tco}\"><img src=\"${entity.media_url_https}\"/></a>`;\n      }\n    }\n\n    return tco;\n  };\n}\n","import { CoreUserRaw, LegacyUserRaw } from './profile';\nimport { parseMediaGroups, reconstructTweetHtml } from './timeline-tweet-util';\nimport {\n  EditControlInitialRaw,\n  LegacyTweetRaw,\n  ParseTweetResult,\n  QueryTweetsResponse,\n  SearchResultRaw,\n  TimelineResultRaw,\n} from './timeline-v1';\nimport { Tweet } from './tweets';\nimport { isFieldDefined } from './type-util';\n\nexport interface TimelineUserResultRaw {\n  rest_id?: string;\n  legacy?: LegacyUserRaw;\n  is_blue_verified?: boolean;\n  core?: CoreUserRaw;\n}\n\nexport interface TimelineEntryItemContentRaw {\n  itemType?: string;\n  __typename?: string;\n  tweetDisplayType?: string;\n  tweetResult?: {\n    result?: TimelineResultRaw;\n  };\n  tweet_results?: {\n    result?: TimelineResultRaw;\n  };\n  userDisplayType?: string;\n  user_results?: {\n    result?: TimelineUserResultRaw;\n  };\n}\n\nexport interface TimelineEntryRaw {\n  entryId: string;\n  content?: {\n    entryType?: string;\n    __typename?: string;\n    cursorType?: string;\n    value?: string;\n    items?: {\n      entryId?: string;\n      item?: {\n        content?: TimelineEntryItemContentRaw;\n        itemContent?: SearchEntryItemContentRaw;\n      };\n    }[];\n    itemContent?: TimelineEntryItemContentRaw;\n  };\n}\n\nexport interface SearchEntryItemContentRaw {\n  tweetDisplayType?: string;\n  tweet_results?: {\n    result?: SearchResultRaw;\n  };\n  userDisplayType?: string;\n  user_results?: {\n    result?: TimelineUserResultRaw;\n  };\n}\n\nexport interface SearchEntryRaw {\n  entryId: string;\n  sortIndex: string;\n  content?: {\n    cursorType?: string;\n    entryType?: string;\n    __typename?: string;\n    value?: string;\n    items?: {\n      item?: {\n        content?: SearchEntryItemContentRaw;\n      };\n    }[];\n    itemContent?: SearchEntryItemContentRaw;\n  };\n}\n\nexport interface TimelineInstruction {\n  entries?: TimelineEntryRaw[];\n  entry?: TimelineEntryRaw;\n  type?: string;\n}\n\nexport interface TimelineV2 {\n  data?: {\n    user?: {\n      result?: {\n        __typename?: string;\n        timeline?: {\n          timeline?: {\n            instructions?: TimelineInstruction[];\n          };\n        };\n      };\n    };\n  };\n}\n\nexport interface ThreadedConversation {\n  data?: {\n    threaded_conversation_with_injections_v2?: {\n      instructions?: TimelineInstruction[];\n    };\n  };\n}\n\nfunction getLegacyTweetId(tweet: Readonly<LegacyTweetRaw>): string | undefined {\n  if (tweet.id_str) {\n    return tweet.id_str;\n  }\n\n  return tweet.conversation_id_str;\n}\n\nexport function parseLegacyTweet(\n  coreUser?: Readonly<CoreUserRaw>,\n  user?: Readonly<LegacyUserRaw>,\n  tweet?: Readonly<LegacyTweetRaw>,\n  editControl?: Readonly<EditControlInitialRaw>,\n): ParseTweetResult {\n  if (tweet == null) {\n    return {\n      success: false,\n      err: new Error('Tweet was not found in the timeline object.'),\n    };\n  }\n\n  if (user == null) {\n    return {\n      success: false,\n      err: new Error('User was not found in the timeline object.'),\n    };\n  }\n\n  const tweetId = getLegacyTweetId(tweet);\n  if (!tweetId) {\n    return {\n      success: false,\n      err: new Error('Tweet ID was not found in object.'),\n    };\n  }\n\n  const hashtags = tweet.entities?.hashtags ?? [];\n  const mentions = tweet.entities?.user_mentions ?? [];\n  const media = tweet.extended_entities?.media ?? [];\n  const pinnedTweets = new Set<string | undefined>(\n    user.pinned_tweet_ids_str ?? [],\n  );\n  const urls = tweet.entities?.urls ?? [];\n  const { photos, videos, sensitiveContent } = parseMediaGroups(media);\n\n  // The edit tweets array always contains the original tweet, even if it has not been edited\n  const tweetVersions = editControl?.edit_tweet_ids ?? [tweetId];\n\n  const name = user.name ?? coreUser?.name;\n  const username = user.screen_name ?? coreUser?.screen_name;\n  const tw: Tweet = {\n    __raw_UNSTABLE: tweet,\n    bookmarkCount: tweet.bookmark_count,\n    conversationId: tweet.conversation_id_str,\n    id: tweetId,\n    hashtags: hashtags\n      .filter(isFieldDefined('text'))\n      .map((hashtag) => hashtag.text),\n    likes: tweet.favorite_count,\n    mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({\n      id: mention.id_str,\n      username: mention.screen_name,\n      name: mention.name,\n    })),\n    name: name,\n    permanentUrl: `https://x.com/${username}/status/${tweetId}`,\n    photos,\n    replies: tweet.reply_count,\n    retweets: tweet.retweet_count,\n    text: tweet.full_text,\n    thread: [],\n    urls: urls\n      .filter(isFieldDefined('expanded_url'))\n      .map((url) => url.expanded_url),\n    userId: tweet.user_id_str,\n    username: username,\n    videos,\n    isQuoted: false,\n    isReply: false,\n    isEdited: tweetVersions.length > 1,\n    versions: tweetVersions,\n    isRetweet: false,\n    isPin: false,\n    sensitiveContent: false,\n  };\n\n  if (tweet.created_at) {\n    tw.timeParsed = new Date(Date.parse(tweet.created_at));\n    tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000);\n  }\n\n  if (tweet.place?.id) {\n    tw.place = tweet.place;\n  }\n\n  const quotedStatusIdStr = tweet.quoted_status_id_str;\n  const inReplyToStatusIdStr = tweet.in_reply_to_status_id_str;\n  const retweetedStatusIdStr = tweet.retweeted_status_id_str;\n  const retweetedStatusResult = tweet.retweeted_status_result?.result;\n\n  if (quotedStatusIdStr) {\n    tw.isQuoted = true;\n    tw.quotedStatusId = quotedStatusIdStr;\n  }\n\n  if (inReplyToStatusIdStr) {\n    tw.isReply = true;\n    tw.inReplyToStatusId = inReplyToStatusIdStr;\n  }\n\n  if (retweetedStatusIdStr || retweetedStatusResult) {\n    tw.isRetweet = true;\n    tw.retweetedStatusId = retweetedStatusIdStr;\n\n    if (retweetedStatusResult) {\n      const parsedResult = parseLegacyTweet(\n        retweetedStatusResult?.core?.user_results?.result?.core,\n        retweetedStatusResult?.core?.user_results?.result?.legacy,\n        retweetedStatusResult?.legacy,\n        retweetedStatusResult?.edit_control?.edit_control_initial,\n      );\n\n      if (parsedResult.success) {\n        tw.retweetedStatus = parsedResult.tweet;\n      }\n    }\n  }\n\n  const views = parseInt(tweet.ext_views?.count ?? '');\n  if (!isNaN(views)) {\n    tw.views = views;\n  }\n\n  if (pinnedTweets.has(tweetId)) {\n    // TODO: Update tests so this can be assigned at the tweet declaration\n    tw.isPin = true;\n  }\n\n  if (sensitiveContent) {\n    // TODO: Update tests so this can be assigned at the tweet declaration\n    tw.sensitiveContent = true;\n  }\n\n  tw.html = reconstructTweetHtml(tweet, tw.photos, tw.videos);\n\n  return { success: true, tweet: tw };\n}\n\nfunction parseResult(result?: TimelineResultRaw): ParseTweetResult {\n  const noteTweetResultText =\n    result?.note_tweet?.note_tweet_results?.result?.text;\n\n  if (result?.legacy && noteTweetResultText) {\n    result.legacy.full_text = noteTweetResultText;\n  }\n\n  const tweetResult = parseLegacyTweet(\n    result?.core?.user_results?.result?.core,\n    result?.core?.user_results?.result?.legacy,\n    result?.legacy,\n    result?.edit_control?.edit_control_initial,\n  );\n  if (!tweetResult.success) {\n    return tweetResult;\n  }\n\n  if (!tweetResult.tweet.views && result?.views?.count) {\n    const views = parseInt(result.views.count);\n    if (!isNaN(views)) {\n      tweetResult.tweet.views = views;\n    }\n  }\n\n  const quotedResult = result?.quoted_status_result?.result;\n  if (quotedResult) {\n    if (quotedResult.legacy && quotedResult.rest_id) {\n      quotedResult.legacy.id_str = quotedResult.rest_id;\n    }\n\n    const quotedTweetResult = parseResult(quotedResult);\n    if (quotedTweetResult.success) {\n      tweetResult.tweet.quotedStatus = quotedTweetResult.tweet;\n    }\n  }\n\n  return tweetResult;\n}\n\nconst expectedEntryTypes = ['tweet', 'profile-conversation'];\n\nfunction getTimelineInstructionEntries(\n  instruction: TimelineInstruction,\n): TimelineEntryRaw[] {\n  const entries = instruction.entries ?? [];\n  if (instruction.entry) {\n    entries.push(instruction.entry);\n  }\n  return entries;\n}\n\nexport function parseTimelineTweetsV2(\n  timeline: TimelineV2,\n): QueryTweetsResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const tweets: Tweet[] = [];\n  const instructions =\n    timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n  for (const instruction of instructions) {\n    const entries = getTimelineInstructionEntries(instruction);\n    for (const entry of entries) {\n      const entryContent = entry.content;\n      if (!entryContent) continue;\n\n      // Handle pagination\n      if (entryContent.cursorType === 'Bottom') {\n        bottomCursor = entryContent.value;\n        continue;\n      } else if (entryContent.cursorType === 'Top') {\n        topCursor = entryContent.value;\n        continue;\n      }\n\n      const idStr = entry.entryId;\n      if (\n        !expectedEntryTypes.some((entryType) => idStr.startsWith(entryType))\n      ) {\n        continue;\n      }\n\n      if (entryContent.itemContent) {\n        // Typically TimelineTimelineTweet entries\n        parseAndPush(tweets, entryContent.itemContent, idStr);\n      } else if (entryContent.items) {\n        // Typically TimelineTimelineModule entries\n        for (const item of entryContent.items) {\n          if (item.item?.itemContent) {\n            parseAndPush(tweets, item.item.itemContent, idStr);\n          }\n        }\n      }\n    }\n  }\n\n  return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseTimelineEntryItemContentRaw(\n  content: TimelineEntryItemContentRaw,\n  entryId: string,\n  isConversation = false,\n) {\n  let result = content.tweet_results?.result ?? content.tweetResult?.result;\n  if (\n    result?.__typename === 'Tweet' ||\n    (result?.__typename === 'TweetWithVisibilityResults' && result?.tweet)\n  ) {\n    if (result?.__typename === 'TweetWithVisibilityResults')\n      result = result.tweet;\n\n    if (result?.legacy) {\n      result.legacy.id_str =\n        result.rest_id ??\n        entryId.replace('conversation-', '').replace('tweet-', '');\n    }\n\n    const tweetResult = parseResult(result);\n    if (tweetResult.success) {\n      if (isConversation) {\n        if (content?.tweetDisplayType === 'SelfThread') {\n          tweetResult.tweet.isSelfThread = true;\n        }\n      }\n\n      return tweetResult.tweet;\n    }\n  }\n\n  return null;\n}\n\nexport function parseAndPush(\n  tweets: Tweet[],\n  content: TimelineEntryItemContentRaw,\n  entryId: string,\n  isConversation = false,\n) {\n  const tweet = parseTimelineEntryItemContentRaw(\n    content,\n    entryId,\n    isConversation,\n  );\n\n  if (tweet) {\n    tweets.push(tweet);\n  }\n}\n\nexport function parseThreadedConversation(\n  conversation: ThreadedConversation,\n): Tweet[] {\n  const tweets: Tweet[] = [];\n  const instructions =\n    conversation.data?.threaded_conversation_with_injections_v2?.instructions ??\n    [];\n\n  for (const instruction of instructions) {\n    const entries = getTimelineInstructionEntries(instruction);\n    for (const entry of entries) {\n      const entryContent = entry.content?.itemContent;\n      if (entryContent) {\n        parseAndPush(tweets, entryContent, entry.entryId, true);\n      }\n\n      for (const item of entry.content?.items ?? []) {\n        const itemContent = item.item?.itemContent;\n        if (itemContent) {\n          parseAndPush(tweets, itemContent, entry.entryId, true);\n        }\n      }\n    }\n  }\n\n  for (const tweet of tweets) {\n    if (tweet.inReplyToStatusId) {\n      for (const parentTweet of tweets) {\n        if (parentTweet.id === tweet.inReplyToStatusId) {\n          tweet.inReplyToStatus = parentTweet;\n          break;\n        }\n      }\n    }\n\n    if (tweet.isSelfThread && tweet.conversationId === tweet.id) {\n      for (const childTweet of tweets) {\n        if (childTweet.isSelfThread && childTweet.id !== tweet.id) {\n          tweet.thread.push(childTweet);\n        }\n      }\n\n      if (tweet.thread.length === 0) {\n        tweet.isSelfThread = false;\n      }\n    }\n  }\n\n  return tweets;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { SearchEntryRaw, parseLegacyTweet } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface SearchTimeline {\n  data?: {\n    search_by_raw_query?: {\n      search_timeline?: {\n        timeline?: {\n          instructions?: {\n            entries?: SearchEntryRaw[];\n            entry?: SearchEntryRaw;\n            type?: string;\n          }[];\n        };\n      };\n    };\n  };\n}\n\nexport function parseSearchTimelineTweets(\n  timeline: SearchTimeline,\n): QueryTweetsResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const tweets: Tweet[] = [];\n  const instructions =\n    timeline.data?.search_by_raw_query?.search_timeline?.timeline\n      ?.instructions ?? [];\n  for (const instruction of instructions) {\n    if (\n      instruction.type === 'TimelineAddEntries' ||\n      instruction.type === 'TimelineReplaceEntry'\n    ) {\n      if (instruction.entry?.content?.cursorType === 'Bottom') {\n        bottomCursor = instruction.entry.content.value;\n        continue;\n      } else if (instruction.entry?.content?.cursorType === 'Top') {\n        topCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      const entries = instruction.entries ?? [];\n      for (const entry of entries) {\n        const itemContent = entry.content?.itemContent;\n        if (itemContent?.tweetDisplayType === 'Tweet') {\n          const tweetResultRaw = itemContent.tweet_results?.result;\n          const tweetResult = parseLegacyTweet(\n            tweetResultRaw?.core?.user_results?.result?.core,\n            tweetResultRaw?.core?.user_results?.result?.legacy,\n            tweetResultRaw?.legacy,\n            tweetResultRaw?.edit_control?.edit_control_initial,\n          );\n\n          if (tweetResult.success) {\n            if (!tweetResult.tweet.views && tweetResultRaw?.views?.count) {\n              const views = parseInt(tweetResultRaw.views.count);\n              if (!isNaN(views)) {\n                tweetResult.tweet.views = views;\n              }\n            }\n\n            tweets.push(tweetResult.tweet);\n          }\n        } else if (entry.content?.cursorType === 'Bottom') {\n          bottomCursor = entry.content.value;\n        } else if (entry.content?.cursorType === 'Top') {\n          topCursor = entry.content.value;\n        }\n      }\n    }\n  }\n\n  return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseSearchTimelineUsers(\n  timeline: SearchTimeline,\n): QueryProfilesResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const profiles: Profile[] = [];\n  const instructions =\n    timeline.data?.search_by_raw_query?.search_timeline?.timeline\n      ?.instructions ?? [];\n\n  for (const instruction of instructions) {\n    if (\n      instruction.type === 'TimelineAddEntries' ||\n      instruction.type === 'TimelineReplaceEntry'\n    ) {\n      if (instruction.entry?.content?.cursorType === 'Bottom') {\n        bottomCursor = instruction.entry.content.value;\n        continue;\n      } else if (instruction.entry?.content?.cursorType === 'Top') {\n        topCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      const entries = instruction.entries ?? [];\n      for (const entry of entries) {\n        const itemContent = entry.content?.itemContent;\n        if (itemContent?.userDisplayType === 'User') {\n          const userResultRaw = itemContent.user_results?.result;\n\n          if (userResultRaw?.legacy) {\n            const profile = parseProfile(\n              userResultRaw.legacy,\n              userResultRaw.is_blue_verified,\n            );\n\n            if (!profile.userId) {\n              profile.userId = userResultRaw.rest_id;\n            }\n\n            profiles.push(profile);\n          }\n        } else if (entry.content?.cursorType === 'Bottom') {\n          bottomCursor = entry.content.value;\n        } else if (entry.content?.cursorType === 'Top') {\n          topCursor = entry.content.value;\n        }\n      }\n    }\n  }\n\n  return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { bearerToken2, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTweetTimeline, getUserTimeline } from './timeline-async';\nimport { Tweet } from './tweets';\nimport {\n  SearchTimeline,\n  parseSearchTimelineTweets,\n  parseSearchTimelineUsers,\n} from './timeline-search';\nimport { AuthenticationError } from './errors';\nimport { apiRequestFactory } from './api-data';\n\n/**\n * The categories that can be used in Twitter searches.\n */\nexport enum SearchMode {\n  Top,\n  Latest,\n  Photos,\n  Videos,\n  Users,\n}\n\nexport function searchTweets(\n  query: string,\n  maxTweets: number,\n  searchMode: SearchMode,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(query, maxTweets, (q, mt, c) => {\n    return fetchSearchTweets(q, mt, searchMode, auth, c);\n  });\n}\n\nexport function searchProfiles(\n  query: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n  return getUserTimeline(query, maxProfiles, (q, mt, c) => {\n    return fetchSearchProfiles(q, mt, auth, c);\n  });\n}\n\nexport async function fetchSearchTweets(\n  query: string,\n  maxTweets: number,\n  searchMode: SearchMode,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryTweetsResponse> {\n  const timeline = await getSearchTimeline(\n    query,\n    maxTweets,\n    searchMode,\n    auth,\n    cursor,\n  );\n\n  return parseSearchTimelineTweets(timeline);\n}\n\nexport async function fetchSearchProfiles(\n  query: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryProfilesResponse> {\n  const timeline = await getSearchTimeline(\n    query,\n    maxProfiles,\n    SearchMode.Users,\n    auth,\n    cursor,\n  );\n\n  return parseSearchTimelineUsers(timeline);\n}\n\nasync function getSearchTimeline(\n  query: string,\n  maxItems: number,\n  searchMode: SearchMode,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<SearchTimeline> {\n  if (!(await auth.isLoggedIn())) {\n    throw new AuthenticationError('Scraper is not logged-in for search.');\n  }\n\n  if (maxItems > 50) {\n    maxItems = 50;\n  }\n\n  const searchTimelineRequest = apiRequestFactory.createSearchTimelineRequest();\n  searchTimelineRequest.variables.rawQuery = query;\n  searchTimelineRequest.variables.count = maxItems;\n  searchTimelineRequest.variables.querySource = 'typed_query';\n  searchTimelineRequest.variables.product = 'Top';\n\n  if (cursor != null && cursor != '') {\n    searchTimelineRequest.variables['cursor'] = cursor;\n  }\n\n  switch (searchMode) {\n    case SearchMode.Latest:\n      searchTimelineRequest.variables.product = 'Latest';\n      break;\n    case SearchMode.Photos:\n      searchTimelineRequest.variables.product = 'Photos';\n      break;\n    case SearchMode.Videos:\n      searchTimelineRequest.variables.product = 'Videos';\n      break;\n    case SearchMode.Users:\n      searchTimelineRequest.variables.product = 'People';\n      break;\n    default:\n      break;\n  }\n\n  const res = await requestApi<SearchTimeline>(\n    searchTimelineRequest.url,\n    auth,\n    'POST',\n    undefined,\n    undefined,\n    bearerToken2,\n    searchTimelineRequest.toRequestBody(),\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return res.value;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { TimelineUserResultRaw } from './timeline-v2';\n\nexport interface RelationshipEntryItemContentRaw {\n  itemType?: string;\n  userDisplayType?: string;\n  user_results?: {\n    result?: TimelineUserResultRaw;\n  };\n}\n\nexport interface RelationshipEntryRaw {\n  entryId: string;\n  sortIndex: string;\n  content?: {\n    cursorType?: string;\n    entryType?: string;\n    __typename?: string;\n    value?: string;\n    itemContent?: RelationshipEntryItemContentRaw;\n  };\n}\n\nexport interface RelationshipTimeline {\n  data?: {\n    user?: {\n      result?: {\n        timeline?: {\n          timeline?: {\n            instructions?: {\n              entries?: RelationshipEntryRaw[];\n              entry?: RelationshipEntryRaw;\n              type?: string;\n            }[];\n          };\n        };\n      };\n    };\n  };\n}\n\nexport function parseRelationshipTimeline(\n  timeline: RelationshipTimeline,\n): QueryProfilesResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const profiles: Profile[] = [];\n  const instructions =\n    timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n\n  for (const instruction of instructions) {\n    if (\n      instruction.type === 'TimelineAddEntries' ||\n      instruction.type === 'TimelineReplaceEntry'\n    ) {\n      if (instruction.entry?.content?.cursorType === 'Bottom') {\n        bottomCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      if (instruction.entry?.content?.cursorType === 'Top') {\n        topCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      const entries = instruction.entries ?? [];\n      for (const entry of entries) {\n        const itemContent = entry.content?.itemContent;\n        if (itemContent?.userDisplayType === 'User') {\n          const userResultRaw = itemContent.user_results?.result;\n\n          if (userResultRaw?.legacy) {\n            const profile = parseProfile(\n              userResultRaw.legacy,\n              userResultRaw.is_blue_verified,\n            );\n\n            if (!profile.userId) {\n              profile.userId = userResultRaw.rest_id;\n            }\n\n            // FIX: Twitter moved screen_name from legacy to core\n            if (!profile.username && userResultRaw.core?.screen_name) {\n              profile.username = userResultRaw.core.screen_name;\n              profile.url = `https://x.com/${profile.username}`;\n            }\n\n            // FIX: Twitter moved created_at from legacy to core\n            if (!profile.joined && userResultRaw.core?.created_at) {\n              profile.joined = new Date(\n                Date.parse(userResultRaw.core.created_at),\n              );\n            }\n\n            profiles.push(profile);\n          }\n        } else if (entry.content?.cursorType === 'Bottom') {\n          bottomCursor = entry.content.value;\n        } else if (entry.content?.cursorType === 'Top') {\n          topCursor = entry.content.value;\n        }\n      }\n    }\n  }\n\n  return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { bearerToken2, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { getUserTimeline } from './timeline-async';\nimport {\n  RelationshipTimeline,\n  parseRelationshipTimeline,\n} from './timeline-relationship';\nimport { AuthenticationError } from './errors';\nimport { apiRequestFactory } from './api-data';\n\nexport function getFollowing(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n  return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n    return fetchProfileFollowing(q, mt, auth, c);\n  });\n}\n\nexport function getFollowers(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n  return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n    return fetchProfileFollowers(q, mt, auth, c);\n  });\n}\n\nexport async function fetchProfileFollowing(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryProfilesResponse> {\n  if (!(await auth.isLoggedIn())) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for profile following.',\n    );\n  }\n\n  const timeline = await getFollowingTimeline(\n    userId,\n    maxProfiles,\n    auth,\n    cursor,\n  );\n\n  return parseRelationshipTimeline(timeline);\n}\n\nexport async function fetchProfileFollowers(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryProfilesResponse> {\n  if (!(await auth.isLoggedIn())) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for profile followers.',\n    );\n  }\n\n  const timeline = await getFollowersTimeline(\n    userId,\n    maxProfiles,\n    auth,\n    cursor,\n  );\n\n  return parseRelationshipTimeline(timeline);\n}\n\nasync function getFollowingTimeline(\n  userId: string,\n  maxItems: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<RelationshipTimeline> {\n  if (!auth.isLoggedIn()) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for profile following.',\n    );\n  }\n\n  if (maxItems > 50) {\n    maxItems = 50;\n  }\n\n  const followingRequest = apiRequestFactory.createFollowingRequest();\n  followingRequest.variables.userId = userId;\n  followingRequest.variables.count = maxItems;\n  followingRequest.variables.includePromotedContent = false;\n\n  if (cursor != null && cursor != '') {\n    followingRequest.variables.cursor = cursor;\n  }\n\n  const res = await requestApi<RelationshipTimeline>(\n    followingRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return res.value;\n}\n\nasync function getFollowersTimeline(\n  userId: string,\n  maxItems: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<RelationshipTimeline> {\n  if (!auth.isLoggedIn()) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for profile followers.',\n    );\n  }\n\n  if (maxItems > 50) {\n    maxItems = 50;\n  }\n\n  const followersRequest = apiRequestFactory.createFollowersRequest();\n  followersRequest.variables.userId = userId;\n  followersRequest.variables.count = maxItems;\n  followersRequest.variables.includePromotedContent = false;\n\n  if (cursor != null && cursor != '') {\n    followersRequest.variables.cursor = cursor;\n  }\n\n  const res = await requestApi<RelationshipTimeline>(\n    followersRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return res.value;\n}\n","import { addApiParams, requestApi, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { TimelineV1 } from './timeline-v1';\n\nexport async function getTrends(auth: TwitterAuth): Promise<string[]> {\n  const params = new URLSearchParams();\n  addApiParams(params, false);\n\n  params.set('count', '20');\n  params.set('candidate_source', 'trends');\n  params.set('include_page_configuration', 'false');\n  params.set('entity_tokens', 'false');\n\n  // Use bearerToken2 for trends endpoint\n  const res = await requestApi<TimelineV1>(\n    `https://api.x.com/2/guide.json?${params.toString()}`,\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n  if (!res.success) {\n    throw res.err;\n  }\n\n  const instructions = res.value.timeline?.instructions ?? [];\n  if (instructions.length < 2) {\n    throw new Error('No trend entries found.');\n  }\n\n  // Some of this is silly, but for now we're assuming we know nothing about the\n  // data, and that anything can be missing. Go has non-nilable strings and empty\n  // slices are nil, so it largely doesn't need to worry about this.\n  const entries = instructions[1].addEntries?.entries ?? [];\n  if (entries.length < 2) {\n    throw new Error('No trend entries found.');\n  }\n\n  const items = entries[1].content?.timelineModule?.items ?? [];\n  const trends: string[] = [];\n  for (const item of items) {\n    const trend =\n      item.item?.clientEventInfo?.details?.guideDetails?.transparentGuideDetails\n        ?.trendMetadata?.trendName;\n    if (trend != null) {\n      trends.push(trend);\n    }\n  }\n\n  return trends;\n}\n","import { QueryTweetsResponse } from './timeline-v1';\nimport { parseAndPush, TimelineEntryRaw } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface ListTimeline {\n  data?: {\n    list?: {\n      tweets_timeline?: {\n        timeline?: {\n          instructions?: {\n            entries?: TimelineEntryRaw[];\n            entry?: TimelineEntryRaw;\n            type?: string;\n          }[];\n        };\n      };\n    };\n  };\n}\n\nexport function parseListTimelineTweets(\n  timeline: ListTimeline,\n): QueryTweetsResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const tweets: Tweet[] = [];\n  const instructions =\n    timeline.data?.list?.tweets_timeline?.timeline?.instructions ?? [];\n  for (const instruction of instructions) {\n    const entries = instruction.entries ?? [];\n\n    for (const entry of entries) {\n      const entryContent = entry.content;\n      if (!entryContent) continue;\n\n      if (entryContent.cursorType === 'Bottom') {\n        bottomCursor = entryContent.value;\n        continue;\n      } else if (entryContent.cursorType === 'Top') {\n        topCursor = entryContent.value;\n        continue;\n      }\n\n      const idStr = entry.entryId;\n      if (\n        !idStr.startsWith('tweet') &&\n        !idStr.startsWith('list-conversation')\n      ) {\n        continue;\n      }\n\n      if (entryContent.itemContent) {\n        parseAndPush(tweets, entryContent.itemContent, idStr);\n      } else if (entryContent.items) {\n        for (const contentItem of entryContent.items) {\n          if (\n            contentItem.item &&\n            contentItem.item.itemContent &&\n            contentItem.entryId\n          ) {\n            parseAndPush(\n              tweets,\n              contentItem.item.itemContent,\n              contentItem.entryId.split('tweet-')[1],\n            );\n          }\n        }\n      }\n    }\n  }\n\n  return { tweets, next: bottomCursor, previous: topCursor };\n}\n","import { addApiFeatures, requestApi, bearerToken2 } from './api';\nimport { TwitterAuth } from './auth';\nimport { getUserIdByScreenName } from './profile';\nimport { LegacyTweetRaw, QueryTweetsResponse } from './timeline-v1';\nimport {\n  parseTimelineTweetsV2,\n  TimelineV2,\n  TimelineEntryItemContentRaw,\n  parseTimelineEntryItemContentRaw,\n  ThreadedConversation,\n  parseThreadedConversation,\n} from './timeline-v2';\nimport { getTweetTimeline } from './timeline-async';\nimport { apiRequestFactory } from './api-data';\nimport { ListTimeline, parseListTimelineTweets } from './timeline-list';\nimport { AuthenticationError } from './errors';\n\nexport interface Mention {\n  id: string;\n  username?: string;\n  name?: string;\n}\n\nexport interface Photo {\n  id: string;\n  url: string;\n  alt_text: string | undefined;\n}\n\nexport interface Video {\n  id: string;\n  preview: string;\n  url?: string;\n}\n\nexport interface PlaceRaw {\n  id?: string;\n  place_type?: string;\n  name?: string;\n  full_name?: string;\n  country_code?: string;\n  country?: string;\n  bounding_box?: {\n    type?: string;\n    coordinates?: number[][][];\n  };\n}\n\n/**\n * A parsed Tweet object.\n */\nexport interface Tweet {\n  __raw_UNSTABLE?: LegacyTweetRaw;\n  bookmarkCount?: number;\n  conversationId?: string;\n  hashtags: string[];\n  html?: string;\n  id?: string;\n  inReplyToStatus?: Tweet;\n  inReplyToStatusId?: string;\n  isEdited?: boolean;\n  versions?: string[];\n  isQuoted?: boolean;\n  isPin?: boolean;\n  isReply?: boolean;\n  isRetweet?: boolean;\n  isSelfThread?: boolean;\n  likes?: number;\n  name?: string;\n  mentions: Mention[];\n  permanentUrl?: string;\n  photos: Photo[];\n  place?: PlaceRaw;\n  quotedStatus?: Tweet;\n  quotedStatusId?: string;\n  replies?: number;\n  retweets?: number;\n  retweetedStatus?: Tweet;\n  retweetedStatusId?: string;\n  text?: string;\n  thread: Tweet[];\n  timeParsed?: Date;\n  timestamp?: number;\n  urls: string[];\n  userId?: string;\n  username?: string;\n  videos: Video[];\n  views?: number;\n  sensitiveContent?: boolean;\n}\n\nexport type TweetQuery =\n  | Partial<Tweet>\n  | ((tweet: Tweet) => boolean | Promise<boolean>);\n\nexport const features = addApiFeatures({\n  interactive_text_enabled: true,\n  longform_notetweets_inline_media_enabled: false,\n  responsive_web_text_conversations_enabled: false,\n  tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n    false,\n  vibe_api_enabled: false,\n});\n\nexport async function fetchTweets(\n  userId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (maxTweets > 200) {\n    maxTweets = 200;\n  }\n\n  const userTweetsRequest = apiRequestFactory.createUserTweetsRequest();\n  userTweetsRequest.variables.userId = userId;\n  userTweetsRequest.variables.count = maxTweets;\n  userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n  if (cursor != null && cursor != '') {\n    userTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  // Use bearerToken2 for UserTweets endpoint\n  const res = await requestApi<TimelineV2>(\n    userTweetsRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchTweetsAndReplies(\n  userId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (maxTweets > 40) {\n    maxTweets = 40;\n  }\n\n  const userTweetsRequest =\n    apiRequestFactory.createUserTweetsAndRepliesRequest();\n  userTweetsRequest.variables.userId = userId;\n  userTweetsRequest.variables.count = maxTweets;\n  userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n  if (cursor != null && cursor != '') {\n    userTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  // Use bearerToken2 for UserTweetsAndReplies endpoint\n  const res = await requestApi<TimelineV2>(\n    userTweetsRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchListTweets(\n  listId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (maxTweets > 200) {\n    maxTweets = 200;\n  }\n\n  const listTweetsRequest = apiRequestFactory.createListTweetsRequest();\n  listTweetsRequest.variables.listId = listId;\n  listTweetsRequest.variables.count = maxTweets;\n\n  if (cursor != null && cursor != '') {\n    listTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  // Use bearerToken2 for ListTweet endpoint\n  const res = await requestApi<ListTimeline>(\n    listTweetsRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseListTimelineTweets(res.value);\n}\n\nexport function getTweets(\n  user: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n    const userIdRes = await getUserIdByScreenName(q, auth);\n\n    if (!userIdRes.success) {\n      throw userIdRes.err;\n    }\n\n    const { value: userId } = userIdRes;\n\n    return fetchTweets(userId, mt, c, auth);\n  });\n}\n\nexport function getTweetsByUserId(\n  userId: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n    return fetchTweets(q, mt, c, auth);\n  });\n}\n\nexport function getTweetsAndReplies(\n  user: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n    const userIdRes = await getUserIdByScreenName(q, auth);\n\n    if (!userIdRes.success) {\n      throw userIdRes.err;\n    }\n\n    const { value: userId } = userIdRes;\n\n    return fetchTweetsAndReplies(userId, mt, c, auth);\n  });\n}\n\nexport function getTweetsAndRepliesByUserId(\n  userId: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n    return fetchTweetsAndReplies(q, mt, c, auth);\n  });\n}\n\nexport async function fetchLikedTweets(\n  userId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (!(await auth.isLoggedIn())) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for fetching liked tweets.',\n    );\n  }\n\n  if (maxTweets > 200) {\n    maxTweets = 200;\n  }\n\n  const userTweetsRequest = apiRequestFactory.createUserLikedTweetsRequest();\n  userTweetsRequest.variables.userId = userId;\n  userTweetsRequest.variables.count = maxTweets;\n  userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n  if (cursor != null && cursor != '') {\n    userTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  // Use bearerToken2 for UserLikedTweets endpoint\n  const res = await requestApi<TimelineV2>(\n    userTweetsRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseTimelineTweetsV2(res.value);\n}\n\nexport function getLikedTweets(\n  user: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n    const userIdRes = await getUserIdByScreenName(q, auth);\n\n    if (!userIdRes.success) {\n      throw userIdRes.err;\n    }\n\n    const { value: userId } = userIdRes;\n\n    return fetchLikedTweets(userId, mt, c, auth);\n  });\n}\n\nexport async function getTweetWhere(\n  tweets: AsyncIterable<Tweet>,\n  query: TweetQuery,\n): Promise<Tweet | null> {\n  const isCallback = typeof query === 'function';\n\n  for await (const tweet of tweets) {\n    const matches = isCallback\n      ? await query(tweet)\n      : checkTweetMatches(tweet, query);\n\n    if (matches) {\n      return tweet;\n    }\n  }\n\n  return null;\n}\n\nexport async function getTweetsWhere(\n  tweets: AsyncIterable<Tweet>,\n  query: TweetQuery,\n): Promise<Tweet[]> {\n  const isCallback = typeof query === 'function';\n  const filtered = [];\n\n  for await (const tweet of tweets) {\n    const matches = isCallback ? query(tweet) : checkTweetMatches(tweet, query);\n\n    if (!matches) continue;\n    filtered.push(tweet);\n  }\n\n  return filtered;\n}\n\nfunction checkTweetMatches(tweet: Tweet, options: Partial<Tweet>): boolean {\n  return Object.keys(options).every((k) => {\n    const key = k as keyof Tweet;\n    return tweet[key] === options[key];\n  });\n}\n\nexport async function getLatestTweet(\n  user: string,\n  includeRetweets: boolean,\n  max: number,\n  auth: TwitterAuth,\n): Promise<Tweet | null | void> {\n  const timeline = getTweets(user, max, auth);\n\n  // No point looping if max is 1, just use first entry.\n  return max === 1\n    ? (await timeline.next()).value\n    : await getTweetWhere(timeline, { isRetweet: includeRetweets });\n}\n\nexport interface TweetResultByRestId {\n  data?: TimelineEntryItemContentRaw;\n}\n\nexport async function getTweet(\n  id: string,\n  auth: TwitterAuth,\n): Promise<Tweet | null> {\n  const tweetDetailRequest = apiRequestFactory.createTweetDetailRequest();\n  tweetDetailRequest.variables.focalTweetId = id;\n\n  // Use bearerToken2 for this specific endpoint (TweetDetail)\n  // This is required for animated GIFs to appear in tweets with mixed media\n  const res = await requestApi<ThreadedConversation>(\n    tweetDetailRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  if (!res.value) {\n    return null;\n  }\n\n  const tweets = parseThreadedConversation(res.value);\n\n  return tweets.find((tweet) => tweet.id === id) ?? null;\n}\n\nexport async function getTweetAnonymous(\n  id: string,\n  auth: TwitterAuth,\n): Promise<Tweet | null> {\n  const tweetResultByRestIdRequest =\n    apiRequestFactory.createTweetResultByRestIdRequest();\n  tweetResultByRestIdRequest.variables.tweetId = id;\n\n  // Use bearerToken2 for this specific endpoint (TweetResultByRestId)\n  // This matches the behavior observed in the Twitter web client and Go library\n  // We pass it as an override to avoid mutating shared state (concurrency-safe)\n  const res = await requestApi<TweetResultByRestId>(\n    tweetResultByRestIdRequest.toRequestUrl(),\n    auth,\n    'GET',\n    undefined,\n    undefined,\n    bearerToken2,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  if (!res.value.data) {\n    return null;\n  }\n\n  return parseTimelineEntryItemContentRaw(res.value.data, id);\n}\n","import {\n  DmConversationTimeline,\n  DmMessageEntry,\n  DmCursorOptions,\n} from './direct-messages';\nimport { jitter } from './api';\n\nexport interface FetchDmConversationMessagesResponse {\n  conversation: DmConversationTimeline;\n  next?: DmCursorOptions;\n}\n\nexport type FetchDmConversationFn = (\n  conversationId: string,\n  maxMessages: number,\n  cursor: DmCursorOptions | undefined,\n) => Promise<FetchDmConversationMessagesResponse>;\n\nexport async function* getDmConversationMessagesGenerator(\n  conversationId: string,\n  maxMessages: number,\n  initialCursor: DmCursorOptions | undefined,\n  fetchFunc: FetchDmConversationFn,\n): AsyncGenerator<DmMessageEntry, void> {\n  let nMessages = 0;\n  let cursor = initialCursor;\n\n  while (nMessages < maxMessages) {\n    const batch: FetchDmConversationMessagesResponse = await fetchFunc(\n      conversationId,\n      maxMessages,\n      cursor,\n    );\n\n    const { conversation, next } = batch;\n\n    if (!conversation?.entries || conversation?.entries?.length === 0) {\n      break;\n    }\n\n    for (const entry of conversation.entries) {\n      if (nMessages < maxMessages) {\n        yield entry;\n        nMessages++;\n      } else {\n        break;\n      }\n    }\n\n    cursor = next;\n\n    if (conversation.status === 'AT_END' || !next) {\n      break;\n    }\n\n    await jitter(1000);\n  }\n}\n","import { AuthenticationError } from './errors';\nimport { TwitterAuth } from './auth';\nimport { LegacyUserRaw } from './profile';\nimport { requestApi, addApiParams } from './api';\n\nimport { getDmConversationMessagesGenerator } from './direct-messages-async';\n\nexport interface DmInboxResponse {\n  inbox_initial_state: DmInbox;\n}\n\nexport interface DmInbox {\n  last_seen_event_id: string;\n  trusted_last_seen_event_id: string;\n  untrusted_last_seen_event_id: string;\n  cursor: string;\n  inbox_timelines: DmInboxTimelines;\n  entries: DmMessageEntry[];\n  users: { [key: string]: LegacyUserRaw };\n  conversations: { [key: string]: DmConversation };\n}\n\nexport interface DmConversationResponse {\n  conversation_timeline: DmConversationTimeline;\n}\n\nexport interface DmConversationTimeline {\n  status: DmStatus;\n  min_entry_id: string;\n  max_entry_id: string;\n  entries: DmMessageEntry[];\n  users: { [key: string]: LegacyUserRaw };\n  conversations: { [key: string]: DmConversation };\n}\n\nexport interface DmConversation {\n  conversation_id: string;\n  type: string;\n  sort_event_id: string;\n  sort_timestamp: string;\n  participants: DmParticipant[];\n  nsfw: boolean;\n  notifications_disabled: boolean;\n  mention_notifications_disabled: boolean;\n  last_read_event_id: string;\n  read_only: boolean;\n  trusted: boolean;\n  muted: boolean;\n  status: DmStatus;\n  min_entry_id: string;\n  max_entry_id: string;\n}\n\nexport type DmStatus = 'AT_END' | 'HAS_MORE';\n\nexport interface DmParticipant {\n  user_id: string;\n  last_read_event_id?: string;\n}\n\nexport interface DmMessageEntry {\n  welcome_message_create?: DmWelcomeMessage;\n  message?: DmMessage;\n}\n\nexport interface DmMessage {\n  id: string;\n  time: string;\n  affects_sort: boolean;\n  request_id: string;\n  conversation_id: string;\n  message_data: DmMessageData;\n  message_reactions: DmReaction[];\n}\n\nexport interface DmMessageData {\n  id: string;\n  time: string;\n  recipient_id: string;\n  sender_id: string;\n  text: string;\n  edit_count?: number;\n  entities?: DmMessageEntities;\n}\n\nexport interface DmReaction {\n  id: string;\n  time: string;\n  conversation_id: string;\n  message_id: string;\n  reaction_key: string;\n  emoji_reaction: string;\n  sender_id: string;\n}\n\nexport interface DmMessageEntities {\n  // TODO: Not sure what these types are.\n  hashtags: any[];\n  symbols: any[];\n  user_mentions: any[];\n  urls: DmMessageUrl[];\n}\n\nexport interface DmMessageUrl {\n  url: string;\n  expanded_url: string;\n  display_url: string;\n  indices: number[];\n}\n\nexport interface DmWelcomeMessage extends DmMessage {\n  welcome_message_id: string;\n}\n\nexport interface DmInboxTimelines {\n  trusted: DmTimelineState;\n  untrusted: DmTimelineState;\n  untrusted_low_quality: DmTimelineState;\n}\n\nexport interface DmTimelineState {\n  status: DmStatus;\n  min_entry_id: string;\n}\n\nexport interface DmCursorOptions {\n  maxId?: string;\n  minId?: string;\n}\n\nexport async function fetchDmInbox(auth: TwitterAuth) {\n  if (!(await auth.isLoggedIn())) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for fetching direct messages.',\n    );\n  }\n\n  // TODO: Not sure how the \"cursor\" works for this. I don't have enough DMs to test.\n  const params = new URLSearchParams();\n  addApiParams(params, false);\n\n  params.set('nsfw_filtering_enabled', 'false');\n  params.set('filter_low_quality', 'true');\n  params.set('include_quality', 'all');\n  params.set('include_ext_profile_image_shape', '1');\n  params.set('dm_secret_conversations_enabled', 'false');\n  params.set('krs_registration_enabled', 'false');\n  params.set('include_ext_limited_action_results', 'true');\n  params.set('dm_users', 'true');\n  params.set('include_groups', 'true');\n  params.set('include_inbox_timelines', 'true');\n  params.set('supports_reactions', 'true');\n  params.set('supports_edit', 'true');\n  params.set('include_ext_edit_control', 'true');\n  params.set('include_ext_business_affiliations_label', 'true');\n  params.set('include_ext_parody_commentary_fan_label', 'true');\n  params.set(\n    'ext',\n    'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article',\n  );\n\n  const res = await requestApi<DmInboxResponse>(\n    `https://x.com/i/api/1.1/dm/inbox_initial_state.json?${params.toString()}`,\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseDmInbox(res.value);\n}\n\nexport async function parseDmInbox(inbox: DmInboxResponse) {\n  return inbox.inbox_initial_state;\n}\n\n// This gets the current authenticated user's direct messages.\n// This requires the user to be authenticated.\nexport async function getDmInbox(auth: TwitterAuth) {\n  return await fetchDmInbox(auth);\n}\n\n// This gets the current authenticated user's direct conversations.\n// This requires the user to be authenticated.\nexport async function fetchDmConversation(\n  conversationId: string,\n  cursor: DmCursorOptions | undefined,\n  auth: TwitterAuth,\n) {\n  if (!(await auth.isLoggedIn())) {\n    throw new AuthenticationError(\n      'Scraper is not logged-in for fetching direct messages.',\n    );\n  }\n\n  const params = new URLSearchParams();\n  addApiParams(params, false);\n\n  params.set('context', 'FETCH_DM_CONVERSATION_HISTORY');\n  params.set('include_ext_profile_image_shape', '1');\n  params.set('dm_secret_conversations_enabled', 'false');\n  params.set('krs_registration_enabled', 'false');\n  params.set('include_ext_limited_action_results', 'true');\n  params.set('dm_users', 'true');\n  params.set('include_groups', 'true');\n  params.set('include_inbox_timelines', 'true');\n  params.set('supports_reactions', 'true');\n  params.set('supports_edit', 'true');\n  params.set('include_conversation_info', 'true');\n  params.set(\n    'ext',\n    'mediaColor,altText,mediaStats,highlightedLabel,parodyCommentaryFanLabel,voiceInfo,birdwatchPivot,superFollowMetadata,unmentionInfo,editControl,article',\n  );\n\n  // By default, passing no cursor means you get the latest results.\n  // `max_id` does backwards pagination using min_entry_id as the maxId to get older messages.\n  // `min_id` does forward pagination using max_entry_id as the minId to get newer messages.\n  // To know when there are no more pages, the response's \"status\" will return \"AT_END\".\n  if (cursor) {\n    if (cursor.maxId) {\n      params.set('max_id', cursor.maxId);\n    }\n    if (cursor.minId) {\n      params.set('min_id', cursor.minId);\n    }\n  }\n\n  const url = `https://x.com/i/api/1.1/dm/conversation/${conversationId}.json?${params.toString()}`;\n\n  const res = await requestApi<DmConversationResponse>(url, auth);\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseDmConversation(res.value);\n}\n\nexport async function parseDmConversation(\n  conversation: DmConversationResponse,\n) {\n  return conversation.conversation_timeline;\n}\n\nexport async function getDmConversation(\n  conversationId: string,\n  cursor: DmCursorOptions | undefined,\n  auth: TwitterAuth,\n) {\n  return await fetchDmConversation(conversationId, cursor, auth);\n}\n\nexport function getDmMessages(\n  conversationId: string,\n  maxMessages: number,\n  cursor: DmCursorOptions | undefined,\n  auth: TwitterAuth,\n): AsyncGenerator<DmMessageEntry, void> {\n  return getDmConversationMessagesGenerator(\n    conversationId,\n    maxMessages,\n    cursor,\n    async (id, _max, cursor) => {\n      const conversation = await fetchDmConversation(id, cursor, auth);\n\n      let next: DmCursorOptions | undefined = undefined;\n\n      if (cursor?.minId && conversation.max_entry_id) {\n        next = { minId: conversation.max_entry_id };\n      } else if (conversation.min_entry_id) {\n        next = { maxId: conversation.min_entry_id };\n      }\n\n      return {\n        conversation,\n        next,\n      };\n    },\n  );\n}\n\nexport function findDmConversationsByUserId(\n  inbox: DmInbox,\n  userId: string,\n): DmConversation[] {\n  const conversations: DmConversation[] = [];\n\n  for (const conversationId in inbox.conversations) {\n    const conversation = inbox.conversations[conversationId];\n    const hasUser = conversation.participants.some(\n      (participant) => participant.user_id === userId,\n    );\n\n    if (hasUser) {\n      conversations.push(conversation);\n    }\n  }\n\n  return conversations;\n}\n","import { Cookie } from 'tough-cookie';\nimport {\n  bearerToken,\n  bearerToken2,\n  FetchTransformOptions,\n  RequestApiResult,\n} from './api';\nimport { TwitterAuth, TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { FlowSubtaskHandler, TwitterUserAuth } from './auth-user';\nimport type { BrowserProfile } from './castle';\nimport { getProfile, getUserIdByScreenName, Profile } from './profile';\nimport {\n  fetchSearchProfiles,\n  fetchSearchTweets,\n  SearchMode,\n  searchProfiles,\n  searchTweets,\n} from './search';\nimport {\n  fetchProfileFollowing,\n  fetchProfileFollowers,\n  getFollowing,\n  getFollowers,\n} from './relationships';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTrends } from './trends';\nimport {\n  Tweet,\n  getTweetAnonymous,\n  getTweets,\n  getLatestTweet,\n  getLikedTweets,\n  getTweetWhere,\n  getTweetsWhere,\n  getTweetsByUserId,\n  TweetQuery,\n  getTweet,\n  fetchListTweets,\n  getTweetsAndRepliesByUserId,\n  getTweetsAndReplies,\n  fetchLikedTweets,\n} from './tweets';\nimport fetch from 'cross-fetch';\nimport debug from 'debug';\nimport { RateLimitStrategy } from './rate-limit';\nimport {\n  DmConversationTimeline,\n  DmInbox,\n  DmMessageEntry,\n  DmCursorOptions,\n  getDmConversation,\n  getDmMessages,\n  getDmInbox,\n  findDmConversationsByUserId,\n  DmConversation,\n} from './direct-messages';\n\nconst log = debug('twitter-scraper:scraper');\nconst twUrl = 'https://x.com';\n\nexport interface ScraperOptions {\n  /**\n   * An alternative fetch function to use instead of the default fetch function. This may be useful\n   * in nonstandard runtime environments, such as edge workers.\n   */\n  fetch: typeof fetch;\n\n  /**\n   * Additional options that control how requests and responses are processed. This can be used to\n   * proxy requests through other hosts, for example.\n   */\n  transform: Partial<FetchTransformOptions>;\n\n  /**\n   * A handling strategy for rate limits (HTTP 429).\n   */\n  rateLimitStrategy: RateLimitStrategy;\n\n  /**\n   * Experimental features that may be added, changed, or removed at any time. Use with caution.\n   */\n  experimental: {\n    /**\n     * Enables the generation of the `x-client-transaction-id` header on requests. This may resolve some errors.\n     */\n    xClientTransactionId: boolean;\n    /**\n     * Enables the generation of the `x-xp-forwarded-for` header on requests. This may resolve some errors.\n     */\n    xpff: boolean;\n    /**\n     * Delay in milliseconds between login flow steps, to mimic human-like timing.\n     * Without a delay, Twitter may flag rapid-fire requests as bot activity (error 399).\n     * Set to 0 to disable. Default is 1-3 seconds (average ~2s) with random jitter.\n     */\n    flowStepDelay?: number;\n    /**\n     * Override the browser profile used for Castle.io fingerprint token generation.\n     * Unspecified fields are randomized from realistic value pools.\n     * Set this if you want a consistent fingerprint or need to match specific hardware.\n     */\n    browserProfile?: Partial<BrowserProfile>;\n  };\n}\n\n/**\n * An interface to Twitter's undocumented API.\n * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n */\nexport class Scraper {\n  private auth!: TwitterAuth;\n  private authTrends!: TwitterAuth;\n  private token: string;\n  private readonly subtaskHandlers: Map<string, FlowSubtaskHandler> = new Map();\n\n  /**\n   * Creates a new Scraper object.\n   * - Scrapers maintain their own guest tokens for Twitter's internal API.\n   * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n   */\n  constructor(private readonly options?: Partial<ScraperOptions>) {\n    this.token = bearerToken;\n    this.useGuestAuth();\n  }\n\n  /**\n   * Registers a subtask handler for the given subtask ID. This\n   * will override any existing handler for the same subtask.\n   * @param subtaskId The ID of the subtask to register the handler for.\n   * @param subtaskHandler The handler function to register.\n   */\n  public registerAuthSubtaskHandler(\n    subtaskId: string,\n    subtaskHandler: FlowSubtaskHandler,\n  ): void {\n    // Always store so handlers survive auth transitions (guest -> user)\n    this.subtaskHandlers.set(subtaskId, subtaskHandler);\n\n    if (this.auth instanceof TwitterUserAuth) {\n      this.auth.registerSubtaskHandler(subtaskId, subtaskHandler);\n    }\n\n    if (this.authTrends instanceof TwitterUserAuth) {\n      this.authTrends.registerSubtaskHandler(subtaskId, subtaskHandler);\n    }\n  }\n\n  /**\n   * Applies all stored subtask handlers to the given auth instance.\n   * @internal\n   */\n  private applySubtaskHandlers(auth: TwitterUserAuth): void {\n    for (const [subtaskId, handler] of this.subtaskHandlers) {\n      auth.registerSubtaskHandler(subtaskId, handler);\n    }\n  }\n\n  /**\n   * Initializes auth properties using a guest token.\n   * Used when creating a new instance of this class, and when logging out.\n   * @internal\n   */\n  private useGuestAuth() {\n    this.auth = new TwitterGuestAuth(this.token, this.getAuthOptions());\n    this.authTrends = new TwitterGuestAuth(this.token, this.getAuthOptions());\n  }\n\n  /**\n   * Fetches a Twitter profile.\n   * @param username The Twitter username of the profile to fetch, without an `@` at the beginning.\n   * @returns The requested {@link Profile}.\n   */\n  public async getProfile(username: string): Promise<Profile> {\n    const res = await getProfile(username, this.auth);\n    return this.handleResponse(res);\n  }\n\n  /**\n   * Fetches the user ID corresponding to the provided screen name.\n   * @param screenName The Twitter screen name of the profile to fetch.\n   * @returns The ID of the corresponding account.\n   */\n  public async getUserIdByScreenName(screenName: string): Promise<string> {\n    const res = await getUserIdByScreenName(screenName, this.auth);\n    return this.handleResponse(res);\n  }\n\n  /**\n   * Fetches tweets from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxTweets The maximum number of tweets to return.\n   * @param includeReplies Whether or not replies should be included in the response.\n   * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n   * @returns An {@link AsyncGenerator} of tweets matching the provided filters.\n   */\n  public searchTweets(\n    query: string,\n    maxTweets: number,\n    searchMode: SearchMode = SearchMode.Top,\n  ): AsyncGenerator<Tweet, void> {\n    return searchTweets(query, maxTweets, searchMode, this.auth);\n  }\n\n  /**\n   * Fetches profiles from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxProfiles The maximum number of profiles to return.\n   * @returns An {@link AsyncGenerator} of tweets matching the provided filter(s).\n   */\n  public searchProfiles(\n    query: string,\n    maxProfiles: number,\n  ): AsyncGenerator<Profile, void> {\n    return searchProfiles(query, maxProfiles, this.auth);\n  }\n\n  /**\n   * Fetches tweets from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxTweets The maximum number of tweets to return.\n   * @param includeReplies Whether or not replies should be included in the response.\n   * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchSearchTweets(\n    query: string,\n    maxTweets: number,\n    searchMode: SearchMode,\n    cursor?: string,\n  ): Promise<QueryTweetsResponse> {\n    return fetchSearchTweets(query, maxTweets, searchMode, this.auth, cursor);\n  }\n\n  /**\n   * Fetches profiles from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxProfiles The maximum number of profiles to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchSearchProfiles(\n    query: string,\n    maxProfiles: number,\n    cursor?: string,\n  ): Promise<QueryProfilesResponse> {\n    return fetchSearchProfiles(query, maxProfiles, this.auth, cursor);\n  }\n\n  /**\n   * Fetches list tweets from Twitter.\n   * @param listId The list id\n   * @param maxTweets The maximum number of tweets to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchListTweets(\n    listId: string,\n    maxTweets: number,\n    cursor?: string,\n  ): Promise<QueryTweetsResponse> {\n    return fetchListTweets(listId, maxTweets, cursor, this.auth);\n  }\n\n  /**\n   * Fetch the tweets a user has liked\n   * @param userId The user whose liked tweets should be returned\n   * @param maxTweets The maximum number of tweets to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchLikedTweets(\n    userId: string,\n    maxTweets: number,\n    cursor?: string,\n  ): Promise<QueryTweetsResponse> {\n    return fetchLikedTweets(userId, maxTweets, cursor, this.auth);\n  }\n\n  /**\n   * Fetch the profiles a user is following\n   * @param userId The user whose following should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @returns An {@link AsyncGenerator} of following profiles for the provided user.\n   */\n  public getFollowing(\n    userId: string,\n    maxProfiles: number,\n  ): AsyncGenerator<Profile, void> {\n    return getFollowing(userId, maxProfiles, this.auth);\n  }\n\n  /**\n   * Fetch the profiles that follow a user\n   * @param userId The user whose followers should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @returns An {@link AsyncGenerator} of profiles following the provided user.\n   */\n  public getFollowers(\n    userId: string,\n    maxProfiles: number,\n  ): AsyncGenerator<Profile, void> {\n    return getFollowers(userId, maxProfiles, this.auth);\n  }\n\n  /**\n   * Fetches following profiles from Twitter.\n   * @param userId The user whose following should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchProfileFollowing(\n    userId: string,\n    maxProfiles: number,\n    cursor?: string,\n  ): Promise<QueryProfilesResponse> {\n    return fetchProfileFollowing(userId, maxProfiles, this.auth, cursor);\n  }\n\n  /**\n   * Fetches profile followers from Twitter.\n   * @param userId The user whose following should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchProfileFollowers(\n    userId: string,\n    maxProfiles: number,\n    cursor?: string,\n  ): Promise<QueryProfilesResponse> {\n    return fetchProfileFollowers(userId, maxProfiles, this.auth, cursor);\n  }\n\n  /**\n   * Fetches the current trends from Twitter.\n   * @returns The current list of trends.\n   */\n  public getTrends(): Promise<string[]> {\n    return getTrends(this.authTrends);\n  }\n\n  /**\n   * Fetches tweets from a Twitter user.\n   * @param user The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n    return getTweets(user, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches liked tweets from a Twitter user. Requires authentication.\n   * @param user The user whose likes should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of liked tweets from the provided user.\n   */\n  public getLikedTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n    return getLikedTweets(user, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches tweets from a Twitter user using their ID.\n   * @param userId The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweetsByUserId(\n    userId: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet, void> {\n    return getTweetsByUserId(userId, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches tweets and replies from a Twitter user.\n   * @param user The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweetsAndReplies(\n    user: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet> {\n    return getTweetsAndReplies(user, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches tweets and replies from a Twitter user using their ID.\n   * @param userId The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweetsAndRepliesByUserId(\n    userId: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet, void> {\n    return getTweetsAndRepliesByUserId(userId, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches the first tweet matching the given query.\n   *\n   * Example:\n   * ```js\n   * const timeline = scraper.getTweets('user', 200);\n   * const retweet = await scraper.getTweetWhere(timeline, { isRetweet: true });\n   * ```\n   * @param tweets The {@link AsyncIterable} of tweets to search through.\n   * @param query A query to test **all** tweets against. This may be either an\n   * object of key/value pairs or a predicate. If this query is an object, all\n   * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n   * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n   * - All keys are optional.\n   * - If specified, the key must be implemented by that of {@link Tweet}.\n   */\n  public getTweetWhere(\n    tweets: AsyncIterable<Tweet>,\n    query: TweetQuery,\n  ): Promise<Tweet | null> {\n    return getTweetWhere(tweets, query);\n  }\n\n  /**\n   * Fetches all tweets matching the given query.\n   *\n   * Example:\n   * ```js\n   * const timeline = scraper.getTweets('user', 200);\n   * const retweets = await scraper.getTweetsWhere(timeline, { isRetweet: true });\n   * ```\n   * @param tweets The {@link AsyncIterable} of tweets to search through.\n   * @param query A query to test **all** tweets against. This may be either an\n   * object of key/value pairs or a predicate. If this query is an object, all\n   * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n   * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n   * - All keys are optional.\n   * - If specified, the key must be implemented by that of {@link Tweet}.\n   */\n  public getTweetsWhere(\n    tweets: AsyncIterable<Tweet>,\n    query: TweetQuery,\n  ): Promise<Tweet[]> {\n    return getTweetsWhere(tweets, query);\n  }\n\n  /**\n   * Fetches the most recent tweet from a Twitter user.\n   * @param user The user whose latest tweet should be returned.\n   * @param includeRetweets Whether or not to include retweets. Defaults to `false`.\n   * @returns The {@link Tweet} object or `null`/`undefined` if it couldn't be fetched.\n   */\n  public getLatestTweet(\n    user: string,\n    includeRetweets = false,\n    max = 200,\n  ): Promise<Tweet | null | void> {\n    return getLatestTweet(user, includeRetweets, max, this.auth);\n  }\n\n  /**\n   * Fetches a single tweet.\n   * @param id The ID of the tweet to fetch.\n   * @returns The {@link Tweet} object, or `null` if it couldn't be fetched.\n   */\n  public getTweet(id: string): Promise<Tweet | null> {\n    if (this.auth instanceof TwitterUserAuth) {\n      return getTweet(id, this.auth);\n    } else {\n      return getTweetAnonymous(id, this.auth);\n    }\n  }\n\n  /**\n   * Retrieves the direct message inbox for the authenticated user.\n   *\n   * @return A promise that resolves to an object representing the direct message inbox.\n   */\n  public getDmInbox(): Promise<DmInbox> {\n    return getDmInbox(this.auth);\n  }\n\n  /**\n   * Retrieves the direct message conversation for the specified conversation ID.\n   *\n   * @param conversationId - The unique identifier of the DM conversation to retrieve.\n   * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages).\n   * @return A promise that resolves to the timeline of the DM conversation.\n   */\n  public getDmConversation(\n    conversationId: string,\n    cursor?: DmCursorOptions,\n  ): Promise<DmConversationTimeline> {\n    return getDmConversation(conversationId, cursor, this.auth);\n  }\n\n  /**\n   * Retrieves direct messages from a specific conversation.\n   *\n   * @param conversationId - The unique identifier of the conversation to fetch messages from.\n   * @param [maxMessages=20] - The maximum number of messages to retrieve per request.\n   * @param cursor - Use `maxId` to get messages before a message ID (older messages), or `minId` to get messages after a message ID (newer messages).\n   * @returns An {@link AsyncGenerator} of messages from the provided conversation.\n   */\n  public getDmMessages(\n    conversationId: string,\n    maxMessages = 20,\n    cursor?: DmCursorOptions,\n  ): AsyncGenerator<DmMessageEntry, void> {\n    return getDmMessages(conversationId, maxMessages, cursor, this.auth);\n  }\n\n  /**\n   * Retrieves a list of direct message conversations for a specific user based on their user ID.\n   *\n   * @param inbox - The DM inbox containing all available conversations.\n   * @param userId - The unique identifier of the user whose DM conversations are to be retrieved.\n   * @return An array of DM conversations associated with the specified user ID.\n   */\n  public findDmConversationsByUserId(\n    inbox: DmInbox,\n    userId: string,\n  ): DmConversation[] {\n    return findDmConversationsByUserId(inbox, userId);\n  }\n\n  /**\n   * Returns if the scraper has a guest token. The token may not be valid.\n   * @returns `true` if the scraper has a guest token; otherwise `false`.\n   */\n  public hasGuestToken(): boolean {\n    return this.auth.hasToken() || this.authTrends.hasToken();\n  }\n\n  /**\n   * Returns if the scraper is logged in as a real user.\n   * @returns `true` if the scraper is logged in with a real user account; otherwise `false`.\n   */\n  public async isLoggedIn(): Promise<boolean> {\n    return (\n      (await this.auth.isLoggedIn()) && (await this.authTrends.isLoggedIn())\n    );\n  }\n\n  /**\n   * Login to Twitter as a real Twitter account. This enables running\n   * searches.\n   * @param username The username of the Twitter account to login with.\n   * @param password The password of the Twitter account to login with.\n   * @param email The email to log in with, if you have email confirmation enabled.\n   * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n   */\n  public async login(\n    username: string,\n    password: string,\n    email?: string,\n    twoFactorSecret?: string,\n  ): Promise<void> {\n    // Swap in a real authorizer for all requests\n    // Use bearerToken2 for the login flow - this is the same token the Twitter frontend uses.\n    // Guest activation and the onboarding/task.json endpoint both require this token.\n    const userAuth = new TwitterUserAuth(bearerToken2, this.getAuthOptions());\n    this.applySubtaskHandlers(userAuth);\n    await userAuth.login(username, password, email, twoFactorSecret);\n    this.auth = userAuth;\n    this.authTrends = userAuth;\n  }\n\n  /**\n   * Log out of Twitter.\n   */\n  public async logout(): Promise<void> {\n    await this.auth.logout();\n    await this.authTrends.logout();\n\n    // Swap in guest authorizers for all requests\n    this.useGuestAuth();\n  }\n\n  /**\n   * Retrieves all cookies for the current session.\n   * @returns All cookies for the current session.\n   */\n  public async getCookies(): Promise<Cookie[]> {\n    return await this.authTrends\n      .cookieJar()\n      .getCookies(\n        typeof document !== 'undefined' ? document.location.toString() : twUrl,\n      );\n  }\n\n  /**\n   * Set cookies for the current session.\n   * @param cookies The cookies to set for the current session.\n   */\n  public async setCookies(cookies: (string | Cookie)[]): Promise<void> {\n    // Use bearerToken2 for authenticated user requests\n    const userAuth = new TwitterUserAuth(bearerToken2, this.getAuthOptions());\n    this.applySubtaskHandlers(userAuth);\n    for (const cookie of cookies) {\n      if (cookie == null) continue;\n\n      if (typeof cookie === 'string') {\n        // String cookies are parsed by tough-cookie, which normalizes domains correctly\n        try {\n          await userAuth.cookieJar().setCookie(cookie, 'https://x.com');\n        } catch (err) {\n          log(`Failed to parse cookie string: ${(err as Error).message}`);\n        }\n      } else {\n        // Cookie objects from Cookie.fromJSON() preserve the domain literally.\n        // tough-cookie's getCookies() won't match \".x.com\" against \"https://x.com\",\n        // so we must strip the leading dot and set hostOnly=false to allow\n        // subdomain matching (matching how tough-cookie normalizes string cookies).\n        if (cookie.domain && cookie.domain.startsWith('.')) {\n          cookie.domain = cookie.domain.substring(1);\n          cookie.hostOnly = false;\n        }\n\n        const cookieDomain = cookie.domain || 'x.com';\n        const cookieUrl = `https://${cookieDomain}`;\n        await userAuth.cookieJar().setCookie(cookie, cookieUrl);\n      }\n    }\n\n    this.auth = userAuth;\n    this.authTrends = userAuth;\n\n    // Warn if auth_token is missing - this is the most common cause of 401 errors.\n    // auth_token is an HttpOnly cookie that cannot be accessed via document.cookie;\n    // it must be exported using a browser extension or DevTools.\n    const isLoggedIn = await userAuth.isLoggedIn();\n    if (!isLoggedIn) {\n      const cookieString = await userAuth\n        .cookieJar()\n        .getCookies(twUrl)\n        .then((c) => c.map((cookie) => cookie.key));\n      if (\n        cookieString.includes('ct0') &&\n        !cookieString.includes('auth_token')\n      ) {\n        log(\n          'auth_token cookie is missing. This is required for authenticated API access. ' +\n            'The auth_token is an HttpOnly cookie that cannot be accessed via document.cookie. ' +\n            'Export it using a browser extension (e.g., EditThisCookie) or DevTools Application tab.',\n        );\n      }\n    }\n  }\n\n  /**\n   * Clear all cookies for the current session.\n   */\n  public async clearCookies(): Promise<void> {\n    await this.auth.cookieJar().removeAllCookies();\n    await this.authTrends.cookieJar().removeAllCookies();\n  }\n\n  /**\n   * Sets the optional cookie to be used in requests.\n   * @param _cookie The cookie to be used in requests.\n   * @deprecated This function no longer represents any part of Twitter's auth flow.\n   * @returns This scraper instance.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  public withCookie(_cookie: string): Scraper {\n    console.warn(\n      'Warning: Scraper#withCookie is deprecated and will be removed in a later version. Use Scraper#login or Scraper#setCookies instead.',\n    );\n    return this;\n  }\n\n  /**\n   * Sets the optional CSRF token to be used in requests.\n   * @param _token The CSRF token to be used in requests.\n   * @deprecated This function no longer represents any part of Twitter's auth flow.\n   * @returns This scraper instance.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  public withXCsrfToken(_token: string): Scraper {\n    console.warn(\n      'Warning: Scraper#withXCsrfToken is deprecated and will be removed in a later version.',\n    );\n    return this;\n  }\n\n  private getAuthOptions(): Partial<TwitterAuthOptions> {\n    return {\n      fetch: this.options?.fetch,\n      transform: this.options?.transform,\n      rateLimitStrategy: this.options?.rateLimitStrategy,\n      experimental: {\n        xClientTransactionId: this.options?.experimental?.xClientTransactionId,\n        xpff: this.options?.experimental?.xpff,\n        flowStepDelay: this.options?.experimental?.flowStepDelay,\n        browserProfile: this.options?.experimental?.browserProfile,\n      },\n    };\n  }\n\n  private handleResponse<T>(res: RequestApiResult<T>): T {\n    if (!res.success) {\n      throw res.err;\n    }\n\n    return res.value;\n  }\n}\n"],"names":["log","FieldEncoding","mx","crypto","DOMParser","jitter","endpoints","SearchMode","cursor"],"mappings":";;;;;;;;;;AAAO,MAAM,iBAAiB,KAAM,CAAA;AAAA,EAClC,WAAA,CAAqB,UAA6B,IAAW,EAAA;AAC3D,IAAA,KAAA;AAAA,MACE,CAAoB,iBAAA,EAAA,QAAA,CAAS,MAAM,CAAA,YAAA,EAAe,IAAK,CAAA,SAAA;AAAA,QACrD,eAAA,CAAgB,SAAS,OAAO,CAAA;AAAA,OACjC,YAAY,OAAO,IAAA,KAAS,WAAW,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,KACrE,CAAA;AALmB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAA6B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AAAA,GAMlD;AAAA,EAEA,aAAa,aAAa,QAAoB,EAAA;AAE5C,IAAA,IAAI,IAAoC,GAAA,KAAA,CAAA,CAAA;AACxC,IAAI,IAAA;AACF,MAAA,IAAI,SAAS,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAG,EAAA,QAAA,CAAS,kBAAkB,CAAG,EAAA;AACtE,QAAO,IAAA,GAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,OACtB,MAAA;AACL,QAAO,IAAA,GAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,OAC7B;AAAA,KACM,CAAA,MAAA;AACN,MAAI,IAAA;AACF,QAAO,IAAA,GAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,OACrB,CAAA,MAAA;AAAA,OAAC;AAAA,KACX;AAEA,IAAO,OAAA,IAAI,QAAS,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAAA,GACpC;AACF,CAAA;AAEA,SAAS,gBAAgB,OAA0B,EAAA;AACjD,EAAA,MAAM,SAAmB,EAAC,CAAA;AAC1B,EAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAQ,KAAA;AAC9B,IAAA,MAAA,CAAO,IAAK,CAAA,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,GAC/B,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAO,KAAK,IAAI,CAAA,CAAA;AACzB,CAAA;AAEO,MAAM,4BAA4B,KAAM,CAAA;AAAA,EAC7C,YAAY,OAAkB,EAAA;AAC5B,IAAA,KAAA,CAAM,WAAW,uBAAuB,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,IAAO,GAAA,qBAAA,CAAA;AAAA,GACd;AACF;;ACrCA,MAAMA,KAAA,GAAM,MAAM,4BAA4B,CAAA,CAAA;AA+CvC,MAAM,wBAAsD,CAAA;AAAA,EACjE,MAAM,WAAA,CAAY,EAAE,QAAA,EAAU,KAAsC,EAAA;AAOlE,IAAA,MAAM,eAAkB,GAAA,GAAA,CAAI,OAAQ,CAAA,GAAA,CAAI,oBAAoB,CAAA,CAAA;AAC5D,IAAA,MAAM,mBAAsB,GAAA,GAAA,CAAI,OAAQ,CAAA,GAAA,CAAI,wBAAwB,CAAA,CAAA;AACpE,IAAA,MAAM,eAAkB,GAAA,GAAA,CAAI,OAAQ,CAAA,GAAA,CAAI,oBAAoB,CAAA,CAAA;AAE5D,IAAAA,KAAA;AAAA,MACE,CAA2B,wBAAA,EAAA,eAAe,CAAe,YAAA,EAAA,mBAAmB,WAAW,eAAe,CAAA,CAAA;AAAA,KACxG,CAAA;AAEA,IAAI,IAAA,mBAAA,IAAuB,OAAO,eAAiB,EAAA;AACjD,MAAA,MAAM,WAAc,GAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,SAAY,GAAA,GAAA,CAAA;AAC3C,MAAA,MAAM,WAAc,GAAA,GAAA,IAAQ,QAAS,CAAA,eAAe,CAAI,GAAA,WAAA,CAAA,CAAA;AAGxD,MAAA,MAAM,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,WAAW,CAAC,CAAA,CAAA;AAAA,KACjE;AAAA,GACF;AACF,CAAA;AAKO,MAAM,sBAAoD,CAAA;AAAA,EAC/D,MAAM,WAAA,CAAY,EAAE,QAAA,EAAU,KAAsC,EAAA;AAClE,IAAM,MAAA,MAAM,QAAS,CAAA,YAAA,CAAa,GAAG,CAAA,CAAA;AAAA,GACvC;AACF;;AChEA,MAAMA,KAAA,GAAM,MAAM,wBAAwB,CAAA,CAAA;AAU9B,IAAA,aAAA,qBAAAC,cAAL,KAAA;AAEL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,WAAQ,CAAR,CAAA,CAAA,GAAA,OAAA,CAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,CAAT,CAAA,GAAA,QAAA,CAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,CAAP,CAAA,GAAA,MAAA,CAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,oBAAiB,CAAjB,CAAA,GAAA,gBAAA,CAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,gBAAa,CAAb,CAAA,GAAA,YAAA,CAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,iBAAc,CAAd,CAAA,GAAA,aAAA,CAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,eAAY,CAAZ,CAAA,GAAA,WAAA,CAAA;AAdU,EAAAA,OAAAA,cAAAA,CAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA,CAAA,CAAA;AAoBZ,MAAM,iBAAoB,GAAA,kCAAA,CAAA;AAG1B,MAAM,SAAY,GAAA,CAAC,UAAY,EAAA,UAAA,EAAY,WAAW,UAAU,CAAA,CAAA;AAQhE,MAAM,kBAAqB,GAAA;AAAA,EACzB,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAC/C,CAAA,CAAA;AAGA,MAAM,QAAW,GAAA,MAAA,CAAA;AAGjB,MAAM,WAAc,GAAA,KAAA,CAAA;AAGpB,MAAM,aAAgB,GAAA,EAAA,CAAA;AAMtB,MAAM,OAAU,GAAA;AAAA,EACd,MAAQ,EAAA,CAAA;AAAA;AAAA,EACR,OAAS,EAAA,CAAA;AAAA;AAAA,EACT,MAAQ,EAAA,CAAA;AAAA;AACV,CAAA,CAAA;AAkCA,MAAM,eAAkC,GAAA;AAAA,EACtC,MAAQ,EAAA,OAAA;AAAA,EACR,QAAU,EAAA,IAAA;AAAA,EACV,QAAU,EAAA,kBAAA;AAAA,EACV,WAAa,EAAA,IAAA;AAAA,EACb,YAAc,EAAA,IAAA;AAAA,EACd,cAAgB,EAAA,IAAA;AAAA,EAChB,eAAiB,EAAA,IAAA;AAAA;AAAA,EACjB,WACE,EAAA,4EAAA;AAAA,EACF,cAAgB,EAAA,CAAA;AAAA,EAChB,mBAAqB,EAAA,EAAA;AAAA,EACrB,UAAY,EAAA,EAAA;AAAA,EACZ,gBAAkB,EAAA,CAAA;AACpB,CAAA,CAAA;AAaA,MAAM,kBAAqB,GAAA;AAAA,EACzB,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,IAAA,EAAM,IAAI,IAAK,EAAA;AAAA,EAC7B,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,IAAA,EAAM,IAAI,IAAK,EAAA;AAAA,EAC7B,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,GAAA,EAAK,IAAI,GAAI,EAAA;AAAA,EAC3B,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,GAAA,EAAK,IAAI,GAAI,EAAA;AAAA,EAC3B,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,GAAA,EAAK,IAAI,GAAI,EAAA;AAAA,EAC3B,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,IAAA,EAAM,IAAI,IAAK,EAAA;AAAA,EAC7B,EAAE,CAAG,EAAA,IAAA,EAAM,CAAG,EAAA,IAAA,EAAM,IAAI,IAAK,EAAA;AAC/B,CAAA,CAAA;AAiBA,MAAM,oBAAuB,GAAA,CAAC,CAAG,EAAA,CAAA,EAAG,GAAG,EAAE,CAAA,CAAA;AAGzC,MAAM,8BAA8B,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,EAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAWjD,SAAS,uBAA0C,GAAA;AACxD,EAAA,MAAM,SAAS,kBAAmB,CAAA,OAAA,CAAQ,GAAG,kBAAmB,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAC3E,EAAO,OAAA;AAAA,IACL,GAAG,eAAA;AAAA,IACH,aAAa,MAAO,CAAA,CAAA;AAAA,IACpB,cAAc,MAAO,CAAA,CAAA;AAAA,IACrB,gBAAgB,MAAO,CAAA,CAAA;AAAA,IACvB,iBAAiB,MAAO,CAAA,EAAA;AAAA;AAAA,IAExB,gBACE,oBAAqB,CAAA,OAAA,CAAQ,GAAG,oBAAqB,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,IAClE,qBACE,2BACE,CAAA,OAAA,CAAQ,GAAG,2BAA4B,CAAA,MAAA,GAAS,CAAC,CACnD,CAAA;AAAA,GACJ,CAAA;AACF,CAAA;AAIA,SAAS,eAAe,CAAuB,EAAA;AAC7C,EAAM,MAAA,GAAA,GAAM,IAAI,UAAA,CAAW,CAAC,CAAA,CAAA;AAC5B,EAAA,IACE,OAAO,UAAW,CAAA,MAAA,KAAW,WAC7B,IAAA,UAAA,CAAW,OAAO,eAClB,EAAA;AACA,IAAW,UAAA,CAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA,CAAA;AAAA,GAChC,MAAA;AACL,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,MAAA,KAAW,GAAG,CAAA,CAAA;AAAA,GACrE;AACA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAEA,SAAS,OAAA,CAAQ,KAAa,GAAqB,EAAA;AACjD,EAAO,OAAA,GAAA,GAAM,KAAK,KAAM,CAAA,IAAA,CAAK,QAAY,IAAA,GAAA,GAAM,MAAM,CAAE,CAAA,CAAA,CAAA;AACzD,CAAA;AAEA,SAAS,SAAA,CAAU,KAAa,GAAqB,EAAA;AACnD,EAAA,OAAO,GAAM,GAAA,IAAA,CAAK,MAAO,EAAA,IAAK,GAAM,GAAA,GAAA,CAAA,CAAA;AACtC,CAAA;AAEA,SAAS,UAAU,MAAkC,EAAA;AACnD,EAAM,MAAA,GAAA,GAAM,OAAO,MAAO,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,GAAI,CAAE,CAAA,MAAA,EAAQ,CAAC,CAAA,CAAA;AACnD,EAAM,MAAA,GAAA,GAAM,IAAI,UAAA,CAAW,GAAG,CAAA,CAAA;AAC9B,EAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,EAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACtB,IAAI,GAAA,CAAA,GAAA,CAAI,GAAG,GAAG,CAAA,CAAA;AACd,IAAA,GAAA,IAAO,CAAE,CAAA,MAAA,CAAA;AAAA,GACX;AACA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAEA,SAAS,MAAM,KAA2B,EAAA;AACxC,EAAA,OAAO,MAAM,IAAK,CAAA,KAAK,CACpB,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAA,CAAE,QAAS,CAAA,EAAE,EAAE,QAAS,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA,CAAA;AACZ,CAAA;AAEA,SAAS,QAAQ,GAAyB,EAAA;AACxC,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA;AACzC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,QAAQ,CAAK,IAAA,CAAA;AACnC,IAAI,GAAA,CAAA,CAAA,GAAI,CAAC,CAAA,GAAI,QAAS,CAAA,GAAA,CAAI,UAAU,CAAG,EAAA,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA,CAAA;AACnD,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAEA,SAAS,QAAQ,CAAuB,EAAA;AACtC,EAAA,OAAO,IAAI,WAAA,EAAc,CAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AACnC,CAAA;AAGA,SAAS,MAAM,IAA4B,EAAA;AACzC,EAAO,OAAA,IAAI,WAAW,IAAI,CAAA,CAAA;AAC5B,CAAA;AAGA,SAAS,KAAK,CAAuB,EAAA;AACnC,EAAA,OAAO,EAAI,CAAA,CAAA,KAAM,CAAK,GAAA,GAAA,EAAM,IAAI,GAAI,CAAA,CAAA;AACtC,CAAA;AAGA,SAAS,KAAK,CAAuB,EAAA;AACnC,EAAO,OAAA,EAAA,CAAI,CAAM,KAAA,EAAA,GAAM,GAAO,EAAA,CAAA,KAAM,EAAM,GAAA,GAAA,EAAO,CAAM,KAAA,CAAA,GAAK,GAAM,EAAA,CAAA,GAAI,GAAI,CAAA,CAAA;AAC5E,CAAA;AAEA,SAAS,QAAA,CAAS,MAAkB,GAA6B,EAAA;AAC/D,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AACtC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA,GAAI,GAAI,CAAA,CAAA,GAAI,IAAI,MAAM,CAAA,CAAA;AAC3E,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAEA,SAAS,UAAA,CAAW,SAAiB,SAA2B,EAAA;AAC9D,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,SAAA,EAAW,EAAE,CAAA,CAAA;AAChC,EAAA,OAAO,QACJ,KAAM,CAAA,EAAE,CACR,CAAA,GAAA,CAAI,CAAC,CAAO,KAAA,CAAA,QAAA,CAAS,CAAG,EAAA,EAAE,IAAI,CAAG,EAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAC7C,KAAK,EAAE,CAAA,CAAA;AACZ,CAAA;AAEA,SAAS,UAAU,IAA0B,EAAA;AAC3C,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,WAAW,CAAA,CAAA;AAAA,GAC/C;AACA,EAAA,IAAI,GAAM,GAAA,EAAA,CAAA;AACV,EAAS,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,MAAA,EAAQ,CAAK,EAAA,EAAA,GAAA,IAAO,MAAO,CAAA,YAAA,CAAa,IAAK,CAAA,CAAC,CAAC,CAAA,CAAA;AACxE,EAAA,OAAO,IAAK,CAAA,GAAG,CAAE,CAAA,OAAA,CAAQ,KAAO,EAAA,GAAG,CAAE,CAAA,OAAA,CAAQ,KAAO,EAAA,GAAG,CAAE,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAA;AAC5E,CAAA;AASgB,SAAA,YAAA,CAAa,MAAkB,GAA2B,EAAA;AAExE,EAAA,MAAM,SAAS,IAAK,CAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAI,GAAA,CAAA,CAAA;AAC5C,EAAM,MAAA,MAAA,GAAS,IAAI,UAAA,CAAW,MAAM,CAAA,CAAA;AACpC,EAAA,MAAA,CAAO,IAAI,IAAI,CAAA,CAAA;AAEf,EAAA,MAAM,IAAI,MAAS,GAAA,CAAA,CAAA;AAEnB,EAAM,MAAA,CAAA,GAAI,IAAI,WAAA,CAAY,CAAC,CAAA,CAAA;AAC3B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC1B,IAAE,CAAA,CAAA,CAAC,KACA,MAAO,CAAA,CAAA,GAAI,CAAC,CACV,GAAA,MAAA,CAAO,CAAI,GAAA,CAAA,GAAI,CAAC,CAAA,IAAK,IACrB,MAAO,CAAA,CAAA,GAAI,CAAI,GAAA,CAAC,CAAK,IAAA,EAAA,GACrB,OAAO,CAAI,GAAA,CAAA,GAAI,CAAC,CAAA,IAAK,EACxB,MAAA,CAAA,CAAA;AAAA,GACJ;AAEA,EAAI,IAAA,CAAA,IAAK,GAAU,OAAA,MAAA,CAAA;AAEnB,EAAM,MAAA,CAAA,GAAI,IAAI,WAAY,CAAA,GAAA,CAAI,IAAI,CAAC,CAAA,KAAM,CAAM,KAAA,CAAC,CAAC,CAAA,CAAA;AACjD,EAAA,MAAM,KAAQ,GAAA,UAAA,CAAA;AACd,EAAA,MAAM,IAAI,CAAI,GAAA,CAAA,CAAA;AACd,EAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,EAAI,IAAA,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AACX,EAAI,IAAA,CAAA,CAAA;AACJ,EAAA,IAAI,SAAS,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,EAAA,IAAM,IAAI,CAAE,CAAA,CAAA,CAAA;AAExC,EAAA,OAAO,WAAW,CAAG,EAAA;AACnB,IAAA,GAAA,GAAO,MAAM,KAAW,KAAA,CAAA,CAAA;AACxB,IAAM,MAAA,CAAA,GAAK,QAAQ,CAAK,GAAA,CAAA,CAAA;AACxB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC1B,MAAI,CAAA,GAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA;AACX,MAAA,MAAMC,QACA,CAAM,KAAA,CAAA,GAAM,KAAK,CAAQ,MAAA,CAAA,KAAA,CAAQ,MAAM,CAAM,GAAA,CAAA,IAAK,OAAQ,CAC3D,CAAA,GAAA,CAAA,CAAA,GAAA,GAAM,OAAO,CAAO,KAAA,CAAA,CAAA,CAAG,IAAI,CAAK,GAAA,CAAC,IAAI,CAAO,MAAA,CAAA,CAAA,CAAA;AACjD,MAAA,CAAA,CAAE,CAAC,CAAA,GAAK,CAAE,CAAA,CAAC,IAAIA,GAAQ,KAAA,CAAA,CAAA;AACvB,MAAA,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AAAA,KACT;AACA,IAAA,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AACP,IAAA,MAAM,OACA,CAAM,KAAA,CAAA,GAAM,KAAK,CAAQ,MAAA,CAAA,KAAA,CAAQ,MAAM,CAAM,GAAA,CAAA,IAAK,OAAQ,CAC3D,CAAA,GAAA,CAAA,CAAA,GAAA,GAAM,OAAO,CAAO,KAAA,CAAA,CAAA,CAAG,IAAI,CAAK,GAAA,CAAC,IAAI,CAAO,MAAA,CAAA,CAAA,CAAA;AACjD,IAAA,CAAA,CAAE,CAAC,CAAA,GAAK,CAAE,CAAA,CAAC,IAAI,EAAQ,KAAA,CAAA,CAAA;AACvB,IAAA,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AAAA,GACT;AAGA,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,CAAA,GAAI,CAAC,CAAA,CAAA;AAChC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC1B,IAAA,GAAA,CAAI,CAAI,GAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAI,GAAA,GAAA,CAAA;AACpB,IAAA,GAAA,CAAI,IAAI,CAAI,GAAA,CAAC,IAAK,CAAE,CAAA,CAAC,MAAM,CAAK,GAAA,GAAA,CAAA;AAChC,IAAA,GAAA,CAAI,IAAI,CAAI,GAAA,CAAC,IAAK,CAAE,CAAA,CAAC,MAAM,EAAM,GAAA,GAAA,CAAA;AACjC,IAAA,GAAA,CAAI,IAAI,CAAI,GAAA,CAAC,IAAK,CAAE,CAAA,CAAC,MAAM,EAAM,GAAA,GAAA,CAAA;AAAA,GACnC;AACA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAGA,SAAS,YAAA,CACP,IACA,EAAA,UAAA,EACA,QACY,EAAA;AACZ,EAAA,OAAO,aAAa,IAAM,EAAA;AAAA,IACxB,UAAA;AAAA,IACA,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IACnB,GAAG,kBAAA;AAAA,GACJ,CAAA,CAAA;AACH,CAAA;AAKO,SAAS,qBAAqB,EAAwB,EAAA;AAC3D,EAAA,IAAI,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,EAAA,GAAK,MAAO,QAAQ,CAAA,CAAA;AACvC,EAAA,CAAA,GAAI,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,CAAG,EAAA,SAAS,GAAG,CAAC,CAAA,CAAA;AACtC,EAAA,OAAO,KAAK,CAAC,CAAA,CAAA;AACf,CAAA;AAEA,SAAS,eAAA,CAAgB,KAAiB,GAAqB,EAAA;AAC7D,EAAM,MAAA,GAAA,GAAM,MAAM,GAAG,CAAA,CAAA;AACrB,EAAA,MAAM,MAAU,GAAA,CAAA,GAAA,GAAM,EAAK,EAAA,QAAA,CAAS,EAAE,CAAA,CAAA;AACtC,EAAA,OAAO,WAAW,GAAI,CAAA,SAAA,CAAU,CAAC,CAAA,EAAG,MAAM,CAAI,GAAA,MAAA,CAAA;AAChD,CAAA;AAEA,SAAS,yBAAyB,EAAoB,EAAA;AACpD,EAAM,MAAA,OAAA,GAAU,qBAAqB,EAAE,CAAA,CAAA;AACvC,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,EAAE,CAAI,GAAA,GAAA,CAAA;AAC/B,EAAM,MAAA,UAAA,GAAa,KAAK,KAAK,CAAA,CAAA;AAC7B,EAAM,MAAA,CAAA,GAAI,OAAQ,CAAA,CAAA,EAAG,EAAE,CAAA,CAAA;AACvB,EAAA,OAAO,gBAAgB,OAAS,EAAA,CAAC,CAAI,GAAA,eAAA,CAAgB,YAAY,CAAC,CAAA,CAAA;AACpE,CAAA;AAWO,SAAS,YACd,CAAA,MAAA,EACA,QACA,EAAA,OAAA,EACA,IACY,EAAA;AACZ,EAAA,MAAM,MAAM,MAAO,CAAA,SAAA,CAAU,GAAG,QAAQ,CAAA,CAAE,MAAM,EAAE,CAAA,CAAA;AAClD,EAAI,IAAA,GAAA,CAAI,MAAW,KAAA,CAAA,EAAU,OAAA,IAAA,CAAA;AAC7B,EAAA,MAAM,GAAM,GAAA,QAAA,CAAS,OAAS,EAAA,EAAE,IAAI,GAAI,CAAA,MAAA,CAAA;AACxC,EAAA,MAAM,OAAU,GAAA,GAAA,CAAI,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA,CAAO,GAAI,CAAA,KAAA,CAAM,CAAG,EAAA,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA,CAAA;AAChE,EAAA,OAAO,QAAS,CAAA,IAAA,EAAM,OAAQ,CAAA,OAAO,CAAC,CAAA,CAAA;AACxC,CAAA;AASgB,SAAA,iBAAA,CACd,OACA,EAAA,OAAA,EACA,KACQ,EAAA;AACR,EAAI,IAAA,KAAA,KAAU,GAAU,OAAA,CAAA,CAAA;AACxB,EAAI,IAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AACtB,EAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,EAAA,OAAO,KAAK,CAAG,EAAA;AACb,IAAK,CAAA,IAAA,CAAA,CAAA;AACL,IAAA,GAAA,EAAA,CAAA;AAAA,GACF;AACA,EAAO,OAAA,CAAA,GAAI,CAAK,IAAA,CAAA,GAAI,CAAG,EAAA;AACrB,IAAK,CAAA,IAAA,CAAA,CAAA;AACL,IAAA,GAAA,EAAA,CAAA;AAAA,GACF;AACA,EAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,GAAM,EAAA,CAAA,CAAA,IAAK,WAAW,CAAC,CAAA,CAAA;AACtC,EAAA,MAAM,IAAO,GAAA,CAAA,GAAI,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAC7B,EAAA,IAAI,QAAW,GAAA,CAAA,CAAA;AACf,EAAA,IAAI,OAAO,CAAG,EAAA;AACZ,IAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,IAAA,IAAI,GAAM,GAAA,IAAA,CAAA;AACV,IAAO,OAAA,GAAA,KAAQ,CAAK,IAAA,GAAA,IAAO,OAAS,EAAA;AAClC,MAAO,GAAA,IAAA,CAAA,CAAA;AACP,MAAM,MAAA,GAAA,GAAM,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC1B,MAAA,QAAA,IAAY,OAAQ,OAAU,GAAA,GAAA,CAAA;AAC9B,MAAO,GAAA,IAAA,GAAA,CAAA;AACP,MAAA,GAAA,EAAA,CAAA;AAAA,KACF;AAAA,GACF;AACA,EAAA,OAAQ,OAAO,OAAW,GAAA,QAAA,CAAA;AAC5B,CAAA;AAQO,SAAS,eAAe,CAAmB,EAAA;AAChD,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AACvB,EAAI,IAAA,CAAA,IAAK,IAAW,OAAA,EAAA,GAAK,kBAAkB,CAAG,EAAA,CAAA,EAAG,IAAI,CAAC,CAAA,CAAA;AACtD,EAAA,OAAO,GAAM,GAAA,iBAAA,CAAkB,CAAG,EAAA,CAAA,EAAG,IAAI,EAAE,CAAA,CAAA;AAC7C,CAAA;AAgBO,SAAS,WACd,CAAA,KAAA,EACA,QACA,EAAA,GAAA,EACA,QACY,EAAA;AAGZ,EAAA,MAAM,MAAM,EAAK,CAAA,CAAA,EAAA,GAAK,KAAU,KAAA,CAAA,GAAM,IAAI,QAAS,CAAA,CAAA;AAEnD,EAAI,IAAA,QAAA,KAAa,kBAAuB,QAAa,KAAA,CAAA;AACnD,IAAO,OAAA,GAAA,CAAA;AAET,EAAI,IAAA,IAAA,CAAA;AACJ,EAAA,QAAQ,QAAU;AAAA,IAChB,KAAK,CAAA;AACH,MAAA,IAAA,GAAO,GAAG,GAAa,CAAA,CAAA;AACvB,MAAA,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,IAAA,GAAO,EAAG,CAAA,IAAA,CAAK,KAAM,CAAA,GAAa,CAAC,CAAA,CAAA;AACnC,MAAA,MAAA;AAAA,IACF,KAAK,CAA0B,mBAAA;AAC7B,MAAA,MAAM,CAAI,GAAA,GAAA,CAAA;AACV,MAAO,IAAA,GAAA,CAAA,IAAK,MAAM,EAAG,CAAA,CAAC,IAAI,IAAM,CAAA,CAAA,IAAK,EAAO,GAAA,KAAA,GAAQ,CAAE,CAAA,CAAA;AACtD,MAAA,MAAA;AAAA,KACF;AAAA,IACA,KAAK,CAA8B,uBAAA;AACjC,MAAA,IAAI,YAAY,IAAM,EAAA;AACpB,QAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAAA;AAAA,OACpE;AACA,MAAA,MAAM,GAAM,GAAA,YAAA,CAAa,GAAmB,EAAA,KAAA,EAAO,QAAQ,CAAA,CAAA;AAC3D,MAAA,IAAA,GAAO,MAAO,CAAA,EAAA,CAAG,GAAI,CAAA,MAAM,GAAG,GAAG,CAAA,CAAA;AACjC,MAAA,MAAA;AAAA,KACF;AAAA,IACA,KAAK,CAAA;AACH,MAAA,IAAA,GAAO,GAAe,YAAA,UAAA,GAAa,GAAM,GAAA,EAAA,CAAG,GAAa,CAAA,CAAA;AACzD,MAAA,MAAA;AAAA,IACF;AACE,MAAO,IAAA,GAAA,IAAI,WAAW,CAAC,CAAA,CAAA;AAAA,GAC3B;AACA,EAAO,OAAA,MAAA,CAAO,KAAK,IAAI,CAAA,CAAA;AACzB,CAAA;AAKA,SAAS,UAAA,CAAW,MAAgB,QAA8B,EAAA;AAChE,EAAA,MAAM,WAAW,QAAW,GAAA,CAAA,CAAA;AAC5B,EAAM,MAAA,GAAA,GAAM,IAAI,UAAA,CAAW,QAAQ,CAAA,CAAA;AACnC,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAA,MAAM,KAAK,QAAW,GAAA,CAAA,GAAI,IAAK,CAAA,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AAC5C,IAAI,IAAA,EAAA,IAAM,KAAK,EAAK,GAAA,QAAA,MAAc,EAAE,CAAA,IAAK,KAAK,GAAM,GAAA,CAAA,CAAA;AAAA,GACtD;AACA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAMA,SAAS,cAAA,CAAe,QAAgB,KAA2B,EAAA;AACjE,EAAA,MAAM,IAAI,KAAQ,GAAA,MAAA,CAAA;AAClB,EAAA,MAAM,IAAI,KAAQ,GAAA,KAAA,CAAA;AAClB,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,IAAK,CAAA,KAAA,GAAQ,CAAC,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,IAAK,CAAA,CAAC,CAAC,CAAA,CAAA;AAC5D,CAAA;AAGA,SAAS,UAAA,CAAW,KAAgB,SAA2B,EAAA;AAC7D,EAAM,MAAA,CAAA,GAAI,IAAI,MAAS,GAAA,SAAA,GAAY,IAAI,KAAM,CAAA,CAAA,EAAG,SAAS,CAAI,GAAA,GAAA,CAAA;AAC7D,EAAA,MAAM,IAAI,CAAE,CAAA,MAAA,CAAA;AACZ,EAAA,IAAI,CAAI,GAAA,CAAA,CAAA;AACR,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,GAAI,CAAG,EAAA,CAAA,IAAK,GAAG,CAAK,EAAA,EAAA;AAC/B,IAAA,IAAI,EAAE,CAAC,CAAA,EAAQ,CAAA,IAAA,CAAA,IAAM,IAAI,CAAI,GAAA,CAAA,CAAA;AAAA,GAC/B;AACA,EAAI,IAAA,CAAA,GAAI,SAAW,EAAA,CAAA,KAAM,SAAY,GAAA,CAAA,CAAA;AACrC,EAAO,OAAA,CAAA,CAAA;AACT,CAAA;AAQA,SAAS,sBAAqC,GAAA;AAC5C,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,IAAM,EAAA,CAAA;AAAA;AAAA,IACN,GAAK,EAAA,CAAA;AAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA;AAAA,IACL,IAAM,EAAA,CAAA;AAAA;AAAA,IACN,GAAK,EAAA,CAAA;AAAA;AAAA,IACL,IAAM,EAAA,CAAA;AAAA;AAAA,IACN,IAAM,EAAA,CAAA;AAAA;AAAA,GACR,CAAA;AACA,EAAA,MAAM,OAAO,MAAO,CAAA,MAAA,CAAO,MAAM,CAC9B,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAA,CAAE,QAAS,CAAA,CAAC,EAAE,QAAS,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA,CACzC,KAAK,EAAE,CAAA,CAAA;AACV,EAAA,OAAO,IAAK,CAAA,QAAA,CAAS,IAAM,EAAA,CAAC,CAAC,CAAA,CAAA;AAC/B,CAAA;AAKA,MAAM,aAAwC,GAAA;AAAA,EAC5C,kBAAoB,EAAA,CAAA;AAAA,EACpB,mBAAqB,EAAA,CAAA;AAAA,EACrB,iBAAmB,EAAA,CAAA;AAAA,EACnB,qBAAuB,EAAA,CAAA;AAAA,EACvB,qBAAuB,EAAA,CAAA;AAAA,EACvB,eAAiB,EAAA,CAAA;AACnB,CAAA,CAAA;AAMA,SAAS,gBAAgB,EAAiD,EAAA;AACxE,EAAA,MAAM,YAAoE,GAAA;AAAA,IACxE,kBAAoB,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA;AAAA,IAC7C,iBAAmB,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA;AAAA,IAC5C,qBAAuB,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA;AAAA,IAChD,gBAAkB,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA;AAAA,IAC3C,mBAAqB,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA;AAAA,IAC9C,qBAAuB,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA;AAAA,IAChD,eAAiB,EAAA,EAAE,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAE,EAAA;AAAA,IAC3C,YAAc,EAAA,EAAE,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAE,EAAA;AAAA,IACxC,eAAiB,EAAA,EAAE,MAAQ,EAAA,CAAA,EAAG,SAAS,CAAE,EAAA;AAAA,IACzC,eAAiB,EAAA,EAAE,MAAQ,EAAA,GAAA,EAAK,SAAS,CAAE,EAAA;AAAA,IAC3C,GAAK,EAAA,EAAE,MAAQ,EAAA,CAAA,EAAG,SAAS,CAAE,EAAA;AAAA,GAC/B,CAAA;AAEA,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,uBAAU,IAAK,EAAA,CAAA;AACrB,IAAA,MAAM,MAAM,IAAI,IAAA,CAAK,IAAI,WAAY,EAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC5C,IAAA,MAAM,MAAM,IAAI,IAAA,CAAK,IAAI,WAAY,EAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAE5C,IAAM,MAAA,SAAA,GAAY,CAAC,IAAA,EAAY,IAAiB,KAAA;AAC9C,MAAM,MAAA,GAAA,GAAM,IAAI,IAAA,CAAK,IAAK,CAAA,cAAA,CAAe,SAAS,EAAE,QAAA,EAAU,KAAM,EAAC,CAAC,CAAA,CAAA;AACtE,MAAM,MAAA,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAK,CAAA,cAAA,CAAe,SAAS,EAAE,QAAA,EAAU,IAAK,EAAC,CAAC,CAAA,CAAA;AACvE,MAAA,OAAA,CAAQ,GAAI,CAAA,OAAA,EAAY,GAAA,KAAA,CAAM,SAAa,IAAA,GAAA,CAAA;AAAA,KAC7C,CAAA;AAEA,IAAM,MAAA,aAAA,GAAgB,SAAU,CAAA,GAAA,EAAK,EAAE,CAAA,CAAA;AACvC,IAAM,MAAA,SAAA,GAAY,SAAU,CAAA,GAAA,EAAK,EAAE,CAAA,CAAA;AACnC,IAAM,MAAA,SAAA,GAAY,SAAU,CAAA,GAAA,EAAK,EAAE,CAAA,CAAA;AACnC,IAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,GAAI,CAAA,SAAA,GAAY,SAAS,CAAA,CAAA;AAEpD,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,IAAA,CAAK,KAAM,CAAA,aAAA,GAAgB,EAAE,CAAI,GAAA,GAAA;AAAA,MACzC,OAAS,EAAA,IAAA,CAAK,KAAM,CAAA,aAAA,GAAgB,EAAE,CAAI,GAAA,GAAA;AAAA,KAC5C,CAAA;AAAA,GACM,CAAA,MAAA;AACN,IAAA,OAAO,aAAa,EAAE,CAAA,IAAK,EAAE,MAAQ,EAAA,EAAA,EAAI,SAAS,CAAE,EAAA,CAAA;AAAA,GACtD;AACF,CAAA;AASA,SAAS,sBAAA,CACP,QACA,EAAA,OAAA,EACA,SACY,EAAA;AACZ,EAAM,MAAA,EAAA,GAAK,eAAgB,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAC3C,EAAA,MAAM,EAAE,IAAM,EAAA,cAAA,EAAgB,UAAY,EAAA,WAAA,EAAa,WACrD,GAAA,aAAA,CAAA;AAGF,EAAA,MAAM,cAAc,YAAa,CAAA,OAAA,CAAQ,SAAS,CAAA,EAAG,IAAI,QAAQ,CAAA,CAAA;AACjE,EAAM,MAAA,SAAA,GAAY,OAAO,EAAG,CAAA,CAAC,GAAG,EAAG,CAAA,WAAA,CAAY,MAAM,CAAA,EAAG,WAAW,CAAA,CAAA;AAEnE,EAAA,MAAM,MAAuB,GAAA;AAAA,IAC3B,WAAA,CAAY,CAAG,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA,IACtB,WAAA,CAAY,CAAG,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA,IACtB,YAAY,CAAG,EAAA,cAAA,EAAgB,QAAQ,OAAQ,CAAA,MAAM,GAAG,QAAQ,CAAA;AAAA;AAAA,IAChE,WAAY,CAAA,CAAA,EAAG,WAAa,EAAA,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAAA;AAAA,IACvD,WAAA;AAAA,MACE,CAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA;AAAA,QAEE,cAAe,CAAA,OAAA,CAAQ,WAAa,EAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,QAC1D,cAAe,CAAA,OAAA,CAAQ,YAAc,EAAA,OAAA,CAAQ,eAAe,CAAA;AAAA,OAC9D;AAAA,KACF;AAAA,IACA,WAAY,CAAA,CAAA,EAAG,UAAY,EAAA,OAAA,CAAQ,UAAU,CAAA;AAAA;AAAA,IAC7C,WAAY,CAAA,CAAA,EAAG,UAAY,EAAA,OAAA,CAAQ,mBAAmB,CAAA;AAAA;AAAA,IACtD,WAAY,CAAA,CAAA,EAAG,WAAa,EAAA,OAAA,CAAQ,mBAAmB,EAAE,CAAA;AAAA;AAAA,IACzD,WAAA,CAAY,GAAG,SAAW,EAAA,EAAA,CAAG,GAAG,MAAQ,EAAA,EAAA,CAAG,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,IAGnD,WAAA,CAAY,GAAG,SAAW,EAAA,EAAA,CAAG,GAAM,GAAM,EAAA,EAAA,EAAM,GAAM,EAAA,GAAI,CAAC,CAAA;AAAA;AAAA;AAAA,IAG1D,WAAA,CAAY,IAAI,SAAW,EAAA,EAAA,CAAG,GAAM,GAAM,EAAA,GAAA,EAAM,CAAM,EAAA,CAAI,CAAC,CAAA;AAAA,IAC3D,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAO,CAAA,EAAA,CAAG,EAAE,CAAA,EAAG,WAAW,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,KACtD;AAAA,IACA,WAAA,CAAY,EAAI,EAAA,SAAA,EAAW,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,IAGpC,YAAY,EAAI,EAAA,cAAA,EAAgB,OAAQ,CAAA,UAAU,GAAG,QAAQ,CAAA;AAAA,IAC7D,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAA,CAAO,EAAG,CAAA,CAAC,CAAG,EAAA,UAAA,CAAW,CAAC,CAAA,EAAG,CAAG,EAAA,CAAC,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA,KACxC;AAAA;AAAA,IAEA,WAAA,CAAY,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,IAGvB,YAAY,EAAI,EAAA,cAAA,EAAgB,OAAQ,CAAA,UAAU,GAAG,QAAQ,CAAA;AAAA,IAC7D,YAAY,EAAI,EAAA,cAAA,EAAgB,QAAQ,OAAQ,CAAA,WAAW,GAAG,QAAQ,CAAA;AAAA;AAAA,IACtE,WAAA;AAAA,MACE,EAAA;AAAA,MACA,cAAA;AAAA;AAAA,MACA,QAAQ,wBAAwB,CAAA;AAAA,MAChC,QAAA;AAAA,KACF;AAAA,IACA,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,WAAW,EAAC,EAAG,CAAC,CAAC,CAAA;AAAA,KACjC;AAAA,IACA,WAAA,CAAY,EAAI,EAAA,UAAA,EAAY,EAAE,CAAA;AAAA;AAAA;AAAA,IAE9B,WAAA,CAAY,EAAI,EAAA,UAAA,EAAY,KAAK,CAAA;AAAA;AAAA,IACjC,WAAA,CAAY,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA,IACvB,WAAA,CAAY,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA,IACvB,WAAA,CAAY,EAAI,EAAA,UAAA,EAAY,IAAI,CAAA;AAAA;AAAA,IAChC,WAAY,CAAA,EAAA,EAAI,SAAW,EAAA,EAAA,CAAG,CAAI,CAAC,CAAA;AAAA;AAAA,IACnC,WAAA,CAAY,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,IAGvB,WAAA,CAAY,IAAI,SAAW,EAAA,EAAA,CAAG,IAAM,GAAM,EAAA,GAAA,EAAM,GAAM,EAAA,GAAI,CAAC,CAAA;AAAA,IAC3D,WAAY,CAAA,EAAA,EAAI,SAAW,EAAA,sBAAA,EAAwB,CAAA;AAAA;AAAA,GACrD,CAAA;AAEA,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,GAAG,MAAM,CAAA,CAAA;AAC7B,EAAA,MAAM,WAAY,CAAI,GAAA,OAAA,CAAQ,MAAW,KAAA,CAAA,GAAM,KAAK,MAAO,CAAA,MAAA,CAAA;AAC3D,EAAA,OAAO,MAAO,CAAA,EAAA,CAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AACjC,CAAA;AASA,SAAS,uBAAA,CACP,SACA,QACY,EAAA;AACZ,EAAA,MAAM,EAAE,IAAM,EAAA,cAAA,EAAgB,UAAY,EAAA,MAAA,EAAQ,WAAc,GAAA,aAAA,CAAA;AAGhE,EAAA,MAAM,gBACJ,OAAQ,CAAA,QAAA,IAAY,gBAChB,WAAY,CAAA,CAAA,EAAG,MAAM,aAAc,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,GACpD,YAAY,CAAG,EAAA,cAAA,EAAgB,QAAQ,OAAQ,CAAA,QAAQ,GAAG,QAAQ,CAAA,CAAA;AAExE,EAAA,MAAM,MAAuB,GAAA;AAAA,IAC3B,WAAA,CAAY,CAAG,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AAAA,IACtB,aAAA;AAAA;AAAA,IACA,WAAA;AAAA,MACE,CAAA;AAAA,MACA,cAAA;AAAA;AAAA,MACA,QAAQ,CAAG,EAAA,OAAA,CAAQ,MAAM,CAAI,CAAA,EAAA,OAAA,CAAQ,QAAQ,CAAE,CAAA,CAAA;AAAA,MAC/C,QAAA;AAAA,KACF;AAAA,IACA,WAAA,CAAY,CAAG,EAAA,UAAA,EAAY,CAAC,CAAA;AAAA;AAAA,IAC5B,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAA,CAAO,EAAG,CAAA,CAAC,CAAG,EAAA,UAAA,CAAW,CAAC,CAAA,EAAG,CAAG,EAAA,CAAC,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA,KACxC;AAAA,IACA,WAAA,CAAY,EAAI,EAAA,UAAA,EAAY,EAAE,CAAA;AAAA;AAAA,IAC9B,YAAY,EAAI,EAAA,SAAA,EAAW,GAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAAA,IACtC,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAO,CAAA,EAAA,CAAG,EAAI,CAAA,EAAG,UAAW,CAAA,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,KACnD;AAAA,IACA,WAAA,CAAY,EAAI,EAAA,MAAA,EAAQ,CAAC,CAAA;AAAA;AAAA,IACzB,WAAA,CAAY,IAAI,SAAW,EAAA,EAAA,CAAG,GAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAAA,IACzC,YAAY,EAAI,EAAA,cAAA,EAAgB,QAAQ,OAAQ,CAAA,MAAM,GAAG,QAAQ,CAAA;AAAA;AAAA,IACjE,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,WAAW,CAAC,CAAC,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA,KAClC;AAAA,IACA,WAAA;AAAA,MACE,EAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,KAAK,OAAQ,CAAA,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAAA,KACvC;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,GAAG,MAAM,CAAA,CAAA;AAC7B,EAAA,MAAM,WAAY,CAAI,GAAA,OAAA,CAAQ,OAAY,KAAA,CAAA,GAAM,KAAK,MAAO,CAAA,MAAA,CAAA;AAC5D,EAAA,OAAO,MAAO,CAAA,EAAA,CAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AACjC,CAAA;AAQA,SAAS,uBAAuB,QAA8B,EAAA;AAC5D,EAAA,MAAM,MAAS,GAAA,IAAI,IAAK,CAAA,QAAQ,EAAE,aAAc,EAAA,CAAA;AAEhD,EAAA,MAAM,MAAuB,GAAA;AAAA,IAC3B,WAAA,CAAY,CAAG,EAAA,CAAA,mBAA0B,CAAC,CAAA;AAAA;AAAA,IAC1C,WAAA,CAAY,CAAG,EAAA,CAAA,mBAA0B,MAAM,CAAA;AAAA;AAAA,GACjD,CAAA;AAEA,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,GAAG,MAAM,CAAA,CAAA;AAC7B,EAAA,MAAM,WAAY,CAAI,GAAA,OAAA,CAAQ,MAAW,KAAA,CAAA,GAAM,KAAK,MAAO,CAAA,MAAA,CAAA;AAC3D,EAAA,OAAO,MAAO,CAAA,EAAA,CAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA;AACjC,CAAA;AAKA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAO,EAAA,CAAA;AAAA,EACP,KAAO,EAAA,CAAA;AAAA,EACP,IAAM,EAAA,CAAA;AAAA,EACN,cAAgB,EAAA,EAAA;AAAA,EAChB,SAAW,EAAA,EAAA;AAAA,EACX,UAAY,EAAA,EAAA;AAAA,EACZ,UAAY,EAAA,EAAA;AAAA,EACZ,MAAQ,EAAA,EAAA;AACV,CAAA,CAAA;AAGA,MAAM,eAAkB,GAAA,GAAA,CAAA;AAGxB,MAAM,cAAiB,GAAA,EAAA,CAAA;AAMvB,SAAS,gBAA+B,GAAA;AACtC,EAAA,MAAM,YAAe,GAAA;AAAA,IACnB,SAAU,CAAA,SAAA;AAAA,IACV,SAAU,CAAA,cAAA;AAAA,IACV,SAAU,CAAA,UAAA;AAAA,IACV,SAAU,CAAA,UAAA;AAAA,IACV,SAAU,CAAA,MAAA;AAAA,GACZ,CAAA;AACA,EAAA,MAAM,cAA2B,GAAA;AAAA,IAC/B,SAAU,CAAA,KAAA;AAAA,IACV,SAAU,CAAA,IAAA;AAAA,IACV,SAAU,CAAA,KAAA;AAAA,GACZ,CAAA;AACA,EAAA,MAAM,SAAY,GAAA,CAAC,GAAG,YAAA,EAAc,GAAG,cAAc,CAAA,CAAA;AAErD,EAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC5B,EAAA,MAAM,aAAuB,EAAC,CAAA;AAE9B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,EAAO,CAAK,EAAA,EAAA;AAC9B,IAAA,MAAM,UAAU,SAAU,CAAA,OAAA,CAAQ,GAAG,SAAU,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAC1D,IAAI,IAAA,cAAA,CAAe,QAAS,CAAA,OAAO,CAAG,EAAA;AACpC,MAAW,UAAA,CAAA,IAAA,CAAK,UAAU,eAAe,CAAA,CAAA;AACzC,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA,CAAA;AAAA,KACzB,MAAA;AACL,MAAA,UAAA,CAAW,KAAK,OAAO,CAAA,CAAA;AAAA,KACzB;AAAA,GACF;AAGA,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,EAAA,CAAG,CAAC,CAAA,EAAG,IAAK,CAAA,KAAK,CAAG,EAAA,IAAI,UAAW,CAAA,UAAU,CAAC,CAAA,CAAA;AACnE,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAM,CAAA,MAAM,GAAG,KAAK,CAAA,CAAA;AACzC,CAAA;AAQA,SAAS,uBAAsC,GAAA;AAG7C,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,KAAK,CAAA,CAAA;AACtC,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,IAAA,CAAA;AACX,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,IAAA,CAAA;AACX,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,IAAA,CAAA;AACX,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,IAAA,CAAA;AACX,EAAA,KAAA,CAAM,CAAC,CAAI,GAAA,IAAA,CAAA;AACX,EAAA,KAAA,CAAM,EAAE,CAAI,GAAA,IAAA,CAAA;AACZ,EAAA,KAAA,CAAM,EAAE,CAAI,GAAA,IAAA,CAAA;AAEZ,EAAM,MAAA,UAAA,GAAa,UAAW,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AAEvC,EAAA,MAAM,OAAW,GAAA,CAAA,IAAK,EAAO,GAAA,CAAA,IAAK,KAAO,KAAQ,GAAA,UAAA,CAAA;AACjD,EAAO,OAAA,EAAA,CAAI,YAAY,EAAM,GAAA,GAAA,EAAO,YAAY,CAAK,GAAA,GAAA,EAAM,UAAU,GAAI,CAAA,CAAA;AAC3E,CAAA;AAGA,MAAM,OAAU,GAAA,CAAA,CAAA,CAAA;AAOhB,SAAS,iBAAgC,GAAA;AAEvC,EAAA,MAAM,OAAoB,GAAA;AAAA;AAAA,IAExB,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,OAAA;AAAA;AAAA,IACA,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,OAAA;AAAA;AAAA,IACA,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,OAAA;AAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,CAAA;AAAA;AAAA;AAAA,IAGA,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,SAAA,CAAU,GAAG,EAAE,CAAA;AAAA;AAAA,IACf,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,IAGd,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA;AAAA;AAAA,IAGA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA;AAAA,IAClB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA;AAAA,IAClB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,CAAA;AAAA,IACA,CAAA;AAAA;AAAA;AAAA,IAGA,OAAA;AAAA,IACA,OAAA;AAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA;AAAA;AAAA,IAGA,CAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA;AAAA;AAAA,IAGA,CAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,IAGd,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA,IAChB,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA;AAAA;AAAA,IAGhB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA,IACd,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,IAGd,CAAA;AAAA;AAAA,IACA,CAAA;AAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AACzC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,QAAQ,CAAK,EAAA,EAAA;AACvC,IAAI,GAAA,CAAA,CAAC,CAAI,GAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,UAAU,CAAI,GAAA,cAAA,CAAe,OAAQ,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GACjE;AACA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAMA,SAAS,gBAA+B,GAAA;AACtC,EAAA,MAAM,MAAmB,GAAA;AAAA,IACvB,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA;AAAA,IAChB,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA;AAAA,IACZ,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA;AAAA,IACZ,CAAA;AAAA;AAAA,IACA,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA;AAAA,IACZ,CAAA;AAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA;AAAA,IACZ,OAAA,CAAQ,GAAG,EAAE,CAAA;AAAA;AAAA,IACb,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA;AAAA,GACd,CAAA;AAEA,EAAO,OAAA,MAAA,CAAO,IAAI,UAAW,CAAA,MAAM,GAAG,EAAG,CAAA,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AACzD,CAAA;AAGA,SAAS,mBAAkC,GAAA;AACzC,EAAO,OAAA,MAAA;AAAA,IACL,uBAAwB,EAAA;AAAA,IACxB,iBAAkB,EAAA;AAAA,IAClB,gBAAiB,EAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAIA,SAAS,gBAAA,CACP,IACA,EAAA,YAAA,EACA,QACY,EAAA;AACZ,EAAA,MAAM,SAAY,GAAA,OAAA,CAAQ,wBAAyB,CAAA,QAAQ,CAAC,CAAA,CAAA;AAC5D,EAAM,MAAA,OAAA,GAAU,KAAK,WAAW,CAAA,CAAA;AAChC,EAAM,MAAA,OAAA,GAAU,QAAQ,YAAY,CAAA,CAAA;AACpC,EAAM,MAAA,SAAA,GAAY,QAAQ,IAAI,CAAA,CAAA;AAC9B,EAAA,OAAO,MAAO,CAAA,SAAA,EAAW,OAAS,EAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AACtD,CAAA;AAagB,SAAA,wBAAA,CACd,WACA,eAIA,EAAA;AACA,EAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA,CAAA;AAIrB,EAAA,MAAM,OAAU,GAAA,EAAE,GAAG,eAAA,EAAiB,GAAG,eAAgB,EAAA,CAAA;AAGzD,EAAM,MAAA,QAAA,GAAW,MAAM,SAAU,CAAA,CAAA,GAAI,KAAK,GAAM,EAAA,EAAA,GAAK,KAAK,GAAI,CAAA,CAAA;AAE9D,EAAAF,KAAA,CAAI,sCAAsC,CAAA,CAAA;AAG1C,EAAA,MAAM,QAAW,GAAA,sBAAA,CAAuB,QAAU,EAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AACpE,EAAM,MAAA,SAAA,GAAY,uBAAwB,CAAA,OAAA,EAAS,QAAQ,CAAA,CAAA;AAC3D,EAAM,MAAA,QAAA,GAAW,uBAAuB,QAAQ,CAAA,CAAA;AAChD,EAAA,MAAM,WAAW,gBAAiB,EAAA,CAAA;AAClC,EAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AAGvC,EAAA,MAAM,eAAkB,GAAA,MAAA;AAAA,IACtB,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAG,GAAI,CAAA;AAAA,GACT,CAAA;AAGA,EAAM,MAAA,QAAA,GAAW,KAAK,GAAI,EAAA,CAAA;AAC1B,EAAM,MAAA,YAAA,GAAe,yBAAyB,QAAQ,CAAA,CAAA;AACtD,EAAA,MAAM,QAAW,GAAA,YAAA;AAAA,IACf,YAAA;AAAA,IACA,CAAA;AAAA,IACA,aAAa,CAAC,CAAA;AAAA,IACd,eAAA;AAAA,GACF,CAAA;AAGA,EAAA,MAAM,SAAY,GAAA,KAAA,CAAM,cAAe,CAAA,EAAE,CAAC,CAAA,CAAA;AAC1C,EAAA,MAAM,mBAAsB,GAAA,MAAA,CAAO,OAAQ,CAAA,YAAY,GAAG,QAAQ,CAAA,CAAA;AAClE,EAAA,MAAM,QAAW,GAAA,YAAA;AAAA,IACf,SAAA;AAAA,IACA,CAAA;AAAA,IACA,UAAU,CAAC,CAAA;AAAA,IACX,mBAAA;AAAA,GACF,CAAA;AAGA,EAAA,MAAM,MAAS,GAAA,gBAAA,CAAiB,SAAW,EAAA,iBAAA,EAAmB,QAAQ,CAAA,CAAA;AAGtE,EAAM,MAAA,SAAA,GAAY,MAAO,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AACzC,EAAM,MAAA,SAAA,GAAY,YAAa,CAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAGnD,EAAM,MAAA,YAAA,GAAe,SAAU,CAAA,MAAA,GAAS,SAAU,CAAA,MAAA,CAAA;AAClD,EAAA,MAAM,YAAY,MAAO,CAAA,EAAA,CAAG,aAAe,EAAA,YAAY,GAAG,SAAS,CAAA,CAAA;AAGnE,EAAA,MAAM,UAAa,GAAA,cAAA,CAAe,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA;AACtC,EAAM,MAAA,QAAA,GAAY,SAAU,CAAA,MAAA,GAAS,CAAK,GAAA,GAAA,CAAA;AAC1C,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,SAAW,EAAA,EAAA,CAAG,QAAQ,CAAC,CAAA,CAAA;AACnD,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,YAAc,EAAA,EAAA,CAAG,UAAU,CAAC,CAAA,CAAA;AACnD,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,EAAG,CAAA,UAAU,GAAG,KAAK,CAAA,CAAA;AAGjD,EAAM,MAAA,KAAA,GAAQ,UAAU,YAAY,CAAA,CAAA;AAEpC,EAAAA,KAAA;AAAA,IACE,CAA2B,wBAAA,EAAA,KAAA,CAAM,MAAM,CAAA,cAAA,EAAiB,SAAU,CAAA,SAAA;AAAA,MAChE,CAAA;AAAA,MACA,CAAA;AAAA,KACD,CAAA,GAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAO,OAAA,EAAE,KAAO,EAAA,IAAA,EAAM,SAAU,EAAA,CAAA;AAClC;;AC7lCA,MAAMA,KAAA,GAAM,MAAM,0BAA0B,CAAA,CAAA;AAOtB,eAAA,eAAA,CACpB,WACA,OACA,EAAA;AAEA,EAAA,IAAI,mBAA6B,EAAC,CAAA;AAElC,EAAI,IAAA,OAAO,OAAQ,CAAA,YAAA,KAAiB,UAAY,EAAA;AAC9C,IAAA,gBAAA,GAAmB,QAAQ,YAAa,EAAA,CAAA;AAAA,GACnC,MAAA;AAEL,IAAM,MAAA,eAAA,GAAkB,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AAChD,IAAA,IAAI,eAAiB,EAAA;AAEnB,MAAmB,gBAAA,GAAA,SAAA,CAAU,mBAAmB,eAAe,CAAA,CAAA;AAAA,KACjE;AAAA,GACF;AAEA,EAAI,IAAA,gBAAA,CAAiB,SAAS,CAAG,EAAA;AAC/B,IAAA,KAAA,MAAW,aAAa,gBAAkB,EAAA;AACxC,MAAM,MAAA,MAAA,GAAS,MAAO,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AACrC,MAAA,IAAI,CAAC,MAAQ,EAAA;AACX,QAAAA,KAAA,CAAI,2BAA2B,SAAU,CAAA,SAAA,CAAU,CAAG,EAAA,GAAG,CAAC,CAAE,CAAA,CAAA,CAAA;AAC5D,QAAA,SAAA;AAAA,OACF;AAIA,MACE,IAAA,MAAA,CAAO,WAAW,CACjB,IAAA,MAAA,CAAO,WAAW,MAAO,CAAA,OAAA,mBAAc,IAAA,IAAA,EACxC,EAAA;AACA,QAAI,IAAA,MAAA,CAAO,QAAQ,KAAO,EAAA;AACxB,UAAAA,KAAA,CAAI,CAA6C,2CAAA,CAAA,CAAA,CAAA;AAAA,SACnD;AACA,QAAA,SAAA;AAAA,OACF;AAEA,MAAI,IAAA;AACF,QAAM,MAAA,GAAA,GAAM,CAAG,EAAA,MAAA,CAAO,MAAS,GAAA,OAAA,GAAU,MAAM,CAAA,GAAA,EAAM,MAAO,CAAA,MAAM,CAChE,EAAA,MAAA,CAAO,IACT,CAAA,CAAA,CAAA;AACA,QAAM,MAAA,SAAA,CAAU,SAAU,CAAA,MAAA,EAAQ,GAAG,CAAA,CAAA;AACrC,QAAI,IAAA,MAAA,CAAO,QAAQ,KAAO,EAAA;AACxB,UAAAA,KAAA;AAAA,YACE,CAAA,wCAAA,EAA2C,OAAO,KAAM,CAAA,SAAA;AAAA,cACtD,CAAA;AAAA,cACA,EAAA;AAAA,aACD,CAAA,GAAA,CAAA;AAAA,WACH,CAAA;AAAA,SACF;AAAA,eACO,GAAK,EAAA;AAEZ,QAAAA,KAAA,CAAI,CAAwB,qBAAA,EAAA,MAAA,CAAO,GAAG,CAAA,EAAA,EAAK,GAAG,CAAE,CAAA,CAAA,CAAA;AAChD,QAAI,IAAA,MAAA,CAAO,QAAQ,KAAO,EAAA;AACxB,UAAIA,KAAA,CAAA,CAAA,iCAAA,EAAoC,GAAG,CAAE,CAAA,CAAA,CAAA;AAAA,SAC/C;AAAA,OACF;AAAA,KACF;AAAA,GACF,MAAA,IAAW,OAAO,QAAA,KAAa,WAAa,EAAA;AAC1C,IAAA,KAAA,MAAW,MAAU,IAAA,QAAA,CAAS,MAAO,CAAA,KAAA,CAAM,GAAG,CAAG,EAAA;AAC/C,MAAM,MAAA,UAAA,GAAa,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACtC,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,MAAM,UAAU,SAAU,CAAA,UAAA,EAAY,QAAS,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,OACpE;AAAA,KACF;AAAA,GACF;AACF;;AC7EA,MAAMA,KAAA,GAAM,MAAM,sBAAsB,CAAA,CAAA;AAExC,IAAI,SAA2B,GAAA,IAAA,CAAA;AAE/B,eAAe,SAA6B,GAAA;AAC1C,EAAA,IAAI,aAAa,IAAM,EAAA;AACrB,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AAIA,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,IAAAA,KAAA,CAAI,6DAA6D,CAAA,CAAA;AACjE,IAAA,MAAM,EAAE,SAAA,EAAc,GAAA,MAAM,OAAO,QAAQ,CAAA,CAAA;AAE3C,IAAY,SAAA,GAAA,SAAA,CAAA;AAEZ,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AACA,EAAY,SAAA,GAAA,MAAA,CAAA;AACZ,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEA,eAAe,OAAO,OAAsC,EAAA;AAC1D,EAAA,MAAM,SAAY,GAAA,IAAI,WAAY,EAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AAClD,EAAMG,MAAAA,OAAAA,GAAS,MAAM,SAAU,EAAA,CAAA;AAC/B,EAAA,MAAM,aAAa,MAAMA,OAAAA,CAAO,MAAO,CAAA,MAAA,CAAO,WAAW,SAAS,CAAA,CAAA;AAClE,EAAO,OAAA,IAAI,WAAW,UAAU,CAAA,CAAA;AAClC,CAAA;AAGA,SAAS,QAAQ,MAA6B,EAAA;AAC5C,EAAO,OAAA,CAAC,GAAG,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA,CAC9B,IAAI,CAAC,CAAA,KAAM,EAAE,QAAS,CAAA,EAAE,EAAE,QAAS,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA,CAAA;AACZ,CAAA;AAGO,MAAM,mBAAoB,CAAA;AAAA,EAC/B,YAA6B,IAAc,EAAA;AAAd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AAAA,GAAe;AAAA,EAE5C,MAAc,UAAU,OAAsC,EAAA;AAC5D,IAAA,MAAM,QAAW,GAAA,CAAA,EAAG,IAAK,CAAA,IAAI,GAAG,OAAO,CAAA,CAAA,CAAA;AACvC,IAAM,MAAA,MAAA,GAAS,MAAM,MAAA,CAAO,QAAQ,CAAA,CAAA;AACpC,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,cAAe,CAAA,SAAA,EAAmB,OAAkC,EAAA;AACxE,IAAIH,KAAA,CAAA,CAAA,kCAAA,EAAqC,OAAO,CAAE,CAAA,CAAA,CAAA;AAClD,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AACxC,IAAMG,MAAAA,OAAAA,GAAS,MAAM,SAAU,EAAA,CAAA;AAC/B,IAAA,MAAM,QAAQA,OAAO,CAAA,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA;AACvD,IAAM,MAAA,MAAA,GAAS,MAAMA,OAAAA,CAAO,MAAO,CAAA,SAAA;AAAA,MACjC,KAAA;AAAA,MACA,GAAA;AAAA,MACA,EAAE,MAAM,SAAU,EAAA;AAAA,MAClB,KAAA;AAAA,MACA,CAAC,SAAS,CAAA;AAAA,KACZ,CAAA;AACA,IAAM,MAAA,SAAA,GAAY,MAAMA,OAAAA,CAAO,MAAO,CAAA,OAAA;AAAA,MACpC;AAAA,QACE,IAAM,EAAA,SAAA;AAAA,QACN,EAAI,EAAA,KAAA;AAAA,OACN;AAAA,MACA,MAAA;AAAA,MACA,IAAI,WAAA,EAAc,CAAA,MAAA,CAAO,SAAS,CAAA;AAAA,KACpC,CAAA;AAGA,IAAA,MAAM,WAAW,IAAI,UAAA,CAAW,KAAM,CAAA,MAAA,GAAS,UAAU,UAAU,CAAA,CAAA;AACnE,IAAA,QAAA,CAAS,IAAI,KAAK,CAAA,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG,MAAM,MAAM,CAAA,CAAA;AACpD,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAEtC,IAAAH,KAAA,CAAI,CAAsC,mCAAA,EAAA,OAAO,CAAK,EAAA,EAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAE9D,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEA,MAAM,WACJ,GAAA,kEAAA,CAAA;AAEF,SAAS,SAAoB,GAAA;AAC3B,EAAM,MAAA,SAAA,GAAY,KAAK,GAAI,EAAA,CAAA;AAC3B,EAAA,OAAO,KAAK,SAAU,CAAA;AAAA,IACpB,oBAAsB,EAAA;AAAA,MACpB,aAAe,EAAA,MAAA;AAAA,MACf,SACE,EAAA,iHAAA;AAAA,MACF,SAAW,EAAA,OAAA;AAAA,KACb;AAAA,IACA,UAAY,EAAA,SAAA;AAAA,GACb,CAAA,CAAA;AACH,CAAA;AAEA,eAAsB,mBAAmB,OAAkC,EAAA;AACzE,EAAM,MAAA,SAAA,GAAY,IAAI,mBAAA,CAAoB,WAAW,CAAA,CAAA;AACrD,EAAA,MAAM,YAAY,SAAU,EAAA,CAAA;AAC5B,EAAO,OAAA,SAAA,CAAU,cAAe,CAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AACpD;;AClFA,MAAMA,KAAA,GAAM,MAAM,sBAAsB,CAAA,CAAA;AAyGxC,SAAS,aAAA,CACP,SACA,SACc,EAAA;AACd,EAAO,OAAA,OAAO,OAAO,IAAS,KAAA;AAC5B,IAAA,MAAM,YAAa,MAAM,SAAA,EAAW,OAAU,GAAA,KAAA,EAAO,IAAI,CAAM,IAAA;AAAA,MAC7D,KAAA;AAAA,MACA,IAAA;AAAA,KACF,CAAA;AACA,IAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAG,SAAS,CAAA,CAAA;AACtC,IAAA,OAAQ,MAAM,SAAA,EAAW,QAAW,GAAA,GAAG,CAAM,IAAA,GAAA,CAAA;AAAA,GAC/C,CAAA;AACF,CAAA;AAKO,MAAM,gBAAwC,CAAA;AAAA,EASnD,WAAA,CACE,aACS,OACT,EAAA;AADS,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AAET,IAAA,IAAA,CAAK,QAAQ,aAAc,CAAA,OAAA,EAAS,KAAS,IAAA,KAAA,EAAO,SAAS,SAAS,CAAA,CAAA;AACtE,IAAA,IAAA,CAAK,iBACH,GAAA,OAAA,EAAS,iBAAqB,IAAA,IAAI,wBAAyB,EAAA,CAAA;AAC7D,IAAA,IAAA,CAAK,WAAc,GAAA,WAAA,CAAA;AACnB,IAAK,IAAA,CAAA,GAAA,GAAM,IAAI,SAAU,EAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,MAAM,YAAY,KAAsC,EAAA;AACtD,IAAM,MAAA,IAAA,CAAK,iBAAkB,CAAA,WAAA,CAAY,KAAK,CAAA,CAAA;AAAA,GAChD;AAAA,EAEA,SAAuB,GAAA;AACrB,IAAA,OAAO,IAAK,CAAA,GAAA,CAAA;AAAA,GACd;AAAA,EAEA,UAA+B,GAAA;AAC7B,IAAO,OAAA,OAAA,CAAQ,QAAQ,KAAK,CAAA,CAAA;AAAA,GAC9B;AAAA;AAAA,EAGA,KAAA,CAAM,SAAmB,EAAA,SAAA,EAAmB,MAAgC,EAAA;AAC1E,IAAA,OAAO,KAAK,gBAAiB,EAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAAwB,GAAA;AACtB,IAAA,IAAA,CAAK,WAAY,EAAA,CAAA;AACjB,IAAK,IAAA,CAAA,GAAA,GAAM,IAAI,SAAU,EAAA,CAAA;AACzB,IAAA,OAAO,QAAQ,OAAQ,EAAA,CAAA;AAAA,GACzB;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAO,IAAK,CAAA,UAAA,CAAA;AACZ,IAAA,OAAO,IAAK,CAAA,cAAA,CAAA;AAAA,GACd;AAAA,EAEA,QAAoB,GAAA;AAClB,IAAA,OAAO,KAAK,UAAc,IAAA,IAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,eAA+B,GAAA;AAC7B,IAAI,IAAA,IAAA,CAAK,kBAAkB,IAAM,EAAA;AAC/B,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAI,IAAK,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AAAA,GACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAgB,sBACd,CAAA,OAAA,EACA,mBACe,EAAA;AACf,IAAM,MAAA,UAAA,GAAa,uBAAuB,IAAK,CAAA,WAAA,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAI,CAAA,eAAA,EAAiB,CAAU,OAAA,EAAA,UAAU,CAAE,CAAA,CAAA,CAAA;AAInD,IAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,MAAI,IAAA,IAAA,CAAK,cAAgB,EAAA;AACvB,QAAA,MAAM,KAAK,gBAAiB,EAAA,CAAA;AAAA,OAC9B;AAEA,MAAA,IAAI,KAAK,UAAY,EAAA;AACnB,QAAQ,OAAA,CAAA,GAAA,CAAI,eAAiB,EAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,OAC9C;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,EAAU,MAAM,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAAA,GACpD;AAAA,EAEA,MAAM,SAAA,CACJ,OACA,EAAA,GAAA,EACA,mBACe,EAAA;AACf,IAAM,MAAA,IAAA,CAAK,sBAAuB,CAAA,OAAA,EAAS,mBAAmB,CAAA,CAAA;AAE9D,IAAQ,OAAA,CAAA,GAAA,CAAI,cAAc,iBAAiB,CAAA,CAAA;AAG3C,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAI,CAAA,QAAQ,CAAG,EAAA;AAC1B,MAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,KAAK,CAAA,CAAA;AAAA,KAC7B;AACA,IAAQ,OAAA,CAAA,GAAA,CAAI,mBAAmB,gBAAgB,CAAA,CAAA;AAE/C,IAAQ,OAAA,CAAA,GAAA,CAAI,aAAa,gBAAgB,CAAA,CAAA;AACzC,IAAQ,OAAA,CAAA,GAAA,CAAI,oBAAoB,IAAI,CAAA,CAAA;AACpC,IAAQ,OAAA,CAAA,GAAA,CAAI,sBAAsB,WAAW,CAAA,CAAA;AAG7C,IAAQ,OAAA,CAAA,GAAA,CAAI,WAAW,gBAAgB,CAAA,CAAA;AAGvC,IAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,eAAe,CAAA,CAAA;AAIrC,IAAQ,OAAA,CAAA,GAAA,CAAI,kBAAkB,WAAW,CAAA,CAAA;AACzC,IAAQ,OAAA,CAAA,GAAA,CAAI,kBAAkB,MAAM,CAAA,CAAA;AACpC,IAAQ,OAAA,CAAA,GAAA,CAAI,kBAAkB,OAAO,CAAA,CAAA;AAGrC,IAAQ,OAAA,CAAA,GAAA,CAAI,YAAY,QAAQ,CAAA,CAAA;AAIhC,IAAA,IACE,CAAC,OAAA,CAAQ,GAAI,CAAA,cAAc,CAC1B,KAAA,GAAA,CAAI,QAAS,CAAA,oBAAoB,CAChC,IAAA,GAAA,CAAI,QAAS,CAAA,sBAAsB,CACrC,CAAA,EAAA;AACA,MAAQ,OAAA,CAAA,GAAA,CAAI,gBAAgB,kBAAkB,CAAA,CAAA;AAAA,KAChD;AAEA,IAAM,MAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA,CAAA;AAEnC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA,YAAA,EAAc,IAAM,EAAA;AACpC,MAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,OAAQ,EAAA,CAAA;AACnC,MAAA,IAAI,WAAW,IAAM,EAAA;AACnB,QAAM,MAAA,UAAA,GAAa,MAAM,kBAAA,CAAmB,OAAO,CAAA,CAAA;AACnD,QAAQ,OAAA,CAAA,GAAA,CAAI,sBAAsB,UAAU,CAAA,CAAA;AAAA,OAC9C;AAAA,KACF;AAAA,GACF;AAAA,EAEA,MAAM,iBAAiB,OAAiC,EAAA;AACtD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA,CAAA;AACtC,IAAA,MAAM,aAAa,OAAQ,CAAA,IAAA,CAAK,CAAC,MAAW,KAAA,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAA;AAChE,IAAA,IAAI,UAAY,EAAA;AACd,MAAQ,OAAA,CAAA,GAAA,CAAI,cAAgB,EAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,KAC9C;AAAA,GACF;AAAA,EAEA,MAAgB,SAAU,CAAA,GAAA,EAAa,KAA8B,EAAA;AACnE,IAAA,MAAM,SAAS,MAAO,CAAA,KAAA,CAAM,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,CAAA,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAA,MAAM,KAAK,GAAI,CAAA,SAAA,CAAU,MAAQ,EAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAEvD,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAS,QAAA,CAAA,MAAA,GAAS,OAAO,QAAS,EAAA,CAAA;AAAA,KACpC;AAAA,GACF;AAAA,EAEA,MAAa,UAAgC,GAAA;AAC3C,IAAA,OAAO,IAAK,CAAA,GAAA,CAAI,UAAW,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAAA,GACnD;AAAA,EAEA,MAAgB,eAAmC,GAAA;AACjD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA,CAAA;AACtC,IAAA,OAAO,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAA,KAAW,CAAG,EAAA,MAAA,CAAO,GAAG,CAAA,CAAA,EAAI,MAAO,CAAA,KAAK,CAAE,CAAA,CAAA,CAAE,KAAK,IAAI,CAAA,CAAA;AAAA,GAC3E;AAAA,EAEA,MAAgB,aAAa,GAA4B,EAAA;AAEvD,IAAM,MAAA,KAAA,GAA2B,KAAK,GAAI,CAAA,KAAA,CAAA;AAC1C,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,IAAI,UAAW,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAChE,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAA,IAAI,CAAC,MAAA,CAAO,MAAU,IAAA,CAAC,OAAO,IAAM,EAAA,SAAA;AACpC,MAAA,MAAM,MAAM,YAAa,CAAA,MAAA,CAAO,MAAQ,EAAA,MAAA,CAAO,MAAM,GAAG,CAAA,CAAA;AAExD,MAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,QAAS,QAAA,CAAA,MAAA,GAAS,GAAG,MAAO,CAAA,GAAG,sBAAsB,MAAO,CAAA,IAAI,CAAY,SAAA,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA;AAAA,OAC3F;AAAA,KACF;AAAA,GACF;AAAA,EAEQ,eAA0B,GAAA;AAChC,IAAA,OAAO,OAAO,QAAa,KAAA,WAAA,GACvB,QAAS,CAAA,QAAA,CAAS,UAClB,GAAA,eAAA,CAAA;AAAA,GACN;AAAA,EAEA,MAAgB,OAAkC,GAAA;AAChD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA,CAAA;AACtC,IAAA,MAAM,gBAAgB,OAAQ,CAAA,IAAA,CAAK,CAAC,MAAW,KAAA,MAAA,CAAO,QAAQ,UAAU,CAAA,CAAA;AACxE,IAAO,OAAA,aAAA,GAAgB,cAAc,KAAQ,GAAA,IAAA,CAAA;AAAA,GAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,gBAAmB,GAAA;AACjC,IAAI,IAAA;AACF,MAAA,MAAM,KAAK,oBAAqB,EAAA,CAAA;AAAA,aACzB,GAAK,EAAA;AACZ,MAAAA,KAAA,CAAI,wDAAwD,GAAG,CAAA,CAAA;AAAA,KACjE;AAAA,GACF;AAAA,EAEA,MAAc,oBAAuB,GAAA;AACnC,IAAA,MAAM,gBAAmB,GAAA,2CAAA,CAAA;AAIzB,IAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,MAC1B,aAAA,EAAe,CAAU,OAAA,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,MACzC,YAAc,EAAA,iBAAA;AAAA,MACd,MAAQ,EAAA,KAAA;AAAA,MACR,iBAAmB,EAAA,gBAAA;AAAA,MACnB,cAAgB,EAAA,mCAAA;AAAA,MAChB,WAAa,EAAA,gBAAA;AAAA,MACb,kBAAoB,EAAA,IAAA;AAAA,MACpB,oBAAsB,EAAA,WAAA;AAAA,MACtB,MAAQ,EAAA,eAAA;AAAA,MACR,OAAS,EAAA,gBAAA;AAAA,MACT,gBAAkB,EAAA,WAAA;AAAA,MAClB,gBAAkB,EAAA,MAAA;AAAA,MAClB,gBAAkB,EAAA,OAAA;AAAA,MAClB,MAAA,EAAQ,MAAM,IAAA,CAAK,eAAgB,EAAA;AAAA,KACpC,CAAA,CAAA;AAED,IAAIA,KAAA,CAAA,CAAA,uBAAA,EAA0B,gBAAgB,CAAE,CAAA,CAAA,CAAA;AAEhD,IAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,KAAA,CAAM,gBAAkB,EAAA;AAAA,MAC7C,MAAQ,EAAA,MAAA;AAAA,MACR,OAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,MAAM,eAAgB,CAAA,IAAA,CAAK,GAAK,EAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAE3C,IAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACX,MAAA,MAAM,IAAI,mBAAA,CAAoB,MAAM,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,KAChD;AAEA,IAAM,MAAA,CAAA,GAAI,MAAM,aAAA,CAAmB,GAAG,CAAA,CAAA;AACtC,IAAA,IAAI,CAAK,IAAA,IAAA,IAAQ,CAAE,CAAA,aAAa,KAAK,IAAM,EAAA;AACzC,MAAM,MAAA,IAAI,oBAAoB,wBAAwB,CAAA,CAAA;AAAA,KACxD;AAEA,IAAM,MAAA,aAAA,GAAgB,EAAE,aAAa,CAAA,CAAA;AACrC,IAAI,IAAA,OAAO,kBAAkB,QAAU,EAAA;AACrC,MAAM,MAAA,IAAI,oBAAoB,+BAA+B,CAAA,CAAA;AAAA,KAC/D;AAEA,IAAA,IAAA,CAAK,UAAa,GAAA,aAAA,CAAA;AAClB,IAAK,IAAA,CAAA,cAAA,uBAAqB,IAAK,EAAA,CAAA;AAE/B,IAAM,MAAA,IAAA,CAAK,SAAU,CAAA,IAAA,EAAM,aAAa,CAAA,CAAA;AAExC,IAAIA,KAAA,CAAA,CAAA,6BAAA,EAAgC,aAAc,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GAC7D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAwB,GAAA;AAC9B,IAAA,OACE,CAAC,IAAK,CAAA,QAAA,MACL,IAAK,CAAA,cAAA,IAAkB,QACtB,IAAK,CAAA,cAAA,GACH,IAAI,IAAK,CAAA,iBAAA,IAAI,MAAO,EAAA,OAAA,KAAY,CAAI,GAAA,EAAA,GAAK,KAAK,GAAI,CAAA,CAAA;AAAA,GAE1D;AACF;;ACrZa,MAAA,eAAA,GAAkB,IAAK,MAAoC;AAAA,EACtE,gBAAkC,GAAA;AAChC,IAAA,OAAO,QAAQ,OAAQ,EAAA,CAAA;AAAA,GACzB;AACF,CAAG,EAAA;;ACTI,MAAM,QAAuC,CAAA;AAAA,EAClD,MAAM,gBAAmB,GAAA;AACvB,IAAM,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,cAAe,EAAA,CAAA;AAC/C,IAAA,MAAM,UAAU,gBAAiB,EAAA,CAAA;AAAA,GACnC;AAAA,EAEA,aAAqB,cAAqD,GAAA;AAMxE,IAAO,OAAA,eAAA,CAAA;AAAA,GACT;AACF;;AChBA,MAAMA,KAAA,GAAM,MAAM,wBAAwB,CAAA,CAAA;AAK1C,IAAI,QAA4B,GAAA,IAAA,CAAA;AAChC,eAAe,cAAoC,GAAA;AACjD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAM,MAAA,GAAA,GAAM,MAAM,OAAO,UAAU,CAAA,CAAA;AACnC,IAAW,QAAA,GAAA,GAAA,CAAA;AACX,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEA,eAAe,UAAU,IAAmD,EAAA;AAC1E,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,IAAM,MAAA,EAAE,aAAgB,GAAA,IAAI,WAAY,CAAA,eAAA,CAAgB,MAAM,WAAW,CAAA,CAAA;AACzE,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA,CAAA;AAAA,KAC/D;AACA,IAAO,OAAA,WAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,EAAE,SAAA,EAAAI,UAAU,EAAA,GAAI,MAAM,cAAe,EAAA,CAAA;AAC3C,IAAA,OAAO,IAAIA,UAAU,EAAA,CAAE,eAAgB,CAAA,IAAA,EAAM,WAAW,CAAE,CAAA,WAAA,CAAA;AAAA,GAC5D;AACF,CAAA;AAGA,eAAe,iBAAiB,OAA0C,EAAA;AAExE,EAAA,MAAM,OAAU,GAAA;AAAA,IACd,MACE,EAAA,yIAAA;AAAA,IACF,iBAAmB,EAAA,IAAA;AAAA,IACnB,eAAiB,EAAA,UAAA;AAAA,IACjB,MAAQ,EAAA,UAAA;AAAA,IACR,QAAU,EAAA,QAAA;AAAA,IACV,WAAa,EAAA,gBAAA;AAAA,IACb,kBAAoB,EAAA,IAAA;AAAA,IACpB,oBAAsB,EAAA,WAAA;AAAA,IACtB,gBAAkB,EAAA,UAAA;AAAA,IAClB,gBAAkB,EAAA,UAAA;AAAA,IAClB,gBAAkB,EAAA,MAAA;AAAA,IAClB,gBAAkB,EAAA,IAAA;AAAA,IAClB,2BAA6B,EAAA,GAAA;AAAA,IAC7B,YAAc,EAAA,iBAAA;AAAA,GAChB,CAAA;AAGA,EAAM,MAAA,QAAA,GAAW,MAAM,OAAA,CAAQ,eAAiB,EAAA;AAAA,IAC9C,OAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAA+B,4BAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA,CAAA;AAAA,GACtE;AAEA,EAAM,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAGrC,EAAI,IAAA,GAAA,GAAM,MAAM,SAAA,CAAU,QAAQ,CAAA,CAAA;AAClC,EAAI,IAAA,QAAA,GAAW,IAAI,MAAO,CAAA,QAAA,CAAA;AAG1B,EAAA,MAAM,4BAA4B,IAAI,MAAA;AAAA,IACpC,0FAAA;AAAA,IACA,GAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,WAAA,GAAc,QAAS,CAAA,aAAA,CAAc,4BAA4B,CAAA,CAAA;AACvE,EAAA,MAAM,cAAc,WAChB,GAAA,WAAA,CAAY,YAAa,CAAA,SAAS,KAAK,EACvC,GAAA,EAAA,CAAA;AAEJ,EAAA,MAAM,0BACJ,yBAA0B,CAAA,IAAA,CAAK,WAAW,CAC1C,IAAA,yBAAA,CAA0B,KAAK,QAAQ,CAAA,CAAA;AAEzC,EAAA,IAAI,uBAAyB,EAAA;AAE3B,IAAA,MAAM,gBAAmB,GAAA,MAAM,OAAQ,CAAA,uBAAA,CAAwB,CAAC,CAAC,CAAA,CAAA;AAEjE,IAAI,IAAA,CAAC,iBAAiB,EAAI,EAAA;AACxB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,iBAAiB,UAAU,CAAA,CAAA;AAAA,OACxE,CAAA;AAAA,KACF;AAEA,IAAM,MAAA,YAAA,GAAe,MAAM,gBAAA,CAAiB,IAAK,EAAA,CAAA;AACjD,IAAM,GAAA,GAAA,MAAM,UAAU,YAAY,CAAA,CAAA;AAClC,IAAA,QAAA,GAAW,IAAI,MAAO,CAAA,QAAA,CAAA;AAAA,GACxB;AAGA,EAAA,MAAM,gBACJ,QAAS,CAAA,aAAA,CAAc,gBAAgB,CACvC,IAAA,QAAA,CAAS,cAAc,wCAAwC,CAAA,CAAA;AAEjE,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,MAAM,GACJ,GAAA,aAAA,CAAc,YAAa,CAAA,QAAQ,CAAK,IAAA,yBAAA,CAAA;AAC1C,IAAA,MAAM,MAAS,GAAA,aAAA,CAAc,YAAa,CAAA,QAAQ,CAAK,IAAA,MAAA,CAAA;AAGvD,IAAM,MAAA,cAAA,GAAiB,IAAI,QAAS,EAAA,CAAA;AAEpC,IAAM,MAAA,WAAA,GAAc,aAAc,CAAA,gBAAA,CAAiB,OAAO,CAAA,CAAA;AAC1D,IAAA,KAAA,MAAW,OAAW,IAAA,KAAA,CAAM,IAAK,CAAA,WAAW,CAAG,EAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AACxC,MAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAC1C,MAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,QAAe,cAAA,CAAA,MAAA,CAAO,MAAM,KAAK,CAAA,CAAA;AAAA,OACnC;AAAA,KACF;AAGA,IAAM,MAAA,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAK,EAAA;AAAA,MACtC,MAAA;AAAA,MACA,IAAM,EAAA,cAAA;AAAA,MACN,OAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,aAAa,EAAI,EAAA;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,aAAa,UAAU,CAAA,CAAA;AAAA,OAC7D,CAAA;AAAA,KACF;AAEA,IAAM,MAAA,QAAA,GAAW,MAAM,YAAA,CAAa,IAAK,EAAA,CAAA;AACzC,IAAM,GAAA,GAAA,MAAM,UAAU,QAAQ,CAAA,CAAA;AAC9B,IAAA,QAAA,GAAW,IAAI,MAAO,CAAA,QAAA,CAAA;AAAA,GACxB;AAGA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAgBA,IAAI,qBAAkD,GAAA,IAAA,CAAA;AACtD,IAAI,uBAA0B,GAAA,CAAA,CAAA;AAC9B,MAAM,kBAAA,GAAqB,IAAI,EAAK,GAAA,GAAA,CAAA;AAmBpC,eAAe,kBAAkB,OAA0C,EAAA;AACzE,EAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA,CAAA;AACrB,EAAA,IACE,CAAC,qBAAA,IACD,GAAM,GAAA,uBAAA,GAA0B,kBAChC,EAAA;AACA,IAAAJ,KAAA,CAAI,6DAA6D,CAAA,CAAA;AACjE,IAA0B,uBAAA,GAAA,GAAA,CAAA;AAE1B,IAAA,qBAAA,GAAwB,gBAAiB,CAAA,OAAO,CAAE,CAAA,KAAA,CAAM,CAAC,GAAQ,KAAA;AAE/D,MAAwB,qBAAA,GAAA,IAAA,CAAA;AACxB,MAAM,MAAA,GAAA,CAAA;AAAA,KACP,CAAA,CAAA;AAAA,GACI,MAAA;AACL,IAAAA,KAAA,CAAI,2DAA2D,CAAA,CAAA;AAAA,GACjE;AACA,EAAO,OAAA,qBAAA,CAAA;AACT,CAAA;AAEA,IAAI,iBAEO,GAAA,IAAA,CAAA;AACX,eAAe,iBAEb,GAAA;AACA,EAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,IAAM,MAAA,GAAA,GAAM,MAAM,OAAO,yBAAyB,CAAA,CAAA;AAElD,IAAA,iBAAA,GAAoB,GAAI,CAAA,iBAAA,CAAA;AAExB,IAAA,OAAO,GAAI,CAAA,iBAAA,CAAA;AAAA,GACb;AACA,EAAO,OAAA,iBAAA,CAAA;AACT,CAAA;AASsB,eAAA,qBAAA,CACpB,GACA,EAAA,OAAA,EACA,MACA,EAAA;AACA,EAAM,MAAA,SAAA,GAAY,IAAI,GAAA,CAAI,GAAG,CAAA,CAAA;AAC7B,EAAA,MAAM,OAAO,SAAU,CAAA,QAAA,CAAA;AAEvB,EAAAA,KAAA,CAAI,CAAiC,8BAAA,EAAA,MAAM,CAAI,CAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AAErD,EAAM,MAAA,QAAA,GAAW,MAAM,iBAAA,CAAkB,OAAO,CAAA,CAAA;AAChD,EAAM,MAAA,sBAAA,GAAyB,MAAM,iBAAkB,EAAA,CAAA;AACvD,EAAA,MAAM,WAAc,GAAA,MAAM,sBAAuB,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAChE,EAAA,MAAM,aAAgB,GAAA,MAAM,WAAY,CAAA,qBAAA,CAAsB,QAAQ,IAAI,CAAA,CAAA;AAC1E,EAAIA,KAAA,CAAA,CAAA,gBAAA,EAAmB,aAAa,CAAE,CAAA,CAAA,CAAA;AAEtC,EAAO,OAAA,aAAA,CAAA;AACT;;ACzNO,MAAM,iBACX,GAAA,iHAAA,CAAA;AAKK,MAAM,gBACX,GAAA,kEAAA;;AClBF,MAAMA,KAAA,GAAM,MAAM,qBAAqB,CAAA,CAAA;AAuBhC,MAAM,WACX,GAAA,kHAAA,CAAA;AAEK,MAAM,YACX,GAAA,0GAAA,CAAA;AAMF,eAAsB,OAAO,KAA8B,EAAA;AACzD,EAAMK,MAAAA,OAAAA,GAAS,IAAK,CAAA,MAAA,EAAW,GAAA,KAAA,CAAA;AAC/B,EAAA,MAAM,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAASA,OAAM,CAAC,CAAA,CAAA;AAC5D,CAAA;AAoBA,eAAsB,UACpB,CAAA,GAAA,EACA,IACA,EAAA,MAAA,GAAyB,OACzB,QAA+B,GAAA,IAAI,QAAS,EAAA,EAC5C,OAAmB,GAAA,IAAI,OAAQ,EAAA,EAC/B,qBACA,IAC8B,EAAA;AAC9B,EAAAL,KAAA,CAAI,CAAU,OAAA,EAAA,MAAM,CAAe,YAAA,EAAA,GAAG,CAAE,CAAA,CAAA,CAAA;AAExC,EAAA,MAAM,IAAK,CAAA,SAAA,CAAU,OAAS,EAAA,GAAA,EAAK,mBAAmB,CAAA,CAAA;AACtD,EAAA,MAAM,SAAS,gBAAiB,EAAA,CAAA;AAEhC,EAAA,IACE,IAAgB,YAAA,gBAAA,IAChB,IAAK,CAAA,OAAA,EAAS,cAAc,oBAC5B,EAAA;AACA,IAAA,MAAM,gBAAgB,MAAM,qBAAA;AAAA,MAC1B,GAAA;AAAA,MACA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,MACpB,MAAA;AAAA,KACF,CAAA;AACA,IAAQ,OAAA,CAAA,GAAA,CAAI,2BAA2B,aAAa,CAAA,CAAA;AAAA,GACtD;AAEA,EAAI,IAAA,IAAA,IAAQ,WAAW,MAAQ,EAAA;AAC7B,IAAQ,OAAA,CAAA,GAAA,CAAI,gBAAgB,kBAAkB,CAAA,CAAA;AAAA,GAChD;AAEA,EAAI,IAAA,GAAA,CAAA;AACJ,EAAG,GAAA;AACD,IAAA,MAAM,eAAmC,GAAA;AAAA,MACvC,GAAA;AAAA,MACA;AAAA,QACE,MAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAa,EAAA,SAAA;AAAA,QACb,GAAI,IAAQ,IAAA,MAAA,KAAW,MAAS,GAAA,EAAE,IAAM,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAE,EAAA,GAAI,EAAC;AAAA,OACpE;AAAA,KACF,CAAA;AAEA,IAAI,IAAA;AACF,MAAA,GAAA,GAAM,MAAM,IAAA,CAAK,KAAM,CAAA,GAAG,eAAe,CAAA,CAAA;AAAA,aAClC,GAAK,EAAA;AACZ,MAAI,IAAA,EAAE,eAAe,KAAQ,CAAA,EAAA;AAC3B,QAAM,MAAA,GAAA,CAAA;AAAA,OACR;AAEA,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,KAAA;AAAA,QACT,GAAA;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,eAAgB,CAAA,IAAA,CAAK,SAAU,EAAA,EAAG,IAAI,OAAO,CAAA,CAAA;AAEnD,IAAI,IAAA,GAAA,CAAI,WAAW,GAAK,EAAA;AACtB,MAAAA,KAAA,CAAI,sCAAsC,CAAA,CAAA;AAC1C,MAAA,MAAM,KAAK,WAAY,CAAA;AAAA,QACrB,eAAA;AAAA,QACA,QAAU,EAAA,GAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACH;AAAA,GACF,QAAS,IAAI,MAAW,KAAA,GAAA,EAAA;AAExB,EAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACX,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAK,EAAA,MAAM,QAAS,CAAA,YAAA,CAAa,GAAG,CAAA;AAAA,KACtC,CAAA;AAAA,GACF;AAEA,EAAM,MAAA,KAAA,GAAW,MAAM,aAAA,CAAc,GAAG,CAAA,CAAA;AACxC,EAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,GAAI,CAAA,uBAAuB,KAAK,GAAK,EAAA;AACnD,IAAA,IAAA,CAAK,WAAY,EAAA,CAAA;AACjB,IAAO,OAAA,EAAE,OAAS,EAAA,IAAA,EAAM,KAAM,EAAA,CAAA;AAAA,GACzB,MAAA;AACL,IAAO,OAAA,EAAE,OAAS,EAAA,IAAA,EAAM,KAAM,EAAA,CAAA;AAAA,GAChC;AACF,CAAA;AAEA,eAAsB,cAAiB,GAA2B,EAAA;AAChE,EAAI,IAAA;AACF,IAAO,OAAA,MAAM,IAAI,IAAK,EAAA,CAAA;AAAA,GAChB,CAAA,MAAA;AACN,IAAAA,KAAA,CAAI,wDAAwD,CAAA,CAAA;AAC5D,IAAM,MAAA,IAAA,GAAO,MAAM,GAAA,CAAI,IAAK,EAAA,CAAA;AAC5B,IAAAA,KAAA,CAAI,kBAAkB,IAAI,CAAA,CAAA;AAC1B,IAAO,OAAA,IAAA,CAAK,MAAM,IAAI,CAAA,CAAA;AAAA,GACxB;AACF,CAAA;AAGO,SAAS,eAAe,CAAW,EAAA;AACxC,EAAO,OAAA;AAAA,IACL,GAAG,CAAA;AAAA,IACH,oCAAsC,EAAA,IAAA;AAAA,IACtC,gDAAkD,EAAA,IAAA;AAAA,IAClD,4BAA8B,EAAA,KAAA;AAAA,IAC9B,+CAAiD,EAAA,IAAA;AAAA,IACjD,kDAAoD,EAAA,IAAA;AAAA,IACpD,iEAAmE,EAAA,KAAA;AAAA,IACnE,wCAA0C,EAAA,IAAA;AAAA,IAC1C,qCAAuC,EAAA,IAAA;AAAA,IACvC,0DAA4D,EAAA,IAAA;AAAA,IAC5D,kCAAoC,EAAA,IAAA;AAAA,IACpC,uCAAyC,EAAA,IAAA;AAAA,IACzC,gCAAkC,EAAA,KAAA;AAAA,IAClC,yCAA2C,EAAA,IAAA;AAAA,IAC3C,2BAA6B,EAAA,IAAA;AAAA,IAC7B,0CAA4C,EAAA,IAAA;AAAA,IAC5C,oCAAsC,EAAA,KAAA;AAAA,IACtC,uCAAyC,EAAA,IAAA;AAAA,IACzC,8CAAgD,EAAA,IAAA;AAAA,IAChD,sDAAwD,EAAA,IAAA;AAAA,IACxD,kCAAoC,EAAA,KAAA;AAAA,IACpC,kDAAoD,EAAA,KAAA;AAAA,IACpD,8BAAgC,EAAA,KAAA;AAAA,IAChC,6BAA+B,EAAA,KAAA;AAAA,IAC/B,4CAA8C,EAAA,KAAA;AAAA,IAC9C,gDAAkD,EAAA,KAAA;AAAA,IAClD,yCAA2C,EAAA,KAAA;AAAA,IAC3C,sEACE,EAAA,KAAA;AAAA,GACJ,CAAA;AACF,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,mBACiB,EAAA;AACjB,EAAO,MAAA,CAAA,GAAA,CAAI,qCAAqC,GAAG,CAAA,CAAA;AACnD,EAAO,MAAA,CAAA,GAAA,CAAI,oBAAoB,GAAG,CAAA,CAAA;AAClC,EAAO,MAAA,CAAA,GAAA,CAAI,sBAAsB,GAAG,CAAA,CAAA;AACpC,EAAO,MAAA,CAAA,GAAA,CAAI,uBAAuB,GAAG,CAAA,CAAA;AACrC,EAAO,MAAA,CAAA,GAAA,CAAI,yBAAyB,GAAG,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,qBAAqB,GAAG,CAAA,CAAA;AACnC,EAAO,MAAA,CAAA,GAAA,CAAI,kBAAkB,GAAG,CAAA,CAAA;AAChC,EAAO,MAAA,CAAA,GAAA,CAAI,yBAAyB,GAAG,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,8BAA8B,GAAG,CAAA,CAAA;AAC5C,EAAO,MAAA,CAAA,GAAA,CAAI,gCAAgC,GAAG,CAAA,CAAA;AAC9C,EAAO,MAAA,CAAA,GAAA,CAAI,6BAA6B,GAAG,CAAA,CAAA;AAC3C,EAAO,MAAA,CAAA,GAAA,CAAI,eAAe,GAAG,CAAA,CAAA;AAC7B,EAAO,MAAA,CAAA,GAAA,CAAI,kBAAkB,QAAQ,CAAA,CAAA;AACrC,EAAO,MAAA,CAAA,GAAA,CAAI,iBAAiB,GAAG,CAAA,CAAA;AAC/B,EAAO,MAAA,CAAA,GAAA,CAAI,wBAAwB,MAAM,CAAA,CAAA;AACzC,EAAO,MAAA,CAAA,GAAA,CAAI,sCAAsC,OAAO,CAAA,CAAA;AACxD,EAAO,MAAA,CAAA,GAAA,CAAI,uBAAuB,MAAM,CAAA,CAAA;AACxC,EAAO,MAAA,CAAA,GAAA,CAAI,uBAAuB,GAAG,CAAA,CAAA;AACrC,EAAO,MAAA,CAAA,GAAA,CAAI,cAAc,UAAU,CAAA,CAAA;AACnC,EAAO,MAAA,CAAA,GAAA,CAAI,8BAA8B,MAAM,CAAA,CAAA;AAC/C,EAAO,MAAA,CAAA,GAAA,CAAI,qBAAqB,MAAM,CAAA,CAAA;AACtC,EAAO,MAAA,CAAA,GAAA,CAAI,oBAAoB,MAAM,CAAA,CAAA;AACrC,EAAO,MAAA,CAAA,GAAA,CAAI,yBAAyB,MAAM,CAAA,CAAA;AAC1C,EAAO,MAAA,CAAA,GAAA,CAAI,2BAA2B,MAAM,CAAA,CAAA;AAC5C,EAAO,MAAA,CAAA,GAAA,CAAI,kCAAkC,MAAM,CAAA,CAAA;AACnD,EAAO,MAAA,CAAA,GAAA,CAAI,uCAAuC,MAAM,CAAA,CAAA;AACxD,EAAO,MAAA,CAAA,GAAA,CAAI,wCAAwC,MAAM,CAAA,CAAA;AACzD,EAAO,MAAA,CAAA,GAAA,CAAI,oBAAoB,MAAM,CAAA,CAAA;AACrC,EAAO,MAAA,CAAA,GAAA,CAAI,uBAAuB,MAAM,CAAA,CAAA;AACxC,EAAA,MAAA,CAAO,GAAI,CAAA,uBAAA,EAAyB,CAAG,EAAA,mBAAmB,CAAE,CAAA,CAAA,CAAA;AAC5D,EAAO,MAAA,CAAA,GAAA;AAAA,IACL,KAAA;AAAA,IACA,iJAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA,MAAA,CAAA;AACT;;ACzNA,MAAMA,KAAA,GAAM,MAAM,2BAA2B,CAAA,CAAA;AA0B7C,MAAM,sBAAA,GAAyB,KAAK,MAAO,CAAA;AAAA,EACzC,UAAA,EAAY,KAAK,MAAO,EAAA;AAAA,EACxB,YAAY,IAAK,CAAA,QAAA,CAAS,KAAK,MAAO,CAAA,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAA,CAAA;AAiJM,MAAM,gBAAA,GAAN,MAAM,gBAAA,SAAwB,gBAAiB,CAAA;AAAA,EAGpD,WAAA,CAAY,aAAqB,OAAuC,EAAA;AACtE,IAAA,KAAA,CAAM,aAAa,OAAO,CAAA,CAAA;AAH5B,IAAiB,IAAA,CAAA,eAAA,uBAAuD,GAAI,EAAA,CAAA;AAI1E,IAAA,IAAA,CAAK,yBAA0B,EAAA,CAAA;AAAA,GACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAA,CAAuB,WAAmB,OAAmC,EAAA;AAC3E,IAAK,IAAA,CAAA,eAAA,CAAgB,GAAI,CAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEQ,yBAAkC,GAAA;AACxC,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,+BAAA;AAAA,MACA,IAAA,CAAK,8BAA+B,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KAC/C,CAAA;AACA,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,6BAAA;AAAA,MACA,IAAA,CAAK,4BAA6B,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KAC7C,CAAA;AACA,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,sCAAA;AAAA,MACA,IAAA,CAAK,qCAAsC,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KACtD,CAAA;AACA,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,oBAAA;AAAA,MACA,IAAA,CAAK,mBAAoB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KACpC,CAAA;AACA,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,yBAAA;AAAA,MACA,IAAA,CAAK,6BAA8B,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KAC9C,CAAA;AACA,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,6BAAA;AAAA,MACA,IAAA,CAAK,4BAA6B,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KAC7C,CAAA;AACA,IAAA,IAAA,CAAK,gBAAgB,GAAI,CAAA,WAAA,EAAa,KAAK,UAAW,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAChE,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA;AAAA,MACnB,qBAAA;AAAA,MACA,IAAA,CAAK,oBAAqB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KACrC,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,UAA+B,GAAA;AACnC,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA,CAAA;AAGtC,IAAA,OACE,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,GAAQ,KAAA,KAAK,CACnC,IAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,QAAQ,YAAY,CAAA,CAAA;AAAA,GAE9C;AAAA,EAEA,MAAM,KAAA,CACJ,QACA,EAAA,QAAA,EACA,OACA,eACe,EAAA;AAOf,IAAA,MAAM,KAAK,SAAU,EAAA,CAAA;AAKrB,IAAI,IAAA,CAAC,KAAK,UAAY,EAAA;AACpB,MAAA,MAAM,KAAK,gBAAiB,EAAA,CAAA;AAAA,KAC9B;AAMA,IAAA,MAAM,WAA0C,GAAA;AAAA,MAC9C,QAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,eAAA;AAAA,KACF,CAAA;AAEA,IAAI,IAAA,IAAA,GAAwB,MAAM,IAAA,CAAK,SAAU,EAAA,CAAA;AACjD,IAAA,OAAO,KAAK,MAAW,KAAA,SAAA,IAAa,IAAK,CAAA,QAAA,CAAS,UAAU,MAAQ,EAAA;AAClE,MAAM,MAAA,SAAA,GAAY,KAAK,QAAS,CAAA,UAAA,CAAA;AAChC,MAAA,IAAI,aAAa,IAAM,EAAA;AAErB,QAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,OACzC;AAEA,MAAA,MAAM,SAAY,GAAA,IAAA,CAAK,QAAS,CAAA,QAAA,CAAS,CAAC,CAAE,CAAA,UAAA,CAAA;AAK5C,MAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,OAAA,EAAS,YAAc,EAAA,aAAA,CAAA;AACpD,MAAM,MAAA,KAAA,GACJ,eAAoB,KAAA,KAAA,CAAA,GAChB,eACA,GAAA,GAAA,GAAO,KAAK,KAAM,CAAA,IAAA,CAAK,MAAO,EAAA,GAAI,GAAI,CAAA,CAAA;AAC5C,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAAA,KAAA,CAAI,CAAW,QAAA,EAAA,KAAK,CAA+B,4BAAA,EAAA,SAAS,CAAE,CAAA,CAAA,CAAA;AAC9D,QAAA,MAAM,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AAAA,OAC3D;AAEA,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AAElD,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,IAAA,GAAO,MAAM,OAAA,CAAQ,SAAW,EAAA,IAAA,CAAK,UAAU,WAAa,EAAA;AAAA,UAC1D,eAAiB,EAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,UAC/C,cAAc,MAAM,SAAA;AAAA,SACrB,CAAA,CAAA;AAAA,OACI,MAAA;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,CAAmB,gBAAA,EAAA,SAAS,CAAE,CAAA,CAAA,CAAA;AAAA,OAChD;AAAA,KACF;AACA,IAAI,IAAA,IAAA,CAAK,WAAW,OAAS,EAAA;AAC3B,MAAA,MAAM,IAAK,CAAA,GAAA,CAAA;AAAA,KACb;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,SAA2B,GAAA;AACvC,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,QAC1B,MACE,EAAA,yIAAA;AAAA,QACF,iBAAmB,EAAA,gBAAA;AAAA,QACnB,WAAa,EAAA,gBAAA;AAAA,QACb,kBAAoB,EAAA,IAAA;AAAA,QACpB,oBAAsB,EAAA,WAAA;AAAA,QACtB,gBAAkB,EAAA,UAAA;AAAA,QAClB,gBAAkB,EAAA,UAAA;AAAA,QAClB,gBAAkB,EAAA,MAAA;AAAA,QAClB,gBAAkB,EAAA,IAAA;AAAA,QAClB,2BAA6B,EAAA,GAAA;AAAA,QAC7B,YAAc,EAAA,iBAAA;AAAA,OACf,CAAA,CAAA;AAED,MAAAA,KAAA,CAAI,iDAAiD,CAAA,CAAA;AACrD,MAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,KAAA,CAAM,4BAA8B,EAAA;AAAA,QACzD,QAAU,EAAA,QAAA;AAAA,QACV,OAAA;AAAA,OACD,CAAA,CAAA;AAED,MAAA,MAAM,eAAgB,CAAA,IAAA,CAAK,GAAK,EAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAC3C,MAAIA,KAAA,CAAA,CAAA,qBAAA,EAAwB,GAAI,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAKxC,MAAI,IAAA;AACF,QAAM,MAAA,IAAA,GAAO,MAAM,GAAA,CAAI,IAAK,EAAA,CAAA;AAC5B,QAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,4BAA4B,CAAA,CAAA;AACvD,QAAA,IAAI,OAAS,EAAA;AACX,UAAK,IAAA,CAAA,UAAA,GAAa,QAAQ,CAAC,CAAA,CAAA;AAC3B,UAAK,IAAA,CAAA,cAAA,uBAAqB,IAAK,EAAA,CAAA;AAE/B,UAAA,MAAM,IAAK,CAAA,SAAA,CAAU,IAAM,EAAA,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AACrC,UAAAA,KAAA,CAAI,CAA4C,yCAAA,EAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,SACtE;AAAA,eACO,GAAK,EAAA;AACZ,QAAAA,KAAA,CAAI,wDAAwD,GAAG,CAAA,CAAA;AAAA,OACjE;AAAA,aACO,GAAK,EAAA;AACZ,MAAAA,KAAA,CAAI,0CAA0C,GAAG,CAAA,CAAA;AAAA,KACnD;AAAA,GACF;AAAA,EAEA,MAAM,MAAwB,GAAA;AAC5B,IAAI,IAAA,CAAC,IAAK,CAAA,QAAA,EAAY,EAAA;AACpB,MAAA,OAAA;AAAA,KACF;AAEA,IAAI,IAAA;AACF,MAAA,MAAM,SAAY,GAAA,2CAAA,CAAA;AAClB,MAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,EAAA,CAAA;AAC5B,MAAM,MAAA,IAAA,CAAK,SAAU,CAAA,OAAA,EAAS,SAAS,CAAA,CAAA;AAEvC,MAAM,MAAA,IAAA,CAAK,MAAM,SAAW,EAAA;AAAA,QAC1B,MAAQ,EAAA,MAAA;AAAA,QACR,OAAA;AAAA,OACD,CAAA,CAAA;AAAA,aACM,KAAO,EAAA;AAEd,MAAAA,KAAA,CAAI,wBAAwB,KAAK,CAAA,CAAA;AAAA,KACjC,SAAA;AACA,MAAA,IAAA,CAAK,WAAY,EAAA,CAAA;AACjB,MAAK,IAAA,CAAA,GAAA,GAAM,IAAI,SAAU,EAAA,CAAA;AAAA,KAC3B;AAAA,GACF;AAAA,EAEA,MAAM,SAAA,CACJ,OACA,EAAA,GAAA,EACA,mBACe,EAAA;AAEf,IAAA,MAAM,KAAM,CAAA,SAAA,CAAU,OAAS,EAAA,GAAA,EAAK,mBAAmB,CAAA,CAAA;AAGvD,IAAQ,OAAA,CAAA,GAAA,CAAI,uBAAuB,eAAe,CAAA,CAAA;AAClD,IAAQ,OAAA,CAAA,GAAA,CAAI,yBAAyB,KAAK,CAAA,CAAA;AAC1C,IAAQ,OAAA,CAAA,GAAA,CAAI,6BAA6B,IAAI,CAAA,CAAA;AAAA,GAM/C;AAAA,EAEA,MAAc,SAAsC,GAAA;AAIlD,IAAM,MAAA,IAAA,CAAK,aAAa,gBAAgB,CAAA,CAAA;AACxC,IAAM,MAAA,IAAA,CAAK,aAAa,WAAW,CAAA,CAAA;AACnC,IAAM,MAAA,IAAA,CAAK,aAAa,eAAe,CAAA,CAAA;AACvC,IAAM,MAAA,IAAA,CAAK,aAAa,yBAAyB,CAAA,CAAA;AACjD,IAAM,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA;AAC9B,IAAM,MAAA,IAAA,CAAK,aAAa,sBAAsB,CAAA,CAAA;AAC9C,IAAM,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA;AAC9B,IAAM,MAAA,IAAA,CAAK,aAAa,iBAAiB,CAAA,CAAA;AACzC,IAAM,MAAA,IAAA,CAAK,aAAa,WAAW,CAAA,CAAA;AACnC,IAAM,MAAA,IAAA,CAAK,aAAa,kBAAkB,CAAA,CAAA;AAC1C,IAAM,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA;AAE9B,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA;AAAA,MAChC,SAAW,EAAA,OAAA;AAAA,MACX,eAAiB,EAAA;AAAA,QACf,YAAc,EAAA;AAAA,UACZ,iBAAiB,EAAC;AAAA,UAClB,cAAgB,EAAA;AAAA,YACd,QAAU,EAAA,aAAA;AAAA,WACZ;AAAA,SACF;AAAA,OACF;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,WAAa,EAAA,CAAA;AAAA,QACb,YAAc,EAAA,CAAA;AAAA,QACd,gBAAkB,EAAA,CAAA;AAAA,QAClB,uBAAyB,EAAA,CAAA;AAAA,QACzB,gBAAkB,EAAA,CAAA;AAAA,QAClB,oCAAsC,EAAA,CAAA;AAAA,QACtC,GAAK,EAAA,CAAA;AAAA,QACL,kBAAoB,EAAA,CAAA;AAAA,QACpB,QAAU,EAAA,CAAA;AAAA,QACV,UAAY,EAAA,CAAA;AAAA,QACZ,WAAa,EAAA,CAAA;AAAA,QACb,cAAgB,EAAA,CAAA;AAAA,QAChB,WAAa,EAAA,CAAA;AAAA,QACb,eAAiB,EAAA,CAAA;AAAA,QACjB,UAAY,EAAA,CAAA;AAAA,QACZ,cAAgB,EAAA,CAAA;AAAA,QAChB,WAAa,EAAA,CAAA;AAAA,QACb,mBAAqB,EAAA,CAAA;AAAA,QACrB,eAAiB,EAAA,CAAA;AAAA,QACjB,kBAAoB,EAAA,CAAA;AAAA,QACpB,WAAa,EAAA,CAAA;AAAA,QACb,+BAAiC,EAAA,CAAA;AAAA,QACjC,YAAc,EAAA,CAAA;AAAA,QACd,kBAAoB,EAAA,CAAA;AAAA,QACpB,SAAW,EAAA,CAAA;AAAA,QACX,kBAAoB,EAAA,CAAA;AAAA,QACpB,eAAiB,EAAA,CAAA;AAAA,QACjB,YAAc,EAAA,CAAA;AAAA,QACd,aAAe,EAAA,CAAA;AAAA,QACf,aAAe,EAAA,CAAA;AAAA,QACf,aAAe,EAAA,CAAA;AAAA,QACf,SAAW,EAAA,CAAA;AAAA,QACX,OAAS,EAAA,CAAA;AAAA,QACT,cAAgB,EAAA,CAAA;AAAA,QAChB,mBAAqB,EAAA,CAAA;AAAA,QACrB,YAAc,EAAA,CAAA;AAAA,QACd,YAAc,EAAA,CAAA;AAAA,QACd,yBAA2B,EAAA,CAAA;AAAA,QAC3B,wBAA0B,EAAA,CAAA;AAAA,QAC1B,YAAc,EAAA,CAAA;AAAA,QACd,SAAW,EAAA,CAAA;AAAA,OACb;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,8BAAA,CACZ,SACA,EAAA,IAAA,EACA,cACA,GAC0B,EAAA;AAI1B,IAAA,MAAM,WAAW,IAAK,CAAA,QAAA,CAAA;AAItB,IAAA,MAAM,YAAY,QAAU,EAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,eAAe,SAAS,CAAA,CAAA;AAClE,IAAM,MAAA,KAAA,GAA4B,WAAW,kBAAoB,EAAA,GAAA,CAAA;AAEjE,IAAA,IAAI,eAAkB,GAAA,IAAA,CAAA;AACtB,IAAA,IAAI,KAAO,EAAA;AACT,MAAI,IAAA;AACF,QAAkB,eAAA,GAAA,MAAM,IAAK,CAAA,wBAAA,CAAyB,KAAK,CAAA,CAAA;AAC3D,QAAAA,KAAA;AAAA,UACE,CAAA,2DAAA,EAA8D,gBAAgB,MAAM,CAAA,CAAA;AAAA,SACtF,CAAA;AAAA,eACO,GAAK,EAAA;AACZ,QAAAA,KAAA,CAAI,6DAA6D,GAAG,CAAA,CAAA;AAAA,OACtE;AAAA,KACF;AAEA,IAAO,OAAA,MAAM,IAAI,eAAgB,CAAA;AAAA,MAC/B,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,MAC7B,cAAgB,EAAA;AAAA,QACd;AAAA,UACE,UAAY,EAAA,SAAA;AAAA,UACZ,kBAAoB,EAAA;AAAA,YAClB,QAAU,EAAA,eAAA;AAAA,YACV,IAAM,EAAA,WAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,MAAc,yBAAyB,GAA8B,EAAA;AACnE,IAAIA,KAAA,CAAA,CAAA,kCAAA,EAAqC,GAAG,CAAE,CAAA,CAAA,CAAA;AAC9C,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACrC,IAAM,MAAA,aAAA,GAAgB,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAC1C,IAAIA,KAAA,CAAA,CAAA,2CAAA,EAA8C,aAAc,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAExE,IAAI,IAAA,aAAA,CAAc,MAAS,GAAA,gBAAA,CAAgB,2BAA6B,EAAA;AACtE,MAAAA,KAAA;AAAA,QACE,CAA0D,uDAAA,EAAA,aAAA,CAAc,MAAM,CAAA,GAAA,EAAM,iBAAgB,2BAA2B,CAAA,qBAAA,CAAA;AAAA,OACjI,CAAA;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,IAAI,OAAO,MAAA,KAAW,WAAe,IAAA,OAAO,aAAa,WAAa,EAAA;AACpE,MAAO,OAAA,IAAA,CAAK,gCAAgC,aAAa,CAAA,CAAA;AAAA,KAC3D;AACA,IAAO,OAAA,IAAA,CAAK,6BAA6B,aAAa,CAAA,CAAA;AAAA,GACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,gCACZ,aACiB,EAAA;AACjB,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAM,OAAU,GAAA,MAAA,CAAA;AACvB,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,MAAM,CAAA,CAAA;AAEhC,IAAI,IAAA;AACF,MAAA,MAAM,YAAY,MAAO,CAAA,aAAA,CAAA;AACzB,MAAA,MAAM,YAAY,MAAO,CAAA,eAAA,CAAA;AACzB,MAAI,IAAA,CAAC,SAAa,IAAA,CAAC,SAAW,EAAA;AAC5B,QAAAA,KAAA,CAAI,kDAAkD,CAAA,CAAA;AACtD,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAGA,MAAM,MAAA,KAAA,GAAQ,SAAU,CAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAO,GAAA,YAAA,CAAA;AACb,MAAA,KAAA,CAAM,IAAO,GAAA,QAAA,CAAA;AACb,MAAU,SAAA,CAAA,IAAA,CAAK,YAAY,KAAK,CAAA,CAAA;AAIhC,MAAC,SAAkB,CAAA,UAAA,GAAa,CAAC,EAAA,KAAY,EAAG,EAAA,CAAA;AAGhD,MAAM,MAAA,MAAA,GAAS,SAAU,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAC/C,MAAA,MAAA,CAAO,WAAc,GAAA,aAAA,CAAA;AACrB,MAAU,SAAA,CAAA,IAAA,CAAK,YAAY,MAAM,CAAA,CAAA;AAEjC,MAAA,MAAM,QAAQ,KAAM,CAAA,KAAA,CAAA;AACpB,MAAA,IAAI,KAAO,EAAA;AACT,QAAIA,KAAA,CAAA,CAAA,6CAAA,EAAgD,KAAM,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAClE,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAEA,MAAAA,KAAA,CAAI,2DAA2D,CAAA,CAAA;AAC/D,MAAO,OAAA,IAAA,CAAA;AAAA,KACP,SAAA;AACA,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,MAAM,CAAA,CAAA;AAAA,KAClC;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,6BACZ,aACiB,EAAA;AAKjB,IAAA,MAAM,EAAE,SAAA,EAAc,GAAA,MAAM,OAAO,UAAU,CAAA,CAAA;AAC7C,IAAA,MAAM,EAAE,QAAA,EAAU,GAAK,EAAA,MAAA,EAAQ,KAAQ,GAAA,SAAA;AAAA,MACrC,2FAAA;AAAA,KACF,CAAA;AAGA,IAAI,IAAA,OAAO,GAAI,CAAA,iBAAA,KAAsB,UAAY,EAAA;AAE/C,MAAC,GAAA,CAAY,oBAAoB,CAAC,IAAA,KAChC,IAAI,gBAAiB,CAAA,CAAA,OAAA,EAAU,IAAI,CAAI,EAAA,CAAA,CAAA,CAAA;AAAA,KAC3C;AAOA,IAAM,MAAA,EAAA,GAAK,MAAM,OAAO,IAAI,CAAA,CAAA;AAG5B,IAAA,MAAM,iBAAkB,GAAY,CAAA,UAAA,CAAA;AAEpC,IAAC,GAAY,CAAA,UAAA,GAAa,CAAC,EAAA,KAAY,EAAG,EAAA,CAAA;AAE1C,IAAI,IAAA;AACF,MAAO,MAAA,CAAA,cAAA,CAAe,KAAK,YAAc,EAAA;AAAA,QACvC,KAAO,EAAA,UAAA;AAAA,QACP,QAAU,EAAA,IAAA;AAAA,QACV,YAAc,EAAA,IAAA;AAAA,OACf,CAAA,CAAA;AAAA,KACK,CAAA,MAAA;AAAA,KAER;AAEA,IAAA,MAAM,OAAU,GAAA;AAAA,MACd,QAAU,EAAA,GAAA;AAAA,MACV,MAAQ,EAAA,GAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA;AAAA,MAEA,OAAS,EAAA,KAAA,CAAA;AAAA,MACT,OAAS,EAAA,KAAA,CAAA;AAAA,MACT,MAAQ,EAAA,KAAA,CAAA;AAAA,MACR,UAAY,EAAA,KAAA,CAAA;AAAA,KACd,CAAA;AACA,IAAA,EAAA,CAAG,gBAAgB,aAAe,EAAA,OAAA,EAAS,EAAE,OAAA,EAAS,KAAM,CAAA,CAAA;AAG5D,IAAC,IAAY,UAAa,GAAA,cAAA,CAAA;AAG1B,IAAM,MAAA,MAAA,GAAS,GAAI,CAAA,iBAAA,CAAkB,YAAY,CAAA,CAAA;AACjD,IAAI,IAAA,MAAA,IAAU,MAAO,CAAA,MAAA,GAAS,CAAG,EAAA;AAC/B,MAAM,MAAA,KAAA,GACH,OAAO,CAAC,CAAA,CAAuB,SAChC,MAAO,CAAA,CAAC,CAAE,CAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAChC,MAAA,IAAI,KAAO,EAAA;AACT,QAAIA,KAAA,CAAA,CAAA,6CAAA,EAAgD,KAAM,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAClE,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF;AAEA,IAAAA,KAAA,CAAI,2DAA2D,CAAA,CAAA;AAC/D,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAc,qCAAA,CACZ,SACA,EAAA,KAAA,EACA,aACA,GAC0B,EAAA;AAC1B,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA;AAAA,MAChC,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,MAC7B,cAAgB,EAAA;AAAA,QACd;AAAA,UACE,UAAY,EAAA,SAAA;AAAA,UACZ,UAAY,EAAA;AAAA,YACV,MAAM,WAAY,CAAA,KAAA;AAAA,YAClB,IAAM,EAAA,WAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,4BAAA,CACZ,SACA,EAAA,KAAA,EACA,aACA,GAC0B,EAAA;AAI1B,IAAI,IAAA,WAAA,CAAA;AACJ,IAAI,IAAA;AACF,MAAc,WAAA,GAAA,MAAM,KAAK,mBAAoB,EAAA,CAAA;AAC7C,MAAIA,KAAA,CAAA,CAAA,gCAAA,EAAmC,WAAY,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAAA,aACpD,GAAK,EAAA;AACZ,MAAAA,KAAA,CAAI,4DAA4D,GAAG,CAAA,CAAA;AAAA,KACrE;AAEA,IAAA,MAAM,YAOF,GAAA;AAAA,MACF,iBAAmB,EAAA;AAAA,QACjB;AAAA,UACE,GAAK,EAAA,iBAAA;AAAA,UACL,aAAe,EAAA;AAAA,YACb,SAAW,EAAA,EAAE,MAAQ,EAAA,WAAA,CAAY,QAAS,EAAA;AAAA,WAC5C;AAAA,SACF;AAAA,OACF;AAAA,MACA,IAAM,EAAA,WAAA;AAAA,KACR,CAAA;AAEA,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,YAAA,CAAa,YAAe,GAAA,WAAA,CAAA;AAAA,KAC9B;AAEA,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA;AAAA,MAChC,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,MAC7B,cAAgB,EAAA;AAAA,QACd;AAAA,UACE,UAAY,EAAA,SAAA;AAAA,UACZ,aAAe,EAAA,YAAA;AAAA,SACjB;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,mBAAuC,GAAA;AACnD,IAAA,MAAM,SAAY,GAAA,iBAAA,CAAA;AAElB,IAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,OAAA,EAAS,YAAc,EAAA,cAAA,CAAA;AACnD,IAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAS,GAAA,wBAAA,CAAyB,WAAW,cAAc,CAAA,CAAA;AAG1E,IAAM,MAAA,IAAA,CAAK,SAAU,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAEnC,IAAAA,KAAA;AAAA,MACE,CAAA,wCAAA,EACE,MAAM,MACR,CAAA,QAAA,EAAW,KAAK,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,KACjC,CAAA;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAc,mBAAA,CACZ,SACA,EAAA,KAAA,EACA,aACA,GAC0B,EAAA;AAE1B,IAAI,IAAA,WAAA,CAAA;AACJ,IAAI,IAAA;AACF,MAAc,WAAA,GAAA,MAAM,KAAK,mBAAoB,EAAA,CAAA;AAC7C,MAAIA,KAAA,CAAA,CAAA,wCAAA,EAA2C,WAAY,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAAA,aAC5D,GAAK,EAAA;AACZ,MAAAA,KAAA;AAAA,QACE,oEAAA;AAAA,QACA,GAAA;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,aAIF,GAAA;AAAA,MACF,UAAU,WAAY,CAAA,QAAA;AAAA,MACtB,IAAM,EAAA,WAAA;AAAA,KACR,CAAA;AAEA,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,aAAA,CAAc,YAAe,GAAA,WAAA,CAAA;AAAA,KAC/B;AAEA,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA;AAAA,MAChC,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,MAC7B,cAAgB,EAAA;AAAA,QACd;AAAA,UACE,UAAY,EAAA,SAAA;AAAA,UACZ,cAAgB,EAAA,aAAA;AAAA,SAClB;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,6BAAA,CACZ,SACA,EAAA,KAAA,EACA,cACA,GAC0B,EAAA;AAC1B,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA;AAAA,MAChC,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,MAC7B,cAAgB,EAAA;AAAA,QACd;AAAA,UACE,UAAY,EAAA,SAAA;AAAA,UACZ,uBAAyB,EAAA;AAAA,YACvB,IAAM,EAAA,+BAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,4BAAA,CACZ,SACA,EAAA,KAAA,EACA,aACA,GAC0B,EAAA;AAC1B,IAAI,IAAA,CAAC,YAAY,eAAiB,EAAA;AAChC,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,KAAK,IAAI,mBAAA;AAAA,UACP,kEAAA;AAAA,SACF;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAM,MAAA,IAAA,GAAO,IAAI,OAAQ,CAAA,IAAA,CAAK,EAAE,MAAQ,EAAA,WAAA,CAAY,iBAAiB,CAAA,CAAA;AACrE,IAAI,IAAA,UAAA,CAAA;AACJ,IAAA,KAAA,IAAS,QAAW,GAAA,CAAA,EAAG,QAAW,GAAA,CAAA,EAAG,YAAY,CAAG,EAAA;AAClD,MAAM,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,eAAgB,CAAA;AAAA,QACvC,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,QAC7B,cAAgB,EAAA;AAAA,UACd;AAAA,YACE,UAAY,EAAA,SAAA;AAAA,YACZ,UAAY,EAAA;AAAA,cACV,IAAM,EAAA,WAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAS,EAAA;AAAA,aACtB;AAAA,WACF;AAAA,SACF;AAAA,OACD,CAAA,CAAA;AAED,MAAI,IAAA,MAAA,CAAO,WAAW,SAAW,EAAA;AAC/B,QAAO,OAAA,MAAA,CAAA;AAAA,OACT;AAEA,MAAa,UAAA,GAAA,MAAA,CAAA;AACb,MAAAA,KAAA,CAAI,eAAe,QAAQ,CAAA,SAAA,EAAY,MAAO,CAAA,GAAA,CAAI,OAAO,CAAE,CAAA,CAAA,CAAA;AAC3D,MAAM,MAAA,IAAI,QAAQ,CAAC,OAAA,KAAY,WAAW,OAAS,EAAA,GAAA,GAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,KACrE;AACA,IAAO,OAAA,UAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAc,UAAA,CACZ,SACA,EAAA,KAAA,EACA,aACA,GAC0B,EAAA;AAC1B,IAAO,OAAA,MAAM,KAAK,eAAgB,CAAA;AAAA,MAChC,UAAA,EAAY,IAAI,YAAa,EAAA;AAAA,MAC7B,cAAgB,EAAA;AAAA,QACd;AAAA,UACE,UAAY,EAAA,SAAA;AAAA,UACZ,UAAY,EAAA;AAAA,YACV,MAAM,WAAY,CAAA,KAAA;AAAA,YAClB,IAAM,EAAA,WAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,oBAAiD,GAAA;AAE7D,IAAAA,KAAA,CAAI,+CAA+C,CAAA,CAAA;AACnD,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,SAAA;AAAA,MACR,UAAU,EAAC;AAAA,KACb,CAAA;AAAA,GACF;AAAA,EAEA,MAAc,gBACZ,IAC0B,EAAA;AAC1B,IAAA,IAAI,iBAAoB,GAAA,4CAAA,CAAA;AACxB,IAAA,IAAI,eAAe,IAAM,EAAA;AACvB,MAAoB,iBAAA,GAAA,CAAA,qDAAA,EAAwD,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,KAC5F;AAEA,IAAIA,KAAA,CAAA,CAAA,uBAAA,EAA0B,iBAAiB,CAAE,CAAA,CAAA,CAAA;AACjD,IAAAA,KAAA;AAAA,MACE,eAAA;AAAA,MACA,IAAK,CAAA,SAAA;AAAA,QACH,IAAA;AAAA,QACA,CAAC,GAAA,EAAK,KAAW,KAAA,GAAA,KAAQ,aAAa,YAAe,GAAA,KAAA;AAAA,QACrD,CAAA;AAAA,OACF;AAAA,KACF,CAAA;AAOA,IAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,MAC1B,MAAQ,EAAA,KAAA;AAAA,MACR,iBAAmB,EAAA,gBAAA;AAAA,MACnB,cAAgB,EAAA,kBAAA;AAAA,MAChB,MAAQ,EAAA,eAAA;AAAA,MACR,QAAU,EAAA,QAAA;AAAA,MACV,OAAS,EAAA,gBAAA;AAAA,MACT,WAAa,EAAA,gBAAA;AAAA,MACb,kBAAoB,EAAA,IAAA;AAAA,MACpB,oBAAsB,EAAA,WAAA;AAAA,MACtB,gBAAkB,EAAA,OAAA;AAAA,MAClB,gBAAkB,EAAA,MAAA;AAAA,MAClB,gBAAkB,EAAA,WAAA;AAAA,MAClB,YAAc,EAAA,iBAAA;AAAA,MACd,uBAAyB,EAAA,KAAA;AAAA,MACzB,2BAA6B,EAAA,IAAA;AAAA,KAC9B,CAAA,CAAA;AACD,IAAM,MAAA,IAAA,CAAK,uBAAuB,OAAO,CAAA,CAAA;AAGzC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA,YAAA,EAAc,oBAAsB,EAAA;AACpD,MAAA,MAAM,gBAAgB,MAAM,qBAAA;AAAA,QAC1B,iBAAA;AAAA,QACA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QACpB,MAAA;AAAA,OACF,CAAA;AACA,MAAQ,OAAA,CAAA,GAAA,CAAI,2BAA2B,aAAa,CAAA,CAAA;AAAA,KACtD;AAGA,IAAM,MAAA,QAAA,GAAoC,EAAE,GAAG,IAAK,EAAA,CAAA;AACpD,IAAA,IAAI,eAAe,QAAU,EAAA;AAC3B,MAAA,OAAO,QAAS,CAAA,SAAA,CAAA;AAAA,KAClB;AAEA,IAAI,IAAA,GAAA,CAAA;AACJ,IAAG,GAAA;AACD,MAAA,MAAM,eAAmC,GAAA;AAAA,QACvC,iBAAA;AAAA,QACA;AAAA,UACE,WAAa,EAAA,SAAA;AAAA,UACb,MAAQ,EAAA,MAAA;AAAA,UACR,OAAA;AAAA,UACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,SAC/B;AAAA,OACF,CAAA;AAEA,MAAI,IAAA;AACF,QAAA,GAAA,GAAM,MAAM,IAAA,CAAK,KAAM,CAAA,GAAG,eAAe,CAAA,CAAA;AAAA,eAClC,GAAK,EAAA;AACZ,QAAI,IAAA,EAAE,eAAe,KAAQ,CAAA,EAAA;AAC3B,UAAM,MAAA,GAAA,CAAA;AAAA,SACR;AAEA,QAAO,OAAA;AAAA,UACL,MAAQ,EAAA,OAAA;AAAA,UACR,GAAA;AAAA,SACF,CAAA;AAAA,OACF;AAEA,MAAA,MAAM,eAAgB,CAAA,IAAA,CAAK,GAAK,EAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAE3C,MAAIA,KAAA,CAAA,CAAA,iBAAA,EAAoB,GAAI,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AACpC,MAAI,IAAA,GAAA,CAAI,WAAW,GAAK,EAAA;AACtB,QAAAA,KAAA,CAAI,4CAA4C,CAAA,CAAA;AAChD,QAAA,MAAM,KAAK,WAAY,CAAA;AAAA,UACrB,eAAA;AAAA,UACA,QAAU,EAAA,GAAA;AAAA,SACX,CAAA,CAAA;AAAA,OACH;AAAA,KACF,QAAS,IAAI,MAAW,KAAA,GAAA,EAAA;AAKxB,IAAI,IAAA,IAAA,CAAA;AACJ,IAAI,IAAA;AACF,MAAO,IAAA,GAAA,MAAM,cAAc,GAAG,CAAA,CAAA;AAAA,KACxB,CAAA,MAAA;AACN,MAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACX,QAAO,OAAA;AAAA,UACL,MAAQ,EAAA,OAAA;AAAA,UACR,GAAK,EAAA,IAAI,QAAS,CAAA,GAAA,EAAK,+BAA+B,CAAA;AAAA,SACxD,CAAA;AAAA,OACF;AACA,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,GAAA,EAAK,IAAI,mBAAA,CAAoB,gCAAgC,CAAA;AAAA,OAC/D,CAAA;AAAA,KACF;AACA,IAAAA,KAAA;AAAA,MACE,sCAAA;AAAA,MACA,IAAK,CAAA,MAAA;AAAA,MACL,IAAA,CAAK,UAAU,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,UAAU,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KACnD,CAAA;AAGA,IAAI,IAAA,IAAA,CAAK,QAAQ,MAAQ,EAAA;AACvB,MAAAA,KAAA,CAAI,6BAA6B,IAAK,CAAA,SAAA,CAAU,KAAK,MAAQ,EAAA,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA;AAGrE,MAAA,IAAI,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,SAAS,GAAK,EAAA;AAC/B,QAAA,MAAM,OAAU,GAAA,IAAA,CAAK,MAAO,CAAA,CAAC,EAAE,OAAW,IAAA,EAAA,CAAA;AAG1C,QAAM,MAAA,cAAA,GAAiB,OAAQ,CAAA,KAAA,CAAM,sBAAsB,CAAA,CAAA;AAC3D,QAAA,IAAI,cAAgB,EAAA;AAClB,UAAIA,KAAA,CAAA,mCAAA,EAAqC,cAAe,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,SAC5D;AAGA,QAAO,OAAA;AAAA,UACL,MAAQ,EAAA,OAAA;AAAA,UACR,KAAK,IAAI,mBAAA;AAAA,YACP,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAQqB,OAAO,CAAA,CAAA;AAAA,WAC9B;AAAA,SACF,CAAA;AAAA,OACF;AAEA,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,KAAK,IAAI,mBAAA;AAAA,UACP,CAAA,sBAAA,EAAyB,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,IAAI,CAAA,GAAA,EAAM,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,OAAO,CAAA,CAAA;AAAA,SAC1E;AAAA,OACF,CAAA;AAAA,KACF;AAGA,IAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACX,MAAO,OAAA,EAAE,QAAQ,OAAS,EAAA,GAAA,EAAK,IAAI,QAAS,CAAA,GAAA,EAAK,IAAI,CAAE,EAAA,CAAA;AAAA,KACzD;AAEA,IAAI,IAAA,IAAA,EAAM,cAAc,IAAM,EAAA;AAC5B,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,GAAA,EAAK,IAAI,mBAAA,CAAoB,uBAAuB,CAAA;AAAA,OACtD,CAAA;AAAA,KACF;AAEA,IAAI,IAAA,OAAO,IAAK,CAAA,UAAA,KAAe,QAAU,EAAA;AACvC,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,GAAA,EAAK,IAAI,mBAAA,CAAoB,8BAA8B,CAAA;AAAA,OAC7D,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,IAAK,CAAA,QAAA,EAAU,SAAS,IAAK,CAAA,QAAA,CAAS,CAAC,CAAI,GAAA,KAAA,CAAA,CAAA;AAC3D,IAAA,IAAI,OAAW,IAAA,CAAC,KAAM,CAAA,sBAAA,EAAwB,OAAkB,CAAG,EAAA;AACjE,MAAAA,KAAA;AAAA,QACE,+CAAA;AAAA,QACA,QAAQ,UAAc,IAAA,SAAA;AAAA,OACxB,CAAA;AAAA,KACF;AAEA,IAAI,IAAA,OAAA,IAAW,OAAQ,CAAA,UAAA,KAAe,kBAAoB,EAAA;AACxD,MAAO,OAAA;AAAA,QACL,MAAQ,EAAA,OAAA;AAAA,QACR,GAAA,EAAK,IAAI,mBAAA,CAAoB,wCAAwC,CAAA;AAAA,OACvE,CAAA;AAAA,KACF;AAEA,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,SAAA;AAAA,MACR,QAAU,EAAA,IAAA;AAAA,KACZ,CAAA;AAAA,GACF;AACF,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6Ba,gBAAA,CAsVa,8BAA8B,GAAM,GAAA,IAAA,CAAA;AAtVvD,IAAM,eAAN,GAAA,gBAAA;;ACtLP,MAAM,SAAY,GAAA;AAAA,EAChB,UACE,EAAA,2zEAAA;AAAA,EACF,oBACE,EAAA,uzEAAA;AAAA,EACF,eACE,EAAA,20EAAA;AAAA,EACF,gBACE,EAAA,qhCAAA;AAAA,EACF,WACE,EAAA,0jFAAA;AAAA,EACF,mBACE,EAAA,u0EAAA;AAAA,EACF,UACE,EAAA,yqEAAA;AAAA,EACF,cACE,EAAA,+vEAAA;AAAA,EACF,SACE,EAAA,uuEAAA;AAAA,EACF,SACE,EAAA,uuEAAA;AACJ,CAAA,CAAA;AA8DA,MAAM,UAAwB,CAAA;AAAA,EAM5B,YAAY,IAAyD,EAAA;AACnE,IAAA,IAAA,CAAK,MAAM,IAAK,CAAA,GAAA,CAAA;AAChB,IAAA,IAAA,CAAK,YAAY,IAAK,CAAA,SAAA,CAAA;AACtB,IAAA,IAAA,CAAK,WAAW,IAAK,CAAA,QAAA,CAAA;AACrB,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,YAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,YAAuB,GAAA;AACrB,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA,CAAA;AAGnC,IAAA,IAAI,KAAK,SAAW,EAAA;AAElB,MAAM,MAAA,YAAA,GAAe,SAAU,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAC7C,MAAA,IAAI,YAAc,EAAA,MAAA,CAAO,GAAI,CAAA,WAAA,EAAa,YAAY,CAAA,CAAA;AAAA,KACxD;AAEA,IAAA,IAAI,KAAK,QAAU,EAAA;AACjB,MAAM,MAAA,WAAA,GAAc,SAAU,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAC3C,MAAA,IAAI,WAAa,EAAA,MAAA,CAAO,GAAI,CAAA,UAAA,EAAY,WAAW,CAAA,CAAA;AAAA,KACrD;AAEA,IAAA,IAAI,KAAK,YAAc,EAAA;AACrB,MAAM,MAAA,eAAA,GAAkB,SAAU,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AACnD,MAAA,IAAI,eAAiB,EAAA,MAAA,CAAO,GAAI,CAAA,cAAA,EAAgB,eAAe,CAAA,CAAA;AAAA,KACjE;AAEA,IAAA,OAAO,GAAG,IAAK,CAAA,GAAG,CAAI,CAAA,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA,CAAA;AAAA,GACzC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAyC,GAAA;AACvC,IAAA,MAAM,OAAgC,EAAC,CAAA;AACvC,IAAA,IAAI,IAAK,CAAA,SAAA,EAAgB,IAAA,CAAA,SAAA,GAAY,IAAK,CAAA,SAAA,CAAA;AAC1C,IAAA,IAAI,IAAK,CAAA,QAAA,EAAe,IAAA,CAAA,QAAA,GAAW,IAAK,CAAA,QAAA,CAAA;AACxC,IAAA,IAAI,IAAK,CAAA,YAAA,EAAmB,IAAA,CAAA,YAAA,GAAe,IAAK,CAAA,YAAA,CAAA;AAChD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,CAAA;AASA,SAAS,qBAGP,OAAwD,EAAA;AACxD,EAAM,MAAA,EAAE,UAAU,IAAM,EAAA,QAAA,EAAU,cAAc,KAAM,EAAA,GAAI,IAAI,GAAA,CAAI,OAAO,CAAA,CAAA;AAEzE,EAAA,MAAM,OAAO,CAAG,EAAA,QAAQ,CAAK,EAAA,EAAA,IAAI,GAAG,QAAQ,CAAA,CAAA,CAAA;AAC5C,EAAM,MAAA,SAAA,GAAY,KAAM,CAAA,GAAA,CAAI,WAAW,CAAA,CAAA;AACvC,EAAM,MAAA,QAAA,GAAW,KAAM,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AACrC,EAAM,MAAA,YAAA,GAAe,KAAM,CAAA,GAAA,CAAI,cAAc,CAAA,CAAA;AAE7C,EAAA,OAAO,IAAI,UAAgC,CAAA;AAAA,IACzC,GAAK,EAAA,IAAA;AAAA,IACL,SAAW,EAAA,SAAA,GAAY,IAAK,CAAA,KAAA,CAAM,SAAS,CAAI,GAAA,KAAA,CAAA;AAAA,IAC/C,QAAU,EAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,QAAQ,CAAI,GAAA,KAAA,CAAA;AAAA,IAC5C,YAAc,EAAA,YAAA,GAAe,IAAK,CAAA,KAAA,CAAM,YAAY,CAAI,GAAA,KAAA,CAAA;AAAA,GACI,CAAA,CAAA;AAGhE,CAAA;AAOA,SAAS,wBACPM,UAC8B,EAAA;AAG9B,EAAO,OAAA,MAAA,CAAO,QAAQA,UAAS,CAAA,CAC5B,IAA8B,CAAC,CAAC,YAAc,EAAA,eAAe,CAAM,KAAA;AAElE,IAAO,OAAA;AAAA,MACL,CAAC,CAAA,MAAA,EAAS,YAAY,CAAA,OAAA,CAAS,GAAG,MAAM;AAGtC,QAAA,OAAO,qBAAqC,eAAe,CAAA,CAAA;AAAA,OAC7D;AAAA,KACF,CAAA;AAAA,GACD,CAAA,CACA,MAAO,CAAA,CAAC,KAAK,IAAS,KAAA;AAErB,IAAO,OAAA,MAAA,CAAO,MAAO,CAAA,GAAA,EAAK,IAAI,CAAA,CAAA;AAAA,GAC/B,CAAA,CAAA;AACL,CAAA;AAEa,MAAA,iBAAA,GAAoB,wBAAwB,SAAS,CAAA;;ACpDlE,SAAS,yBAAyB,SAA+B,EAAA;AAC/D,EAAA,OAAO,SAAY,GAAA,SAAA,CAAU,OAAQ,CAAA,SAAA,EAAW,EAAE,CAAI,GAAA,KAAA,CAAA,CAAA;AACxD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,cACS,EAAA;AACT,EAAA,MAAM,OAAmB,GAAA;AAAA,IACvB,MAAA,EAAQ,wBAAyB,CAAA,MAAA,CAAO,uBAAuB,CAAA;AAAA,IAC/D,QAAQ,MAAO,CAAA,kBAAA;AAAA,IACf,WAAW,MAAO,CAAA,WAAA;AAAA,IAClB,gBAAgB,MAAO,CAAA,eAAA;AAAA,IACvB,gBAAgB,MAAO,CAAA,aAAA;AAAA,IACvB,cAAc,MAAO,CAAA,aAAA;AAAA,IACrB,YAAY,MAAO,CAAA,WAAA;AAAA,IACnB,SAAA,EAAW,OAAO,SAAa,IAAA,KAAA;AAAA,IAC/B,YAAY,MAAO,CAAA,QAAA;AAAA,IACnB,YAAY,MAAO,CAAA,gBAAA;AAAA,IACnB,aAAa,MAAO,CAAA,YAAA;AAAA,IACpB,UAAU,MAAO,CAAA,QAAA;AAAA,IACjB,MAAM,MAAO,CAAA,IAAA;AAAA,IACb,gBAAgB,MAAO,CAAA,oBAAA;AAAA,IACvB,aAAa,MAAO,CAAA,cAAA;AAAA,IACpB,GAAA,EAAK,CAAiB,cAAA,EAAA,MAAA,CAAO,WAAW,CAAA,CAAA;AAAA,IACxC,QAAQ,MAAO,CAAA,MAAA;AAAA,IACf,UAAU,MAAO,CAAA,WAAA;AAAA,IACjB,gBAAgB,cAAkB,IAAA,KAAA;AAAA,IAClC,OAAO,MAAO,CAAA,MAAA;AAAA,GAChB,CAAA;AAEA,EAAI,IAAA,MAAA,CAAO,cAAc,IAAM,EAAA;AAC7B,IAAA,OAAA,CAAQ,SAAS,IAAI,IAAA,CAAK,KAAK,KAAM,CAAA,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,GACzD;AAEA,EAAM,MAAA,IAAA,GAAO,MAAO,CAAA,QAAA,EAAU,GAAK,EAAA,IAAA,CAAA;AACnC,EAAA,IAAI,IAAM,EAAA,MAAA,IAAU,IAAQ,IAAA,IAAA,EAAM,SAAS,CAAG,EAAA;AAC5C,IAAQ,OAAA,CAAA,OAAA,GAAU,IAAK,CAAA,CAAC,CAAE,CAAA,YAAA,CAAA;AAAA,GAC5B;AAEA,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAEsB,eAAA,UAAA,CACpB,UACA,IACoC,EAAA;AACpC,EAAM,MAAA,OAAA,GAAU,kBAAkB,6BAA8B,EAAA,CAAA;AAChE,EAAA,OAAA,CAAQ,UAAU,WAAc,GAAA,QAAA,CAAA;AAGhC,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,QAAQ,YAAa,EAAA;AAAA,IACrB,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AACA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,EAAE,OAAU,GAAA,GAAA,CAAA;AAClB,EAAM,MAAA,EAAE,QAAW,GAAA,KAAA,CAAA;AACnB,EAAA,IAAA,CACG,CAAC,KAAM,CAAA,IAAA,IAAQ,CAAC,KAAA,CAAM,KAAK,IAAQ,IAAA,CAAC,KAAM,CAAA,IAAA,CAAK,KAAK,MACrD,KAAA,MAAA,IAAU,IACV,IAAA,MAAA,CAAO,SAAS,CAChB,EAAA;AACA,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAK,EAAA,IAAI,KAAM,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,CAAA,CAAE,IAAK,CAAA,IAAI,CAAC,CAAA;AAAA,KACxD,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,CAAC,KAAM,CAAA,IAAA,IAAQ,CAAC,KAAA,CAAM,IAAK,CAAA,IAAA,IAAQ,CAAC,KAAA,CAAM,IAAK,CAAA,IAAA,CAAK,MAAQ,EAAA;AAC9D,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAA,EAAK,IAAI,KAAA,CAAM,iBAAiB,CAAA;AAAA,KAClC,CAAA;AAAA,GACF;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAK,EAAA,GAAI,MAAM,IAAK,CAAA,IAAA,CAAA;AACpC,EAAM,MAAA,EAAE,QAAW,GAAA,IAAA,CAAA;AAEnB,EAAA,IAAI,IAAK,CAAA,UAAA,KAAe,iBAAqB,IAAA,IAAA,EAAM,WAAW,WAAa,EAAA;AACzE,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAA,EAAK,IAAI,KAAA,CAAM,oBAAoB,CAAA;AAAA,KACrC,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,KAAK,OAAW,IAAA,IAAA,IAAQ,IAAK,CAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACrD,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAA,EAAK,IAAI,KAAA,CAAM,oBAAoB,CAAA;AAAA,KACrC,CAAA;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,SAAS,IAAK,CAAA,OAAA,CAAA;AACrB,EAAA,MAAA,CAAO,WAAP,KAAA,MAAA,CAAO,WAAgB,GAAA,IAAA,CAAK,IAAM,EAAA,WAAA,CAAA,CAAA;AAClC,EAAA,MAAA,CAAO,uBAAP,KAAA,MAAA,CAAO,uBAA4B,GAAA,IAAA,CAAK,MAAQ,EAAA,SAAA,CAAA,CAAA;AAChD,EAAA,MAAA,CAAO,UAAP,KAAA,MAAA,CAAO,UAAe,GAAA,IAAA,CAAK,IAAM,EAAA,UAAA,CAAA,CAAA;AACjC,EAAA,MAAA,CAAO,QAAP,KAAA,MAAA,CAAO,QAAa,GAAA,IAAA,CAAK,QAAU,EAAA,QAAA,CAAA,CAAA;AACnC,EAAA,MAAA,CAAO,IAAP,KAAA,MAAA,CAAO,IAAS,GAAA,IAAA,CAAK,IAAM,EAAA,IAAA,CAAA,CAAA;AAE3B,EAAA,IAAI,OAAO,WAAe,IAAA,IAAA,IAAQ,MAAO,CAAA,WAAA,CAAY,WAAW,CAAG,EAAA;AACjE,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAK,EAAA,IAAI,KAAM,CAAA,CAAA,KAAA,EAAQ,QAAQ,CAAgC,8BAAA,CAAA,CAAA;AAAA,KACjE,CAAA;AAAA,GACF;AAEA,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,IAAA;AAAA,IACT,KAAO,EAAA,YAAA,CAAa,MAAQ,EAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA,GACnD,CAAA;AACF,CAAA;AAEA,MAAM,OAAA,uBAAc,GAAoB,EAAA,CAAA;AAElB,eAAA,qBAAA,CACpB,YACA,IACmC,EAAA;AACnC,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AACrC,EAAA,IAAI,UAAU,IAAM,EAAA;AAClB,IAAA,OAAO,EAAE,OAAA,EAAS,IAAM,EAAA,KAAA,EAAO,MAAO,EAAA,CAAA;AAAA,GACxC;AAEA,EAAA,MAAM,UAAa,GAAA,MAAM,UAAW,CAAA,UAAA,EAAY,IAAI,CAAA,CAAA;AACpD,EAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,IAAO,OAAA,UAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,UAAU,UAAW,CAAA,KAAA,CAAA;AAC3B,EAAI,IAAA,OAAA,CAAQ,UAAU,IAAM,EAAA;AAC1B,IAAQ,OAAA,CAAA,GAAA,CAAI,UAAY,EAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAEtC,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,IAAA;AAAA,MACT,OAAO,OAAQ,CAAA,MAAA;AAAA,KACjB,CAAA;AAAA,GACF;AAEA,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,KAAA;AAAA,IACT,GAAA,EAAK,IAAI,KAAA,CAAM,uBAAuB,CAAA;AAAA,GACxC,CAAA;AACF;;ACxQuB,gBAAA,eAAA,CACrB,KACA,EAAA,WAAA,EACA,SAC+B,EAAA;AAC/B,EAAA,IAAI,SAAY,GAAA,CAAA,CAAA;AAChB,EAAA,IAAI,MAA6B,GAAA,KAAA,CAAA,CAAA;AACjC,EAAA,IAAI,uBAA0B,GAAA,CAAA,CAAA;AAC9B,EAAA,OAAO,YAAY,WAAa,EAAA;AAC9B,IAAA,MAAM,QAA+B,MAAM,SAAA;AAAA,MACzC,KAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,EAAE,QAAU,EAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAC3B,IAAS,MAAA,GAAA,IAAA,CAAA;AAET,IAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACzB,MAAA,uBAAA,EAAA,CAAA;AACA,MAAA,IAAI,0BAA0B,CAAG,EAAA,MAAA;AAAA,WACF,uBAAA,GAAA,CAAA,CAAA;AAEjC,IAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC9B,MAAI,IAAA,SAAA,GAAY,aAAmB,MAAA,OAAA,CAAA;AAAA,WAC9B,MAAA;AACL,MAAA,SAAA,EAAA,CAAA;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,IAAM,EAAA,MAAA;AAEX,IAAA,MAAM,OAAO,GAAI,CAAA,CAAA;AAAA,GACnB;AACF,CAAA;AAEuB,gBAAA,gBAAA,CACrB,KACA,EAAA,SAAA,EACA,SAC6B,EAAA;AAC7B,EAAA,IAAI,OAAU,GAAA,CAAA,CAAA;AACd,EAAA,IAAI,MAA6B,GAAA,KAAA,CAAA,CAAA;AACjC,EAAA,OAAO,UAAU,SAAW,EAAA;AAC1B,IAAA,MAAM,QAA6B,MAAM,SAAA;AAAA,MACvC,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,EAAE,MAAQ,EAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAEzB,IAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,MAAA,MAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,MAAA,IAAI,UAAU,SAAW,EAAA;AACvB,QAAS,MAAA,GAAA,IAAA,CAAA;AACT,QAAM,MAAA,KAAA,CAAA;AAAA,OACD,MAAA;AACL,QAAA,MAAA;AAAA,OACF;AAEA,MAAA,OAAA,EAAA,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,OAAO,GAAI,CAAA,CAAA;AAAA,GACnB;AACF;;AC1FO,SAAS,eAAqC,GAAQ,EAAA;AAC3D,EAAA,OAAO,SAAU,KAA2C,EAAA;AAC1D,IAAO,OAAA,SAAA,CAAU,KAAM,CAAA,GAAG,CAAC,CAAA,CAAA;AAAA,GAC7B,CAAA;AACF,CAAA;AAEO,SAAS,UAAa,KAAyC,EAAA;AACpE,EAAA,OAAO,KAAS,IAAA,IAAA,CAAA;AAClB;;ACRA,MAAM,SAAY,GAAA,cAAA,CAAA;AAClB,MAAM,SAAY,GAAA,cAAA,CAAA;AAClB,MAAM,YAAe,GAAA,gDAAA,CAAA;AACrB,MAAM,UAAa,GAAA,mBAAA,CAAA;AAEZ,SAAS,iBAAiB,KAI/B,EAAA;AACA,EAAA,MAAM,SAAkB,EAAC,CAAA;AACzB,EAAA,MAAM,SAAkB,EAAC,CAAA;AACzB,EAAA,IAAI,gBAAwC,GAAA,KAAA,CAAA,CAAA;AAE5C,EAAW,KAAA,MAAA,CAAA,IAAK,KACb,CAAA,MAAA,CAAO,cAAe,CAAA,QAAQ,CAAC,CAAA,CAC/B,MAAO,CAAA,cAAA,CAAe,iBAAiB,CAAC,CAAG,EAAA;AAC5C,IAAI,IAAA,CAAA,CAAE,SAAS,OAAS,EAAA;AACtB,MAAA,MAAA,CAAO,IAAK,CAAA;AAAA,QACV,IAAI,CAAE,CAAA,MAAA;AAAA,QACN,KAAK,CAAE,CAAA,eAAA;AAAA,QACP,UAAU,CAAE,CAAA,YAAA;AAAA,OACb,CAAA,CAAA;AAAA,KACH,MAAA,IAAW,CAAE,CAAA,IAAA,KAAS,OAAS,EAAA;AAC7B,MAAO,MAAA,CAAA,IAAA,CAAK,UAAW,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KAC3B,MAAA,IAAW,CAAE,CAAA,IAAA,KAAS,cAAgB,EAAA;AACpC,MAAO,MAAA,CAAA,IAAA,CAAK,QAAS,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KACzB;AAEA,IAAA,MAAM,YAAY,CAAE,CAAA,2BAAA,CAAA;AACpB,IAAA,IAAI,aAAa,IAAM,EAAA;AACrB,MAAA,gBAAA,GACE,SAAU,CAAA,aAAA,IACV,SAAU,CAAA,gBAAA,IACV,SAAU,CAAA,KAAA,CAAA;AAAA,KACd;AAAA,GACF;AAEA,EAAO,OAAA,EAAE,gBAAkB,EAAA,MAAA,EAAQ,MAAO,EAAA,CAAA;AAC5C,CAAA;AAEA,SAAS,SACP,CACO,EAAA;AACP,EAAA,MAAM,GAAa,GAAA;AAAA,IACjB,IAAI,CAAE,CAAA,MAAA;AAAA,IACN,SAAS,CAAE,CAAA,eAAA;AAAA,GACb,CAAA;AAEA,EAAA,MAAM,QAAW,GAAA,CAAA,CAAE,UAAY,EAAA,QAAA,IAAY,EAAC,CAAA;AAE5C,EAAM,MAAA,GAAA,GAAM,SAAS,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,YAAA,KAAiB,WAAW,CAAG,EAAA,GAAA,CAAA;AAElE,EAAA,IAAI,GAAK,EAAA;AACP,IAAA,GAAA,CAAI,OAAU,GAAA,GAAA,CAAA;AACd,IAAA,GAAA,CAAI,GAAM,GAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAEA,SAAS,WACP,CACO,EAAA;AACP,EAAA,MAAM,KAAe,GAAA;AAAA,IACnB,IAAI,CAAE,CAAA,MAAA;AAAA,IACN,SAAS,CAAE,CAAA,eAAA;AAAA,GACb,CAAA;AAEA,EAAA,IAAI,UAAa,GAAA,CAAA,CAAA;AACjB,EAAA,MAAM,QAAW,GAAA,CAAA,CAAE,UAAY,EAAA,QAAA,IAAY,EAAC,CAAA;AAC5C,EAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC9B,IAAA,MAAM,UAAU,OAAQ,CAAA,OAAA,CAAA;AACxB,IAAA,IAAI,WAAW,IAAQ,IAAA,OAAA,GAAU,UAAc,IAAA,OAAA,CAAQ,OAAO,IAAM,EAAA;AAClE,MAAA,IAAI,aAAa,OAAQ,CAAA,GAAA,CAAA;AACzB,MAAA,MAAM,WAAc,GAAA,CAAA,CAAA;AACpB,MAAM,MAAA,YAAA,GAAe,UAAW,CAAA,OAAA,CAAQ,SAAS,CAAA,CAAA;AACjD,MAAA,IAAI,iBAAiB,CAAI,CAAA,EAAA;AACvB,QAAA,UAAA,GAAa,UAAW,CAAA,SAAA,CAAU,WAAa,EAAA,YAAA,GAAe,CAAC,CAAA,CAAA;AAAA,OACjE;AAEA,MAAA,KAAA,CAAM,GAAM,GAAA,UAAA,CAAA;AACZ,MAAa,UAAA,GAAA,OAAA,CAAA;AAAA,KACf;AAAA,GACF;AAEA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEgB,SAAA,oBAAA,CACd,KACA,EAAA,MAAA,EACA,MACQ,EAAA;AACR,EAAA,MAAM,QAAkB,EAAC,CAAA;AAGzB,EAAI,IAAA,IAAA,GAAO,MAAM,SAAa,IAAA,EAAA,CAAA;AAE9B,EAAO,IAAA,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,eAAe,CAAA,CAAA;AAC9C,EAAO,IAAA,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,eAAe,CAAA,CAAA;AAC9C,EAAO,IAAA,GAAA,IAAA,CAAK,OAAQ,CAAA,UAAA,EAAY,gBAAgB,CAAA,CAAA;AAChD,EAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,YAAA,EAAc,gBAAiB,CAAA,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA;AAEhE,EAAW,KAAA,MAAA,EAAE,GAAI,EAAA,IAAK,MAAQ,EAAA;AAC5B,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,CAAI,CAAA,EAAA;AAC7B,MAAA,SAAA;AAAA,KACF;AAEA,IAAA,IAAA,IAAQ,iBAAiB,GAAG,CAAA,GAAA,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,GAAI,EAAA,IAAK,MAAQ,EAAA;AACrC,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,CAAI,CAAA,EAAA;AAC7B,MAAA,SAAA;AAAA,KACF;AAEA,IAAA,IAAA,IAAQ,iBAAiB,GAAG,CAAA,GAAA,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAO,IAAA,GAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AAEjC,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEA,SAAS,gBAAgB,OAAiB,EAAA;AACxC,EAAA,OAAO,kCAAkC,OAAQ,CAAA,OAAA;AAAA,IAC/C,GAAA;AAAA,IACA,EAAA;AAAA,GACD,KAAK,OAAO,CAAA,IAAA,CAAA,CAAA;AACf,CAAA;AAEA,SAAS,gBAAgB,OAAiB,EAAA;AACxC,EAAA,OAAO,sCAAsC,OAAQ,CAAA,OAAA;AAAA,IACnD,GAAA;AAAA,IACA,EAAA;AAAA,GACD,KAAK,OAAO,CAAA,IAAA,CAAA,CAAA;AACf,CAAA;AAEA,SAAS,iBAAiB,QAAkB,EAAA;AAC1C,EAAA,OAAO,0BAA0B,QAAS,CAAA,OAAA,CAAQ,KAAK,EAAE,CAAC,KAAK,QAAQ,CAAA,IAAA,CAAA,CAAA;AACzE,CAAA;AAEA,SAAS,gBAAA,CAAiB,OAAuB,YAAwB,EAAA;AACvE,EAAA,OAAO,SAAU,GAAa,EAAA;AAC5B,IAAA,KAAA,MAAW,MAAU,IAAA,KAAA,CAAM,QAAU,EAAA,IAAA,IAAQ,EAAI,EAAA;AAC/C,MAAA,IAAI,GAAQ,KAAA,MAAA,CAAO,GAAO,IAAA,MAAA,CAAO,gBAAgB,IAAM,EAAA;AACrD,QAAA,OAAO,CAAY,SAAA,EAAA,MAAA,CAAO,YAAY,CAAA,EAAA,EAAK,GAAG,CAAA,IAAA,CAAA,CAAA;AAAA,OAChD;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,MAAU,IAAA,KAAA,CAAM,iBAAmB,EAAA,KAAA,IAAS,EAAI,EAAA;AACzD,MAAA,IAAI,GAAQ,KAAA,MAAA,CAAO,GAAO,IAAA,MAAA,CAAO,mBAAmB,IAAM,EAAA;AACxD,QAAa,YAAA,CAAA,IAAA,CAAK,OAAO,eAAe,CAAA,CAAA;AACxC,QAAA,OAAO,CAAgB,aAAA,EAAA,GAAG,CAAe,YAAA,EAAA,MAAA,CAAO,eAAe,CAAA,OAAA,CAAA,CAAA;AAAA,OACjE;AAAA,KACF;AAEA,IAAO,OAAA,GAAA,CAAA;AAAA,GACT,CAAA;AACF;;ACrDA,SAAS,iBAAiB,KAAqD,EAAA;AAC7E,EAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,IAAA,OAAO,KAAM,CAAA,MAAA,CAAA;AAAA,GACf;AAEA,EAAA,OAAO,KAAM,CAAA,mBAAA,CAAA;AACf,CAAA;AAEO,SAAS,gBACd,CAAA,QAAA,EACA,IACA,EAAA,KAAA,EACA,WACkB,EAAA;AAClB,EAAA,IAAI,SAAS,IAAM,EAAA;AACjB,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAA,EAAK,IAAI,KAAA,CAAM,6CAA6C,CAAA;AAAA,KAC9D,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAA,EAAK,IAAI,KAAA,CAAM,4CAA4C,CAAA;AAAA,KAC7D,CAAA;AAAA,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,iBAAiB,KAAK,CAAA,CAAA;AACtC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA;AAAA,MACL,OAAS,EAAA,KAAA;AAAA,MACT,GAAA,EAAK,IAAI,KAAA,CAAM,mCAAmC,CAAA;AAAA,KACpD,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,QAAU,EAAA,QAAA,IAAY,EAAC,CAAA;AAC9C,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,QAAU,EAAA,aAAA,IAAiB,EAAC,CAAA;AACnD,EAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,iBAAmB,EAAA,KAAA,IAAS,EAAC,CAAA;AACjD,EAAA,MAAM,eAAe,IAAI,GAAA;AAAA,IACvB,IAAA,CAAK,wBAAwB,EAAC;AAAA,GAChC,CAAA;AACA,EAAA,MAAM,IAAO,GAAA,KAAA,CAAM,QAAU,EAAA,IAAA,IAAQ,EAAC,CAAA;AACtC,EAAA,MAAM,EAAE,MAAQ,EAAA,MAAA,EAAQ,gBAAiB,EAAA,GAAI,iBAAiB,KAAK,CAAA,CAAA;AAGnE,EAAA,MAAM,aAAgB,GAAA,WAAA,EAAa,cAAkB,IAAA,CAAC,OAAO,CAAA,CAAA;AAE7D,EAAM,MAAA,IAAA,GAAO,IAAK,CAAA,IAAA,IAAQ,QAAU,EAAA,IAAA,CAAA;AACpC,EAAM,MAAA,QAAA,GAAW,IAAK,CAAA,WAAA,IAAe,QAAU,EAAA,WAAA,CAAA;AAC/C,EAAA,MAAM,EAAY,GAAA;AAAA,IAChB,cAAgB,EAAA,KAAA;AAAA,IAChB,eAAe,KAAM,CAAA,cAAA;AAAA,IACrB,gBAAgB,KAAM,CAAA,mBAAA;AAAA,IACtB,EAAI,EAAA,OAAA;AAAA,IACJ,QAAA,EAAU,QACP,CAAA,MAAA,CAAO,cAAe,CAAA,MAAM,CAAC,CAAA,CAC7B,GAAI,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAChC,OAAO,KAAM,CAAA,cAAA;AAAA,IACb,QAAA,EAAU,SAAS,MAAO,CAAA,cAAA,CAAe,QAAQ,CAAC,CAAA,CAAE,GAAI,CAAA,CAAC,OAAa,MAAA;AAAA,MACpE,IAAI,OAAQ,CAAA,MAAA;AAAA,MACZ,UAAU,OAAQ,CAAA,WAAA;AAAA,MAClB,MAAM,OAAQ,CAAA,IAAA;AAAA,KACd,CAAA,CAAA;AAAA,IACF,IAAA;AAAA,IACA,YAAc,EAAA,CAAA,cAAA,EAAiB,QAAQ,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA;AAAA,IACzD,MAAA;AAAA,IACA,SAAS,KAAM,CAAA,WAAA;AAAA,IACf,UAAU,KAAM,CAAA,aAAA;AAAA,IAChB,MAAM,KAAM,CAAA,SAAA;AAAA,IACZ,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,IACH,CAAA,MAAA,CAAO,cAAe,CAAA,cAAc,CAAC,CAAA,CACrC,GAAI,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,YAAY,CAAA;AAAA,IAChC,QAAQ,KAAM,CAAA,WAAA;AAAA,IACd,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAU,EAAA,KAAA;AAAA,IACV,OAAS,EAAA,KAAA;AAAA,IACT,QAAA,EAAU,cAAc,MAAS,GAAA,CAAA;AAAA,IACjC,QAAU,EAAA,aAAA;AAAA,IACV,SAAW,EAAA,KAAA;AAAA,IACX,KAAO,EAAA,KAAA;AAAA,IACP,gBAAkB,EAAA,KAAA;AAAA,GACpB,CAAA;AAEA,EAAA,IAAI,MAAM,UAAY,EAAA;AACpB,IAAA,EAAA,CAAG,aAAa,IAAI,IAAA,CAAK,KAAK,KAAM,CAAA,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA;AACrD,IAAA,EAAA,CAAG,YAAY,IAAK,CAAA,KAAA,CAAM,GAAG,UAAW,CAAA,OAAA,KAAY,GAAI,CAAA,CAAA;AAAA,GAC1D;AAEA,EAAI,IAAA,KAAA,CAAM,OAAO,EAAI,EAAA;AACnB,IAAA,EAAA,CAAG,QAAQ,KAAM,CAAA,KAAA,CAAA;AAAA,GACnB;AAEA,EAAA,MAAM,oBAAoB,KAAM,CAAA,oBAAA,CAAA;AAChC,EAAA,MAAM,uBAAuB,KAAM,CAAA,yBAAA,CAAA;AACnC,EAAA,MAAM,uBAAuB,KAAM,CAAA,uBAAA,CAAA;AACnC,EAAM,MAAA,qBAAA,GAAwB,MAAM,uBAAyB,EAAA,MAAA,CAAA;AAE7D,EAAA,IAAI,iBAAmB,EAAA;AACrB,IAAA,EAAA,CAAG,QAAW,GAAA,IAAA,CAAA;AACd,IAAA,EAAA,CAAG,cAAiB,GAAA,iBAAA,CAAA;AAAA,GACtB;AAEA,EAAA,IAAI,oBAAsB,EAAA;AACxB,IAAA,EAAA,CAAG,OAAU,GAAA,IAAA,CAAA;AACb,IAAA,EAAA,CAAG,iBAAoB,GAAA,oBAAA,CAAA;AAAA,GACzB;AAEA,EAAA,IAAI,wBAAwB,qBAAuB,EAAA;AACjD,IAAA,EAAA,CAAG,SAAY,GAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,iBAAoB,GAAA,oBAAA,CAAA;AAEvB,IAAA,IAAI,qBAAuB,EAAA;AACzB,MAAA,MAAM,YAAe,GAAA,gBAAA;AAAA,QACnB,qBAAA,EAAuB,IAAM,EAAA,YAAA,EAAc,MAAQ,EAAA,IAAA;AAAA,QACnD,qBAAA,EAAuB,IAAM,EAAA,YAAA,EAAc,MAAQ,EAAA,MAAA;AAAA,QACnD,qBAAuB,EAAA,MAAA;AAAA,QACvB,uBAAuB,YAAc,EAAA,oBAAA;AAAA,OACvC,CAAA;AAEA,MAAA,IAAI,aAAa,OAAS,EAAA;AACxB,QAAA,EAAA,CAAG,kBAAkB,YAAa,CAAA,KAAA,CAAA;AAAA,OACpC;AAAA,KACF;AAAA,GACF;AAEA,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,SAAA,EAAW,SAAS,EAAE,CAAA,CAAA;AACnD,EAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,IAAA,EAAA,CAAG,KAAQ,GAAA,KAAA,CAAA;AAAA,GACb;AAEA,EAAI,IAAA,YAAA,CAAa,GAAI,CAAA,OAAO,CAAG,EAAA;AAE7B,IAAA,EAAA,CAAG,KAAQ,GAAA,IAAA,CAAA;AAAA,GACb;AAEA,EAAA,IAAI,gBAAkB,EAAA;AAEpB,IAAA,EAAA,CAAG,gBAAmB,GAAA,IAAA,CAAA;AAAA,GACxB;AAEA,EAAA,EAAA,CAAG,OAAO,oBAAqB,CAAA,KAAA,EAAO,EAAG,CAAA,MAAA,EAAQ,GAAG,MAAM,CAAA,CAAA;AAE1D,EAAA,OAAO,EAAE,OAAA,EAAS,IAAM,EAAA,KAAA,EAAO,EAAG,EAAA,CAAA;AACpC,CAAA;AAEA,SAAS,YAAY,MAA8C,EAAA;AACjE,EAAA,MAAM,mBACJ,GAAA,MAAA,EAAQ,UAAY,EAAA,kBAAA,EAAoB,MAAQ,EAAA,IAAA,CAAA;AAElD,EAAI,IAAA,MAAA,EAAQ,UAAU,mBAAqB,EAAA;AACzC,IAAA,MAAA,CAAO,OAAO,SAAY,GAAA,mBAAA,CAAA;AAAA,GAC5B;AAEA,EAAA,MAAM,WAAc,GAAA,gBAAA;AAAA,IAClB,MAAA,EAAQ,IAAM,EAAA,YAAA,EAAc,MAAQ,EAAA,IAAA;AAAA,IACpC,MAAA,EAAQ,IAAM,EAAA,YAAA,EAAc,MAAQ,EAAA,MAAA;AAAA,IACpC,MAAQ,EAAA,MAAA;AAAA,IACR,QAAQ,YAAc,EAAA,oBAAA;AAAA,GACxB,CAAA;AACA,EAAI,IAAA,CAAC,YAAY,OAAS,EAAA;AACxB,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,CAAC,WAAY,CAAA,KAAA,CAAM,KAAS,IAAA,MAAA,EAAQ,OAAO,KAAO,EAAA;AACpD,IAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,MAAO,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACzC,IAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,MAAA,WAAA,CAAY,MAAM,KAAQ,GAAA,KAAA,CAAA;AAAA,KAC5B;AAAA,GACF;AAEA,EAAM,MAAA,YAAA,GAAe,QAAQ,oBAAsB,EAAA,MAAA,CAAA;AACnD,EAAA,IAAI,YAAc,EAAA;AAChB,IAAI,IAAA,YAAA,CAAa,MAAU,IAAA,YAAA,CAAa,OAAS,EAAA;AAC/C,MAAa,YAAA,CAAA,MAAA,CAAO,SAAS,YAAa,CAAA,OAAA,CAAA;AAAA,KAC5C;AAEA,IAAM,MAAA,iBAAA,GAAoB,YAAY,YAAY,CAAA,CAAA;AAClD,IAAA,IAAI,kBAAkB,OAAS,EAAA;AAC7B,MAAY,WAAA,CAAA,KAAA,CAAM,eAAe,iBAAkB,CAAA,KAAA,CAAA;AAAA,KACrD;AAAA,GACF;AAEA,EAAO,OAAA,WAAA,CAAA;AACT,CAAA;AAEA,MAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,sBAAsB,CAAA,CAAA;AAE3D,SAAS,8BACP,WACoB,EAAA;AACpB,EAAM,MAAA,OAAA,GAAU,WAAY,CAAA,OAAA,IAAW,EAAC,CAAA;AACxC,EAAA,IAAI,YAAY,KAAO,EAAA;AACrB,IAAQ,OAAA,CAAA,IAAA,CAAK,YAAY,KAAK,CAAA,CAAA;AAAA,GAChC;AACA,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAEO,SAAS,sBACd,QACqB,EAAA;AACrB,EAAI,IAAA,YAAA,CAAA;AACJ,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,MAAM,SAAkB,EAAC,CAAA;AACzB,EAAM,MAAA,YAAA,GACJ,SAAS,IAAM,EAAA,IAAA,EAAM,QAAQ,QAAU,EAAA,QAAA,EAAU,gBAAgB,EAAC,CAAA;AACpE,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAM,MAAA,OAAA,GAAU,8BAA8B,WAAW,CAAA,CAAA;AACzD,IAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,MAAA,MAAM,eAAe,KAAM,CAAA,OAAA,CAAA;AAC3B,MAAA,IAAI,CAAC,YAAc,EAAA,SAAA;AAGnB,MAAI,IAAA,YAAA,CAAa,eAAe,QAAU,EAAA;AACxC,QAAA,YAAA,GAAe,YAAa,CAAA,KAAA,CAAA;AAC5B,QAAA,SAAA;AAAA,OACF,MAAA,IAAW,YAAa,CAAA,UAAA,KAAe,KAAO,EAAA;AAC5C,QAAA,SAAA,GAAY,YAAa,CAAA,KAAA,CAAA;AACzB,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,MAAM,QAAQ,KAAM,CAAA,OAAA,CAAA;AACpB,MACE,IAAA,CAAC,mBAAmB,IAAK,CAAA,CAAC,cAAc,KAAM,CAAA,UAAA,CAAW,SAAS,CAAC,CACnE,EAAA;AACA,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,IAAI,aAAa,WAAa,EAAA;AAE5B,QAAa,YAAA,CAAA,MAAA,EAAQ,YAAa,CAAA,WAAA,EAAa,KAAK,CAAA,CAAA;AAAA,OACtD,MAAA,IAAW,aAAa,KAAO,EAAA;AAE7B,QAAW,KAAA,MAAA,IAAA,IAAQ,aAAa,KAAO,EAAA;AACrC,UAAI,IAAA,IAAA,CAAK,MAAM,WAAa,EAAA;AAC1B,YAAA,YAAA,CAAa,MAAQ,EAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,KAAK,CAAA,CAAA;AAAA,WACnD;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAM,EAAA,YAAA,EAAc,UAAU,SAAU,EAAA,CAAA;AAC3D,CAAA;AAEO,SAAS,gCACd,CAAA,OAAA,EACA,OACA,EAAA,cAAA,GAAiB,KACjB,EAAA;AACA,EAAA,IAAI,MAAS,GAAA,OAAA,CAAQ,aAAe,EAAA,MAAA,IAAU,QAAQ,WAAa,EAAA,MAAA,CAAA;AACnE,EAAA,IACE,QAAQ,UAAe,KAAA,OAAA,IACtB,QAAQ,UAAe,KAAA,4BAAA,IAAgC,QAAQ,KAChE,EAAA;AACA,IAAA,IAAI,QAAQ,UAAe,KAAA,4BAAA;AACzB,MAAA,MAAA,GAAS,MAAO,CAAA,KAAA,CAAA;AAElB,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAO,MAAA,CAAA,MAAA,CAAO,MACZ,GAAA,MAAA,CAAO,OACP,IAAA,OAAA,CAAQ,OAAQ,CAAA,eAAA,EAAiB,EAAE,CAAA,CAAE,OAAQ,CAAA,QAAA,EAAU,EAAE,CAAA,CAAA;AAAA,KAC7D;AAEA,IAAM,MAAA,WAAA,GAAc,YAAY,MAAM,CAAA,CAAA;AACtC,IAAA,IAAI,YAAY,OAAS,EAAA;AACvB,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAI,IAAA,OAAA,EAAS,qBAAqB,YAAc,EAAA;AAC9C,UAAA,WAAA,CAAY,MAAM,YAAe,GAAA,IAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAEA,MAAA,OAAO,WAAY,CAAA,KAAA,CAAA;AAAA,KACrB;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEO,SAAS,YACd,CAAA,MAAA,EACA,OACA,EAAA,OAAA,EACA,iBAAiB,KACjB,EAAA;AACA,EAAA,MAAM,KAAQ,GAAA,gCAAA;AAAA,IACZ,OAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,GACnB;AACF,CAAA;AAEO,SAAS,0BACd,YACS,EAAA;AACT,EAAA,MAAM,SAAkB,EAAC,CAAA;AACzB,EAAA,MAAM,YACJ,GAAA,YAAA,CAAa,IAAM,EAAA,wCAAA,EAA0C,gBAC7D,EAAC,CAAA;AAEH,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAM,MAAA,OAAA,GAAU,8BAA8B,WAAW,CAAA,CAAA;AACzD,IAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,MAAM,MAAA,YAAA,GAAe,MAAM,OAAS,EAAA,WAAA,CAAA;AACpC,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,YAAA,CAAa,MAAQ,EAAA,YAAA,EAAc,KAAM,CAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAAA,OACxD;AAEA,MAAA,KAAA,MAAW,IAAQ,IAAA,KAAA,CAAM,OAAS,EAAA,KAAA,IAAS,EAAI,EAAA;AAC7C,QAAM,MAAA,WAAA,GAAc,KAAK,IAAM,EAAA,WAAA,CAAA;AAC/B,QAAA,IAAI,WAAa,EAAA;AACf,UAAA,YAAA,CAAa,MAAQ,EAAA,WAAA,EAAa,KAAM,CAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAAA,SACvD;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,IAAA,IAAI,MAAM,iBAAmB,EAAA;AAC3B,MAAA,KAAA,MAAW,eAAe,MAAQ,EAAA;AAChC,QAAI,IAAA,WAAA,CAAY,EAAO,KAAA,KAAA,CAAM,iBAAmB,EAAA;AAC9C,UAAA,KAAA,CAAM,eAAkB,GAAA,WAAA,CAAA;AACxB,UAAA,MAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEA,IAAA,IAAI,KAAM,CAAA,YAAA,IAAgB,KAAM,CAAA,cAAA,KAAmB,MAAM,EAAI,EAAA;AAC3D,MAAA,KAAA,MAAW,cAAc,MAAQ,EAAA;AAC/B,QAAA,IAAI,UAAW,CAAA,YAAA,IAAgB,UAAW,CAAA,EAAA,KAAO,MAAM,EAAI,EAAA;AACzD,UAAM,KAAA,CAAA,MAAA,CAAO,KAAK,UAAU,CAAA,CAAA;AAAA,SAC9B;AAAA,OACF;AAEA,MAAI,IAAA,KAAA,CAAM,MAAO,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAA,KAAA,CAAM,YAAe,GAAA,KAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;ACrbO,SAAS,0BACd,QACqB,EAAA;AACrB,EAAI,IAAA,YAAA,CAAA;AACJ,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,MAAM,SAAkB,EAAC,CAAA;AACzB,EAAA,MAAM,eACJ,QAAS,CAAA,IAAA,EAAM,qBAAqB,eAAiB,EAAA,QAAA,EACjD,gBAAgB,EAAC,CAAA;AACvB,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAA,IACE,WAAY,CAAA,IAAA,KAAS,oBACrB,IAAA,WAAA,CAAY,SAAS,sBACrB,EAAA;AACA,MAAA,IAAI,WAAY,CAAA,KAAA,EAAO,OAAS,EAAA,UAAA,KAAe,QAAU,EAAA;AACvD,QAAe,YAAA,GAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AACzC,QAAA,SAAA;AAAA,OACS,MAAA,IAAA,WAAA,CAAY,KAAO,EAAA,OAAA,EAAS,eAAe,KAAO,EAAA;AAC3D,QAAY,SAAA,GAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AACtC,QAAA,SAAA;AAAA,OACF;AAEA,MAAM,MAAA,OAAA,GAAU,WAAY,CAAA,OAAA,IAAW,EAAC,CAAA;AACxC,MAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,QAAM,MAAA,WAAA,GAAc,MAAM,OAAS,EAAA,WAAA,CAAA;AACnC,QAAI,IAAA,WAAA,EAAa,qBAAqB,OAAS,EAAA;AAC7C,UAAM,MAAA,cAAA,GAAiB,YAAY,aAAe,EAAA,MAAA,CAAA;AAClD,UAAA,MAAM,WAAc,GAAA,gBAAA;AAAA,YAClB,cAAA,EAAgB,IAAM,EAAA,YAAA,EAAc,MAAQ,EAAA,IAAA;AAAA,YAC5C,cAAA,EAAgB,IAAM,EAAA,YAAA,EAAc,MAAQ,EAAA,MAAA;AAAA,YAC5C,cAAgB,EAAA,MAAA;AAAA,YAChB,gBAAgB,YAAc,EAAA,oBAAA;AAAA,WAChC,CAAA;AAEA,UAAA,IAAI,YAAY,OAAS,EAAA;AACvB,YAAA,IAAI,CAAC,WAAY,CAAA,KAAA,CAAM,KAAS,IAAA,cAAA,EAAgB,OAAO,KAAO,EAAA;AAC5D,cAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,cAAe,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACjD,cAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,gBAAA,WAAA,CAAY,MAAM,KAAQ,GAAA,KAAA,CAAA;AAAA,eAC5B;AAAA,aACF;AAEA,YAAO,MAAA,CAAA,IAAA,CAAK,YAAY,KAAK,CAAA,CAAA;AAAA,WAC/B;AAAA,SACS,MAAA,IAAA,KAAA,CAAM,OAAS,EAAA,UAAA,KAAe,QAAU,EAAA;AACjD,UAAA,YAAA,GAAe,MAAM,OAAQ,CAAA,KAAA,CAAA;AAAA,SACpB,MAAA,IAAA,KAAA,CAAM,OAAS,EAAA,UAAA,KAAe,KAAO,EAAA;AAC9C,UAAA,SAAA,GAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AAAA,SAC5B;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAM,EAAA,YAAA,EAAc,UAAU,SAAU,EAAA,CAAA;AAC3D,CAAA;AAEO,SAAS,yBACd,QACuB,EAAA;AACvB,EAAI,IAAA,YAAA,CAAA;AACJ,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,MAAM,WAAsB,EAAC,CAAA;AAC7B,EAAA,MAAM,eACJ,QAAS,CAAA,IAAA,EAAM,qBAAqB,eAAiB,EAAA,QAAA,EACjD,gBAAgB,EAAC,CAAA;AAEvB,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAA,IACE,WAAY,CAAA,IAAA,KAAS,oBACrB,IAAA,WAAA,CAAY,SAAS,sBACrB,EAAA;AACA,MAAA,IAAI,WAAY,CAAA,KAAA,EAAO,OAAS,EAAA,UAAA,KAAe,QAAU,EAAA;AACvD,QAAe,YAAA,GAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AACzC,QAAA,SAAA;AAAA,OACS,MAAA,IAAA,WAAA,CAAY,KAAO,EAAA,OAAA,EAAS,eAAe,KAAO,EAAA;AAC3D,QAAY,SAAA,GAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AACtC,QAAA,SAAA;AAAA,OACF;AAEA,MAAM,MAAA,OAAA,GAAU,WAAY,CAAA,OAAA,IAAW,EAAC,CAAA;AACxC,MAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,QAAM,MAAA,WAAA,GAAc,MAAM,OAAS,EAAA,WAAA,CAAA;AACnC,QAAI,IAAA,WAAA,EAAa,oBAAoB,MAAQ,EAAA;AAC3C,UAAM,MAAA,aAAA,GAAgB,YAAY,YAAc,EAAA,MAAA,CAAA;AAEhD,UAAA,IAAI,eAAe,MAAQ,EAAA;AACzB,YAAA,MAAM,OAAU,GAAA,YAAA;AAAA,cACd,aAAc,CAAA,MAAA;AAAA,cACd,aAAc,CAAA,gBAAA;AAAA,aAChB,CAAA;AAEA,YAAI,IAAA,CAAC,QAAQ,MAAQ,EAAA;AACnB,cAAA,OAAA,CAAQ,SAAS,aAAc,CAAA,OAAA,CAAA;AAAA,aACjC;AAEA,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA,CAAA;AAAA,WACvB;AAAA,SACS,MAAA,IAAA,KAAA,CAAM,OAAS,EAAA,UAAA,KAAe,QAAU,EAAA;AACjD,UAAA,YAAA,GAAe,MAAM,OAAQ,CAAA,KAAA,CAAA;AAAA,SACpB,MAAA,IAAA,KAAA,CAAM,OAAS,EAAA,UAAA,KAAe,KAAO,EAAA;AAC9C,UAAA,SAAA,GAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AAAA,SAC5B;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,IAAM,EAAA,YAAA,EAAc,UAAU,SAAU,EAAA,CAAA;AAC7D;;AC/GY,IAAA,UAAA,qBAAAC,WAAL,KAAA;AACL,EAAAA,WAAA,CAAA,WAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA,CAAA;AACA,EAAAA,WAAA,CAAA,WAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA,CAAA;AACA,EAAAA,WAAA,CAAA,WAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA,CAAA;AACA,EAAAA,WAAA,CAAA,WAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA,CAAA;AACA,EAAAA,WAAA,CAAA,WAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA,CAAA;AALU,EAAAA,OAAAA,WAAAA,CAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA,EAAA;AAQL,SAAS,YACd,CAAA,KAAA,EACA,SACA,EAAA,UAAA,EACA,IAC6B,EAAA;AAC7B,EAAA,OAAO,iBAAiB,KAAO,EAAA,SAAA,EAAW,CAAC,CAAA,EAAG,IAAI,CAAM,KAAA;AACtD,IAAA,OAAO,iBAAkB,CAAA,CAAA,EAAG,EAAI,EAAA,UAAA,EAAY,MAAM,CAAC,CAAA,CAAA;AAAA,GACpD,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,cAAA,CACd,KACA,EAAA,WAAA,EACA,IAC+B,EAAA;AAC/B,EAAA,OAAO,gBAAgB,KAAO,EAAA,WAAA,EAAa,CAAC,CAAA,EAAG,IAAI,CAAM,KAAA;AACvD,IAAA,OAAO,mBAAoB,CAAA,CAAA,EAAG,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,GAC1C,CAAA,CAAA;AACH,CAAA;AAEA,eAAsB,iBACpB,CAAA,KAAA,EACA,SACA,EAAA,UAAA,EACA,MACA,MAC8B,EAAA;AAC9B,EAAA,MAAM,WAAW,MAAM,iBAAA;AAAA,IACrB,KAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,0BAA0B,QAAQ,CAAA,CAAA;AAC3C,CAAA;AAEA,eAAsB,mBACpB,CAAA,KAAA,EACA,WACA,EAAA,IAAA,EACA,MACgC,EAAA;AAChC,EAAA,MAAM,WAAW,MAAM,iBAAA;AAAA,IACrB,KAAA;AAAA,IACA,WAAA;AAAA,IACA,CAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,yBAAyB,QAAQ,CAAA,CAAA;AAC1C,CAAA;AAEA,eAAe,iBACb,CAAA,KAAA,EACA,QACA,EAAA,UAAA,EACA,MACA,MACyB,EAAA;AACzB,EAAA,IAAI,CAAE,MAAM,IAAK,CAAA,UAAA,EAAe,EAAA;AAC9B,IAAM,MAAA,IAAI,oBAAoB,sCAAsC,CAAA,CAAA;AAAA,GACtE;AAEA,EAAA,IAAI,WAAW,EAAI,EAAA;AACjB,IAAW,QAAA,GAAA,EAAA,CAAA;AAAA,GACb;AAEA,EAAM,MAAA,qBAAA,GAAwB,kBAAkB,2BAA4B,EAAA,CAAA;AAC5E,EAAA,qBAAA,CAAsB,UAAU,QAAW,GAAA,KAAA,CAAA;AAC3C,EAAA,qBAAA,CAAsB,UAAU,KAAQ,GAAA,QAAA,CAAA;AACxC,EAAA,qBAAA,CAAsB,UAAU,WAAc,GAAA,aAAA,CAAA;AAC9C,EAAA,qBAAA,CAAsB,UAAU,OAAU,GAAA,KAAA,CAAA;AAE1C,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAsB,qBAAA,CAAA,SAAA,CAAU,QAAQ,CAAI,GAAA,MAAA,CAAA;AAAA,GAC9C;AAEA,EAAA,QAAQ,UAAY;AAAA,IAClB,KAAK,CAAA;AACH,MAAA,qBAAA,CAAsB,UAAU,OAAU,GAAA,QAAA,CAAA;AAC1C,MAAA,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,qBAAA,CAAsB,UAAU,OAAU,GAAA,QAAA,CAAA;AAC1C,MAAA,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,qBAAA,CAAsB,UAAU,OAAU,GAAA,QAAA,CAAA;AAC1C,MAAA,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,qBAAA,CAAsB,UAAU,OAAU,GAAA,QAAA,CAAA;AAC1C,MAAA,MAAA;AAEA,GACJ;AAEA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,qBAAsB,CAAA,GAAA;AAAA,IACtB,IAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,IACA,sBAAsB,aAAc,EAAA;AAAA,GACtC,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAA,OAAO,GAAI,CAAA,KAAA,CAAA;AACb;;AChGO,SAAS,0BACd,QACuB,EAAA;AACvB,EAAI,IAAA,YAAA,CAAA;AACJ,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,MAAM,WAAsB,EAAC,CAAA;AAC7B,EAAM,MAAA,YAAA,GACJ,SAAS,IAAM,EAAA,IAAA,EAAM,QAAQ,QAAU,EAAA,QAAA,EAAU,gBAAgB,EAAC,CAAA;AAEpE,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAA,IACE,WAAY,CAAA,IAAA,KAAS,oBACrB,IAAA,WAAA,CAAY,SAAS,sBACrB,EAAA;AACA,MAAA,IAAI,WAAY,CAAA,KAAA,EAAO,OAAS,EAAA,UAAA,KAAe,QAAU,EAAA;AACvD,QAAe,YAAA,GAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AACzC,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,IAAI,WAAY,CAAA,KAAA,EAAO,OAAS,EAAA,UAAA,KAAe,KAAO,EAAA;AACpD,QAAY,SAAA,GAAA,WAAA,CAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AACtC,QAAA,SAAA;AAAA,OACF;AAEA,MAAM,MAAA,OAAA,GAAU,WAAY,CAAA,OAAA,IAAW,EAAC,CAAA;AACxC,MAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,QAAM,MAAA,WAAA,GAAc,MAAM,OAAS,EAAA,WAAA,CAAA;AACnC,QAAI,IAAA,WAAA,EAAa,oBAAoB,MAAQ,EAAA;AAC3C,UAAM,MAAA,aAAA,GAAgB,YAAY,YAAc,EAAA,MAAA,CAAA;AAEhD,UAAA,IAAI,eAAe,MAAQ,EAAA;AACzB,YAAA,MAAM,OAAU,GAAA,YAAA;AAAA,cACd,aAAc,CAAA,MAAA;AAAA,cACd,aAAc,CAAA,gBAAA;AAAA,aAChB,CAAA;AAEA,YAAI,IAAA,CAAC,QAAQ,MAAQ,EAAA;AACnB,cAAA,OAAA,CAAQ,SAAS,aAAc,CAAA,OAAA,CAAA;AAAA,aACjC;AAGA,YAAA,IAAI,CAAC,OAAA,CAAQ,QAAY,IAAA,aAAA,CAAc,MAAM,WAAa,EAAA;AACxD,cAAQ,OAAA,CAAA,QAAA,GAAW,cAAc,IAAK,CAAA,WAAA,CAAA;AACtC,cAAQ,OAAA,CAAA,GAAA,GAAM,CAAiB,cAAA,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAA;AAAA,aACjD;AAGA,YAAA,IAAI,CAAC,OAAA,CAAQ,MAAU,IAAA,aAAA,CAAc,MAAM,UAAY,EAAA;AACrD,cAAA,OAAA,CAAQ,SAAS,IAAI,IAAA;AAAA,gBACnB,IAAK,CAAA,KAAA,CAAM,aAAc,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,eAC1C,CAAA;AAAA,aACF;AAEA,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA,CAAA;AAAA,WACvB;AAAA,SACS,MAAA,IAAA,KAAA,CAAM,OAAS,EAAA,UAAA,KAAe,QAAU,EAAA;AACjD,UAAA,YAAA,GAAe,MAAM,OAAQ,CAAA,KAAA,CAAA;AAAA,SACpB,MAAA,IAAA,KAAA,CAAM,OAAS,EAAA,UAAA,KAAe,KAAO,EAAA;AAC9C,UAAA,SAAA,GAAY,MAAM,OAAQ,CAAA,KAAA,CAAA;AAAA,SAC5B;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,IAAM,EAAA,YAAA,EAAc,UAAU,SAAU,EAAA,CAAA;AAC7D;;AC/FgB,SAAA,YAAA,CACd,MACA,EAAA,WAAA,EACA,IAC+B,EAAA;AAC/B,EAAA,OAAO,gBAAgB,MAAQ,EAAA,WAAA,EAAa,CAAC,CAAA,EAAG,IAAI,CAAM,KAAA;AACxD,IAAA,OAAO,qBAAsB,CAAA,CAAA,EAAG,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,GAC5C,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,YAAA,CACd,MACA,EAAA,WAAA,EACA,IAC+B,EAAA;AAC/B,EAAA,OAAO,gBAAgB,MAAQ,EAAA,WAAA,EAAa,CAAC,CAAA,EAAG,IAAI,CAAM,KAAA;AACxD,IAAA,OAAO,qBAAsB,CAAA,CAAA,EAAG,EAAI,EAAA,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,GAC5C,CAAA,CAAA;AACH,CAAA;AAEA,eAAsB,qBACpB,CAAA,MAAA,EACA,WACA,EAAA,IAAA,EACA,MACgC,EAAA;AAChC,EAAA,IAAI,CAAE,MAAM,IAAK,CAAA,UAAA,EAAe,EAAA;AAC9B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,iDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,IACrB,MAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,0BAA0B,QAAQ,CAAA,CAAA;AAC3C,CAAA;AAEA,eAAsB,qBACpB,CAAA,MAAA,EACA,WACA,EAAA,IAAA,EACA,MACgC,EAAA;AAChC,EAAA,IAAI,CAAE,MAAM,IAAK,CAAA,UAAA,EAAe,EAAA;AAC9B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,iDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,IACrB,MAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,0BAA0B,QAAQ,CAAA,CAAA;AAC3C,CAAA;AAEA,eAAe,oBACb,CAAA,MAAA,EACA,QACA,EAAA,IAAA,EACA,MAC+B,EAAA;AAC/B,EAAI,IAAA,CAAC,IAAK,CAAA,UAAA,EAAc,EAAA;AACtB,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,iDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,WAAW,EAAI,EAAA;AACjB,IAAW,QAAA,GAAA,EAAA,CAAA;AAAA,GACb;AAEA,EAAM,MAAA,gBAAA,GAAmB,kBAAkB,sBAAuB,EAAA,CAAA;AAClE,EAAA,gBAAA,CAAiB,UAAU,MAAS,GAAA,MAAA,CAAA;AACpC,EAAA,gBAAA,CAAiB,UAAU,KAAQ,GAAA,QAAA,CAAA;AACnC,EAAA,gBAAA,CAAiB,UAAU,sBAAyB,GAAA,KAAA,CAAA;AAEpD,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAA,gBAAA,CAAiB,UAAU,MAAS,GAAA,MAAA,CAAA;AAAA,GACtC;AAEA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,iBAAiB,YAAa,EAAA;AAAA,IAC9B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAA,OAAO,GAAI,CAAA,KAAA,CAAA;AACb,CAAA;AAEA,eAAe,oBACb,CAAA,MAAA,EACA,QACA,EAAA,IAAA,EACA,MAC+B,EAAA;AAC/B,EAAI,IAAA,CAAC,IAAK,CAAA,UAAA,EAAc,EAAA;AACtB,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,iDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,WAAW,EAAI,EAAA;AACjB,IAAW,QAAA,GAAA,EAAA,CAAA;AAAA,GACb;AAEA,EAAM,MAAA,gBAAA,GAAmB,kBAAkB,sBAAuB,EAAA,CAAA;AAClE,EAAA,gBAAA,CAAiB,UAAU,MAAS,GAAA,MAAA,CAAA;AACpC,EAAA,gBAAA,CAAiB,UAAU,KAAQ,GAAA,QAAA,CAAA;AACnC,EAAA,gBAAA,CAAiB,UAAU,sBAAyB,GAAA,KAAA,CAAA;AAEpD,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAA,gBAAA,CAAiB,UAAU,MAAS,GAAA,MAAA,CAAA;AAAA,GACtC;AAEA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,iBAAiB,YAAa,EAAA;AAAA,IAC9B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAA,OAAO,GAAI,CAAA,KAAA,CAAA;AACb;;ACxJA,eAAsB,UAAU,IAAsC,EAAA;AACpE,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA,CAAA;AACnC,EAAA,YAAA,CAAa,QAAQ,KAAK,CAAA,CAAA;AAE1B,EAAO,MAAA,CAAA,GAAA,CAAI,SAAS,IAAI,CAAA,CAAA;AACxB,EAAO,MAAA,CAAA,GAAA,CAAI,oBAAoB,QAAQ,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,8BAA8B,OAAO,CAAA,CAAA;AAChD,EAAO,MAAA,CAAA,GAAA,CAAI,iBAAiB,OAAO,CAAA,CAAA;AAGnC,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,CAAA,+BAAA,EAAkC,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,IACnD,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AACA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAA,MAAM,YAAe,GAAA,GAAA,CAAI,KAAM,CAAA,QAAA,EAAU,gBAAgB,EAAC,CAAA;AAC1D,EAAI,IAAA,YAAA,CAAa,SAAS,CAAG,EAAA;AAC3B,IAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,GAC3C;AAKA,EAAA,MAAM,UAAU,YAAa,CAAA,CAAC,CAAE,CAAA,UAAA,EAAY,WAAW,EAAC,CAAA;AACxD,EAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACtB,IAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,GAC3C;AAEA,EAAA,MAAM,QAAQ,OAAQ,CAAA,CAAC,EAAE,OAAS,EAAA,cAAA,EAAgB,SAAS,EAAC,CAAA;AAC5D,EAAA,MAAM,SAAmB,EAAC,CAAA;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,IAAA,MAAM,QACJ,IAAK,CAAA,IAAA,EAAM,iBAAiB,OAAS,EAAA,YAAA,EAAc,yBAC/C,aAAe,EAAA,SAAA,CAAA;AACrB,IAAA,IAAI,SAAS,IAAM,EAAA;AACjB,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,KACnB;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;AC/BO,SAAS,wBACd,QACqB,EAAA;AACrB,EAAI,IAAA,YAAA,CAAA;AACJ,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,MAAM,SAAkB,EAAC,CAAA;AACzB,EAAA,MAAM,eACJ,QAAS,CAAA,IAAA,EAAM,MAAM,eAAiB,EAAA,QAAA,EAAU,gBAAgB,EAAC,CAAA;AACnE,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAM,MAAA,OAAA,GAAU,WAAY,CAAA,OAAA,IAAW,EAAC,CAAA;AAExC,IAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,MAAA,MAAM,eAAe,KAAM,CAAA,OAAA,CAAA;AAC3B,MAAA,IAAI,CAAC,YAAc,EAAA,SAAA;AAEnB,MAAI,IAAA,YAAA,CAAa,eAAe,QAAU,EAAA;AACxC,QAAA,YAAA,GAAe,YAAa,CAAA,KAAA,CAAA;AAC5B,QAAA,SAAA;AAAA,OACF,MAAA,IAAW,YAAa,CAAA,UAAA,KAAe,KAAO,EAAA;AAC5C,QAAA,SAAA,GAAY,YAAa,CAAA,KAAA,CAAA;AACzB,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,MAAM,QAAQ,KAAM,CAAA,OAAA,CAAA;AACpB,MACE,IAAA,CAAC,MAAM,UAAW,CAAA,OAAO,KACzB,CAAC,KAAA,CAAM,UAAW,CAAA,mBAAmB,CACrC,EAAA;AACA,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,IAAI,aAAa,WAAa,EAAA;AAC5B,QAAa,YAAA,CAAA,MAAA,EAAQ,YAAa,CAAA,WAAA,EAAa,KAAK,CAAA,CAAA;AAAA,OACtD,MAAA,IAAW,aAAa,KAAO,EAAA;AAC7B,QAAW,KAAA,MAAA,WAAA,IAAe,aAAa,KAAO,EAAA;AAC5C,UAAA,IACE,YAAY,IACZ,IAAA,WAAA,CAAY,IAAK,CAAA,WAAA,IACjB,YAAY,OACZ,EAAA;AACA,YAAA,YAAA;AAAA,cACE,MAAA;AAAA,cACA,YAAY,IAAK,CAAA,WAAA;AAAA,cACjB,WAAY,CAAA,OAAA,CAAQ,KAAM,CAAA,QAAQ,EAAE,CAAC,CAAA;AAAA,aACvC,CAAA;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAM,EAAA,YAAA,EAAc,UAAU,SAAU,EAAA,CAAA;AAC3D;;ACuBwB,cAAe,CAAA;AAAA,EACrC,wBAA0B,EAAA,IAAA;AAAA,EAC1B,wCAA0C,EAAA,KAAA;AAAA,EAC1C,yCAA2C,EAAA,KAAA;AAAA,EAC3C,uEACE,EAAA,KAAA;AAAA,EACF,gBAAkB,EAAA,KAAA;AACpB,CAAC,EAAA;AAED,eAAsB,WACpB,CAAA,MAAA,EACA,SACA,EAAA,MAAA,EACA,IAC8B,EAAA;AAC9B,EAAA,IAAI,YAAY,GAAK,EAAA;AACnB,IAAY,SAAA,GAAA,GAAA,CAAA;AAAA,GACd;AAEA,EAAM,MAAA,iBAAA,GAAoB,kBAAkB,uBAAwB,EAAA,CAAA;AACpE,EAAA,iBAAA,CAAkB,UAAU,MAAS,GAAA,MAAA,CAAA;AACrC,EAAA,iBAAA,CAAkB,UAAU,KAAQ,GAAA,SAAA,CAAA;AACpC,EAAA,iBAAA,CAAkB,UAAU,sBAAyB,GAAA,KAAA,CAAA;AAErD,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAkB,iBAAA,CAAA,SAAA,CAAU,QAAQ,CAAI,GAAA,MAAA,CAAA;AAAA,GAC1C;AAGA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,kBAAkB,YAAa,EAAA;AAAA,IAC/B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,qBAAA,CAAsB,IAAI,KAAK,CAAA,CAAA;AACxC,CAAA;AAEA,eAAsB,qBACpB,CAAA,MAAA,EACA,SACA,EAAA,MAAA,EACA,IAC8B,EAAA;AAC9B,EAAA,IAAI,YAAY,EAAI,EAAA;AAClB,IAAY,SAAA,GAAA,EAAA,CAAA;AAAA,GACd;AAEA,EAAM,MAAA,iBAAA,GACJ,kBAAkB,iCAAkC,EAAA,CAAA;AACtD,EAAA,iBAAA,CAAkB,UAAU,MAAS,GAAA,MAAA,CAAA;AACrC,EAAA,iBAAA,CAAkB,UAAU,KAAQ,GAAA,SAAA,CAAA;AACpC,EAAA,iBAAA,CAAkB,UAAU,sBAAyB,GAAA,KAAA,CAAA;AAErD,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAkB,iBAAA,CAAA,SAAA,CAAU,QAAQ,CAAI,GAAA,MAAA,CAAA;AAAA,GAC1C;AAGA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,kBAAkB,YAAa,EAAA;AAAA,IAC/B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,qBAAA,CAAsB,IAAI,KAAK,CAAA,CAAA;AACxC,CAAA;AAEA,eAAsB,eACpB,CAAA,MAAA,EACA,SACA,EAAA,MAAA,EACA,IAC8B,EAAA;AAC9B,EAAA,IAAI,YAAY,GAAK,EAAA;AACnB,IAAY,SAAA,GAAA,GAAA,CAAA;AAAA,GACd;AAEA,EAAM,MAAA,iBAAA,GAAoB,kBAAkB,uBAAwB,EAAA,CAAA;AACpE,EAAA,iBAAA,CAAkB,UAAU,MAAS,GAAA,MAAA,CAAA;AACrC,EAAA,iBAAA,CAAkB,UAAU,KAAQ,GAAA,SAAA,CAAA;AAEpC,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAkB,iBAAA,CAAA,SAAA,CAAU,QAAQ,CAAI,GAAA,MAAA,CAAA;AAAA,GAC1C;AAGA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,kBAAkB,YAAa,EAAA;AAAA,IAC/B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,uBAAA,CAAwB,IAAI,KAAK,CAAA,CAAA;AAC1C,CAAA;AAEgB,SAAA,SAAA,CACd,IACA,EAAA,SAAA,EACA,IAC6B,EAAA;AAC7B,EAAA,OAAO,iBAAiB,IAAM,EAAA,SAAA,EAAW,OAAO,CAAA,EAAG,IAAI,CAAM,KAAA;AAC3D,IAAA,MAAM,SAAY,GAAA,MAAM,qBAAsB,CAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAErD,IAAI,IAAA,CAAC,UAAU,OAAS,EAAA;AACtB,MAAA,MAAM,SAAU,CAAA,GAAA,CAAA;AAAA,KAClB;AAEA,IAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,IAAA,OAAO,WAAY,CAAA,MAAA,EAAQ,EAAI,EAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,GACvC,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,iBAAA,CACd,MACA,EAAA,SAAA,EACA,IAC6B,EAAA;AAC7B,EAAA,OAAO,iBAAiB,MAAQ,EAAA,SAAA,EAAW,CAAC,CAAA,EAAG,IAAI,CAAM,KAAA;AACvD,IAAA,OAAO,WAAY,CAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,mBAAA,CACd,IACA,EAAA,SAAA,EACA,IAC6B,EAAA;AAC7B,EAAA,OAAO,iBAAiB,IAAM,EAAA,SAAA,EAAW,OAAO,CAAA,EAAG,IAAI,CAAM,KAAA;AAC3D,IAAA,MAAM,SAAY,GAAA,MAAM,qBAAsB,CAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAErD,IAAI,IAAA,CAAC,UAAU,OAAS,EAAA;AACtB,MAAA,MAAM,SAAU,CAAA,GAAA,CAAA;AAAA,KAClB;AAEA,IAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,IAAA,OAAO,qBAAsB,CAAA,MAAA,EAAQ,EAAI,EAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,GACjD,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,2BAAA,CACd,MACA,EAAA,SAAA,EACA,IAC6B,EAAA;AAC7B,EAAA,OAAO,iBAAiB,MAAQ,EAAA,SAAA,EAAW,CAAC,CAAA,EAAG,IAAI,CAAM,KAAA;AACvD,IAAA,OAAO,qBAAsB,CAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,GAC5C,CAAA,CAAA;AACH,CAAA;AAEA,eAAsB,gBACpB,CAAA,MAAA,EACA,SACA,EAAA,MAAA,EACA,IAC8B,EAAA;AAC9B,EAAA,IAAI,CAAE,MAAM,IAAK,CAAA,UAAA,EAAe,EAAA;AAC9B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,qDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,YAAY,GAAK,EAAA;AACnB,IAAY,SAAA,GAAA,GAAA,CAAA;AAAA,GACd;AAEA,EAAM,MAAA,iBAAA,GAAoB,kBAAkB,4BAA6B,EAAA,CAAA;AACzE,EAAA,iBAAA,CAAkB,UAAU,MAAS,GAAA,MAAA,CAAA;AACrC,EAAA,iBAAA,CAAkB,UAAU,KAAQ,GAAA,SAAA,CAAA;AACpC,EAAA,iBAAA,CAAkB,UAAU,sBAAyB,GAAA,KAAA,CAAA;AAErD,EAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,IAAU,EAAI,EAAA;AAClC,IAAkB,iBAAA,CAAA,SAAA,CAAU,QAAQ,CAAI,GAAA,MAAA,CAAA;AAAA,GAC1C;AAGA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,kBAAkB,YAAa,EAAA;AAAA,IAC/B,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,qBAAA,CAAsB,IAAI,KAAK,CAAA,CAAA;AACxC,CAAA;AAEgB,SAAA,cAAA,CACd,IACA,EAAA,SAAA,EACA,IAC6B,EAAA;AAC7B,EAAA,OAAO,iBAAiB,IAAM,EAAA,SAAA,EAAW,OAAO,CAAA,EAAG,IAAI,CAAM,KAAA;AAC3D,IAAA,MAAM,SAAY,GAAA,MAAM,qBAAsB,CAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAErD,IAAI,IAAA,CAAC,UAAU,OAAS,EAAA;AACtB,MAAA,MAAM,SAAU,CAAA,GAAA,CAAA;AAAA,KAClB;AAEA,IAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,IAAA,OAAO,gBAAiB,CAAA,MAAA,EAAQ,EAAI,EAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,GAC5C,CAAA,CAAA;AACH,CAAA;AAEsB,eAAA,aAAA,CACpB,QACA,KACuB,EAAA;AACvB,EAAM,MAAA,UAAA,GAAa,OAAO,KAAU,KAAA,UAAA,CAAA;AAEpC,EAAA,WAAA,MAAiB,SAAS,MAAQ,EAAA;AAChC,IAAM,MAAA,OAAA,GAAU,aACZ,MAAM,KAAA,CAAM,KAAK,CACjB,GAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA,CAAA;AAElC,IAAA,IAAI,OAAS,EAAA;AACX,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEsB,eAAA,cAAA,CACpB,QACA,KACkB,EAAA;AAClB,EAAM,MAAA,UAAA,GAAa,OAAO,KAAU,KAAA,UAAA,CAAA;AACpC,EAAA,MAAM,WAAW,EAAC,CAAA;AAElB,EAAA,WAAA,MAAiB,SAAS,MAAQ,EAAA;AAChC,IAAA,MAAM,UAAU,UAAa,GAAA,KAAA,CAAM,KAAK,CAAI,GAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA,CAAA;AAE1E,IAAA,IAAI,CAAC,OAAS,EAAA,SAAA;AACd,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAAA,GACrB;AAEA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEA,SAAS,iBAAA,CAAkB,OAAc,OAAkC,EAAA;AACzE,EAAA,OAAO,OAAO,IAAK,CAAA,OAAO,CAAE,CAAA,KAAA,CAAM,CAAC,CAAM,KAAA;AACvC,IAAA,MAAM,GAAM,GAAA,CAAA,CAAA;AACZ,IAAA,OAAO,KAAM,CAAA,GAAG,CAAM,KAAA,OAAA,CAAQ,GAAG,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AACH,CAAA;AAEA,eAAsB,cACpB,CAAA,IAAA,EACA,eACA,EAAA,GAAA,EACA,IAC8B,EAAA;AAC9B,EAAA,MAAM,QAAW,GAAA,SAAA,CAAU,IAAM,EAAA,GAAA,EAAK,IAAI,CAAA,CAAA;AAG1C,EAAA,OAAO,GAAQ,KAAA,CAAA,GAAA,CACV,MAAM,QAAA,CAAS,IAAK,EAAA,EAAG,KACxB,GAAA,MAAM,aAAc,CAAA,QAAA,EAAU,EAAE,SAAA,EAAW,iBAAiB,CAAA,CAAA;AAClE,CAAA;AAMsB,eAAA,QAAA,CACpB,IACA,IACuB,EAAA;AACvB,EAAM,MAAA,kBAAA,GAAqB,kBAAkB,wBAAyB,EAAA,CAAA;AACtE,EAAA,kBAAA,CAAmB,UAAU,YAAe,GAAA,EAAA,CAAA;AAI5C,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,mBAAmB,YAAa,EAAA;AAAA,IAChC,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAI,IAAA,CAAC,IAAI,KAAO,EAAA;AACd,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,MAAA,GAAS,yBAA0B,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAElD,EAAA,OAAO,OAAO,IAAK,CAAA,CAAC,UAAU,KAAM,CAAA,EAAA,KAAO,EAAE,CAAK,IAAA,IAAA,CAAA;AACpD,CAAA;AAEsB,eAAA,iBAAA,CACpB,IACA,IACuB,EAAA;AACvB,EAAM,MAAA,0BAAA,GACJ,kBAAkB,gCAAiC,EAAA,CAAA;AACrD,EAAA,0BAAA,CAA2B,UAAU,OAAU,GAAA,EAAA,CAAA;AAK/C,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,2BAA2B,YAAa,EAAA;AAAA,IACxC,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,YAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAI,IAAA,CAAC,GAAI,CAAA,KAAA,CAAM,IAAM,EAAA;AACnB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,gCAAiC,CAAA,GAAA,CAAI,KAAM,CAAA,IAAA,EAAM,EAAE,CAAA,CAAA;AAC5D;;AC/aA,gBAAuB,kCACrB,CAAA,cAAA,EACA,WACA,EAAA,aAAA,EACA,SACsC,EAAA;AACtC,EAAA,IAAI,SAAY,GAAA,CAAA,CAAA;AAChB,EAAA,IAAI,MAAS,GAAA,aAAA,CAAA;AAEb,EAAA,OAAO,YAAY,WAAa,EAAA;AAC9B,IAAA,MAAM,QAA6C,MAAM,SAAA;AAAA,MACvD,cAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,EAAE,YAAc,EAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAE/B,IAAA,IAAI,CAAC,YAAc,EAAA,OAAA,IAAW,YAAc,EAAA,OAAA,EAAS,WAAW,CAAG,EAAA;AACjE,MAAA,MAAA;AAAA,KACF;AAEA,IAAW,KAAA,MAAA,KAAA,IAAS,aAAa,OAAS,EAAA;AACxC,MAAA,IAAI,YAAY,WAAa,EAAA;AAC3B,QAAM,MAAA,KAAA,CAAA;AACN,QAAA,SAAA,EAAA,CAAA;AAAA,OACK,MAAA;AACL,QAAA,MAAA;AAAA,OACF;AAAA,KACF;AAEA,IAAS,MAAA,GAAA,IAAA,CAAA;AAET,IAAA,IAAI,YAAa,CAAA,MAAA,KAAW,QAAY,IAAA,CAAC,IAAM,EAAA;AAC7C,MAAA,MAAA;AAAA,KACF;AAEA,IAAA,MAAM,OAAO,GAAI,CAAA,CAAA;AAAA,GACnB;AACF;;ACyEA,eAAsB,aAAa,IAAmB,EAAA;AACpD,EAAA,IAAI,CAAE,MAAM,IAAK,CAAA,UAAA,EAAe,EAAA;AAC9B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,wDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAGA,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA,CAAA;AACnC,EAAA,YAAA,CAAa,QAAQ,KAAK,CAAA,CAAA;AAE1B,EAAO,MAAA,CAAA,GAAA,CAAI,0BAA0B,OAAO,CAAA,CAAA;AAC5C,EAAO,MAAA,CAAA,GAAA,CAAI,sBAAsB,MAAM,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,mBAAmB,KAAK,CAAA,CAAA;AACnC,EAAO,MAAA,CAAA,GAAA,CAAI,mCAAmC,GAAG,CAAA,CAAA;AACjD,EAAO,MAAA,CAAA,GAAA,CAAI,mCAAmC,OAAO,CAAA,CAAA;AACrD,EAAO,MAAA,CAAA,GAAA,CAAI,4BAA4B,OAAO,CAAA,CAAA;AAC9C,EAAO,MAAA,CAAA,GAAA,CAAI,sCAAsC,MAAM,CAAA,CAAA;AACvD,EAAO,MAAA,CAAA,GAAA,CAAI,YAAY,MAAM,CAAA,CAAA;AAC7B,EAAO,MAAA,CAAA,GAAA,CAAI,kBAAkB,MAAM,CAAA,CAAA;AACnC,EAAO,MAAA,CAAA,GAAA,CAAI,2BAA2B,MAAM,CAAA,CAAA;AAC5C,EAAO,MAAA,CAAA,GAAA,CAAI,sBAAsB,MAAM,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,iBAAiB,MAAM,CAAA,CAAA;AAClC,EAAO,MAAA,CAAA,GAAA,CAAI,4BAA4B,MAAM,CAAA,CAAA;AAC7C,EAAO,MAAA,CAAA,GAAA,CAAI,2CAA2C,MAAM,CAAA,CAAA;AAC5D,EAAO,MAAA,CAAA,GAAA,CAAI,2CAA2C,MAAM,CAAA,CAAA;AAC5D,EAAO,MAAA,CAAA,GAAA;AAAA,IACL,KAAA;AAAA,IACA,wJAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,MAAM,MAAM,UAAA;AAAA,IAChB,CAAA,oDAAA,EAAuD,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,IACxE,IAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,YAAA,CAAa,IAAI,KAAK,CAAA,CAAA;AAC/B,CAAA;AAEA,eAAsB,aAAa,KAAwB,EAAA;AACzD,EAAA,OAAO,KAAM,CAAA,mBAAA,CAAA;AACf,CAAA;AAIA,eAAsB,WAAW,IAAmB,EAAA;AAClD,EAAO,OAAA,MAAM,aAAa,IAAI,CAAA,CAAA;AAChC,CAAA;AAIsB,eAAA,mBAAA,CACpB,cACA,EAAA,MAAA,EACA,IACA,EAAA;AACA,EAAA,IAAI,CAAE,MAAM,IAAK,CAAA,UAAA,EAAe,EAAA;AAC9B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,wDAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA,CAAA;AACnC,EAAA,YAAA,CAAa,QAAQ,KAAK,CAAA,CAAA;AAE1B,EAAO,MAAA,CAAA,GAAA,CAAI,WAAW,+BAA+B,CAAA,CAAA;AACrD,EAAO,MAAA,CAAA,GAAA,CAAI,mCAAmC,GAAG,CAAA,CAAA;AACjD,EAAO,MAAA,CAAA,GAAA,CAAI,mCAAmC,OAAO,CAAA,CAAA;AACrD,EAAO,MAAA,CAAA,GAAA,CAAI,4BAA4B,OAAO,CAAA,CAAA;AAC9C,EAAO,MAAA,CAAA,GAAA,CAAI,sCAAsC,MAAM,CAAA,CAAA;AACvD,EAAO,MAAA,CAAA,GAAA,CAAI,YAAY,MAAM,CAAA,CAAA;AAC7B,EAAO,MAAA,CAAA,GAAA,CAAI,kBAAkB,MAAM,CAAA,CAAA;AACnC,EAAO,MAAA,CAAA,GAAA,CAAI,2BAA2B,MAAM,CAAA,CAAA;AAC5C,EAAO,MAAA,CAAA,GAAA,CAAI,sBAAsB,MAAM,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,iBAAiB,MAAM,CAAA,CAAA;AAClC,EAAO,MAAA,CAAA,GAAA,CAAI,6BAA6B,MAAM,CAAA,CAAA;AAC9C,EAAO,MAAA,CAAA,GAAA;AAAA,IACL,KAAA;AAAA,IACA,wJAAA;AAAA,GACF,CAAA;AAMA,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,IAAI,OAAO,KAAO,EAAA;AAChB,MAAO,MAAA,CAAA,GAAA,CAAI,QAAU,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,KACnC;AACA,IAAA,IAAI,OAAO,KAAO,EAAA;AAChB,MAAO,MAAA,CAAA,GAAA,CAAI,QAAU,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,KACnC;AAAA,GACF;AAEA,EAAA,MAAM,MAAM,CAA2C,wCAAA,EAAA,cAAc,CAAS,MAAA,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA,CAAA;AAE/F,EAAA,MAAM,GAAM,GAAA,MAAM,UAAmC,CAAA,GAAA,EAAK,IAAI,CAAA,CAAA;AAE9D,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,GACZ;AAEA,EAAO,OAAA,mBAAA,CAAoB,IAAI,KAAK,CAAA,CAAA;AACtC,CAAA;AAEA,eAAsB,oBACpB,YACA,EAAA;AACA,EAAA,OAAO,YAAa,CAAA,qBAAA,CAAA;AACtB,CAAA;AAEsB,eAAA,iBAAA,CACpB,cACA,EAAA,MAAA,EACA,IACA,EAAA;AACA,EAAA,OAAO,MAAM,mBAAA,CAAoB,cAAgB,EAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAC/D,CAAA;AAEO,SAAS,aACd,CAAA,cAAA,EACA,WACA,EAAA,MAAA,EACA,IACsC,EAAA;AACtC,EAAO,OAAA,kCAAA;AAAA,IACL,cAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAO,EAAI,EAAA,IAAA,EAAMC,OAAW,KAAA;AAC1B,MAAA,MAAM,YAAe,GAAA,MAAM,mBAAoB,CAAA,EAAA,EAAIA,SAAQ,IAAI,CAAA,CAAA;AAE/D,MAAA,IAAI,IAAoC,GAAA,KAAA,CAAA,CAAA;AAExC,MAAIA,IAAAA,OAAAA,EAAQ,KAAS,IAAA,YAAA,CAAa,YAAc,EAAA;AAC9C,QAAO,IAAA,GAAA,EAAE,KAAO,EAAA,YAAA,CAAa,YAAa,EAAA,CAAA;AAAA,OAC5C,MAAA,IAAW,aAAa,YAAc,EAAA;AACpC,QAAO,IAAA,GAAA,EAAE,KAAO,EAAA,YAAA,CAAa,YAAa,EAAA,CAAA;AAAA,OAC5C;AAEA,MAAO,OAAA;AAAA,QACL,YAAA;AAAA,QACA,IAAA;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AACF,CAAA;AAEgB,SAAA,2BAAA,CACd,OACA,MACkB,EAAA;AAClB,EAAA,MAAM,gBAAkC,EAAC,CAAA;AAEzC,EAAW,KAAA,MAAA,cAAA,IAAkB,MAAM,aAAe,EAAA;AAChD,IAAM,MAAA,YAAA,GAAe,KAAM,CAAA,aAAA,CAAc,cAAc,CAAA,CAAA;AACvD,IAAM,MAAA,OAAA,GAAU,aAAa,YAAa,CAAA,IAAA;AAAA,MACxC,CAAC,WAAgB,KAAA,WAAA,CAAY,OAAY,KAAA,MAAA;AAAA,KAC3C,CAAA;AAEA,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA,CAAA;AAAA,KACjC;AAAA,GACF;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;ACnPA,MAAM,GAAA,GAAM,MAAM,yBAAyB,CAAA,CAAA;AAC3C,MAAM,KAAQ,GAAA,eAAA,CAAA;AAmDP,MAAM,OAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnB,YAA6B,OAAmC,EAAA;AAAnC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AAP7B,IAAiB,IAAA,CAAA,eAAA,uBAAuD,GAAI,EAAA,CAAA;AAQ1E,IAAA,IAAA,CAAK,KAAQ,GAAA,WAAA,CAAA;AACb,IAAA,IAAA,CAAK,YAAa,EAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,0BAAA,CACL,WACA,cACM,EAAA;AAEN,IAAK,IAAA,CAAA,eAAA,CAAgB,GAAI,CAAA,SAAA,EAAW,cAAc,CAAA,CAAA;AAElD,IAAI,IAAA,IAAA,CAAK,gBAAgB,eAAiB,EAAA;AACxC,MAAK,IAAA,CAAA,IAAA,CAAK,sBAAuB,CAAA,SAAA,EAAW,cAAc,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAI,IAAA,IAAA,CAAK,sBAAsB,eAAiB,EAAA;AAC9C,MAAK,IAAA,CAAA,UAAA,CAAW,sBAAuB,CAAA,SAAA,EAAW,cAAc,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAqB,IAA6B,EAAA;AACxD,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,CAAA,IAAK,KAAK,eAAiB,EAAA;AACvD,MAAK,IAAA,CAAA,sBAAA,CAAuB,WAAW,OAAO,CAAA,CAAA;AAAA,KAChD;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAe,GAAA;AACrB,IAAA,IAAA,CAAK,OAAO,IAAI,gBAAA,CAAiB,KAAK,KAAO,EAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,aAAa,IAAI,gBAAA,CAAiB,KAAK,KAAO,EAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AAAA,GAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,WAAW,QAAoC,EAAA;AAC1D,IAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,QAAA,EAAU,KAAK,IAAI,CAAA,CAAA;AAChD,IAAO,OAAA,IAAA,CAAK,eAAe,GAAG,CAAA,CAAA;AAAA,GAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,sBAAsB,UAAqC,EAAA;AACtE,IAAA,MAAM,GAAM,GAAA,MAAM,qBAAsB,CAAA,UAAA,EAAY,KAAK,IAAI,CAAA,CAAA;AAC7D,IAAO,OAAA,IAAA,CAAK,eAAe,GAAG,CAAA,CAAA;AAAA,GAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,YACL,CAAA,KAAA,EACA,SACA,EAAA,UAAA,GAAyB,WAAW,GACP,EAAA;AAC7B,IAAA,OAAO,YAAa,CAAA,KAAA,EAAO,SAAW,EAAA,UAAA,EAAY,KAAK,IAAI,CAAA,CAAA;AAAA,GAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,cAAA,CACL,OACA,WAC+B,EAAA;AAC/B,IAAA,OAAO,cAAe,CAAA,KAAA,EAAO,WAAa,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,iBACL,CAAA,KAAA,EACA,SACA,EAAA,UAAA,EACA,MAC8B,EAAA;AAC9B,IAAA,OAAO,kBAAkB,KAAO,EAAA,SAAA,EAAW,UAAY,EAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,GAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,mBAAA,CACL,KACA,EAAA,WAAA,EACA,MACgC,EAAA;AAChC,IAAA,OAAO,mBAAoB,CAAA,KAAA,EAAO,WAAa,EAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,GAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CACL,MACA,EAAA,SAAA,EACA,MAC8B,EAAA;AAC9B,IAAA,OAAO,eAAgB,CAAA,MAAA,EAAQ,SAAW,EAAA,MAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,GAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,gBAAA,CACL,MACA,EAAA,SAAA,EACA,MAC8B,EAAA;AAC9B,IAAA,OAAO,gBAAiB,CAAA,MAAA,EAAQ,SAAW,EAAA,MAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,GAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,CACL,QACA,WAC+B,EAAA;AAC/B,IAAA,OAAO,YAAa,CAAA,MAAA,EAAQ,WAAa,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAA,CACL,QACA,WAC+B,EAAA;AAC/B,IAAA,OAAO,YAAa,CAAA,MAAA,EAAQ,WAAa,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,qBAAA,CACL,MACA,EAAA,WAAA,EACA,MACgC,EAAA;AAChC,IAAA,OAAO,qBAAsB,CAAA,MAAA,EAAQ,WAAa,EAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,GACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,qBAAA,CACL,MACA,EAAA,WAAA,EACA,MACgC,EAAA;AAChC,IAAA,OAAO,qBAAsB,CAAA,MAAA,EAAQ,WAAa,EAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,GACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAA+B,GAAA;AACpC,IAAO,OAAA,SAAA,CAAU,KAAK,UAAU,CAAA,CAAA;AAAA,GAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAAA,CAAU,IAAc,EAAA,SAAA,GAAY,GAA4B,EAAA;AACrE,IAAA,OAAO,SAAU,CAAA,IAAA,EAAM,SAAW,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,cAAA,CAAe,IAAc,EAAA,SAAA,GAAY,GAA4B,EAAA;AAC1E,IAAA,OAAO,cAAe,CAAA,IAAA,EAAM,SAAW,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,iBAAA,CACL,MACA,EAAA,SAAA,GAAY,GACiB,EAAA;AAC7B,IAAA,OAAO,iBAAkB,CAAA,MAAA,EAAQ,SAAW,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,mBAAA,CACL,IACA,EAAA,SAAA,GAAY,GACW,EAAA;AACvB,IAAA,OAAO,mBAAoB,CAAA,IAAA,EAAM,SAAW,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,2BAAA,CACL,MACA,EAAA,SAAA,GAAY,GACiB,EAAA;AAC7B,IAAA,OAAO,2BAA4B,CAAA,MAAA,EAAQ,SAAW,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBO,aAAA,CACL,QACA,KACuB,EAAA;AACvB,IAAO,OAAA,aAAA,CAAc,QAAQ,KAAK,CAAA,CAAA;AAAA,GACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBO,cAAA,CACL,QACA,KACkB,EAAA;AAClB,IAAO,OAAA,cAAA,CAAe,QAAQ,KAAK,CAAA,CAAA;AAAA,GACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,cACL,CAAA,IAAA,EACA,eAAkB,GAAA,KAAA,EAClB,MAAM,GACwB,EAAA;AAC9B,IAAA,OAAO,cAAe,CAAA,IAAA,EAAM,eAAiB,EAAA,GAAA,EAAK,KAAK,IAAI,CAAA,CAAA;AAAA,GAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAAS,EAAmC,EAAA;AACjD,IAAI,IAAA,IAAA,CAAK,gBAAgB,eAAiB,EAAA;AACxC,MAAO,OAAA,QAAA,CAAS,EAAI,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,KACxB,MAAA;AACL,MAAO,OAAA,iBAAA,CAAkB,EAAI,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,KACxC;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,UAA+B,GAAA;AACpC,IAAO,OAAA,UAAA,CAAW,KAAK,IAAI,CAAA,CAAA;AAAA,GAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,iBAAA,CACL,gBACA,MACiC,EAAA;AACjC,IAAA,OAAO,iBAAkB,CAAA,cAAA,EAAgB,MAAQ,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,aACL,CAAA,cAAA,EACA,WAAc,GAAA,EAAA,EACd,MACsC,EAAA;AACtC,IAAA,OAAO,aAAc,CAAA,cAAA,EAAgB,WAAa,EAAA,MAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,GACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,2BAAA,CACL,OACA,MACkB,EAAA;AAClB,IAAO,OAAA,2BAAA,CAA4B,OAAO,MAAM,CAAA,CAAA;AAAA,GAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,aAAyB,GAAA;AAC9B,IAAA,OAAO,KAAK,IAAK,CAAA,QAAA,EAAc,IAAA,IAAA,CAAK,WAAW,QAAS,EAAA,CAAA;AAAA,GAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,UAA+B,GAAA;AAC1C,IACG,OAAA,MAAM,KAAK,IAAK,CAAA,UAAA,MAAkB,MAAM,IAAA,CAAK,WAAW,UAAW,EAAA,CAAA;AAAA,GAExE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,KAAA,CACX,QACA,EAAA,QAAA,EACA,OACA,eACe,EAAA;AAIf,IAAA,MAAM,WAAW,IAAI,eAAA,CAAgB,YAAc,EAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AACxE,IAAA,IAAA,CAAK,qBAAqB,QAAQ,CAAA,CAAA;AAClC,IAAA,MAAM,QAAS,CAAA,KAAA,CAAM,QAAU,EAAA,QAAA,EAAU,OAAO,eAAe,CAAA,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAO,GAAA,QAAA,CAAA;AACZ,IAAA,IAAA,CAAK,UAAa,GAAA,QAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAwB,GAAA;AACnC,IAAM,MAAA,IAAA,CAAK,KAAK,MAAO,EAAA,CAAA;AACvB,IAAM,MAAA,IAAA,CAAK,WAAW,MAAO,EAAA,CAAA;AAG7B,IAAA,IAAA,CAAK,YAAa,EAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,UAAgC,GAAA;AAC3C,IAAA,OAAO,MAAM,IAAA,CAAK,UACf,CAAA,SAAA,EACA,CAAA,UAAA;AAAA,MACC,OAAO,QAAa,KAAA,WAAA,GAAc,QAAS,CAAA,QAAA,CAAS,UAAa,GAAA,KAAA;AAAA,KACnE,CAAA;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,WAAW,OAA6C,EAAA;AAEnE,IAAA,MAAM,WAAW,IAAI,eAAA,CAAgB,YAAc,EAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AACxE,IAAA,IAAA,CAAK,qBAAqB,QAAQ,CAAA,CAAA;AAClC,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAA,IAAI,UAAU,IAAM,EAAA,SAAA;AAEpB,MAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAE9B,QAAI,IAAA;AACF,UAAA,MAAM,QAAS,CAAA,SAAA,EAAY,CAAA,SAAA,CAAU,QAAQ,eAAe,CAAA,CAAA;AAAA,iBACrD,GAAK,EAAA;AACZ,UAAI,GAAA,CAAA,CAAA,+BAAA,EAAmC,GAAc,CAAA,OAAO,CAAE,CAAA,CAAA,CAAA;AAAA,SAChE;AAAA,OACK,MAAA;AAKL,QAAA,IAAI,OAAO,MAAU,IAAA,MAAA,CAAO,MAAO,CAAA,UAAA,CAAW,GAAG,CAAG,EAAA;AAClD,UAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAO,MAAO,CAAA,SAAA,CAAU,CAAC,CAAA,CAAA;AACzC,UAAA,MAAA,CAAO,QAAW,GAAA,KAAA,CAAA;AAAA,SACpB;AAEA,QAAM,MAAA,YAAA,GAAe,OAAO,MAAU,IAAA,OAAA,CAAA;AACtC,QAAM,MAAA,SAAA,GAAY,WAAW,YAAY,CAAA,CAAA,CAAA;AACzC,QAAA,MAAM,QAAS,CAAA,SAAA,EAAY,CAAA,SAAA,CAAU,QAAQ,SAAS,CAAA,CAAA;AAAA,OACxD;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,IAAO,GAAA,QAAA,CAAA;AACZ,IAAA,IAAA,CAAK,UAAa,GAAA,QAAA,CAAA;AAKlB,IAAM,MAAA,UAAA,GAAa,MAAM,QAAA,CAAS,UAAW,EAAA,CAAA;AAC7C,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAA,MAAM,eAAe,MAAM,QAAA,CACxB,SAAU,EAAA,CACV,WAAW,KAAK,CAAA,CAChB,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,GAAA,CAAI,CAAC,MAAW,KAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAC5C,MACE,IAAA,YAAA,CAAa,SAAS,KAAK,CAAA,IAC3B,CAAC,YAAa,CAAA,QAAA,CAAS,YAAY,CACnC,EAAA;AACA,QAAA,GAAA;AAAA,UACE,wPAAA;AAAA,SAGF,CAAA;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YAA8B,GAAA;AACzC,IAAA,MAAM,IAAK,CAAA,IAAA,CAAK,SAAU,EAAA,CAAE,gBAAiB,EAAA,CAAA;AAC7C,IAAA,MAAM,IAAK,CAAA,UAAA,CAAW,SAAU,EAAA,CAAE,gBAAiB,EAAA,CAAA;AAAA,GACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,WAAW,OAA0B,EAAA;AAC1C,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,oIAAA;AAAA,KACF,CAAA;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAe,MAAyB,EAAA;AAC7C,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,uFAAA;AAAA,KACF,CAAA;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEQ,cAA8C,GAAA;AACpD,IAAO,OAAA;AAAA,MACL,KAAA,EAAO,KAAK,OAAS,EAAA,KAAA;AAAA,MACrB,SAAA,EAAW,KAAK,OAAS,EAAA,SAAA;AAAA,MACzB,iBAAA,EAAmB,KAAK,OAAS,EAAA,iBAAA;AAAA,MACjC,YAAc,EAAA;AAAA,QACZ,oBAAA,EAAsB,IAAK,CAAA,OAAA,EAAS,YAAc,EAAA,oBAAA;AAAA,QAClD,IAAA,EAAM,IAAK,CAAA,OAAA,EAAS,YAAc,EAAA,IAAA;AAAA,QAClC,aAAA,EAAe,IAAK,CAAA,OAAA,EAAS,YAAc,EAAA,aAAA;AAAA,QAC3C,cAAA,EAAgB,IAAK,CAAA,OAAA,EAAS,YAAc,EAAA,cAAA;AAAA,OAC9C;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEQ,eAAkB,GAA6B,EAAA;AACrD,IAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,MAAA,MAAM,GAAI,CAAA,GAAA,CAAA;AAAA,KACZ;AAEA,IAAA,OAAO,GAAI,CAAA,KAAA,CAAA;AAAA,GACb;AACF;;;;"}