import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./iframe-GrlyTB2d.js";import{i as n,r}from"./react-qN2cStNd.js";import{l as i,m as a}from"./blocks-DkLPipTQ.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Browser и React API`}),`
`,(0,c.jsx)(t.h1,{id:`browser-и-react-api`,children:`Browser и React API`}),`
`,(0,c.jsxs)(t.p,{children:[`Эти entrypoint работают только после монтирования в браузере. Вызывайте hooks на верхнем уровне React-компонента или custom hook, а императивные действия (скачивание, clipboard, открытие меню) — из event handler. Они не заменяют UI primitives из `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-ui`}),`.`]}),`
`,(0,c.jsx)(t.h2,{id:`общие-hooks`,children:`Общие hooks`}),`
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
	useDebounce,
	useDebouncedCallback,
	useDndSortableSensors,
	useFloatingListbox,
	useSearchLink,
	useSearchParams,
	useThrottledCallback
} from "@ryuzaki13/react-foundation-lib/hooks";
`})}),`
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Назначение и lifecycle`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDebounce(value, delay)`})}),(0,c.jsx)(t.td,{children:`Возвращает отложенное значение. Не запускает network запрос сам — используйте результат в owner Query/UI flow.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDebouncedCallback(callback, delay, { flushOnUnmount? })`})}),(0,c.jsxs)(t.td,{children:[`Возвращает debounced callback. Опция `,(0,c.jsx)(t.code,{children:`flushOnUnmount`}),` нужна только когда финальный вызов действительно обязателен.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useThrottledCallback(callback, interval, { flushOnUnmount? })`})}),(0,c.jsxs)(t.td,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`{ call, flush, cancel }`}),`; стратегия last-write-wins. Вызывайте `,(0,c.jsx)(t.code,{children:`flush`}),` на границе сохранения, `,(0,c.jsx)(t.code,{children:`cancel`}),` при смене identity.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useDndSortableSensors(distanceOrOptions?)`})}),(0,c.jsxs)(t.td,{children:[`Готовые Pointer/Keyboard sensors для `,(0,c.jsx)(t.code,{children:`@dnd-kit/sortable`}),`; default distance — 6 px.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useLazyComponent(loader, ...)`})}),(0,c.jsx)(t.td,{children:`Используйте для lazy UI по устойчивому loader/cache key, а не вызывайте dynamic import во время render.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useReferenceTrace(name, value)`})}),(0,c.jsx)(t.td,{children:`Development diagnostic для отслеживания смены ссылок; не часть бизнес-логики.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useBlockBrowserZoom(enabled)`})}),(0,c.jsx)(t.td,{children:`Подписывается на browser events для блокировки zoom. Используйте только в явном специализированном UX, не как default.`})]})]})]}),`
`,(0,c.jsx)(t.h3,{id:`search-и-floating-listbox`,children:`Search и floating listbox`}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`useSearchParams<K>(allowedKeys?)`}),` и `,(0,c.jsx)(t.code,{children:`useSearchLink<K>()`}),` требуют `,(0,c.jsx)(t.code,{children:`@tanstack/react-router`}),`. Первый возвращает `,(0,c.jsx)(t.code,{children:`{ params, filteredParams, setParams }`}),` и выполняет navigation с `,(0,c.jsx)(t.code,{children:`replace: true`}),`; второй возвращает `,(0,c.jsx)(t.code,{children:`buildLink(params)`}),`. Оба работают с URL state, а не с произвольным Zustand/local store.`]}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`useFloatingListbox<T>(options)`}),` требует `,(0,c.jsx)(t.code,{children:`@floating-ui/react`}),` и объединяет ref, ARIA-interactions, keyboard navigation и placement. Передавайте:`]}),`
`,(0,c.jsxs)(t.ul,{children:[`
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`options`}),`, `,(0,c.jsx)(t.code,{children:`selectedIndex`}),`, `,(0,c.jsx)(t.code,{children:`getOptionDisabled`}),` — данные и доступность опций;`]}),`
`,(0,c.jsxs)(t.li,{children:[`optional controlled `,(0,c.jsx)(t.code,{children:`open`}),` + `,(0,c.jsx)(t.code,{children:`onOpenChange`}),`;`]}),`
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`onSelect`}),`, `,(0,c.jsx)(t.code,{children:`closeOnSelect`}),`, `,(0,c.jsx)(t.code,{children:`focusFloatingOnOpen`}),`, `,(0,c.jsx)(t.code,{children:`restoreFocusOnClose`}),` — interaction policy;`]}),`
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`placement`}),` и `,(0,c.jsx)(t.code,{children:`placementStrategy: "flip" | "auto"`}),` — placement;`]}),`
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`resolveFloatingSize(context)`}),` — только layout/CSS size policy.`]}),`
`]}),`
`,(0,c.jsxs)(t.p,{children:[`Hook возвращает Floating UI props/refs и их нужно распространять на reference, floating element и options строго по его контракту. Не заменяйте эти props самодельными keyboard handlers: это нарушит `,(0,c.jsx)(t.code,{children:`aria-activedescendant`}),`, focus restore и cleanup `,(0,c.jsx)(t.code,{children:`autoUpdate`}),`.`]}),`
`,(0,c.jsx)(t.h2,{id:`dom-и-overlay-helpers`,children:`DOM и overlay helpers`}),`
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
	downloadFileFromBlob,
	getOrCreatePortalRoot,
	useClickOutside,
	useEscapeDismiss,
	useFocusTrap,
	useIntersectionObserver,
	useOverlayFocus
} from "@ryuzaki13/react-foundation-lib/dom";
`})}),`
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Контракт`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadFileFromObjectURL(filename, objectUrl)`})}),(0,c.jsxs)(t.td,{children:[`Инициирует download по готовому object URL; не владеет временем `,(0,c.jsx)(t.code,{children:`URL.revokeObjectURL`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadFileFromBlob(filename, blob)`})}),(0,c.jsx)(t.td,{children:`Создаёт временный object URL и инициирует download.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadFileFromJson(filename, payload)`})}),(0,c.jsx)(t.td,{children:`Сериализует payload в JSON blob и скачивает.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getOrCreatePortalRoot(id)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает/создаёт DOM root или `,(0,c.jsx)(t.code,{children:`null`}),`, если `,(0,c.jsx)(t.code,{children:`document`}),` недоступен.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useClickOutside(refOrRefs, handler)`})}),(0,c.jsx)(t.td,{children:`Вызывает handler при внешнем pointer interaction; передавайте стабильные refs.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useEscapeDismiss(options)`})}),(0,c.jsx)(t.td,{children:`Dismiss только для active/enabled overlay; поддерживает container и целевой document.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useFocusTrap(isOpen)`})}),(0,c.jsx)(t.td,{children:`Возвращает ref для trapping focus внутри открытого overlay.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useOverlayFocus(options)`})}),(0,c.jsx)(t.td,{children:`Управляет initial focus и restore для overlay; применяйте вместе с accessible dialog/menu.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useElementHeightObserver(ref)`})}),(0,c.jsxs)(t.td,{children:[`Следит за высотой через `,(0,c.jsx)(t.code,{children:`ResizeObserver`}),`; результат используйте для layout, не для копирования props в state.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useIntersectionObserver(ref, options?)`})}),(0,c.jsx)(t.td,{children:`Возвращает intersection state DOM element.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useIsTouchDevice()`})}),(0,c.jsx)(t.td,{children:`Реактивно сообщает touch-capability браузера.`})]})]})]}),`
`,(0,c.jsxs)(t.p,{children:[`Hooks сами подписываются и очищают observers/listeners при unmount. Не вызывайте `,(0,c.jsx)(t.code,{children:`getOrCreatePortalRoot`}),` или browser API в server render; hook-проверки не делают UI SSR-safe автоматически.`]}),`
`,(0,c.jsx)(t.h2,{id:`clipboard-media-и-context-menu`,children:`Clipboard, media и context menu`}),`
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { useCopyText, useCopyElementTextWithFeedback } from "@ryuzaki13/react-foundation-lib/copy";
import { useMediaQuery, useMatchMedia, resolveResponsiveValue } from "@ryuzaki13/react-foundation-lib/media";
import { createVirtualAnchor, openMenu } from "@ryuzaki13/react-foundation-lib/context-menu";
`})}),`
`,(0,c.jsx)(t.h3,{id:`copy`,children:(0,c.jsx)(t.code,{children:`copy`})}),`
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useCopyText()`})}),(0,c.jsx)(t.td,{children:`Возвращает copy action для строки через Clipboard API с fallback.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useElementText(ref)`})}),(0,c.jsx)(t.td,{children:`Читает текст из DOM element.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useCopyElementText(ref)`})}),(0,c.jsx)(t.td,{children:`Комбинирует чтение элемента и copy.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useCopyFeedback()`})}),(0,c.jsx)(t.td,{children:`Локальное временное состояние feedback после успешного copy.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useCopyElementTextWithFeedback(ref)`})}),(0,c.jsx)(t.td,{children:`Удобная композиция copy element + feedback.`})]})]})]}),`
`,(0,c.jsx)(t.p,{children:`Copy может быть отклонён browser permissions; показывайте ожидаемую UI-ошибку, но не считайте clipboard источником истины для сохранения данных.`}),`
`,(0,c.jsx)(t.h3,{id:`media`,children:(0,c.jsx)(t.code,{children:`media`})}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`BREAKPOINTS_EM`}),` и `,(0,c.jsx)(t.code,{children:`Breakpoint`}),` задают стандартные breakpoints; `,(0,c.jsx)(t.code,{children:`useMatchMedia()`}),` возвращает `,(0,c.jsx)(t.code,{children:`MediaMatches`}),`. Для конкретного media query используйте `,(0,c.jsx)(t.code,{children:`useMediaQuery(query, { ssrFallback? })`}),`; `,(0,c.jsx)(t.code,{children:`ssrFallback`}),` определяет значение только до browser hydration/в окружении без `,(0,c.jsx)(t.code,{children:`matchMedia`}),`.`]}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ResponsiveValue<T>`}),`, `,(0,c.jsx)(t.code,{children:`isResponsiveMap`}),`, `,(0,c.jsx)(t.code,{children:`resolveResponsiveValue`}),` и `,(0,c.jsx)(t.code,{children:`resolveProps`}),` — pure helpers для responsive props. `,(0,c.jsx)(t.code,{children:`getCurrentFontSize`}),`, `,(0,c.jsx)(t.code,{children:`getCurrentLineHeight`}),`, `,(0,c.jsx)(t.code,{children:`getControlHeight`}),`, `,(0,c.jsx)(t.code,{children:`pxToEm`}),` читают layout/DOM: не вызывайте их в render, если результат влияет на state без external synchronization.`]}),`
`,(0,c.jsx)(t.h3,{id:`context-menu`,children:(0,c.jsx)(t.code,{children:`context-menu`})}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`MenuAnchor`}),`, `,(0,c.jsx)(t.code,{children:`MenuState`}),`, `,(0,c.jsx)(t.code,{children:`MenuPoint`}),`, `,(0,c.jsx)(t.code,{children:`OpenMenuPayload`}),` — serializable contracts состояния меню. `,(0,c.jsx)(t.code,{children:`openMenu(payload)`}),`, `,(0,c.jsx)(t.code,{children:`closeMenu(state)`}),` и `,(0,c.jsx)(t.code,{children:`toggleMenu(state, payload)`}),` — pure reducers; их можно держать в local/store owner.`]}),`
`,(0,c.jsxs)(t.p,{children:[`Для pointer menu используйте `,(0,c.jsx)(t.code,{children:`getMenuPointFromEvent(event)`}),` и `,(0,c.jsx)(t.code,{children:`createVirtualAnchor(point, contextElement?)`}),`. Для keyboard anchor используйте `,(0,c.jsx)(t.code,{children:`getMenuPointFromRect(rect)`}),`. API лишь описывает состояние/anchor; отображение и accessibility menu остаются у UI-компонента.`]}),`
`,(0,c.jsx)(t.h2,{id:`virtualizer-pwa-и-threejs`,children:`Virtualizer, PWA и Three.js`}),`
`,(0,c.jsx)(t.h3,{id:`infinite-virtualizer`,children:`Infinite virtualizer`}),`
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { useFetchNextPageEffect } from "@ryuzaki13/react-foundation-lib/virtualizer";
`})}),`
`,(0,c.jsxs)(t.p,{children:[`Hook принимает `,(0,c.jsx)(t.code,{children:`{ virtualItems, currentItemsCount, hasNextPage, fetchNextPage }`}),`; при достижении последней виртуальной строки запускает один следующий fetch и не создаёт параллельные запросы. `,(0,c.jsx)(t.code,{children:`fetchNextPage`}),` должен быть стабильным Query action. Не передавайте raw `,(0,c.jsx)(t.code,{children:`fetch`}),` и не подменяйте backend state локальным массивом.`]}),`
`,(0,c.jsx)(t.h3,{id:`service-worker`,children:`Service Worker`}),`
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { parseSwCachePolicy, buildSwCachePolicyValue, useServiceWorkerUpdate } from "@ryuzaki13/react-foundation-lib/pwa";
`})}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`useServiceWorkerUpdate()`}),` возвращает `,(0,c.jsx)(t.code,{children:`{ hasUpdate, applyUpdate, dismiss }`}),`. Его задача — UI-поверхность для уже настроенного приложения с Service Worker; hook не публикует и не настраивает private registration API.`]}),`
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`pwa/sw-cache-policy`}),` — отдельный точечный import того же pure policy API:`]}),`
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Контракт`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseSwCachePolicy(value)`})}),(0,c.jsxs)(t.td,{children:[`Парсит `,(0,c.jsx)(t.code,{children:`off`}),`, `,(0,c.jsx)(t.code,{children:`ttl=<duration>`}),` или `,(0,c.jsx)(t.code,{children:`bust=<duration>`}),` с `,(0,c.jsx)(t.code,{children:`max`}),`/`,(0,c.jsx)(t.code,{children:`name`}),`; invalid input даёт `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`buildSwCachePolicyValue(draft)`})}),(0,c.jsxs)(t.td,{children:[`Нормализует `,(0,c.jsx)(t.code,{children:`SwCachePolicyDraft`}),` в canonical transport string.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeSwCacheName(value)`})}),(0,c.jsxs)(t.td,{children:[`Делает безопасное lower-case cache name или `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveSwCacheCacheNameByPolicy(value)`})}),(0,c.jsxs)(t.td,{children:[`Возвращает вычисленное имя cache только для `,(0,c.jsx)(t.code,{children:`ttl`}),`/`,(0,c.jsx)(t.code,{children:`bust`}),`.`]})]})]})]}),`
`,(0,c.jsxs)(t.p,{children:[`Пример: `,(0,c.jsx)(t.code,{children:`ttl=24h;max=200;name=reference`}),`. Это policy для transport/Service Worker, а не замена TanStack Query cache. Не включайте в SW cache auth-sensitive responses без отдельной security policy.`]}),`
`,(0,c.jsx)(t.h3,{id:`доступность-threejs`,children:`Доступность Three.js`}),`
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { useThreeSceneAvailability, disableThreeSceneForSession } from "@ryuzaki13/react-foundation-lib/three-scene";
`})}),`
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`API`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isThreeSceneSupported(options?)`})}),(0,c.jsx)(t.td,{children:`Проверяет browser WebGL/WebGL2 support.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isThreeSceneDisabledForSession(key?)`}),`, `,(0,c.jsx)(t.code,{children:`disableThreeSceneForSession(key?)`})]}),(0,c.jsx)(t.td,{children:`Читают/устанавливают opt-out текущей tab session.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`useThreeSceneAvailability(options?)`})}),(0,c.jsxs)(t.td,{children:[`React state с `,(0,c.jsx)(t.code,{children:`pending`}),`/`,(0,c.jsx)(t.code,{children:`available`}),`/`,(0,c.jsx)(t.code,{children:`unavailable`}),` и причиной (`,(0,c.jsx)(t.code,{children:`sessionDisabled`}),`, `,(0,c.jsx)(t.code,{children:`reducedMotion`}),`, `,(0,c.jsx)(t.code,{children:`webglUnsupported`}),`, `,(0,c.jsx)(t.code,{children:`ssr`}),`).`]})]})]})]}),`
`,(0,c.jsxs)(t.p,{children:[`Проверка support не заменяет обработку ошибки renderer. При `,(0,c.jsx)(t.code,{children:`unavailable`}),` всегда рендерите семантический non-Three fallback.`]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};