@rxdrag/website-lib-react 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/components/Analytics/eventHandlers.d.ts +8 -0
  2. package/dist/components/Analytics/index.d.ts +3 -0
  3. package/dist/components/Analytics/singleton.d.ts +18 -0
  4. package/dist/components/Analytics/tracking.d.ts +11 -0
  5. package/dist/components/Analytics/types.d.ts +54 -0
  6. package/dist/components/Analytics/utils.d.ts +10 -0
  7. package/dist/components/AttachmentIcon/index.d.ts +5 -0
  8. package/dist/components/BackgroundHlsVideoPlayer.d.ts +3 -0
  9. package/dist/components/BackgroundVideoPlayer.d.ts +3 -0
  10. package/dist/components/Bulletin.d.ts +3 -0
  11. package/dist/components/ContactForm/ContactForm.d.ts +3 -0
  12. package/dist/components/ContactForm/FileUpload2.d.ts +24 -0
  13. package/dist/components/ContactForm/Input.d.ts +14 -0
  14. package/dist/components/ContactForm/Input2.d.ts +6 -0
  15. package/dist/components/ContactForm/Submit.d.ts +11 -0
  16. package/dist/components/ContactForm/TelInput.d.ts +14 -0
  17. package/dist/components/ContactForm/TelInput2.d.ts +15 -0
  18. package/dist/components/ContactForm/Textarea.d.ts +14 -0
  19. package/dist/components/ContactForm/Textarea2.d.ts +6 -0
  20. package/dist/components/ContactForm/countryDialCodes.d.ts +7 -0
  21. package/dist/components/ContactForm/factory.d.ts +28 -0
  22. package/dist/components/ContactForm/funcs.d.ts +14 -0
  23. package/dist/components/ContactForm/hooks/useInlineLabelPadding.d.ts +9 -0
  24. package/dist/components/ContactForm/hooks/useTelControl.d.ts +18 -0
  25. package/dist/components/ContactForm/index.d.ts +7 -0
  26. package/dist/components/ContactForm/types.d.ts +58 -0
  27. package/dist/components/Icon/index.d.ts +6 -0
  28. package/dist/components/Medias/MainMedia.d.ts +17 -0
  29. package/dist/components/Medias/Thumbnail.d.ts +12 -0
  30. package/dist/components/Medias/VideoPlayer.d.ts +7 -0
  31. package/dist/components/Medias/index.d.ts +23 -0
  32. package/dist/components/ProductCard/ProductCard.d.ts +17 -0
  33. package/dist/components/ProductCard/ProductCta/index.d.ts +8 -0
  34. package/dist/components/ProductCard/ProductDescription/index.d.ts +3 -0
  35. package/dist/components/ProductCard/ProductMedia/index.d.ts +8 -0
  36. package/dist/components/ProductCard/ProductTitle/index.d.ts +3 -0
  37. package/dist/components/ProductCard/ProductView.d.ts +7 -0
  38. package/dist/components/ProductCard/index.d.ts +5 -0
  39. package/dist/components/ProductCard/useQueryProduct.d.ts +3 -0
  40. package/dist/components/ReactModalTrigger.d.ts +8 -0
  41. package/dist/components/ReactVideoPlayer.d.ts +30 -0
  42. package/dist/components/RichTextOutline/index.d.ts +8 -0
  43. package/dist/components/RichTextOutline/useAcitviedHeading.d.ts +1 -0
  44. package/dist/components/RichTextOutline/useAnchorScroll.d.ts +2 -0
  45. package/dist/components/Scroller.d.ts +5 -0
  46. package/dist/components/SearchInput.d.ts +2 -0
  47. package/dist/components/Share/index.d.ts +10 -0
  48. package/dist/components/Share/socials.d.ts +12 -0
  49. package/dist/components/ToTop.d.ts +6 -0
  50. package/dist/components/VideoPlayIcon.d.ts +8 -0
  51. package/dist/components/all.d.ts +40 -0
  52. package/dist/components/index.d.ts +17 -0
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.mjs +3954 -0
  55. package/dist/index.mjs.map +1 -0
  56. package/dist/style.css +17 -0
  57. package/dist/types/view-model.d.ts +35 -0
  58. package/package.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/components/Analytics/utils.ts","../src/components/Analytics/tracking.ts","../src/components/Analytics/singleton.ts","../src/components/Analytics/index.tsx","../../../node_modules/.pnpm/react@19.2.0/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.0/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.pnpm/react@19.2.0/node_modules/react/jsx-runtime.js","../src/components/AttachmentIcon/index.tsx","../src/components/ContactForm/Submit.tsx","../src/components/ContactForm/funcs.ts","../src/components/ContactForm/hooks/useInlineLabelPadding.ts","../src/components/ContactForm/FileUpload2.tsx","../src/components/ContactForm/Input.tsx","../src/components/ContactForm/Input2.tsx","../src/components/ContactForm/Textarea.tsx","../src/components/ContactForm/Textarea2.tsx","../src/components/ContactForm/countryDialCodes.ts","../src/components/ContactForm/hooks/useTelControl.ts","../src/components/ContactForm/TelInput.tsx","../src/components/ContactForm/TelInput2.tsx","../src/components/ContactForm/factory.tsx","../src/components/ContactForm/ContactForm.tsx","../src/components/Icon/index.tsx","../src/components/Medias/VideoPlayer.tsx","../src/components/Medias/MainMedia.tsx","../src/components/Medias/Thumbnail.tsx","../src/components/Medias/index.tsx","../src/components/ProductCard/ProductCta/index.tsx","../src/components/ProductCard/ProductTitle/index.tsx","../src/components/ProductCard/ProductDescription/index.tsx","../src/components/ProductCard/ProductMedia/index.tsx","../src/components/ProductCard/ProductView.tsx","../src/components/ProductCard/ProductCard.tsx","../src/components/RichTextOutline/useAcitviedHeading.ts","../src/components/RichTextOutline/index.tsx","../src/components/Share/socials.tsx","../src/components/Share/index.tsx","../src/components/Scroller.tsx","../src/components/SearchInput.tsx","../src/components/ToTop.tsx","../src/components/BackgroundVideoPlayer.tsx","../src/components/BackgroundHlsVideoPlayer.tsx","../src/components/Bulletin.tsx","../src/components/ReactModalTrigger.tsx","../src/components/VideoPlayIcon.tsx","../src/components/ReactVideoPlayer.tsx","../src/components/all.ts"],"sourcesContent":["// Analytics 工具函数\n\n// 检查是否为开发环境\nexport function isDevelopmentEnvironment(): boolean {\n return (\n window.location.hostname === \"localhost\" ||\n window.location.hostname.startsWith(\"192.168.\") ||\n window.location.hostname === \"127.0.0.1\"\n );\n}\n\n// 调试日志函数\nexport function createDebugLogger() {\n const isDev = isDevelopmentEnvironment();\n return function debugLog(...args: unknown[]) {\n if (isDev) {\n console.log(\"[Analytics]\", ...args);\n }\n };\n}\n\n// 生成唯一 ID(简单版)\nexport function generateId(prefix = \"v\"): string {\n return (\n prefix +\n Date.now().toString(36) +\n Math.random().toString(36).substring(2, 8)\n );\n}\n\n// 设置 cookie\nexport function setCookie(name: string, value: string, days: number): void {\n const expires = new Date();\n expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\n document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax`;\n}\n\n// 获取 cookie\nexport function getCookie(name: string): string | null {\n const match = document.cookie.match(\n new RegExp(\"(^| )\" + name + \"=([^;]+)\")\n );\n return match ? match[2] : null;\n}\n\n// 获取或生成 visitor_id(长期存储)\nexport function getVisitorId(): string {\n let visitorId = getCookie(\"visitor_id\");\n if (!visitorId) {\n visitorId = generateId(\"v\");\n setCookie(\"visitor_id\", visitorId, 365); // 365天有效\n }\n return visitorId;\n}\n\n// 获取设备信息\nexport function getDeviceInfo(): string {\n const ua = navigator.userAgent;\n if (/Mobile|Android|iPhone|iPad/.test(ua)) {\n return /iPad/.test(ua) ? \"tablet\" : \"mobile\";\n }\n return \"desktop\";\n}\n\n// 获取平台信息\nexport function getPlatform(): string {\n const ua = navigator.userAgent;\n if (/Windows/.test(ua)) return \"Windows\";\n if (/Mac/.test(ua)) return \"macOS\";\n if (/Linux/.test(ua)) return \"Linux\";\n if (/Android/.test(ua)) return \"Android\";\n if (/iPhone|iPad/.test(ua)) return \"iOS\";\n return \"Unknown\";\n}\n\n// 获取浏览器语言\nexport function getBrowserLanguage(): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return navigator.language || (navigator as any).userLanguage || \"en\";\n}\n\n// 检测页面类型\nexport function detectPageType(defaultType = \"pageView\"): string {\n const currentPath = window.location.pathname.toLowerCase();\n\n // 检测是否为 thanks 页面\n if (\n currentPath.includes(\"/thanks\") ||\n currentPath.includes(\"/thank-you\")\n ) {\n return \"enquiry\";\n }\n\n return defaultType;\n}\n","// Analytics 跟踪相关函数\nimport type { AnalyticsState, PageData, TrackingData } from './types';\nimport { \n getDeviceInfo, \n getPlatform, \n getBrowserLanguage, \n detectPageType,\n getCookie \n} from './utils';\n\n// 更新活跃时间\nexport function updateActiveTime(state: AnalyticsState): void {\n if (state.isPageVisible) {\n const now = Date.now();\n state.activeTime += now - state.lastActiveTime;\n state.lastActiveTime = now;\n }\n}\n\n// 重置页面跟踪(用于页面切换)\nexport function resetPageTracking(state: AnalyticsState, pageData: PageData): void {\n const newUrl = window.location.href;\n // 只有当 URL 真正改变时才重置\n if (newUrl !== state.currentPageUrl) {\n state.currentPageUrl = newUrl;\n pageData.start_time = Date.now();\n state.pageLoadTime = Date.now();\n state.isPageTracked = false;\n // 重置活跃时间追踪\n state.activeTime = 0;\n state.lastActiveTime = Date.now();\n state.isPageVisible = !document.hidden;\n }\n}\n\n// 检查是否为真正的页面访问(简化版)\nexport function isRealPageVisit(state: AnalyticsState): boolean {\n const now = Date.now();\n\n // 如果页面已经被跟踪过,则不是新访问\n if (state.isPageTracked) {\n return false;\n }\n\n // 检查是否在短时间内重复跟踪(全局防重复)\n if (state.lastTrackTime > 0 && now - state.lastTrackTime < 1000) {\n return false;\n }\n\n // 检查页面是否可见(避免在后台标签页中统计)\n if (document.hidden || document.visibilityState === \"hidden\") {\n return false;\n }\n\n return true;\n}\n\n// 处理队列中的下一个请求\nexport function processQueue(state: AnalyticsState, apiEndpoint: string): void {\n state.isRequestPending = false;\n\n if (state.requestQueue.length > 0) {\n const { data, eventType } = state.requestQueue.shift()!;\n // 小延迟避免请求过于频繁\n setTimeout(() => {\n sendImmediately(data, eventType, state, apiEndpoint);\n }, 100);\n }\n}\n\n// 立即发送数据\nexport function sendImmediately(\n data: TrackingData, \n eventType: string, \n state: AnalyticsState, \n apiEndpoint: string\n): void {\n state.isRequestPending = true;\n\n fetch(apiEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n body: JSON.stringify(data),\n keepalive: true,\n })\n .then(() => {\n if (eventType === \"pageView\") {\n state.isPageTracked = true;\n state.lastTrackTime = Date.now();\n \n // 更新全局状态(用于跨组件实例共享)\n if (typeof window !== 'undefined') {\n (window as any).__analyticsGlobalState = {\n lastPageUrl: window.location.href,\n lastTrackTime: Date.now(),\n };\n }\n }\n\n // 处理队列中的下一个请求\n processQueue(state, apiEndpoint);\n })\n .catch(() => {\n processQueue(state, apiEndpoint);\n });\n}\n\n// 优化的网络请求函数\nexport function sendTrackingData(\n data: TrackingData, \n eventType: string, \n state: AnalyticsState, \n apiEndpoint: string\n): void {\n // 对于 pageLeave 事件,立即发送(用户可能马上离开)\n if (eventType === \"pageLeave\") {\n sendImmediately(data, eventType, state, apiEndpoint);\n return;\n }\n\n // 对于 pageView 事件,可以稍微延迟或批量处理\n if (state.isRequestPending) {\n // 如果有请求正在进行,加入队列\n state.requestQueue.push({ data, eventType });\n return;\n }\n\n sendImmediately(data, eventType, state, apiEndpoint);\n}\n\n// 创建跟踪数据\nexport function createTrackingData(\n pageData: PageData,\n state: AnalyticsState,\n eventType: string,\n effectiveDuration: number\n): TrackingData {\n return {\n visitor_id: pageData.visitor_id,\n session_id: pageData.session_id,\n url: window.location.href,\n path: window.location.pathname,\n referrer: state.currentReferrer,\n user_agent: pageData.user_agent,\n duration_ms: effectiveDuration, // 使用活跃时间\n timestamp: Date.now(),\n type: eventType, // 添加事件类型\n // 设备和平台信息\n device: getDeviceInfo(),\n platform: getPlatform(),\n browser_language: getBrowserLanguage(),\n // 页面信息\n page_title: document.title || null,\n // 屏幕信息\n screen_width: screen.width,\n screen_height: screen.height,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n // 时区信息\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n // 是否新用户(简单判断:第一次访问该域名)\n is_new_user:\n !getCookie(\"visitor_id\") ||\n getCookie(\"visitor_id\") === pageData.visitor_id,\n };\n}\n\n// 发送访客数据(支持不同类型)\nexport function trackPageEvent(\n eventType: string,\n pageData: PageData,\n state: AnalyticsState,\n apiEndpoint: string,\n debugLog: (...args: any[]) => void\n): void {\n // 对于 pageView 事件,检测页面类型\n if (eventType === \"pageView\") {\n eventType = detectPageType(eventType);\n debugLog(\"Detected page type:\", eventType);\n\n // 检查是否为真正的页面访问\n if (!isRealPageVisit(state)) {\n return;\n }\n }\n\n // 计算活跃时间\n let effectiveDuration = 0;\n if (eventType === \"pageLeave\") {\n updateActiveTime(state); // 更新到当前时间\n effectiveDuration = state.activeTime;\n }\n\n debugLog(\"Using referrer:\", state.currentReferrer, \"for event:\", eventType);\n\n const data = createTrackingData(pageData, state, eventType, effectiveDuration);\n\n // 优化的网络请求处理\n sendTrackingData(data, eventType, state, apiEndpoint);\n}\n\n// 兼容性函数,保持向后兼容\nexport function trackPageVisit(\n pageData: PageData,\n state: AnalyticsState,\n apiEndpoint: string,\n debugLog: (...args: any[]) => void\n): void {\n // 检查是否在短时间内(200ms)重复调用同一个 URL 的 pageView\n const currentUrl = window.location.href;\n const now = Date.now();\n \n if (state.isPageTracked && state.currentPageUrl === currentUrl && now - state.lastTrackTime < 200) {\n return;\n }\n \n trackPageEvent(\"pageView\", pageData, state, apiEndpoint, debugLog);\n}\n","// Analytics 单例管理器\nimport type { AnalyticsState, PageData } from './types';\nimport { \n createDebugLogger, \n generateId, \n getVisitorId \n} from './utils';\nimport { trackPageEvent } from './tracking';\n\nclass AnalyticsSingleton {\n private static instance: AnalyticsSingleton | null = null;\n private initialized = false;\n private state: AnalyticsState;\n private pageData: PageData;\n private apiEndpoint: string;\n private debugLog: (...args: any[]) => void;\n private eventHandlers: Array<() => void> = [];\n\n private constructor(apiEndpoint: string) {\n this.apiEndpoint = apiEndpoint;\n this.debugLog = createDebugLogger();\n \n // 初始化访客和会话信息\n const visitorId = getVisitorId();\n let sessionId = sessionStorage.getItem('session_id');\n if (!sessionId) {\n sessionId = generateId('s');\n sessionStorage.setItem('session_id', sessionId);\n }\n\n // 页面信息\n this.pageData = {\n visitor_id: visitorId,\n session_id: sessionId,\n url: window.location.href,\n path: window.location.pathname,\n referrer: document.referrer || null,\n user_agent: navigator.userAgent,\n start_time: Date.now(),\n };\n\n // 状态管理\n this.state = {\n isPageTracked: false,\n currentPageUrl: window.location.href,\n pageLoadTime: Date.now(),\n lastTrackTime: 0,\n currentReferrer: document.referrer || null,\n activeTime: 0,\n lastActiveTime: Date.now(),\n isPageVisible: !document.hidden,\n requestQueue: [],\n isRequestPending: false,\n isAstroEnvironment: false,\n pageLeaveTracked: false,\n initialLoadHandled: false,\n interactionThrottled: false,\n lastInteractionTime: 0,\n };\n\n }\n\n static getInstance(apiEndpoint = \"/api/track-visitor\"): AnalyticsSingleton {\n if (!AnalyticsSingleton.instance) {\n AnalyticsSingleton.instance = new AnalyticsSingleton(apiEndpoint);\n }\n return AnalyticsSingleton.instance;\n }\n\n static reset(): void {\n if (AnalyticsSingleton.instance) {\n AnalyticsSingleton.instance.cleanup();\n AnalyticsSingleton.instance = null;\n }\n }\n\n init(): void {\n if (this.initialized) {\n return;\n }\n\n this.initialized = true;\n this.setupEventListeners();\n this.handleInitialPageLoad();\n }\n\n private setupEventListeners(): void {\n // 页面离开事件\n const handlePageLeave = () => {\n if (this.state.pageLeaveTracked || this.state.lastTrackTime === 0) {\n return;\n }\n\n this.state.pageLeaveTracked = true;\n trackPageEvent(\"pageLeave\", this.pageData, this.state, this.apiEndpoint, this.debugLog);\n };\n\n // 页面离开事件监听器\n const handleBeforeUnload = () => handlePageLeave();\n const handlePageHide = () => handlePageLeave();\n\n window.addEventListener('beforeunload', handleBeforeUnload);\n window.addEventListener('pagehide', handlePageHide);\n\n // Astro 事件监听\n const handleAstroBeforeSwap = () => {\n handlePageLeave();\n };\n\n const handleAstroAfterSwap = () => {\n this.state.isAstroEnvironment = true;\n\n const newUrl = window.location.href;\n if (newUrl !== this.state.currentPageUrl) {\n // 更新 referrer:页面切换时,referrer 是上一个页面\n this.state.currentReferrer = this.state.currentPageUrl;\n\n // 更新页面状态\n this.state.currentPageUrl = newUrl;\n this.pageData.url = newUrl;\n this.pageData.path = window.location.pathname;\n this.pageData.start_time = Date.now();\n this.state.pageLoadTime = Date.now();\n this.state.isPageTracked = false;\n this.state.pageLeaveTracked = false;\n this.state.activeTime = 0;\n this.state.lastActiveTime = Date.now();\n this.state.isPageVisible = !document.hidden;\n\n // 发送新页面统计\n this.trackPageVisit();\n }\n };\n\n document.addEventListener('astro:before-swap', handleAstroBeforeSwap);\n document.addEventListener('astro:after-swap', handleAstroAfterSwap);\n\n // 页面可见性变化\n const handleVisibilityChange = () => {\n const now = Date.now();\n if (document.visibilityState === 'visible') {\n this.state.isPageVisible = true;\n this.state.lastActiveTime = now;\n } else {\n if (this.state.isPageVisible) {\n this.state.activeTime += now - this.state.lastActiveTime;\n }\n this.state.isPageVisible = false;\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n // 用户交互事件\n const handleUserInteraction = () => {\n if (!this.state.isPageVisible || this.state.interactionThrottled) return;\n\n const now = Date.now();\n if (now - this.state.lastInteractionTime < 1000) return;\n\n this.state.lastInteractionTime = now;\n this.state.interactionThrottled = true;\n\n if (now - this.state.lastActiveTime > 30000) {\n this.state.lastActiveTime = now;\n }\n\n setTimeout(() => {\n this.state.interactionThrottled = false;\n }, 1000);\n };\n\n const interactionEvents = ['click', 'keydown', 'scroll'];\n interactionEvents.forEach((event) => {\n document.addEventListener(event, handleUserInteraction, {\n passive: true,\n capture: false,\n });\n });\n\n // 保存事件处理器引用,用于清理\n this.eventHandlers = [\n () => window.removeEventListener('beforeunload', handleBeforeUnload),\n () => window.removeEventListener('pagehide', handlePageHide),\n () => document.removeEventListener('astro:before-swap', handleAstroBeforeSwap),\n () => document.removeEventListener('astro:after-swap', handleAstroAfterSwap),\n () => document.removeEventListener('visibilitychange', handleVisibilityChange),\n ...interactionEvents.map(event => \n () => document.removeEventListener(event, handleUserInteraction)\n )\n ];\n }\n\n private handleInitialPageLoad(): void {\n if (this.state.isPageTracked || this.state.initialLoadHandled) {\n return;\n }\n\n this.state.initialLoadHandled = true;\n this.trackPageVisit();\n }\n\n private trackPageVisit(): void {\n trackPageEvent(\"pageView\", this.pageData, this.state, this.apiEndpoint, this.debugLog);\n }\n\n cleanup(): void {\n this.eventHandlers.forEach(cleanup => cleanup());\n this.eventHandlers = [];\n this.initialized = false;\n }\n}\n\nexport default AnalyticsSingleton;\n","import { useEffect } from 'react';\nimport type { AnalyticsProps } from './types';\nimport AnalyticsSingleton from './singleton';\n\nexport function Analytics({\n apiEndpoint = \"/api/track-visitor\"\n}: AnalyticsProps) {\n useEffect(() => {\n // 获取单例实例并初始化\n const analytics = AnalyticsSingleton.getInstance(apiEndpoint);\n analytics.init();\n\n // 组件卸载时不清理单例,让它继续工作\n return () => {\n // 不做任何清理,让单例继续工作\n };\n }, [apiEndpoint]);\n\n // 组件不渲染任何可见内容\n return null;\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { forwardRef } from \"react\";\n\nexport type AttachmentIconProps = {\n extName?: string;\n className?: string;\n};\n\nexport const AttachmentIcon = forwardRef<HTMLDivElement, AttachmentIconProps>(\n (props, ref) => {\n const { extName, ...rest } = props;\n return (\n <div ref={ref} {...rest}>\n {extName && extName === \".pdf\" ? (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M905.185809 178.844158C898.576738 172.685485 891.19337 165.824412 883.21687 158.436127 860.422682 137.322863 837.434925 116.207791 815.697647 96.487895 813.243072 94.261877 813.243072 94.261877 810.786411 92.037081 781.783552 65.781062 757.590948 44.376502 739.713617 29.293612 729.254178 20.469111 721.020606 13.860686 714.970549 9.501727 710.955023 6.608611 707.690543 4.524745 704.47155 2.998714 700.417679 1.07689 696.638044-0.094029 691.307277 0.005928 677.045677 0.273349 665.6 11.769337 665.6 26.182727L665.6 77.352844 665.6 128.522961 665.6 230.863194 665.6 256.448252 691.2 256.448252 896 256.448252 870.4 230.863194 870.4 998.414942 896 972.829884 230.381436 972.829884C187.90385 972.829884 153.6 938.623723 153.6 896.20663L153.6 26.182727 128 51.767786 588.8 51.767786C602.93849 51.767786 614.4 40.312965 614.4 26.182727 614.4 12.05249 602.93849 0.597669 588.8 0.597669L128 0.597669 102.4 0.597669 102.4 26.182727 102.4 896.20663C102.4 966.91021 159.652833 1024 230.381436 1024L896 1024 921.6 1024 921.6 998.414942 921.6 230.863194 921.6 205.278135 896 205.278135 691.2 205.278135 716.8 230.863194 716.8 128.522961 716.8 77.352844 716.8 26.182727C716.8 39.813762 705.748075 50.91427 692.267725 51.167041 687.705707 51.252584 685.069822 50.435995 682.52845 49.231204 682.259458 49.103682 683.344977 49.796618 685.029451 51.010252 689.779394 54.432502 697.145822 60.34494 706.686383 68.394196 724.009052 83.009121 747.816448 104.072869 776.413589 129.961594 778.850014 132.168064 778.850014 132.168064 781.285216 134.376514 802.876774 153.964212 825.739479 174.96442 848.413564 195.966437 856.350957 203.3185 863.697005 210.144893 870.269888 216.269843 874.209847 219.941299 877.019309 222.565641 878.499674 223.951409 888.81866 233.610931 905.019017 233.081212 914.684179 222.768247 924.349344 212.455283 923.819315 196.264383 913.500326 186.604861 911.981323 185.182945 909.155025 182.542876 905.185809 178.844158ZM102.4 461.128719 0 461.128719 0 896.074709 512 896.074709 1024 896.074709 1024 461.128719 153.6 461.128719 153.6 460.531049 102.4 460.531049 102.4 461.128719ZM208.2 711 208.2 819.2 157.6 819.2 157.6 528 269 528C301.533495 528 327.366571 536.466581 346.5 553.4 365.633429 570.333419 375.2 592.733195 375.2 620.6 375.2 649.133476 365.833427 671.333254 347.1 687.2 328.366573 703.066746 302.133502 711 268.4 711L208.2 711ZM208.2 670.4 269 670.4C287.00009 670.4 300.733286 666.166709 310.2 657.7 319.666714 649.233291 324.4 637.000079 324.4 621 324.4 605.266588 319.600047 592.700047 310 583.3 300.399951 573.899953 287.200083 569.066669 270.4 568.8L208.2 568.8 208.2 670.4ZM419.4 819.2 419.4 528 505.4 528C531.133461 528 553.966566 533.733276 573.9 545.2 593.833434 556.666724 609.266611 572.933229 620.2 594 631.133389 615.066771 636.6 639.199863 636.6 666.4L636.6 681C636.6 708.600139 631.100055 732.866562 620.1 753.8 609.099945 774.733438 593.433436 790.866609 573.1 802.2 552.766564 813.533391 529.466799 819.2 503.2 819.2L419.4 819.2ZM470 568.8 470 778.8 503 778.8C529.533466 778.8 549.89993 770.500083 564.1 753.9 578.30007 737.299917 585.533331 713.466822 585.8 682.4L585.8 666.2C585.8 634.599842 578.933402 610.46675 565.2 593.8 551.466598 577.13325 531.533463 568.8 505.4 568.8L470 568.8ZM854.8 695.8 737.6 695.8 737.6 819.2 687 819.2 687 528 872 528 872 568.8 737.6 568.8 737.6 655.4 854.8 655.4 854.8 695.8Z\" />\n </svg>\n ) : extName && (extName === \".xls\" || extName === \".xlsx\") ? (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M810.18 949.8H213.821c-20.551 0-37.271-16.649-37.271-37.1V111.3c0-20.45 16.72-37.1 37.271-37.1h395.27v143.74c0 52.25 46.97 94.77 104.71 94.77h133.65V912.7c0 20.451-16.72 37.1-37.27 37.1zM678.9 118.68l130.85 130.85H713.8c-19.25 0-34.9-14.169-34.9-31.59v-99.26z m168.551 55.41l-99.89-99.89L673.36 0H213.82C152.16 0 102 49.93 102 111.3v801.4c0 61.371 50.16 111.3 111.821 111.3h596.36C871.84 1024 922 974.071 922 912.7V248.64l-74.55-74.55z\" />\n <path d=\"M810.18 949.8H213.821c-20.551 0-37.271-16.649-37.271-37.1V111.3c0-20.45 16.72-37.1 37.271-37.1h395.27v143.74c0 52.25 46.97 94.77 104.71 94.77h133.65V912.7c0 20.451-16.72 37.1-37.27 37.1zM678.9 118.68l130.85 130.85H713.8c-19.25 0-34.9-14.169-34.9-31.59v-99.26z m168.551 55.41l-99.89-99.89L673.36 0H213.82C152.16 0 102 49.93 102 111.3v801.4c0 61.371 50.16 111.3 111.821 111.3h596.36C871.84 1024 922 974.071 922 912.7V248.64l-74.55-74.55z\" />\n <path d=\"M559.714 579.272L668.11 404.855a0.2 0.2 0 0 0-0.17-0.305h-89.12a0.2 0.2 0 0 0-0.174 0.102l-67.604 120.3-70.265-120.303a0.2 0.2 0 0 0-0.173-0.1h-85.779a0.2 0.2 0 0 0-0.168 0.308L461.02 571.401 347.653 746.24a0.2 0.2 0 0 0 0.168 0.309h88.007a0.2 0.2 0 0 0 0.17-0.095l74.362-120.51 75.153 120.51a0.2 0.2 0 0 0 0.17 0.095h89.835a0.2 0.2 0 0 0 0.164-0.314L559.714 579.272z\" />\n </svg>\n ) : extName && (extName === \".doc\" || extName === \".docx\") ? (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326z m1.8 562H232V136h302v216c0 23.2 18.8 42 42 42h216v494zM528.1 472h-32.2c-5.5 0-10.3 3.7-11.6 9.1L434.6 680l-46.1-198.7c-1.3-5.4-6.1-9.3-11.7-9.3h-35.4c-1.1 0-2.1 0.1-3.1 0.4-6.4 1.7-10.2 8.3-8.5 14.7l74.2 276c1.4 5.2 6.2 8.9 11.6 8.9h32c5.4 0 10.2-3.6 11.6-8.9l52.8-197 52.8 197c1.4 5.2 6.2 8.9 11.6 8.9h31.8c5.4 0 10.2-3.6 11.6-8.9l74.4-276c0.3-1 0.4-2.1 0.4-3.1 0-6.6-5.4-12-12-12H647c-5.6 0-10.4 3.9-11.7 9.3l-45.8 199.1-49.8-199.3c-1.3-5.4-6.1-9.1-11.6-9.1z\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M14 11a3 3 0 0 1-3-3V4H7a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-8zm-2-3a2 2 0 0 0 2 2h3.59L12 4.41zM7 3h5l7 7v9a3 3 0 0 1-3 3H7a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3\"\n />\n </svg>\n )}\n </div>\n );\n }\n);\n","export type SubmitProps = {\n needClasses?: string;\n title: string;\n className?: string;\n rawHtml?: string;\n spinner?: React.ReactNode;\n submitting?: boolean;\n disabled?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nexport const Submit: React.FC<SubmitProps> = (props) => {\n const {\n title = \"Send Message\",\n className,\n spinner,\n submitting,\n disabled,\n onClick,\n rawHtml,\n needClasses,\n ...rest\n } = props;\n return (\n <>\n <button\n type=\"button\"\n className={className}\n disabled={disabled ?? submitting}\n onClick={onClick}\n {...rest}\n >\n {submitting && spinner}\n {rawHtml ? (\n <div\n style={{ display: \"contents\" }}\n dangerouslySetInnerHTML={{ __html: rawHtml }}\n />\n ) : (\n title\n )}\n </button>\n <span className=\"fixed -z-10 top-0 left-0 w-0 h-0 overflow-hidden opacity-0 pointer-events-none\">\n <span className={needClasses}></span>\n </span>\n </>\n );\n};\n","/**\n * 简单的加密函数,用于生成防机器人的加密字段\n * @param value 需要加密的值\n * @returns 加密后的字符串\n */\nexport const encrypt = (value: string, formSalt: string): string => {\n // 获取当前时间戳,精确到分钟级别(防止频繁变化)\n const timestamp = Math.floor(Date.now() / (60 * 1000));\n\n // 将时间戳与盐值和输入值组合\n const dataToEncrypt = `${formSalt}:${timestamp}:${value}`;\n\n // 使用简单的哈希算法\n let hash = 0;\n for (let i = 0; i < dataToEncrypt.length; i++) {\n const char = dataToEncrypt.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // 转换为32位整数\n }\n\n // 转换为16进制字符串并添加时间戳信息\n return `${hash.toString(16)}_${timestamp}`;\n};\n\n/**\n * 验证加密字段是否有效\n * @param encryptedValue 加密后的字符串\n * @param originalValue 原始值(如蜜罐字段的值)\n * @param maxAgeMinutes 最大有效时间(分钟)\n * @returns 是否有效\n */\nexport const verifyEncryption = (\n formSalt: string,\n encryptedValue: string = \"\",\n originalValue: string = \"\",\n maxAgeMinutes: number = 30\n): boolean => {\n // 解析加密值\n const parts = encryptedValue.split(\"_\");\n if (parts.length !== 2) {\n return false; // 格式不正确\n }\n\n const [hashString, timestampString] = parts;\n const timestamp = parseInt(timestampString, 10);\n\n // 验证时间戳是否在有效期内\n const currentTimestamp = Math.floor(Date.now() / (60 * 1000));\n if (isNaN(timestamp) || currentTimestamp - timestamp > maxAgeMinutes) {\n return false; // 时间戳无效或已过期\n }\n\n // 重新计算哈希值\n const dataToEncrypt = `${formSalt}:${timestamp}:${originalValue}`;\n let hash = 0;\n for (let i = 0; i < dataToEncrypt.length; i++) {\n const char = dataToEncrypt.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n // 比较哈希值\n return hashString === hash.toString(16);\n};\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * 计算内联标签布局所需的 paddingLeft(= label 宽度 + 额外间距)\n * - 返回 labelRef 供 <label ref={labelRef} /> 绑定\n * - 返回 paddingLeft 用于内层输入/容器 style\n */\nexport function useInlineLabelPadding(extraSpace: number = 16) {\n const labelRef = useRef<HTMLLabelElement>(null);\n const [paddingLeft, setPaddingLeft] = useState<string>(\"3.5rem\");\n\n useEffect(() => {\n const labelEl = labelRef.current;\n if (!labelEl) return;\n\n let rafId = 0;\n const measure = () => {\n const width = labelEl.getBoundingClientRect().width;\n setPaddingLeft(`${width + extraSpace}px`);\n };\n\n measure();\n rafId = requestAnimationFrame(measure);\n\n if (typeof ResizeObserver === \"undefined\") {\n return () => {\n cancelAnimationFrame(rafId);\n };\n }\n\n const ro = new ResizeObserver(() => {\n measure();\n });\n ro.observe(labelEl);\n\n return () => {\n cancelAnimationFrame(rafId);\n ro.disconnect();\n };\n }, [extraSpace]);\n\n return { labelRef, paddingLeft } as const;\n}\n","import clsx from \"clsx\";\nimport { forwardRef, useRef, useState } from \"react\";\nimport { useInlineLabelPadding } from \"./hooks/useInlineLabelPadding\";\n\n/**\n * Simple encryption function for generating anti-bot encrypted fields\n */\nconst generateEncryption = (formSalt: string, value: string): string => {\n const timestamp = Math.floor(Date.now() / (60 * 1000));\n const dataToEncrypt = `${formSalt}:${timestamp}:${value}`;\n\n let hash = 0;\n for (let i = 0; i < dataToEncrypt.length; i++) {\n const char = dataToEncrypt.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return `${hash.toString(16)}_${timestamp}`;\n};\n\nexport type UploadedFile = {\n id: string;\n name: string;\n size: number;\n url: string; // OSS public URL\n};\n\nexport type FileUploadProps = {\n label: string;\n name: string;\n required?: boolean;\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n accept?: string;\n onChange?: (fileInfo: UploadedFile | null) => void;\n onUploadStateChange?: (isUploading: boolean) => void;\n error?: string;\n placeholder?: string;\n uploadingText?: string;\n selectedText?: string;\n formSalt?: string; // 加密盐\n maxSize?: number; // 最大文件大小(字节),默认 5MB\n};\n\nexport const FileUpload2 = forwardRef<HTMLInputElement, FileUploadProps>(\n (props, ref) => {\n const {\n label,\n name,\n required,\n className,\n labelClassName,\n inputClassName,\n accept = \"*/*\",\n onChange,\n onUploadStateChange,\n error,\n placeholder = \"Click to select file\",\n uploadingText = \"Uploading...\",\n selectedText = \"Selected: {name}\",\n formSalt = \"default-salt\",\n maxSize = 5 * 1024 * 1024,\n ...rest\n } = props;\n\n const [uploadedFile, setUploadedFile] = useState<UploadedFile | null>(null);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadError, setUploadError] = useState<string>(\"\");\n const fileInputRef = useRef<HTMLInputElement>(null);\n const { labelRef, paddingLeft } = useInlineLabelPadding(16);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Upload single file\n const uploadFile = async (\n file: File,\n signal: AbortSignal\n ): Promise<UploadedFile> => {\n // Validate file size\n if (file.size > maxSize) {\n throw new Error(\n `File ${file.name} exceeds maximum size limit of ${\n maxSize / 1024 / 1024\n }MB`\n );\n }\n\n // Generate encrypted field with honeypot value\n const honeypot = \"\";\n const encryptedField = generateEncryption(formSalt, honeypot);\n\n // 1. Get upload credentials\n const credentialsResponse = await fetch(\"/api/get-upload-credentials\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n fileName: file.name,\n fileSize: file.size,\n fileType: file.type,\n mediaType: \"document\", // Request document type credentials (usually R2)\n encryptedField,\n honeypot,\n }),\n signal,\n });\n\n if (!credentialsResponse.ok) {\n const errorData = await credentialsResponse.json();\n throw new Error(\n errorData.message || \"Failed to get upload credentials\"\n );\n }\n\n const credentialsData = await credentialsResponse.json();\n\n if (!credentialsData.success) {\n throw new Error(\n credentialsData.message || \"Failed to get upload credentials\"\n );\n }\n\n // Extract upload information from response\n const { credentials, mediaType } = credentialsData;\n const uploadUrl = credentials?.uploadUrl;\n const platform = credentials?.platform;\n\n if (!uploadUrl) {\n throw new Error(\"Failed to get upload URL\");\n }\n\n // 2. Upload to cloud storage\n\n let uploadResponse: Response;\n\n // Use different upload methods based on platform type\n if (platform === \"cloudflare_images\") {\n // Cloudflare Images uses FormData + POST\n const formData = new FormData();\n formData.append(\"file\", file);\n\n uploadResponse = await fetch(uploadUrl, {\n method: \"POST\",\n body: formData,\n signal,\n });\n } else {\n // Other platforms use PUT (e.g., pre-signed URLs)\n uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": file.type,\n },\n body: file,\n signal,\n });\n }\n\n if (!uploadResponse.ok) {\n throw new Error(\n `File upload failed: ${uploadResponse.status} ${uploadResponse.statusText}`\n );\n }\n\n // Get resource identifier after upload\n let resourceId: string;\n let publicUrl: string;\n\n if (platform === \"cloudflare_images\") {\n // Cloudflare Images returns JSON, extract result.id\n const uploadResult = await uploadResponse.json();\n resourceId = uploadResult?.result?.id || uploadUrl;\n // Construct Cloudflare Images public URL\n // Format: https://imagedelivery.net/{account_hash}/{image_id}/public\n const accountHash = uploadUrl.split(\"/\")[3]; // Extract from upload URL\n publicUrl = `https://imagedelivery.net/${accountHash}/${resourceId}/public`;\n } else if (platform === \"cloudflare_r2\") {\n // Cloudflare R2: uploadUrl is already the public URL (pre-signed or public bucket URL)\n resourceId = uploadUrl.split(\"/\").pop() || uploadUrl; // Extract filename from URL\n publicUrl = uploadUrl; // Use the upload URL as public URL\n } else {\n // Other platforms use uploadUrl as resource identifier\n resourceId = uploadUrl;\n publicUrl = uploadUrl;\n }\n\n // 3. Insert Media object into database\n const mediaPayload = {\n name: file.name,\n size: file.size,\n mimeType: file.type,\n mediaType,\n resourceUrl: resourceId,\n storageType: platform || \"cloudflare_images\",\n encryptedField,\n honeypot,\n };\n\n const createMediaResponse = await fetch(\"/api/create-media\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(mediaPayload),\n signal,\n });\n\n if (!createMediaResponse.ok) {\n const errorData = await createMediaResponse.json();\n throw new Error(errorData.message || \"Failed to create Media object\");\n }\n\n const mediaData = await createMediaResponse.json();\n\n if (!mediaData.success) {\n throw new Error(mediaData.message || \"Failed to create Media object\");\n }\n\n // Return uploaded file information\n return {\n id: mediaData.mediaId,\n name: file.name,\n size: file.size,\n url: publicUrl, // Use public URL instead of resource ID\n };\n };\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n\n if (!files || files.length === 0) return;\n\n const file = files[0]; // Only take the first file\n\n // Create new AbortController\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setIsUploading(true);\n onUploadStateChange?.(true); // 通知父组件开始上传\n setUploadError(\"\");\n\n try {\n // Validate file size\n if (file.size > maxSize) {\n throw new Error(\n `File ${file.name} exceeds ${maxSize / 1024 / 1024}MB limit`\n );\n }\n\n // Upload file\n const uploadedFileData = await uploadFile(file, abortController.signal);\n setUploadedFile(uploadedFileData);\n onChange?.(uploadedFileData); // Pass complete file info\n } catch (error) {\n // Don't show error if user cancelled\n if (error instanceof Error && error.name === \"AbortError\") {\n console.log(\"User cancelled upload\");\n } else {\n console.error(\"File upload failed:\", error);\n setUploadError(\n error instanceof Error ? error.message : \"File upload failed\"\n );\n }\n } finally {\n setIsUploading(false);\n onUploadStateChange?.(false); // 通知父组件上传结束\n abortControllerRef.current = null;\n // Clear input to allow re-selecting the same file\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n }\n };\n\n const handleClick = () => {\n // Don't allow selection if uploading or file already exists\n if (isUploading || uploadedFile) return;\n fileInputRef.current?.click();\n };\n\n const handleRemoveFile = (e: React.MouseEvent) => {\n e.stopPropagation();\n setUploadedFile(null);\n onChange?.(null); // Pass null when file is removed\n setUploadError(\"\");\n };\n\n const handleCancelUpload = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n\n const getDisplayText = () => {\n if (isUploading) return uploadingText;\n if (uploadedFile) {\n return selectedText.replace(\"{name}\", uploadedFile.name);\n }\n return placeholder;\n };\n\n return (\n <div\n ref={ref}\n className={clsx(\"relative w-full\", className)}\n {...rest}\n >\n <label\n ref={labelRef}\n htmlFor={name}\n className={clsx(\n \"absolute left-3 top-1/2 -translate-y-1/2 mt-1 opacity-70 text-sm pointer-events-none whitespace-nowrap z-10\",\n labelClassName\n )}\n >\n {label}\n </label>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n id={name}\n name={name}\n required={required}\n accept={accept}\n onChange={handleFileChange}\n disabled={!!uploadedFile}\n className=\"hidden\"\n />\n\n {/* Simulated input box upload area */}\n <div\n onClick={handleClick}\n className={clsx(\n \"w-full pr-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-300 bg-transparent transition-colors duration-200 flex items-center justify-start min-h-[2.5rem]\",\n isUploading || uploadedFile\n ? \"cursor-not-allowed opacity-75\"\n : \"cursor-pointer hover:bg-white\",\n inputClassName\n )}\n style={{ paddingLeft }}\n >\n <span\n className={clsx(\n \"pl-6 text-sm font-medium flex-1 mr-4\",\n uploadedFile ? \"text-gray-900\" : \"text-gray-600\"\n )}\n >\n {getDisplayText()}\n </span>\n {isUploading ? (\n <button\n type=\"button\"\n onClick={handleCancelUpload}\n className=\"ml-2 p-1 hover:bg-gray-100 rounded-full transition-colors flex-shrink-0 flex items-center gap-1\"\n title=\"Cancel upload\"\n >\n <div className=\"animate-spin rounded-full h-4 w-4 border-t-2 border-b-2 border-primary-500\" />\n <svg\n className=\"w-3 h-3 text-gray-500\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n ) : uploadedFile ? (\n <button\n type=\"button\"\n onClick={handleRemoveFile}\n className=\"ml-2 p-1 hover:bg-red-100 rounded-full transition-colors flex-shrink-0\"\n title=\"Delete file\"\n >\n <svg\n className=\"w-4 h-4 text-red-500\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n ) : (\n <svg\n className=\"w-5 h-5 text-gray-400 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n )}\n </div>\n\n {/* Display error message */}\n {(error || uploadError) && (\n <p className=\"text-red-500 mt-1 text-sm\">{error || uploadError}</p>\n )}\n </div>\n );\n }\n);\n","import { forwardRef } from \"react\";\nimport { FieldConfig } from \"./types\";\n\nexport type InputProps = Omit<FieldConfig, \"feildStyle\"> & {\n requiredClassName?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n error?: string;\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const {\n label,\n name,\n required,\n requiredClassName,\n labelClassName,\n inputClassName,\n type,\n autoFocus,\n value,\n onChange,\n error,\n ...rest\n } = props;\n\n return (\n <div {...rest}>\n <label htmlFor={name} className={labelClassName}>\n {label}\n {required ? <span className={requiredClassName}>*</span> : \"\"}\n </label>\n <input\n ref={ref}\n type={type || \"text\"}\n id={name}\n name={name}\n required={required}\n className={inputClassName}\n autoComplete={name}\n autoFocus={autoFocus}\n value={value}\n onChange={onChange}\n />\n {error && <p className=\"text-red-500 mt-1\">{error}</p>}\n </div>\n );\n});\n","import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { InputProps } from \"./Input\";\nimport { useInlineLabelPadding } from \"./hooks/useInlineLabelPadding\";\n\nexport const Input2 = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const {\n label,\n name,\n required,\n requiredClassName,\n className,\n labelClassName,\n inputClassName,\n type = \"text\",\n autoFocus,\n value,\n placeholder,\n onChange,\n error,\n ...rest\n } = props;\n\n const { labelRef, paddingLeft } = useInlineLabelPadding(16);\n\n return (\n <div className={clsx(\"relative w-full\", className)} {...rest}>\n <label\n ref={labelRef}\n htmlFor={name}\n className={clsx(\n \"absolute left-3 top-1/2 -translate-y-1/2 mt-1 opacity-70 text-sm pointer-events-none whitespace-nowrap\",\n labelClassName\n )}\n >\n {label}\n {required ? <span className={requiredClassName}>*</span> : \"\"}\n </label>\n <input\n ref={ref}\n type={type}\n id={name}\n name={name}\n required={required}\n placeholder={placeholder}\n className={clsx(\n \"w-full pr-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-300 bg-transparent focus:bg-white transition-colors duration-200\",\n inputClassName\n )}\n style={{ paddingLeft }}\n autoComplete={name}\n autoFocus={autoFocus}\n value={value}\n onChange={onChange}\n />\n {error && <p className=\"text-red-500 mt-1 text-sm\">{error}</p>}\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport { FieldConfig } from \"./types\";\n\nexport type TextareaProps = Omit<FieldConfig, \"feildStyle\"> & {\n requiredClassName?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n error?: string;\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (props, ref) => {\n const {\n label,\n name,\n required,\n requiredClassName,\n labelClassName,\n inputClassName,\n rows = 8,\n value,\n onChange,\n error,\n ...rest\n } = props;\n\n return (\n <div {...rest}>\n <label htmlFor={name} className={labelClassName}>\n {label}\n {required ? <span className={requiredClassName}>*</span> : \"\"}\n </label>\n <textarea\n ref={ref}\n id={name}\n name={name}\n required={required}\n className={inputClassName}\n rows={rows}\n value={value}\n onChange={onChange}\n autoComplete={name}\n />\n {error && <p className=\"text-red-500 mt-1\">{error}</p>}\n </div>\n );\n }\n);\n","import { forwardRef, useRef, useEffect, useState } from \"react\";\nimport { TextareaProps } from \"./Textarea\";\n\nexport const Textarea2 = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (props, ref) => {\n const {\n label,\n name,\n required,\n requiredClassName,\n labelClassName,\n inputClassName,\n className,\n rows = 6,\n value,\n onChange,\n error,\n ...rest\n } = props;\n\n const [paddingTop, setPaddingTop] = useState(\"2.5rem\");\n const labelRef = useRef<HTMLLabelElement>(null);\n\n useEffect(() => {\n const labelEl = labelRef.current;\n if (!labelEl) return;\n\n let rafId = 0;\n const measure = () => {\n const height = labelEl.getBoundingClientRect().height;\n setPaddingTop(`${height + 12}px`);\n };\n\n measure();\n rafId = requestAnimationFrame(measure);\n\n if (typeof ResizeObserver === \"undefined\") {\n return () => {\n cancelAnimationFrame(rafId);\n };\n }\n\n const ro = new ResizeObserver(() => {\n measure();\n });\n ro.observe(labelEl);\n\n return () => {\n cancelAnimationFrame(rafId);\n ro.disconnect();\n };\n }, [label]);\n\n return (\n <div className={className} {...rest}>\n <div className=\"relative w-full\">\n <label\n ref={labelRef}\n htmlFor={name}\n className={`absolute left-3 top-2 opacity-70 text-sm pointer-events-none ${\n labelClassName || \"\"\n }`}\n >\n {label}\n {required ? <span className={requiredClassName}>*</span> : \"\"}\n </label>\n <textarea\n ref={ref}\n id={name}\n name={name}\n required={required}\n rows={rows}\n value={value}\n onChange={onChange}\n autoComplete={name}\n style={{ paddingTop }}\n className={`w-full px-3 pb-2 border border-gray-300 rounded-md shadow-sm focus:outline-none \n focus:ring-2 focus:ring-primary-300 focus:border-transparent resize-y bg-transparent focus:bg-white transition-colors duration-200 ${\n inputClassName || \"\"\n }`}\n />\n </div>\n {error && <p className=\"text-red-500 mt-1 text-sm\">{error}</p>}\n </div>\n );\n }\n);\n\nTextarea2.displayName = \"Textarea2\";\n","export type CountryDial = {\n code: string; // ISO 3166-1 alpha-2\n name: string; // English name\n region?: string; // Continent/region label\n dialCode: string; // +NN\n};\n\n// Note: Names follow common English naming used in international forms.\n// Region is a coarse grouping for search hints.\nexport const countries: CountryDial[] = [\n { code: \"AF\", name: \"Afghanistan\", region: \"Asia\", dialCode: \"+93\" },\n { code: \"AL\", name: \"Albania\", region: \"Europe\", dialCode: \"+355\" },\n { code: \"DZ\", name: \"Algeria\", region: \"Africa\", dialCode: \"+213\" },\n { code: \"AS\", name: \"American Samoa\", region: \"Oceania\", dialCode: \"+1\" },\n { code: \"AD\", name: \"Andorra\", region: \"Europe\", dialCode: \"+376\" },\n { code: \"AO\", name: \"Angola\", region: \"Africa\", dialCode: \"+244\" },\n { code: \"AI\", name: \"Anguilla\", region: \"North America\", dialCode: \"+1\" },\n { code: \"AG\", name: \"Antigua and Barbuda\", region: \"North America\", dialCode: \"+1\" },\n { code: \"AR\", name: \"Argentina\", region: \"South America\", dialCode: \"+54\" },\n { code: \"AM\", name: \"Armenia\", region: \"Asia\", dialCode: \"+374\" },\n { code: \"AW\", name: \"Aruba\", region: \"North America\", dialCode: \"+297\" },\n { code: \"AU\", name: \"Australia\", region: \"Oceania\", dialCode: \"+61\" },\n { code: \"AT\", name: \"Austria\", region: \"Europe\", dialCode: \"+43\" },\n { code: \"AZ\", name: \"Azerbaijan\", region: \"Asia\", dialCode: \"+994\" },\n { code: \"BS\", name: \"Bahamas\", region: \"North America\", dialCode: \"+1\" },\n { code: \"BH\", name: \"Bahrain\", region: \"Asia\", dialCode: \"+973\" },\n { code: \"BD\", name: \"Bangladesh\", region: \"Asia\", dialCode: \"+880\" },\n { code: \"BB\", name: \"Barbados\", region: \"North America\", dialCode: \"+1\" },\n { code: \"BY\", name: \"Belarus\", region: \"Europe\", dialCode: \"+375\" },\n { code: \"BE\", name: \"Belgium\", region: \"Europe\", dialCode: \"+32\" },\n { code: \"BZ\", name: \"Belize\", region: \"North America\", dialCode: \"+501\" },\n { code: \"BJ\", name: \"Benin\", region: \"Africa\", dialCode: \"+229\" },\n { code: \"BM\", name: \"Bermuda\", region: \"North America\", dialCode: \"+1\" },\n { code: \"BT\", name: \"Bhutan\", region: \"Asia\", dialCode: \"+975\" },\n { code: \"BO\", name: \"Bolivia\", region: \"South America\", dialCode: \"+591\" },\n { code: \"BA\", name: \"Bosnia and Herzegovina\", region: \"Europe\", dialCode: \"+387\" },\n { code: \"BW\", name: \"Botswana\", region: \"Africa\", dialCode: \"+267\" },\n { code: \"BR\", name: \"Brazil\", region: \"South America\", dialCode: \"+55\" },\n { code: \"VG\", name: \"British Virgin Islands\", region: \"North America\", dialCode: \"+1\" },\n { code: \"BN\", name: \"Brunei\", region: \"Asia\", dialCode: \"+673\" },\n { code: \"BG\", name: \"Bulgaria\", region: \"Europe\", dialCode: \"+359\" },\n { code: \"BF\", name: \"Burkina Faso\", region: \"Africa\", dialCode: \"+226\" },\n { code: \"BI\", name: \"Burundi\", region: \"Africa\", dialCode: \"+257\" },\n { code: \"KH\", name: \"Cambodia\", region: \"Asia\", dialCode: \"+855\" },\n { code: \"CM\", name: \"Cameroon\", region: \"Africa\", dialCode: \"+237\" },\n { code: \"CA\", name: \"Canada\", region: \"North America\", dialCode: \"+1\" },\n { code: \"CV\", name: \"Cape Verde\", region: \"Africa\", dialCode: \"+238\" },\n { code: \"KY\", name: \"Cayman Islands\", region: \"North America\", dialCode: \"+1\" },\n { code: \"CF\", name: \"Central African Republic\", region: \"Africa\", dialCode: \"+236\" },\n { code: \"TD\", name: \"Chad\", region: \"Africa\", dialCode: \"+235\" },\n { code: \"CL\", name: \"Chile\", region: \"South America\", dialCode: \"+56\" },\n { code: \"CN\", name: \"China\", region: \"Asia\", dialCode: \"+86\" },\n { code: \"HK\", name: \"Hong Kong, China\", region: \"Asia\", dialCode: \"+852\" },\n { code: \"MO\", name: \"Macao, China\", region: \"Asia\", dialCode: \"+853\" },\n { code: \"TW\", name: \"Taiwan, China\", region: \"Asia\", dialCode: \"+886\" },\n { code: \"CO\", name: \"Colombia\", region: \"South America\", dialCode: \"+57\" },\n { code: \"KM\", name: \"Comoros\", region: \"Africa\", dialCode: \"+269\" },\n { code: \"CG\", name: \"Congo\", region: \"Africa\", dialCode: \"+242\" },\n { code: \"CD\", name: \"Congo (DRC)\", region: \"Africa\", dialCode: \"+243\" },\n { code: \"CR\", name: \"Costa Rica\", region: \"North America\", dialCode: \"+506\" },\n { code: \"CI\", name: \"Côte d’Ivoire\", region: \"Africa\", dialCode: \"+225\" },\n { code: \"HR\", name: \"Croatia\", region: \"Europe\", dialCode: \"+385\" },\n { code: \"CU\", name: \"Cuba\", region: \"North America\", dialCode: \"+53\" },\n { code: \"CY\", name: \"Cyprus\", region: \"Europe\", dialCode: \"+357\" },\n { code: \"CZ\", name: \"Czechia\", region: \"Europe\", dialCode: \"+420\" },\n { code: \"DK\", name: \"Denmark\", region: \"Europe\", dialCode: \"+45\" },\n { code: \"DJ\", name: \"Djibouti\", region: \"Africa\", dialCode: \"+253\" },\n { code: \"DM\", name: \"Dominica\", region: \"North America\", dialCode: \"+1\" },\n { code: \"DO\", name: \"Dominican Republic\", region: \"North America\", dialCode: \"+1\" },\n { code: \"EC\", name: \"Ecuador\", region: \"South America\", dialCode: \"+593\" },\n { code: \"EG\", name: \"Egypt\", region: \"Africa\", dialCode: \"+20\" },\n { code: \"SV\", name: \"El Salvador\", region: \"North America\", dialCode: \"+503\" },\n { code: \"GQ\", name: \"Equatorial Guinea\", region: \"Africa\", dialCode: \"+240\" },\n { code: \"ER\", name: \"Eritrea\", region: \"Africa\", dialCode: \"+291\" },\n { code: \"EE\", name: \"Estonia\", region: \"Europe\", dialCode: \"+372\" },\n { code: \"SZ\", name: \"Eswatini\", region: \"Africa\", dialCode: \"+268\" },\n { code: \"ET\", name: \"Ethiopia\", region: \"Africa\", dialCode: \"+251\" },\n { code: \"FO\", name: \"Faroe Islands\", region: \"Europe\", dialCode: \"+298\" },\n { code: \"FJ\", name: \"Fiji\", region: \"Oceania\", dialCode: \"+679\" },\n { code: \"FI\", name: \"Finland\", region: \"Europe\", dialCode: \"+358\" },\n { code: \"FR\", name: \"France\", region: \"Europe\", dialCode: \"+33\" },\n { code: \"GF\", name: \"French Guiana\", region: \"South America\", dialCode: \"+594\" },\n { code: \"PF\", name: \"French Polynesia\", region: \"Oceania\", dialCode: \"+689\" },\n { code: \"GA\", name: \"Gabon\", region: \"Africa\", dialCode: \"+241\" },\n { code: \"GM\", name: \"Gambia\", region: \"Africa\", dialCode: \"+220\" },\n { code: \"GE\", name: \"Georgia\", region: \"Asia\", dialCode: \"+995\" },\n { code: \"DE\", name: \"Germany\", region: \"Europe\", dialCode: \"+49\" },\n { code: \"GH\", name: \"Ghana\", region: \"Africa\", dialCode: \"+233\" },\n { code: \"GI\", name: \"Gibraltar\", region: \"Europe\", dialCode: \"+350\" },\n { code: \"GR\", name: \"Greece\", region: \"Europe\", dialCode: \"+30\" },\n { code: \"GL\", name: \"Greenland\", region: \"North America\", dialCode: \"+299\" },\n { code: \"GD\", name: \"Grenada\", region: \"North America\", dialCode: \"+1\" },\n { code: \"GP\", name: \"Guadeloupe\", region: \"North America\", dialCode: \"+590\" },\n { code: \"GU\", name: \"Guam\", region: \"Oceania\", dialCode: \"+1\" },\n { code: \"GT\", name: \"Guatemala\", region: \"North America\", dialCode: \"+502\" },\n { code: \"GG\", name: \"Guernsey\", region: \"Europe\", dialCode: \"+44\" },\n { code: \"GN\", name: \"Guinea\", region: \"Africa\", dialCode: \"+224\" },\n { code: \"GW\", name: \"Guinea-Bissau\", region: \"Africa\", dialCode: \"+245\" },\n { code: \"GY\", name: \"Guyana\", region: \"South America\", dialCode: \"+592\" },\n { code: \"HT\", name: \"Haiti\", region: \"North America\", dialCode: \"+509\" },\n { code: \"HN\", name: \"Honduras\", region: \"North America\", dialCode: \"+504\" },\n { code: \"HU\", name: \"Hungary\", region: \"Europe\", dialCode: \"+36\" },\n { code: \"IS\", name: \"Iceland\", region: \"Europe\", dialCode: \"+354\" },\n { code: \"IN\", name: \"India\", region: \"Asia\", dialCode: \"+91\" },\n { code: \"ID\", name: \"Indonesia\", region: \"Asia\", dialCode: \"+62\" },\n { code: \"IR\", name: \"Iran\", region: \"Asia\", dialCode: \"+98\" },\n { code: \"IQ\", name: \"Iraq\", region: \"Asia\", dialCode: \"+964\" },\n { code: \"IE\", name: \"Ireland\", region: \"Europe\", dialCode: \"+353\" },\n { code: \"IM\", name: \"Isle of Man\", region: \"Europe\", dialCode: \"+44\" },\n { code: \"IL\", name: \"Israel\", region: \"Asia\", dialCode: \"+972\" },\n { code: \"IT\", name: \"Italy\", region: \"Europe\", dialCode: \"+39\" },\n { code: \"JM\", name: \"Jamaica\", region: \"North America\", dialCode: \"+1\" },\n { code: \"JP\", name: \"Japan\", region: \"Asia\", dialCode: \"+81\" },\n { code: \"JE\", name: \"Jersey\", region: \"Europe\", dialCode: \"+44\" },\n { code: \"JO\", name: \"Jordan\", region: \"Asia\", dialCode: \"+962\" },\n { code: \"KZ\", name: \"Kazakhstan\", region: \"Asia\", dialCode: \"+7\" },\n { code: \"KE\", name: \"Kenya\", region: \"Africa\", dialCode: \"+254\" },\n { code: \"KI\", name: \"Kiribati\", region: \"Oceania\", dialCode: \"+686\" },\n { code: \"XK\", name: \"Kosovo\", region: \"Europe\", dialCode: \"+383\" },\n { code: \"KW\", name: \"Kuwait\", region: \"Asia\", dialCode: \"+965\" },\n { code: \"KG\", name: \"Kyrgyzstan\", region: \"Asia\", dialCode: \"+996\" },\n { code: \"LA\", name: \"Laos\", region: \"Asia\", dialCode: \"+856\" },\n { code: \"LV\", name: \"Latvia\", region: \"Europe\", dialCode: \"+371\" },\n { code: \"LB\", name: \"Lebanon\", region: \"Asia\", dialCode: \"+961\" },\n { code: \"LS\", name: \"Lesotho\", region: \"Africa\", dialCode: \"+266\" },\n { code: \"LR\", name: \"Liberia\", region: \"Africa\", dialCode: \"+231\" },\n { code: \"LY\", name: \"Libya\", region: \"Africa\", dialCode: \"+218\" },\n { code: \"LI\", name: \"Liechtenstein\", region: \"Europe\", dialCode: \"+423\" },\n { code: \"LT\", name: \"Lithuania\", region: \"Europe\", dialCode: \"+370\" },\n { code: \"LU\", name: \"Luxembourg\", region: \"Europe\", dialCode: \"+352\" },\n { code: \"MG\", name: \"Madagascar\", region: \"Africa\", dialCode: \"+261\" },\n { code: \"MW\", name: \"Malawi\", region: \"Africa\", dialCode: \"+265\" },\n { code: \"MY\", name: \"Malaysia\", region: \"Asia\", dialCode: \"+60\" },\n { code: \"MV\", name: \"Maldives\", region: \"Asia\", dialCode: \"+960\" },\n { code: \"ML\", name: \"Mali\", region: \"Africa\", dialCode: \"+223\" },\n { code: \"MT\", name: \"Malta\", region: \"Europe\", dialCode: \"+356\" },\n { code: \"MH\", name: \"Marshall Islands\", region: \"Oceania\", dialCode: \"+692\" },\n { code: \"MQ\", name: \"Martinique\", region: \"North America\", dialCode: \"+596\" },\n { code: \"MR\", name: \"Mauritania\", region: \"Africa\", dialCode: \"+222\" },\n { code: \"MU\", name: \"Mauritius\", region: \"Africa\", dialCode: \"+230\" },\n { code: \"YT\", name: \"Mayotte\", region: \"Africa\", dialCode: \"+262\" },\n { code: \"MX\", name: \"Mexico\", region: \"North America\", dialCode: \"+52\" },\n { code: \"FM\", name: \"Micronesia\", region: \"Oceania\", dialCode: \"+691\" },\n { code: \"MD\", name: \"Moldova\", region: \"Europe\", dialCode: \"+373\" },\n { code: \"MC\", name: \"Monaco\", region: \"Europe\", dialCode: \"+377\" },\n { code: \"MN\", name: \"Mongolia\", region: \"Asia\", dialCode: \"+976\" },\n { code: \"ME\", name: \"Montenegro\", region: \"Europe\", dialCode: \"+382\" },\n { code: \"MS\", name: \"Montserrat\", region: \"North America\", dialCode: \"+1\" },\n { code: \"MA\", name: \"Morocco\", region: \"Africa\", dialCode: \"+212\" },\n { code: \"MZ\", name: \"Mozambique\", region: \"Africa\", dialCode: \"+258\" },\n { code: \"MM\", name: \"Myanmar\", region: \"Asia\", dialCode: \"+95\" },\n { code: \"NA\", name: \"Namibia\", region: \"Africa\", dialCode: \"+264\" },\n { code: \"NR\", name: \"Nauru\", region: \"Oceania\", dialCode: \"+674\" },\n { code: \"NP\", name: \"Nepal\", region: \"Asia\", dialCode: \"+977\" },\n { code: \"NL\", name: \"Netherlands\", region: \"Europe\", dialCode: \"+31\" },\n { code: \"NC\", name: \"New Caledonia\", region: \"Oceania\", dialCode: \"+687\" },\n { code: \"NZ\", name: \"New Zealand\", region: \"Oceania\", dialCode: \"+64\" },\n { code: \"NI\", name: \"Nicaragua\", region: \"North America\", dialCode: \"+505\" },\n { code: \"NE\", name: \"Niger\", region: \"Africa\", dialCode: \"+227\" },\n { code: \"NG\", name: \"Nigeria\", region: \"Africa\", dialCode: \"+234\" },\n { code: \"NU\", name: \"Niue\", region: \"Oceania\", dialCode: \"+683\" },\n { code: \"NF\", name: \"Norfolk Island\", region: \"Oceania\", dialCode: \"+672\" },\n { code: \"KP\", name: \"North Korea\", region: \"Asia\", dialCode: \"+850\" },\n { code: \"MK\", name: \"North Macedonia\", region: \"Europe\", dialCode: \"+389\" },\n { code: \"MP\", name: \"Northern Mariana Islands\", region: \"Oceania\", dialCode: \"+1\" },\n { code: \"NO\", name: \"Norway\", region: \"Europe\", dialCode: \"+47\" },\n { code: \"OM\", name: \"Oman\", region: \"Asia\", dialCode: \"+968\" },\n { code: \"PK\", name: \"Pakistan\", region: \"Asia\", dialCode: \"+92\" },\n { code: \"PW\", name: \"Palau\", region: \"Oceania\", dialCode: \"+680\" },\n { code: \"PS\", name: \"Palestine\", region: \"Asia\", dialCode: \"+970\" },\n { code: \"PA\", name: \"Panama\", region: \"North America\", dialCode: \"+507\" },\n { code: \"PG\", name: \"Papua New Guinea\", region: \"Oceania\", dialCode: \"+675\" },\n { code: \"PY\", name: \"Paraguay\", region: \"South America\", dialCode: \"+595\" },\n { code: \"PE\", name: \"Peru\", region: \"South America\", dialCode: \"+51\" },\n { code: \"PH\", name: \"Philippines\", region: \"Asia\", dialCode: \"+63\" },\n { code: \"PL\", name: \"Poland\", region: \"Europe\", dialCode: \"+48\" },\n { code: \"PT\", name: \"Portugal\", region: \"Europe\", dialCode: \"+351\" },\n { code: \"PR\", name: \"Puerto Rico\", region: \"North America\", dialCode: \"+1\" },\n { code: \"QA\", name: \"Qatar\", region: \"Asia\", dialCode: \"+974\" },\n { code: \"RE\", name: \"Réunion\", region: \"Africa\", dialCode: \"+262\" },\n { code: \"RO\", name: \"Romania\", region: \"Europe\", dialCode: \"+40\" },\n { code: \"RU\", name: \"Russia\", region: \"Europe\", dialCode: \"+7\" },\n { code: \"RW\", name: \"Rwanda\", region: \"Africa\", dialCode: \"+250\" },\n { code: \"BL\", name: \"Saint Barthélemy\", region: \"North America\", dialCode: \"+590\" },\n { code: \"KN\", name: \"Saint Kitts and Nevis\", region: \"North America\", dialCode: \"+1\" },\n { code: \"LC\", name: \"Saint Lucia\", region: \"North America\", dialCode: \"+1\" },\n { code: \"MF\", name: \"Saint Martin\", region: \"North America\", dialCode: \"+590\" },\n { code: \"PM\", name: \"Saint Pierre and Miquelon\", region: \"North America\", dialCode: \"+508\" },\n { code: \"VC\", name: \"Saint Vincent and the Grenadines\", region: \"North America\", dialCode: \"+1\" },\n { code: \"WS\", name: \"Samoa\", region: \"Oceania\", dialCode: \"+685\" },\n { code: \"SM\", name: \"San Marino\", region: \"Europe\", dialCode: \"+378\" },\n { code: \"ST\", name: \"São Tomé and Príncipe\", region: \"Africa\", dialCode: \"+239\" },\n { code: \"SA\", name: \"Saudi Arabia\", region: \"Asia\", dialCode: \"+966\" },\n { code: \"SN\", name: \"Senegal\", region: \"Africa\", dialCode: \"+221\" },\n { code: \"RS\", name: \"Serbia\", region: \"Europe\", dialCode: \"+381\" },\n { code: \"SC\", name: \"Seychelles\", region: \"Africa\", dialCode: \"+248\" },\n { code: \"SL\", name: \"Sierra Leone\", region: \"Africa\", dialCode: \"+232\" },\n { code: \"SG\", name: \"Singapore\", region: \"Asia\", dialCode: \"+65\" },\n { code: \"SX\", name: \"Sint Maarten\", region: \"North America\", dialCode: \"+1\" },\n { code: \"SK\", name: \"Slovakia\", region: \"Europe\", dialCode: \"+421\" },\n { code: \"SI\", name: \"Slovenia\", region: \"Europe\", dialCode: \"+386\" },\n { code: \"SB\", name: \"Solomon Islands\", region: \"Oceania\", dialCode: \"+677\" },\n { code: \"SO\", name: \"Somalia\", region: \"Africa\", dialCode: \"+252\" },\n { code: \"ZA\", name: \"South Africa\", region: \"Africa\", dialCode: \"+27\" },\n { code: \"KR\", name: \"South Korea\", region: \"Asia\", dialCode: \"+82\" },\n { code: \"SS\", name: \"South Sudan\", region: \"Africa\", dialCode: \"+211\" },\n { code: \"ES\", name: \"Spain\", region: \"Europe\", dialCode: \"+34\" },\n { code: \"LK\", name: \"Sri Lanka\", region: \"Asia\", dialCode: \"+94\" },\n { code: \"SD\", name: \"Sudan\", region: \"Africa\", dialCode: \"+249\" },\n { code: \"SR\", name: \"Suriname\", region: \"South America\", dialCode: \"+597\" },\n { code: \"SE\", name: \"Sweden\", region: \"Europe\", dialCode: \"+46\" },\n { code: \"CH\", name: \"Switzerland\", region: \"Europe\", dialCode: \"+41\" },\n { code: \"SY\", name: \"Syria\", region: \"Asia\", dialCode: \"+963\" },\n { code: \"TJ\", name: \"Tajikistan\", region: \"Asia\", dialCode: \"+992\" },\n { code: \"TZ\", name: \"Tanzania\", region: \"Africa\", dialCode: \"+255\" },\n { code: \"TH\", name: \"Thailand\", region: \"Asia\", dialCode: \"+66\" },\n { code: \"TG\", name: \"Togo\", region: \"Africa\", dialCode: \"+228\" },\n { code: \"TK\", name: \"Tokelau\", region: \"Oceania\", dialCode: \"+690\" },\n { code: \"TO\", name: \"Tonga\", region: \"Oceania\", dialCode: \"+676\" },\n { code: \"TT\", name: \"Trinidad and Tobago\", region: \"North America\", dialCode: \"+1\" },\n { code: \"TN\", name: \"Tunisia\", region: \"Africa\", dialCode: \"+216\" },\n { code: \"TR\", name: \"Türkiye\", region: \"Europe\", dialCode: \"+90\" },\n { code: \"TM\", name: \"Turkmenistan\", region: \"Asia\", dialCode: \"+993\" },\n { code: \"TC\", name: \"Turks and Caicos Islands\", region: \"North America\", dialCode: \"+1\" },\n { code: \"TV\", name: \"Tuvalu\", region: \"Oceania\", dialCode: \"+688\" },\n { code: \"UG\", name: \"Uganda\", region: \"Africa\", dialCode: \"+256\" },\n { code: \"UA\", name: \"Ukraine\", region: \"Europe\", dialCode: \"+380\" },\n { code: \"AE\", name: \"United Arab Emirates\", region: \"Asia\", dialCode: \"+971\" },\n { code: \"GB\", name: \"United Kingdom\", region: \"Europe\", dialCode: \"+44\" },\n { code: \"US\", name: \"United States\", region: \"North America\", dialCode: \"+1\" },\n { code: \"UY\", name: \"Uruguay\", region: \"South America\", dialCode: \"+598\" },\n { code: \"UZ\", name: \"Uzbekistan\", region: \"Asia\", dialCode: \"+998\" },\n { code: \"VU\", name: \"Vanuatu\", region: \"Oceania\", dialCode: \"+678\" },\n { code: \"VA\", name: \"Vatican City\", region: \"Europe\", dialCode: \"+39\" },\n { code: \"VE\", name: \"Venezuela\", region: \"South America\", dialCode: \"+58\" },\n { code: \"VN\", name: \"Vietnam\", region: \"Asia\", dialCode: \"+84\" },\n { code: \"VI\", name: \"U.S. Virgin Islands\", region: \"North America\", dialCode: \"+1\" },\n { code: \"WF\", name: \"Wallis and Futuna\", region: \"Oceania\", dialCode: \"+681\" },\n { code: \"EH\", name: \"Western Sahara\", region: \"Africa\", dialCode: \"+212\" },\n { code: \"YE\", name: \"Yemen\", region: \"Asia\", dialCode: \"+967\" },\n { code: \"ZM\", name: \"Zambia\", region: \"Africa\", dialCode: \"+260\" },\n { code: \"ZW\", name: \"Zimbabwe\", region: \"Africa\", dialCode: \"+263\" },\n];\n","import { useEffect, useMemo, useState } from \"react\";\nimport type { CountryDial } from \"../countryDialCodes\";\nimport { countries as defaultCountries } from \"../countryDialCodes\";\n\nexport interface UseTelControlOptions {\n countries?: CountryDial[];\n name: string;\n value?: string | number | readonly string[] | undefined;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}\n\nexport function useTelControl({ countries, name, value, onChange }: UseTelControlOptions) {\n const allCountries = useMemo<CountryDial[]>(() => countries || defaultCountries, [countries]);\n\n const [selected, setSelected] = useState<CountryDial | null>(null);\n const [localNumber, setLocalNumber] = useState<string>(\"\");\n\n const toStringValue = (val?: string | number | readonly string[]) => {\n if (typeof val === \"string\") return val;\n if (typeof val === \"number\") return String(val);\n if (Array.isArray(val)) return val[0] ?? \"\";\n return \"\";\n };\n\n useEffect(() => {\n const s = toStringValue(value).trim();\n const m = s.match(/^\\+\\d{1,4}/);\n const dial = m ? m[0] : \"\";\n const number = s.slice(dial.length).trimStart();\n setLocalNumber(number || \"\");\n if (dial) {\n const found = allCountries.find((c) => c.dialCode === dial) || null;\n setSelected(found);\n } else {\n setSelected(null);\n }\n }, [value, allCountries]);\n\n const emitChange = (combined: string) => {\n if (!onChange) return;\n const evt = {\n target: { value: combined, name } as unknown,\n currentTarget: { value: combined, name } as unknown,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(evt);\n };\n\n const filtered = (query: string) => {\n if (!query) return allCountries;\n const q = query.toLowerCase();\n return allCountries.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n (c.region && c.region.toLowerCase().includes(q)) ||\n c.dialCode.replace(\"+\", \"\").includes(q.replace(\"+\", \"\"))\n );\n };\n\n const onSelectCountry = (c: CountryDial) => {\n setSelected(c);\n const combined = `${c.dialCode} ${localNumber}`.trim();\n emitChange(combined);\n };\n\n const onChangeLocal = (next: string) => {\n setLocalNumber(next);\n const combined = `${selected?.dialCode || \"\"} ${next}`.trim();\n emitChange(combined);\n };\n\n return {\n allCountries,\n selected,\n setSelected,\n localNumber,\n setLocalNumber,\n filtered,\n onSelectCountry,\n onChangeLocal,\n } as const;\n}\n","import clsx from \"clsx\";\nimport { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CountryDial } from \"./countryDialCodes\";\nimport { useTelControl } from \"./hooks/useTelControl\";\n\nexport interface TelInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string;\n name: string;\n required?: boolean;\n requiredClassName?: string;\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n countries?: CountryDial[];\n}\n\nexport const TelInput = forwardRef<HTMLInputElement, TelInputProps>(\n (props, ref) => {\n const {\n label,\n name,\n required,\n requiredClassName,\n className,\n labelClassName,\n inputClassName,\n countries,\n placeholder,\n value,\n onChange,\n } = props;\n\n const { allCountries, selected, localNumber, onSelectCountry, onChangeLocal } =\n useTelControl({ countries, name, value, onChange });\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const panelRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n const onDocClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n open &&\n panelRef.current &&\n !panelRef.current.contains(target) &&\n buttonRef.current &&\n !buttonRef.current.contains(target)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDocClick);\n return () => document.removeEventListener(\"mousedown\", onDocClick);\n }, [open]);\n\n // 使用 useTelControl 负责解析与变更回传\n\n const filtered: CountryDial[] = useMemo(() => {\n if (!query) return allCountries;\n const q = query.toLowerCase();\n return allCountries.filter(\n (c: CountryDial) =>\n c.name.toLowerCase().includes(q) ||\n (c.region && c.region.toLowerCase().includes(q)) ||\n c.dialCode.replace(\"+\", \"\").includes(q.replace(\"+\", \"\"))\n );\n }, [allCountries, query]);\n\n return (\n <div className={clsx(\"w-full\", className)}>\n {label ? (\n <label\n htmlFor={name}\n className={clsx(\n \"mb-1 inline-flex items-center text-sm text-gray-600\",\n labelClassName\n )}\n >\n {label}\n {required ? <span className={requiredClassName}>*</span> : null}\n </label>\n ) : null}\n\n <div\n className={clsx(\n \"flex h-10 items-center gap-2 rounded-md focus-within:ring-2 focus-within:ring-primary-300 focus-within:ring-offset-0 bg-white\",\n inputClassName\n )}\n >\n <div className=\"relative h-full\">\n <button\n ref={buttonRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className={\n \"h-full min-w-[200px] inline-flex items-center justify-between whitespace-nowrap rounded-md px-3 py-0 text-sm\"\n }\n >\n <span className=\"truncate text-left leading-tight\">\n {selected ? (\n <>\n <span className=\"font-medium\">{selected.name}</span>\n {selected.region ? (\n <span className=\"text-gray-500\">, {selected.region}</span>\n ) : null}\n <span className=\"ml-1 text-gray-700\">\n {selected.dialCode}\n </span>\n </>\n ) : (\n \"Select Country/Region\"\n )}\n </span>\n <svg\n className=\"ml-2 h-4 w-4 text-gray-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.085l3.71-3.855a.75.75 0 111.08 1.04l-4.24 4.41a.75.75 0 01-1.08 0L5.25 8.27a.75.75 0 01-.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n {open ? (\n <div\n ref={panelRef}\n className=\"absolute z-50 mt-2 w-[320px] rounded-md border border-gray-200 bg-white p-2 shadow-lg\"\n >\n <div className=\"flex items-center gap-2 rounded-md border border-gray-200 px-2 py-1.5\">\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Enter Country/Region\"\n className=\"h-8 w-full bg-transparent text-sm outline-none\"\n />\n <svg\n className=\"h-4 w-4 text-gray-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.5 3.5a5 5 0 013.996 8.1l3.202 3.203a.75.75 0 11-1.06 1.06l-3.203-3.202A5 5 0 118.5 3.5zm0 1.5a3.5 3.5 0 100 7 3.5 3.5 0 000-7z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div className=\"mt-2 max-h-64 overflow-auto pr-1\">\n {filtered.map((c: CountryDial) => (\n <button\n key={c.code}\n type=\"button\"\n onClick={() => {\n onSelectCountry(c);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-2 text-left text-sm hover:bg-gray-50\"\n >\n <span\n className={clsx(\n \"inline-block h-3 w-3 rounded-full border\",\n selected?.code === c.code\n ? \"border-primary-500 ring-4 ring-primary-200\"\n : \"border-gray-400\"\n )}\n ></span>\n <span className=\"flex-1 truncate\">\n {c.name}\n {c.region ? (\n <span className=\"text-gray-500\">, {c.region}</span>\n ) : null}\n </span>\n <span className=\"text-gray-700\">{c.dialCode}</span>\n </button>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n\n <input\n ref={ref}\n id={name}\n name={name}\n required={required}\n placeholder={placeholder || \"Phone number\"}\n inputMode=\"tel\"\n className={clsx(\"h-10 w-full px-3 py-0 text-sm leading-tight ring-0 outline-none rounded-md\")}\n value={localNumber}\n onChange={(e) => {\n const next = e.target.value;\n onChangeLocal(next);\n }}\n autoComplete={name}\n autoCorrect=\"off\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n }\n);\n\nexport default TelInput;\n","import clsx from \"clsx\";\nimport { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CountryDial } from \"./countryDialCodes\";\nimport { useInlineLabelPadding } from \"./hooks/useInlineLabelPadding\";\nimport { useTelControl } from \"./hooks/useTelControl\";\n\nexport interface TelInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: string;\n name: string;\n required?: boolean;\n requiredClassName?: string;\n className?: string;\n labelClassName?: string;\n inputClassName?: string;\n countries?: CountryDial[];\n selectPlaceholder?: string;\n}\n\nexport const TelInput2 = forwardRef<HTMLInputElement, TelInputProps>(\n (props, ref) => {\n const {\n label,\n name,\n required,\n requiredClassName,\n className,\n labelClassName,\n inputClassName,\n countries,\n placeholder,\n selectPlaceholder,\n value,\n onChange,\n } = props;\n\n const { labelRef, paddingLeft } = useInlineLabelPadding(16);\n const {\n allCountries,\n selected,\n localNumber,\n onSelectCountry,\n onChangeLocal,\n } = useTelControl({ countries, name, value, onChange });\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const panelRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n const filtered = useMemo(() => {\n if (!query) return allCountries;\n const q = query.toLowerCase();\n return allCountries.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n (c.region && c.region.toLowerCase().includes(q)) ||\n c.dialCode.replace(\"+\", \"\").includes(q.replace(\"+\", \"\"))\n );\n }, [allCountries, query]);\n\n useEffect(() => {\n const onDocClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n open &&\n panelRef.current &&\n !panelRef.current.contains(target) &&\n buttonRef.current &&\n !buttonRef.current.contains(target)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDocClick);\n return () => document.removeEventListener(\"mousedown\", onDocClick);\n }, [open]);\n\n return (\n <div className={clsx(\"relative w-full\", className)}>\n <label\n ref={labelRef}\n htmlFor={name}\n className={clsx(\n \"absolute left-3 top-1/2 -translate-y-1/2 mt-1 opacity-70 text-sm pointer-events-none whitespace-nowrap\",\n labelClassName\n )}\n >\n {label}\n {required ? <span className={requiredClassName}>*</span> : null}\n </label>\n\n <div\n className={clsx(\n \"flex h-10 items-center gap-2 rounded-md shadow-sm focus-within:ring-2 focus-within:ring-primary-300\",\n inputClassName\n )}\n style={{ paddingLeft }}\n >\n <div className=\"relative h-full\">\n <button\n ref={buttonRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className={\n \"h-full min-w-[100px] inline-flex items-center justify-between whitespace-nowrap rounded-md px-3 py-0 text-sm\"\n }\n >\n <span className=\"truncate text-left leading-tight\">\n {selected ? (\n <span className=\"font-medium\">{selected.dialCode}</span>\n ) : (\n <span className=\"text-gray-500\">+ Code</span>\n )}\n </span>\n <svg\n className=\"ml-2 h-4 w-4 text-gray-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.085l3.71-3.855a.75.75 0 111.08 1.04l-4.24 4.41a.75.75 0 01-1.08 0L5.25 8.27a.75.75 0 01-.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n {open ? (\n <div\n ref={panelRef}\n className=\"absolute z-50 mt-2 w-[320px] rounded-md border border-gray-200 bg-white p-2 shadow-lg\"\n >\n <div className=\"flex items-center gap-2 rounded-md border border-gray-200 px-2 py-1.5\">\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={selectPlaceholder || \"Enter Country/Region\"}\n className=\"h-8 w-full bg-transparent text-sm outline-none\"\n />\n <svg\n className=\"h-4 w-4 text-gray-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.5 3.5a5 5 0 013.996 8.1l3.202 3.203a.75.75 0 11-1.06 1.06l-3.203-3.202A5 5 0 118.5 3.5zm0 1.5a3.5 3.5 0 100 7 3.5 3.5 0 000-7z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div className=\"mt-2 max-h-64 overflow-auto pr-1\">\n {filtered.map((c) => (\n <button\n key={c.code}\n type=\"button\"\n onClick={() => {\n onSelectCountry(c);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-2 text-left text-sm hover:bg-gray-50\"\n >\n <span\n className={clsx(\n \"inline-block h-3 w-3 rounded-full border\",\n selected?.code === c.code\n ? \"border-primary-500 ring-4 ring-primary-200\"\n : \"border-gray-400\"\n )}\n ></span>\n <span className=\"flex-1 truncate\">\n {c.name}\n {c.region ? (\n <span className=\"text-gray-500\">, {c.region}</span>\n ) : null}\n </span>\n <span className=\"text-gray-700\">{c.dialCode}</span>\n </button>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n\n <input\n ref={ref}\n id={name}\n name={name}\n required={required}\n placeholder={placeholder || \"Phone number\"}\n inputMode=\"tel\"\n className={clsx(\n \"h-10 w-full appearance-none rounded-md border-0 bg-transparent px-3 py-0 text-sm leading-tight focus:outline-none\"\n )}\n value={localNumber}\n onChange={(e) => onChangeLocal(e.target.value)}\n autoComplete={name}\n autoCorrect=\"off\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n }\n);\n\nexport default TelInput2;\n","import { FileUpload2, FileUploadProps } from \"./FileUpload2\";\nimport { Input } from \"./Input\";\nimport { Input2 } from \"./Input2\";\nimport { Textarea } from \"./Textarea\";\nimport { Textarea2 } from \"./Textarea2\";\nimport TelInput from \"./TelInput\";\nimport TelInput2 from \"./TelInput2\";\nimport { FieldStyle } from \"./types\";\n\nexport const getControl = (controlName?: string, fieldStyle?: FieldStyle) => {\n switch (controlName) {\n case \"Input\":\n return getInput(fieldStyle);\n case \"Textarea\":\n return getTextarea(fieldStyle);\n case \"TelInput\":\n return getTelInput(fieldStyle);\n default:\n return getInput(fieldStyle);\n }\n};\n\nexport const getInput = (fieldStyle?: FieldStyle) => {\n if (fieldStyle === \"default\") {\n return Input;\n } else if (fieldStyle === \"label-inline\") {\n return Input2;\n } else {\n return Input;\n }\n};\n\nexport const getTextarea = (fieldStyle?: FieldStyle) => {\n if (fieldStyle === \"default\") {\n return Textarea;\n } else if (fieldStyle === \"label-inline\") {\n return Textarea2;\n } else {\n return Textarea;\n }\n};\n\nexport const getTelInput = (fieldStyle?: FieldStyle) => {\n if (fieldStyle === \"label-inline\") {\n return TelInput2;\n }\n return TelInput;\n};\n\nexport const getFileUpload = (\n fieldStyle?: FieldStyle\n): React.FC<FileUploadProps> => {\n if (fieldStyle === \"default\") {\n return FileUpload2;\n } else if (fieldStyle === \"label-inline\") {\n return FileUpload2;\n } else {\n return FileUpload2;\n }\n};\n","import { forwardRef, useState } from \"react\";\nimport { Submit } from \"./Submit\";\nimport { type UploadedFile } from \"./FileUpload2\";\nimport clsx from \"clsx\";\nimport { encrypt } from \"./funcs\";\nimport { ContactFormProps, QuoteRequest } from \"./types\";\nimport { getControl, getFileUpload } from \"./factory\";\n\ninterface FormErrors {\n name?: string;\n email?: string;\n message?: string;\n}\n\nexport const ContactForm = forwardRef<HTMLDivElement, ContactFormProps>(\n (props, ref) => {\n const {\n submit,\n actionUrl = \"/api/ask-for-quote\",\n formSalt,\n fields = [],\n className,\n classNames,\n fromCta,\n ...rest\n } = props;\n const [formData, setFormData] = useState<QuoteRequest>({\n name: \"\",\n email: \"\",\n company: \"\",\n message: \"\",\n phone: \"\", // 初始化蜜罐字段\n attachments: [], // 附件 ID 列表\n });\n // 错误状态\n const [errors, setErrors] = useState<FormErrors>({});\n const [submitting, setSubmitting] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<{\n success?: boolean;\n message?: string;\n }>({});\n const lastCta = (window as Window & { lastCta?: string }).lastCta;\n\n // 处理输入变化\n const handleChange = (\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n isExtends?: boolean\n ) => {\n const { name, value } = e.target;\n if (isExtends) {\n setFormData((prev) => ({\n ...prev,\n extents: {\n ...(prev.extends || {}),\n [name]: value,\n },\n }));\n } else {\n setFormData((prev) => ({\n ...prev,\n [name]: value,\n }));\n }\n\n setSubmitStatus({}); // 重置提交状态\n\n // 清除对应字段的错误\n if (errors[name as keyof FormErrors]) {\n setErrors((prev) => ({\n ...prev,\n [name]: undefined,\n }));\n }\n };\n\n // 处理文件上传变化(单文件)\n const handleFileChange = (fileInfo: UploadedFile | null) => {\n setFormData((prev) => ({\n ...prev,\n attachments: fileInfo ? [fileInfo] : [], // 存储完整的文件信息\n }));\n };\n\n // 处理文件上传状态变化\n const handleFileUploadStateChange = (uploading: boolean) => {\n setIsUploading(uploading);\n };\n // 验证表单\n const validateForm = (): boolean => {\n const newErrors: FormErrors = {};\n\n // if (!formData.name?.trim()) {\n // newErrors.name = \"Please enter your name\";\n // }\n\n if (!formData.email?.trim()) {\n newErrors.email = \"Please enter your email\";\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.email)) {\n newErrors.email = \"Please enter a valid email address\";\n }\n\n if (!formData.message?.trim()) {\n newErrors.message = \"Please enter your message\";\n }\n\n // 检查蜜罐字段 - 如果填写了则表示是机器人\n if (formData.phone) {\n // 悄悄失败,不显示错误信息\n console.log(\"Honeypot triggered - likely spam submission\");\n return false;\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleClick = async (event: React.MouseEvent) => {\n event.preventDefault(); // 阻止表单默认提交行为\n\n // 验证表单\n if (!validateForm()) {\n return; // 如果验证失败,不继续提交\n }\n\n try {\n setSubmitting(true);\n setSubmitStatus({}); // 重置提交状态\n const response = await fetch(actionUrl, {\n method: \"POST\",\n body: JSON.stringify({\n ...formData,\n //TODO:后面改成从window 或者传入\n fromCta: fromCta || lastCta,\n encryptedField: encrypt(formData.phone, formSalt),\n }),\n headers: {\n \"X-Request-URL\": window.location.href,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Server responded with status: ${response.status}`);\n }\n\n const result = await response.json();\n\n setSubmitStatus({\n success: result.success,\n message: result.message,\n });\n\n if (result.success) {\n // 重置表单\n setFormData({\n name: \"\",\n email: \"\",\n company: \"\",\n message: \"\",\n phone: \"\",\n attachments: [],\n });\n window.location.href = \"/thanks\";\n }\n } catch (error) {\n // 如果出现错误,打印错误信息\n console.error(\"Form submission error:\", error);\n setSubmitStatus({\n success: false,\n message:\n error instanceof Error\n ? `Error: ${error.message}`\n : \"Failed to submit the form. Please try again later.\",\n });\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <div\n ref={ref}\n className={clsx(\n \"py-4 grid max-w-2xl grid-cols-1 gap-x-6 sm:grid-cols-2 w-full\",\n className || \"gap-y-6\"\n )}\n {...rest}\n >\n {fields.map((field, index) => {\n const {\n controlName,\n feildStyle,\n isExtends,\n name,\n className,\n inputClassName,\n labelClassName,\n ...rest\n } = field;\n\n // FileUpload 组件特殊处理\n if (controlName === \"FileUpload\") {\n const FileUploadControl = getFileUpload(feildStyle);\n return (\n <FileUploadControl\n key={name || index}\n name={name || \"attachments\"}\n formSalt={formSalt}\n className={clsx(classNames?.inputContainer, className)}\n inputClassName={clsx(classNames?.input, inputClassName)}\n labelClassName={clsx(classNames?.label, labelClassName)}\n maxSize={3 * 1024 * 1024}\n onChange={handleFileChange}\n onUploadStateChange={handleFileUploadStateChange}\n placeholder=\"Click to select file\"\n uploadingText=\"Uploading...\"\n selectedText=\"Selected: {name}\"\n accept=\"*/*\"\n {...rest}\n />\n );\n }\n\n // 普通输入控件\n const Control = getControl(controlName, feildStyle);\n return (\n <Control\n key={name || index}\n name={name}\n className={clsx(classNames?.inputContainer, className)}\n labelClassName={clsx(classNames?.label, labelClassName)}\n inputClassName={clsx(classNames?.input, inputClassName)}\n requiredClassName={classNames?.required}\n value={formData[name as keyof QuoteRequest] as string}\n onChange={(e) => handleChange(e, isExtends)}\n error={errors[name as keyof FormErrors]}\n {...rest}\n />\n );\n })}\n\n {/* 蜜罐字段 - 对用户隐藏但对机器人可见 */}\n <div style={{ display: \"none\" }}>\n <input\n type=\"text\"\n name=\"phone\"\n value={formData.phone}\n onChange={handleChange}\n tabIndex={-1}\n autoComplete=\"off\"\n />\n </div>\n <div\n className={clsx(\n \"col-span-full flex items-center gap-x-6 px-0 py-2\",\n submit?.containerClassName\n )}\n >\n {submitStatus.message && !submitStatus.success && (\n <div\n className={`text-sm ${\n submitStatus.success ? \"text-green-600\" : \"text-red-600\"\n }`}\n >\n {submitStatus.message}\n </div>\n )}\n <Submit\n className={clsx(\n \"flex gap-2 items-center relative shadow-sm btn btn-lg nowrap\",\n submit?.className || \"btn-primary\"\n )}\n title={submit?.title || \"Send Message\"}\n spinner={\n <div className=\"left-8 flex items-center justify-center\">\n <div className=\"animate-spin rounded-full h-5 w-5 border-t-2 border-b-2 border-white\" />\n </div>\n }\n rawHtml={submit?.rawHtml}\n needClasses={submit?.needClasses}\n submitting={submitting}\n disabled={submitting || isUploading}\n onClick={handleClick}\n />\n </div>\n </div>\n );\n }\n);\n","import {\n Icon as IconifyIcon,\n IconProps as IconifyIconProps,\n} from \"@iconify/react\";\nimport type { IconifyIcon as IconifyIconData } from \"@iconify/react\";\nimport { forwardRef } from \"react\";\n\nexport type IconProps = Omit<IconifyIconProps, \"icon\"> & {\n icon?: string | IconifyIconData;\n};\n\nexport const Icon = forwardRef<SVGSVGElement, IconProps>((props, ref) => {\n const { icon, ...rest } = props;\n\n if (!icon) {\n return null;\n }\n\n return <IconifyIcon ref={ref} {...rest} icon={icon} />;\n});","import { Media } from \"@rxdrag/rxcms-models\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport Hls from \"hls.js\";\nimport clsx from \"clsx\";\n\nexport function VideoPlayer(props: {\n media: Media;\n size?: \"normal\" | \"small\";\n playButtonClass?: string;\n}) {\n const { media, size = \"normal\", playButtonClass } = props;\n const videoRef = useRef<HTMLVideoElement>(null);\n const hlsRef = useRef<Hls | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n\n const handlePlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (videoRef.current) {\n if (isPlaying) {\n videoRef.current.pause();\n } else {\n videoRef.current.play();\n }\n }\n },\n [isPlaying]\n );\n\n useEffect(() => {\n if (!videoRef.current || !media.file?.original) return;\n\n const video = videoRef.current;\n const videoUrl = media.file.original;\n\n const handlePlay = () => {\n setIsPlaying(true);\n };\n\n const handlePause = () => {\n setIsPlaying(false);\n };\n\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n\n if (media.storageType === \"cloudflare_stream\") {\n if (!Hls.isSupported()) {\n if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = videoUrl;\n }\n } else {\n const hls = new Hls({\n enableWorker: true,\n });\n\n hls.loadSource(videoUrl);\n hls.attachMedia(video);\n hlsRef.current = hls;\n }\n } else {\n video.src = videoUrl;\n }\n\n return () => {\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n if (hlsRef.current) {\n hlsRef.current.destroy();\n hlsRef.current = null;\n }\n };\n }, [media.file?.original, media.storageType]);\n\n return (\n <div className=\"relative w-full h-full group cursor-pointer\" onClick={handlePlayClick}>\n <video\n ref={videoRef}\n preload=\"metadata\"\n poster={media.file?.thumbnail}\n className=\"absolute inset-0 w-full h-full object-cover\"\n controls={false} \n playsInline\n />\n {!isPlaying && (\n <div className=\"absolute inset-0 flex items-center justify-center z-10 bg-black/10 group-hover:bg-black/20 transition-colors\">\n <div\n className={clsx(\n \"rounded-full bg-white/90 hover:bg-white flex items-center justify-center shadow-lg transition-all hover:scale-110 backdrop-blur-sm\",\n size === \"small\" ? \"w-8 h-8\" : \"w-14 h-14\",\n playButtonClass\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={clsx(\n \"text-gray-900 ml-1\",\n size === \"small\" ? \"w-4 h-4\" : \"w-8 h-8\"\n )}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.5 5.653c0-1.426 1.529-2.33 2.779-1.643l11.54 6.348c1.295.712 1.295 2.573 0 3.248L7.28 19.987C6.03 20.673 4.5 19.77 4.5 18.562V5.653z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { TMedia } from \"../../types/view-model\";\nimport { MediaType } from \"@rxdrag/rxcms-models\";\nimport { VideoPlayer } from \"./VideoPlayer\";\n\nexport type MainMediaProps = {\n value?: TMedia[];\n selectedId?: string | null;\n aspect?: string;\n enableZoom?: boolean;\n className?: string;\n arrowButtonClass?: string;\n arrowIconClass?: string;\n playButtonClass?: string;\n onPrevious: () => void;\n onNext: () => void;\n canPrevious: boolean;\n canNext: boolean;\n};\n\nexport const MainMedia = ({\n value,\n selectedId,\n aspect,\n enableZoom,\n className,\n arrowButtonClass,\n arrowIconClass,\n playButtonClass,\n onPrevious,\n onNext,\n canPrevious,\n canNext,\n}: MainMediaProps) => {\n const mainAreaRef = useRef<HTMLDivElement>(null);\n const [isZoomed, setIsZoomed] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const hoverTimerRef = useRef<NodeJS.Timeout | null>(null);\n const lastMousePosRef = useRef({ x: 0, y: 0 });\n\n const selectedMedia = value?.find((media) => media.id === selectedId);\n const isVideo = selectedMedia?.mediaType === MediaType.video;\n\n // Reset zoom state when image changes\n useEffect(() => {\n setIsZoomed(false);\n setPosition({ x: 0, y: 0 });\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n }\n }, [selectedId]);\n\n // Clean up timer on unmount\n useEffect(() => {\n return () => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n }\n };\n }, []);\n\n const updateZoomPosition = useCallback((clientX: number, clientY: number) => {\n if (mainAreaRef.current) {\n const { left, top, width, height } =\n mainAreaRef.current.getBoundingClientRect();\n const x = clientX - left;\n const y = clientY - top;\n\n // Calculate percentage position (0 to 1)\n const ratioX = Math.max(0, Math.min(1, x / width));\n const ratioY = Math.max(0, Math.min(1, y / height));\n\n // Formula: Translate = Dimension * (0.5 - Ratio)\n // This shifts the image opposite to mouse movement relative to center\n const newX = width * (0.5 - ratioX);\n const newY = height * (0.5 - ratioY);\n\n setPosition({ x: newX, y: newY });\n }\n }, []);\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n if (!enableZoom || isVideo) return;\n lastMousePosRef.current = { x: e.clientX, y: e.clientY };\n\n hoverTimerRef.current = setTimeout(() => {\n setIsZoomed(true);\n updateZoomPosition(\n lastMousePosRef.current.x,\n lastMousePosRef.current.y\n );\n }, 1000);\n },\n [enableZoom, isVideo, updateZoomPosition]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!enableZoom || isVideo) return;\n lastMousePosRef.current = { x: e.clientX, y: e.clientY };\n\n if (isZoomed) {\n updateZoomPosition(e.clientX, e.clientY);\n }\n },\n [enableZoom, isVideo, isZoomed, updateZoomPosition]\n );\n\n const handleMouseLeave = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n }\n setIsZoomed(false);\n setPosition({ x: 0, y: 0 });\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (!enableZoom || isVideo) return;\n\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n }\n\n if (isZoomed) {\n setIsZoomed(false);\n setPosition({ x: 0, y: 0 });\n } else {\n setIsZoomed(true);\n updateZoomPosition(e.clientX, e.clientY);\n }\n },\n [enableZoom, isVideo, isZoomed, updateZoomPosition]\n );\n\n return (\n <div\n ref={mainAreaRef}\n className={clsx(\n \"relative group overflow-hidden rounded-xl bg-gray-100 dark:bg-gray-800 z-0\",\n aspect,\n className,\n enableZoom && !isVideo && \"cursor-crosshair\"\n )}\n onMouseEnter={handleMouseEnter}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n >\n {/* Navigation Arrows - Hide when zoomed to avoid misclick */}\n {!isZoomed && (\n <div className=\"absolute inset-0 flex items-center justify-between p-4 pointer-events-none z-20\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPrevious();\n }}\n disabled={!canPrevious}\n className={clsx(\n \"pointer-events-auto transition-all duration-200 rounded-full p-2\",\n \"bg-white/80 dark:bg-black/50 backdrop-blur-sm shadow-sm\",\n \"hover:bg-white dark:hover:bg-black/70 hover:scale-105 active:scale-95\",\n \"text-gray-800 dark:text-white\",\n !canPrevious\n ? \"opacity-0 translate-x-[-10px]\"\n : \"opacity-0 group-hover:opacity-100 translate-x-0\",\n arrowButtonClass\n )}\n aria-label=\"Previous slide\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={clsx(\"h-5 w-5\", arrowIconClass)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <button\n onClick={(e) => {\n e.stopPropagation();\n onNext();\n }}\n disabled={!canNext}\n className={clsx(\n \"pointer-events-auto transition-all duration-200 rounded-full p-2\",\n \"bg-white/80 dark:bg-black/50 backdrop-blur-sm shadow-sm\",\n \"hover:bg-white dark:hover:bg-black/70 hover:scale-105 active:scale-95\",\n \"text-gray-800 dark:text-white\",\n !canNext\n ? \"opacity-0 translate-x-[10px]\"\n : \"opacity-0 group-hover:opacity-100 translate-x-0\",\n arrowButtonClass\n )}\n aria-label=\"Next slide\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={clsx(\"h-5 w-5\", arrowIconClass)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n\n {value?.map((media) => (\n <div\n key={media.id}\n className={clsx(\n \"absolute inset-0 transition-opacity duration-500 ease-in-out\",\n media.id === selectedId\n ? \"opacity-100 z-10\"\n : \"opacity-0 z-0 pointer-events-none\"\n )}\n >\n {media.mediaType === MediaType.video ? (\n <VideoPlayer media={media} playButtonClass={playButtonClass} />\n ) : (\n <img\n src={media?.file?.resize || media?.file?.url}\n alt={media?.alt}\n className=\"w-full h-full object-cover object-center origin-center\"\n style={{\n transform:\n media.id === selectedId\n ? `translate(${position.x}px, ${position.y}px) scale(${\n isZoomed ? 2 : 1\n })`\n : undefined,\n transition: isZoomed ? \"none\" : \"transform 0.3s ease-out\",\n }}\n />\n )}\n </div>\n ))}\n </div>\n );\n};\n","import clsx from \"clsx\";\nimport { TMedia } from \"../../types/view-model\";\nimport { MediaType } from \"@rxdrag/rxcms-models\";\nimport { VideoPlayer } from \"./VideoPlayer\";\n\nexport type ThumbnailProps = {\n media: TMedia;\n isSelected: boolean;\n onClick: () => void;\n aspect?: string;\n className?: string;\n imageClass?: string;\n playButtonClass?: string;\n};\n\nexport const Thumbnail = ({\n media,\n isSelected,\n onClick,\n aspect,\n className,\n imageClass,\n playButtonClass,\n}: ThumbnailProps) => {\n return (\n <div\n className={clsx(\n \"relative cursor-pointer overflow-hidden rounded-lg transition-all duration-200\",\n aspect,\n isSelected\n ? \"ring-2 ring-primary ring-offset-2 ring-offset-white dark:ring-offset-gray-950\"\n : \"opacity-70 hover:opacity-100 hover:ring-2 hover:ring-gray-200 dark:hover:ring-gray-700\",\n className\n )}\n onClick={onClick}\n >\n {media.mediaType === MediaType.video ? (\n <div\n className={clsx(\n \"w-full h-full relative pointer-events-none [&>div]:!aspect-auto [&>div]:!w-full [&>div]:!h-full transition-transform duration-500\",\n isSelected ? \"scale-110\" : \"scale-100\",\n imageClass\n )}\n >\n <VideoPlayer media={media} size=\"small\" playButtonClass={playButtonClass} />\n </div>\n ) : (\n <img\n src={\n media?.file?.thumbnail || media?.file?.resize || media?.file?.url\n }\n alt={media?.alt}\n className={clsx(\n \"w-full h-full object-cover transition-transform duration-500\",\n isSelected ? \"scale-110\" : \"scale-100\",\n imageClass\n )}\n />\n )}\n </div>\n );\n};\n","import clsx from \"clsx\";\nimport { forwardRef, useEffect, useState, useCallback } from \"react\";\nimport { TMedia } from \"../../types/view-model\";\nimport { MainMedia } from \"./MainMedia\";\nimport { Thumbnail } from \"./Thumbnail\";\n\nexport type MediasProps = {\n value?: TMedia[];\n className?: string;\n children?: React.ReactNode;\n // Aspect ratio, format is `aspect-[width/height]`\n aspect?: string;\n thumbnailAspect?: string;\n enableZoom?: boolean;\n thumbnailPosition?: \"bottom\" | \"left\";\n visibleCount?: number;\n classNames?: {\n mainArea?: string;\n navigation?: string;\n thumbnail?: string;\n thumbnailImage?: string;\n arrowButton?: string;\n arrowIcon?: string;\n playButton?: string;\n navigationInner?: string;\n };\n};\n\nexport const Medias = forwardRef<HTMLDivElement, MediasProps>((props, ref) => {\n const {\n value,\n className,\n children,\n aspect = \"aspect-[1/1]\",\n thumbnailAspect = \"aspect-[1/1]\",\n enableZoom = true,\n thumbnailPosition = \"bottom\",\n visibleCount = 6,\n classNames,\n ...rest\n } = props;\n const {\n mainArea,\n navigation,\n thumbnail,\n thumbnailImage,\n arrowButton,\n arrowIcon,\n playButton,\n navigationInner,\n } = classNames || {};\n const [selectedId, setSelectedId] = useState<string | undefined | null>(\n value?.[0]?.id || \"\"\n );\n\n useEffect(() => {\n setSelectedId(value?.[0]?.id || \"\");\n }, [value]);\n\n const selectedIndex =\n value?.findIndex((media) => media.id === selectedId) || 0;\n\n const totalItems = value?.length || 0;\n\n const handlePrevious = useCallback(() => {\n if (selectedIndex > 0) {\n const prevIndex = selectedIndex - 1;\n setSelectedId(value?.[prevIndex]?.id || \"\");\n }\n }, [selectedIndex, value]);\n\n const handleNext = useCallback(() => {\n if (selectedIndex < totalItems - 1) {\n const currentMediaIndex =\n value?.findIndex((media) => media.id === selectedId) || 0;\n const nextIndex = currentMediaIndex + 1;\n setSelectedId(value?.[nextIndex]?.id || \"\");\n }\n }, [selectedIndex, totalItems, value, selectedId]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n handlePrevious();\n } else if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n handleNext();\n }\n },\n [handleNext, handlePrevious]\n );\n\n useEffect(() => {\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [handleKeyDown]);\n\n const canPrevious = selectedIndex > 0;\n const canNext = selectedIndex < totalItems - 1;\n\n const isVerticalThumbs = thumbnailPosition === \"left\";\n\n const actualVisibleCount = visibleCount;\n const halfVisible = Math.floor(actualVisibleCount / 2);\n const startIndex = Math.max(\n 0,\n Math.min(selectedIndex - halfVisible, totalItems - actualVisibleCount)\n );\n const endIndex = Math.min(startIndex + actualVisibleCount, totalItems);\n\n return (\n <div\n ref={ref}\n className={clsx(\n \"flex gap-4\",\n isVerticalThumbs ? \"flex-col md:flex-row-reverse\" : \"flex-col\",\n className\n )}\n {...rest}\n >\n {children}\n {/* Main display area */}\n <MainMedia\n value={value}\n selectedId={selectedId}\n aspect={aspect}\n enableZoom={enableZoom}\n className={clsx(\n isVerticalThumbs ? \"w-full md:flex-1\" : \"w-full\",\n mainArea\n )}\n arrowButtonClass={arrowButton}\n arrowIconClass={arrowIcon}\n playButtonClass={playButton}\n onPrevious={handlePrevious}\n onNext={handleNext}\n canPrevious={canPrevious}\n canNext={canNext}\n />\n\n {/* Thumbnail navigation */}\n {totalItems > 1 && (\n <div\n className={clsx(\n \"relative group/thumbs\",\n isVerticalThumbs\n ? \"w-full mt-4 md:w-24 md:h-full md:px-1\"\n : \"w-full mt-4\",\n navigation\n )}\n >\n {/* Previous Arrow */}\n {totalItems > actualVisibleCount && (\n <button\n onClick={handlePrevious}\n disabled={!canPrevious}\n className={clsx(\n \"absolute z-10 w-8 h-8 flex items-center justify-center rounded-full\",\n \"bg-white/60 dark:bg-black/50 shadow-sm backdrop-blur-sm\",\n \"text-gray-700 dark:text-gray-200 transition-all duration-200\",\n isVerticalThumbs\n ? \"left-2 top-1/2 -translate-y-1/2 md:top-2 md:left-1/2 md:-translate-x-1/2\"\n : \"left-2 top-1/2 -translate-y-1/2\",\n !canPrevious\n ? \"opacity-0 pointer-events-none\"\n : \"opacity-0 group-hover/thumbs:opacity-100 hover:bg-white/90 dark:hover:bg-black/80\",\n arrowButton\n )}\n aria-label=\"Previous\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={clsx(\n \"h-4 w-4\",\n isVerticalThumbs && \"md:rotate-90\",\n arrowIcon\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n )}\n\n <div\n className={clsx(\n \"flex-1\",\n isVerticalThumbs\n ? \"w-full px-0.5 md:h-full md:py-0.5\"\n : \"w-full px-0.5\"\n )}\n >\n <div\n className={clsx(\n \"gap-2 md:gap-3\",\n navigationInner,\n isVerticalThumbs ? \"grid md:flex md:flex-col\" : \"grid\"\n )}\n style={{\n gridTemplateColumns: `repeat(${actualVisibleCount}, minmax(0, 1fr))`,\n }}\n >\n {value?.map((media, index) => {\n if (index < startIndex || index >= endIndex) return null;\n const isSelected = selectedId === media.id;\n return (\n <Thumbnail\n key={media.id}\n media={media}\n isSelected={isSelected}\n onClick={() => setSelectedId(media.id)}\n aspect={thumbnailAspect}\n className={thumbnail}\n imageClass={thumbnailImage}\n playButtonClass={playButton}\n />\n );\n })}\n </div>\n </div>\n\n {/* Next Arrow */}\n {totalItems > actualVisibleCount && (\n <button\n onClick={handleNext}\n disabled={!canNext}\n className={clsx(\n \"absolute z-10 w-8 h-8 flex items-center justify-center rounded-full\",\n \"bg-white/60 dark:bg-black/50 shadow-sm backdrop-blur-sm\",\n \"text-gray-700 dark:text-gray-200 transition-all duration-200\",\n isVerticalThumbs\n ? \"right-2 top-1/2 -translate-y-1/2 md:bottom-2 md:left-1/2 md:-translate-x-1/2\"\n : \"right-2 top-1/2 -translate-y-1/2\",\n !canNext\n ? \"opacity-0 pointer-events-none\"\n : \"opacity-0 group-hover/thumbs:opacity-100 hover:bg-white/90 dark:hover:bg-black/80\",\n arrowButton\n )}\n aria-label=\"Next\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={clsx(\n \"h-4 w-4\",\n isVerticalThumbs && \"md:rotate-90\",\n arrowIcon\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n );\n});\n","import { Product } from \"@rxdrag/rxcms-models\";\nimport \"./style.css\";\nimport type { ReactNode } from \"react\";\n\n//TODO: 跟询盘触发器同样的实现原理,给询盘对话框发消息\nexport function ProductCta(props: {\n product?: Product;\n openableKey?: string;\n children?: ReactNode;\n}) {\n const { product, openableKey = \"enquiry-modal\", children } = props;\n const roleProps = {\n \"data-modal-open\": openableKey,\n \"data-call-to-action\": `From RichText ProductCard-${product?.title}-${product?.id}`,\n };\n\n return (\n <div className=\"flex justify-center items-center\">\n <button\n {...roleProps}\n className=\"product-cta-button relative flex-1 mt-2 flex items-center justify-center rounded-md border border-transparent bg-sky-600 text-md font-smibold text-white hover:bg-sky-700\"\n type=\"button\"\n >\n {children || \"Get a quote\"}\n </button>\n </div>\n );\n}\n","import { HTMLAttributes } from \"react\";\nimport \"./style.css\";\n\nexport function ProductTitle(props: HTMLAttributes<HTMLHeadingElement>) {\n const { className, ...rest } = props;\n return <h3 className={\"product-title \" + className} {...rest} />;\n}\n","import clsx from \"clsx\"\nimport { HTMLAttributes } from \"react\"\nimport \"./style.css\"\n\nexport function ProductDescription(props: HTMLAttributes<HTMLParagraphElement>) {\n const { className, ...rest } = props\n return (\n <p\n className={clsx(\"product-description\", className)}\n {...rest}\n />\n )\n}","import { HtmlHTMLAttributes } from \"react\";\nimport \"./style.css\";\nimport { TProduct } from \"../../../types/view-model\";\n\nexport function ProductMedia(\n props: {\n product?: TProduct;\n width?: number;\n aspect?: string;\n } & HtmlHTMLAttributes<HTMLImageElement>\n) {\n const { product, style, width, className, aspect, ...rest } = props;\n\n return (\n <div\n className={\"product-media \" + className}\n style={{\n aspectRatio: aspect || \"4 / 3\",\n borderRadius: \"1rem\",\n overflow: \"hidden\",\n ...style,\n width,\n }}\n {...rest}\n >\n <img\n style={{\n width: \"100%\",\n }}\n src={product?.coverUrl}\n alt={product?.title}\n />\n </div>\n );\n}\n","import { ProductCardProps } from \"./ProductCard\";\nimport { Figcaption, Figure, FigureContent } from \"@rxdrag/tiptap-preview\";\nimport { ProductMedia } from \"./ProductMedia\";\nimport { ProductTitle } from \"./ProductTitle\";\nimport { ProductDescription } from \"./ProductDescription\";\nimport { ProductCta } from \"./ProductCta\";\nimport { TProduct } from \"../../types/view-model\";\n\nexport function ProductView(\n props: {\n product?: TProduct;\n ctaTitle?: string;\n } & ProductCardProps\n) {\n const { product, ctaTitle, node } = props;\n\n const title = node?.title || product?.title;\n const description = node?.description || product?.description;\n\n return (\n <Figure>\n <FigureContent width={node?.width} align={node?.align}>\n <a href={`/products/${product?.slug}`}>\n <ProductMedia product={product} aspect={node?.aspect} />\n </a>\n </FigureContent>\n <Figcaption width={node?.width} align={node?.align}>\n <a href={`/products/${product?.slug}`}>\n <ProductTitle>{title}</ProductTitle>\n </a>\n <ProductDescription>{description}</ProductDescription>\n <ProductCta product={product}>{ctaTitle}</ProductCta>\n </Figcaption>\n </Figure>\n );\n}\n","import { CSSProperties } from \"react\";\nimport { TSlateResizable } from \"@rxdrag/tiptap-preview\";\nimport { ProductView } from \"./ProductView\";\nimport { Product } from \"@rxdrag/rxcms-models\";\n\nexport type TSlateProduct = TSlateResizable & {\n product?: Product;\n title?: string;\n description?: string;\n aspect?: string;\n ctaTitle?: string;\n};\n\nexport const PRODUCT_KEY = \"Product\";\n\nexport type ProductCardProps = {\n node?: TSlateProduct;\n style?: CSSProperties;\n};\n\n// Slate用的渲染组件\nexport const ProductCard = ({ node }: ProductCardProps) => {\n return <ProductView product={node?.product} node={node} ctaTitle={node?.ctaTitle}/>;\n};\n","import { useCallback, useEffect, useState, useRef, useMemo } from \"react\";\n\n type ThrottledFunction<T extends (...args: never[]) => void> = ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n };\n\n function throttle<T extends (...args: never[]) => void>(\n fn: T,\n wait: number,\n options: { leading?: boolean; trailing?: boolean } = {}\n ): ThrottledFunction<T> {\n const { leading = true, trailing = true } = options;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastInvokeTime = 0;\n let lastArgs: Parameters<T> | null = null;\n\n const invoke = (time: number, args: Parameters<T>) => {\n lastInvokeTime = time;\n fn(...args);\n };\n\n const throttled = ((...args: Parameters<T>) => {\n const now = Date.now();\n\n if (!lastInvokeTime && !leading) {\n lastInvokeTime = now;\n }\n\n const remaining = wait - (now - lastInvokeTime);\n lastArgs = args;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n invoke(now, args);\n lastArgs = null;\n return;\n }\n\n if (!timeoutId && trailing) {\n timeoutId = setTimeout(() => {\n timeoutId = null;\n if (lastArgs) {\n invoke(leading ? Date.now() : 0, lastArgs);\n lastArgs = null;\n }\n }, remaining);\n }\n }) as ThrottledFunction<T>;\n\n throttled.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n lastInvokeTime = 0;\n };\n\n return throttled;\n }\n\nexport function useAcitviedHeading(yOffset = 200) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const anchorElementsRef = useRef<HTMLAnchorElement[]>([]);\n const lastScrollTopRef = useRef(0);\n const activeIdRef = useRef<string | null>(null);\n\n // 同步 activeId 到 ref\n useEffect(() => {\n activeIdRef.current = activeId;\n }, [activeId]);\n\n // 初始化时获取所有锚点元素\n useEffect(() => {\n anchorElementsRef.current = Array.from(\n document.querySelectorAll('a[href^=\"#\"]')\n );\n }, []);\n\n const handleScroll = useCallback(() => {\n const scrollTop = window.scrollY;\n lastScrollTopRef.current = scrollTop;\n\n let closestId = null;\n let closestDistance = Infinity;\n\n anchorElementsRef.current.forEach((element) => {\n const id = element.getAttribute(\"href\")?.slice(1) || \"\";\n const targetElement = document.getElementById(id);\n\n if (targetElement) {\n const { top } = targetElement.getBoundingClientRect();\n const distance = Math.abs(top);\n if (top <= yOffset && distance < closestDistance) {\n closestId = id;\n closestDistance = distance;\n }\n }\n });\n\n if (activeIdRef.current !== closestId) {\n setActiveId(closestId);\n }\n }, [yOffset]); // 移除 activeId 依赖,因为我们只需要比较当前值\n\n // 使用节流函数包装handleScroll\n const throttledHandleScroll = useMemo(\n () => throttle(handleScroll, 100, { leading: true, trailing: true }),\n [handleScroll]\n );\n\n useEffect(() => {\n const handleHashChange = () => {\n const hash = window.location.hash.substring(1);\n setActiveId(hash);\n\n const element = document.getElementById(hash);\n if (element) {\n const y =\n element.getBoundingClientRect().top + window.scrollY - yOffset;\n window.scrollTo({ top: y, behavior: \"smooth\" });\n }\n };\n\n window.addEventListener(\"hashchange\", handleHashChange);\n window.addEventListener(\"scroll\", throttledHandleScroll);\n\n // 初始化时检查当前哈希值\n handleHashChange();\n\n return () => {\n window.removeEventListener(\"hashchange\", handleHashChange);\n window.removeEventListener(\"scroll\", throttledHandleScroll);\n throttledHandleScroll.cancel(); // 清理节流函数\n };\n }, [handleScroll, throttledHandleScroll, yOffset]);\n\n return activeId;\n}\n","import { extractOutlineFromTiptap, mdxToTiptap } from \"@rxdrag/tiptap-preview\";\nimport { forwardRef, useEffect } from \"react\";\nimport { useAcitviedHeading } from \"./useAcitviedHeading\";\nimport clsx from \"clsx\";\n\nexport type RichTextOutlineProps = {\n className?: string;\n itemClassName?: string;\n value?: string;\n //滚动偏移量\n yOffset?: number;\n style?: React.CSSProperties;\n};\n\nexport const RichTextOutline = forwardRef<\n HTMLUListElement,\n RichTextOutlineProps\n>((props, ref) => {\n const { className, itemClassName, value, yOffset = 200, ...rest } = props;\n const activiedId = useAcitviedHeading(yOffset);\n const doc = mdxToTiptap(value ?? \"\");\n const outline = extractOutlineFromTiptap(doc);\n\n useEffect(() => {\n const handleHashChange = () => {\n const element = document.getElementById(\n window.location.hash.substring(1)\n );\n if (element) {\n const y =\n element.getBoundingClientRect().top + window.scrollY - yOffset;\n window.scrollTo({ top: y, behavior: \"smooth\" });\n }\n };\n\n window.addEventListener(\"hashchange\", handleHashChange);\n\n return () => {\n window.removeEventListener(\"hashchange\", handleHashChange);\n };\n }, [yOffset]);\n\n return outline?.length ? (\n <ul ref={ref} className={className} {...rest}>\n {outline?.map((item, index) => {\n return (\n <li\n key={item?.key + index}\n className={clsx(\n activiedId === item?.key ? \"actived\" : \"\",\n itemClassName\n )}\n >\n <a\n href={`#${item?.key}`}\n onClick={(e) => {\n e.preventDefault();\n const element = document.getElementById(item?.key);\n if (element) {\n const y =\n element.getBoundingClientRect().top +\n window.scrollY +\n yOffset;\n window.scrollTo({ top: y, behavior: \"smooth\" });\n }\n }}\n >\n {item?.text}\n </a>\n </li>\n );\n })}\n </ul>\n ) : null;\n});\n","import React from \"react\";\n\nexport interface IconListType {\n [key: string]: {\n title: string;\n path: React.ReactElement;\n url: (l: string, t?: string, ti?: string) => string;\n color: string;\n viewBox?: string;\n };\n}\n\nexport const iconList: IconListType = {\n linkedin: {\n title: \"LinkedIn\",\n path: (\n <path d=\"M6.5 21.5h-5v-13h5v13zM4 6.5C2.5 6.5 1.5 5.3 1.5 4s1-2.4 2.5-2.4c1.6 0 2.5 1 2.6 2.5 0 1.4-1 2.5-2.6 2.5zm11.5 6c-1 0-2 1-2 2v7h-5v-13h5V10s1.6-1.5 4-1.5c3 0 5 2.2 5 6.3v6.7h-5v-7c0-1-1-2-2-2z\" />\n ),\n color: \"#0073b1\",\n url: (l, t, ti) =>\n `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(l)}&title=${encodeURIComponent(ti || \"\")}&summary=${encodeURIComponent(t || \"\")}`,\n },\n facebook: {\n title: \"Facebook\",\n path: (\n <path d=\"M24 12a12 12 0 10-13.9 11.9v-8.4h-3V12h3V9.4c0-3 1.8-4.7 4.6-4.7l2.6.2v3h-1.5c-1.5 0-2 .9-2 1.8V12h3.4l-.5 3.5h-2.8v8.4A12 12 0 0024 12z\" />\n ),\n color: \"#0076FB\",\n url: (l) => `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(l)}`,\n },\n twitter: {\n title: \"X\",\n path: (\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"></path>\n ),\n color: \"#0F1419\",\n url: (l, t) => `https://twitter.com/intent/tweet?text=${t}&url=${encodeURIComponent(l)}`,\n },\n whatsapp: {\n title: \"WhatsApp\",\n path: (\n <path d=\"M17.5 14.4l-2-1c-.3 0-.5-.1-.7.2l-1 1.1c-.1.2-.3.3-.6.1s-1.3-.5-2.4-1.5a9 9 0 01-1.7-2c-.1-.3 0-.5.2-.6l.4-.6c.2-.1.2-.3.3-.5v-.5L9 7c-.2-.6-.4-.5-.6-.5h-.6c-.2 0-.5 0-.8.4-.2.3-1 1-1 2.5s1 2.8 1.2 3c.2.2 2.1 3.2 5.1 4.5l1.7.6a4 4 0 001.9.2c.5-.1 1.7-.8 2-1.5.2-.6.2-1.2.1-1.4l-.5-.3M12 21.8a9.9 9.9 0 01-5-1.4l-.4-.2-3.7 1 1-3.7-.2-.3a9.9 9.9 0 01-1.5-5.3 9.9 9.9 0 0116.8-7 9.8 9.8 0 013 7 9.9 9.9 0 01-10 9.9m8.4-18.3A11.8 11.8 0 0012.1 0 12 12 0 001.8 17.8L0 24l6.4-1.6a11.9 11.9 0 005.6 1.4 12 12 0 0012-11.9 11.8 11.8 0 00-3.5-8.4z\" />\n ),\n color: \"#25D366\",\n url: (l, t) => `https://api.whatsapp.com/send?text=${encodeURIComponent(t || \"\")} ${encodeURIComponent(l)}`,\n },\n reddit: {\n title: \"Reddit\",\n path: (\n <path d=\"M12 0A12 12 0 000 12a12 12 0 0012 12 12 12 0 0012-12A12 12 0 0012 0zm5.01 4.74c.69 0 1.25.56 1.25 1.25a1.25 1.25 0 01-2.5.06l-2.6-.55-.8 3.75c1.83.07 3.48.63 4.68 1.49.3-.31.73-.5 1.2-.5.97 0 1.76.8 1.76 1.76 0 .72-.43 1.33-1.01 1.61a3.11 3.11 0 01.04.52c0 2.7-3.13 4.87-7 4.87-3.88 0-7-2.17-7-4.87 0-.18 0-.36.04-.53A1.75 1.75 0 014.03 12a1.75 1.75 0 012.96-1.26 8.52 8.52 0 014.74-1.5l.89-4.17a.34.34 0 01.14-.2.35.35 0 01.24-.04l2.9.62a1.21 1.21 0 011.11-.7zM9.25 12a1.25 1.25 0 101.25 1.25c0-.69-.56-1.25-1.25-1.25zm5.5 0a1.25 1.25 0 000 2.5 1.25 1.25 0 000-2.5zm-5.47 3.99a.33.33 0 00-.23.1.33.33 0 000 .46c.84.84 2.49.91 2.96.91.48 0 2.1-.06 2.96-.91a.36.36 0 00.03-.47.33.33 0 00-.46 0c-.55.54-1.68.73-2.51.73-.83 0-1.98-.2-2.51-.73a.33.33 0 00-.24-.1z\" />\n ),\n color: \"#FF4500\",\n url: (l, t) => `https://www.reddit.com/submit?url=${encodeURIComponent(l)}&title=${encodeURIComponent(t || \"\")}`,\n },\n // telegram: {\n // title: \"Telegram\",\n // path: (\n // <path d=\"M23.91 3.79L20.3 20.84c-.25 1.21-.98 1.5-2 .94l-5.5-4.07-2.66 2.57c-.3.3-.55.56-1.1.56-.72 0-.6-.27-.84-.95L6.3 13.7.85 12c-1.18-.35-1.19-1.16.26-1.75l21.26-8.2c.97-.43 1.9.24 1.53 1.73z\" />\n // ),\n // color: \"#0088CC\",\n // url: (l, t) => `https://telegram.me/share/msg?url=${encodeURIComponent(l)}&text=${encodeURIComponent(t || \"\")}`,\n // },\n\n // pinterest: {\n // title: \"Pinterest\",\n // path: (\n // <path d=\"M0 12C0 17.123 3.211 21.497 7.73 23.218C7.62 22.281 7.503 20.736 7.755 19.652C7.972 18.72 9.156 13.714 9.156 13.714C9.156 13.714 8.799 12.999 8.799 11.94C8.799 10.28 9.761 9.04 10.96 9.04C11.98 9.04 12.472 9.805 12.472 10.722C12.472 11.747 11.819 13.279 11.482 14.7C11.201 15.889 12.079 16.859 13.251 16.859C15.374 16.859 17.007 14.62 17.007 11.388C17.007 8.527 14.951 6.528 12.016 6.528C8.618 6.528 6.623 9.077 6.623 11.712C6.623 12.739 7.018 13.839 7.512 14.438C7.55412 14.4832 7.58387 14.5386 7.59841 14.5986C7.61295 14.6587 7.61177 14.7215 7.595 14.781C7.504 15.159 7.302 15.97 7.263 16.136C7.21 16.354 7.09 16.401 6.863 16.295C5.371 15.601 4.439 13.42 4.439 11.668C4.439 7.899 7.176 4.439 12.331 4.439C16.475 4.439 19.696 7.392 19.696 11.338C19.696 15.455 17.101 18.769 13.497 18.769C12.286 18.769 11.149 18.139 10.759 17.396C10.759 17.396 10.16 19.678 10.015 20.236C9.733 21.32 8.951 22.692 8.466 23.471C9.584 23.815 10.77 24 12 24C18.627 24 24 18.627 24 12C24 5.373 18.627 0 12 0C5.373 0 0 5.373 0 12Z\" />\n // ),\n // color: \"#c8232c\",\n // url: (l) => `http://pinterest.com/pin/create/link/?url=${encodeURIComponent(l)}`,\n // },\n // email: {\n // title: \"Email\",\n // path: (\n // <path d=\"M20 4H4a2 2 0 00-2 2v12c0 1.1.9 2 2 2h16a2 2 0 002-2V6a2 2 0 00-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\" />\n // ),\n // color: \"#E53E3E\",\n // url: (l, t) => `mailto:?body=${encodeURIComponent(l)}&subject=${encodeURIComponent(t || \"\")}`,\n // },\n};","import { forwardRef, useEffect, useState } from \"react\";\nimport type { IconListType } from \"./socials\";\nimport { iconList } from \"./socials\";\nimport clsx from \"clsx\";\n\nexport type ShareProps = {\n socials?: string[];\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n className?: string;\n classNames?: {\n item?: string;\n itemIcon?: string;\n };\n};\n\nfunction getPageDetails() {\n if (typeof window === \"undefined\") {\n return null;\n }\n const details = {\n url: window?.location?.href,\n title: document?.title || \"null\",\n description: \"null\", // 默认为空字符串\n };\n\n const descriptionMetaTag = document.querySelector('meta[name=\"description\"]');\n if (descriptionMetaTag) {\n details.description = (descriptionMetaTag as HTMLMetaElement).content;\n }\n\n return details;\n}\n\nexport const Share = forwardRef<HTMLDivElement, ShareProps>(\n (props: ShareProps, ref) => {\n const { className, classNames, ...rest } = props;\n const [socialList, setSolicalList] = useState<IconListType>();\n\n const details = getPageDetails();\n\n useEffect(() => {\n setSolicalList(iconList);\n }, [props.socials]);\n\n // 生成每个社交媒体的分享链接\n const generateLink = (key: string) => {\n const social = iconList[key];\n if (!social) return \"#\";\n return social.url(\n details?.url || \"\",\n details?.title,\n details?.description\n );\n };\n\n return (\n <div ref={ref} className={clsx(\"flex items-center\", className)} {...rest}>\n <div className=\"flex space-x-3\">\n {Object.keys(socialList || {}).map((key) => (\n <a\n key={key}\n href={generateLink(key)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={`Share on ${iconList[key].title}`}\n className={clsx(\n \"flex h-6 w-6 items-center justify-center \",\n classNames?.item\n )}\n >\n <svg\n className={clsx(\"w-5 h-5\", classNames?.itemIcon)}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n focusable=\"false\"\n aria-hidden=\"true\"\n >\n {iconList[key].path}\n </svg>\n </a>\n ))}\n </div>\n </div>\n );\n }\n);\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const defaultThreshold = 10;\n\nexport type ScrollerProps = {\n threshold?: number;\n};\n\nexport function Scroller(props: ScrollerProps) {\n const { threshold = defaultThreshold } = props;\n const ref = useRef<HTMLDivElement>(null);\n const [win, setWin] = useState<Window | null>(null);\n\n useEffect(() => {\n if (ref.current) {\n setWin(ref.current.ownerDocument.defaultView);\n }\n }, []);\n\n const onScroll = useCallback(() => {\n if (!win) return;\n const scrolled = win.scrollY > threshold;\n const doc = win.document;\n\n if (scrolled) {\n doc.body.classList.add(\"scrolled\");\n } else {\n doc.body.classList.remove(\"scrolled\");\n }\n }, [threshold, win]);\n\n useEffect(() => {\n if (!win) return;\n win.addEventListener(\"scroll\", onScroll);\n return () => win.removeEventListener(\"scroll\", onScroll);\n }, [onScroll, win]);\n\n return <div ref={ref} style={{ display: \"none\" }} />;\n}\n","import { forwardRef, useState } from \"react\";\n\nexport type SearchProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const SearchInput = forwardRef<HTMLInputElement, SearchProps>(\n (props, ref) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, ...rest } = props;\n const [keyword, setKeyword] = useState<string>();\n\n return (\n <input\n ref={ref}\n name=\"q\"\n value={keyword}\n onChange={(e) => setKeyword(e.target.value)}\n {...rest}\n />\n );\n }\n);\n","import clsx from \"clsx\";\nimport { forwardRef, useRef, useEffect, useState } from \"react\";\n\nexport type ToTopProps = {\n className?: string;\n svg?: string;\n};\n\nexport const topIcon = () => (\n <svg\n className=\"h-6 w-6\"\n width=\"1.5rem\"\n height=\"1.5rem\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);\n\nexport const ToTop = forwardRef<HTMLDivElement, ToTopProps>((props, ref) => {\n const { className, svg, ...rest } = props;\n const [win, setWin] = useState<Window | null>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n\n // 合并外部传入的ref和内部ref\n useEffect(() => {\n if (!innerRef.current) return;\n\n // 获取当前元素所在的window\n const currentWin = innerRef.current.ownerDocument.defaultView;\n setWin(currentWin);\n\n // 如果外部传入的是ref对象,则设置其current属性\n if (ref && typeof ref === \"object\") {\n ref.current = innerRef.current;\n }\n }, [ref]);\n\n const handleClick = () => {\n if (win) {\n win.scrollTo({ top: 0, behavior: \"smooth\" });\n } else if (typeof window !== \"undefined\") {\n // 降级处理:如果没有获取到特定window,使用全局window\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }\n };\n\n return (\n <div\n ref={innerRef}\n className={clsx(\n \"fixed bottom-4 right-4 hidden user-select-none shadow-lg scrolled:flex cursor-pointer transition duration-300 ease-in-out z-50\",\n className\n )}\n {...rest}\n onClick={handleClick}\n >\n {svg ? (\n <div className=\"contents\" dangerouslySetInnerHTML={{ __html: svg }} />\n ) : (\n topIcon()\n )}\n </div>\n );\n});\n","import { useEffect, useRef, type VideoHTMLAttributes } from \"react\";\n\nexport function BackgroundVideoPlayer(props: VideoHTMLAttributes<HTMLVideoElement>) {\n const { poster, src, className, ...restProps } = props;\n const videoRef = useRef<HTMLVideoElement>(null);\n\n useEffect(() => {\n if (videoRef.current) {\n const video = videoRef.current;\n\n // 确保视频可以自动播放\n video.play().catch((error) => {\n console.log(\"自动播放失败:\", error);\n });\n }\n }, []);\n\n return (\n <video\n ref={videoRef}\n autoPlay\n loop\n muted\n playsInline\n poster={poster}\n className={className}\n preload=\"metadata\"\n src={src}\n {...restProps}\n ></video>\n );\n}\n","import { useEffect, useRef, type VideoHTMLAttributes } from \"react\";\nimport Hls from \"hls.js\";\n\n// 需要过滤掉的非 video 属性(Astro runtime 透传的方法/对象)\nconst FORBIDDEN_PROPS = new Set([\n 'createMetadata',\n 'createComponent',\n 'createAstro',\n 'renderComponent',\n 'renderSlot',\n 'render',\n 'addAttribute',\n 'spreadAttributes',\n 'defineStyleVars',\n 'defineScriptVars',\n 'Fragment',\n 'unescapeHTML',\n 'maybeRenderHead',\n 'renderHead',\n 'slots',\n 'props',\n 'children',\n]);\n\nexport function BackgroundHlsVideoPlayer(\n props: VideoHTMLAttributes<HTMLVideoElement>\n) {\n const { poster, src, className, ...rawRestProps } = props;\n // 过滤掉 Astro runtime 透传的非 video 属性\n const restProps: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rawRestProps)) {\n if (FORBIDDEN_PROPS.has(k)) continue;\n if (k.startsWith('_')) continue;\n if (typeof v === 'function') continue;\n restProps[k] = v;\n }\n const videoRef = useRef<HTMLVideoElement>(null);\n\n useEffect(() => {\n if (!videoRef.current || !src) return;\n\n const video = videoRef.current;\n\n if (!Hls.isSupported()) {\n if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = src;\n video.play().catch(() => {});\n }\n return;\n }\n\n const hls = new Hls({\n enableWorker: true,\n });\n\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play().catch(() => {});\n });\n\n hls.on(Hls.Events.ERROR, (event, data) => {\n if (data.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n hls.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n hls.recoverMediaError();\n break;\n default:\n hls.destroy();\n break;\n }\n }\n });\n\n hls.loadSource(src);\n hls.attachMedia(video);\n\n return () => {\n hls.destroy();\n };\n }, [src]);\n\n return (\n <video\n ref={videoRef}\n autoPlay\n loop\n muted\n playsInline\n poster={poster}\n className={className}\n preload=\"metadata\"\n {...restProps}\n ></video>\n );\n}\n","import { Bulletin as BulletinModel } from \"@rxdrag/rxcms-models\";\nimport { useEffect, useState } from \"react\";\n\nexport function Bulletin(props: { className?: string }) {\n const { className, ...rest } = props;\n const [bulletin, setBulletin] = useState<BulletinModel | null>(null);\n\n useEffect(() => {\n fetch(\"/api/get-bulletin\")\n .then((res) => res.json())\n .then((res) => {\n if (res.success) {\n setBulletin(res.data);\n }\n })\n .catch((err) => {\n console.error(\"Failed to fetch bulletin\", err);\n });\n }, []);\n\n console.log(\"====>bulletin\", bulletin)\n\n if (!bulletin) return null;\n\n return (\n <div className={className} {...rest}>\n {bulletin.content}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function ReactModalTrigger(props: {\n className?: string;\n openableKey?: string;\n callToAction?: string;\n children?: ReactNode;\n}) {\n const {\n className,\n callToAction,\n openableKey = \"enquiry-modal\",\n children,\n } = props;\n const roleProps = {\n \"data-modal-open\": openableKey,\n \"data-call-to-action\": callToAction,\n };\n return (\n <button\n {...roleProps}\n className={className}\n type=\"button\"\n >\n {children || \"Get a quote\"}\n </button>\n );\n}\n","import { clsx } from \"clsx\";\n\nexport function VideoPlayIcon(props: {\n classNames?: {\n playButton?: string;\n playButtonOuter?: string;\n playButtonInner?: string;\n playIcon?: string;\n };\n}) {\n const { classNames } = props;\n return (\n <div\n className={clsx(\n \"flex items-center justify-center w-14 h-14 lg:w-[130px] lg:h-[130px] bg-white/15 rounded-full backdrop-blur-sm hover:shadow-md transition-all duration-300 hover:scale-110 group\",\n classNames?.playButtonOuter,\n )}\n >\n <div\n className={clsx(\n \"w-10 h-10 lg:w-[90px] lg:h-[90px] bg-white relative overflow-hidden rounded-full\",\n classNames?.playButtonInner,\n )}\n >\n <div className=\"absolute inset-0 cross-gradient box-shadow-1\">\n <div className=\"w-full h-full flex items-center justify-center\">\n <svg\n className={clsx(\n \"size-4 lg:size-8 text-gray-700\",\n classNames?.playIcon,\n )}\n viewBox=\"0 0 30 32\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M27.2003 19.4972C29.945 17.9735 29.945 14.0264 27.2003 12.5027L6.44148 0.978573C3.77538 -0.501503 0.5 1.42643 0.5 4.47581V27.5241C0.5 30.5735 3.77537 32.5014 6.44147 31.0214L27.2003 19.4972Z\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n} from \"react\";\nimport Hls from \"hls.js\";\nimport type { Media } from \"@rxdrag/rxcms-models\";\nimport { ReactModalTrigger } from \"./ReactModalTrigger\";\nimport clsx from \"clsx\";\nimport { VideoPlayIcon } from \"./VideoPlayIcon\";\n\nexport type ID = string | number;\n\nexport type VideoPlayerClassNames = {\n container?: string;\n aspect?: string;\n video?: string;\n playButton?: string;\n playButtonOuter?: string;\n playButtonInner?: string;\n playIcon?: string;\n loadingOverlay?: string;\n loadingContent?: string;\n overlay?: string;\n overlayTitle?: string;\n ctaButton?: string;\n overlayReplayButton?: string;\n};\n\nexport const ReactVideoPlayer = forwardRef<\n HTMLDivElement,\n {\n endTitle?: string;\n media?: Media;\n posterUrl?: string;\n eagerLoad?: boolean;\n classNames?: VideoPlayerClassNames;\n callToAction?: string;\n onToggleSelect?: (id: ID) => void;\n designMode?: boolean;\n children?: React.ReactNode;\n \n }\n>((props, ref) => {\n const {\n endTitle,\n media,\n onToggleSelect,\n posterUrl,\n eagerLoad,\n classNames,\n callToAction,\n designMode,\n children,\n ...rest\n } = props;\n const videoRef = useRef<HTMLVideoElement>(null);\n const hlsRef = useRef<Hls | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isEnded, setIsEnded] = useState(false);\n const [isSourceReady, setIsSourceReady] = useState(false);\n const sourceReadyRef = useRef(false);\n const [isLoading, setIsLoading] = useState(false);\n const isEndedRef = useRef(false);\n const [hasStarted, setHasStarted] = useState(false);\n\n const ensureSourceReady = useCallback(() => {\n const video = videoRef.current;\n const url = media?.file?.original;\n if (!video || !url) return false;\n if (sourceReadyRef.current) return true;\n\n if (media?.storageType === \"cloudflare_stream\") {\n if (!Hls.isSupported()) {\n if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = url;\n sourceReadyRef.current = true;\n setIsSourceReady(true);\n return true;\n }\n return false;\n }\n\n const hls = new Hls({ enableWorker: true });\n hls.on(Hls.Events.ERROR, (_event, data) => {\n if (data.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n hls.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n hls.recoverMediaError();\n break;\n default:\n hls.destroy();\n break;\n }\n }\n });\n hls.loadSource(url);\n hls.attachMedia(video);\n hlsRef.current = hls;\n sourceReadyRef.current = true;\n setIsSourceReady(true);\n return true;\n }\n\n video.src = url;\n sourceReadyRef.current = true;\n setIsSourceReady(true);\n return true;\n }, [media?.file?.original, media?.storageType]);\n\n const handleContainerClick = useCallback(\n (e: React.MouseEvent) => {\n if (designMode) return;\n if (isPlaying && videoRef.current) {\n e.stopPropagation();\n videoRef.current.pause();\n return;\n }\n if (media?.id != null) {\n onToggleSelect?.(media.id);\n }\n },\n [isPlaying, media?.id, onToggleSelect, designMode],\n );\n\n const handlePlayClick = useCallback(\n (e: React.MouseEvent) => {\n if (designMode) return;\n e.stopPropagation();\n const v = videoRef.current;\n if (!v) return;\n if (isPlaying) {\n v.pause();\n return;\n }\n\n const ok = ensureSourceReady();\n if (!ok) return;\n\n setIsLoading(true);\n\n v.play().catch((error) => {\n console.log(\"ReactVideoPlayer play() failed:\", error);\n setIsLoading(false);\n });\n },\n [isPlaying, designMode, ensureSourceReady],\n );\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n video.pause();\n if (hlsRef.current) {\n hlsRef.current.destroy();\n hlsRef.current = null;\n }\n video.removeAttribute(\"src\");\n video.load();\n setIsSourceReady(false);\n sourceReadyRef.current = false;\n\n const onPlay = () => {\n setIsPlaying(true);\n setIsEnded(false);\n isEndedRef.current = false;\n setIsLoading(false);\n setHasStarted(true);\n };\n const onPause = () => setIsPlaying(false);\n const onEnded = () => {\n setIsPlaying(false);\n setIsEnded(true);\n isEndedRef.current = true;\n setIsLoading(false);\n };\n const onWaiting = () => {\n if (!isEndedRef.current) setIsLoading(true);\n };\n const onCanPlay = () => {\n setIsLoading(false);\n };\n\n video.addEventListener(\"play\", onPlay);\n video.addEventListener(\"pause\", onPause);\n video.addEventListener(\"ended\", onEnded);\n video.addEventListener(\"waiting\", onWaiting);\n video.addEventListener(\"canplay\", onCanPlay);\n video.addEventListener(\"playing\", onCanPlay);\n\n if (eagerLoad) {\n ensureSourceReady();\n }\n\n return () => {\n video.removeEventListener(\"play\", onPlay);\n video.removeEventListener(\"pause\", onPause);\n video.removeEventListener(\"ended\", onEnded);\n video.removeEventListener(\"waiting\", onWaiting);\n video.removeEventListener(\"canplay\", onCanPlay);\n video.removeEventListener(\"playing\", onCanPlay);\n\n if (hlsRef.current) {\n hlsRef.current.destroy();\n hlsRef.current = null;\n }\n };\n }, [eagerLoad, ensureSourceReady, media?.file?.original, media?.storageType]);\n\n return (\n <div\n ref={ref}\n className={clsx(\n \"relative w-full rounded-2xl\",\n classNames?.aspect ?? \"aspect-video\",\n classNames?.container,\n )}\n onClick={handleContainerClick}\n {...rest}\n >\n <video\n ref={videoRef}\n onClick={(e) => !designMode && e.stopPropagation()}\n preload={eagerLoad ? \"metadata\" : \"none\"}\n poster={posterUrl ?? media?.file?.thumbnail}\n className={clsx(\n \"w-full h-full rounded-lg object-cover\",\n classNames?.video,\n )}\n playsInline\n controls={!designMode && hasStarted}\n disablePictureInPicture\n controlsList=\"nodownload noremoteplayback noplaybackrate\"\n >\n {!media?.storageType &&\n media?.file?.original &&\n (eagerLoad || isSourceReady) ? (\n <source src={media.file.original} />\n ) : null}\n Your browser does not support video playback.\n </video>\n\n {!isPlaying && !isEnded && !isLoading && (\n <button\n type=\"button\"\n onClick={handlePlayClick}\n className={clsx(\n \"absolute inset-0 items-center justify-center w-full h-full transition rounded-lg z-10\",\n hasStarted ? \"hidden md:flex\" : \"flex\",\n classNames?.playButton,\n )}\n >\n {children || <VideoPlayIcon classNames={classNames} />}\n </button>\n )}\n\n {!isPlaying && !isEnded && isLoading && (\n <div\n className={clsx(\n \"absolute inset-0 flex items-center justify-center w-full h-full rounded-lg z-10 bg-black/20\",\n classNames?.loadingOverlay,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n className={clsx(\n \"flex items-center gap-3 rounded-full bg-black/50 px-4 py-2 text-white\",\n classNames?.loadingContent,\n )}\n >\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n <span className=\"text-sm\">Loading...</span>\n </div>\n </div>\n )}\n\n <div\n className={clsx(\n \"absolute inset-0 bg-black/50 flex-col gap-6 items-center justify-center text-center text-white hidden z-10 rounded-2xl\",\n classNames?.overlay,\n )}\n style={{ display: isEnded ? \"flex\" : \"none\" }}\n >\n <p\n className={clsx(\"text-4xl drop-shadow-lg\", classNames?.overlayTitle)}\n >\n {endTitle ?? \"Contact Us Now\"}\n </p>\n <div className=\"flex items-center gap-4\">\n <ReactModalTrigger\n className={clsx(\n \"btn btn-primary px-10 py-2.5 rounded-full ripple\",\n classNames?.ctaButton,\n )}\n callToAction={callToAction}\n >\n Consult Now\n </ReactModalTrigger>\n <button\n type=\"button\"\n className={clsx(\n \"px-10 py-2.5 bg-white/20 hover:bg-white/30 rounded-full transition text-sm\",\n classNames?.overlayReplayButton,\n )}\n onClick={(e) => {\n e.stopPropagation();\n const v = videoRef.current;\n if (!v) return;\n const ok = ensureSourceReady();\n if (!ok) return;\n setIsLoading(true);\n v.currentTime = 0;\n setIsEnded(false);\n v.play().catch((error) => {\n console.log(\"ReactVideoPlayer play() failed:\", error);\n setIsLoading(false);\n });\n }}\n >\n Replay\n </button>\n </div>\n </div>\n </div>\n );\n});\n","import { Analytics } from \"./Analytics\";\nimport { AttachmentIcon } from \"./AttachmentIcon\";\nimport { BackgroundHlsVideoPlayer } from \"./BackgroundHlsVideoPlayer\";\nimport { BackgroundVideoPlayer } from \"./BackgroundVideoPlayer\";\nimport { Bulletin } from \"./Bulletin\";\nimport { ContactForm } from \"./ContactForm\";\nimport { Icon } from \"./Icon\";\nimport { Medias } from \"./Medias\";\nimport { ProductCard, ProductCta, ProductDescription, ProductMedia, ProductTitle } from \"./ProductCard\";\nimport { ReactModalTrigger } from \"./ReactModalTrigger\";\nimport { ReactVideoPlayer } from \"./ReactVideoPlayer\";\nimport { RichTextOutline } from \"./RichTextOutline\";\nimport { Scroller } from \"./Scroller\";\nimport { SearchInput } from \"./SearchInput\";\nimport { Share } from \"./Share\";\nimport { ToTop } from \"./ToTop\";\n\nexport const allCoreComponents = {\n Analytics,\n AttachmentIcon,\n BackgroundHlsVideoPlayer,\n BackgroundVideoPlayer,\n Bulletin,\n ContactForm,\n Icon,\n Medias,\n ProductCard,\n ProductCta,\n ProductDescription,\n ProductMedia,\n ProductTitle,\n ReactModalTrigger,\n ReactVideoPlayer,\n RichTextOutline,\n Scroller,\n SearchInput,\n Share,\n ToTop,\n};"],"names":["jsxRuntimeModule","require$$0","require$$1","jsx","jsxs","Fragment","error","countries","defaultCountries","className","rest","IconifyIcon","React","_a","style","clsx"],"mappings":";;;;;;;;;;;;AAGO,SAAS,2BAAoC;AAClD,SACE,OAAO,SAAS,aAAa,eAC7B,OAAO,SAAS,SAAS,WAAW,UAAU,KAC9C,OAAO,SAAS,aAAa;AAEjC;AAGO,SAAS,oBAAoB;AAClC,QAAM,QAAQ;AACP,SAAA,SAAS,YAAY,MAAiB;AAC3C,QAAI,OAAO;AACD,cAAA,IAAI,eAAe,GAAG,IAAI;AAAA,IACpC;AAAA,EAAA;AAEJ;AAGgB,SAAA,WAAW,SAAS,KAAa;AAC/C,SACE,SACA,KAAK,IAAI,EAAE,SAAS,EAAE,IACtB,KAAK,SAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAE7C;AAGgB,SAAA,UAAU,MAAc,OAAe,MAAoB;AACnE,QAAA,8BAAc;AACZ,UAAA,QAAQ,QAAQ,QAAQ,IAAI,OAAO,KAAK,KAAK,KAAK,GAAI;AACrD,WAAA,SAAS,GAAG,IAAI,IAAI,KAAK,YAAY,QAAQ,YAAa,CAAA;AACrE;AAGO,SAAS,UAAU,MAA6B;AAC/C,QAAA,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI,OAAO,UAAU,OAAO,UAAU;AAAA,EAAA;AAEjC,SAAA,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAGO,SAAS,eAAuB;AACjC,MAAA,YAAY,UAAU,YAAY;AACtC,MAAI,CAAC,WAAW;AACd,gBAAY,WAAW,GAAG;AAChB,cAAA,cAAc,WAAW,GAAG;AAAA,EACxC;AACO,SAAA;AACT;AAGO,SAAS,gBAAwB;AACtC,QAAM,KAAK,UAAU;AACjB,MAAA,6BAA6B,KAAK,EAAE,GAAG;AACzC,WAAO,OAAO,KAAK,EAAE,IAAI,WAAW;AAAA,EACtC;AACO,SAAA;AACT;AAGO,SAAS,cAAsB;AACpC,QAAM,KAAK,UAAU;AACjB,MAAA,UAAU,KAAK,EAAE;AAAU,WAAA;AAC3B,MAAA,MAAM,KAAK,EAAE;AAAU,WAAA;AACvB,MAAA,QAAQ,KAAK,EAAE;AAAU,WAAA;AACzB,MAAA,UAAU,KAAK,EAAE;AAAU,WAAA;AAC3B,MAAA,cAAc,KAAK,EAAE;AAAU,WAAA;AAC5B,SAAA;AACT;AAGO,SAAS,qBAA6B;AAEpC,SAAA,UAAU,YAAa,UAAkB,gBAAgB;AAClE;AAGgB,SAAA,eAAe,cAAc,YAAoB;AAC/D,QAAM,cAAc,OAAO,SAAS,SAAS,YAAY;AAGzD,MACE,YAAY,SAAS,SAAS,KAC9B,YAAY,SAAS,YAAY,GACjC;AACO,WAAA;AAAA,EACT;AAEO,SAAA;AACT;ACnFO,SAAS,iBAAiB,OAA6B;AAC5D,MAAI,MAAM,eAAe;AACjB,UAAA,MAAM,KAAK;AACX,UAAA,cAAc,MAAM,MAAM;AAChC,UAAM,iBAAiB;AAAA,EACzB;AACF;AAmBO,SAAS,gBAAgB,OAAgC;AACxD,QAAA,MAAM,KAAK;AAGjB,MAAI,MAAM,eAAe;AAChB,WAAA;AAAA,EACT;AAGA,MAAI,MAAM,gBAAgB,KAAK,MAAM,MAAM,gBAAgB,KAAM;AACxD,WAAA;AAAA,EACT;AAGA,MAAI,SAAS,UAAU,SAAS,oBAAoB,UAAU;AACrD,WAAA;AAAA,EACT;AAEO,SAAA;AACT;AAGgB,SAAA,aAAa,OAAuB,aAA2B;AAC7E,QAAM,mBAAmB;AAErB,MAAA,MAAM,aAAa,SAAS,GAAG;AACjC,UAAM,EAAE,MAAM,UAAA,IAAc,MAAM,aAAa;AAE/C,eAAW,MAAM;AACC,sBAAA,MAAM,WAAW,OAAO,WAAW;AAAA,OAClD,GAAG;AAAA,EACR;AACF;AAGO,SAAS,gBACd,MACA,WACA,OACA,aACM;AACN,QAAM,mBAAmB;AAEzB,QAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,IACtB;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,WAAW;AAAA,EAAA,CACZ,EACE,KAAK,MAAM;AACV,QAAI,cAAc,YAAY;AAC5B,YAAM,gBAAgB;AAChB,YAAA,gBAAgB,KAAK;AAGvB,UAAA,OAAO,WAAW,aAAa;AAChC,eAAe,yBAAyB;AAAA,UACvC,aAAa,OAAO,SAAS;AAAA,UAC7B,eAAe,KAAK,IAAI;AAAA,QAAA;AAAA,MAE5B;AAAA,IACF;AAGA,iBAAa,OAAO,WAAW;AAAA,EAAA,CAChC,EACA,MAAM,MAAM;AACX,iBAAa,OAAO,WAAW;AAAA,EAAA,CAChC;AACL;AAGO,SAAS,iBACd,MACA,WACA,OACA,aACM;AAEN,MAAI,cAAc,aAAa;AACb,oBAAA,MAAM,WAAW,OAAO,WAAW;AACnD;AAAA,EACF;AAGA,MAAI,MAAM,kBAAkB;AAE1B,UAAM,aAAa,KAAK,EAAE,MAAM,UAAW,CAAA;AAC3C;AAAA,EACF;AAEgB,kBAAA,MAAM,WAAW,OAAO,WAAW;AACrD;AAGO,SAAS,mBACd,UACA,OACA,WACA,mBACc;AACP,SAAA;AAAA,IACL,YAAY,SAAS;AAAA,IACrB,YAAY,SAAS;AAAA,IACrB,KAAK,OAAO,SAAS;AAAA,IACrB,MAAM,OAAO,SAAS;AAAA,IACtB,UAAU,MAAM;AAAA,IAChB,YAAY,SAAS;AAAA,IACrB,aAAa;AAAA;AAAA,IACb,WAAW,KAAK,IAAI;AAAA,IACpB,MAAM;AAAA;AAAA;AAAA,IAEN,QAAQ,cAAc;AAAA,IACtB,UAAU,YAAY;AAAA,IACtB,kBAAkB,mBAAmB;AAAA;AAAA,IAErC,YAAY,SAAS,SAAS;AAAA;AAAA,IAE9B,cAAc,OAAO;AAAA,IACrB,eAAe,OAAO;AAAA,IACtB,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA;AAAA,IAExB,UAAU,KAAK,iBAAiB,gBAAkB,EAAA;AAAA;AAAA,IAElD,aACE,CAAC,UAAU,YAAY,KACvB,UAAU,YAAY,MAAM,SAAS;AAAA,EAAA;AAE3C;AAGO,SAAS,eACd,WACA,UACA,OACA,aACA,UACM;AAEN,MAAI,cAAc,YAAY;AAC5B,gBAAY,eAAe,SAAS;AACpC,aAAS,uBAAuB,SAAS;AAGrC,QAAA,CAAC,gBAAgB,KAAK,GAAG;AAC3B;AAAA,IACF;AAAA,EACF;AAGA,MAAI,oBAAoB;AACxB,MAAI,cAAc,aAAa;AAC7B,qBAAiB,KAAK;AACtB,wBAAoB,MAAM;AAAA,EAC5B;AAEA,WAAS,mBAAmB,MAAM,iBAAiB,cAAc,SAAS;AAE1E,QAAM,OAAO,mBAAmB,UAAU,OAAO,WAAW,iBAAiB;AAG5D,mBAAA,MAAM,WAAW,OAAO,WAAW;AACtD;ACjMA,MAAM,sBAAN,MAAM,oBAAmB;AAAA,EASf,YAAY,aAAqB;AAPjC,uCAAc;AACd;AACA;AACA;AACA;AACA,yCAAmC,CAAA;AAGzC,SAAK,cAAc;AACnB,SAAK,WAAW;AAGhB,UAAM,YAAY;AACd,QAAA,YAAY,eAAe,QAAQ,YAAY;AACnD,QAAI,CAAC,WAAW;AACd,kBAAY,WAAW,GAAG;AACX,qBAAA,QAAQ,cAAc,SAAS;AAAA,IAChD;AAGA,SAAK,WAAW;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,KAAK,OAAO,SAAS;AAAA,MACrB,MAAM,OAAO,SAAS;AAAA,MACtB,UAAU,SAAS,YAAY;AAAA,MAC/B,YAAY,UAAU;AAAA,MACtB,YAAY,KAAK,IAAI;AAAA,IAAA;AAIvB,SAAK,QAAQ;AAAA,MACX,eAAe;AAAA,MACf,gBAAgB,OAAO,SAAS;AAAA,MAChC,cAAc,KAAK,IAAI;AAAA,MACvB,eAAe;AAAA,MACf,iBAAiB,SAAS,YAAY;AAAA,MACtC,YAAY;AAAA,MACZ,gBAAgB,KAAK,IAAI;AAAA,MACzB,eAAe,CAAC,SAAS;AAAA,MACzB,cAAc,CAAC;AAAA,MACf,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,IAAA;AAAA,EAGzB;AAAA,EAEA,OAAO,YAAY,cAAc,sBAA0C;AACrE,QAAA,CAAC,oBAAmB,UAAU;AACb,0BAAA,WAAW,IAAI,oBAAmB,WAAW;AAAA,IAClE;AACA,WAAO,oBAAmB;AAAA,EAC5B;AAAA,EAEA,OAAO,QAAc;AACnB,QAAI,oBAAmB,UAAU;AAC/B,0BAAmB,SAAS;AAC5B,0BAAmB,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,SAAK,oBAAoB;AACzB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,sBAA4B;AAElC,UAAM,kBAAkB,MAAM;AAC5B,UAAI,KAAK,MAAM,oBAAoB,KAAK,MAAM,kBAAkB,GAAG;AACjE;AAAA,MACF;AAEA,WAAK,MAAM,mBAAmB;AACf,qBAAA,aAAa,KAAK,UAAU,KAAK,OAAO,KAAK,aAAa,KAAK,QAAQ;AAAA,IAAA;AAIlF,UAAA,qBAAqB,MAAM;AAC3B,UAAA,iBAAiB,MAAM;AAEtB,WAAA,iBAAiB,gBAAgB,kBAAkB;AACnD,WAAA,iBAAiB,YAAY,cAAc;AAGlD,UAAM,wBAAwB,MAAM;AAClB;IAAA;AAGlB,UAAM,uBAAuB,MAAM;AACjC,WAAK,MAAM,qBAAqB;AAE1B,YAAA,SAAS,OAAO,SAAS;AAC3B,UAAA,WAAW,KAAK,MAAM,gBAAgB;AAEnC,aAAA,MAAM,kBAAkB,KAAK,MAAM;AAGxC,aAAK,MAAM,iBAAiB;AAC5B,aAAK,SAAS,MAAM;AACf,aAAA,SAAS,OAAO,OAAO,SAAS;AAChC,aAAA,SAAS,aAAa,KAAK,IAAI;AAC/B,aAAA,MAAM,eAAe,KAAK,IAAI;AACnC,aAAK,MAAM,gBAAgB;AAC3B,aAAK,MAAM,mBAAmB;AAC9B,aAAK,MAAM,aAAa;AACnB,aAAA,MAAM,iBAAiB,KAAK,IAAI;AAChC,aAAA,MAAM,gBAAgB,CAAC,SAAS;AAGrC,aAAK,eAAe;AAAA,MACtB;AAAA,IAAA;AAGO,aAAA,iBAAiB,qBAAqB,qBAAqB;AAC3D,aAAA,iBAAiB,oBAAoB,oBAAoB;AAGlE,UAAM,yBAAyB,MAAM;AAC7B,YAAA,MAAM,KAAK;AACb,UAAA,SAAS,oBAAoB,WAAW;AAC1C,aAAK,MAAM,gBAAgB;AAC3B,aAAK,MAAM,iBAAiB;AAAA,MAAA,OACvB;AACD,YAAA,KAAK,MAAM,eAAe;AAC5B,eAAK,MAAM,cAAc,MAAM,KAAK,MAAM;AAAA,QAC5C;AACA,aAAK,MAAM,gBAAgB;AAAA,MAC7B;AAAA,IAAA;AAGO,aAAA,iBAAiB,oBAAoB,sBAAsB;AAGpE,UAAM,wBAAwB,MAAM;AAClC,UAAI,CAAC,KAAK,MAAM,iBAAiB,KAAK,MAAM;AAAsB;AAE5D,YAAA,MAAM,KAAK;AACb,UAAA,MAAM,KAAK,MAAM,sBAAsB;AAAM;AAEjD,WAAK,MAAM,sBAAsB;AACjC,WAAK,MAAM,uBAAuB;AAElC,UAAI,MAAM,KAAK,MAAM,iBAAiB,KAAO;AAC3C,aAAK,MAAM,iBAAiB;AAAA,MAC9B;AAEA,iBAAW,MAAM;AACf,aAAK,MAAM,uBAAuB;AAAA,SACjC,GAAI;AAAA,IAAA;AAGT,UAAM,oBAAoB,CAAC,SAAS,WAAW,QAAQ;AACrC,sBAAA,QAAQ,CAAC,UAAU;AAC1B,eAAA,iBAAiB,OAAO,uBAAuB;AAAA,QACtD,SAAS;AAAA,QACT,SAAS;AAAA,MAAA,CACV;AAAA,IAAA,CACF;AAGD,SAAK,gBAAgB;AAAA,MACnB,MAAM,OAAO,oBAAoB,gBAAgB,kBAAkB;AAAA,MACnE,MAAM,OAAO,oBAAoB,YAAY,cAAc;AAAA,MAC3D,MAAM,SAAS,oBAAoB,qBAAqB,qBAAqB;AAAA,MAC7E,MAAM,SAAS,oBAAoB,oBAAoB,oBAAoB;AAAA,MAC3E,MAAM,SAAS,oBAAoB,oBAAoB,sBAAsB;AAAA,MAC7E,GAAG,kBAAkB;AAAA,QAAI,CACvB,UAAA,MAAM,SAAS,oBAAoB,OAAO,qBAAqB;AAAA,MACjE;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,wBAA8B;AACpC,QAAI,KAAK,MAAM,iBAAiB,KAAK,MAAM,oBAAoB;AAC7D;AAAA,IACF;AAEA,SAAK,MAAM,qBAAqB;AAChC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,iBAAuB;AACd,mBAAA,YAAY,KAAK,UAAU,KAAK,OAAO,KAAK,aAAa,KAAK,QAAQ;AAAA,EACvF;AAAA,EAEA,UAAgB;AACd,SAAK,cAAc,QAAQ,CAAW,YAAA,QAAS,CAAA;AAC/C,SAAK,gBAAgB;AACrB,SAAK,cAAc;AAAA,EACrB;AACF;AAzME,cADI,qBACW,YAAsC;AADvD,IAAM,qBAAN;ACLO,SAAS,UAAU;AAAA,EACxB,cAAc;AAChB,GAAmB;AACjB,YAAU,MAAM;AAER,UAAA,YAAY,mBAAmB,YAAY,WAAW;AAC5D,cAAU,KAAK;AAGf,WAAO,MAAM;AAAA,IAAA;AAAA,EAEb,GACC,CAAC,WAAW,CAAC;AAGT,SAAA;AACT;;;;;;;;;;;;;;;;;ACTA,MAAI,qBAAqB,OAAO,IAAI,4BAA4B,GAC9D,sBAAsB,OAAO,IAAI,gBAAgB;AACnD,WAAS,QAAQ,MAAM,QAAQ,UAAU;AACvC,QAAI,MAAM;AACV,eAAW,aAAa,MAAM,KAAK;AACnC,eAAW,OAAO,QAAQ,MAAM,KAAK,OAAO;AAC5C,QAAI,SAAS,QAAQ;AACnB,iBAAW,CAAA;AACX,eAAS,YAAY;AACnB,kBAAU,aAAa,SAAS,QAAQ,IAAI,OAAO,QAAQ;AAAA,IACjE;AAAS,iBAAW;AAClB,aAAS,SAAS;AAClB,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,KAAK,WAAW,SAAS,SAAS;AAAA,MAClC,OAAO;AAAA,IACX;AAAA,EACC;AACe,6BAAA,WAAG;AACR,6BAAA,MAAG;AACd,6BAAA,OAAe;;;;;;;;;;;;;;;;;;ACtBf,mBAAiB,QAAQ,IAAI,YAC1B,WAAY;AACX,aAAS,yBAAyB,MAAM;AACtC,UAAI,QAAQ;AAAM,eAAO;AACzB,UAAI,eAAe,OAAO;AACxB,eAAO,KAAK,aAAa,yBACrB,OACA,KAAK,eAAe,KAAK,QAAQ;AACvC,UAAI,aAAa,OAAO;AAAM,eAAO;AACrC,cAAQ,MAAI;AAAA,QACV,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,MACV;AACD,UAAI,aAAa,OAAO;AACtB,gBACG,aAAa,OAAO,KAAK,OACxB,QAAQ;AAAA,UACN;AAAA,QACD,GACH,KAAK,UACf;AAAA,UACU,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO,KAAK,eAAe;AAAA,UAC7B,KAAK;AACH,oBAAQ,KAAK,SAAS,eAAe,aAAa;AAAA,UACpD,KAAK;AACH,gBAAI,YAAY,KAAK;AACrB,mBAAO,KAAK;AACZ,qBACI,OAAO,UAAU,eAAe,UAAU,QAAQ,IACnD,OAAO,OAAO,OAAO,gBAAgB,OAAO,MAAM;AACrD,mBAAO;AAAA,UACT,KAAK;AACH,mBACG,YAAY,KAAK,eAAe,MACjC,SAAS,YACL,YACA,yBAAyB,KAAK,IAAI,KAAK;AAAA,UAE/C,KAAK;AACH,wBAAY,KAAK;AACjB,mBAAO,KAAK;AACZ,gBAAI;AACF,qBAAO,yBAAyB,KAAK,SAAS,CAAC;AAAA,YAC7D,SAAqB,GAAG;AAAA,YAAE;AAAA,QACjB;AACH,aAAO;AAAA,IACR;AACD,aAAS,mBAAmB,OAAO;AACjC,aAAO,KAAK;AAAA,IACb;AACD,aAAS,uBAAuB,OAAO;AACrC,UAAI;AACF,2BAAmB,KAAK;AACxB,YAAI,2BAA2B;AAAA,MAChC,SAAQ,GAAG;AACV,mCAA2B;AAAA,MAC5B;AACD,UAAI,0BAA0B;AAC5B,mCAA2B;AAC3B,YAAI,wBAAwB,yBAAyB;AACrD,YAAI,oCACD,eAAe,OAAO,UACrB,OAAO,eACP,MAAM,OAAO,WAAW,KAC1B,MAAM,YAAY,QAClB;AACF,8BAAsB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,QACV;AACQ,eAAO,mBAAmB,KAAK;AAAA,MAChC;AAAA,IACF;AACD,aAAS,YAAY,MAAM;AACzB,UAAI,SAAS;AAAqB,eAAO;AACzC,UACE,aAAa,OAAO,QACpB,SAAS,QACT,KAAK,aAAa;AAElB,eAAO;AACT,UAAI;AACF,YAAI,OAAO,yBAAyB,IAAI;AACxC,eAAO,OAAO,MAAM,OAAO,MAAM;AAAA,MAClC,SAAQ,GAAG;AACV,eAAO;AAAA,MACR;AAAA,IACF;AACD,aAAS,WAAW;AAClB,UAAI,aAAa,qBAAqB;AACtC,aAAO,SAAS,aAAa,OAAO,WAAW,SAAQ;AAAA,IACxD;AACD,aAAS,eAAe;AACtB,aAAO,MAAM,uBAAuB;AAAA,IACrC;AACD,aAAS,YAAY,QAAQ;AAC3B,UAAI,eAAe,KAAK,QAAQ,KAAK,GAAG;AACtC,YAAI,SAAS,OAAO,yBAAyB,QAAQ,KAAK,EAAE;AAC5D,YAAI,UAAU,OAAO;AAAgB,iBAAO;AAAA,MAC7C;AACD,aAAO,WAAW,OAAO;AAAA,IAC1B;AACD,aAAS,2BAA2B,OAAO,aAAa;AACtD,eAAS,wBAAwB;AAC/B,uCACI,6BAA6B,MAC/B,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACZ;AAAA,MACO;AACD,4BAAsB,iBAAiB;AACvC,aAAO,eAAe,OAAO,OAAO;AAAA,QAClC,KAAK;AAAA,QACL,cAAc;AAAA,MACtB,CAAO;AAAA,IACF;AACD,aAAS,yCAAyC;AAChD,UAAI,gBAAgB,yBAAyB,KAAK,IAAI;AACtD,6BAAuB,aAAa,MAChC,uBAAuB,aAAa,IAAI,MAC1C,QAAQ;AAAA,QACN;AAAA,MACV;AACM,sBAAgB,KAAK,MAAM;AAC3B,aAAO,WAAW,gBAAgB,gBAAgB;AAAA,IACnD;AACD,aAAS,aAAa,MAAM,KAAK,OAAO,OAAO,YAAY,WAAW;AACpE,UAAI,UAAU,MAAM;AACpB,aAAO;AAAA,QACL,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MAChB;AACM,gBAAU,WAAW,UAAU,UAAU,QACrC,OAAO,eAAe,MAAM,OAAO;AAAA,QACjC,YAAY;AAAA,QACZ,KAAK;AAAA,MACjB,CAAW,IACD,OAAO,eAAe,MAAM,OAAO,EAAE,YAAY,OAAI,OAAO,KAAI,CAAE;AACtE,WAAK,SAAS;AACd,aAAO,eAAe,KAAK,QAAQ,aAAa;AAAA,QAC9C,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,eAAe,MAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,eAAe,MAAM,eAAe;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,eAAe,MAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO;AACD,aAAO,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG,OAAO,OAAO,IAAI;AAC/D,aAAO;AAAA,IACR;AACD,aAAS,WACP,MACA,QACA,UACA,kBACA,YACA,WACA;AACA,UAAI,WAAW,OAAO;AACtB,UAAI,WAAW;AACb,YAAI;AACF,cAAI,YAAY,QAAQ,GAAG;AACzB,iBACE,mBAAmB,GACnB,mBAAmB,SAAS,QAC5B;AAEA,gCAAkB,SAAS,gBAAgB,CAAC;AAC9C,mBAAO,UAAU,OAAO,OAAO,QAAQ;AAAA,UACxC;AACC,oBAAQ;AAAA,cACN;AAAA,YACd;AAAA;AACa,4BAAkB,QAAQ;AACjC,UAAI,eAAe,KAAK,QAAQ,KAAK,GAAG;AACtC,mBAAW,yBAAyB,IAAI;AACxC,YAAI,OAAO,OAAO,KAAK,MAAM,EAAE,OAAO,SAAU,GAAG;AACjD,iBAAO,UAAU;AAAA,QAC3B,CAAS;AACD,2BACE,IAAI,KAAK,SACL,oBAAoB,KAAK,KAAK,SAAS,IAAI,WAC3C;AACN,8BAAsB,WAAW,gBAAgB,MAC7C,OACA,IAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,IAAI,WAAW,MAC5D,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD,GACA,sBAAsB,WAAW,gBAAgB,IAAI;AAAA,MACzD;AACD,iBAAW;AACX,iBAAW,aACR,uBAAuB,QAAQ,GAAI,WAAW,KAAK;AACtD,kBAAY,MAAM,MACf,uBAAuB,OAAO,GAAG,GAAI,WAAW,KAAK,OAAO;AAC/D,UAAI,SAAS,QAAQ;AACnB,mBAAW,CAAA;AACX,iBAAS,YAAY;AACnB,oBAAU,aAAa,SAAS,QAAQ,IAAI,OAAO,QAAQ;AAAA,MACrE;AAAa,mBAAW;AAClB,kBACE;AAAA,QACE;AAAA,QACA,eAAe,OAAO,OAClB,KAAK,eAAe,KAAK,QAAQ,YACjC;AAAA,MACd;AACM,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAU;AAAA,QACV;AAAA,QACA;AAAA,MACR;AAAA,IACK;AACD,aAAS,kBAAkB,MAAM;AAC/B,qBAAe,IAAI,IACf,KAAK,WAAW,KAAK,OAAO,YAAY,KACxC,aAAa,OAAO,QACpB,SAAS,QACT,KAAK,aAAa,oBACjB,gBAAgB,KAAK,SAAS,SAC3B,eAAe,KAAK,SAAS,KAAK,KAClC,KAAK,SAAS,MAAM,WACnB,KAAK,SAAS,MAAM,OAAO,YAAY,KACxC,KAAK,WAAW,KAAK,OAAO,YAAY;AAAA,IACjD;AACD,aAAS,eAAe,QAAQ;AAC9B,aACE,aAAa,OAAO,UACpB,SAAS,UACT,OAAO,aAAa;AAAA,IAEvB;AACD,QAAI,QAAQ,YACV,qBAAqB,OAAO,IAAI,4BAA4B,GAC5D,oBAAoB,OAAO,IAAI,cAAc,GAC7C,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,yBAAyB,OAAO,IAAI,mBAAmB,GACvD,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,qBAAqB,OAAO,IAAI,eAAe,GAC/C,yBAAyB,OAAO,IAAI,mBAAmB,GACvD,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,2BAA2B,OAAO,IAAI,qBAAqB,GAC3D,kBAAkB,OAAO,IAAI,YAAY,GACzC,kBAAkB,OAAO,IAAI,YAAY,GACzC,sBAAsB,OAAO,IAAI,gBAAgB,GACjD,yBAAyB,OAAO,IAAI,wBAAwB,GAC5D,uBACE,MAAM,iEACR,iBAAiB,OAAO,UAAU,gBAClC,cAAc,MAAM,SACpB,aAAa,QAAQ,aACjB,QAAQ,aACR,WAAY;AACV,aAAO;AAAA,IACnB;AACI,YAAQ;AAAA,MACN,0BAA0B,SAAU,mBAAmB;AACrD,eAAO,kBAAiB;AAAA,MACzB;AAAA,IACP;AACI,QAAI;AACJ,QAAI,yBAAyB,CAAA;AAC7B,QAAI,yBAAyB,MAAM,yBAAyB;AAAA,MAC1D;AAAA,MACA;AAAA,IACN;AACI,QAAI,wBAAwB,WAAW,YAAY,YAAY,CAAC;AAChE,QAAI,wBAAwB,CAAA;AAC5B,gCAAA,WAAmB;AACnB,gCAAA,MAAc,SAAU,MAAM,QAAQ,UAAU;AAC9C,UAAI,mBACF,MAAM,qBAAqB;AAC7B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBACI,MAAM,uBAAuB,IAC7B;AAAA,QACJ,mBAAmB,WAAW,YAAY,IAAI,CAAC,IAAI;AAAA,MAC3D;AAAA,IACA;AACI,gCAAA,OAAe,SAAU,MAAM,QAAQ,UAAU;AAC/C,UAAI,mBACF,MAAM,qBAAqB;AAC7B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBACI,MAAM,uBAAuB,IAC7B;AAAA,QACJ,mBAAmB,WAAW,YAAY,IAAI,CAAC,IAAI;AAAA,MAC3D;AAAA,IACA;AAAA,EACA;;;AC7VA,IAAI,QAAQ,IAAI,aAAa,cAAc;AACzCA,aAAA,UAAiBC;AACnB,OAAO;AACLD,aAAA,UAAiBE;AACnB;;ACCO,MAAM,iBAAiB;AAAA,EAC5B,CAAC,OAAO,QAAQ;AACd,UAAM,EAAE,SAAS,GAAG,KAAA,IAAS;AAC7B,iDACG,OAAI,EAAA,KAAW,GAAG,MAChB,UAAA,WAAW,YAAY,SACtBC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR,OAAM;AAAA,QAEN,UAAAA,kCAAAA,IAAC,QAAK,EAAA,GAAE,ixGAAixG,CAAA;AAAA,MAAA;AAAA,IAAA,IAEzxG,YAAY,YAAY,UAAU,YAAY,WAChDC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR,OAAM;AAAA,QAEN,UAAA;AAAA,UAACD,kCAAAA,IAAA,QAAA,EAAK,GAAE,sbAAsb,CAAA;AAAA,UAC9bA,kCAAAA,IAAC,QAAK,EAAA,GAAE,sbAAsb,CAAA;AAAA,UAC9bA,kCAAAA,IAAC,QAAK,EAAA,GAAE,kXAAkX,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAE1X,YAAY,YAAY,UAAU,YAAY,WAChDA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR,OAAM;AAAA,QAEN,UAAAA,kCAAAA,IAAC,QAAK,EAAA,GAAE,woBAAwoB,CAAA;AAAA,MAAA;AAAA,IAAA,IAGjpBA,kCAAA,IAAA,OAAA,EAAI,OAAM,8BAA6B,SAAQ,aAC9C,UAAAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,GAAE;AAAA,MAAA;AAAA,IAAA,EAEN,CAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;ACzCa,MAAA,SAAgC,CAAC,UAAU;AAChD,QAAA;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACD,IAAA;AACJ,SAEIC,kCAAA,KAAAC,4BAAA,EAAA,UAAA;AAAA,IAAAD,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,UAAU,YAAY;AAAA,QACtB;AAAA,QACC,GAAG;AAAA,QAEH,UAAA;AAAA,UAAc,cAAA;AAAA,UACd,UACCD,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,SAAS,WAAW;AAAA,cAC7B,yBAAyB,EAAE,QAAQ,QAAQ;AAAA,YAAA;AAAA,UAAA,IAG7C;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,IACAA,kCAAAA,IAAC,UAAK,WAAU,kFACd,gDAAC,QAAK,EAAA,WAAW,aAAa,EAChC,CAAA;AAAA,EACF,EAAA,CAAA;AAEJ;AC1Ca,MAAA,UAAU,CAAC,OAAe,aAA6B;AAElE,QAAM,YAAY,KAAK,MAAM,KAAK,SAAS,KAAK,IAAK;AAGrD,QAAM,gBAAgB,GAAG,QAAQ,IAAI,SAAS,IAAI,KAAK;AAGvD,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AACvC,UAAA,OAAO,cAAc,WAAW,CAAC;AAC/B,YAAA,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AAGA,SAAO,GAAG,KAAK,SAAS,EAAE,CAAC,IAAI,SAAS;AAC1C;AASa,MAAA,mBAAmB,CAC9B,UACA,iBAAyB,IACzB,gBAAwB,IACxB,gBAAwB,OACZ;AAEN,QAAA,QAAQ,eAAe,MAAM,GAAG;AAClC,MAAA,MAAM,WAAW,GAAG;AACf,WAAA;AAAA,EACT;AAEM,QAAA,CAAC,YAAY,eAAe,IAAI;AAChC,QAAA,YAAY,SAAS,iBAAiB,EAAE;AAG9C,QAAM,mBAAmB,KAAK,MAAM,KAAK,SAAS,KAAK,IAAK;AAC5D,MAAI,MAAM,SAAS,KAAK,mBAAmB,YAAY,eAAe;AAC7D,WAAA;AAAA,EACT;AAGA,QAAM,gBAAgB,GAAG,QAAQ,IAAI,SAAS,IAAI,aAAa;AAC/D,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AACvC,UAAA,OAAO,cAAc,WAAW,CAAC;AAC/B,YAAA,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AAGO,SAAA,eAAe,KAAK,SAAS,EAAE;AACxC;ACxDgB,SAAA,sBAAsB,aAAqB,IAAI;AACvD,QAAA,WAAW,OAAyB,IAAI;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAiB,QAAQ;AAE/D,YAAU,MAAM;AACd,UAAM,UAAU,SAAS;AACzB,QAAI,CAAC;AAAS;AAEd,QAAI,QAAQ;AACZ,UAAM,UAAU,MAAM;AACd,YAAA,QAAQ,QAAQ,sBAAA,EAAwB;AAC/B,qBAAA,GAAG,QAAQ,UAAU,IAAI;AAAA,IAAA;AAGlC;AACR,YAAQ,sBAAsB,OAAO;AAEjC,QAAA,OAAO,mBAAmB,aAAa;AACzC,aAAO,MAAM;AACX,6BAAqB,KAAK;AAAA,MAAA;AAAA,IAE9B;AAEM,UAAA,KAAK,IAAI,eAAe,MAAM;AAC1B;IAAA,CACT;AACD,OAAG,QAAQ,OAAO;AAElB,WAAO,MAAM;AACX,2BAAqB,KAAK;AAC1B,SAAG,WAAW;AAAA,IAAA;AAAA,EAChB,GACC,CAAC,UAAU,CAAC;AAER,SAAA,EAAE,UAAU;AACrB;ACnCA,MAAM,qBAAqB,CAAC,UAAkB,UAA0B;AACtE,QAAM,YAAY,KAAK,MAAM,KAAK,SAAS,KAAK,IAAK;AACrD,QAAM,gBAAgB,GAAG,QAAQ,IAAI,SAAS,IAAI,KAAK;AAEvD,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AACvC,UAAA,OAAO,cAAc,WAAW,CAAC;AAC/B,YAAA,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,GAAG,KAAK,SAAS,EAAE,CAAC,IAAI,SAAS;AAC1C;AA2BO,MAAM,cAAc;AAAA,EACzB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,WAAW;AAAA,MACX,UAAU,IAAI,OAAO;AAAA,MACrB,GAAG;AAAA,IACD,IAAA;AAEJ,UAAM,CAAC,cAAc,eAAe,IAAI,SAA8B,IAAI;AAC1E,UAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,UAAM,CAAC,aAAa,cAAc,IAAI,SAAiB,EAAE;AACnD,UAAA,eAAe,OAAyB,IAAI;AAClD,UAAM,EAAE,UAAU,YAAY,IAAI,sBAAsB,EAAE;AACpD,UAAA,qBAAqB,OAA+B,IAAI;AAGxD,UAAA,aAAa,OACjB,MACA,WAC0B;;AAEtB,UAAA,KAAK,OAAO,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,QAAQ,KAAK,IAAI,kCACf,UAAU,OAAO,IACnB;AAAA,QAAA;AAAA,MAEJ;AAGA,YAAM,WAAW;AACX,YAAA,iBAAiB,mBAAmB,UAAU,QAAQ;AAGtD,YAAA,sBAAsB,MAAM,MAAM,+BAA+B;AAAA,QACrE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,UAAU,KAAK;AAAA,UACf,UAAU,KAAK;AAAA,UACf,UAAU,KAAK;AAAA,UACf,WAAW;AAAA;AAAA,UACX;AAAA,UACA;AAAA,QAAA,CACD;AAAA,QACD;AAAA,MAAA,CACD;AAEG,UAAA,CAAC,oBAAoB,IAAI;AACrB,cAAA,YAAY,MAAM,oBAAoB;AAC5C,cAAM,IAAI;AAAA,UACR,UAAU,WAAW;AAAA,QAAA;AAAA,MAEzB;AAEM,YAAA,kBAAkB,MAAM,oBAAoB;AAE9C,UAAA,CAAC,gBAAgB,SAAS;AAC5B,cAAM,IAAI;AAAA,UACR,gBAAgB,WAAW;AAAA,QAAA;AAAA,MAE/B;AAGM,YAAA,EAAE,aAAa,UAAc,IAAA;AACnC,YAAM,YAAY,2CAAa;AAC/B,YAAM,WAAW,2CAAa;AAE9B,UAAI,CAAC,WAAW;AACR,cAAA,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AAII,UAAA;AAGJ,UAAI,aAAa,qBAAqB;AAE9B,cAAA,WAAW,IAAI;AACZ,iBAAA,OAAO,QAAQ,IAAI;AAEX,yBAAA,MAAM,MAAM,WAAW;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN;AAAA,QAAA,CACD;AAAA,MAAA,OACI;AAEY,yBAAA,MAAM,MAAM,WAAW;AAAA,UACtC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB,KAAK;AAAA,UACvB;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QAAA,CACD;AAAA,MACH;AAEI,UAAA,CAAC,eAAe,IAAI;AACtB,cAAM,IAAI;AAAA,UACR,uBAAuB,eAAe,MAAM,IAAI,eAAe,UAAU;AAAA,QAAA;AAAA,MAE7E;AAGI,UAAA;AACA,UAAA;AAEJ,UAAI,aAAa,qBAAqB;AAE9B,cAAA,eAAe,MAAM,eAAe;AAC7B,uBAAA,kDAAc,WAAd,mBAAsB,OAAM;AAGzC,cAAM,cAAc,UAAU,MAAM,GAAG,EAAE,CAAC;AAC9B,oBAAA,6BAA6B,WAAW,IAAI,UAAU;AAAA,MAAA,WACzD,aAAa,iBAAiB;AAEvC,qBAAa,UAAU,MAAM,GAAG,EAAE,IAAS,KAAA;AAC/B,oBAAA;AAAA,MAAA,OACP;AAEQ,qBAAA;AACD,oBAAA;AAAA,MACd;AAGA,YAAM,eAAe;AAAA,QACnB,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf;AAAA,QACA,aAAa;AAAA,QACb,aAAa,YAAY;AAAA,QACzB;AAAA,QACA;AAAA,MAAA;AAGI,YAAA,sBAAsB,MAAM,MAAM,qBAAqB;AAAA,QAC3D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,YAAY;AAAA,QACjC;AAAA,MAAA,CACD;AAEG,UAAA,CAAC,oBAAoB,IAAI;AACrB,cAAA,YAAY,MAAM,oBAAoB;AAC5C,cAAM,IAAI,MAAM,UAAU,WAAW,+BAA+B;AAAA,MACtE;AAEM,YAAA,YAAY,MAAM,oBAAoB;AAExC,UAAA,CAAC,UAAU,SAAS;AACtB,cAAM,IAAI,MAAM,UAAU,WAAW,+BAA+B;AAAA,MACtE;AAGO,aAAA;AAAA,QACL,IAAI,UAAU;AAAA,QACd,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,KAAK;AAAA;AAAA,MAAA;AAAA,IACP;AAGI,UAAA,mBAAmB,OAAO,MAA2C;AACnE,YAAA,QAAQ,EAAE,OAAO;AAEnB,UAAA,CAAC,SAAS,MAAM,WAAW;AAAG;AAE5B,YAAA,OAAO,MAAM,CAAC;AAGd,YAAA,kBAAkB,IAAI;AAC5B,yBAAmB,UAAU;AAE7B,qBAAe,IAAI;AACnB,iEAAsB;AACtB,qBAAe,EAAE;AAEb,UAAA;AAEE,YAAA,KAAK,OAAO,SAAS;AACvB,gBAAM,IAAI;AAAA,YACR,QAAQ,KAAK,IAAI,YAAY,UAAU,OAAO,IAAI;AAAA,UAAA;AAAA,QAEtD;AAGA,cAAM,mBAAmB,MAAM,WAAW,MAAM,gBAAgB,MAAM;AACtE,wBAAgB,gBAAgB;AAChC,6CAAW;AAAA,eACJG,QAAO;AAEd,YAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,kBAAQ,IAAI,uBAAuB;AAAA,QAAA,OAC9B;AACG,kBAAA,MAAM,uBAAuBA,MAAK;AAC1C;AAAA,YACEA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,UAAA;AAAA,QAE7C;AAAA,MAAA,UACA;AACA,uBAAe,KAAK;AACpB,mEAAsB;AACtB,2BAAmB,UAAU;AAE7B,YAAI,aAAa,SAAS;AACxB,uBAAa,QAAQ,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IAAA;AAGF,UAAM,cAAc,MAAM;;AAExB,UAAI,eAAe;AAAc;AACjC,yBAAa,YAAb,mBAAsB;AAAA,IAAM;AAGxB,UAAA,mBAAmB,CAAC,MAAwB;AAChD,QAAE,gBAAgB;AAClB,sBAAgB,IAAI;AACpB,2CAAW;AACX,qBAAe,EAAE;AAAA,IAAA;AAGb,UAAA,qBAAqB,CAAC,MAAwB;AAClD,QAAE,gBAAgB;AAClB,UAAI,mBAAmB,SAAS;AAC9B,2BAAmB,QAAQ;MAC7B;AAAA,IAAA;AAGF,UAAM,iBAAiB,MAAM;AACvB,UAAA;AAAoB,eAAA;AACxB,UAAI,cAAc;AAChB,eAAO,aAAa,QAAQ,UAAU,aAAa,IAAI;AAAA,MACzD;AACO,aAAA;AAAA,IAAA;AAIP,WAAAF,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,KAAK,mBAAmB,SAAS;AAAA,QAC3C,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAAD,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cAEC,UAAA;AAAA,YAAA;AAAA,UACH;AAAA,UAGAA,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,IAAI;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,UAAU,CAAC,CAAC;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UACZ;AAAA,UAGAC,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAW;AAAA,gBACT;AAAA,gBACA,eAAe,eACX,kCACA;AAAA,gBACJ;AAAA,cACF;AAAA,cACA,OAAO,EAAE,YAAY;AAAA,cAErB,UAAA;AAAA,gBAAAD,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,eAAe,kBAAkB;AAAA,oBACnC;AAAA,oBAEC,UAAe,eAAA;AAAA,kBAAA;AAAA,gBAClB;AAAA,gBACC,cACCC,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAU;AAAA,oBACV,OAAM;AAAA,oBAEN,UAAA;AAAA,sBAACD,kCAAAA,IAAA,OAAA,EAAI,WAAU,6EAA6E,CAAA;AAAA,sBAC5FA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,QAAO;AAAA,0BACP,SAAQ;AAAA,0BAER,UAAAA,kCAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,eAAc;AAAA,8BACd,gBAAe;AAAA,8BACf,aAAa;AAAA,8BACb,GAAE;AAAA,4BAAA;AAAA,0BACJ;AAAA,wBAAA;AAAA,sBACF;AAAA,oBAAA;AAAA,kBAAA;AAAA,oBAEA,eACFA,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAU;AAAA,oBACV,OAAM;AAAA,oBAEN,UAAAA,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,QAAO;AAAA,wBACP,SAAQ;AAAA,wBAER,UAAAA,kCAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,eAAc;AAAA,4BACd,gBAAe;AAAA,4BACf,aAAa;AAAA,4BACb,GAAE;AAAA,0BAAA;AAAA,wBACJ;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,gBAAA,IAGFA,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,SAAQ;AAAA,oBAER,UAAAA,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,eAAc;AAAA,wBACd,gBAAe;AAAA,wBACf,aAAa;AAAA,wBACb,GAAE;AAAA,sBAAA;AAAA,oBACJ;AAAA,kBAAA;AAAA,gBACF;AAAA,cAAA;AAAA,YAAA;AAAA,UAEJ;AAAA,WAGE,SAAS,gBACTA,kCAAA,IAAC,OAAE,WAAU,6BAA6B,mBAAS,aAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIvE;AACF;AC5ZO,MAAM,QAAQ,WAAyC,CAAC,OAAO,QAAQ;AACtE,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACD,IAAA;AAGF,SAAAC,kCAAA,KAAC,OAAK,EAAA,GAAG,MACP,UAAA;AAAA,IAAAA,kCAAA,KAAC,SAAM,EAAA,SAAS,MAAM,WAAW,gBAC9B,UAAA;AAAA,MAAA;AAAA,MACA,WAAYD,kCAAAA,IAAA,QAAA,EAAK,WAAW,mBAAmB,cAAC,CAAA,IAAU;AAAA,IAAA,GAC7D;AAAA,IACAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IACC,SAASA,kCAAA,IAAC,KAAE,EAAA,WAAU,qBAAqB,UAAM,OAAA;AAAA,EACpD,EAAA,CAAA;AAEJ,CAAC;AC1CM,MAAM,SAAS,WAAyC,CAAC,OAAO,QAAQ;AACvE,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACD,IAAA;AAEJ,QAAM,EAAE,UAAU,YAAY,IAAI,sBAAsB,EAAE;AAGxD,SAAAC,kCAAA,KAAC,SAAI,WAAW,KAAK,mBAAmB,SAAS,GAAI,GAAG,MACtD,UAAA;AAAA,IAAAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC,UAAA;AAAA,UAAA;AAAA,UACA,WAAYD,kCAAAA,IAAA,QAAA,EAAK,WAAW,mBAAmB,cAAC,CAAA,IAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7D;AAAA,IACAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,YAAY;AAAA,QACrB,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IACC,SAASA,kCAAA,IAAC,KAAE,EAAA,WAAU,6BAA6B,UAAM,OAAA;AAAA,EAC5D,EAAA,CAAA;AAEJ,CAAC;AChDM,MAAM,WAAW;AAAA,EACtB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AAGF,WAAAC,kCAAA,KAAC,OAAK,EAAA,GAAG,MACP,UAAA;AAAA,MAAAA,kCAAA,KAAC,SAAM,EAAA,SAAS,MAAM,WAAW,gBAC9B,UAAA;AAAA,QAAA;AAAA,QACA,WAAYD,kCAAAA,IAAA,QAAA,EAAK,WAAW,mBAAmB,cAAC,CAAA,IAAU;AAAA,MAAA,GAC7D;AAAA,MACAA,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,QAAA;AAAA,MAChB;AAAA,MACC,SAASA,kCAAA,IAAC,KAAE,EAAA,WAAU,qBAAqB,UAAM,OAAA;AAAA,IACpD,EAAA,CAAA;AAAA,EAEJ;AACF;AC5CO,MAAM,YAAY;AAAA,EACvB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AAEJ,UAAM,CAAC,YAAY,aAAa,IAAI,SAAS,QAAQ;AAC/C,UAAA,WAAW,OAAyB,IAAI;AAE9C,cAAU,MAAM;AACd,YAAM,UAAU,SAAS;AACzB,UAAI,CAAC;AAAS;AAEd,UAAI,QAAQ;AACZ,YAAM,UAAU,MAAM;AACd,cAAA,SAAS,QAAQ,sBAAA,EAAwB;AACjC,sBAAA,GAAG,SAAS,EAAE,IAAI;AAAA,MAAA;AAG1B;AACR,cAAQ,sBAAsB,OAAO;AAEjC,UAAA,OAAO,mBAAmB,aAAa;AACzC,eAAO,MAAM;AACX,+BAAqB,KAAK;AAAA,QAAA;AAAA,MAE9B;AAEM,YAAA,KAAK,IAAI,eAAe,MAAM;AAC1B;MAAA,CACT;AACD,SAAG,QAAQ,OAAO;AAElB,aAAO,MAAM;AACX,6BAAqB,KAAK;AAC1B,WAAG,WAAW;AAAA,MAAA;AAAA,IAChB,GACC,CAAC,KAAK,CAAC;AAEV,WACGC,kCAAAA,KAAA,OAAA,EAAI,WAAuB,GAAG,MAC7B,UAAA;AAAA,MAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,QAAAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAW,gEACT,kBAAkB,EACpB;AAAA,YAEC,UAAA;AAAA,cAAA;AAAA,cACA,WAAYD,kCAAAA,IAAA,QAAA,EAAK,WAAW,mBAAmB,cAAC,CAAA,IAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7D;AAAA,QACAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,IAAI;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,OAAO,EAAE,WAAW;AAAA,YACpB,WAAW;AAAA,6JAEG,kBAAkB,EACpB;AAAA,UAAA;AAAA,QACd;AAAA,MAAA,GACF;AAAA,MACC,SAASA,kCAAA,IAAC,KAAE,EAAA,WAAU,6BAA6B,UAAM,OAAA;AAAA,IAC5D,EAAA,CAAA;AAAA,EAEJ;AACF;AAEA,UAAU,cAAc;AC/EjB,MAAM,YAA2B;AAAA,EACtC,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,WAAW,UAAU,KAAK;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,uBAAuB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACnF,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,WAAW,UAAU,MAAM;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,0BAA0B,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjF,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,0BAA0B,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACtF,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAC9E,EAAE,MAAM,MAAM,MAAM,4BAA4B,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnF,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,UAAU,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAC7D,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,UAAU,UAAU,OAAO;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,sBAAsB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAClF,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,MAAM;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,qBAAqB,QAAQ,UAAU,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,WAAW,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC/E,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,WAAW,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,UAAU,UAAU,OAAO;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,WAAW,UAAU,KAAK;AAAA,EAC9D,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,MAAM;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAC7D,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAC5D,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC7D,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,UAAU,UAAU,MAAM;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,MAAM;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAC7D,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,KAAK;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,WAAW,UAAU,OAAO;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC7D,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,UAAU,UAAU,OAAO;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,UAAU,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,WAAW,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,UAAU,UAAU,OAAO;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,WAAW,UAAU,OAAO;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,WAAW,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC9D,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,UAAU,UAAU,MAAM;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,WAAW,UAAU,OAAO;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,WAAW,UAAU,MAAM;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,WAAW,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,WAAW,UAAU,OAAO;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACpE,EAAE,MAAM,MAAM,MAAM,mBAAmB,QAAQ,UAAU,UAAU,OAAO;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,4BAA4B,QAAQ,WAAW,UAAU,KAAK;AAAA,EAClF,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC7D,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,WAAW,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,WAAW,UAAU,OAAO;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC9D,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,KAAK;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,oBAAoB,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAClF,EAAE,MAAM,MAAM,MAAM,yBAAyB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACrF,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC9E,EAAE,MAAM,MAAM,MAAM,6BAA6B,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC3F,EAAE,MAAM,MAAM,MAAM,oCAAoC,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAChG,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,WAAW,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,yBAAyB,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChF,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,UAAU,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACvE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAC5E,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,mBAAmB,QAAQ,WAAW,UAAU,OAAO;AAAA,EAC3E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,UAAU,UAAU,MAAM;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,UAAU,UAAU,OAAO;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,MAAM;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,UAAU,UAAU,OAAO;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,eAAe,QAAQ,UAAU,UAAU,MAAM;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC9D,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAChE,EAAE,MAAM,MAAM,MAAM,QAAQ,QAAQ,UAAU,UAAU,OAAO;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,WAAW,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,WAAW,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,uBAAuB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACnF,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,MAAM;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACrE,EAAE,MAAM,MAAM,MAAM,4BAA4B,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACxF,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,WAAW,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,UAAU,UAAU,OAAO;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,wBAAwB,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,UAAU,UAAU,MAAM;AAAA,EACxE,EAAE,MAAM,MAAM,MAAM,iBAAiB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,iBAAiB,UAAU,OAAO;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,cAAc,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,WAAW,UAAU,OAAO;AAAA,EACnE,EAAE,MAAM,MAAM,MAAM,gBAAgB,QAAQ,UAAU,UAAU,MAAM;AAAA,EACtE,EAAE,MAAM,MAAM,MAAM,aAAa,QAAQ,iBAAiB,UAAU,MAAM;AAAA,EAC1E,EAAE,MAAM,MAAM,MAAM,WAAW,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAC/D,EAAE,MAAM,MAAM,MAAM,uBAAuB,QAAQ,iBAAiB,UAAU,KAAK;AAAA,EACnF,EAAE,MAAM,MAAM,MAAM,qBAAqB,QAAQ,WAAW,UAAU,OAAO;AAAA,EAC7E,EAAE,MAAM,MAAM,MAAM,kBAAkB,QAAQ,UAAU,UAAU,OAAO;AAAA,EACzE,EAAE,MAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC9D,EAAE,MAAM,MAAM,MAAM,UAAU,QAAQ,UAAU,UAAU,OAAO;AAAA,EACjE,EAAE,MAAM,MAAM,MAAM,YAAY,QAAQ,UAAU,UAAU,OAAO;AACrE;ACvOO,SAAS,cAAc,EAAA,WAAEI,aAAW,MAAM,OAAO,YAAkC;AACxF,QAAM,eAAe,QAAuB,MAAMA,eAAaC,WAAkB,CAACD,WAAS,CAAC;AAE5F,QAAM,CAAC,UAAU,WAAW,IAAI,SAA6B,IAAI;AACjE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAiB,EAAE;AAEnD,QAAA,gBAAgB,CAAC,QAA8C;AACnE,QAAI,OAAO,QAAQ;AAAiB,aAAA;AACpC,QAAI,OAAO,QAAQ;AAAU,aAAO,OAAO,GAAG;AAC1C,QAAA,MAAM,QAAQ,GAAG;AAAU,aAAA,IAAI,CAAC,KAAK;AAClC,WAAA;AAAA,EAAA;AAGT,YAAU,MAAM;AACd,UAAM,IAAI,cAAc,KAAK,EAAE,KAAK;AAC9B,UAAA,IAAI,EAAE,MAAM,YAAY;AAC9B,UAAM,OAAO,IAAI,EAAE,CAAC,IAAI;AACxB,UAAM,SAAS,EAAE,MAAM,KAAK,MAAM,EAAE;AACpC,mBAAe,UAAU,EAAE;AAC3B,QAAI,MAAM;AACF,YAAA,QAAQ,aAAa,KAAK,CAAC,MAAM,EAAE,aAAa,IAAI,KAAK;AAC/D,kBAAY,KAAK;AAAA,IAAA,OACZ;AACL,kBAAY,IAAI;AAAA,IAClB;AAAA,EAAA,GACC,CAAC,OAAO,YAAY,CAAC;AAElB,QAAA,aAAa,CAAC,aAAqB;AACvC,QAAI,CAAC;AAAU;AACf,UAAM,MAAM;AAAA,MACV,QAAQ,EAAE,OAAO,UAAU,KAAK;AAAA,MAChC,eAAe,EAAE,OAAO,UAAU,KAAK;AAAA,IAAA;AAEzC,aAAS,GAAG;AAAA,EAAA;AAGR,QAAA,WAAW,CAAC,UAAkB;AAClC,QAAI,CAAC;AAAc,aAAA;AACb,UAAA,IAAI,MAAM;AAChB,WAAO,aAAa;AAAA,MAClB,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAC9B,EAAE,UAAU,EAAE,OAAO,YAAc,EAAA,SAAS,CAAC,KAC9C,EAAE,SAAS,QAAQ,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,IAAA;AAAA,EAC3D;AAGI,QAAA,kBAAkB,CAAC,MAAmB;AAC1C,gBAAY,CAAC;AACb,UAAM,WAAW,GAAG,EAAE,QAAQ,IAAI,WAAW,GAAG;AAChD,eAAW,QAAQ;AAAA,EAAA;AAGf,QAAA,gBAAgB,CAAC,SAAiB;AACtC,mBAAe,IAAI;AACb,UAAA,WAAW,IAAG,qCAAU,aAAY,EAAE,IAAI,IAAI,GAAG;AACvD,eAAW,QAAQ;AAAA,EAAA;AAGd,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AC/DO,MAAM,WAAW;AAAA,EACtB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACE,IAAA;AAEJ,UAAM,EAAE,cAAc,UAAU,aAAa,iBAAiB,cAAA,IAC5D,cAAc,EAAE,WAAAA,YAAW,MAAM,OAAO,SAAU,CAAA;AAEpD,UAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AAC/B,UAAA,WAAW,OAA8B,IAAI;AAC7C,UAAA,YAAY,OAAiC,IAAI;AAEvD,cAAU,MAAM;AACR,YAAA,aAAa,CAAC,MAAkB;AACpC,cAAM,SAAS,EAAE;AACjB,YACE,QACA,SAAS,WACT,CAAC,SAAS,QAAQ,SAAS,MAAM,KACjC,UAAU,WACV,CAAC,UAAU,QAAQ,SAAS,MAAM,GAClC;AACA,kBAAQ,KAAK;AAAA,QACf;AAAA,MAAA;AAEO,eAAA,iBAAiB,aAAa,UAAU;AACjD,aAAO,MAAM,SAAS,oBAAoB,aAAa,UAAU;AAAA,IAAA,GAChE,CAAC,IAAI,CAAC;AAIH,UAAA,WAA0B,QAAQ,MAAM;AAC5C,UAAI,CAAC;AAAc,eAAA;AACb,YAAA,IAAI,MAAM;AAChB,aAAO,aAAa;AAAA,QAClB,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAC9B,EAAE,UAAU,EAAE,OAAO,YAAc,EAAA,SAAS,CAAC,KAC9C,EAAE,SAAS,QAAQ,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,MAAA;AAAA,IAC3D,GACC,CAAC,cAAc,KAAK,CAAC;AAExB,kDACG,OAAI,EAAA,WAAW,KAAK,UAAU,SAAS,GACrC,UAAA;AAAA,MACC,QAAAH,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC,UAAA;AAAA,YAAA;AAAA,YACA,WAAYD,kCAAAA,IAAA,QAAA,EAAK,WAAW,mBAAmB,cAAC,CAAA,IAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,IAE3D;AAAA,MAEJC,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEA,UAAA;AAAA,YAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,cAAAA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,iBAAc;AAAA,kBACd,iBAAe;AAAA,kBACf,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,kBAChC,WACE;AAAA,kBAGF,UAAA;AAAA,oBAAAD,sCAAC,QAAK,EAAA,WAAU,oCACb,UAAA,WAEGC,kCAAA,KAAAC,4BAAA,EAAA,UAAA;AAAA,sBAAAF,kCAAA,IAAC,QAAK,EAAA,WAAU,eAAe,UAAA,SAAS,MAAK;AAAA,sBAC5C,SAAS,SACPC,uCAAA,QAAA,EAAK,WAAU,iBAAgB,UAAA;AAAA,wBAAA;AAAA,wBAAG,SAAS;AAAA,sBAAA,EAAA,CAAO,IACjD;AAAA,sBACHD,kCAAA,IAAA,QAAA,EAAK,WAAU,sBACb,mBAAS,UACZ;AAAA,oBAAA,EACF,CAAA,IAEA,yBAEJ;AAAA,oBACAA,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,eAAY;AAAA,wBAEZ,UAAAA,kCAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,UAAS;AAAA,4BACT,GAAE;AAAA,4BACF,UAAS;AAAA,0BAAA;AAAA,wBACX;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF;AAAA,cAEC,OACCC,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,sBAAAD,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,0BACxC,aAAY;AAAA,0BACZ,WAAU;AAAA,wBAAA;AAAA,sBACZ;AAAA,sBACAA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,SAAQ;AAAA,0BACR,MAAK;AAAA,0BACL,eAAY;AAAA,0BAEZ,UAAAA,kCAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,UAAS;AAAA,8BACT,GAAE;AAAA,8BACF,UAAS;AAAA,4BAAA;AAAA,0BACX;AAAA,wBAAA;AAAA,sBACF;AAAA,oBAAA,GACF;AAAA,0DAEC,OAAI,EAAA,WAAU,oCACZ,UAAS,SAAA,IAAI,CAAC,MACbC,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,MAAK;AAAA,wBACL,SAAS,MAAM;AACb,0CAAgB,CAAC;AACjB,kCAAQ,KAAK;AAAA,wBACf;AAAA,wBACA,WAAU;AAAA,wBAEV,UAAA;AAAA,0BAAAD,kCAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,WAAW;AAAA,gCACT;AAAA,iCACA,qCAAU,UAAS,EAAE,OACjB,+CACA;AAAA,8BACN;AAAA,4BAAA;AAAA,0BACD;AAAA,0BACDC,kCAAAA,KAAC,QAAK,EAAA,WAAU,mBACb,UAAA;AAAA,4BAAE,EAAA;AAAA,4BACF,EAAE,SACAA,uCAAA,QAAA,EAAK,WAAU,iBAAgB,UAAA;AAAA,8BAAA;AAAA,8BAAG,EAAE;AAAA,4BAAA,EAAA,CAAO,IAC1C;AAAA,0BAAA,GACN;AAAA,0BACCD,kCAAA,IAAA,QAAA,EAAK,WAAU,iBAAiB,YAAE,UAAS;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAtBvC,EAAE;AAAA,oBAwBV,CAAA,GACH;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA,IAEA;AAAA,YAAA,GACN;AAAA,YAEAA,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA,aAAa,eAAe;AAAA,gBAC5B,WAAU;AAAA,gBACV,WAAW,KAAK,4EAA4E;AAAA,gBAC5F,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM;AACT,wBAAA,OAAO,EAAE,OAAO;AACtB,gCAAc,IAAI;AAAA,gBACpB;AAAA,gBACA,cAAc;AAAA,gBACd,aAAY;AAAA,gBACZ,YAAY;AAAA,cAAA;AAAA,YACd;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IACF,EAAA,CAAA;AAAA,EAEJ;AACF;ACjMO,MAAM,YAAY;AAAA,EACvB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAAI;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACE,IAAA;AAEJ,UAAM,EAAE,UAAU,YAAY,IAAI,sBAAsB,EAAE;AACpD,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE,cAAc,EAAE,WAAAA,YAAW,MAAM,OAAO,UAAU;AAEtD,UAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AAC/B,UAAA,WAAW,OAA8B,IAAI;AAC7C,UAAA,YAAY,OAAiC,IAAI;AAEjD,UAAA,WAAW,QAAQ,MAAM;AAC7B,UAAI,CAAC;AAAc,eAAA;AACb,YAAA,IAAI,MAAM;AAChB,aAAO,aAAa;AAAA,QAClB,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAC9B,EAAE,UAAU,EAAE,OAAO,YAAc,EAAA,SAAS,CAAC,KAC9C,EAAE,SAAS,QAAQ,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,MAAA;AAAA,IAC3D,GACC,CAAC,cAAc,KAAK,CAAC;AAExB,cAAU,MAAM;AACR,YAAA,aAAa,CAAC,MAAkB;AACpC,cAAM,SAAS,EAAE;AACjB,YACE,QACA,SAAS,WACT,CAAC,SAAS,QAAQ,SAAS,MAAM,KACjC,UAAU,WACV,CAAC,UAAU,QAAQ,SAAS,MAAM,GAClC;AACA,kBAAQ,KAAK;AAAA,QACf;AAAA,MAAA;AAEO,eAAA,iBAAiB,aAAa,UAAU;AACjD,aAAO,MAAM,SAAS,oBAAoB,aAAa,UAAU;AAAA,IAAA,GAChE,CAAC,IAAI,CAAC;AAET,kDACG,OAAI,EAAA,WAAW,KAAK,mBAAmB,SAAS,GAC/C,UAAA;AAAA,MAAAH,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC,UAAA;AAAA,YAAA;AAAA,YACA,WAAYD,kCAAAA,IAAA,QAAA,EAAK,WAAW,mBAAmB,cAAC,CAAA,IAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7D;AAAA,MAEAC,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAO,EAAE,YAAY;AAAA,UAErB,UAAA;AAAA,YAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,cAAAA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,iBAAc;AAAA,kBACd,iBAAe;AAAA,kBACf,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,kBAChC,WACE;AAAA,kBAGF,UAAA;AAAA,oBAAAD,kCAAAA,IAAC,UAAK,WAAU,oCACb,UACC,WAAAA,sCAAC,UAAK,WAAU,eAAe,UAAS,SAAA,SAAA,CAAS,IAEhDA,kCAAAA,IAAA,QAAA,EAAK,WAAU,iBAAgB,oBAAM,EAE1C,CAAA;AAAA,oBACAA,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,eAAY;AAAA,wBAEZ,UAAAA,kCAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,UAAS;AAAA,4BACT,GAAE;AAAA,4BACF,UAAS;AAAA,0BAAA;AAAA,wBACX;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF;AAAA,cAEC,OACCC,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAACA,kCAAAA,KAAA,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,sBAAAD,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,0BACxC,aAAa,qBAAqB;AAAA,0BAClC,WAAU;AAAA,wBAAA;AAAA,sBACZ;AAAA,sBACAA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,SAAQ;AAAA,0BACR,MAAK;AAAA,0BACL,eAAY;AAAA,0BAEZ,UAAAA,kCAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,UAAS;AAAA,8BACT,GAAE;AAAA,8BACF,UAAS;AAAA,4BAAA;AAAA,0BACX;AAAA,wBAAA;AAAA,sBACF;AAAA,oBAAA,GACF;AAAA,0DAEC,OAAI,EAAA,WAAU,oCACZ,UAAS,SAAA,IAAI,CAAC,MACbC,kCAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,MAAK;AAAA,wBACL,SAAS,MAAM;AACb,0CAAgB,CAAC;AACjB,kCAAQ,KAAK;AAAA,wBACf;AAAA,wBACA,WAAU;AAAA,wBAEV,UAAA;AAAA,0BAAAD,kCAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,WAAW;AAAA,gCACT;AAAA,iCACA,qCAAU,UAAS,EAAE,OACjB,+CACA;AAAA,8BACN;AAAA,4BAAA;AAAA,0BACD;AAAA,0BACDC,kCAAAA,KAAC,QAAK,EAAA,WAAU,mBACb,UAAA;AAAA,4BAAE,EAAA;AAAA,4BACF,EAAE,SACAA,uCAAA,QAAA,EAAK,WAAU,iBAAgB,UAAA;AAAA,8BAAA;AAAA,8BAAG,EAAE;AAAA,4BAAA,EAAA,CAAO,IAC1C;AAAA,0BAAA,GACN;AAAA,0BACCD,kCAAA,IAAA,QAAA,EAAK,WAAU,iBAAiB,YAAE,UAAS;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAtBvC,EAAE;AAAA,oBAwBV,CAAA,GACH;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA,IAEA;AAAA,YAAA,GACN;AAAA,YAEAA,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA,aAAa,eAAe;AAAA,gBAC5B,WAAU;AAAA,gBACV,WAAW;AAAA,kBACT;AAAA,gBACF;AAAA,gBACA,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,gBAC7C,cAAc;AAAA,gBACd,aAAY;AAAA,gBACZ,YAAY;AAAA,cAAA;AAAA,YACd;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IACF,EAAA,CAAA;AAAA,EAEJ;AACF;ACzMa,MAAA,aAAa,CAAC,aAAsB,eAA4B;AAC3E,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO,SAAS,UAAU;AAAA,IAC5B,KAAK;AACH,aAAO,YAAY,UAAU;AAAA,IAC/B,KAAK;AACH,aAAO,YAAY,UAAU;AAAA,IAC/B;AACE,aAAO,SAAS,UAAU;AAAA,EAC9B;AACF;AAEa,MAAA,WAAW,CAAC,eAA4B;AACnD,MAAI,eAAe,WAAW;AACrB,WAAA;AAAA,EAAA,WACE,eAAe,gBAAgB;AACjC,WAAA;AAAA,EAAA,OACF;AACE,WAAA;AAAA,EACT;AACF;AAEa,MAAA,cAAc,CAAC,eAA4B;AACtD,MAAI,eAAe,WAAW;AACrB,WAAA;AAAA,EAAA,WACE,eAAe,gBAAgB;AACjC,WAAA;AAAA,EAAA,OACF;AACE,WAAA;AAAA,EACT;AACF;AAEa,MAAA,cAAc,CAAC,eAA4B;AACtD,MAAI,eAAe,gBAAgB;AAC1B,WAAA;AAAA,EACT;AACO,SAAA;AACT;AAEa,MAAA,gBAAgB,CAC3B,eAC8B;AAC9B,MAAI,eAAe,WAAW;AACrB,WAAA;AAAA,EAAA,WACE,eAAe,gBAAgB;AACjC,WAAA;AAAA,EAAA,OACF;AACE,WAAA;AAAA,EACT;AACF;AC7CO,MAAM,cAAc;AAAA,EACzB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,SAAS,CAAC;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AACJ,UAAM,CAAC,UAAU,WAAW,IAAI,SAAuB;AAAA,MACrD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA;AAAA,MACP,aAAa,CAAC;AAAA;AAAA,IAAA,CACf;AAED,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAqB,CAAE,CAAA;AACnD,UAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,UAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,UAAM,CAAC,cAAc,eAAe,IAAI,SAGrC,CAAE,CAAA;AACL,UAAM,UAAW,OAAyC;AAGpD,UAAA,eAAe,CACnB,GACA,cACG;AACH,YAAM,EAAE,MAAM,UAAU,EAAE;AAC1B,UAAI,WAAW;AACb,oBAAY,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,SAAS;AAAA,YACP,GAAI,KAAK,WAAW,CAAC;AAAA,YACrB,CAAC,IAAI,GAAG;AAAA,UACV;AAAA,QACA,EAAA;AAAA,MAAA,OACG;AACL,oBAAY,CAAC,UAAU;AAAA,UACrB,GAAG;AAAA,UACH,CAAC,IAAI,GAAG;AAAA,QACR,EAAA;AAAA,MACJ;AAEA,sBAAgB,CAAE,CAAA;AAGd,UAAA,OAAO,IAAwB,GAAG;AACpC,kBAAU,CAAC,UAAU;AAAA,UACnB,GAAG;AAAA,UACH,CAAC,IAAI,GAAG;AAAA,QACR,EAAA;AAAA,MACJ;AAAA,IAAA;AAII,UAAA,mBAAmB,CAAC,aAAkC;AAC1D,kBAAY,CAAC,UAAU;AAAA,QACrB,GAAG;AAAA,QACH,aAAa,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA;AAAA,MACtC,EAAA;AAAA,IAAA;AAIE,UAAA,8BAA8B,CAAC,cAAuB;AAC1D,qBAAe,SAAS;AAAA,IAAA;AAG1B,UAAM,eAAe,MAAe;;AAClC,YAAM,YAAwB,CAAA;AAM9B,UAAI,GAAC,cAAS,UAAT,mBAAgB,SAAQ;AAC3B,kBAAU,QAAQ;AAAA,iBACT,CAAC,6BAA6B,KAAK,SAAS,KAAK,GAAG;AAC7D,kBAAU,QAAQ;AAAA,MACpB;AAEA,UAAI,GAAC,cAAS,YAAT,mBAAkB,SAAQ;AAC7B,kBAAU,UAAU;AAAA,MACtB;AAGA,UAAI,SAAS,OAAO;AAElB,gBAAQ,IAAI,6CAA6C;AAClD,eAAA;AAAA,MACT;AAEA,gBAAU,SAAS;AACnB,aAAO,OAAO,KAAK,SAAS,EAAE,WAAW;AAAA,IAAA;AAGrC,UAAA,cAAc,OAAO,UAA4B;AACrD,YAAM,eAAe;AAGjB,UAAA,CAAC,gBAAgB;AACnB;AAAA,MACF;AAEI,UAAA;AACF,sBAAc,IAAI;AAClB,wBAAgB,CAAE,CAAA;AACZ,cAAA,WAAW,MAAM,MAAM,WAAW;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU;AAAA,YACnB,GAAG;AAAA;AAAA,YAEH,SAAS,WAAW;AAAA,YACpB,gBAAgB,QAAQ,SAAS,OAAO,QAAQ;AAAA,UAAA,CACjD;AAAA,UACD,SAAS;AAAA,YACP,iBAAiB,OAAO,SAAS;AAAA,YACjC,gBAAgB;AAAA,UAClB;AAAA,QAAA,CACD;AAEG,YAAA,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,iCAAiC,SAAS,MAAM,EAAE;AAAA,QACpE;AAEM,cAAA,SAAS,MAAM,SAAS;AAEd,wBAAA;AAAA,UACd,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO;AAAA,QAAA,CACjB;AAED,YAAI,OAAO,SAAS;AAEN,sBAAA;AAAA,YACV,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,YACP,aAAa,CAAC;AAAA,UAAA,CACf;AACD,iBAAO,SAAS,OAAO;AAAA,QACzB;AAAA,eACO,OAAO;AAEN,gBAAA,MAAM,0BAA0B,KAAK;AAC7B,wBAAA;AAAA,UACd,SAAS;AAAA,UACT,SACE,iBAAiB,QACb,UAAU,MAAM,OAAO,KACvB;AAAA,QAAA,CACP;AAAA,MAAA,UACD;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IAAA;AAIA,WAAAC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,aAAa;AAAA,QACf;AAAA,QACC,GAAG;AAAA,QAEH,UAAA;AAAA,UAAO,OAAA,IAAI,CAAC,OAAO,UAAU;AACtB,kBAAA;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAAK;AAAAA,cACA;AAAA,cACA;AAAA,cACA,GAAGC;AAAAA,YACD,IAAA;AAGJ,gBAAI,gBAAgB,cAAc;AAC1B,oBAAA,oBAAoB,cAAc,UAAU;AAEhD,qBAAAP,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAM,QAAQ;AAAA,kBACd;AAAA,kBACA,WAAW,KAAK,yCAAY,gBAAgBM,UAAS;AAAA,kBACrD,gBAAgB,KAAK,yCAAY,OAAO,cAAc;AAAA,kBACtD,gBAAgB,KAAK,yCAAY,OAAO,cAAc;AAAA,kBACtD,SAAS,IAAI,OAAO;AAAA,kBACpB,UAAU;AAAA,kBACV,qBAAqB;AAAA,kBACrB,aAAY;AAAA,kBACZ,eAAc;AAAA,kBACd,cAAa;AAAA,kBACb,QAAO;AAAA,kBACN,GAAGC;AAAAA,gBAAA;AAAA,gBAbC,QAAQ;AAAA,cAAA;AAAA,YAgBnB;AAGM,kBAAA,UAAU,WAAW,aAAa,UAAU;AAEhD,mBAAAP,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC;AAAA,gBACA,WAAW,KAAK,yCAAY,gBAAgBM,UAAS;AAAA,gBACrD,gBAAgB,KAAK,yCAAY,OAAO,cAAc;AAAA,gBACtD,gBAAgB,KAAK,yCAAY,OAAO,cAAc;AAAA,gBACtD,mBAAmB,yCAAY;AAAA,gBAC/B,OAAO,SAAS,IAA0B;AAAA,gBAC1C,UAAU,CAAC,MAAM,aAAa,GAAG,SAAS;AAAA,gBAC1C,OAAO,OAAO,IAAwB;AAAA,gBACrC,GAAGC;AAAAA,cAAA;AAAA,cATC,QAAQ;AAAA,YAAA;AAAA,UAUf,CAEH;AAAA,gDAGA,OAAI,EAAA,OAAO,EAAE,SAAS,UACrB,UAAAP,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO,SAAS;AAAA,cAChB,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAa;AAAA,YAAA;AAAA,UAAA,GAEjB;AAAA,UACAC,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,iCAAQ;AAAA,cACV;AAAA,cAEC,UAAA;AAAA,gBAAa,aAAA,WAAW,CAAC,aAAa,WACrCD,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,WACT,aAAa,UAAU,mBAAmB,cAC5C;AAAA,oBAEC,UAAa,aAAA;AAAA,kBAAA;AAAA,gBAChB;AAAA,gBAEFA,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,uBACA,iCAAQ,cAAa;AAAA,oBACvB;AAAA,oBACA,QAAO,iCAAQ,UAAS;AAAA,oBACxB,+CACG,OAAI,EAAA,WAAU,2CACb,UAACA,kCAAA,IAAA,OAAA,EAAI,WAAU,uEAAA,CAAuE,EACxF,CAAA;AAAA,oBAEF,SAAS,iCAAQ;AAAA,oBACjB,aAAa,iCAAQ;AAAA,oBACrB;AAAA,oBACA,UAAU,cAAc;AAAA,oBACxB,SAAS;AAAA,kBAAA;AAAA,gBACX;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;ACtRO,MAAM,OAAO,WAAqC,CAAC,OAAO,QAAQ;AACvE,QAAM,EAAE,MAAM,GAAG,KAAA,IAAS;AAE1B,MAAI,CAAC,MAAM;AACF,WAAA;AAAA,EACT;AAEA,SAAQA,kCAAAA,IAAAQ,QAAA,EAAY,KAAW,GAAG,MAAM,KAAY,CAAA;AACtD,CAAC;ACdM,SAAS,YAAY,OAIzB;;AACD,QAAM,EAAE,OAAO,OAAO,UAAU,oBAAoB;AAC9C,QAAA,WAAW,OAAyB,IAAI;AACxC,QAAA,SAAS,OAAmB,IAAI;AACtC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,kBAAkBC,WAAM;AAAA,IAC5B,CAAC,MAAwB;AACvB,QAAE,gBAAgB;AAClB,UAAI,SAAS,SAAS;AACpB,YAAI,WAAW;AACb,mBAAS,QAAQ;QAAM,OAClB;AACL,mBAAS,QAAQ;QACnB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EAAA;AAGZ,YAAU,MAAM;;AACd,QAAI,CAAC,SAAS,WAAW,GAACC,MAAA,MAAM,SAAN,gBAAAA,IAAY;AAAU;AAEhD,UAAM,QAAQ,SAAS;AACjB,UAAA,WAAW,MAAM,KAAK;AAE5B,UAAM,aAAa,MAAM;AACvB,mBAAa,IAAI;AAAA,IAAA;AAGnB,UAAM,cAAc,MAAM;AACxB,mBAAa,KAAK;AAAA,IAAA;AAGd,UAAA,iBAAiB,QAAQ,UAAU;AACnC,UAAA,iBAAiB,SAAS,WAAW;AAEvC,QAAA,MAAM,gBAAgB,qBAAqB;AACzC,UAAA,CAAC,IAAI,eAAe;AAClB,YAAA,MAAM,YAAY,+BAA+B,GAAG;AACtD,gBAAM,MAAM;AAAA,QACd;AAAA,MAAA,OACK;AACC,cAAA,MAAM,IAAI,IAAI;AAAA,UAClB,cAAc;AAAA,QAAA,CACf;AAED,YAAI,WAAW,QAAQ;AACvB,YAAI,YAAY,KAAK;AACrB,eAAO,UAAU;AAAA,MACnB;AAAA,IAAA,OACK;AACL,YAAM,MAAM;AAAA,IACd;AAEA,WAAO,MAAM;AACL,YAAA,oBAAoB,QAAQ,UAAU;AACtC,YAAA,oBAAoB,SAAS,WAAW;AAC9C,UAAI,OAAO,SAAS;AAClB,eAAO,QAAQ;AACf,eAAO,UAAU;AAAA,MACnB;AAAA,IAAA;AAAA,EACF,GACC,EAAC,WAAM,SAAN,mBAAY,UAAU,MAAM,WAAW,CAAC;AAE5C,SACGT,kCAAAA,KAAA,OAAA,EAAI,WAAU,+CAA8C,SAAS,iBACpE,UAAA;AAAA,IAAAD,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAQ,WAAM,SAAN,mBAAY;AAAA,QACpB,WAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAW;AAAA,MAAA;AAAA,IACb;AAAA,IACC,CAAC,aACCA,kCAAAA,IAAA,OAAA,EAAI,WAAU,gHACb,UAAAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,SAAS,UAAU,YAAY;AAAA,UAC/B;AAAA,QACF;AAAA,QAEA,UAAAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA,SAAS,UAAU,YAAY;AAAA,YACjC;AAAA,YAEA,UAAAA,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,UAAS;AAAA,gBACT,GAAE;AAAA,gBACF,UAAS;AAAA,cAAA;AAAA,YACX;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EAEJ,EAAA,CAAA;AAEJ;AC5FO,MAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAsB;AACd,QAAA,cAAc,OAAuB,IAAI;AAC/C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AACxC,QAAA,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE,GAAG,GAAG,GAAG,EAAA,CAAG;AACjD,QAAA,gBAAgB,OAA8B,IAAI;AACxD,QAAM,kBAAkB,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG;AAE7C,QAAM,gBAAgB,+BAAO,KAAK,CAAC,UAAU,MAAM,OAAO;AACpD,QAAA,WAAU,+CAAe,eAAc,UAAU;AAGvD,YAAU,MAAM;AACd,gBAAY,KAAK;AACjB,gBAAY,EAAE,GAAG,GAAG,GAAG,EAAG,CAAA;AAC1B,QAAI,cAAc,SAAS;AACzB,mBAAa,cAAc,OAAO;AAAA,IACpC;AAAA,EAAA,GACC,CAAC,UAAU,CAAC;AAGf,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,cAAc,SAAS;AACzB,qBAAa,cAAc,OAAO;AAAA,MACpC;AAAA,IAAA;AAAA,EAEJ,GAAG,CAAE,CAAA;AAEL,QAAM,qBAAqB,YAAY,CAAC,SAAiB,YAAoB;AAC3E,QAAI,YAAY,SAAS;AACjB,YAAA,EAAE,MAAM,KAAK,OAAO,WACxB,YAAY,QAAQ;AACtB,YAAM,IAAI,UAAU;AACpB,YAAM,IAAI,UAAU;AAGd,YAAA,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC;AAC3C,YAAA,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAI5C,YAAA,OAAO,SAAS,MAAM;AACtB,YAAA,OAAO,UAAU,MAAM;AAE7B,kBAAY,EAAE,GAAG,MAAM,GAAG,KAAM,CAAA;AAAA,IAClC;AAAA,EACF,GAAG,CAAE,CAAA;AAEL,QAAM,mBAAmB;AAAA,IACvB,CAAC,MAAwB;AACvB,UAAI,CAAC,cAAc;AAAS;AAC5B,sBAAgB,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE;AAEjC,oBAAA,UAAU,WAAW,MAAM;AACvC,oBAAY,IAAI;AAChB;AAAA,UACE,gBAAgB,QAAQ;AAAA,UACxB,gBAAgB,QAAQ;AAAA,QAAA;AAAA,SAEzB,GAAI;AAAA,IACT;AAAA,IACA,CAAC,YAAY,SAAS,kBAAkB;AAAA,EAAA;AAG1C,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAAwB;AACvB,UAAI,CAAC,cAAc;AAAS;AAC5B,sBAAgB,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE;AAE/C,UAAI,UAAU;AACO,2BAAA,EAAE,SAAS,EAAE,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,IACA,CAAC,YAAY,SAAS,UAAU,kBAAkB;AAAA,EAAA;AAG9C,QAAA,mBAAmB,YAAY,MAAM;AACzC,QAAI,cAAc,SAAS;AACzB,mBAAa,cAAc,OAAO;AAAA,IACpC;AACA,gBAAY,KAAK;AACjB,gBAAY,EAAE,GAAG,GAAG,GAAG,EAAG,CAAA;AAAA,EAC5B,GAAG,CAAE,CAAA;AAEL,QAAM,cAAc;AAAA,IAClB,CAAC,MAAwB;AACvB,UAAI,CAAC,cAAc;AAAS;AAE5B,UAAI,cAAc,SAAS;AACzB,qBAAa,cAAc,OAAO;AAAA,MACpC;AAEA,UAAI,UAAU;AACZ,oBAAY,KAAK;AACjB,oBAAY,EAAE,GAAG,GAAG,GAAG,EAAG,CAAA;AAAA,MAAA,OACrB;AACL,oBAAY,IAAI;AACG,2BAAA,EAAE,SAAS,EAAE,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,IACA,CAAC,YAAY,SAAS,UAAU,kBAAkB;AAAA,EAAA;AAIlD,SAAAC,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,CAAC,WAAW;AAAA,MAC5B;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc;AAAA,MACd,SAAS;AAAA,MAGR,UAAA;AAAA,QAAA,CAAC,YACAA,kCAAAA,KAAC,OAAI,EAAA,WAAU,mFACb,UAAA;AAAA,UAAAD,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AACP;cACb;AAAA,cACA,UAAU,CAAC;AAAA,cACX,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,CAAC,cACG,kCACA;AAAA,gBACJ;AAAA,cACF;AAAA,cACA,cAAW;AAAA,cAEX,UAAAA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,WAAW,KAAK,WAAW,cAAc;AAAA,kBACzC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,QAAO;AAAA,kBAEP,UAAAA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,eAAc;AAAA,sBACd,gBAAe;AAAA,sBACf,aAAa;AAAA,sBACb,GAAE;AAAA,oBAAA;AAAA,kBACJ;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UACF;AAAA,UAEAA,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AACX;cACT;AAAA,cACA,UAAU,CAAC;AAAA,cACX,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,CAAC,UACG,iCACA;AAAA,gBACJ;AAAA,cACF;AAAA,cACA,cAAW;AAAA,cAEX,UAAAA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,WAAW,KAAK,WAAW,cAAc;AAAA,kBACzC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,QAAO;AAAA,kBAEP,UAAAA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,eAAc;AAAA,sBACd,gBAAe;AAAA,sBACf,aAAa;AAAA,sBACb,GAAE;AAAA,oBAAA;AAAA,kBACJ;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UACF;AAAA,QAAA,GACF;AAAA,QAGD,+BAAO,IAAI,CAAC;;AACXA,mDAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAW;AAAA,gBACT;AAAA,gBACA,MAAM,OAAO,aACT,qBACA;AAAA,cACN;AAAA,cAEC,UAAA,MAAM,cAAc,UAAU,8CAC5B,aAAY,EAAA,OAAc,iBAAkC,IAE7DA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAK,oCAAO,SAAP,mBAAa,aAAU,oCAAO,SAAP,mBAAa;AAAA,kBACzC,KAAK,+BAAO;AAAA,kBACZ,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,WACE,MAAM,OAAO,aACT,aAAa,SAAS,CAAC,OAAO,SAAS,CAAC,aACtC,WAAW,IAAI,CACjB,MACA;AAAA,oBACN,YAAY,WAAW,SAAS;AAAA,kBAClC;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,YAxBG,MAAM;AAAA,UAAA;AAAA;AAAA,MA2Bd;AAAA,IAAA;AAAA,EAAA;AAGP;ACjPO,MAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAsB;;AAElB,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,aACI,kFACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA;AAAA,MAEC,UAAA,MAAM,cAAc,UAAU,QAC7BA,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,aAAa,cAAc;AAAA,YAC3B;AAAA,UACF;AAAA,UAEA,UAACA,kCAAA,IAAA,aAAA,EAAY,OAAc,MAAK,SAAQ,iBAAkC;AAAA,QAAA;AAAA,MAAA,IAG5EA,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OACE,oCAAO,SAAP,mBAAa,gBAAa,oCAAO,SAAP,mBAAa,aAAU,oCAAO,SAAP,mBAAa;AAAA,UAEhE,KAAK,+BAAO;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA,aAAa,cAAc;AAAA,YAC3B;AAAA,UACF;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;ACjCO,MAAM,SAAS,WAAwC,CAAC,OAAO,QAAQ;;AACtE,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf;AAAA,IACA,GAAG;AAAA,EACD,IAAA;AACE,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,cAAc,CAAA;AACZ,QAAA,CAAC,YAAY,aAAa,IAAI;AAAA,MAClC,oCAAQ,OAAR,mBAAY,OAAM;AAAA,EAAA;AAGpB,YAAU,MAAM;;AACd,oBAAcU,MAAA,+BAAQ,OAAR,gBAAAA,IAAY,OAAM,EAAE;AAAA,EAAA,GACjC,CAAC,KAAK,CAAC;AAEJ,QAAA,iBACJ,+BAAO,UAAU,CAAC,UAAU,MAAM,OAAO,gBAAe;AAEpD,QAAA,cAAa,+BAAO,WAAU;AAE9B,QAAA,iBAAiB,YAAY,MAAM;;AACvC,QAAI,gBAAgB,GAAG;AACrB,YAAM,YAAY,gBAAgB;AAClC,sBAAcA,MAAA,+BAAQ,eAAR,gBAAAA,IAAoB,OAAM,EAAE;AAAA,IAC5C;AAAA,EAAA,GACC,CAAC,eAAe,KAAK,CAAC;AAEnB,QAAA,aAAa,YAAY,MAAM;;AAC/B,QAAA,gBAAgB,aAAa,GAAG;AAC5B,YAAA,qBACJ,+BAAO,UAAU,CAAC,UAAU,MAAM,OAAO,gBAAe;AAC1D,YAAM,YAAY,oBAAoB;AACtC,sBAAcA,MAAA,+BAAQ,eAAR,gBAAAA,IAAoB,OAAM,EAAE;AAAA,IAC5C;AAAA,KACC,CAAC,eAAe,YAAY,OAAO,UAAU,CAAC;AAEjD,QAAM,gBAAgB;AAAA,IACpB,CAAC,MAAqB;AACpB,UAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;AACjC;MAAA,WACN,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AAC/C;MACb;AAAA,IACF;AAAA,IACA,CAAC,YAAY,cAAc;AAAA,EAAA;AAG7B,YAAU,MAAM;AACP,WAAA,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAAA,GAC/D,CAAC,aAAa,CAAC;AAElB,QAAM,cAAc,gBAAgB;AAC9B,QAAA,UAAU,gBAAgB,aAAa;AAE7C,QAAM,mBAAmB,sBAAsB;AAE/C,QAAM,qBAAqB;AAC3B,QAAM,cAAc,KAAK,MAAM,qBAAqB,CAAC;AACrD,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,gBAAgB,aAAa,aAAa,kBAAkB;AAAA,EAAA;AAEvE,QAAM,WAAW,KAAK,IAAI,aAAa,oBAAoB,UAAU;AAGnE,SAAAT,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,mBAAmB,iCAAiC;AAAA,QACpD;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,UAAA;AAAA,QAAA;AAAA,QAEDD,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW;AAAA,cACT,mBAAmB,qBAAqB;AAAA,cACxC;AAAA,YACF;AAAA,YACA,kBAAkB;AAAA,YAClB,gBAAgB;AAAA,YAChB,iBAAiB;AAAA,YACjB,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QAGC,aAAa,KACZC,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,mBACI,0CACA;AAAA,cACJ;AAAA,YACF;AAAA,YAGC,UAAA;AAAA,cAAA,aAAa,sBACZD,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,mBACI,6EACA;AAAA,oBACJ,CAAC,cACG,kCACA;AAAA,oBACJ;AAAA,kBACF;AAAA,kBACA,cAAW;AAAA,kBAEX,UAAAA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,WAAW;AAAA,wBACT;AAAA,wBACA,oBAAoB;AAAA,wBACpB;AAAA,sBACF;AAAA,sBACA,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,QAAO;AAAA,sBAEP,UAAAA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,eAAc;AAAA,0BACd,gBAAe;AAAA,0BACf,aAAa;AAAA,0BACb,GAAE;AAAA,wBAAA;AAAA,sBACJ;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cACF;AAAA,cAGFA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,mBACI,sCACA;AAAA,kBACN;AAAA,kBAEA,UAAAA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW;AAAA,wBACT;AAAA,wBACA;AAAA,wBACA,mBAAmB,6BAA6B;AAAA,sBAClD;AAAA,sBACA,OAAO;AAAA,wBACL,qBAAqB,UAAU,kBAAkB;AAAA,sBACnD;AAAA,sBAEC,UAAO,+BAAA,IAAI,CAAC,OAAO,UAAU;AACxB,4BAAA,QAAQ,cAAc,SAAS;AAAiB,iCAAA;AAC9C,8BAAA,aAAa,eAAe,MAAM;AAEtC,+BAAAA,kCAAA;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC;AAAA,4BACA;AAAA,4BACA,SAAS,MAAM,cAAc,MAAM,EAAE;AAAA,4BACrC,QAAQ;AAAA,4BACR,WAAW;AAAA,4BACX,YAAY;AAAA,4BACZ,iBAAiB;AAAA,0BAAA;AAAA,0BAPZ,MAAM;AAAA,wBAAA;AAAA,sBAQb;AAAA,oBAEH;AAAA,kBACH;AAAA,gBAAA;AAAA,cACF;AAAA,cAGC,aAAa,sBACZA,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,mBACI,iFACA;AAAA,oBACJ,CAAC,UACG,kCACA;AAAA,oBACJ;AAAA,kBACF;AAAA,kBACA,cAAW;AAAA,kBAEX,UAAAA,kCAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,WAAW;AAAA,wBACT;AAAA,wBACA,oBAAoB;AAAA,wBACpB;AAAA,sBACF;AAAA,sBACA,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,QAAO;AAAA,sBAEP,UAAAA,kCAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,eAAc;AAAA,0BACd,gBAAe;AAAA,0BACf,aAAa;AAAA,0BACb,GAAE;AAAA,wBAAA;AAAA,sBACJ;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;;ACzQM,SAAS,WAAW,OAIxB;AACD,QAAM,EAAE,SAAS,cAAc,iBAAiB,aAAa;AAC7D,QAAM,YAAY;AAAA,IAChB,mBAAmB;AAAA,IACnB,uBAAuB,6BAA6B,mCAAS,KAAK,IAAI,mCAAS,EAAE;AAAA,EAAA;AAIjF,SAAAA,kCAAAA,IAAC,OAAI,EAAA,WAAU,oCACb,UAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAU;AAAA,MACV,MAAK;AAAA,MAEJ,UAAY,YAAA;AAAA,IAAA;AAAA,EAEjB,EAAA,CAAA;AAEJ;;ACxBO,SAAS,aAAa,OAA2C;AACtE,QAAM,EAAE,WAAW,GAAG,KAAA,IAAS;AAC/B,+CAAQ,MAAG,EAAA,WAAW,mBAAmB,WAAY,GAAG,KAAM,CAAA;AAChE;;ACFO,SAAS,mBAAmB,OAA6C;AAC9E,QAAM,EAAE,WAAW,GAAG,KAAA,IAAS;AAE7B,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,KAAK,uBAAuB,SAAS;AAAA,MAC/C,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;;ACRO,SAAS,aACd,OAKA;AACM,QAAA,EAAE,SAAS,OAAAW,QAAO,OAAO,WAAW,QAAQ,GAAG,KAAS,IAAA;AAG5D,SAAAX,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,mBAAmB;AAAA,MAC9B,OAAO;AAAA,QACL,aAAa,UAAU;AAAA,QACvB,cAAc;AAAA,QACd,UAAU;AAAA,QACV,GAAGW;AAAA,QACH;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,UAAAX,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA,KAAK,mCAAS;AAAA,UACd,KAAK,mCAAS;AAAA,QAAA;AAAA,MAChB;AAAA,IAAA;AAAA,EAAA;AAGN;AC1BO,SAAS,YACd,OAIA;AACA,QAAM,EAAE,SAAS,UAAU,KAAA,IAAS;AAE9B,QAAA,SAAQ,6BAAM,WAAS,mCAAS;AAChC,QAAA,eAAc,6BAAM,iBAAe,mCAAS;AAElD,gDACG,QACC,EAAA,UAAA;AAAA,IAACA,kCAAAA,IAAA,eAAA,EAAc,OAAO,6BAAM,OAAO,OAAO,6BAAM,OAC9C,gDAAC,KAAE,EAAA,MAAM,aAAa,mCAAS,IAAI,IACjC,UAACA,kCAAA,IAAA,cAAA,EAAa,SAAkB,QAAQ,6BAAM,OAAQ,CAAA,EAAA,CACxD,EACF,CAAA;AAAA,2CACC,YAAW,EAAA,OAAO,6BAAM,OAAO,OAAO,6BAAM,OAC3C,UAAA;AAAA,MAACA,kCAAA,IAAA,KAAA,EAAE,MAAM,aAAa,mCAAS,IAAI,IACjC,UAAAA,kCAAA,IAAC,cAAc,EAAA,UAAA,MAAM,CAAA,GACvB;AAAA,MACAA,kCAAAA,IAAC,sBAAoB,UAAY,YAAA,CAAA;AAAA,MACjCA,kCAAAA,IAAC,YAAW,EAAA,SAAmB,UAAS,SAAA,CAAA;AAAA,IAAA,GAC1C;AAAA,EACF,EAAA,CAAA;AAEJ;ACtBO,MAAM,cAAc;AAQpB,MAAM,cAAc,CAAC,EAAE,WAA6B;AAClD,SAAAA,sCAAC,eAAY,SAAS,6BAAM,SAAS,MAAY,UAAU,6BAAM,SAAS,CAAA;AACnF;ACjBC,SAAS,SACP,IACA,MACA,UAAqD,CAAA,GAC/B;AACtB,QAAM,EAAE,UAAU,MAAM,WAAW,SAAS;AAC5C,MAAI,YAAkD;AACtD,MAAI,iBAAiB;AACrB,MAAI,WAAiC;AAE/B,QAAA,SAAS,CAAC,MAAc,SAAwB;AACnC,qBAAA;AACjB,OAAG,GAAG,IAAI;AAAA,EAAA;AAGN,QAAA,YAAa,IAAI,SAAwB;AACvC,UAAA,MAAM,KAAK;AAEb,QAAA,CAAC,kBAAkB,CAAC,SAAS;AACd,uBAAA;AAAA,IACnB;AAEM,UAAA,YAAY,QAAQ,MAAM;AACrB,eAAA;AAEP,QAAA,aAAa,KAAK,YAAY,MAAM;AACtC,UAAI,WAAW;AACb,qBAAa,SAAS;AACV,oBAAA;AAAA,MACd;AACA,aAAO,KAAK,IAAI;AACL,iBAAA;AACX;AAAA,IACF;AAEI,QAAA,CAAC,aAAa,UAAU;AAC1B,kBAAY,WAAW,MAAM;AACf,oBAAA;AACZ,YAAI,UAAU;AACZ,iBAAO,UAAU,KAAK,IAAI,IAAI,GAAG,QAAQ;AAC9B,qBAAA;AAAA,QACb;AAAA,SACC,SAAS;AAAA,IACd;AAAA,EAAA;AAGF,YAAU,SAAS,MAAM;AACvB,QAAI,WAAW;AACb,mBAAa,SAAS;AACV,kBAAA;AAAA,IACd;AACW,eAAA;AACM,qBAAA;AAAA,EAAA;AAGZ,SAAA;AACT;AAEe,SAAA,mBAAmB,UAAU,KAAK;AAChD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,IAAI;AACtD,QAAA,oBAAoB,OAA4B,CAAA,CAAE;AAClD,QAAA,mBAAmB,OAAO,CAAC;AAC3B,QAAA,cAAc,OAAsB,IAAI;AAG9C,YAAU,MAAM;AACd,gBAAY,UAAU;AAAA,EAAA,GACrB,CAAC,QAAQ,CAAC;AAGb,YAAU,MAAM;AACd,sBAAkB,UAAU,MAAM;AAAA,MAChC,SAAS,iBAAiB,cAAc;AAAA,IAAA;AAAA,EAE5C,GAAG,CAAE,CAAA;AAEC,QAAA,eAAe,YAAY,MAAM;AACrC,UAAM,YAAY,OAAO;AACzB,qBAAiB,UAAU;AAE3B,QAAI,YAAY;AAChB,QAAI,kBAAkB;AAEJ,sBAAA,QAAQ,QAAQ,CAAC,YAAY;;AAC7C,YAAM,OAAK,aAAQ,aAAa,MAAM,MAA3B,mBAA8B,MAAM,OAAM;AAC/C,YAAA,gBAAgB,SAAS,eAAe,EAAE;AAEhD,UAAI,eAAe;AACjB,cAAM,EAAE,IAAA,IAAQ,cAAc,sBAAsB;AAC9C,cAAA,WAAW,KAAK,IAAI,GAAG;AACzB,YAAA,OAAO,WAAW,WAAW,iBAAiB;AACpC,sBAAA;AACM,4BAAA;AAAA,QACpB;AAAA,MACF;AAAA,IAAA,CACD;AAEG,QAAA,YAAY,YAAY,WAAW;AACrC,kBAAY,SAAS;AAAA,IACvB;AAAA,EAAA,GACC,CAAC,OAAO,CAAC;AAGZ,QAAM,wBAAwB;AAAA,IAC5B,MAAM,SAAS,cAAc,KAAK,EAAE,SAAS,MAAM,UAAU,MAAM;AAAA,IACnE,CAAC,YAAY;AAAA,EAAA;AAGf,YAAU,MAAM;AACd,UAAM,mBAAmB,MAAM;AAC7B,YAAM,OAAO,OAAO,SAAS,KAAK,UAAU,CAAC;AAC7C,kBAAY,IAAI;AAEV,YAAA,UAAU,SAAS,eAAe,IAAI;AAC5C,UAAI,SAAS;AACX,cAAM,IACJ,QAAQ,sBAAA,EAAwB,MAAM,OAAO,UAAU;AACzD,eAAO,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU;AAAA,MAChD;AAAA,IAAA;AAGK,WAAA,iBAAiB,cAAc,gBAAgB;AAC/C,WAAA,iBAAiB,UAAU,qBAAqB;AAGtC;AAEjB,WAAO,MAAM;AACJ,aAAA,oBAAoB,cAAc,gBAAgB;AAClD,aAAA,oBAAoB,UAAU,qBAAqB;AAC1D,4BAAsB,OAAO;AAAA,IAAA;AAAA,EAE9B,GAAA,CAAC,cAAc,uBAAuB,OAAO,CAAC;AAE1C,SAAA;AACT;AC/HO,MAAM,kBAAkB,WAG7B,CAAC,OAAO,QAAQ;AACV,QAAA,EAAE,WAAW,eAAe,OAAO,UAAU,KAAK,GAAG,KAAS,IAAA;AAC9D,QAAA,aAAa,mBAAmB,OAAO;AACvC,QAAA,MAAM,YAAY,SAAS,EAAE;AAC7B,QAAA,UAAU,yBAAyB,GAAG;AAE5C,YAAU,MAAM;AACd,UAAM,mBAAmB,MAAM;AAC7B,YAAM,UAAU,SAAS;AAAA,QACvB,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,MAAA;AAElC,UAAI,SAAS;AACX,cAAM,IACJ,QAAQ,sBAAA,EAAwB,MAAM,OAAO,UAAU;AACzD,eAAO,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU;AAAA,MAChD;AAAA,IAAA;AAGK,WAAA,iBAAiB,cAAc,gBAAgB;AAEtD,WAAO,MAAM;AACJ,aAAA,oBAAoB,cAAc,gBAAgB;AAAA,IAAA;AAAA,EAC3D,GACC,CAAC,OAAO,CAAC;AAEZ,UAAO,mCAAS,UACbA,kCAAA,IAAA,MAAA,EAAG,KAAU,WAAuB,GAAG,MACrC,UAAS,mCAAA,IAAI,CAAC,MAAM,UAAU;AAE3B,WAAAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW;AAAA,UACT,gBAAe,6BAAM,OAAM,YAAY;AAAA,UACvC;AAAA,QACF;AAAA,QAEA,UAAAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,IAAI,6BAAM,GAAG;AAAA,YACnB,SAAS,CAAC,MAAM;AACd,gBAAE,eAAe;AACjB,oBAAM,UAAU,SAAS,eAAe,6BAAM,GAAG;AACjD,kBAAI,SAAS;AACX,sBAAM,IACJ,QAAQ,sBAAA,EAAwB,MAChC,OAAO,UACP;AACF,uBAAO,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU;AAAA,cAChD;AAAA,YACF;AAAA,YAEC,UAAM,6BAAA;AAAA,UAAA;AAAA,QACT;AAAA,MAAA;AAAA,OArBK,6BAAM,OAAM;AAAA,IAAA;AAAA,EAsBnB,IAGN,IACE;AACN,CAAC;AC9DM,MAAM,WAAyB;AAAA,EACpC,UAAU;AAAA,IACR,OAAO;AAAA,IACP,MACEA,kCAAAA,IAAC,QAAK,EAAA,GAAE,mMAAmM,CAAA;AAAA,IAE7M,OAAO;AAAA,IACP,KAAK,CAAC,GAAG,GAAG,OACV,uDAAuD,mBAAmB,CAAC,CAAC,UAAU,mBAAmB,MAAM,EAAE,CAAC,YAAY,mBAAmB,KAAK,EAAE,CAAC;AAAA,EAC7J;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,MACEA,kCAAAA,IAAC,QAAK,EAAA,GAAE,2IAA2I,CAAA;AAAA,IAErJ,OAAO;AAAA,IACP,KAAK,CAAC,MAAM,gDAAgD,mBAAmB,CAAC,CAAC;AAAA,EACnF;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,MACEA,kCAAAA,IAAC,QAAK,EAAA,GAAE,8JAA8J,CAAA;AAAA,IAExK,OAAO;AAAA,IACP,KAAK,CAAC,GAAG,MAAM,yCAAyC,CAAC,QAAQ,mBAAmB,CAAC,CAAC;AAAA,EACxF;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,MACEA,kCAAAA,IAAC,QAAK,EAAA,GAAE,4hBAA4hB,CAAA;AAAA,IAEtiB,OAAO;AAAA,IACP,KAAK,CAAC,GAAG,MAAM,sCAAsC,mBAAmB,KAAK,EAAE,CAAC,IAAI,mBAAmB,CAAC,CAAC;AAAA,EAC3G;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MACEA,kCAAAA,IAAC,QAAK,EAAA,GAAE,0vBAA0vB,CAAA;AAAA,IAEpwB,OAAO;AAAA,IACP,KAAK,CAAC,GAAG,MAAM,qCAAqC,mBAAmB,CAAC,CAAC,UAAU,mBAAmB,KAAK,EAAE,CAAC;AAAA,EAChH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BF;AChEA,SAAS,iBAAiB;;AACpB,MAAA,OAAO,WAAW,aAAa;AAC1B,WAAA;AAAA,EACT;AACA,QAAM,UAAU;AAAA,IACd,MAAK,sCAAQ,aAAR,mBAAkB;AAAA,IACvB,QAAO,qCAAU,UAAS;AAAA,IAC1B,aAAa;AAAA;AAAA,EAAA;AAGT,QAAA,qBAAqB,SAAS,cAAc,0BAA0B;AAC5E,MAAI,oBAAoB;AACtB,YAAQ,cAAe,mBAAuC;AAAA,EAChE;AAEO,SAAA;AACT;AAEO,MAAM,QAAQ;AAAA,EACnB,CAAC,OAAmB,QAAQ;AAC1B,UAAM,EAAE,WAAW,YAAY,GAAG,SAAS;AAC3C,UAAM,CAAC,YAAY,cAAc,IAAI,SAAuB;AAE5D,UAAM,UAAU;AAEhB,cAAU,MAAM;AACd,qBAAe,QAAQ;AAAA,IAAA,GACtB,CAAC,MAAM,OAAO,CAAC;AAGZ,UAAA,eAAe,CAAC,QAAgB;AAC9B,YAAA,SAAS,SAAS,GAAG;AAC3B,UAAI,CAAC;AAAe,eAAA;AACpB,aAAO,OAAO;AAAA,SACZ,mCAAS,QAAO;AAAA,QAChB,mCAAS;AAAA,QACT,mCAAS;AAAA,MAAA;AAAA,IACX;AAIA,WAAAA,sCAAC,SAAI,KAAU,WAAW,KAAK,qBAAqB,SAAS,GAAI,GAAG,MAClE,UAAAA,kCAAAA,IAAC,SAAI,WAAU,kBACZ,iBAAO,KAAK,cAAc,EAAE,EAAE,IAAI,CAAC,QAClCA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAM,aAAa,GAAG;AAAA,QACtB,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,OAAO,YAAY,SAAS,GAAG,EAAE,KAAK;AAAA,QACtC,WAAW;AAAA,UACT;AAAA,UACA,yCAAY;AAAA,QACd;AAAA,QAEA,UAAAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,KAAK,WAAW,yCAAY,QAAQ;AAAA,YAC/C,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,eAAY;AAAA,YAEX,UAAA,SAAS,GAAG,EAAE;AAAA,UAAA;AAAA,QACjB;AAAA,MAAA;AAAA,MAlBK;AAAA,IAAA,CAoBR,GACH,EACF,CAAA;AAAA,EAEJ;AACF;ACnFO,MAAM,mBAAmB;AAMzB,SAAS,SAAS,OAAsB;AACvC,QAAA,EAAE,YAAY,iBAAqB,IAAA;AACnC,QAAA,MAAM,OAAuB,IAAI;AACvC,QAAM,CAAC,KAAK,MAAM,IAAI,SAAwB,IAAI;AAElD,YAAU,MAAM;AACd,QAAI,IAAI,SAAS;AACR,aAAA,IAAI,QAAQ,cAAc,WAAW;AAAA,IAC9C;AAAA,EACF,GAAG,CAAE,CAAA;AAEC,QAAA,WAAW,YAAY,MAAM;AACjC,QAAI,CAAC;AAAK;AACJ,UAAA,WAAW,IAAI,UAAU;AAC/B,UAAM,MAAM,IAAI;AAEhB,QAAI,UAAU;AACR,UAAA,KAAK,UAAU,IAAI,UAAU;AAAA,IAAA,OAC5B;AACD,UAAA,KAAK,UAAU,OAAO,UAAU;AAAA,IACtC;AAAA,EAAA,GACC,CAAC,WAAW,GAAG,CAAC;AAEnB,YAAU,MAAM;AACd,QAAI,CAAC;AAAK;AACN,QAAA,iBAAiB,UAAU,QAAQ;AACvC,WAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,EAAA,GACtD,CAAC,UAAU,GAAG,CAAC;AAElB,+CAAQ,OAAI,EAAA,KAAU,OAAO,EAAE,SAAS,OAAU,EAAA,CAAA;AACpD;AClCO,MAAM,cAAc;AAAA,EACzB,CAAC,OAAO,QAAQ;AAEd,UAAM,EAAE,UAAU,GAAG,KAAA,IAAS;AAC9B,UAAM,CAAC,SAAS,UAAU,IAAI,SAAiB;AAG7C,WAAAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,QACzC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;ACZO,MAAM,UAAU,MACrBA,kCAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAU;AAAA,IACV,OAAM;AAAA,IACN,QAAO;AAAA,IACP,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IAEP,UAAAA,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAa;AAAA,QACb,GAAE;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AACF;AAGK,MAAM,QAAQ,WAAuC,CAAC,OAAO,QAAQ;AAC1E,QAAM,EAAE,WAAW,KAAK,GAAG,SAAS;AACpC,QAAM,CAAC,KAAK,MAAM,IAAI,SAAwB,IAAI;AAC5C,QAAA,WAAW,OAAuB,IAAI;AAG5C,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AAAS;AAGjB,UAAA,aAAa,SAAS,QAAQ,cAAc;AAClD,WAAO,UAAU;AAGb,QAAA,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAI,UAAU,SAAS;AAAA,IACzB;AAAA,EAAA,GACC,CAAC,GAAG,CAAC;AAER,QAAM,cAAc,MAAM;AACxB,QAAI,KAAK;AACP,UAAI,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU;AAAA,IAAA,WAClC,OAAO,WAAW,aAAa;AAExC,aAAO,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU;AAAA,IAChD;AAAA,EAAA;AAIA,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MACJ,SAAS;AAAA,MAER,UAAA,MACEA,kCAAAA,IAAA,OAAA,EAAI,WAAU,YAAW,yBAAyB,EAAE,QAAQ,MAAO,CAAA,IAEpE,QAAQ;AAAA,IAAA;AAAA,EAAA;AAIhB,CAAC;ACrEM,SAAS,sBAAsB,OAA8C;AAClF,QAAM,EAAE,QAAQ,KAAK,WAAW,GAAG,UAAc,IAAA;AAC3C,QAAA,WAAW,OAAyB,IAAI;AAE9C,YAAU,MAAM;AACd,QAAI,SAAS,SAAS;AACpB,YAAM,QAAQ,SAAS;AAGvB,YAAM,KAAK,EAAE,MAAM,CAAC,UAAU;AACpB,gBAAA,IAAI,WAAW,KAAK;AAAA,MAAA,CAC7B;AAAA,IACH;AAAA,EACF,GAAG,CAAE,CAAA;AAGH,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAQ;AAAA,MACR,MAAI;AAAA,MACJ,OAAK;AAAA,MACL,aAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACR;AAAA,MACC,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AC3BA,MAAM,sCAAsB,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,yBACd,OACA;AACA,QAAM,EAAE,QAAQ,KAAK,WAAW,GAAG,aAAiB,IAAA;AAEpD,QAAM,YAAqC,CAAA;AAC3C,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC7C,QAAA,gBAAgB,IAAI,CAAC;AAAG;AACxB,QAAA,EAAE,WAAW,GAAG;AAAG;AACvB,QAAI,OAAO,MAAM;AAAY;AAC7B,cAAU,CAAC,IAAI;AAAA,EACjB;AACM,QAAA,WAAW,OAAyB,IAAI;AAE9C,YAAU,MAAM;AACV,QAAA,CAAC,SAAS,WAAW,CAAC;AAAK;AAE/B,UAAM,QAAQ,SAAS;AAEnB,QAAA,CAAC,IAAI,eAAe;AAClB,UAAA,MAAM,YAAY,+BAA+B,GAAG;AACtD,cAAM,MAAM;AACN,cAAA,OAAO,MAAM,MAAM;AAAA,QAAA,CAAE;AAAA,MAC7B;AACA;AAAA,IACF;AAEM,UAAA,MAAM,IAAI,IAAI;AAAA,MAClB,cAAc;AAAA,IAAA,CACf;AAED,QAAI,GAAG,IAAI,OAAO,iBAAiB,MAAM;AACjC,YAAA,OAAO,MAAM,MAAM;AAAA,MAAA,CAAE;AAAA,IAAA,CAC5B;AAED,QAAI,GAAG,IAAI,OAAO,OAAO,CAAC,OAAO,SAAS;AACxC,UAAI,KAAK,OAAO;AACd,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK,IAAI,WAAW;AAClB,gBAAI,UAAU;AACd;AAAA,UACF,KAAK,IAAI,WAAW;AAClB,gBAAI,kBAAkB;AACtB;AAAA,UACF;AACE,gBAAI,QAAQ;AACZ;AAAA,QACJ;AAAA,MACF;AAAA,IAAA,CACD;AAED,QAAI,WAAW,GAAG;AAClB,QAAI,YAAY,KAAK;AAErB,WAAO,MAAM;AACX,UAAI,QAAQ;AAAA,IAAA;AAAA,EACd,GACC,CAAC,GAAG,CAAC;AAGN,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAQ;AAAA,MACR,MAAI;AAAA,MACJ,OAAK;AAAA,MACL,aAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACP,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AC7FO,SAAS,SAAS,OAA+B;AACtD,QAAM,EAAE,WAAW,GAAG,KAAA,IAAS;AAC/B,QAAM,CAAC,UAAU,WAAW,IAAI,SAA+B,IAAI;AAEnE,YAAU,MAAM;AACR,UAAA,mBAAmB,EACtB,KAAK,CAAC,QAAQ,IAAI,MAAM,EACxB,KAAK,CAAC,QAAQ;AACb,UAAI,IAAI,SAAS;AACf,oBAAY,IAAI,IAAI;AAAA,MACtB;AAAA,IAAA,CACD,EACA,MAAM,CAAC,QAAQ;AACN,cAAA,MAAM,4BAA4B,GAAG;AAAA,IAAA,CAC9C;AAAA,EACL,GAAG,CAAE,CAAA;AAEG,UAAA,IAAI,iBAAiB,QAAQ;AAErC,MAAI,CAAC;AAAiB,WAAA;AAEtB,+CACG,OAAI,EAAA,WAAuB,GAAG,MAC5B,mBAAS,QACZ,CAAA;AAEJ;AC3BO,SAAS,kBAAkB,OAK/B;AACK,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACE,IAAA;AACJ,QAAM,YAAY;AAAA,IAChB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,EAAA;AAGvB,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,MAAK;AAAA,MAEJ,UAAY,YAAA;AAAA,IAAA;AAAA,EAAA;AAGnB;ACzBO,SAAS,cAAc,OAO3B;AACK,QAAA,EAAE,WAAe,IAAA;AAErB,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWY;AAAAA,QACT;AAAA,QACA,yCAAY;AAAA,MACd;AAAA,MAEA,UAAAZ,kCAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWY;AAAAA,YACT;AAAA,YACA,yCAAY;AAAA,UACd;AAAA,UAEA,gDAAC,OAAI,EAAA,WAAU,gDACb,UAACZ,kCAAA,IAAA,OAAA,EAAI,WAAU,kDACb,UAAAA,kCAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWY;AAAAA,gBACT;AAAA,gBACA,yCAAY;AAAA,cACd;AAAA,cACA,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAM;AAAA,cAEN,UAAAZ,kCAAAA,IAAC,QAAK,EAAA,GAAE,iMAAiM,CAAA;AAAA,YAAA;AAAA,aAE7M,EACF,CAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;ACXO,MAAM,mBAAmB,WAc9B,CAAC,OAAO,QAAQ;;AACV,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACD,IAAA;AACE,QAAA,WAAW,OAAyB,IAAI;AACxC,QAAA,SAAS,OAAmB,IAAI;AACtC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AAClD,QAAA,iBAAiB,OAAO,KAAK;AACnC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAC1C,QAAA,aAAa,OAAO,KAAK;AAC/B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAE5C,QAAA,oBAAoB,YAAY,MAAM;;AAC1C,UAAM,QAAQ,SAAS;AACjB,UAAA,OAAMU,MAAA,+BAAO,SAAP,gBAAAA,IAAa;AACrB,QAAA,CAAC,SAAS,CAAC;AAAY,aAAA;AAC3B,QAAI,eAAe;AAAgB,aAAA;AAE/B,SAAA,+BAAO,iBAAgB,qBAAqB;AAC1C,UAAA,CAAC,IAAI,eAAe;AAClB,YAAA,MAAM,YAAY,+BAA+B,GAAG;AACtD,gBAAM,MAAM;AACZ,yBAAe,UAAU;AACzB,2BAAiB,IAAI;AACd,iBAAA;AAAA,QACT;AACO,eAAA;AAAA,MACT;AAEA,YAAM,MAAM,IAAI,IAAI,EAAE,cAAc,KAAM,CAAA;AAC1C,UAAI,GAAG,IAAI,OAAO,OAAO,CAAC,QAAQ,SAAS;AACzC,YAAI,KAAK,OAAO;AACd,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,IAAI,WAAW;AAClB,kBAAI,UAAU;AACd;AAAA,YACF,KAAK,IAAI,WAAW;AAClB,kBAAI,kBAAkB;AACtB;AAAA,YACF;AACE,kBAAI,QAAQ;AACZ;AAAA,UACJ;AAAA,QACF;AAAA,MAAA,CACD;AACD,UAAI,WAAW,GAAG;AAClB,UAAI,YAAY,KAAK;AACrB,aAAO,UAAU;AACjB,qBAAe,UAAU;AACzB,uBAAiB,IAAI;AACd,aAAA;AAAA,IACT;AAEA,UAAM,MAAM;AACZ,mBAAe,UAAU;AACzB,qBAAiB,IAAI;AACd,WAAA;AAAA,EAAA,GACN,EAAC,oCAAO,SAAP,mBAAa,UAAU,+BAAO,WAAW,CAAC;AAE9C,QAAM,uBAAuB;AAAA,IAC3B,CAAC,MAAwB;AACnB,UAAA;AAAY;AACZ,UAAA,aAAa,SAAS,SAAS;AACjC,UAAE,gBAAgB;AAClB,iBAAS,QAAQ;AACjB;AAAA,MACF;AACI,WAAA,+BAAO,OAAM,MAAM;AACrB,yDAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,WAAW,+BAAO,IAAI,gBAAgB,UAAU;AAAA,EAAA;AAGnD,QAAM,kBAAkB;AAAA,IACtB,CAAC,MAAwB;AACnB,UAAA;AAAY;AAChB,QAAE,gBAAgB;AAClB,YAAM,IAAI,SAAS;AACnB,UAAI,CAAC;AAAG;AACR,UAAI,WAAW;AACb,UAAE,MAAM;AACR;AAAA,MACF;AAEA,YAAM,KAAK;AACX,UAAI,CAAC;AAAI;AAET,mBAAa,IAAI;AAEjB,QAAE,KAAK,EAAE,MAAM,CAAC,UAAU;AAChB,gBAAA,IAAI,mCAAmC,KAAK;AACpD,qBAAa,KAAK;AAAA,MAAA,CACnB;AAAA,IACH;AAAA,IACA,CAAC,WAAW,YAAY,iBAAiB;AAAA,EAAA;AAG3C,YAAU,MAAM;AACd,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC;AAAO;AAEZ,UAAM,MAAM;AACZ,QAAI,OAAO,SAAS;AAClB,aAAO,QAAQ;AACf,aAAO,UAAU;AAAA,IACnB;AACA,UAAM,gBAAgB,KAAK;AAC3B,UAAM,KAAK;AACX,qBAAiB,KAAK;AACtB,mBAAe,UAAU;AAEzB,UAAM,SAAS,MAAM;AACnB,mBAAa,IAAI;AACjB,iBAAW,KAAK;AAChB,iBAAW,UAAU;AACrB,mBAAa,KAAK;AAClB,oBAAc,IAAI;AAAA,IAAA;AAEd,UAAA,UAAU,MAAM,aAAa,KAAK;AACxC,UAAM,UAAU,MAAM;AACpB,mBAAa,KAAK;AAClB,iBAAW,IAAI;AACf,iBAAW,UAAU;AACrB,mBAAa,KAAK;AAAA,IAAA;AAEpB,UAAM,YAAY,MAAM;AACtB,UAAI,CAAC,WAAW;AAAS,qBAAa,IAAI;AAAA,IAAA;AAE5C,UAAM,YAAY,MAAM;AACtB,mBAAa,KAAK;AAAA,IAAA;AAGd,UAAA,iBAAiB,QAAQ,MAAM;AAC/B,UAAA,iBAAiB,SAAS,OAAO;AACjC,UAAA,iBAAiB,SAAS,OAAO;AACjC,UAAA,iBAAiB,WAAW,SAAS;AACrC,UAAA,iBAAiB,WAAW,SAAS;AACrC,UAAA,iBAAiB,WAAW,SAAS;AAE3C,QAAI,WAAW;AACK;IACpB;AAEA,WAAO,MAAM;AACL,YAAA,oBAAoB,QAAQ,MAAM;AAClC,YAAA,oBAAoB,SAAS,OAAO;AACpC,YAAA,oBAAoB,SAAS,OAAO;AACpC,YAAA,oBAAoB,WAAW,SAAS;AACxC,YAAA,oBAAoB,WAAW,SAAS;AACxC,YAAA,oBAAoB,WAAW,SAAS;AAE9C,UAAI,OAAO,SAAS;AAClB,eAAO,QAAQ;AACf,eAAO,UAAU;AAAA,MACnB;AAAA,IAAA;AAAA,EACF,GACC,CAAC,WAAW,oBAAmB,oCAAO,SAAP,mBAAa,UAAU,+BAAO,WAAW,CAAC;AAG1E,SAAAT,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,SACA,yCAAY,WAAU;AAAA,QACtB,yCAAY;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MACR,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB;AAAA,YACjD,SAAS,YAAY,aAAa;AAAA,YAClC,QAAQ,eAAa,oCAAO,SAAP,mBAAa;AAAA,YAClC,WAAW;AAAA,cACT;AAAA,cACA,yCAAY;AAAA,YACd;AAAA,YACA,aAAW;AAAA,YACX,UAAU,CAAC,cAAc;AAAA,YACzB,yBAAuB;AAAA,YACvB,cAAa;AAAA,YAEZ,UAAA;AAAA,cAAA,EAAC,+BAAO,kBACT,oCAAO,SAAP,mBAAa,cACZ,aAAa,iBACZD,kCAAAA,IAAC,UAAO,EAAA,KAAK,MAAM,KAAK,SAAU,CAAA,IAChC;AAAA,cAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QAEX;AAAA,QAEC,CAAC,aAAa,CAAC,WAAW,CAAC,aAC1BA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA,aAAa,mBAAmB;AAAA,cAChC,yCAAY;AAAA,YACd;AAAA,YAEC,UAAA,YAAaA,kCAAAA,IAAA,eAAA,EAAc,WAAwB,CAAA;AAAA,UAAA;AAAA,QACtD;AAAA,QAGD,CAAC,aAAa,CAAC,WAAW,aACzBA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,yCAAY;AAAA,YACd;AAAA,YACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAElC,UAAAC,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,yCAAY;AAAA,gBACd;AAAA,gBAEA,UAAA;AAAA,kBAACD,kCAAAA,IAAA,OAAA,EAAI,WAAU,4EAA4E,CAAA;AAAA,kBAC1FA,kCAAA,IAAA,QAAA,EAAK,WAAU,WAAU,UAAU,cAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACtC;AAAA,UAAA;AAAA,QACF;AAAA,QAGFC,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,yCAAY;AAAA,YACd;AAAA,YACA,OAAO,EAAE,SAAS,UAAU,SAAS,OAAO;AAAA,YAE5C,UAAA;AAAA,cAAAD,kCAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,KAAK,2BAA2B,yCAAY,YAAY;AAAA,kBAElE,UAAY,YAAA;AAAA,gBAAA;AAAA,cACf;AAAA,cACAC,kCAAAA,KAAC,OAAI,EAAA,WAAU,2BACb,UAAA;AAAA,gBAAAD,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,yCAAY;AAAA,oBACd;AAAA,oBACA;AAAA,oBACD,UAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,gBACAA,kCAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAW;AAAA,sBACT;AAAA,sBACA,yCAAY;AAAA,oBACd;AAAA,oBACA,SAAS,CAAC,MAAM;AACd,wBAAE,gBAAgB;AAClB,4BAAM,IAAI,SAAS;AACnB,0BAAI,CAAC;AAAG;AACR,4BAAM,KAAK;AACX,0BAAI,CAAC;AAAI;AACT,mCAAa,IAAI;AACjB,wBAAE,cAAc;AAChB,iCAAW,KAAK;AAChB,wBAAE,KAAK,EAAE,MAAM,CAAC,UAAU;AAChB,gCAAA,IAAI,mCAAmC,KAAK;AACpD,qCAAa,KAAK;AAAA,sBAAA,CACnB;AAAA,oBACH;AAAA,oBACD,UAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,cAAA,GACF;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AC1TM,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","x_google_ignoreList":[4,5,6]}