{"version":3,"file":"Dictionary-CYdMwaOb.cjs","sources":["../app/components/dictionary/Dictionary.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype Phonetic = {\n  text?: string;\n  audio?: string;\n};\n\ntype Meaning = {\n  partOfSpeech?: string;\n  synonyms?: string[];\n  antonyms?: string[];\n  definitions: Array<{\n    definition: string;\n    example?: string;\n    synonyms?: string[];\n    antonyms?: string[];\n  }>;\n};\n\ntype DictionaryEntry = {\n  word: string;\n  phonetic?: string;\n  phonetics?: Phonetic[];\n  meanings?: Meaning[];\n  origin?: string;\n  sourceUrls?: string[];\n};\n\nconst sanitizeQuery = (q: string) => q.replace(/[^a-zA-Z '\\-]/g, \"\").trim();\n\nexport default function Dictionary() {\n  const [query, setQuery] = useState(\"\");\n  const [isFocused, setIsFocused] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [result, setResult] = useState<DictionaryEntry[] | null>(null);\n  const abortRef = useRef<AbortController | null>(null);\n  const audioRef = useRef<HTMLAudioElement | null>(null);\n  const currentAudioSrcRef = useRef<string | null>(null);\n  const lastPlayIdRef = useRef(0);\n  const resultsRef = useRef<HTMLDivElement | null>(null);\n\n  // Pull selected text like TTS, but avoid overriding when user is typing\n  useEffect(() => {\n    function handleSelectionChange() {\n      if (isFocused) return;\n      const sel = window.getSelection?.();\n      if (!sel) return;\n      const anchor = sel.anchorNode as Node | null;\n      const focus = sel.focusNode as Node | null;\n      const container = resultsRef.current;\n      if (container) {\n        // Ignore selection changes that occur within the results panel\n        if (\n          (anchor && container.contains(anchor)) ||\n          (focus && container.contains(focus))\n        ) {\n          return;\n        }\n      }\n      const value = sanitizeQuery(sel.toString() ?? \"\");\n      if (value && value.length > 0) {\n        setQuery(value);\n      }\n    }\n    document.addEventListener(\"selectionchange\", handleSelectionChange);\n    return () =>\n      document.removeEventListener(\"selectionchange\", handleSelectionChange);\n  }, [isFocused]);\n\n  const primaryPhonetic = useMemo(() => {\n    if (!result || result.length === 0) return undefined;\n    const entry = result[0];\n    const phoneticText =\n      entry.phonetic || entry.phonetics?.find((p) => p.text)?.text;\n    const audioUrl = entry.phonetics?.find((p) => p.audio)?.audio;\n    return { text: phoneticText, audio: audioUrl } as Phonetic | undefined;\n  }, [result]);\n\n  const aggregates = useMemo(() => {\n    const aggSynonyms = new Set<string>();\n    const aggAntonyms = new Set<string>();\n    let originText: string | undefined;\n    if (result && result.length > 0) {\n      for (const entry of result) {\n        if (!originText && entry.origin) originText = entry.origin;\n        for (const m of entry.meanings ?? []) {\n          for (const s of m.synonyms ?? []) aggSynonyms.add(s);\n          for (const a of m.antonyms ?? []) aggAntonyms.add(a);\n          for (const d of m.definitions ?? []) {\n            for (const s of d.synonyms ?? []) aggSynonyms.add(s);\n            for (const a of d.antonyms ?? []) aggAntonyms.add(a);\n          }\n        }\n      }\n    }\n    return {\n      synonyms: Array.from(aggSynonyms).sort((a, b) => a.localeCompare(b)),\n      antonyms: Array.from(aggAntonyms).sort((a, b) => a.localeCompare(b)),\n      origin: originText,\n    };\n  }, [result]);\n\n  const canSearch = sanitizeQuery(query).length > 0;\n\n  const playAudio = useCallback(async () => {\n    const src = primaryPhonetic?.audio;\n    if (!src) return;\n    try {\n      const audio = (audioRef.current ||= new Audio());\n      lastPlayIdRef.current += 1;\n      const playId = lastPlayIdRef.current;\n\n      // If new src, reset and wait until it can play before calling play\n      if (currentAudioSrcRef.current !== src) {\n        audio.pause();\n        audio.currentTime = 0;\n        currentAudioSrcRef.current = src;\n        audio.src = src;\n        audio.load();\n        await new Promise<void>((resolve, reject) => {\n          const onCanPlay = () => {\n            cleanup();\n            resolve();\n          };\n          const onError = () => {\n            cleanup();\n            reject(new Error(\"audio error\"));\n          };\n          const cleanup = () => {\n            audio.removeEventListener(\"canplay\", onCanPlay);\n            audio.removeEventListener(\"error\", onError);\n          };\n          audio.addEventListener(\"canplay\", onCanPlay, { once: true });\n          audio.addEventListener(\"error\", onError, { once: true });\n          if (audio.readyState >= 2) {\n            cleanup();\n            resolve();\n          }\n        });\n      } else {\n        // same src: restart cleanly\n        audio.pause();\n        audio.currentTime = 0;\n      }\n\n      if (playId !== lastPlayIdRef.current) return;\n      await audio.play().catch(() => {});\n    } catch {}\n  }, [primaryPhonetic]);\n\n  // Pause audio when definitions change or on unmount to prevent race conditions\n  useEffect(() => {\n    if (!result) return;\n    try {\n      audioRef.current?.pause();\n    } catch {}\n  }, [result]);\n\n  useEffect(() => {\n    return () => {\n      try {\n        audioRef.current?.pause();\n      } catch {}\n    };\n  }, []);\n\n  const fetchDefinitions = useCallback(async (term: string) => {\n    const word = sanitizeQuery(term);\n    if (!word) return;\n    abortRef.current?.abort();\n    const controller = new AbortController();\n    abortRef.current = controller;\n    setLoading(true);\n    setError(null);\n    setResult(null);\n    try {\n      const url = `https://api.dictionaryapi.dev/api/v2/entries/en/${encodeURIComponent(\n        word\n      )}`;\n      const res = await fetch(url, { signal: controller.signal });\n      if (!res.ok) {\n        // API returns 404 for not found words\n        if (res.status === 404) {\n          setResult([]);\n          return;\n        }\n        throw new Error(`Request failed: ${res.status}`);\n      }\n      const data = (await res.json()) as DictionaryEntry[];\n      setResult(data);\n    } catch (err) {\n      if (\n        err &&\n        typeof err === \"object\" &&\n        (err as { name?: string }).name === \"AbortError\"\n      )\n        return;\n      setError(\"Unable to fetch definition. Please try again.\");\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  // Debounced search on input changes\n  useEffect(() => {\n    const term = sanitizeQuery(query);\n    if (!term) {\n      setResult(null);\n      setError(null);\n      return;\n    }\n    const t = setTimeout(() => {\n      void fetchDefinitions(term);\n    }, 400);\n    return () => clearTimeout(t);\n  }, [query, fetchDefinitions]);\n\n  return (\n    <div className=\" flex h-full w-full flex-col gap-3 p-3\">\n      <div className=\"flex items-center gap-2\">\n        <label htmlFor=\"dictionary-search\" className=\"sr-only\">\n          Search word\n        </label>\n        <input\n          id=\"dictionary-search\"\n          type=\"text\"\n          className=\"min-w-[220px] flex-1 rounded-md border border-border bg-surface px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n          placeholder=\"Type or select a word to look up...\"\n          value={query}\n          onChange={(e) => setQuery(e.target.value)}\n          onFocus={() => setIsFocused(true)}\n          onBlur={() => setIsFocused(false)}\n        />\n        <button\n          className=\"h-9 rounded-md bg-accent px-4 text-sm text-accent-foreground hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n          onClick={() => canSearch && fetchDefinitions(query)}\n          disabled={!canSearch || loading}\n          aria-disabled={!canSearch || loading}\n        >\n          Search\n        </button>\n      </div>\n\n      {primaryPhonetic?.text || primaryPhonetic?.audio ? (\n        <div className=\"flex items-center gap-3 text-sm text-foreground/80\">\n          {primaryPhonetic?.text ? (\n            <span className=\"rounded bg-surface px-2 py-1\">\n              {primaryPhonetic.text}\n            </span>\n          ) : null}\n          {primaryPhonetic?.audio ? (\n            <button\n              className=\"h-8 rounded-md bg-surface px-3 text-xs hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n              onClick={playAudio}\n              aria-label=\"Play pronunciation\"\n            >\n              Play\n            </button>\n          ) : null}\n        </div>\n      ) : null}\n\n      {aggregates.origin ? (\n        <div className=\"text-xs text-foreground/70 -mt-1\">\n          Origin: {aggregates.origin}\n        </div>\n      ) : null}\n\n      <div\n        ref={resultsRef}\n        className=\"no-drag relative flex-1 overflow-auto rounded-lg border border-border bg-background no-drag cursor-text select-text\"\n      >\n        {loading ? (\n          <div className=\"p-4 text-sm\">Loading…</div>\n        ) : error ? (\n          <div className=\"p-4 text-sm text-red-500\">{error}</div>\n        ) : result == null ? (\n          <div className=\"p-4 text-sm text-foreground/70\">\n            Enter a word or select text on the page to look up.\n          </div>\n        ) : result.length === 0 ? (\n          <div className=\"p-4 text-sm\">No definitions found.</div>\n        ) : (\n          <div className=\"p-3 space-y-4\">\n            {result.map((entry, idx) => (\n              <div key={`${entry.word}-${idx}`} className=\"space-y-2\">\n                <div className=\"text-base font-semibold\">{entry.word}</div>\n                {entry.meanings?.map((m, i) => (\n                  <div key={`${entry.word}-m-${i}`} className=\"space-y-1\">\n                    {m.partOfSpeech ? (\n                      <div className=\"text-xs uppercase tracking-wide text-foreground/60\">\n                        {m.partOfSpeech}\n                      </div>\n                    ) : null}\n                    <ol className=\"list-decimal pl-5 space-y-2\">\n                      {m.definitions.map((d, di) => (\n                        <li\n                          key={`${entry.word}-d-${di}`}\n                          className=\"text-sm leading-6\"\n                        >\n                          <div>{d.definition}</div>\n                          {d.example ? (\n                            <div className=\"mt-1 text-xs text-foreground/70\">\n                              “{d.example}”\n                            </div>\n                          ) : null}\n                          {d.synonyms && d.synonyms.length > 0 ? (\n                            <div className=\"mt-2 flex flex-wrap gap-1\">\n                              {d.synonyms.slice(0, 10).map((s) => (\n                                <button\n                                  key={`${entry.word}-syn-${di}-${s}`}\n                                  className=\"rounded-full bg-surface px-2 py-0.5 text-xs text-foreground/80 hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n                                  title=\"Search this synonym\"\n                                  onClick={() => {\n                                    setQuery(s);\n                                    void fetchDefinitions(s);\n                                  }}\n                                >\n                                  {s}\n                                </button>\n                              ))}\n                            </div>\n                          ) : null}\n                        </li>\n                      ))}\n                    </ol>\n                  </div>\n                ))}\n                {entry.sourceUrls && entry.sourceUrls.length > 0 ? (\n                  <div className=\"pt-1 text-xs text-foreground/60\">\n                    Source: {entry.sourceUrls[0]}\n                  </div>\n                ) : null}\n              </div>\n            ))}\n            {(aggregates.synonyms.length > 0 ||\n              aggregates.antonyms.length > 0) && (\n              <div className=\"pt-2 space-y-3\">\n                {aggregates.synonyms.length > 0 ? (\n                  <div>\n                    <div className=\"mb-1 text-xs uppercase tracking-wide text-foreground/60\">\n                      Synonyms\n                    </div>\n                    <div className=\"flex flex-wrap gap-1\">\n                      {aggregates.synonyms.slice(0, 40).map((s) => (\n                        <button\n                          key={`agg-syn-${s}`}\n                          className=\"rounded-full bg-surface px-2 py-0.5 text-xs text-foreground/80 hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n                          title=\"Search this synonym\"\n                          onClick={() => {\n                            setQuery(s);\n                            void fetchDefinitions(s);\n                          }}\n                        >\n                          {s}\n                        </button>\n                      ))}\n                    </div>\n                  </div>\n                ) : null}\n\n                {aggregates.antonyms.length > 0 ? (\n                  <div>\n                    <div className=\"mb-1 text-xs uppercase tracking-wide text-foreground/60\">\n                      Antonyms\n                    </div>\n                    <div className=\"flex flex-wrap gap-1\">\n                      {aggregates.antonyms.slice(0, 40).map((a) => (\n                        <button\n                          key={`agg-ant-${a}`}\n                          className=\"rounded-full bg-surface px-2 py-0.5 text-xs text-foreground/80 hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n                          title=\"Search this antonym\"\n                          onClick={() => {\n                            setQuery(a);\n                            void fetchDefinitions(a);\n                          }}\n                        >\n                          {a}\n                        </button>\n                      ))}\n                    </div>\n                  </div>\n                ) : null}\n              </div>\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n"],"names":["sanitizeQuery","q","Dictionary","query","setQuery","useState","isFocused","setIsFocused","loading","setLoading","error","setError","result","setResult","abortRef","useRef","audioRef","currentAudioSrcRef","lastPlayIdRef","resultsRef","useEffect","handleSelectionChange","sel","anchor","focus","container","value","primaryPhonetic","useMemo","entry","phoneticText","p","audioUrl","aggregates","aggSynonyms","aggAntonyms","originText","m","s","a","d","b","canSearch","playAudio","useCallback","src","audio","playId","resolve","reject","onCanPlay","cleanup","onError","fetchDefinitions","term","word","controller","url","res","data","err","jsxs","jsx","idx","i","di"],"mappings":"wIA8BMA,EAAiBC,GAAcA,EAAE,QAAQ,iBAAkB,EAAE,EAAE,KAAA,EAErE,SAAwBC,GAAa,CACnC,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/B,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAC1C,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAK,EACtC,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAwB,IAAI,EAChD,CAACO,EAAQC,CAAS,EAAIR,EAAAA,SAAmC,IAAI,EAC7DS,EAAWC,EAAAA,OAA+B,IAAI,EAC9CC,EAAWD,EAAAA,OAAgC,IAAI,EAC/CE,EAAqBF,EAAAA,OAAsB,IAAI,EAC/CG,EAAgBH,EAAAA,OAAO,CAAC,EACxBI,EAAaJ,EAAAA,OAA8B,IAAI,EAGrDK,EAAAA,UAAU,IAAM,CACd,SAASC,GAAwB,CAC/B,GAAIf,EAAW,OACf,MAAMgB,EAAM,OAAO,eAAA,EACnB,GAAI,CAACA,EAAK,OACV,MAAMC,EAASD,EAAI,WACbE,EAAQF,EAAI,UACZG,EAAYN,EAAW,QAC7B,GAAIM,IAGCF,GAAUE,EAAU,SAASF,CAAM,GACnCC,GAASC,EAAU,SAASD,CAAK,GAElC,OAGJ,MAAME,EAAQ1B,EAAcsB,EAAI,SAAA,GAAc,EAAE,EAC5CI,GAASA,EAAM,OAAS,GAC1BtB,EAASsB,CAAK,CAElB,CACA,gBAAS,iBAAiB,kBAAmBL,CAAqB,EAC3D,IACL,SAAS,oBAAoB,kBAAmBA,CAAqB,CACzE,EAAG,CAACf,CAAS,CAAC,EAEd,MAAMqB,EAAkBC,EAAAA,QAAQ,IAAM,CACpC,GAAI,CAAChB,GAAUA,EAAO,SAAW,EAAG,OACpC,MAAMiB,EAAQjB,EAAO,CAAC,EAChBkB,EACJD,EAAM,UAAYA,EAAM,WAAW,KAAME,GAAMA,EAAE,IAAI,GAAG,KACpDC,EAAWH,EAAM,WAAW,KAAME,GAAMA,EAAE,KAAK,GAAG,MACxD,MAAO,CAAE,KAAMD,EAAc,MAAOE,CAAA,CACtC,EAAG,CAACpB,CAAM,CAAC,EAELqB,EAAaL,EAAAA,QAAQ,IAAM,CAC/B,MAAMM,MAAkB,IAClBC,MAAkB,IACxB,IAAIC,EACJ,GAAIxB,GAAUA,EAAO,OAAS,EAC5B,UAAWiB,KAASjB,EAAQ,CACtB,CAACwB,GAAcP,EAAM,WAAqBA,EAAM,QACpD,UAAWQ,KAAKR,EAAM,UAAY,CAAA,EAAI,CACpC,UAAWS,KAAKD,EAAE,UAAY,CAAA,EAAIH,EAAY,IAAII,CAAC,EACnD,UAAWC,KAAKF,EAAE,UAAY,CAAA,EAAIF,EAAY,IAAII,CAAC,EACnD,UAAWC,KAAKH,EAAE,aAAe,CAAA,EAAI,CACnC,UAAWC,KAAKE,EAAE,UAAY,CAAA,EAAIN,EAAY,IAAII,CAAC,EACnD,UAAWC,KAAKC,EAAE,UAAY,CAAA,EAAIL,EAAY,IAAII,CAAC,CACrD,CACF,CACF,CAEF,MAAO,CACL,SAAU,MAAM,KAAKL,CAAW,EAAE,KAAK,CAACK,EAAGE,IAAMF,EAAE,cAAcE,CAAC,CAAC,EACnE,SAAU,MAAM,KAAKN,CAAW,EAAE,KAAK,CAACI,EAAGE,IAAMF,EAAE,cAAcE,CAAC,CAAC,EACnE,OAAQL,CAAA,CAEZ,EAAG,CAACxB,CAAM,CAAC,EAEL8B,EAAY1C,EAAcG,CAAK,EAAE,OAAS,EAE1CwC,EAAYC,EAAAA,YAAY,SAAY,CACxC,MAAMC,EAAMlB,GAAiB,MAC7B,GAAKkB,EACL,GAAI,CACF,MAAMC,EAAS9B,EAAS,UAAY,IAAI,MACxCE,EAAc,SAAW,EACzB,MAAM6B,EAAS7B,EAAc,QAmC7B,GAhCID,EAAmB,UAAY4B,GACjCC,EAAM,MAAA,EACNA,EAAM,YAAc,EACpB7B,EAAmB,QAAU4B,EAC7BC,EAAM,IAAMD,EACZC,EAAM,KAAA,EACN,MAAM,IAAI,QAAc,CAACE,EAASC,IAAW,CAC3C,MAAMC,EAAY,IAAM,CACtBC,EAAA,EACAH,EAAA,CACF,EACMI,EAAU,IAAM,CACpBD,EAAA,EACAF,EAAO,IAAI,MAAM,aAAa,CAAC,CACjC,EACME,EAAU,IAAM,CACpBL,EAAM,oBAAoB,UAAWI,CAAS,EAC9CJ,EAAM,oBAAoB,QAASM,CAAO,CAC5C,EACAN,EAAM,iBAAiB,UAAWI,EAAW,CAAE,KAAM,GAAM,EAC3DJ,EAAM,iBAAiB,QAASM,EAAS,CAAE,KAAM,GAAM,EACnDN,EAAM,YAAc,IACtBK,EAAA,EACAH,EAAA,EAEJ,CAAC,IAGDF,EAAM,MAAA,EACNA,EAAM,YAAc,GAGlBC,IAAW7B,EAAc,QAAS,OACtC,MAAM4B,EAAM,OAAO,MAAM,IAAM,CAAC,CAAC,CACnC,MAAQ,CAAC,CACX,EAAG,CAACnB,CAAe,CAAC,EAGpBP,EAAAA,UAAU,IAAM,CACd,GAAKR,EACL,GAAI,CACFI,EAAS,SAAS,MAAA,CACpB,MAAQ,CAAC,CACX,EAAG,CAACJ,CAAM,CAAC,EAEXQ,EAAAA,UAAU,IACD,IAAM,CACX,GAAI,CACFJ,EAAS,SAAS,MAAA,CACpB,MAAQ,CAAC,CACX,EACC,CAAA,CAAE,EAEL,MAAMqC,EAAmBT,cAAY,MAAOU,GAAiB,CAC3D,MAAMC,EAAOvD,EAAcsD,CAAI,EAC/B,GAAI,CAACC,EAAM,OACXzC,EAAS,SAAS,MAAA,EAClB,MAAM0C,EAAa,IAAI,gBACvB1C,EAAS,QAAU0C,EACnB/C,EAAW,EAAI,EACfE,EAAS,IAAI,EACbE,EAAU,IAAI,EACd,GAAI,CACF,MAAM4C,EAAM,mDAAmD,mBAC7DF,CAAA,CACD,GACKG,EAAM,MAAM,MAAMD,EAAK,CAAE,OAAQD,EAAW,OAAQ,EAC1D,GAAI,CAACE,EAAI,GAAI,CAEX,GAAIA,EAAI,SAAW,IAAK,CACtB7C,EAAU,CAAA,CAAE,EACZ,MACF,CACA,MAAM,IAAI,MAAM,mBAAmB6C,EAAI,MAAM,EAAE,CACjD,CACA,MAAMC,EAAQ,MAAMD,EAAI,KAAA,EACxB7C,EAAU8C,CAAI,CAChB,OAASC,EAAK,CACZ,GACEA,GACA,OAAOA,GAAQ,UACdA,EAA0B,OAAS,aAEpC,OACFjD,EAAS,+CAA+C,CAC1D,QAAA,CACEF,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAGLW,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMkC,EAAOtD,EAAcG,CAAK,EAChC,GAAI,CAACmD,EAAM,CACTzC,EAAU,IAAI,EACdF,EAAS,IAAI,EACb,MACF,CACA,MAAM,EAAI,WAAW,IAAM,CACpB0C,EAAiBC,CAAI,CAC5B,EAAG,GAAG,EACN,MAAO,IAAM,aAAa,CAAC,CAC7B,EAAG,CAACnD,EAAOkD,CAAgB,CAAC,EAG1BQ,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,MAAC,QAAA,CAAM,QAAQ,oBAAoB,UAAU,UAAU,SAAA,cAEvD,EACAA,EAAAA,IAAC,QAAA,CACC,GAAG,oBACH,KAAK,OACL,UAAU,8JACV,YAAY,sCACZ,MAAO3D,EACP,SAAW,GAAMC,EAAS,EAAE,OAAO,KAAK,EACxC,QAAS,IAAMG,EAAa,EAAI,EAChC,OAAQ,IAAMA,EAAa,EAAK,CAAA,CAAA,EAElCuD,EAAAA,IAAC,SAAA,CACC,UAAU,0JACV,QAAS,IAAMpB,GAAaW,EAAiBlD,CAAK,EAClD,SAAU,CAACuC,GAAalC,EACxB,gBAAe,CAACkC,GAAalC,EAC9B,SAAA,QAAA,CAAA,CAED,EACF,EAECmB,GAAiB,MAAQA,GAAiB,MACzCkC,EAAAA,KAAC,MAAA,CAAI,UAAU,qDACZ,SAAA,CAAAlC,GAAiB,KAChBmC,MAAC,OAAA,CAAK,UAAU,+BACb,SAAAnC,EAAgB,KACnB,EACE,KACHA,GAAiB,MAChBmC,EAAAA,IAAC,SAAA,CACC,UAAU,oIACV,QAASnB,EACT,aAAW,qBACZ,SAAA,MAAA,CAAA,EAGC,IAAA,CAAA,CACN,EACE,KAEHV,EAAW,OACV4B,OAAC,MAAA,CAAI,UAAU,mCAAmC,SAAA,CAAA,WACvC5B,EAAW,MAAA,CAAA,CACtB,EACE,KAEJ6B,EAAAA,IAAC,MAAA,CACC,IAAK3C,EACL,UAAU,sHAET,SAAAX,EACCsD,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,SAAA,UAAA,CAAQ,EACnCpD,EACFoD,EAAAA,IAAC,OAAI,UAAU,2BAA4B,SAAApD,CAAA,CAAM,EAC/CE,GAAU,KACZkD,MAAC,MAAA,CAAI,UAAU,iCAAiC,SAAA,qDAAA,CAEhD,EACElD,EAAO,SAAW,EACpBkD,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,SAAA,wBAAqB,EAElDD,OAAC,MAAA,CAAI,UAAU,gBACZ,SAAA,CAAAjD,EAAO,IAAI,CAACiB,EAAOkC,IAClBF,OAAC,MAAA,CAAiC,UAAU,YAC1C,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAjC,EAAM,KAAK,EACpDA,EAAM,UAAU,IAAI,CAACQ,EAAG2B,IACvBH,EAAAA,KAAC,MAAA,CAAiC,UAAU,YACzC,SAAA,CAAAxB,EAAE,aACDyB,MAAC,MAAA,CAAI,UAAU,qDACZ,SAAAzB,EAAE,aACL,EACE,KACJyB,EAAAA,IAAC,MAAG,UAAU,8BACX,WAAE,YAAY,IAAI,CAACtB,EAAGyB,IACrBJ,EAAAA,KAAC,KAAA,CAEC,UAAU,oBAEV,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAK,WAAE,UAAA,CAAW,EAClBtB,EAAE,QACDqB,OAAC,MAAA,CAAI,UAAU,kCAAkC,SAAA,CAAA,IAC7CrB,EAAE,QAAQ,GAAA,CAAA,CACd,EACE,KACHA,EAAE,UAAYA,EAAE,SAAS,OAAS,QAChC,MAAA,CAAI,UAAU,4BACZ,SAAAA,EAAE,SAAS,MAAM,EAAG,EAAE,EAAE,IAAKF,GAC5BwB,EAAAA,IAAC,SAAA,CAEC,UAAU,4JACV,MAAM,sBACN,QAAS,IAAM,CACb1D,EAASkC,CAAC,EACLe,EAAiBf,CAAC,CACzB,EAEC,SAAAA,CAAA,EARI,GAAGT,EAAM,IAAI,QAAQoC,CAAE,IAAI3B,CAAC,EAAA,CAUpC,EACH,EACE,IAAA,CAAA,EAzBC,GAAGT,EAAM,IAAI,MAAMoC,CAAE,EAAA,CA2B7B,CAAA,CACH,CAAA,CAAA,EArCQ,GAAGpC,EAAM,IAAI,MAAMmC,CAAC,EAsC9B,CACD,EACAnC,EAAM,YAAcA,EAAM,WAAW,OAAS,EAC7CgC,EAAAA,KAAC,MAAA,CAAI,UAAU,kCAAkC,SAAA,CAAA,WACtChC,EAAM,WAAW,CAAC,CAAA,CAAA,CAC7B,EACE,IAAA,CAAA,EA/CI,GAAGA,EAAM,IAAI,IAAIkC,CAAG,EAgD9B,CACD,GACC9B,EAAW,SAAS,OAAS,GAC7BA,EAAW,SAAS,OAAS,IAC7B4B,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACZ,SAAA,CAAA5B,EAAW,SAAS,OAAS,EAC5B4B,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,0DAA0D,SAAA,WAEzE,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACZ,SAAA7B,EAAW,SAAS,MAAM,EAAG,EAAE,EAAE,IAAKK,GACrCwB,EAAAA,IAAC,SAAA,CAEC,UAAU,4JACV,MAAM,sBACN,QAAS,IAAM,CACb1D,EAASkC,CAAC,EACLe,EAAiBf,CAAC,CACzB,EAEC,SAAAA,CAAA,EARI,WAAWA,CAAC,EAAA,CAUpB,CAAA,CACH,CAAA,CAAA,CACF,EACE,KAEHL,EAAW,SAAS,OAAS,SAC3B,MAAA,CACC,SAAA,CAAA6B,EAAAA,IAAC,MAAA,CAAI,UAAU,0DAA0D,SAAA,WAEzE,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACZ,SAAA7B,EAAW,SAAS,MAAM,EAAG,EAAE,EAAE,IAAKM,GACrCuB,EAAAA,IAAC,SAAA,CAEC,UAAU,4JACV,MAAM,sBACN,QAAS,IAAM,CACb1D,EAASmC,CAAC,EACLc,EAAiBd,CAAC,CACzB,EAEC,SAAAA,CAAA,EARI,WAAWA,CAAC,EAAA,CAUpB,CAAA,CACH,CAAA,CAAA,CACF,EACE,IAAA,CAAA,CACN,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,EACF,CAEJ"}