{"version":3,"file":"localeStorage.cjs","names":["internationalization","routing","resolveExpiresToTimestamp","buildCookieString","getCookie"],"sources":["../../../src/utils/localeStorage.ts"],"sourcesContent":["import { internationalization, routing } from '@intlayer/config/built';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport { buildCookieString, resolveExpiresToTimestamp } from './cookieExpiry';\nimport { getCookie } from './getCookie';\n\n// ── Tree-shake constants ──────────────────────────────────────────────────────\n// When these env vars are injected at build time, bundlers eliminate the\n// branches guarded by these constants.\n\n/**\n * True when cookie storage is explicitly disabled at build time.\n */\nconst TREE_SHAKE_STORAGE_COOKIES =\n  process.env['INTLAYER_ROUTING_STORAGE_COOKIES'] === 'false';\n\n/**\n * True when localStorage is explicitly disabled at build time.\n */\nconst TREE_SHAKE_STORAGE_LOCAL_STORAGE =\n  process.env['INTLAYER_ROUTING_STORAGE_LOCALSTORAGE'] === 'false';\n\n/**\n * True when sessionStorage is explicitly disabled at build time.\n */\nconst TREE_SHAKE_STORAGE_SESSION_STORAGE =\n  process.env['INTLAYER_ROUTING_STORAGE_SESSIONSTORAGE'] === 'false';\n\n/**\n * True when header storage is explicitly disabled at build time.\n */\nconst TREE_SHAKE_STORAGE_HEADERS =\n  process.env['INTLAYER_ROUTING_STORAGE_HEADERS'] === 'false';\n\n// ============================================================================\n// Shared types\n// ============================================================================\n\nexport type CookieBuildAttributes = {\n  domain?: string;\n  path?: string;\n  secure?: boolean;\n  httpOnly?: boolean;\n  sameSite?: 'strict' | 'lax' | 'none';\n  /**\n   * Absolute expiry as milliseconds since epoch, ready for `cookieStore.set()`.\n   * Already resolved from the normalized `expires` by\n   * `resolveExpiresToTimestamp`.\n   */\n  expires?: number | undefined;\n};\n\n// ============================================================================\n// Client-specific types and functions\n// (cookies via browser APIs, localStorage, sessionStorage — no headers)\n// ============================================================================\n\nexport type LocaleStorageClientOptions = {\n  overwrite?: boolean;\n  isCookieEnabled?: boolean;\n  setCookieStore?: (\n    name: string,\n    value: string,\n    cookie: CookieBuildAttributes\n  ) => void;\n  setCookieString?: (name: string, cookie: string) => void;\n  getCookie?: (name: string) => string | undefined | null;\n  setSessionStorage?: (name: string, value: string) => void;\n  getSessionStorage?: (name: string) => string | undefined | null;\n  setLocaleStorage?: (name: string, value: string) => void;\n  getLocaleStorage?: (name: string) => string | undefined | null;\n};\n\n// cookieStore is part of the experimental Cookie Store API\ndeclare const cookieStore: any;\n\nexport const localeStorageOptions: LocaleStorageClientOptions = {\n  getCookie: (name: string) =>\n    document.cookie\n      .split(';')\n      .find((c) => c.trim().startsWith(`${name}=`))\n      ?.split('=')[1],\n  getLocaleStorage: (name: string) => localStorage.getItem(name),\n  getSessionStorage: (name: string) => sessionStorage.getItem(name),\n  isCookieEnabled: true,\n  setCookieStore: (name, value, attributes) =>\n    cookieStore.set({\n      name,\n      value,\n      path: attributes.path,\n      domain: attributes.domain,\n      expires: attributes.expires,\n      sameSite: attributes.sameSite,\n    }),\n  setCookieString: (_name, cookie) => {\n    // biome-ignore lint/suspicious/noDocumentCookie: set cookie fallback\n    document.cookie = cookie;\n  },\n  setSessionStorage: (name, value) => sessionStorage.setItem(name, value),\n  setLocaleStorage: (name, value) => localStorage.setItem(name, value),\n};\n\n/**\n * Retrieves the locale from browser storage mechanisms\n * (cookies, localStorage, sessionStorage).\n * Does not read from headers — use `getLocaleFromStorageServer` for that.\n */\nexport const getLocaleFromStorageClient = (\n  options: LocaleStorageClientOptions = localeStorageOptions\n): Locale | undefined => {\n  const { locales } = internationalization;\n\n  if (options?.isCookieEnabled === false) return undefined;\n\n  const isValidLocale = (value: string | null | undefined): value is Locale =>\n    !!value && locales.includes(value as Locale);\n\n  if (!TREE_SHAKE_STORAGE_COOKIES) {\n    for (let i = 0; i < (routing.storage.cookies ?? []).length; i++) {\n      try {\n        const value = options?.getCookie?.(routing.storage.cookies![i].name);\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n\n  if (!TREE_SHAKE_STORAGE_LOCAL_STORAGE) {\n    for (let i = 0; i < (routing.storage.localStorage ?? []).length; i++) {\n      try {\n        const value = options?.getLocaleStorage?.(\n          routing.storage.localStorage![i].name\n        );\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n\n  if (!TREE_SHAKE_STORAGE_SESSION_STORAGE && routing.storage.sessionStorage) {\n    for (let i = 0; i < routing.storage.sessionStorage.length; i++) {\n      try {\n        const value = options?.getSessionStorage?.(\n          routing.storage.sessionStorage[i].name\n        );\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n};\n\n/**\n * Stores the locale in browser storage mechanisms\n * (cookies, localStorage, sessionStorage).\n * Does not write to headers — use `setLocaleInStorageServer` for that.\n */\nexport const setLocaleInStorageClient = (\n  locale: LocalesValues,\n  options?: LocaleStorageClientOptions\n): void => {\n  if (options?.isCookieEnabled === false) return;\n\n  if (!TREE_SHAKE_STORAGE_COOKIES && routing.storage.cookies) {\n    for (let i = 0; i < routing.storage.cookies.length; i++) {\n      const { name, attributes } = routing.storage.cookies[i];\n      try {\n        if (options?.setCookieStore) {\n          options.setCookieStore(name, locale, {\n            ...attributes,\n            expires: resolveExpiresToTimestamp(attributes.expires),\n          });\n        }\n      } catch {\n        try {\n          if (options?.setCookieString) {\n            options.setCookieString(\n              name,\n              buildCookieString(name, locale, attributes)\n            );\n          }\n        } catch {}\n      }\n    }\n  }\n\n  if (\n    !TREE_SHAKE_STORAGE_LOCAL_STORAGE &&\n    routing.storage.localStorage &&\n    options?.setLocaleStorage\n  ) {\n    for (let i = 0; i < routing.storage.localStorage.length; i++) {\n      const { name } = routing.storage.localStorage[i];\n      try {\n        if (!(options?.overwrite ?? true) && options?.getLocaleStorage) {\n          if (options.getLocaleStorage(name)) continue;\n        }\n        options.setLocaleStorage(name, locale);\n      } catch {}\n    }\n  }\n\n  if (\n    !TREE_SHAKE_STORAGE_SESSION_STORAGE &&\n    routing.storage.sessionStorage &&\n    options?.setSessionStorage\n  ) {\n    for (let i = 0; i < routing.storage.sessionStorage.length; i++) {\n      const { name } = routing.storage.sessionStorage[i];\n      try {\n        if (!(options?.overwrite ?? true) && options?.getSessionStorage) {\n          if (options.getSessionStorage(name)) continue;\n        }\n        options.setSessionStorage(name, locale);\n      } catch {}\n    }\n  }\n};\n\n/**\n * Client-side locale storage utility.\n * Handles cookies (browser), localStorage and sessionStorage.\n * Does not access headers.\n *\n * @example\n * ```ts\n * const storage = LocaleStorageClient(localeStorageOptions);\n * const locale = storage.getLocale();\n * storage.setLocale('fr');\n * ```\n */\nexport const LocaleStorageClient = (options: LocaleStorageClientOptions) => ({\n  getLocale: () => getLocaleFromStorageClient(options),\n  setLocale: (locale: LocalesValues) =>\n    setLocaleInStorageClient(locale, options),\n});\n\n// ============================================================================\n// Server-specific types and functions\n// (cookies via injected getter/setter, headers — no localStorage/sessionStorage)\n// ============================================================================\n\nexport type LocaleStorageServerOptions = {\n  overwrite?: boolean;\n  isCookieEnabled?: boolean;\n  setCookieStore?: (\n    name: string,\n    value: string,\n    cookie: CookieBuildAttributes\n  ) => void;\n  setCookieString?: (name: string, cookie: string) => void;\n  getCookie?: (name: string) => string | undefined | null;\n  getHeader?: (name: string) => string | undefined | null;\n  setHeader?: (name: string, value: string) => void;\n};\n\n/**\n * Retrieves the locale from server-side storage mechanisms (cookies, headers).\n * Does not access localStorage or sessionStorage.\n * No browser cookie fallback — the caller must provide `getCookie`.\n */\nexport const getLocaleFromStorageServer = (\n  options: LocaleStorageServerOptions\n): Locale | undefined => {\n  const { locales } = internationalization;\n\n  if (options?.isCookieEnabled === false) return undefined;\n\n  const isValidLocale = (value: string | null | undefined): value is Locale =>\n    !!value && locales.includes(value as Locale);\n\n  if (!TREE_SHAKE_STORAGE_COOKIES && routing.storage.cookies) {\n    for (let i = 0; i < routing.storage.cookies.length; i++) {\n      try {\n        const value = options?.getCookie?.(routing.storage.cookies[i].name);\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n\n  if (!TREE_SHAKE_STORAGE_HEADERS && routing.storage.headers) {\n    for (let i = 0; i < routing.storage.headers.length; i++) {\n      try {\n        const value = options?.getHeader?.(routing.storage.headers[i].name);\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n};\n\n/**\n * Stores the locale in server-side storage mechanisms (cookies, headers).\n * Does not write to localStorage or sessionStorage.\n */\nexport const setLocaleInStorageServer = (\n  locale: LocalesValues,\n  options?: LocaleStorageServerOptions\n): void => {\n  if (options?.isCookieEnabled === false) return;\n\n  if (!TREE_SHAKE_STORAGE_COOKIES && routing.storage.cookies) {\n    for (let i = 0; i < routing.storage.cookies.length; i++) {\n      const { name, attributes } = routing.storage.cookies[i];\n\n      try {\n        if (options?.setCookieStore) {\n          options.setCookieStore(name, locale, {\n            ...attributes,\n            expires: resolveExpiresToTimestamp(attributes.expires),\n          });\n        }\n      } catch {\n        try {\n          if (options?.setCookieString) {\n            options.setCookieString(\n              name,\n              buildCookieString(name, locale, attributes)\n            );\n          }\n        } catch {}\n      }\n    }\n  }\n\n  if (\n    !TREE_SHAKE_STORAGE_HEADERS &&\n    routing.storage.headers &&\n    options?.setHeader\n  ) {\n    for (let i = 0; i < routing.storage.headers.length; i++) {\n      try {\n        options.setHeader(routing.storage.headers[i].name, locale);\n      } catch {}\n    }\n  }\n};\n\n/**\n * Server-side locale storage utility.\n * Handles cookies (via injected getter/setter) and headers.\n * Does not access localStorage or sessionStorage.\n *\n * @example\n * ```ts\n * const storage = LocaleStorageServer({\n *   getCookie: (name) => req.cookies[name],\n *   setCookieStore: (name, value, attrs) => res.cookie(name, value, attrs),\n *   getHeader: (name) => req.headers[name],\n *   setHeader: (name, value) => res.setHeader(name, value),\n * });\n * const locale = storage.getLocale();\n * storage.setLocale('fr');\n * ```\n */\nexport const LocaleStorageServer = (options: LocaleStorageServerOptions) => ({\n  getLocale: () => getLocaleFromStorageServer(options),\n  setLocale: (locale: LocalesValues) =>\n    setLocaleInStorageServer(locale, options),\n});\n\n// ============================================================================\n// Deprecated: combined LocaleStorage\n// Use LocaleStorageClient or LocaleStorageServer instead\n// ============================================================================\n\n/**\n * @deprecated Use {@link LocaleStorageClientOptions} or {@link LocaleStorageServerOptions} instead.\n */\nexport type LocaleStorageOptions = LocaleStorageClientOptions &\n  LocaleStorageServerOptions;\n\n/**\n * Retrieves the locale from all storage mechanisms\n * (cookies, localStorage, sessionStorage, headers).\n *\n * @deprecated Use {@link getLocaleFromStorageClient} (browser) or\n * {@link getLocaleFromStorageServer} (server) instead.\n */\nexport const getLocaleFromStorage = (\n  options: Pick<\n    LocaleStorageOptions,\n    | 'getCookie'\n    | 'getSessionStorage'\n    | 'getLocaleStorage'\n    | 'getHeader'\n    | 'isCookieEnabled'\n  >\n): Locale | undefined => {\n  const { locales } = internationalization;\n\n  if (options?.isCookieEnabled === false) return undefined;\n\n  const isValidLocale = (value: string | null | undefined): value is Locale =>\n    !!value && locales.includes(value as Locale);\n\n  const readCookie = (name: string): string | undefined => {\n    try {\n      const fromOption = options?.getCookie?.(name);\n      if (fromOption !== null && fromOption !== undefined) return fromOption;\n    } catch {}\n    // Browser fallback kept for backward compatibility\n    return getCookie(name);\n  };\n\n  if (!TREE_SHAKE_STORAGE_COOKIES && routing.storage.cookies) {\n    for (let i = 0; i < routing.storage.cookies.length; i++) {\n      const value = readCookie(routing.storage.cookies[i].name);\n      if (isValidLocale(value)) return value;\n    }\n  }\n\n  if (!TREE_SHAKE_STORAGE_LOCAL_STORAGE && routing.storage.localStorage) {\n    for (let i = 0; i < routing.storage.localStorage.length; i++) {\n      try {\n        const value = options?.getLocaleStorage?.(\n          routing.storage.localStorage[i].name\n        );\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n\n  if (!TREE_SHAKE_STORAGE_SESSION_STORAGE && routing.storage.sessionStorage) {\n    for (let i = 0; i < routing.storage.sessionStorage.length; i++) {\n      try {\n        const value = options?.getSessionStorage?.(\n          routing.storage.sessionStorage[i].name\n        );\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n\n  if (!TREE_SHAKE_STORAGE_HEADERS && routing.storage.headers) {\n    for (let i = 0; i < routing.storage.headers.length; i++) {\n      try {\n        const value = options?.getHeader?.(routing.storage.headers[i].name);\n        if (isValidLocale(value)) return value;\n      } catch {}\n    }\n  }\n};\n\n/**\n * Stores the locale in all configured storage mechanisms\n * (cookies, localStorage, sessionStorage, headers).\n *\n * @deprecated Use {@link setLocaleInStorageClient} (browser) or\n * {@link setLocaleInStorageServer} (server) instead.\n */\nexport const setLocaleInStorage = (\n  locale: LocalesValues,\n  options?: LocaleStorageOptions\n): void => {\n  if (options?.isCookieEnabled === false) return;\n\n  if (!TREE_SHAKE_STORAGE_COOKIES && routing.storage.cookies) {\n    for (let i = 0; i < routing.storage.cookies.length; i++) {\n      const { name, attributes } = routing.storage.cookies[i];\n      try {\n        if (options?.setCookieStore) {\n          options.setCookieStore(name, locale, {\n            ...attributes,\n            expires: resolveExpiresToTimestamp(attributes.expires),\n          });\n        }\n      } catch {\n        try {\n          if (options?.setCookieString) {\n            options.setCookieString(\n              name,\n              buildCookieString(name, locale, attributes)\n            );\n          }\n        } catch {}\n      }\n    }\n  }\n\n  if (\n    !TREE_SHAKE_STORAGE_LOCAL_STORAGE &&\n    routing.storage.localStorage &&\n    options?.setLocaleStorage\n  ) {\n    for (let i = 0; i < routing.storage.localStorage.length; i++) {\n      const { name } = routing.storage.localStorage[i];\n      try {\n        if (!(options?.overwrite ?? true) && options?.getLocaleStorage) {\n          if (options.getLocaleStorage(name)) continue;\n        }\n        options.setLocaleStorage(name, locale);\n      } catch {}\n    }\n  }\n\n  if (\n    !TREE_SHAKE_STORAGE_SESSION_STORAGE &&\n    routing.storage.sessionStorage &&\n    options?.setSessionStorage\n  ) {\n    for (let i = 0; i < routing.storage.sessionStorage.length; i++) {\n      const { name } = routing.storage.sessionStorage[i];\n      try {\n        if (!(options?.overwrite ?? true) && options?.getSessionStorage) {\n          if (options.getSessionStorage(name)) continue;\n        }\n        options.setSessionStorage(name, locale);\n      } catch {}\n    }\n  }\n\n  if (\n    !TREE_SHAKE_STORAGE_HEADERS &&\n    routing.storage.headers &&\n    options?.setHeader\n  ) {\n    for (let i = 0; i < routing.storage.headers.length; i++) {\n      try {\n        options.setHeader(routing.storage.headers[i].name, locale);\n      } catch {}\n    }\n  }\n};\n\n/**\n * Utility object to get and set the locale in storage based on configuration.\n *\n * @deprecated Use {@link LocaleStorageClient} (browser) or\n * {@link LocaleStorageServer} (server) instead.\n */\nexport const LocaleStorage = (options: LocaleStorageOptions) => ({\n  getLocale: () => getLocaleFromStorage(options),\n  setLocale: (locale: LocalesValues) => setLocaleInStorage(locale, options),\n});\n"],"mappings":";;;;;;;;;;AAaA,MAAM,6BACJ,QAAQ,IAAI,wCAAwC;;;;AAKtD,MAAM,mCACJ,QAAQ,IAAI,6CAA6C;;;;AAK3D,MAAM,qCACJ,QAAQ,IAAI,+CAA+C;;;;AAK7D,MAAM,6BACJ,QAAQ,IAAI,wCAAwC;AA4CtD,MAAa,uBAAmD;CAC9D,YAAY,SACV,SAAS,OACN,MAAM,IAAI,CACV,MAAM,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,CAAC,EAC3C,MAAM,IAAI,CAAC;CACjB,mBAAmB,SAAiB,aAAa,QAAQ,KAAK;CAC9D,oBAAoB,SAAiB,eAAe,QAAQ,KAAK;CACjE,iBAAiB;CACjB,iBAAiB,MAAM,OAAO,eAC5B,YAAY,IAAI;EACd;EACA;EACA,MAAM,WAAW;EACjB,QAAQ,WAAW;EACnB,SAAS,WAAW;EACpB,UAAU,WAAW;EACtB,CAAC;CACJ,kBAAkB,OAAO,WAAW;AAElC,WAAS,SAAS;;CAEpB,oBAAoB,MAAM,UAAU,eAAe,QAAQ,MAAM,MAAM;CACvE,mBAAmB,MAAM,UAAU,aAAa,QAAQ,MAAM,MAAM;CACrE;;;;;;AAOD,MAAa,8BACX,UAAsC,yBACf;CACvB,MAAM,EAAE,YAAYA;AAEpB,KAAI,SAAS,oBAAoB,MAAO,QAAO;CAE/C,MAAM,iBAAiB,UACrB,CAAC,CAAC,SAAS,QAAQ,SAAS,MAAgB;AAE9C,KAAI,CAAC,2BACH,MAAK,IAAI,IAAI,GAAG,KAAKC,+BAAQ,QAAQ,WAAW,EAAE,EAAE,QAAQ,IAC1D,KAAI;EACF,MAAM,QAAQ,SAAS,YAAYA,+BAAQ,QAAQ,QAAS,GAAG,KAAK;AACpE,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;AAIZ,KAAI,CAAC,iCACH,MAAK,IAAI,IAAI,GAAG,KAAKA,+BAAQ,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,IAC/D,KAAI;EACF,MAAM,QAAQ,SAAS,mBACrBA,+BAAQ,QAAQ,aAAc,GAAG,KAClC;AACD,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;AAIZ,KAAI,CAAC,sCAAsCA,+BAAQ,QAAQ,eACzD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,eAAe,QAAQ,IACzD,KAAI;EACF,MAAM,QAAQ,SAAS,oBACrBA,+BAAQ,QAAQ,eAAe,GAAG,KACnC;AACD,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;;;;;;;AAUd,MAAa,4BACX,QACA,YACS;AACT,KAAI,SAAS,oBAAoB,MAAO;AAExC,KAAI,CAAC,8BAA8BA,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,KAAK;EACvD,MAAM,EAAE,MAAM,eAAeA,+BAAQ,QAAQ,QAAQ;AACrD,MAAI;AACF,OAAI,SAAS,eACX,SAAQ,eAAe,MAAM,QAAQ;IACnC,GAAG;IACH,SAASC,qDAA0B,WAAW,QAAQ;IACvD,CAAC;UAEE;AACN,OAAI;AACF,QAAI,SAAS,gBACX,SAAQ,gBACN,MACAC,6CAAkB,MAAM,QAAQ,WAAW,CAC5C;WAEG;;;AAKd,KACE,CAAC,oCACDF,+BAAQ,QAAQ,gBAChB,SAAS,iBAET,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,aAAa,QAAQ,KAAK;EAC5D,MAAM,EAAE,SAASA,+BAAQ,QAAQ,aAAa;AAC9C,MAAI;AACF,OAAI,EAAE,SAAS,aAAa,SAAS,SAAS,kBAC5C;QAAI,QAAQ,iBAAiB,KAAK,CAAE;;AAEtC,WAAQ,iBAAiB,MAAM,OAAO;UAChC;;AAIZ,KACE,CAAC,sCACDA,+BAAQ,QAAQ,kBAChB,SAAS,kBAET,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,eAAe,QAAQ,KAAK;EAC9D,MAAM,EAAE,SAASA,+BAAQ,QAAQ,eAAe;AAChD,MAAI;AACF,OAAI,EAAE,SAAS,aAAa,SAAS,SAAS,mBAC5C;QAAI,QAAQ,kBAAkB,KAAK,CAAE;;AAEvC,WAAQ,kBAAkB,MAAM,OAAO;UACjC;;;;;;;;;;;;;;;AAiBd,MAAa,uBAAuB,aAAyC;CAC3E,iBAAiB,2BAA2B,QAAQ;CACpD,YAAY,WACV,yBAAyB,QAAQ,QAAQ;CAC5C;;;;;;AA0BD,MAAa,8BACX,YACuB;CACvB,MAAM,EAAE,YAAYD;AAEpB,KAAI,SAAS,oBAAoB,MAAO,QAAO;CAE/C,MAAM,iBAAiB,UACrB,CAAC,CAAC,SAAS,QAAQ,SAAS,MAAgB;AAE9C,KAAI,CAAC,8BAA8BC,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,IAClD,KAAI;EACF,MAAM,QAAQ,SAAS,YAAYA,+BAAQ,QAAQ,QAAQ,GAAG,KAAK;AACnE,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;AAIZ,KAAI,CAAC,8BAA8BA,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,IAClD,KAAI;EACF,MAAM,QAAQ,SAAS,YAAYA,+BAAQ,QAAQ,QAAQ,GAAG,KAAK;AACnE,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;;;;;;AASd,MAAa,4BACX,QACA,YACS;AACT,KAAI,SAAS,oBAAoB,MAAO;AAExC,KAAI,CAAC,8BAA8BA,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,KAAK;EACvD,MAAM,EAAE,MAAM,eAAeA,+BAAQ,QAAQ,QAAQ;AAErD,MAAI;AACF,OAAI,SAAS,eACX,SAAQ,eAAe,MAAM,QAAQ;IACnC,GAAG;IACH,SAASC,qDAA0B,WAAW,QAAQ;IACvD,CAAC;UAEE;AACN,OAAI;AACF,QAAI,SAAS,gBACX,SAAQ,gBACN,MACAC,6CAAkB,MAAM,QAAQ,WAAW,CAC5C;WAEG;;;AAKd,KACE,CAAC,8BACDF,+BAAQ,QAAQ,WAChB,SAAS,UAET,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,IAClD,KAAI;AACF,UAAQ,UAAUA,+BAAQ,QAAQ,QAAQ,GAAG,MAAM,OAAO;SACpD;;;;;;;;;;;;;;;;;;;AAsBd,MAAa,uBAAuB,aAAyC;CAC3E,iBAAiB,2BAA2B,QAAQ;CACpD,YAAY,WACV,yBAAyB,QAAQ,QAAQ;CAC5C;;;;;;;;AAoBD,MAAa,wBACX,YAQuB;CACvB,MAAM,EAAE,YAAYD;AAEpB,KAAI,SAAS,oBAAoB,MAAO,QAAO;CAE/C,MAAM,iBAAiB,UACrB,CAAC,CAAC,SAAS,QAAQ,SAAS,MAAgB;CAE9C,MAAM,cAAc,SAAqC;AACvD,MAAI;GACF,MAAM,aAAa,SAAS,YAAY,KAAK;AAC7C,OAAI,eAAe,QAAQ,eAAe,OAAW,QAAO;UACtD;AAER,SAAOI,kCAAU,KAAK;;AAGxB,KAAI,CAAC,8BAA8BH,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,KAAK;EACvD,MAAM,QAAQ,WAAWA,+BAAQ,QAAQ,QAAQ,GAAG,KAAK;AACzD,MAAI,cAAc,MAAM,CAAE,QAAO;;AAIrC,KAAI,CAAC,oCAAoCA,+BAAQ,QAAQ,aACvD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,aAAa,QAAQ,IACvD,KAAI;EACF,MAAM,QAAQ,SAAS,mBACrBA,+BAAQ,QAAQ,aAAa,GAAG,KACjC;AACD,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;AAIZ,KAAI,CAAC,sCAAsCA,+BAAQ,QAAQ,eACzD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,eAAe,QAAQ,IACzD,KAAI;EACF,MAAM,QAAQ,SAAS,oBACrBA,+BAAQ,QAAQ,eAAe,GAAG,KACnC;AACD,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;AAIZ,KAAI,CAAC,8BAA8BA,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,IAClD,KAAI;EACF,MAAM,QAAQ,SAAS,YAAYA,+BAAQ,QAAQ,QAAQ,GAAG,KAAK;AACnE,MAAI,cAAc,MAAM,CAAE,QAAO;SAC3B;;;;;;;;;AAYd,MAAa,sBACX,QACA,YACS;AACT,KAAI,SAAS,oBAAoB,MAAO;AAExC,KAAI,CAAC,8BAA8BA,+BAAQ,QAAQ,QACjD,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,KAAK;EACvD,MAAM,EAAE,MAAM,eAAeA,+BAAQ,QAAQ,QAAQ;AACrD,MAAI;AACF,OAAI,SAAS,eACX,SAAQ,eAAe,MAAM,QAAQ;IACnC,GAAG;IACH,SAASC,qDAA0B,WAAW,QAAQ;IACvD,CAAC;UAEE;AACN,OAAI;AACF,QAAI,SAAS,gBACX,SAAQ,gBACN,MACAC,6CAAkB,MAAM,QAAQ,WAAW,CAC5C;WAEG;;;AAKd,KACE,CAAC,oCACDF,+BAAQ,QAAQ,gBAChB,SAAS,iBAET,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,aAAa,QAAQ,KAAK;EAC5D,MAAM,EAAE,SAASA,+BAAQ,QAAQ,aAAa;AAC9C,MAAI;AACF,OAAI,EAAE,SAAS,aAAa,SAAS,SAAS,kBAC5C;QAAI,QAAQ,iBAAiB,KAAK,CAAE;;AAEtC,WAAQ,iBAAiB,MAAM,OAAO;UAChC;;AAIZ,KACE,CAAC,sCACDA,+BAAQ,QAAQ,kBAChB,SAAS,kBAET,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,eAAe,QAAQ,KAAK;EAC9D,MAAM,EAAE,SAASA,+BAAQ,QAAQ,eAAe;AAChD,MAAI;AACF,OAAI,EAAE,SAAS,aAAa,SAAS,SAAS,mBAC5C;QAAI,QAAQ,kBAAkB,KAAK,CAAE;;AAEvC,WAAQ,kBAAkB,MAAM,OAAO;UACjC;;AAIZ,KACE,CAAC,8BACDA,+BAAQ,QAAQ,WAChB,SAAS,UAET,MAAK,IAAI,IAAI,GAAG,IAAIA,+BAAQ,QAAQ,QAAQ,QAAQ,IAClD,KAAI;AACF,UAAQ,UAAUA,+BAAQ,QAAQ,QAAQ,GAAG,MAAM,OAAO;SACpD;;;;;;;;AAWd,MAAa,iBAAiB,aAAmC;CAC/D,iBAAiB,qBAAqB,QAAQ;CAC9C,YAAY,WAA0B,mBAAmB,QAAQ,QAAQ;CAC1E"}