{"version":3,"sources":["../src/components/Branded/index.tsx","../src/components/Branded/elements/WidgetContainer.tsx","../src/components/Branded/elements/CtaButton.tsx","../src/components/utils/Link.tsx","../src/components/utils/Image.tsx","../src/components/Branded/elements/Logo.tsx","../src/components/Branded/elements/Dropdown.tsx","../src/utils/colors.ts","../src/utils/calculateContentBorderRadius.ts","../src/components/Branded/elements/CurrencyDropdown.tsx","../src/components/Branded/elements/PairDropdown.tsx","../src/components/Branded/elements/TextInput.tsx","../src/components/Branded/elements/Button.tsx","../src/components/Branded/elements/ButtonGroup.tsx","../src/components/Branded/elements/Label.tsx","../src/components/Branded/elements/ResultsContainer.tsx","../src/components/Branded/elements/Table.tsx","../src/components/StringDatePicker.tsx","../src/components/Branded/elements/DateRangePicker.tsx","../src/components/Branded/elements/LangDropdown.tsx","../src/utils/widgetApiBase.ts","../src/functions/fetchLangs.ts","../src/components/Branded/elements/Tabs.tsx","../src/functions/fetchLogoUrl.ts","../src/components/Branded/elements/ScrollContainer.tsx","../src/components/widgets/EconomicCalendar/index.tsx","../src/assets/dictionaries/ar.json","../src/assets/dictionaries/cn.json","../src/assets/dictionaries/cs.json","../src/assets/dictionaries/de.json","../src/assets/dictionaries/en.json","../src/assets/dictionaries/es.json","../src/assets/dictionaries/esmx.json","../src/assets/dictionaries/fr.json","../src/assets/dictionaries/he.json","../src/assets/dictionaries/hi.json","../src/assets/dictionaries/id.json","../src/assets/dictionaries/ir.json","../src/assets/dictionaries/it.json","../src/assets/dictionaries/jp.json","../src/assets/dictionaries/my.json","../src/assets/dictionaries/pl.json","../src/assets/dictionaries/ptbr.json","../src/assets/dictionaries/ru.json","../src/assets/dictionaries/th.json","../src/assets/dictionaries/tr.json","../src/assets/dictionaries/vn.json","../src/assets/dictionaries/sv.json","../src/assets/dictionaries/kr.json","../src/assets/dictionaries/km.json","../src/assets/data/economic.json","../src/dictionaries.ts","../src/functions/fetchEconomicData.ts","../src/components/FancyLoader.tsx","../src/components/widgets/EconomicCalendar/functions/groupEventsByDate.ts","../src/utils/datesAndTimes.ts","../src/components/widgets/EconomicCalendar/functions/getDateFilterData.ts","../src/components/widgets/EconomicCalendar/parts/EconomicCalendarFilters.tsx","../src/components/Branded/elements/ComplexTable.tsx","../src/components/widgets/EconomicCalendar/buildEconomicCalendarTable.tsx","../src/utils/numbers.ts","../src/components/widgets/EconomicCalendar/parts/TimeAndFlagCell.tsx","../src/components/widgets/EconomicCalendar/parts/ImpactBadge.tsx","../src/utils/createUnit.ts","../src/components/widgets/Signals/index.tsx","../src/functions/fetchSignalsData.ts","../src/components/widgets/Signals/parts/layouts/SingleAssetLayout.tsx","../src/components/widgets/Signals/parts/Signal.tsx","../src/components/widgets/Signals/parts/layouts/ListLayout.tsx","../src/components/widgets/Signals/functions/decideColumnMode.ts","../src/components/widgets/Signals/functions/decideLayoutMode.ts","../src/components/widgets/special/HolaPrimeEconomicCalendar/index.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/functions/groupEventsByDate.ts","../src/components/widgets/special/HolaPrimeEconomicCalendar/parts/EconomicCalendarFilters.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/functions/getDateFilterData.ts","../src/components/widgets/special/HolaPrimeEconomicCalendar/elements/Dropdown.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/elements/LangDropdown.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/elements/DateRangePicker.tsx","../src/components/Calendar.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/elements/DatePicker.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/buildEconomicCalendarTable.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/parts/ImpactBadge.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/parts/ImpactedInstrumentsCell.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/elements/Dialog.tsx","../src/functions/fetchHolaPrimeEconomicData.ts","../src/components/widgets/special/HolaPrimeEconomicCalendar/parts/SegmentedToggle.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendar/elements/ComplexTable.tsx","../src/functions/fetchHolaPrimeStockData.ts","../src/components/widgets/special/HolaPrimeEconomicCalendar/buildStockCalendarTable.tsx","../src/components/widgets/special/HolaPrimeEconomicCalendarWithStocks.tsx","../src/components/widgets/academy/Chapters/index.tsx","../src/functions/fetchAcademyChapters.ts","../src/components/widgets/academy/Chapters/parts/ChaptersGrid.tsx","../src/components/Star.tsx","../src/components/LoactionPoint.tsx","../src/components/Stopwatch.tsx","../src/components/widgets/academy/Chapters/AcademyBranding/index.tsx","../src/components/widgets/academy/Chapters/AcademyBranding/elements/WidgetContainer.tsx","../src/components/widgets/academy/Chapters/AcademyBranding/elements/Button.tsx","../src/components/widgets/academy/Chapters/AcademyBranding/elements/ScrollContainer.tsx","../src/components/widgets/academy/Chapters/parts/ChapterTile.tsx","../src/functions/fetchAcademyHeaderImage.ts","../src/components/widgets/academy/Chapters/parts/ChapterPage.tsx","../src/functions/fetchAcademyPdfUrl.ts","../src/components/widgets/academy/Chapters/parts/PdfModal.tsx","../src/components/widgets/academy/Chapters/parts/PdfThumbnails.tsx","../src/components/widgets/Heatmap/index.tsx","../src/functions/fetchHeatmapData.ts","../src/components/widgets/Heatmap/constants.ts","../src/utils/formatLangFilename.ts","../src/components/widgets/Heatmap/PeriodNavigator.tsx","../src/components/Branded/elements/LogoBG.tsx","../src/components/FitText.tsx","../src/components/widgets/Heatmap/CellContent.tsx","../src/components/widgets/CurrencyConverter.tsx","../src/functions/convertCurrency.ts","../src/components/widgets/Fibonacci.tsx","../src/components/widgets/MarginCalculator.tsx","../src/functions/calculateMargin.ts","../src/components/widgets/Pivots.tsx","../src/components/widgets/StopLossTakeProfit.tsx","../src/components/widgets/StopLossTakeProfitLevels.tsx","../src/components/widgets/Glossary.tsx","../src/functions/fetchGlossaryDefinitions.ts","../src/functions/firstLetterNonLatin.ts","../src/components/widgets/News/index.tsx","../src/components/widgets/News/functions/fetchNewsArticles.ts","../src/components/widgets/News/parts/RelatedArticles.tsx","../src/components/widgets/News/parts/Article.tsx","../src/components/widgets/News/parts/ArticlePreview.tsx","../src/components/widgets/News2/parts/BreakingBadge.tsx","../src/components/Branded/elements/VirtualList.tsx","../src/components/widgets/News/parts/PaginationControls.tsx","../src/components/widgets/News2/index.tsx","../src/utils/loadGoogleFont.ts","../src/components/widgets/News2/RawNews2.tsx","../src/components/widgets/News2/constants.ts","../src/components/widgets/News2/utils/contrast.ts","../src/components/widgets/News2/parts/CategoryTabs.tsx","../src/components/widgets/News2/parts/HeaderBar.tsx","../src/components/widgets/News2/parts/ArticleCard.tsx","../src/components/widgets/News2/utils/readingTime.ts","../src/components/widgets/News2/utils/formatDate.ts","../src/components/widgets/News2/parts/FeaturedHero.tsx","../src/components/charts/StockWidget/index.tsx","../src/components/charts/AreaChart.tsx","../src/components/charts/fetchCandles.ts","../src/components/charts/fetchMacro.ts","../src/components/charts/types.ts","../src/components/charts/StockWidget/format.ts","../src/components/charts/StockWidget/parts/AssetHeader.tsx","../src/components/charts/StockWidget/parts/AssetTabs.tsx","../src/components/charts/StockWidget/parts/PriceBlock.tsx","../src/components/charts/StockWidget/sample.ts","../src/components/charts/StockWidget/theme.ts","../src/utils/getDictionarySection.ts","../src/components/TimeframeTabs.tsx","../src/components/widgets/News2/parts/NFAssetChart.tsx","../src/components/widgets/News2/parts/TechnicalAnalysisWidget.tsx","../src/components/widgets/News2/parts/ArticleDetail.tsx","../src/components/widgets/News2/parts/ReadingProgressBar.tsx","../src/components/widgets/News2/parts/ArticleStickyHeader.tsx","../src/components/widgets/News2/parts/ShareButtons.tsx","../src/components/widgets/News2/parts/ArticleHero.tsx","../src/components/widgets/News2/parts/articleConstants.ts","../src/components/widgets/News2/parts/ArticleBody.tsx","../src/components/widgets/News3/parts/RelatedNews.tsx","../src/components/widgets/News2/parts/RawNews2Helpers.tsx","../src/components/widgets/News3/index.tsx","../src/components/widgets/News3/RawNews3.tsx","../src/components/widgets/News3/parts/DashboardHeader.tsx","../src/components/widgets/News3/parts/NewsTabs.tsx","../src/components/widgets/News3/parts/ArticleActions.tsx","../src/components/widgets/News3/parts/CategoryPill.tsx","../src/components/widgets/News3/parts/HeroFeature.tsx","../src/components/widgets/News3/parts/StoryRow.tsx","../src/components/widgets/News3/parts/StoryList.tsx","../src/components/widgets/News3/parts/FeaturedAside.tsx","../src/components/widgets/TopMovers/index.tsx","../src/components/widgets/TopMovers/fetchMovers.ts","../src/components/widgets/TopMovers/parts/MoverLogo.tsx","../src/components/widgets/TopMovers/parts/MoverRow.tsx","../src/components/widgets/TopMovers/types.ts","../src/components/widgets/TopMovers/parts/MoversTabs.tsx","../src/components/widgets/TopMovers/sample.ts","../src/components/widgets/TopMovers/theme.ts","../src/components/widgets/News3/parts/PopularTopics.tsx","../src/components/widgets/News3/parts/NewsPromoBanner.tsx","../src/components/widgets/News3/parts/NewsAside.tsx","../src/components/widgets/News4/index.tsx","../src/components/widgets/News4/News4Content.tsx","../src/components/widgets/News4/components/navigation/DashboardHeader.tsx","../src/components/widgets/News4/components/navigation/NewsTabs.tsx","../src/components/widgets/News4/hooks/useNews4Feed.ts","../src/components/widgets/AssetPreview/AssetPreviewContent.tsx","../src/components/widgets/News4/components/news/News4KeyTakeaways.tsx","../src/components/widgets/News4/components/news/News4ArticleBody.tsx","../src/components/widgets/News4/views/ArticleView.tsx","../src/components/widgets/LiveUpdates/LiveUpdatesContent.tsx","../src/components/widgets/LiveUpdates/LiveUpdatesContext.tsx","../src/components/widgets/News4/api/fetchLiveUpdates.ts","../src/components/widgets/LiveUpdates/components/liveUpdateUtils.ts","../src/components/widgets/LiveUpdates/components/eventUtils.ts","../src/components/widgets/LiveUpdates/components/FeedHeader.tsx","../src/components/widgets/LiveUpdates/components/FeedList.tsx","../src/components/widgets/LiveUpdates/components/LiveUpdateRow.tsx","../src/components/widgets/LiveUpdates/components/CalendarEventRow.tsx","../src/components/widgets/LiveUpdates/components/UnseenBanner.tsx","../src/components/widgets/LiveUpdates/components/LoadMoreButton.tsx","../src/components/widgets/LiveUpdates/components/EmptyStates.tsx","../src/components/widgets/LiveUpdates/components/useInsertScrollAnchor.ts","../src/components/widgets/News4/components/navigation/ViewBackButton.tsx","../src/components/widgets/News4/model/toEmbeddedWidgetStyle.ts","../src/components/widgets/News4/views/LiveUpdatesView.tsx","../src/components/widgets/LiveUpdates/components/LiveUpdatesBanner.tsx","../src/components/widgets/News4/components/common/ArticleActions.tsx","../src/components/widgets/News4/components/common/CategoryPill.tsx","../src/components/widgets/News4/components/news/HeroFeature.tsx","../src/components/widgets/News4/components/news/StoryRow.tsx","../src/components/widgets/News4/components/news/StoryList.tsx","../src/components/widgets/News4/components/sidebar/FeaturedAside.tsx","../src/components/widgets/LiveUpdates/components/LiveUpdatesPreview.tsx","../src/components/widgets/News4/components/sidebar/NewsAside.tsx","../src/components/widgets/News4/views/MainView.tsx","../src/components/widgets/News4/views/StockDetailsView.tsx","../src/components/widgets/News4/model/resolveNews4Config.ts","../src/components/widgets/LiveUpdates/index.tsx","../src/components/widgets/VideoExplainer/index.tsx","../src/components/widgets/VideoExplainer/RawVideoExplainer.tsx","../src/components/widgets/VideoExplainer/api/fetchDigest.ts","../src/components/widgets/VideoExplainer/hooks/useVideoCurrentTime.ts","../src/components/widgets/VideoExplainer/utils/players.ts","../src/components/widgets/VideoExplainer/parts/Card.tsx","../src/components/widgets/VideoExplainer/parts/ContextPanel.tsx","../src/components/widgets/VideoExplainer/parts/DigestHeader.tsx","../src/components/widgets/VideoExplainer/parts/ScenarioTable.tsx","../src/components/widgets/VideoExplainer/parts/HowToReadPanel.tsx","../src/components/widgets/VideoExplainer/parts/HlsPlayer.tsx","../src/components/widgets/VideoExplainer/utils/seekVideo.ts","../src/components/widgets/VideoExplainer/parts/PlayerPanel.tsx","../src/components/widgets/VideoExplainer/parts/SegmentRail.tsx","../src/components/widgets/VideoExplainer/utils/findActiveSegment.ts","../src/components/widgets/VideoExplainer/parts/StockTicker.tsx","../src/components/widgets/VideoExplainer/types.ts","../src/components/widgets/VideoExplainer/parts/TabStrip.tsx","../src/components/widgets/VideoExplainer/parts/TermPopover.tsx","../src/components/widgets/VideoExplainer/parts/TermsPanel.tsx","../src/components/widgets/VideoExplainer/parts/CompactNumberTable.tsx","../src/components/widgets/VideoExplainer/utils/highlightTerms.tsx","../src/components/widgets/VideoExplainer/parts/TranscriptPanel.tsx","../src/components/widgets/VideoExplainer/utils/buildEventScenarios.ts","../src/components/widgets/VideoExplainer/utils/buildTechReading.ts","../src/components/widgets/VideoExplainer/tokens.ts","../src/components/widgets/VideoNews/index.tsx","../src/components/widgets/VideoNews/VideoEmbed.tsx","../src/components/widgets/VideoNews/api.ts","../src/components/widgets/AnalystRecommendations/index.tsx","../src/components/widgets/AnalystRecommendations/fetchAnalystRecommendation.ts","../src/components/widgets/AnalystRecommendations/theme.ts","../src/components/widgets/AnalystRecommendations/constants.ts","../src/components/widgets/AnalystRecommendations/parts/StateMessage.tsx","../src/components/widgets/AnalystRecommendations/formatTarget.ts","../src/components/widgets/AnalystRecommendations/parts/Gauge.tsx","../src/components/widgets/AnalystRecommendations/score.ts","../src/components/widgets/AnalystRecommendations/parts/HorizontalContent.tsx","../src/components/widgets/AnalystRecommendations/parts/VerticalContent.tsx","../src/components/widgets/combos/SignalsNewsDyntube.tsx","../src/components/widgets/combos/ComboBranding/index.tsx","../src/components/widgets/combos/ComboBranding/elements/WidgetContainer.tsx","../src/components/widgets/combos/ComboBranding/elements/CtaButton.tsx","../src/components/widgets/combos/ComboBranding/elements/Logo.tsx","../src/components/widgets/combos/ComboBranding/elements/Button.tsx","../src/components/widgets/combos/ComboBranding/elements/ScrollContainer.tsx","../src/components/widgets/AssetOverview/index.tsx","../src/components/widgets/AssetOverview/AssetOverviewContent.tsx","../src/components/widgets/AssetOverview/functions/fetchAssetCandles.ts","../src/components/widgets/AssetOverview/fetchEarnings.ts","../src/components/widgets/AssetOverview/functions/fetchAssetInfo.ts","../src/components/widgets/AssetOverview/config.ts","../src/components/widgets/AssetOverview/parts/utils/format.ts","../src/components/widgets/AssetOverview/parts/header/AssetLogo.tsx","../src/components/widgets/AssetOverview/parts/header/AssetHeader.tsx","../src/components/widgets/AssetOverview/parts/chart/ChartPanel.tsx","../src/components/widgets/AssetOverview/parts/stats/KeyStatisticsPanel.tsx","../src/components/widgets/AssetOverview/parts/performance/PerformancePanel.tsx","../src/components/widgets/AssetOverview/parts/earnings/EarningsCard.tsx","../src/components/widgets/AssetOverview/parts/news/RelatedNewsPanel.tsx","../src/components/widgets/AssetPreview/index.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport { WidgetContainer } from \"./elements/WidgetContainer\";\nimport { Dropdown } from \"./elements/Dropdown\";\nimport { CurrencyDropdown } from \"./elements/CurrencyDropdown\";\nimport { PairDropdown } from \"./elements/PairDropdown\";\nimport { TextInput } from \"./elements/TextInput\";\nimport { BrandedButtonStyle, Button } from \"./elements/Button\";\nimport { ButtonGroup } from \"./elements/ButtonGroup\";\nimport { Label } from \"./elements/Label\";\nimport { ResultsContainer } from \"./elements/ResultsContainer\";\nimport { Table } from \"./elements/Table\";\nimport { DateRangePicker } from \"./elements/DateRangePicker\";\nimport { LangDropdown } from \"./elements/LangDropdown\";\nimport { Tabs } from \"./elements/Tabs\";\nimport { fetchLogoUrl } from \"../../functions/fetchLogoUrl\";\nimport { ScrollContainer } from \"./elements/ScrollContainer\";\n\ninterface BrandedContextType {\n  style: WidgetStyle;\n  buttonStyle: BrandedButtonStyle;\n  tableHeadCellStyle: React.CSSProperties;\n  logoSrc: string | null;\n}\n\nconst BrandedContext = createContext<BrandedContextType | undefined>(undefined);\n\nexport const useBrandedColors = () => {\n  const context = useContext(BrandedContext);\n  if (!context) {\n    throw new Error(\"useBrandedColors must be used within a Branded component\");\n  }\n  return context;\n};\n\nconst brandedElements = {\n  WidgetContainer,\n  ScrollContainer,\n  Dropdown,\n  CurrencyDropdown,\n  PairDropdown,\n  TextInput,\n  Button,\n  ButtonGroup,\n  Label,\n  ResultsContainer,\n  Table,\n  DateRangePicker,\n  LangDropdown,\n  Tabs,\n};\n\ntype BrandedProps = {\n  style: WidgetStyle;\n  children: React.ReactNode;\n};\n\nconst Branded = Object.assign(({ style, children }: BrandedProps) => {\n  const buttonStyle: BrandedButtonStyle = {\n    backgroundColor: style.button_background || style.base_background,\n    border: style.button_border || style.base_border,\n    color: style.button_text_color || style.base_text_color,\n    boxShadow: style.button_shadow || style.base_shadow,\n    borderRadius: style.button_rounded || style.base_rounded,\n    fontSize: style.button_font_size || style.base_font_size,\n    fontWeight: style.font_weight_body,\n  };\n\n  const tableHeadCellStyle: React.CSSProperties = {\n    background: style.table_head_background || style.base_text_color,\n    color: style.table_head_text_color || style.base_background,\n    padding: \"0.5rem 1rem\",\n    fontWeight: style.font_weight_heading,\n    fontSize: style.table_head_font_size || style.main_font_size,\n  };\n\n  const [logoSrc, setLogoSrc] = useState<string | null>(null);\n\n  useEffect(() => {\n    let alive = true;\n    (async () => {\n      try {\n        const url = await fetchLogoUrl(style.id || 0, style.brand_id, \"512\");\n        if (alive) setLogoSrc(url ?? null);\n      } catch {\n        if (alive) setLogoSrc(null);\n      }\n    })();\n    return () => {\n      alive = false;\n    };\n  }, [style.id, style.brand_id]);\n\n  return (\n    <BrandedContext.Provider\n      value={{\n        style,\n        buttonStyle,\n        tableHeadCellStyle,\n        logoSrc,\n      }}\n    >\n      {children}\n    </BrandedContext.Provider>\n  );\n}, brandedElements);\n\nexport default Branded;\n","import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { useBrandedColors } from \"..\";\nimport { CtaButton } from \"./CtaButton\";\nimport { CtaPosition, Positions } from \"../../../types/WidgetStyle\";\n\nconst NF_RESIZE_SOURCE = \"nf-widget\";\n\ntype WidgetContainerProps = {\n  children: React.ReactNode;\n  widgetName: keyof Positions;\n  size?: \"full\" | \"screen\";\n  hideCta?: boolean;\n};\n\nconst MOBILE_CSS = `@media (max-width: 640px) {\n  .nf-wc-outer { padding-left: 0 !important; padding-right: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; }\n  .nf-wc-inner { padding-left: 0.75rem !important; padding-right: 0.75rem !important; }\n}`;\n\nconst WidgetContainer = forwardRef<HTMLDivElement, WidgetContainerProps>(\n  ({ children, widgetName, size = \"screen\", hideCta = false }, ref) => {\n    const { style } = useBrandedColors();\n\n    const ctaPosition = style.cta_button_position[widgetName];\n    const showCta = !hideCta && ctaPosition !== \"none\";\n    const ctaTop =\n      showCta && (ctaPosition === \"top\" || widgetName === \"glossary\");\n    const ctaBottom = showCta && ctaPosition === \"bottom\";\n\n    // When embedded in an iframe, height/overflow below must NOT depend on\n    // vh or \"100%\" (which resolve against the iframe's own box) — otherwise\n    // resizing the iframe from the parent changes our available space, which\n    // changes what we report, which resizes the iframe again: a feedback\n    // loop that either runs away or collapses to nothing. Auto height (pure\n    // content size) breaks that loop: nothing we report ever changes what we\n    // measure next.\n    const [isEmbedded, setIsEmbedded] = useState(false);\n    const innerRef = useRef<HTMLDivElement>(null);\n    const setInnerRef = (node: HTMLDivElement | null): void => {\n      innerRef.current = node;\n      if (typeof ref === \"function\") ref(node);\n      else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n    };\n    useEffect(() => {\n      const el = innerRef.current;\n      if (!el || typeof window === \"undefined\" || window.parent === window) return;\n      setIsEmbedded(true);\n      const report = (): void => {\n        window.parent.postMessage({ source: NF_RESIZE_SOURCE, height: el.scrollHeight + 32 }, \"*\");\n      };\n      const ro = new ResizeObserver(report);\n      ro.observe(el);\n      report();\n      return () => ro.disconnect();\n    }, []);\n\n    return (\n      <div\n        className=\"nf-wc-outer\"\n        style={{\n          position: \"relative\",\n          padding: \"1rem\",\n          width: size === \"full\" || isEmbedded ? \"100%\" : \"100vw\",\n          height: isEmbedded ? \"auto\" : size === \"full\" ? \"100%\" : \"100vh\",\n          boxSizing: \"border-box\",\n        }}\n      >\n        <style>{MOBILE_CSS}</style>\n        <div\n          className=\"nf-wc-inner\"\n          style={{\n            position: \"relative\",\n            display: \"flex\",\n            flexDirection: \"column\",\n            width: \"100%\",\n            gap: \"1rem\",\n            alignItems: \"center\",\n            overflowY: isEmbedded ? \"visible\" : \"auto\",\n            height: isEmbedded ? \"auto\" : \"calc(100% - 2rem)\",\n            padding: \"1rem\",\n            paddingTop: ctaTop ? \"3.5rem\" : \"1rem\",\n            paddingBottom: ctaBottom ? \"3.5rem\" : \"1rem\",\n            fontFamily: style.font_family,\n            fontWeight: style.font_weight_body,\n            background: style.main_background,\n            boxShadow: style.main_shadow,\n            borderRadius: style.main_rounded,\n            border: style.main_border,\n            scrollbarWidth: \"thin\",\n            scrollbarColor: `${style.main_text_color} transparent`,\n          }}\n          ref={setInnerRef}\n        >\n          {showCta && (\n            <CtaButton\n              position={\n                widgetName === \"glossary\" ? \"top\" : (ctaPosition as CtaPosition)\n              }\n              label={style.cta_button_label || \"Start Trading Now!\"}\n              link={style.cta_button_link || \"/\"}\n            />\n          )}\n          {children}\n        </div>\n      </div>\n    );\n  },\n);\n\nWidgetContainer.displayName = \"BrandedWidgetContainer\";\n\nexport { WidgetContainer };\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useBrandedColors } from \"..\";\nimport { Link } from \"../../utils/Link\";\nimport { Logo } from \"./Logo\";\nimport { CtaPosition } from \"../../../types/WidgetStyle\";\n\ntype Mode = \"mouse\" | \"touch\";\ntype Side = \"left\" | \"right\" | null;\n\n/** Decide which side we’re docked to. Top/Bottom only affect vertical placement. */\nconst sideOf = (pos: CtaPosition): Side =>\n    pos === \"topLeft\" || pos === \"bottomLeft\"\n        ? \"left\"\n        : pos === \"topRight\" || pos === \"bottomRight\"\n            ? \"right\"\n            : null;\n\n/** Parse pixels from CSS length (px/rem). Ignore anything else (%/em/etc.) and return undefined. */\nconst parsePx = (v?: string | null): number | undefined => {\n    if (!v) return undefined;\n    if (v.endsWith(\"px\")) return parseFloat(v);\n    if (v.endsWith(\"rem\")) return parseFloat(v) * 16;\n    return undefined; // fixed lengths only\n};\n\n/** Round only the corners **opposite** the docked side; corners on the touching side are square (0). */\nconst roundedForSide = (side: Side, rPx: number): React.CSSProperties => {\n    const r = `${rPx}px`;\n    const z = \"0px\";\n    if (side === \"left\") {\n        return {\n            borderTopLeftRadius: z,\n            borderBottomLeftRadius: z,\n            borderTopRightRadius: r,\n            borderBottomRightRadius: r,\n        };\n    }\n    if (side === \"right\") {\n        return {\n            borderTopLeftRadius: r,\n            borderBottomLeftRadius: r,\n            borderTopRightRadius: z,\n            borderBottomRightRadius: z,\n        };\n    }\n    return { borderRadius: r };\n};\n\n/** Absolute anchor when docked to a side. Top/Bottom only decide vertical edge. */\nconst anchorStyle = (pos: CtaPosition, inset = 8): React.CSSProperties => {\n    switch (pos) {\n        case \"topLeft\":\n            return { position: \"absolute\", left: inset, top: inset };\n        case \"bottomLeft\":\n            return { position: \"absolute\", left: inset, bottom: inset };\n        case \"topRight\":\n            return { position: \"absolute\", right: inset, top: inset };\n        case \"bottomRight\":\n            return { position: \"absolute\", right: inset, bottom: inset };\n        case \"top\":\n            return {\n                position: \"absolute\",\n                left: \"50%\",\n                top: inset,\n                transform: \"translateX(-50%)\",\n            };\n        case \"bottom\":\n            return {\n                position: \"absolute\",\n                left: \"50%\",\n                bottom: inset,\n                transform: \"translateX(-50%)\",\n            };\n        default:\n            return {\n                width: \"100%\",\n                display: \"flex\",\n                justifyContent: \"center\",\n                padding: \"0.5rem\",\n            };\n    }\n};\n\n/** Input mode detection helpers */\nconst getInitialMode = (): Mode => {\n    if (typeof window === \"undefined\") return \"mouse\";\n    try {\n        return window.matchMedia(\"(hover: hover)\").matches ? \"mouse\" : \"touch\";\n    } catch {\n        return \"mouse\";\n    }\n};\n\nexport const CtaButton: React.FC<{\n    position: CtaPosition;\n    label: string;\n    link: string;\n    insetPx?: number; // gap from container edges when docked. default 8\n    labelMaxWidth?: number; // optional cap for label expansion\n}> = ({ position, label, link, insetPx = 8, labelMaxWidth = 400 }) => {\n    const { style } = useBrandedColors();\n\n    // interaction state\n    const [revealed, setRevealed] = useState(false);\n    const [hovered, setHovered] = useState(false);\n    const wrapperRef = useRef<HTMLSpanElement>(null);\n\n    // mode detection (mouse vs touch)\n    const [mode, setMode] = useState<Mode>(getInitialMode);\n\n    // update on pointer usage\n    useEffect(() => {\n        const onPointerDown = (e: PointerEvent) => {\n            if (e.pointerType === \"mouse\") setMode(\"mouse\");\n            else if (e.pointerType === \"touch\") setMode(\"touch\");\n        };\n        window.addEventListener(\"pointerdown\", onPointerDown, { passive: true });\n        return () => window.removeEventListener(\"pointerdown\", onPointerDown);\n    }, []);\n\n    // update on media query changes (DevTools toggling device)\n    useEffect(() => {\n        if (typeof window === \"undefined\" || !(\"matchMedia\" in window)) return;\n        const mq = window.matchMedia(\"(hover: hover)\");\n        const update = () => setMode(mq.matches ? \"mouse\" : \"touch\");\n        update();\n        mq.addEventListener?.(\"change\", update);\n        return () => mq.removeEventListener?.(\"change\", update);\n    }, []);\n\n    // when we switch back to mouse, collapse + clear touch-only state\n    useEffect(() => {\n        if (mode === \"mouse\") {\n            setRevealed(false);\n            setHovered(false);\n        }\n    }, [mode]);\n\n    // handlers\n    const onMouseEnter = () => {\n        if (mode !== \"mouse\") return;\n        setRevealed(true);\n        setHovered(true);\n    };\n    const onMouseLeave = () => {\n        if (mode !== \"mouse\") return;\n        setHovered(false);\n        setRevealed(false);\n    };\n\n    // First tap reveals (blocks nav); second tap opens\n    const onClickCapture: React.MouseEventHandler = (e) => {\n        if (mode === \"touch\" && !revealed) {\n            e.preventDefault();\n            e.stopPropagation();\n            setRevealed(true);\n        }\n    };\n\n    // close on outside tap when revealed on touch\n    useEffect(() => {\n        if (!(mode === \"touch\" && revealed)) return;\n        const handleOutside = (e: PointerEvent) => {\n            const target = e.target as Node | null;\n            if (wrapperRef.current && target && !wrapperRef.current.contains(target)) {\n                setRevealed(false);\n            }\n        };\n        document.addEventListener(\"pointerdown\", handleOutside);\n        return () => document.removeEventListener(\"pointerdown\", handleOutside);\n    }, [mode, revealed]);\n\n    // visuals\n    const effectivePosition: CtaPosition = position || \"topRight\";\n    const baseRadiusPx = parsePx(style.cta_button_roundness) ?? 999;\n    const side = sideOf(effectivePosition);\n    const containerAlign: React.CSSProperties = anchorStyle(effectivePosition, insetPx);\n\n    // keep it docked: constant tiny inward offset, never changes on hover\n    const initialX = side === \"left\" ? \"-8px\" : side === \"right\" ? \"8px\" : \"0px\";\n\n    // ===== Icon size computed from button font (Safari-safe) =====\n    const fontPx = parsePx(style.button_font_size || style.base_font_size) ?? 16;\n    const ICON_SCALE = 1.35; // tweak to taste (1.25..1.5)\n    const iconSizePx = Math.max(24, Math.round(fontPx * ICON_SCALE)); // floor so it's never tiny\n    // =============================================================\n\n    return (\n        // NOTE: parent container should be position: relative for corner docking to work\n        <div\n            style={{\n                ...containerAlign,\n                zIndex: 999,\n            }}\n        >\n            <span\n                ref={wrapperRef}\n                onMouseEnter={onMouseEnter}\n                onMouseLeave={onMouseLeave}\n                onClickCapture={onClickCapture}\n                style={{\n                    display: \"inline-block\",\n                    transform: `translateX(${initialX})`, // constant -> no side gap appears\n                    transition: \"transform 400ms cubic-bezier(0.77, 0, 0.175, 1)\",\n                    willChange: \"transform\",\n                }}\n            >\n                <Link\n                    href={link || \"/\"}\n                    target=\"_top\"\n                    style={{\n                        textAlign: \"center\",\n                        padding: \"0.25rem\",\n                        border: style.button_border || style.base_border,\n                        background:\n                            style.cta_button_background ||\n                            style.button_background ||\n                            style.base_background,\n                        color:\n                            style.cta_button_text ||\n                            style.button_text_color ||\n                            style.base_text_color,\n                        boxShadow: style.button_shadow || style.base_shadow,\n                        fontSize: style.button_font_size || style.base_font_size,\n                        lineHeight: 1, // <-- important so Safari doesn't collapse row height\n                        cursor: \"pointer\",\n                        opacity: hovered || revealed ? 1 : 0.7,\n                        transition: \"opacity 200ms ease-in-out\",\n                        display: \"flex\",\n                        gap: 0, // keep stable; spacing comes from label margin\n                        flexDirection: sideOf(effectivePosition) === \"left\" ? \"row-reverse\" : \"row\",\n                        alignItems: \"center\",\n                        overflow: \"hidden\",\n                        whiteSpace: \"nowrap\",\n                        ...roundedForSide(side, baseRadiusPx),\n                    }}\n                >\n                    <div\n                        style={{\n                            flex: \"0 0 auto\",\n                            display: \"flex\",\n                            alignItems: \"center\",\n                            justifyContent: \"center\",\n                            // width: 52,   // 👈 tweak this number\n                            height: 20,  // 👈 tweak this number\n                            lineHeight: 0,\n                        }}\n                    >\n                        <Logo />\n                    </div>\n\n                    {/* Label: max-width controls layout (slide), margin replaces gap to avoid snapping */}\n                    <span\n                        style={{\n                            display: \"inline-block\",\n                            maxWidth: revealed ? labelMaxWidth : 0,\n                            opacity: revealed ? 1 : 0,\n                            transform: revealed ? \"translateX(0)\" : \"translateX(6px)\",\n                            marginInlineStart: revealed ? \"0.5rem\" : 0,\n                            transition:\n                                \"max-width 500ms cubic-bezier(0.77, 0, 0.175, 1), \" +\n                                \"opacity 350ms ease-in-out, \" +\n                                \"transform 500ms cubic-bezier(0.77, 0, 0.175, 1), \" +\n                                \"margin-inline-start 500ms cubic-bezier(0.77, 0, 0.175, 1)\",\n                            overflow: \"hidden\",\n                            willChange: \"max-width, opacity, transform, margin-inline-start\",\n                        }}\n                    >\n                        {label || \"Start Trading Now!\"}\n                    </span>\n                </Link>\n            </span>\n        </div>\n    );\n};\n","import React from 'react';\n\ntype LinkProps = {\n    href: string;\n    children: React.ReactNode;\n    target?: '_blank' | '_self' | '_parent' | '_top';\n    rel?: string;\n    className?: string;\n    onClick?: React.MouseEventHandler<HTMLAnchorElement>;\n    onMouseEnter?: React.MouseEventHandler<HTMLAnchorElement>;\n    onMouseLeave?: React.MouseEventHandler<HTMLAnchorElement>;\n    style?: React.CSSProperties;\n};\n\nexport const Link: React.FC<LinkProps> = ({\n    href,\n    children,\n    target = '_self',\n    rel,\n    className,\n    onClick,\n    onMouseEnter,\n    onMouseLeave,\n    style,\n}) => {\n    return (\n        <a\n            href={href}\n            target={target}\n            rel={rel || (target === '_blank' ? 'noopener noreferrer' : undefined)}\n            className={className}\n            onClick={onClick}\n            style={style}\n            onMouseEnter={onMouseEnter}\n            onMouseLeave={onMouseLeave}\n        >\n            {children}\n        </a>\n    );\n};\n","import React from \"react\";\n\ntype ImageProps = {\n  src: string;\n  alt: string;\n  width?: number;\n  height?: number;\n  style?: React.CSSProperties;\n  onLoad?: () => void;\n  onError?: () => void;\n};\n\nexport const Image: React.FC<ImageProps> = ({\n  src,\n  alt,\n  width,\n  height,\n  style,\n  onLoad,\n  onError,\n}) => {\n  return (\n    <img\n      src={src}\n      alt={alt}\n      width={width}\n      height={height}\n      style={style}\n      onLoad={onLoad}\n      onError={onError}\n    />\n  );\n};\n","import React from \"react\";\nimport { useBrandedColors } from \"..\";\nimport { Image } from \"../../utils/Image\";\n\nexport const Logo: React.FC = () => {\n    const { logoSrc } = useBrandedColors();\n\n    if (!logoSrc) return null;\n\n    return <Image\n        style={{\n            objectFit: \"contain\", // Ensures it fits in the cell\n            maxWidth: \"100%\", // Ensure it doesn't overflow\n            maxHeight: \"100%\", // Ensures it respects the cell height\n            width: \"auto\",\n            height: \"auto\",\n            display: \"block\",\n        }}\n        src={logoSrc}\n        alt=\"Diagonal\"\n    />\n};\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { FC, useState } from 'react';\nimport { useBrandedColors } from '..';\nimport { adjustColorContrast } from '../../../utils/colors';\nimport { FaChevronDown } from 'react-icons/fa6';\nimport { HiCheck } from 'react-icons/hi2';\nimport { calculateContentBorderRadius } from '../../../utils/calculateContentBorderRadius';\n\ntype BaseItem = {\n    content: React.ReactNode | string;\n    value: string | number;\n};\n\ntype SearchableItem = BaseItem & { label: string };\ntype NonSearchableItem = BaseItem;\n\ntype DropdownProps =\n    | {\n        label: React.ReactNode | string;\n        items: SearchableItem[];\n        selected: string | number | (string | number)[];\n        onSelect: (value: string | number) => void;\n        multiple?: boolean;\n        searchable: true;\n        searchPlaceholder?: string;\n    }\n    | {\n        label: React.ReactNode | string;\n        items: NonSearchableItem[];\n        selected: string | number | (string | number)[];\n        onSelect: (value: string | number) => void;\n        multiple?: boolean;\n        searchable?: false;\n        searchPlaceholder?: string;\n    };\n\nconst Dropdown: FC<DropdownProps> = (props) => {\n    const { label, items, selected, onSelect, multiple = false, searchable = false, searchPlaceholder } = props;\n\n    const { style } = useBrandedColors();\n    const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n    const [filterText, setFilterText] = useState<string>(\"\");\n\n    if (multiple && !Array.isArray(selected)) {\n        throw new Error('When multiple is true, selected must be an array.');\n    }\n\n    // Runtime check (optional but helpful)\n    if (searchable) {\n        for (const item of items) {\n            if (!(item as SearchableItem).label) {\n                throw new Error(\"All items must have a `label` when `searchable` is true.\");\n            }\n        }\n    }\n\n    const roundness = style.dropdown_rounded || style.base_rounded;\n\n    const triggerStyle: React.CSSProperties = {\n        background: style.dropdown_background || style.base_background,\n        color: style.dropdown_text_color || style.base_text_color,\n        boxShadow: style.dropdown_shadow || style.base_shadow,\n        borderRadius: roundness,\n        fontSize: style.dropdown_font_size || style.base_font_size,\n        fontWeight: style.font_weight_body,\n        border: style.dropdown_border || style.base_border,\n        display: 'flex',\n        gap: '0.5rem',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        padding: '0.5rem',\n        cursor: 'pointer',\n        whiteSpace: 'nowrap',\n        width: '100%',\n    };\n\n    const contentStyle: React.CSSProperties = {\n        background: style.dropdown_background || style.base_background,\n        color: style.dropdown_text_color || style.base_text_color,\n        border: style.dropdown_border || style.base_border,\n        boxShadow: style.dropdown_shadow || style.base_shadow,\n        fontSize: style.dropdown_font_size || style.base_font_size,\n        maxHeight: '16rem',\n        overflowY: 'auto',\n        borderRadius: calculateContentBorderRadius(roundness),\n        minWidth: '10rem',\n        zIndex: 50,\n    };\n\n    const itemBaseStyle: React.CSSProperties = {\n        display: 'flex',\n        alignItems: 'center',\n        gap: '0.5rem',\n        padding: '0.5rem',\n        cursor: 'pointer',\n        width: '100%',\n        background: 'transparent',\n        transition: 'background 0.2s ease-in-out',\n    };\n\n    const hoverColor = adjustColorContrast(style.dropdown_background || style.base_background, 20);\n\n    const filteredItems = searchable\n        ? (items as SearchableItem[]).filter(item =>\n            item.label.toLowerCase().includes(filterText.toLowerCase())\n        )\n        : items;\n\n    return (\n        <DropdownMenu.Root>\n            <DropdownMenu.Trigger asChild>\n                <div style={triggerStyle}>\n                    {label}\n                    <FaChevronDown />\n                </div>\n            </DropdownMenu.Trigger>\n\n            <DropdownMenu.Portal>\n                <DropdownMenu.Content sideOffset={4} style={contentStyle}>\n                    {searchable && (\n                        <div\n                            style={{\n                                position: 'sticky',\n                                top: 0,\n                                background: style.dropdown_background || style.base_background,\n                                paddingBottom: '0.25rem',\n                                zIndex: 1,\n                            }}\n                        >\n                            <input\n                                type=\"text\"\n                                placeholder={searchPlaceholder || 'Search...'}\n                                value={filterText}\n                                onChange={(e) => setFilterText(e.target.value)}\n                                onKeyDown={(e) => e.stopPropagation()}\n                                style={{\n                                    width: '100%',\n                                    padding: '0.4rem 0.6rem',\n                                    borderRadius: '4px',\n                                    border: '1px solid #ccc',\n                                    fontSize: 'inherit',\n                                }}\n                            />\n                        </div>\n                    )}\n\n                    {filteredItems.map((item, index) => {\n                        const isSelected = Array.isArray(selected)\n                            ? selected.includes(item.value)\n                            : selected === item.value;\n\n                        const isHovered = hoveredIndex === index;\n\n                        const itemStyle = {\n                            ...itemBaseStyle,\n                            backgroundColor: isHovered ? hoverColor : 'transparent',\n                        };\n\n                        return (\n                            <DropdownMenu.Item\n                                key={item.value}\n                                onSelect={(e) => {\n                                    if (multiple) e.preventDefault(); // keep open\n                                    onSelect(item.value);\n                                }}\n                                onMouseEnter={() => setHoveredIndex(index)}\n                                onMouseLeave={() => setHoveredIndex(null)}\n                                style={itemStyle}\n                            >\n                                {\n                                    multiple && <div style={{\n                                        width: '1rem',\n                                        height: '1rem',\n                                        display: 'flex',\n                                        alignItems: 'center',\n                                        justifyContent: 'center'\n                                    }}>\n                                        {isSelected && <HiCheck />}\n                                    </div>\n                                }\n\n                                {item.content}\n                            </DropdownMenu.Item>\n                        );\n                    })}\n                </DropdownMenu.Content>\n            </DropdownMenu.Portal>\n        </DropdownMenu.Root>\n    );\n};\n\nDropdown.displayName = 'BrandedDropdown';\nexport { Dropdown };","export function hexToRgb(hex: string) {\n    hex = hex.replace(/^#/, \"\");\n    if (hex.length === 3) {\n        hex = hex.split(\"\").map(c => c + c).join(\"\");\n    }\n    const bigint = parseInt(hex, 16);\n    return {\n        r: (bigint >> 16) & 255,\n        g: (bigint >> 8) & 255,\n        b: bigint & 255\n    };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number) {\n    r /= 255, g /= 255, b /= 255;\n    const max = Math.max(r, g, b), min = Math.min(r, g, b);\n    let h = 0, s = 0, l = (max + min) / 2;\n\n    if (max !== min) {\n        const d = max - min;\n        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n        switch (max) {\n            case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n            case g: h = (b - r) / d + 2; break;\n            case b: h = (r - g) / d + 4; break;\n        }\n        h /= 6;\n    }\n    return { h, s, l };\n}\n\nexport function hslToRgb(h: number, s: number, l: number) {\n    function hue2rgb(p: number, q: number, t: number) {\n        if (t < 0) t += 1;\n        if (t > 1) t -= 1;\n        if (t < 1 / 6) return p + (q - p) * 6 * t;\n        if (t < 1 / 2) return q;\n        if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n        return p;\n    }\n\n    let r, g, b;\n    if (s === 0) {\n        r = g = b = l; // Achromatic\n    } else {\n        const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n        const p = 2 * l - q;\n        r = hue2rgb(p, q, h + 1 / 3);\n        g = hue2rgb(p, q, h);\n        b = hue2rgb(p, q, h - 1 / 3);\n    }\n    return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) };\n}\n\nexport function rgbToHex(r: number, g: number, b: number) {\n    return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`;\n}\n\nexport function getLuminance(r: number, g: number, b: number): number {\n    return 0.299 * r + 0.587 * g + 0.114 * b; // Perceived brightness formula\n}\n\n/**\n * Determines if a color is light or dark, based on its RGB values.\n * @param r Red channel (0-255)\n * @param g Green channel (0-255)\n * @param b Blue channel (0-255)\n * @returns True if the color is light, false if dark.\n */\nexport function isLightColorRGB(r: number, g: number, b: number): boolean {\n    return getLuminance(r, g, b) > 128; // Threshold for light color\n}\n\n/**\n * Determines if a color is light or dark.\n * @param color The color to check (hex or rgb format are supported).\n * @returns True if the color is light, false if dark.\n */\nexport function isLightColor(color: string): boolean {\n    // Parse input\n    let r: number, g: number, b: number, a: number | undefined = undefined;\n    if (color.startsWith(\"#\")) {\n        ({ r, g, b } = hexToRgb(color));\n    } else if (color.startsWith(\"rgb\")) {\n        const match = color.match(/(\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?/);\n        if (!match) throw new Error(\"Invalid RGB format\");\n        [r, g, b] = match.slice(1, 4).map(Number);\n        if (match[4]) a = parseFloat(match[4]); // Handle alpha if present\n    } else {\n        throw new Error(\"Unsupported color format\");\n    }\n    return isLightColorRGB(r, g, b);\n}\n\n/**\n * Adjusts the color contrast of a given color.\n * The functions decides if the original color is light or dark,\n * and adjusts the lightness accordingly - darkening light colors or lightening dark colors.\n * @param color The color to adjust (hex or rgb format).\n * @param percent The percentage to adjust the contrast (positive to darken, negative to lighten).\n * @returns The adjusted color in the same format as the input.\n */\nexport function adjustColorContrast(color: string, percent: number = 20): string {\n\n    // Parse input\n    let r: number, g: number, b: number, a: number | undefined = undefined;\n    if (color.startsWith(\"#\")) {\n        ({ r, g, b } = hexToRgb(color));\n    } else if (color.startsWith(\"rgb\")) {\n        const match = color.match(/(\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?/);\n        if (!match) throw new Error(\"Invalid RGB format\");\n        [r, g, b] = match.slice(1, 4).map(Number);\n        if (match[4]) a = parseFloat(match[4]); // Handle alpha if present\n    } else {\n        throw new Error(\"Unsupported color format\");\n    }\n\n    // Determine whether to darken or lighten\n    let { h, s, l } = rgbToHsl(r, g, b);\n    const isLight = isLightColorRGB(r, g, b);\n\n    if (isLight) {\n        l = Math.max(0, l * (1 - percent / 100)); // Darken if light\n    } else {\n        l = Math.min(1, l * (1 + percent / 100)); // Lighten if dark\n    }\n\n    ({ r, g, b } = hslToRgb(h, s, l));\n\n    // Return in the same format\n    return a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : rgbToHex(r, g, b);\n}\n\n/**\n * Adjusts the color brightness of a given color.\n * Used to make a color uniformly lighter or darker (even black or white).\n * @param color The color to adjust (hex or rgb format).\n * @param percent The percentage to adjust the brightness (positive to lighten, negative to darken).\n * @returns The adjusted color in the same format as the input.\n */\nexport function adjustColorBrightness(color: string, percent: number = 20): string {\n    // Parse input\n    let r: number, g: number, b: number, a: number | undefined = undefined;\n\n    if (color.startsWith(\"#\")) {\n        ({ r, g, b } = hexToRgb(color));\n    } else if (color.startsWith(\"rgb\")) {\n        const match = color.match(/(\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?/);\n        if (!match) throw new Error(\"Invalid RGB format\");\n        [r, g, b] = match.slice(1, 4).map(Number);\n        if (match[4]) a = parseFloat(match[4]); // Handle alpha if present\n    } else {\n        throw new Error(\"Unsupported color format\");\n    }\n\n    // Adjust brightness\n    r = Math.min(255, Math.max(0, r + (255 * percent) / 100));\n    g = Math.min(255, Math.max(0, g + (255 * percent) / 100));\n    b = Math.min(255, Math.max(0, b + (255 * percent) / 100));\n\n    // Return in the same format\n    return a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : rgbToHex(r, g, b);\n}\n\n/**\n * Returns either black or white text color depending on the brightness of the background color.\n * @param background The background color (hex or rgb format).\n * @returns \"#000000\" for light backgrounds, \"#ffffff\" for dark backgrounds.\n */\nexport const getTextColor = (background: string) => {\n    const isBackgroundLight = isLightColor(background || \"#ffffff\");\n    return isBackgroundLight\n        ? \"#000000\" // Use black text on light\n        : \"#ffffff\"; // Use white text on dark\n};\n\n/**\n * Generates a random hex color string.\n * @returns A random hex color string.\n */\nexport function generateRandomColor(): string {\n    const letters = \"0123456789ABCDEF\";\n    let color = \"#\";\n    for (let i = 0; i < 6; i++) color += letters[Math.floor(Math.random() * 16)];\n    return color;\n}","type PxOpts = {\n    // reasonable defaults; override if your app uses different bases\n    rootFontSize?: number;   // for rem\n    fontSize?: number;       // for em\n    viewportWidth?: number;  // for vw/vmin/vmax\n    viewportHeight?: number; // for vh/vmin/vmax\n    ppi?: number;            // CSS pixel density; CSS assumes 96 px/in\n    clampMax?: number;       // default 24 (your cap)\n};\n\nconst DEFAULTS: Required<PxOpts> = {\n    rootFontSize: 16,\n    fontSize: 16,\n    viewportWidth: typeof window !== \"undefined\" ? window.innerWidth : 0,\n    viewportHeight: typeof window !== \"undefined\" ? window.innerHeight : 0,\n    ppi: 96,\n    clampMax: 24,\n};\n\nconst UNIT_RE = /^\\s*(-?\\d*\\.?\\d+)\\s*([a-z%]*)\\s*$/i;\n\n/**\n * Calculate the content border radius based on a CSS length value.\n * @param from The CSS length value to convert (e.g., \"12px\", \"1rem\").\n * @param opts Optional parameters for the calculation.\n * @returns The calculated border radius in pixels, or undefined if the input is invalid.\n */\nexport function calculateContentBorderRadius(\n    from?: string | null,\n    opts?: PxOpts\n): string | undefined {\n    if (!from) return undefined;\n\n    const m = UNIT_RE.exec(from);\n    if (!m) return undefined;\n\n    const num = parseFloat(m[1]);\n    const unit = (m[2] || \"px\").toLowerCase();\n\n    if (Number.isNaN(num)) return undefined;\n    // negative radii are treated as 0 in practice\n    const n = Math.max(0, num);\n\n    const {\n        rootFontSize,\n        fontSize,\n        viewportWidth,\n        viewportHeight,\n        ppi,\n        clampMax,\n    } = { ...DEFAULTS, ...opts };\n\n    let px: number | undefined;\n\n    switch (unit) {\n        case \"px\": case \"\":\n            px = n; break;\n\n        // font/viewport relative (still “fixed” at call time using provided bases)\n        case \"rem\":\n            px = n * rootFontSize; break;\n        case \"em\":\n            px = n * fontSize; break;\n\n        case \"vw\":\n            px = (n / 100) * viewportWidth; break;\n        case \"vh\":\n            px = (n / 100) * viewportHeight; break;\n        case \"vmin\":\n            px = (n / 100) * Math.min(viewportWidth, viewportHeight); break;\n        case \"vmax\":\n            px = (n / 100) * Math.max(viewportWidth, viewportHeight); break;\n\n        // absolute print units, per CSS: 96 px = 1in\n        case \"in\":\n            px = n * ppi; break;\n        case \"cm\":\n            px = (n / 2.54) * ppi; break;\n        case \"mm\":\n            px = (n / 25.4) * ppi; break;\n        case \"pt\": // 72pt = 1in\n            px = (n / 72) * ppi; break;\n        case \"pc\": // 1pc = 12pt\n            px = (n * 12 / 72) * ppi; break;\n\n        // explicitly not supported as requested\n        case \"%\":\n            return undefined;\n\n        // font-metric units: can’t be fixed without actual font metrics\n        case \"ch\":\n        case \"ex\":\n        default:\n            return undefined;\n    }\n\n    if (px == null || !Number.isFinite(px)) return undefined;\n\n    return `${Math.min(px, clampMax)}px`;\n}\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { FC, useState } from 'react';\nimport { useBrandedColors } from '..';\nimport { adjustColorContrast } from '../../../utils/colors';\nimport { Image } from '../../utils/Image';\nimport { FaChevronDown } from 'react-icons/fa6';\nimport { HiCheck } from 'react-icons/hi2';\nimport { calculateContentBorderRadius } from '../../../utils/calculateContentBorderRadius';\n\nconst CurrencyDropdown = ({\n    label,\n    currencies,\n    selected,\n    onSelect,\n    multiple = false,\n}: {\n    label: string;\n    currencies: string[];\n    selected: string | string[];\n    onSelect: (currency: string) => void;\n    multiple?: boolean;\n}) => {\n    const { style } = useBrandedColors();\n    const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\n    const roundness = style.dropdown_rounded || style.base_rounded;\n\n    const triggerStyle: React.CSSProperties = {\n        background: style.dropdown_background || style.base_background,\n        color: style.dropdown_text_color || style.base_text_color,\n        boxShadow: style.dropdown_shadow || style.base_shadow,\n        borderRadius: roundness,\n        fontSize: style.dropdown_font_size || style.base_font_size,\n        fontWeight: style.font_weight_body,\n        border: style.dropdown_border || style.base_border,\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        gap: '0.5rem',\n        padding: '0.5rem',\n        cursor: 'pointer',\n        whiteSpace: 'nowrap',\n    };\n\n    const contentStyle: React.CSSProperties = {\n        background: style.dropdown_background || style.base_background,\n        color: style.dropdown_text_color || style.base_text_color,\n        border: style.dropdown_border || style.base_border,\n        borderRadius: calculateContentBorderRadius(roundness),\n        fontSize: style.dropdown_font_size || style.base_font_size,\n        boxShadow: style.dropdown_shadow || style.base_shadow,\n        marginTop: '0.25rem',\n        padding: '0.25rem',\n        zIndex: 50,\n        maxHeight: '256px',\n        overflowY: 'auto',\n    };\n\n    const itemBaseStyle: React.CSSProperties = {\n        display: 'flex',\n        alignItems: 'center',\n        gap: '0.5rem',\n        padding: '0.5rem 1rem',\n        cursor: 'pointer',\n        width: '150px',\n        background: 'transparent',\n        transition: 'background 0.2s ease-in-out',\n        outline: 'none',\n        border: 'none',\n    };\n\n    const hoverColor = adjustColorContrast(style.dropdown_background || style.base_background, 20);\n\n    if (multiple && !Array.isArray(selected)) {\n        throw new Error('When multiple is true, selected must be an array of strings.');\n    }\n\n    return (\n        <DropdownMenu.Root>\n            <DropdownMenu.Trigger asChild style={{ width: '100%' }}>\n                <div style={triggerStyle}>\n                    {Array.isArray(selected) ? (\n                        label\n                    ) : (\n                        <>\n                            <Image\n                                src={`/images/currencies/${selected}.svg`}\n                                alt={selected}\n                                width={20}\n                                height={20}\n                                style={\n                                    style.currency_logos_rounded\n                                        ? { borderRadius: '9999px', overflow: 'hidden' }\n                                        : undefined\n                                }\n                            />\n                            {selected}\n                        </>\n                    )}\n                    <FaChevronDown />\n                </div>\n            </DropdownMenu.Trigger>\n\n            <DropdownMenu.Portal>\n                <DropdownMenu.Content sideOffset={4} style={contentStyle}>\n                    {currencies.map((currency, index) => {\n                        const isSelected =\n                            Array.isArray(selected) && selected.includes(currency);\n\n                        const isHovered = hoveredIndex === index;\n\n                        const itemStyle = {\n                            ...itemBaseStyle,\n                            backgroundColor: isHovered ? hoverColor : 'transparent',\n                        };\n\n                        return (\n                            <DropdownMenu.Item\n                                key={currency}\n                                onSelect={(e) => {\n                                    if (multiple) e.preventDefault();\n                                    onSelect(currency);\n                                }}\n                                onMouseEnter={() => setHoveredIndex(index)}\n                                onMouseLeave={() => setHoveredIndex(null)}\n                                style={itemStyle}\n                            >\n                                <div style={{ width: '1rem', height: '1rem', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n                                    {isSelected && <HiCheck />}\n                                </div>\n                                <Image\n                                    src={`/images/currencies/${currency}.svg`}\n                                    alt={currency}\n                                    width={20}\n                                    height={20}\n                                    style={\n                                        style.currency_logos_rounded\n                                            ? { borderRadius: '9999px', overflow: 'hidden' }\n                                            : undefined\n                                    }\n                                />\n                                {currency}\n                            </DropdownMenu.Item>\n                        );\n                    })}\n                </DropdownMenu.Content>\n            </DropdownMenu.Portal>\n        </DropdownMenu.Root>\n    );\n};\n\nCurrencyDropdown.displayName = 'BrandedCurrencyDropdown';\nexport { CurrencyDropdown };","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { useState } from 'react';\nimport { FaChevronDown } from 'react-icons/fa6';\nimport { useBrandedColors } from '..';\nimport { adjustColorContrast } from '../../../utils/colors';\nimport { Image } from '../../utils/Image';\nimport { calculateContentBorderRadius } from '../../../utils/calculateContentBorderRadius';\n\nconst PairDropdown = ({\n    currencies,\n    onSelect,\n}: {\n    currencies: string[];\n    onSelect: (pair: string[]) => void;\n}) => {\n    const { style } = useBrandedColors();\n    const [pair, setPair] = useState<string[]>([currencies[0], currencies[1]]);\n    const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\n    const handleSelect = (currency: string, index: number) => {\n        const newPair = [...pair];\n        newPair[index] = currency;\n        setPair(newPair);\n        onSelect(newPair);\n    };\n\n    const hoverColor = adjustColorContrast(style.dropdown_background || style.base_background, 20);\n    const roundness = style.dropdown_rounded || style.base_rounded;\n\n    const contentStyle: React.CSSProperties = {\n        background: style.dropdown_background || style.base_background,\n        color: style.dropdown_text_color || style.base_text_color,\n        border: style.dropdown_border || style.base_border,\n        borderRadius: calculateContentBorderRadius(roundness),\n        fontSize: style.dropdown_font_size || style.base_font_size,\n        boxShadow: style.dropdown_shadow || style.base_shadow,\n        marginTop: '0.25rem',\n        padding: '0.25rem',\n        zIndex: 50,\n        maxHeight: '256px',\n        overflowY: 'auto',\n    };\n\n    const renderDropdown = (selected: string, index: number) => (\n        <DropdownMenu.Root>\n            <DropdownMenu.Trigger asChild>\n                <div\n                    style={{\n                        background: style.dropdown_background || style.base_background,\n                        color: style.dropdown_text_color || style.base_text_color,\n                        boxShadow: style.dropdown_shadow || style.base_shadow,\n                        borderRadius: roundness,\n                        fontSize: style.dropdown_font_size || style.base_font_size,\n                        fontWeight: style.font_weight_body,\n                        border: style.dropdown_border || style.base_border,\n                        display: 'flex',\n                        alignItems: 'center',\n                        justifyContent: 'space-between',\n                        gap: '0.5rem',\n                        padding: '0.5rem',\n                        cursor: 'pointer',\n                        whiteSpace: 'nowrap',\n                        width: '100%',\n                    }}\n                >\n                    <Image\n                        src={`/images/currencies/${selected}.svg`}\n                        alt={selected}\n                        width={20}\n                        height={20}\n                        style={\n                            style.currency_logos_rounded\n                                ? { borderRadius: '9999px', overflow: 'hidden' }\n                                : undefined\n                        }\n                    />\n                    {selected}\n                    <FaChevronDown />\n                </div>\n            </DropdownMenu.Trigger>\n\n            <DropdownMenu.Portal>\n                <DropdownMenu.Content\n                    sideOffset={4}\n                    style={contentStyle}\n                >\n                    {currencies.map((currency, i) => {\n                        const isHovered = hoveredIndex === i + index * currencies.length;\n                        return (\n                            <DropdownMenu.Item\n                                key={currency}\n                                onSelect={() => handleSelect(currency, index)}\n                                onMouseEnter={() => setHoveredIndex(i + index * currencies.length)}\n                                onMouseLeave={() => setHoveredIndex(null)}\n                                style={{\n                                    display: 'flex',\n                                    alignItems: 'center',\n                                    gap: '0.5rem',\n                                    padding: '0.5rem 1rem',\n                                    cursor: 'pointer',\n                                    backgroundColor: isHovered ? hoverColor : 'transparent',\n                                    transition: 'background 0.2s ease-in-out',\n                                }}\n                            >\n                                <Image\n                                    src={`/images/currencies/${currency}.svg`}\n                                    alt={currency}\n                                    width={20}\n                                    height={20}\n                                    style={\n                                        style.currency_logos_rounded\n                                            ? { borderRadius: '9999px', overflow: 'hidden' }\n                                            : undefined\n                                    }\n                                />\n                                {currency}\n                            </DropdownMenu.Item>\n                        );\n                    })}\n                </DropdownMenu.Content>\n            </DropdownMenu.Portal>\n        </DropdownMenu.Root>\n    );\n\n    return (\n        <div style={{ display: 'flex', gap: '1rem' }}>\n            {renderDropdown(pair[0], 0)}\n            {renderDropdown(pair[1], 1)}\n        </div>\n    );\n};\n\nPairDropdown.displayName = 'BrandedPairDropdown';\nexport { PairDropdown };","import { useBrandedColors } from \"..\";\n\nconst TextInput = ({\n    type,\n    value,\n    onChange,\n    min,\n    max,\n    placeholder,\n}: {\n    type?: 'number';\n    value?: string | number;\n    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n    min?: number;\n    max?: number;\n    placeholder?: string;\n}) => {\n    const { style } = useBrandedColors();\n\n    return (\n        <input\n            type={type}\n            value={value}\n            onChange={onChange}\n            min={min}\n            max={max}\n            style={{\n                background: style.input_background || style.base_background,\n                border: style.input_border || style.base_border,\n                color: style.input_text_color || style.base_text_color,\n                boxShadow: style.input_shadow || style.base_shadow,\n                borderRadius: style.input_rounded || style.base_rounded,\n                fontSize: style.input_font_size || style.base_font_size,\n                fontWeight: style.font_weight_body,\n                padding: '0.5rem 1rem',\n                outline: 'none',\n            }}\n            placeholder={placeholder}\n        />\n    );\n};\n\nTextInput.displayName = 'BrandedTextInput';\nexport { TextInput };","import { FC, useState } from \"react\";\n\nexport interface BrandedButtonStyle {\n  backgroundColor: string;\n  border: string;\n  color: string;\n  boxShadow: string;\n  borderRadius: string;\n  fontSize: string;\n  fontWeight: string;\n}\n\nconst Button: FC<\n  {\n    brandedStyle: BrandedButtonStyle;\n  } & React.ButtonHTMLAttributes<HTMLButtonElement>\n> = (props) => {\n  const [isHovered, setIsHovered] = useState(false);\n\n  const baseStyle: React.CSSProperties = {\n    opacity: isHovered ? 0.75 : 1,\n    padding: \"0.5rem 1rem\",\n    cursor: \"pointer\",\n    transition: \"opacity 0.2s ease-in-out\",\n  };\n\n  const buttonStyle = { ...baseStyle, ...props.brandedStyle };\n\n  return (\n    <button\n      {...props}\n      onClick={props.onClick}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n      style={buttonStyle}\n    >\n      {props.children}\n    </button>\n  );\n};\n\nButton.displayName = \"BrandedButton\";\nexport { Button };\n","import { useState } from \"react\";\nimport { useBrandedColors } from \"..\";\nimport { adjustColorContrast } from \"../../../utils/colors\";\n\nconst ButtonGroup = ({\n  items,\n  selected,\n}: {\n  items: { label: string; onClick: () => void }[];\n  selected?: string;\n}) => {\n  const { style } = useBrandedColors();\n  const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\n  const [dividerWidth, dividerStyle, dividerColor] = (\n    style.button_border || style.base_border\n  ).split(\" \");\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexGrow: 1,\n        alignItems: \"center\",\n        minHeight: \"2.25rem\",\n        overflow: \"hidden\",\n        background: style.button_background || style.base_background,\n        border: style.button_border || style.base_border,\n        color: style.button_text_color || style.base_text_color,\n        boxShadow: style.button_shadow || style.base_shadow,\n        borderRadius: style.button_rounded || style.base_rounded,\n        fontSize: style.button_font_size || style.base_font_size,\n        fontWeight: style.font_weight_body,\n      }}\n    >\n      {items.map((item, index) => {\n        const isSelected = selected?.toLowerCase() === item.label.toLowerCase();\n        const baseBackground = style.button_background || style.base_background;\n        const selectedBackground = adjustColorContrast(baseBackground, 30);\n        const background = isSelected ? selectedBackground : baseBackground;\n\n        const isHovered = hoveredIndex === index;\n\n        return (\n          <button\n            key={index}\n            onClick={item.onClick}\n            onMouseEnter={() => setHoveredIndex(index)}\n            onMouseLeave={() => setHoveredIndex(null)}\n            style={{\n              flex: 1,\n              height: \"100%\",\n              padding: \"0.5rem 1rem\",\n              background,\n              borderLeft:\n                index > 0\n                  ? `${dividerWidth} ${dividerStyle} ${dividerColor}`\n                  : \"none\",\n              opacity: isHovered ? 0.75 : 1,\n              cursor: \"pointer\",\n              transition: \"opacity 0.2s ease-in-out\",\n              borderTop: \"none\",\n              borderRight: \"none\",\n              borderBottom: \"none\",\n              textWrap: \"nowrap\",\n            }}\n          >\n            {item.label}\n          </button>\n        );\n      })}\n    </div>\n  );\n};\n\nButtonGroup.displayName = \"BrandedButtonGroup\";\nexport { ButtonGroup };\n","import { useBrandedColors } from \"..\";\n\nconst Label = ({\n    children,\n    for: htmlFor,\n    customStyle = {},\n}: {\n    children: React.ReactNode,\n    for?: string,\n    customStyle?: React.CSSProperties\n}) => {\n    const { style } = useBrandedColors();\n    return <label\n        htmlFor={htmlFor}\n        style={{\n            ...{\n                color: style.main_text_color,\n                minWidth: \"4rem\",\n                fontSize: style.main_font_size,\n                fontWeight: style.font_weight_body,\n                lineHeight: style.main_font_size,\n            }, ...customStyle\n        }}\n    >{children}</label>;\n};\n\nLabel.displayName = 'BrandedLabel';\nexport { Label };","import { useBrandedColors } from \"..\";\n\nconst ResultsContainer = ({\n  children,\n  customStyle = {},\n}: {\n  children: React.ReactNode;\n  customStyle?: React.CSSProperties;\n}) => {\n  const { style } = useBrandedColors();\n\n  return (\n    <div\n      style={{\n        ...{\n          background: style.results_background || style.base_background,\n          border: style.results_border || style.base_border,\n          color: style.results_text_color || style.base_text_color,\n          boxShadow: style.results_shadow || style.base_shadow,\n          borderRadius: style.results_rounded || style.base_rounded,\n          fontSize: style.results_font_size || style.base_font_size,\n          fontWeight: style.font_weight_body,\n          lineHeight: style.results_font_size || style.base_font_size,\n          display: \"flex\",\n          flexDirection: \"column\",\n          width: \"fit-content\",\n          height: \"auto\",\n          margin: \"0.5rem\",\n          padding: \"1rem 2rem\",\n          gap: \"0.5rem\",\n          alignItems: \"center\",\n          whiteSpace: \"nowrap\",\n          textAlign: \"center\",\n        },\n        ...customStyle,\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n\nResultsContainer.displayName = \"BrandedResultsContainer\";\nexport { ResultsContainer };\n","import React, { createContext, useContext } from \"react\";\nimport { useBrandedColors } from \"..\";\n\ntype TableComponent = React.FC<{ children: React.ReactNode }> & {\n    Head: React.FC<{ children: React.ReactNode }>;\n    HeadCell: React.FC<{ children: React.ReactNode }>;\n    Body: React.FC<{ children: React.ReactNode }>;\n    Row: React.FC<{\n        children: React.ReactNode;\n        index?: number;\n        isLastRow?: boolean;\n        customStyle?: React.CSSProperties;\n    }>;\n    Cell: React.FC<{\n        children: React.ReactNode;\n        className?: string;\n        customStyle?: React.CSSProperties;\n        headLike?: boolean;\n        isLastCol?: boolean;\n        isLastRow?: boolean;\n        colSpan?: number;\n    }>;\n    displayName?: string;\n};\n\nconst TableRowContext = createContext<{ striped: boolean } | undefined>(undefined);\n\nconst useTableRowContext = () => {\n    const context = useContext(TableRowContext);\n    if (!context) {\n        throw new Error('useTableContext must be used within a Table component');\n    }\n    return context;\n};\n\nconst Table = Object.assign(\n    ({ children }: { children: React.ReactNode }) => {\n        const { style } = useBrandedColors();\n\n        return <div style={{\n            border: style.table_border || style.main_border,\n            boxShadow: style.table_shadow || style.main_shadow,\n            borderRadius: style.table_rounded || style.main_rounded,\n            // minWidth: 'fit-content',\n            overflow: 'auto',\n            position: 'relative',\n            width: '100%',\n            maxWidth: '100%',\n            maxHeight: '100%', // 👈 add this or pass as prop\n        }}>\n            <div style={{\n                position: 'absolute',\n                boxShadow: style.table_shadow || style.main_shadow,\n                width: '100%',\n                height: '100%',\n                pointerEvents: 'none',\n            }}></div>\n            <table style={{\n                borderCollapse: 'collapse',\n                width: '100%',\n                maxWidth: '100%',\n                tableLayout: 'auto', // Let the table adapt to content size\n                overflow: 'auto',\n            }}>{children}</table>\n        </div>;\n    },\n    {\n        Head: ({ children }: { children: React.ReactNode }) => {\n            return <thead>\n                <tr>\n                    {children}\n                </tr>\n            </thead>;\n        },\n\n        HeadCell: ({ children }: { children: React.ReactNode }) => {\n            const { tableHeadCellStyle } = useBrandedColors();\n\n            return (\n                <th\n                    style={{\n                        ...tableHeadCellStyle,\n                        position: 'sticky',\n                        top: 0,\n                        textAlign: 'start',\n                        background: tableHeadCellStyle.background || 'white',\n                        zIndex: 2, // make sure it stays above scrolling content\n                    }}\n                >\n                    {children}\n                </th>\n            );\n        },\n\n        Body: ({ children }: { children: React.ReactNode }) => {\n            const rows = React.Children.toArray(children);\n            return <tbody>\n                {rows.map((child, index) =>\n                    React.cloneElement(child as React.ReactElement<any>, {\n                        index,\n                        isLastRow: index === rows.length - 1,\n                    })\n                )}\n            </tbody>;\n        },\n\n        Row: ({\n            children,\n            index,\n            isLastRow,\n            customStyle = {},\n        }: {\n            children: React.ReactNode;\n            index?: number;\n            isLastRow?: boolean;\n            customStyle?: React.CSSProperties;\n        }) => {\n            const { style } = useBrandedColors();\n            const isStriped = !!style.table_striped && index !== undefined && index % 2 === 1;\n\n            const cells = React.Children.toArray(children);\n            const rowChildren = cells.map((child, cellIndex) =>\n                React.cloneElement(child as React.ReactElement<any>, {\n                    isLastCol: cellIndex === cells.length - 1,\n                    isLastRow,\n                })\n            );\n\n            const rowStyle: React.CSSProperties = {\n                color: style.table_body_text_color || style.base_text_color,\n                borderBottom: customStyle.borderBottom || ((style.table_row_separator && !isLastRow) ? style.table_row_separator : undefined),\n                ...customStyle,\n            }\n\n            return <TableRowContext.Provider value={{ striped: isStriped }}>\n                <tr style={rowStyle}>\n                    {rowChildren}\n                </tr>\n            </TableRowContext.Provider>;\n        },\n\n        Cell: ({\n            children,\n            className,\n            customStyle = {},\n            headLike,\n            isLastCol,\n            isLastRow,\n            colSpan = 1,\n        }: {\n            className?: string;\n            children: React.ReactNode;\n            customStyle?: React.CSSProperties;\n            headLike?: boolean;\n            isLastCol?: boolean;\n            isLastRow?: boolean;\n            colSpan?: number;\n        }) => {\n            const { style, tableHeadCellStyle } = useBrandedColors();\n            const { striped } = useTableRowContext();\n\n            const initialBackgroundColor = style.table_body_background || style.base_background;\n            const isDark = parseInt(initialBackgroundColor.slice(1), 16) > 0xffffff / 2;\n            const stripedBackgroundColor = isDark\n                ? '#' + (parseInt(initialBackgroundColor.slice(1), 16) - 0x101010).toString(16).padStart(6, '0')\n                : '#' + (parseInt(initialBackgroundColor.slice(1), 16) + 0x101010).toString(16).padStart(6, '0');\n\n            const finalStyle: React.CSSProperties = {\n                ...(headLike ? tableHeadCellStyle : {\n                    background: striped ? stripedBackgroundColor : initialBackgroundColor,\n                    color: style.table_body_text_color || style.base_text_color,\n                    padding: '0.5rem 1rem',\n                    borderRight: (style.table_column_separator && !isLastCol) ? style.table_column_separator : undefined,\n                    fontSize: style.table_body_font_size || style.base_font_size,\n                    fontWeight: style.font_weight_body,\n                    whiteSpace: 'nowrap',\n                    overflow: 'hidden',\n                    textOverflow: 'ellipsis',\n                }\n                ),\n                ...customStyle,\n            }\n\n            return <td\n                style={finalStyle}\n                className={className}\n                colSpan={colSpan}\n            >\n                {children}\n            </td>;\n        },\n    }\n) as TableComponent;\n\nTable.displayName = 'BrandedTable';\nexport { Table };","import React from 'react';\nimport * as Popover from '@radix-ui/react-popover';\n\nexport interface StringDatePickerProps {\n    value: string | null; // YYYY-MM-DD\n    onChange?: (date: string) => void;\n    styles?: {\n        background?: string;\n        textColor?: string;\n        selectedBackground?: string;\n        selectedTextColor?: string;\n        border?: string;\n        triggerBorderRadius?: string;\n        contentBorderRadius?: string;\n        fontSize?: string;\n        fontWeight?: string;\n        shadow?: string;\n    };\n}\n\nexport const StringDatePicker: React.FC<StringDatePickerProps> = ({ value, onChange, styles = {} }) => {\n    const today = new Date();\n    const [month, setMonth] = React.useState(today.getMonth());\n    const [year, setYear] = React.useState(today.getFullYear());\n    const [selectedDate, setSelectedDate] = React.useState<string | null>(value ?? null);\n    const [open, setOpen] = React.useState(false);\n    const [hoveredDay, setHoveredDay] = React.useState<number | null>(null);\n\n    React.useEffect(() => {\n        if (value) {\n            setSelectedDate(value);\n            const parsed = new Date(value);\n            setMonth(parsed.getMonth());\n            setYear(parsed.getFullYear());\n        }\n    }, [value]);\n\n    React.useEffect(() => {\n        if (open && selectedDate) {\n            const parsed = new Date(selectedDate);\n            setMonth(parsed.getMonth());\n            setYear(parsed.getFullYear());\n        }\n    }, [open]);\n\n    const monthNames = [\n        \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n        \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n    ];\n\n    const daysInMonth = new Date(year, month + 1, 0).getDate();\n    const startDay = new Date(year, month, 1).getDay();\n\n    const isSelected = (day: number) => {\n        if (!selectedDate) return false;\n        const [y, m, d] = selectedDate.split('-').map(Number);\n        return y === year && m - 1 === month && d === day;\n    };\n\n    const handleSelect = (day: number) => {\n        const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n        setSelectedDate(dateStr);\n        onChange?.(dateStr);\n        setOpen(false);\n    };\n\n    const goToPrevMonth = () => {\n        if (month === 0) {\n            setMonth(11);\n            setYear((y) => y - 1);\n        } else {\n            setMonth((m) => m - 1);\n        }\n    };\n\n    const goToNextMonth = () => {\n        if (month === 11) {\n            setMonth(0);\n            setYear((y) => y + 1);\n        } else {\n            setMonth((m) => m + 1);\n        }\n    };\n\n    return (\n        <Popover.Root open={open} onOpenChange={setOpen}>\n            <Popover.Trigger asChild>\n                <button\n                    style={{\n                        flex: 1,\n                        textWrap: 'nowrap',\n                        background: styles.background || 'white',\n                        color: styles.textColor || 'black',\n                        border: styles.border || '1px solid #ccc',\n                        borderRadius: styles.triggerBorderRadius || '0.5rem',\n                        fontSize: styles.fontSize || '14px',\n                        fontWeight: styles.fontWeight || 'normal',\n                        boxShadow: styles.shadow,\n                        padding: '0.5rem 1rem',\n                        cursor: 'pointer',\n                    }}\n                >\n                    {selectedDate || 'Pick a date'}\n                </button>\n            </Popover.Trigger>\n            <Popover.Portal>\n                <Popover.Content\n                    align=\"start\"\n                    sideOffset={8}\n                    style={{\n                        padding: '1rem',\n                        background: styles.background || 'white',\n                        color: styles.textColor || 'black',\n                        border: styles.border || '1px solid #ccc',\n                        borderRadius: styles.contentBorderRadius || '0.5rem',\n                        boxShadow: styles.shadow || '0 4px 12px rgba(0, 0, 0, 0.1)',\n                        zIndex: 1000,\n                    }}\n                >\n                    <div\n                        style={{\n                            display: 'flex',\n                            justifyContent: 'space-between',\n                            alignItems: 'center',\n                            marginBottom: '0.5rem',\n                            fontWeight: 'bold',\n                        }}\n                    >\n                        <button onClick={goToPrevMonth} style={{ cursor: \"pointer\" }}>&lt;</button>\n                        <div>{`${monthNames[month]} ${year}`}</div>\n                        <button onClick={goToNextMonth} style={{ cursor: \"pointer\" }}>&gt;</button>\n                    </div>\n\n                    <div\n                        style={{\n                            display: 'grid',\n                            gridTemplateColumns: 'repeat(7, 1fr)',\n                            textAlign: 'center',\n                            fontSize: '12px',\n                            marginBottom: '0.25rem',\n                            fontWeight: 'bold',\n                        }}\n                    >\n                        {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((d) => (\n                            <div key={d}>{d}</div>\n                        ))}\n                    </div>\n\n                    <div\n                        style={{\n                            display: 'grid',\n                            gridTemplateColumns: 'repeat(7, 1fr)',\n                            textAlign: 'center',\n                            fontSize: '12px',\n                            gap: '0.25rem',\n                        }}\n                    >\n                        {Array(startDay).fill(null).map((_, i) => <div key={`e-${i}`} />)}\n\n                        {Array(daysInMonth).fill(null).map((_, i) => {\n                            const day = i + 1;\n                            const selected = isSelected(day);\n                            const hovered = hoveredDay === day;\n\n                            return (\n                                <button\n                                    key={day}\n                                    onClick={() => handleSelect(day)}\n                                    onMouseEnter={() => setHoveredDay(day)}\n                                    onMouseLeave={() => setHoveredDay(null)}\n                                    style={{\n                                        background: selected\n                                            ? styles.selectedBackground || '#0070f3'\n                                            : hovered\n                                                ? '#eee'\n                                                : 'transparent',\n                                        color: selected\n                                            ? styles.selectedTextColor || 'white'\n                                            : styles.textColor || 'black',\n                                        borderRadius: '9999px',\n                                        padding: '0.25rem 0.5rem',\n                                        border: 'none',\n                                        cursor: 'pointer',\n                                        transition: 'background 0.2s ease',\n                                    }}\n                                >\n                                    {day}\n                                </button>\n                            );\n                        })}\n                    </div>\n                </Popover.Content>\n            </Popover.Portal>\n        </Popover.Root>\n    );\n}","import { useBrandedColors } from \"..\";\nimport { EcoCal } from \"../../../types/EcoCal\";\nimport { calculateContentBorderRadius } from \"../../../utils/calculateContentBorderRadius\";\nimport { StringDatePicker, StringDatePickerProps } from \"../../StringDatePicker\"; // make sure this path matches\nimport { HiArrowNarrowRight } from \"react-icons/hi\";\n\n\n\nconst DateRangePicker = ({\n    value,\n    onChange,\n}: {\n    value: EcoCal.StringDateRange;\n    onChange?: (value: EcoCal.StringDateRange) => void;\n}) => {\n    const { style } = useBrandedColors();\n\n    const roundness = style.date_roundness || style.base_rounded;\n    const pickerStyles: StringDatePickerProps[\"styles\"] = {\n        // flex: 1,\n        background: style.date_background || style.base_background,\n        textColor: style.date_text || style.base_text_color,\n        selectedBackground: style.date_selected_background || style.base_text_color,\n        selectedTextColor: style.date_selected_text || style.base_background,\n        border: style.date_border || style.base_border,\n        triggerBorderRadius: roundness,\n        contentBorderRadius: calculateContentBorderRadius(roundness),\n        fontSize: style.date_font_size || style.base_font_size,\n        shadow: style.date_shadow || style.base_shadow,\n    };\n\n    const changeStartDate = (start: string) => {\n        onChange?.({\n            start,\n            end: value.end,\n        });\n    };\n\n    const changeEndDate = (end: string) => {\n        onChange?.({\n            start: value.start,\n            end,\n        });\n    };\n\n    return (\n        <div\n            style={{\n                display: 'flex',\n                flex: 1,\n                alignItems: 'center',\n                gap: '1rem',\n            }}\n        >\n            <StringDatePicker\n                value={value?.start ?? null}\n                onChange={changeStartDate}\n                styles={pickerStyles}\n            />\n            <span\n                style={{\n                    color: style.main_text_color,\n                    fontSize: '0.875rem',\n                }}\n            >\n                <HiArrowNarrowRight size={24} />\n            </span>\n            <StringDatePicker\n                value={value?.end ?? null}\n                onChange={changeEndDate}\n                styles={pickerStyles}\n            />\n        </div>\n    );\n};\n\nDateRangePicker.displayName = 'DateRangePicker';\nexport { DateRangePicker };\n","import { FC, useEffect, useState } from 'react';\nimport Branded from '..';\nimport { fetchLangs } from '../../../functions/fetchLangs';\n\nexport interface LangDropdownProps {\n    selected: string | string[];\n    onSelect: (lang: string) => void;\n    multiple?: boolean;\n}\n\nconst LangDropdown: FC<LangDropdownProps> = ({\n    selected,\n    onSelect,\n    multiple = false,\n}) => {\n    const [langs, setLangs] = useState<string[]>([\"EN\"]);\n\n    useEffect(() => {\n        console.log(\"Fetching languages...\");\n        const fetchLanguages = async () => {\n            const fetchedLangs = await fetchLangs();\n            setLangs(fetchedLangs);\n        };\n        fetchLanguages();\n    }, []);\n\n    return <Branded.Dropdown\n        label={selected}\n        items={langs.map(lang => ({\n            value: lang,\n            label: lang,\n            content: lang,\n        }))}\n        onSelect={(value) => onSelect(value as string)}\n        selected={selected}\n        searchable\n    />;\n};\n\nLangDropdown.displayName = 'BrandedLangDropdown';\nexport { LangDropdown };","declare const process: { env: Record<string, string | undefined> };\n\n// Override all widget API calls locally: NEXT_PUBLIC_WIDGET_API_BASE_URL=http://localhost:3001\nexport const WIDGET_API_BASE =\n    (typeof process !== \"undefined\" && process.env.NEXT_PUBLIC_WIDGET_API_BASE_URL) ||\n    \"https://widget.newsfactory.tv\";\n","import { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchLangs(): Promise<string[]> {\n    const url = `${WIDGET_API_BASE}/api/widgets/langs`;\n\n    try {\n        console.log(\"Fetching languages from:\", url);\n        const response = await fetch(url);\n        if (!response.ok) {\n            console.error(`HTTP error! status: ${response.status}`);\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n        const data = await response.json();\n        console.log(\"Fetched languages:\", data);\n        return (data || []).map((lang: { langCode: string }) => lang.langCode);\n    } catch (error) {\n        console.error('Fetch error:', error);\n        return [];\n    }\n}","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useBrandedColors } from \"..\";\nimport { adjustColorContrast } from \"../../../utils/colors\";\nimport { Dropdown } from \"./Dropdown\";\n\ntype TabItem = {\n    id: string;\n    label: React.ReactNode;\n    content: React.ReactNode;\n    disabled?: boolean;\n};\n\ntype TabsProps = {\n    items: TabItem[];\n    defaultActiveId?: string;\n    activeId?: string;\n    onChange?: (id: string) => void;\n\n    // NEW: report height of the currently active panel\n    onActivePanelHeight?: (h: number) => void;\n\n    containerStyle?: React.CSSProperties;\n    listStyle?: React.CSSProperties;\n    tabStyle?: React.CSSProperties;\n    tabActiveStyle?: React.CSSProperties;\n    tabDisabledStyle?: React.CSSProperties;\n    panelStyle?: React.CSSProperties;\n    indicatorStyle?: React.CSSProperties;\n\n    ariaLabel?: string;\n};\n\nexport function Tabs({\n    items,\n    defaultActiveId,\n    activeId,\n    onChange,\n    onActivePanelHeight,          // <-- NEW\n    containerStyle,\n    listStyle,\n    tabStyle,\n    tabActiveStyle,\n    tabDisabledStyle,\n    panelStyle,\n    indicatorStyle,\n    ariaLabel = \"Tabs\",\n}: TabsProps) {\n    const { style } = useBrandedColors();\n\n    const enabledItems = useMemo(\n        () => items.filter(i => !i.disabled),\n        [items]\n    );\n\n    const initialId =\n        activeId ??\n        defaultActiveId ??\n        (enabledItems.length ? enabledItems[0].id : undefined);\n\n    const [internalActiveId, setInternalActiveId] = useState<string | undefined>(\n        initialId\n    );\n    const currentActiveId = activeId ?? internalActiveId;\n\n    // validate active tab if it disappears / becomes disabled\n    useEffect(() => {\n        if (\n            currentActiveId &&\n            !items.some(i => i.id === currentActiveId && !i.disabled)\n        ) {\n            const next = enabledItems[0]?.id;\n            if (activeId == null) setInternalActiveId(next);\n            onChange?.(next ?? \"\");\n        }\n    }, [items, enabledItems, currentActiveId, activeId, onChange]);\n\n    // focus mgmt (unchanged)\n    const [focusIndex, setFocusIndex] = useState<number>(() => {\n        const idx = items.findIndex(i => i.id === currentActiveId);\n        return Math.max(0, idx);\n    });\n\n    useEffect(() => {\n        const idx = items.findIndex(i => i.id === currentActiveId);\n        if (idx >= 0) setFocusIndex(idx);\n    }, [items, currentActiveId]);\n\n    const tabsRef = useRef<(HTMLButtonElement | null)[]>([]);\n    const tabListWrapperRef = useRef<HTMLDivElement | null>(null);\n\n    const activate = (id: string | undefined) => {\n        if (!id) return;\n        if (activeId == null) setInternalActiveId(id);\n        onChange?.(id);\n    };\n\n    const moveFocus = (dir: -1 | 1) => {\n        if (!items.length) return;\n        let i = focusIndex;\n        for (let step = 0; step < items.length; step++) {\n            i = (i + dir + items.length) % items.length;\n            if (!items[i].disabled) break;\n        }\n        setFocusIndex(i);\n        tabsRef.current[i]?.focus();\n    };\n\n    const focusFirst = () => {\n        const i = items.findIndex(t => !t.disabled);\n        if (i >= 0) {\n            setFocusIndex(i);\n            tabsRef.current[i]?.focus();\n        }\n    };\n    const focusLast = () => {\n        for (let i = items.length - 1; i >= 0; i--) {\n            if (!items[i].disabled) {\n                setFocusIndex(i);\n                tabsRef.current[i]?.focus();\n                break;\n            }\n        }\n    };\n\n    // default styles (unchanged)\n    const defaultContainer: React.CSSProperties = {\n        display: \"flex\",\n        flexDirection: \"column\",\n        width: \"100%\",\n    };\n    const defaultList: React.CSSProperties = {\n        display: \"flex\",\n        gap: 8,\n        position: \"relative\",\n        borderBottom: \"1px solid #ddd\",\n        flexWrap: \"nowrap\",\n        overflowX: \"hidden\",\n    };\n    const defaultTab: React.CSSProperties = {\n        background: style.base_background,\n        border: style.base_border,\n        padding: \"8px 12px\",\n        cursor: \"pointer\",\n        font: \"inherit\",\n        color: style.base_text_color,\n        whiteSpace: \"nowrap\",\n    };\n    const defaultTabActive: React.CSSProperties = {\n        background: adjustColorContrast(style.base_background, 20),\n        fontWeight: 600,\n    };\n    const defaultTabDisabled: React.CSSProperties = {\n        opacity: 0.5,\n        cursor: \"not-allowed\",\n    };\n    const defaultPanel: React.CSSProperties = {\n        padding: \"12px 0\",\n    };\n    const defaultIndicator: React.CSSProperties = {\n        position: \"absolute\",\n        left: 0,\n        bottom: 0,\n        height: 2,\n        width: 0,\n        background: \"#000\",\n        transition: \"transform 150ms ease, width 150ms ease\",\n    };\n\n    // indicator position (unchanged)\n    const activeIdx = items.findIndex(t => t.id === currentActiveId);\n    const activeBtn = tabsRef.current[activeIdx];\n    const [indicatorRect, setIndicatorRect] = useState<{ left: number; width: number }>({ left: 0, width: 0 });\n\n    useEffect(() => {\n        if (!activeBtn || !activeBtn.parentElement) {\n            setIndicatorRect({ left: 0, width: 0 });\n            return;\n        }\n        const parentRect = activeBtn.parentElement.getBoundingClientRect();\n        const rect = activeBtn.getBoundingClientRect();\n        setIndicatorRect({\n            left: rect.left - parentRect.left,\n            width: rect.width,\n        });\n    }, [activeIdx, items, currentActiveId]);\n\n    // overflow -> dropdown logic (unchanged)\n    const [useSelect, setUseSelect] = useState(false);\n\n    const checkOverflow = () => {\n        const el = tabListWrapperRef.current;\n        if (!el) return;\n        const isOverflowing = el.scrollWidth > el.clientWidth;\n        setUseSelect(isOverflowing);\n    };\n\n    useEffect(() => {\n        const el = tabListWrapperRef.current;\n        if (!el) return;\n\n        checkOverflow();\n\n        const ro = new ResizeObserver(() => {\n            checkOverflow();\n        });\n\n        ro.observe(el);\n        window.addEventListener(\"resize\", checkOverflow);\n\n        return () => {\n            ro.disconnect();\n            window.removeEventListener(\"resize\", checkOverflow);\n        };\n    }, [items, currentActiveId]);\n\n    // NEW: measure active panel height and report up\n    const panelRefs = useRef<Record<string, HTMLDivElement | null>>({});\n\n    useEffect(() => {\n        if (!currentActiveId) return;\n        const node = panelRefs.current[currentActiveId];\n        if (!node) return;\n\n        const h = node.clientHeight;\n        if (h > 0) {\n            onActivePanelHeight?.(h);\n        }\n    }, [currentActiveId, items, onActivePanelHeight]);\n\n    return (\n        <div style={{ ...defaultContainer, ...containerStyle }}>\n            {/* dropdown version */}\n            <div\n                style={{\n                    marginBottom: useSelect ? 8 : 0,\n                    display: useSelect ? \"block\" : \"none\",\n                    width: \"fit-content\",\n                    minWidth: 120,\n                }}\n            >\n                <Dropdown\n                    items={items.map(t => ({\n                        label: t.label,\n                        value: t.id,\n                        content: t.label,\n                    }))}\n                    label={items.find(t => t.id === currentActiveId)?.label || \"Select tab\"}\n                    onSelect={(value) => activate(value.toString())}\n                    selected={currentActiveId || \"\"}\n                />\n            </div>\n\n            {/* tab row version */}\n            <div\n                ref={tabListWrapperRef}\n                role=\"tablist\"\n                aria-label={ariaLabel}\n                style={{\n                    ...defaultList,\n                    ...listStyle,\n                    height: useSelect ? 0 : undefined,\n                    opacity: useSelect ? 0 : 1,\n                    pointerEvents: useSelect ? \"none\" : undefined,\n                    borderBottom: useSelect ? \"0 none\" : (listStyle?.borderBottom ?? defaultList.borderBottom),\n                    overflowX: \"hidden\",\n                }}\n            >\n                {items.map((t, i) => {\n                    const isActive = t.id === currentActiveId;\n                    const base = { ...defaultTab, ...tabStyle };\n                    const activeS = isActive\n                        ? { ...defaultTabActive, ...tabActiveStyle }\n                        : {};\n                    const disabledS = t.disabled\n                        ? { ...defaultTabDisabled, ...tabDisabledStyle }\n                        : {};\n\n                    return (\n                        <button\n                            key={t.id}\n                            ref={el => (tabsRef.current[i] = el)}\n                            role=\"tab\"\n                            aria-selected={isActive}\n                            aria-controls={`panel-${t.id}`}\n                            id={`tab-${t.id}`}\n                            tabIndex={i === focusIndex ? 0 : -1}\n                            disabled={t.disabled}\n                            onClick={() => !t.disabled && activate(t.id)}\n                            onKeyDown={(e) => {\n                                if (e.key === \"ArrowRight\") { e.preventDefault(); moveFocus(1); }\n                                else if (e.key === \"ArrowLeft\") { e.preventDefault(); moveFocus(-1); }\n                                else if (e.key === \"Home\") { e.preventDefault(); focusFirst(); }\n                                else if (e.key === \"End\") { e.preventDefault(); focusLast(); }\n                                else if (e.key === \" \" || e.key === \"Enter\") {\n                                    e.preventDefault();\n                                    !t.disabled && activate(t.id);\n                                }\n                            }}\n                            style={{ ...base, ...activeS, ...disabledS }}\n                        >\n                            {t.label}\n                        </button>\n                    );\n                })}\n\n                <div\n                    aria-hidden\n                    style={{\n                        ...defaultIndicator,\n                        ...indicatorStyle,\n                        width: indicatorRect.width,\n                        transform: `translateX(${indicatorRect.left}px)`,\n                    }}\n                />\n            </div>\n\n            {/* panels (all mounted) */}\n            {items.map(t => {\n                const isActive = t.id === currentActiveId;\n                return (\n                    <div\n                        key={t.id}\n                        role=\"tabpanel\"\n                        id={`panel-${t.id}`}\n                        aria-labelledby={`tab-${t.id}`}\n                        hidden={!isActive}\n                        style={{\n                            ...defaultPanel,\n                            ...panelStyle,\n                            display: isActive ? \"block\" : \"none\",\n                        }}\n                        ref={el => { panelRefs.current[t.id] = el; }}\n                    >\n                        {t.content}\n                    </div>\n                );\n            })}\n        </div>\n    );\n}\n","import { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchLogoUrl(\n    styleId: number,\n    brandId: number,\n    size?: '512' | '128'\n): Promise<string | null> {\n    try {\n        const response = await fetch(`${WIDGET_API_BASE}/api/widgets/logo`, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ styleId, brandId, size }),\n        });\n\n        if (!response.ok) {\n            throw new Error(`Failed to fetch logo`);\n        }\n\n        const { logoSrc } = await response.json();\n\n        console.log(\"Fetched logo URL:\", logoSrc);\n\n        return logoSrc; // This is the data URL for the logo\n    } catch (error) {\n        console.error(\"Error fetching logo:\", error);\n        return null;\n    }\n}\n","import React, {\n  forwardRef,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { useBrandedColors } from \"..\";\n\ntype ScrollContainerProps = {\n  style?: React.CSSProperties;\n  className?: string;\n  children: React.ReactNode;\n};\n\nfunction withAlpha(color: string, alpha: number) {\n  const c = (color || \"\").trim();\n\n  const m = c.match(\n    /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*([0-9.]+))?\\s*\\)$/i\n  );\n  if (m) {\n    return `rgba(${m[1]}, ${m[2]}, ${m[3]}, ${alpha})`;\n  }\n\n  const hex = c.startsWith(\"#\") ? c.slice(1) : c;\n  if (hex.length === 3) {\n    const r = parseInt(hex[0] + hex[0], 16);\n    const g = parseInt(hex[1] + hex[1], 16);\n    const b = parseInt(hex[2] + hex[2], 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n  if (hex.length === 6) {\n    const r = parseInt(hex.slice(0, 2), 16);\n    const g = parseInt(hex.slice(2, 4), 16);\n    const b = parseInt(hex.slice(4, 6), 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n\n  return `rgba(255,255,255,${alpha})`;\n}\n\nconst ScrollContainer = forwardRef<HTMLDivElement, ScrollContainerProps>(\n  ({ style: customStyle, className, children }, forwardedRef) => {\n    const { style } = useBrandedColors();\n    const { height, ...restStyle } = customStyle ?? {};\n\n    const dir = (style as any)?.dir === \"rtl\" ? \"rtl\" : \"ltr\";\n    const isRTL = dir === \"rtl\";\n\n    const outerRef = useRef<HTMLDivElement>(null);\n    const viewportRef = useRef<HTMLDivElement>(null);\n    const trackRef = useRef<HTMLDivElement>(null);\n\n    // forward ref to the scroll viewport\n    useLayoutEffect(() => {\n      if (!forwardedRef) return;\n      const el = viewportRef.current;\n      if (!el) return;\n\n      if (typeof forwardedRef === \"function\") forwardedRef(el);\n      else forwardedRef.current = el;\n    }, [forwardedRef]);\n\n    const [hasOverflow, setHasOverflow] = useState(false);\n    const [thumb, setThumb] = useState({ top: 0, height: 24 });\n\n    const draggingRef = useRef(false);\n    const dragStartRef = useRef({ y: 0, scrollTop: 0, thumbTop: 0 });\n\n    const colors = useMemo(() => {\n      const base = style.main_text_color || \"#fff\";\n      return {\n        track: withAlpha(base, 0.1),\n        thumb: withAlpha(base, 0.35),\n        thumbHover: withAlpha(base, 0.55),\n        thumbActive: withAlpha(base, 0.75),\n      };\n    }, [style.main_text_color]);\n\n    const recalc = () => {\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      const clientH = vp.clientHeight;\n      const scrollH = vp.scrollHeight;\n      const trackH = tr.clientHeight;\n\n      const overflow = scrollH > clientH + 1;\n      setHasOverflow(overflow);\n\n      if (!overflow) {\n        setThumb({ top: 0, height: 24 });\n        return;\n      }\n\n      const minThumb = 24;\n      const ratio = clientH / scrollH;\n      const thumbH = Math.max(minThumb, Math.floor(trackH * ratio));\n      const maxThumbTop = Math.max(0, trackH - thumbH);\n      const maxScrollTop = Math.max(1, scrollH - clientH);\n\n      const top = (vp.scrollTop / maxScrollTop) * maxThumbTop;\n      setThumb({ top, height: thumbH });\n    };\n\n    useLayoutEffect(() => {\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      let raf = 0;\n      const schedule = () => {\n        cancelAnimationFrame(raf);\n        raf = requestAnimationFrame(recalc);\n      };\n\n      schedule();\n\n      vp.addEventListener(\"scroll\", schedule, { passive: true });\n\n      const ro = new ResizeObserver(schedule);\n      ro.observe(vp);\n      ro.observe(tr);\n\n      return () => {\n        cancelAnimationFrame(raf);\n        vp.removeEventListener(\"scroll\", schedule);\n        ro.disconnect();\n      };\n    }, []);\n\n    const onTrackPointerDown = (e: React.PointerEvent) => {\n      if (!hasOverflow) return;\n      if ((e.target as HTMLElement)?.dataset?.role === \"thumb\") return;\n\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      const rect = tr.getBoundingClientRect();\n      const clickY = e.clientY - rect.top;\n\n      const maxThumbTop = tr.clientHeight - thumb.height;\n      const desiredThumbTop = Math.min(\n        maxThumbTop,\n        Math.max(0, clickY - thumb.height / 2)\n      );\n\n      const maxScrollTop = vp.scrollHeight - vp.clientHeight;\n      vp.scrollTop = (desiredThumbTop / maxThumbTop) * maxScrollTop;\n    };\n\n    const onThumbPointerDown = (e: React.PointerEvent) => {\n      if (!hasOverflow) return;\n\n      draggingRef.current = true;\n      (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n\n      dragStartRef.current = {\n        y: e.clientY,\n        scrollTop: viewportRef.current!.scrollTop,\n        thumbTop: thumb.top,\n      };\n    };\n\n    const onThumbPointerMove = (e: React.PointerEvent) => {\n      if (!draggingRef.current) return;\n\n      const vp = viewportRef.current!;\n      const tr = trackRef.current!;\n      const dy = e.clientY - dragStartRef.current.y;\n\n      const maxThumbTop = tr.clientHeight - thumb.height;\n      const maxScrollTop = vp.scrollHeight - vp.clientHeight;\n\n      const nextThumbTop = Math.min(\n        maxThumbTop,\n        Math.max(0, dragStartRef.current.thumbTop + dy)\n      );\n\n      vp.scrollTop = (nextThumbTop / maxThumbTop) * maxScrollTop;\n    };\n\n    const onThumbPointerUp = (e: React.PointerEvent) => {\n      draggingRef.current = false;\n      try {\n        (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n      } catch {}\n    };\n\n    return (\n      <div\n        ref={outerRef}\n        style={{\n          position: \"relative\",\n          width: \"100%\",\n          boxSizing: \"border-box\",\n\n          ...(height != null ? { height } : {}),\n          ...(restStyle.flex != null ? {} : { flex: \"1 1 auto\" }),\n          minHeight: 0,\n\n          ...restStyle,\n        }}\n        className={className}\n      >\n        <style>{`\n          .nfViewport {\n            overflow: auto;\n            scrollbar-width: none;\n          }\n          .nfViewport::-webkit-scrollbar {\n            width: 0;\n            height: 0;\n          }\n          .nfTrack {\n            position: absolute;\n            top: 0;\n            bottom: 0;\n            width: var(--sbw, 10px);\n            opacity: 0;\n            transition: opacity 160ms ease;\n          }\n          .nfScrollRoot:hover .nfTrack {\n            opacity: 1;\n          }\n          .nfThumb {\n            position: absolute;\n            left: 1px;\n            right: 1px;\n            border-radius: 999px;\n            cursor: pointer;\n            touch-action: none;\n          }\n          @media (hover: none) {\n            .nfTrack { opacity: 0.25; }\n            .nfScrollRoot { --sbw: 6px; }\n          }\n        `}</style>\n\n        <div\n          className=\"nfScrollRoot\"\n          dir={dir}\n          style={{\n            position: \"relative\",\n            display: \"flex\",\n            flexDirection: \"column\",\n            height: \"100%\",\n            minHeight: 0,\n          }}\n        >\n          <div\n            ref={viewportRef}\n            className=\"nfViewport\"\n            style={{\n              flex: \"1 1 auto\",\n              minHeight: 0,\n              paddingRight: isRTL ? undefined : `var(--sbw, 10px)`,\n              paddingLeft: isRTL ? `var(--sbw, 10px)` : undefined,\n            }}\n          >\n            {children}\n          </div>\n\n          <div\n            ref={trackRef}\n            className=\"nfTrack\"\n            onPointerDown={onTrackPointerDown}\n            style={{\n              display: hasOverflow ? \"block\" : \"none\",\n              background: colors.track,\n              borderRadius: 999,\n              right: isRTL ? undefined : 0,\n              left: isRTL ? 0 : undefined,\n            }}\n          >\n            <div\n              data-role=\"thumb\"\n              className=\"nfThumb\"\n              onPointerDown={onThumbPointerDown}\n              onPointerMove={onThumbPointerMove}\n              onPointerUp={onThumbPointerUp}\n              onPointerCancel={onThumbPointerUp}\n              style={{\n                top: thumb.top,\n                height: thumb.height,\n                background: colors.thumb,\n              }}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n);\n\nScrollContainer.displayName = \"BrandedScrollContainer\";\nexport { ScrollContainer };\n","import { useEffect, useRef, useState } from \"react\";\nimport dictionaries from \"../../../dictionaries\";\nimport { fetchEconomicCalendar } from \"../../../functions/fetchEconomicData\";\nimport { Dictionary } from \"../../../types/Dictionary\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { isLightColor } from \"../../../utils/colors\";\nimport Branded from \"../../Branded\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport { EcoCal } from \"../../../types/EcoCal\";\nimport { groupEventsByDate } from \"./functions/groupEventsByDate\";\nimport {\n  convertDateRangeToUTC,\n  getTodayDateRange,\n} from \"../../../utils/datesAndTimes\";\nimport { EconomicCalendarFilters } from \"./parts/EconomicCalendarFilters\";\nimport { ComplexTable } from \"../../Branded/elements/ComplexTable\";\nimport { buildEconomicCalendarTable } from \"./buildEconomicCalendarTable\";\n\nconst formatSelectedLang = (lang: string) => {\n  if (lang === \"PT-BR\") return \"PT\";\n  return lang;\n};\n\ninterface RawEconomicCalendarProps {\n  styles: WidgetStyle;\n  isSmall: boolean;\n}\n\ninterface EconomicCalendarProps {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nexport function RawEconomicCalendar({\n  styles,\n  isSmall,\n}: RawEconomicCalendarProps): JSX.Element {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [selectedLang, setSelectedLang] = useState(\n    formatSelectedLang(styles.lang)\n  );\n  const [now, setNow] = useState(new Date());\n  const [impact, setImpact] = useState<\"High\" | \"Low\" | \"Medium\" | \"Impact\">(\n    \"Impact\"\n  );\n  const [selectedCountries, setSelectedCountries] = useState<string[]>([]);\n  const [selectedDateRange, setSelectedDateRange] =\n    useState<EcoCal.StringDateRange>(getTodayDateRange());\n  const [selectedTimeZone, setSelectedTimeZone] = useState(\"UTC\");\n\n  const [allEvents, setAllEvents] = useState<\n    EcoCal.EconomicEventWithTranslation[] | null\n  >(null);\n  const [groupedData, setGroupedData] = useState<EcoCal.EventsByDate>({});\n  const [status, setStatus] = useState<\"ready\" | \"loading\" | \"error\">(\"ready\");\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setNow(new Date());\n    }, 60000); // update every minute\n\n    return () => clearInterval(interval);\n  }, []);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const translation: Dictionary =\n          dictionaries[selectedLang.toLowerCase()] || dictionaries[\"en\"];\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [selectedLang, styles.font_family]);\n\n  const fetchData = async () => {\n    setStatus(\"loading\");\n\n    try {\n      const rangeInUTC = convertDateRangeToUTC(\n        selectedDateRange,\n        selectedTimeZone\n      );\n\n      const events = await fetchEconomicCalendar(\n        selectedLang,\n        rangeInUTC.start,\n        rangeInUTC.end\n      );\n\n      if (!events) {\n        setGroupedData({});\n        setStatus(\"error\");\n        return;\n      }\n\n      setAllEvents(events);\n\n      let filteredEvents = events;\n      if (impact !== \"Impact\") {\n        filteredEvents = filteredEvents.filter(\n          (event) =>\n            event.impact_description.toLowerCase() === impact.toLowerCase()\n        );\n      }\n      if (selectedCountries.length > 0) {\n        filteredEvents = filteredEvents.filter((event) =>\n          selectedCountries.includes(event.iso_country_code.toLowerCase())\n        );\n      }\n\n      const grouped = groupEventsByDate(filteredEvents, selectedTimeZone);\n      setGroupedData(grouped);\n      setStatus(\"ready\");\n    } catch (error) {\n      console.error(\"Error fetching economic data:\", error);\n      setGroupedData({});\n      setStatus(\"error\");\n    }\n  };\n\n  useEffect(() => {\n    fetchData();\n  }, [selectedDateRange, selectedTimeZone, selectedLang]);\n\n  useEffect(() => {\n    if (!allEvents) return;\n    let filteredEvents = allEvents;\n    if (impact !== \"Impact\") {\n      filteredEvents = filteredEvents.filter(\n        (event) =>\n          event.impact_description.toLowerCase() === impact.toLowerCase()\n      );\n    }\n    if (selectedCountries.length > 0) {\n      filteredEvents = filteredEvents.filter((event) =>\n        selectedCountries.includes(event.iso_country_code.toLowerCase())\n      );\n    }\n    const grouped = groupEventsByDate(filteredEvents, selectedTimeZone);\n    setGroupedData(grouped);\n  }, [impact, selectedCountries]);\n\n  if (!translations) return <></>;\n\n  const t = translations.economicCalendar;\n\n  const { columns, groups } = buildEconomicCalendarTable({\n    groupedData,\n    styles,\n    selectedTimeZone,\n    now,\n    t,\n    isSmall,\n  });\n\n  return (\n    <>\n      <EconomicCalendarFilters\n        t={t}\n        isSmall={isSmall}\n        now={now}\n        impact={impact}\n        setImpact={setImpact}\n        selectedCountries={selectedCountries}\n        setSelectedCountries={setSelectedCountries}\n        selectedDateRange={selectedDateRange}\n        setSelectedDateRange={setSelectedDateRange}\n        selectedTimeZone={selectedTimeZone}\n        setSelectedTimeZone={setSelectedTimeZone}\n        selectedLang={selectedLang}\n        setSelectedLang={setSelectedLang}\n      />\n\n      {status === \"loading\" ? (\n        <div\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            display: \"flex\",\n            justifyContent: \"center\",\n            alignItems: \"center\",\n            padding: \"2rem 0\",\n          }}\n        >\n          <FancyLoader />\n        </div>\n      ) : groupedData && Object.entries(groupedData).length > 0 ? (\n        <ComplexTable columns={columns} groups={groups} hideHeader={isSmall} />\n      ) : (\n        <div\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            display: \"flex\",\n            justifyContent: \"center\",\n            alignItems: \"center\",\n            padding: \"2rem 0\",\n            fontSize: \"1.2rem\",\n            color: isLightColor(styles.main_background) ? \"black\" : \"white\",\n          }}\n        >\n          {t.noEventsFound}\n        </div>\n      )}\n    </>\n  );\n}\n\nexport default function EconomicCalendar({\n  styles,\n  size = \"screen\",\n}: EconomicCalendarProps): JSX.Element {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [isSmall, setIsSmall] = useState<boolean>(false);\n\n  useEffect(() => {\n    if (!containerRef.current) {\n      console.error(\"Container not rendered yet.\");\n      return;\n    }\n\n    const observer = new ResizeObserver((entries) => {\n      for (let entry of entries) {\n        if (entry.contentRect) {\n          setIsSmall(entry.contentRect.width < 768);\n        }\n      }\n    });\n\n    observer.observe(containerRef.current);\n\n    return () => observer.disconnect();\n  }, [containerRef.current]);\n\n  return (\n    <Branded style={styles}>\n      <div\n        style={{\n          height: \"100%\",\n          width: \"100%\",\n          overflowY: \"auto\",\n        }}\n        ref={containerRef}\n      >\n        <Branded.WidgetContainer widgetName=\"economicCalendar\" size={size}>\n          <RawEconomicCalendar styles={styles} isSmall={isSmall} />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"محول العملات\",\n    \"from\": \"من\",\n    \"to\": \"إلى\",\n    \"amount\": \"المقدار\",\n    \"convert\": \"يتحول\",\n    \"result\": \"نتيجة\"\n  },\n  \"fibonacci\": {\n    \"title\": \"فيبوناتشي\",\n    \"uptrend\": \"تحسن\",\n    \"downtrend\": \"هبوط\",\n    \"high\": \"مرتفع (ب)\",\n    \"low\": \"منخفض (أ)\",\n    \"retracements\": \"تراجعات\",\n    \"extensions\": \"ملحقات\",\n    \"values\": \"قيم\",\n    \"result\": \"نتيجة\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"حاسبة الهامش\",\n    \"leverage\": \"الرفع\",\n    \"lotSize\": \"الحجم بالحصص\",\n    \"accountCurrency\": \"العملة الأساسية للحساب\",\n    \"currencyPair\": \"زوج العملات\",\n    \"accountType\": \"نوع الحساب\",\n    \"price\": \"سعر التحويل الحالي\",\n    \"requiredMargin\": \"الهامش المطلوب\",\n    \"result\": \"نتيجة\"\n  },\n  \"pivots\": {\n    \"title\": \"محاور\",\n    \"classic\": \"تقليدي\",\n    \"woodie\": \"وودي\",\n    \"camarilla\": \"كاماريلا\",\n    \"demark\": \"ديمارك\",\n    \"high\": \"سعرعالي\",\n    \"low\": \"سعر منخفض\",\n    \"open\": \"سعر الفتح\",\n    \"close\": \"سعر الإغلاق\",\n    \"pivotPoints\": \"نقاط المحور\",\n    \"res-4\": \"المقاومة الرابعة\",\n    \"res-3\": \"المقاومة الثالثة\",\n    \"res-2\": \"المقاومة الثانية\",\n    \"res-1\": \"المقاومة الأولى\",\n    \"pivot\": \"نقطة المحور\",\n    \"sup-1\": \"الدعم الأول\",\n    \"sup-2\": \"الدعم الثاني\",\n    \"sup-3\": \"الدعم الثالث\",\n    \"sup-4\": \"الدعم الرابع\",\n    \"result\": \"نتيجة\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"وقف الخسارة / جني الأرباح\",\n    \"buy\": \"شراء / طويل\",\n    \"sell\": \"بيع / قصير\",\n    \"open\": \"فتح\",\n    \"value\": \"القيمة / النقطة\",\n    \"lots\": \"الحصص\",\n    \"stop\": \"توقف\",\n    \"Limit\": \"الحد\",\n    \"maxLoss\": \"الحد الأقصى للخسارة\",\n    \"maxProfit\": \"أقصى ربح\",\n    \"result\": \"نتيجة\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"مستويات وقف الخسارة / جني الأرباح\",\n    \"buy\": \"شراء / طويل\",\n    \"sell\": \"بيع / قصير\",\n    \"open\": \"فتح\",\n    \"value\": \"القيمة / النقطة\",\n    \"lots\": \"الحصص\",\n    \"risk\": \"مبلغ المخاطرة\",\n    \"gain\": \"المبلغ المراد كسبه\",\n    \"stopLoss\": \"وقف الخسارة عند\",\n    \"takeProfit\": \"جني الأرباح في\",\n    \"stopLossPips\": \"وقف الخسارة (نقطة)\",\n    \"takeProfitPips\": \"جني الأرباح (النقاط)\",\n    \"result\": \"نتيجة\"\n  },\n  \"heatmap\": {\n    \"title\": \"خريطة حرارية\",\n    \"currencies\": \"العملات\",\n    \"value\": \"قيمة\",\n    \"result\": \"نتيجة\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \" انتراداي 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \" انتراداي 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \" انتراداي 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \" يومي\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \" أسبوعي\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"شهري\"\n      }\n    },\n    \"tooManyCurrencies\": \"تم تحديد العديد من العملات. يرجى تحديد ما يصل إلى 8 عملات.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"التقويم الاقتصادي\",\n    \"impact\": \"التأثير\",\n    \"high\": \"مرتفع\",\n    \"medium\": \"متوسط\",\n    \"low\": \"منخفض\",\n    \"countries\": \"الدول\",\n    \"customRange\": \"نطاق مخصص\",\n    \"yesterday\": \"أمس\",\n    \"today\": \"اليوم\",\n    \"tomorrow\": \"غدًا\",\n    \"thisWeek\": \"هذا الأسبوع\",\n    \"lastWeek\": \"الأسبوع الماضي\",\n    \"nextWeek\": \"الأسبوع المقبل\",\n    \"noEventsFound\": \"لا توجد أحداث\",\n    \"event\": \"الحدث\",\n    \"actual\": \"الفعلي\",\n    \"forecast\": \"التوقعات\",\n    \"previous\": \"السابق\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"الوقت\",\n        \"news\": \"الأخبار\",\n        \"impact\": \"التأثير\",\n        \"impactedCurrency\": \"العملة المتأثرة\",\n        \"actual\": \"الفعلي\",\n        \"forecast\": \"التوقعات\",\n        \"prior\": \"السابق\",\n        \"impactedInstruments\": \"الأدوات المتأثرة\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"تواريخ مخصصة\",\n        \"selectDateRange\": \"حدد نطاق التاريخ\",\n        \"startDate\": \"تاريخ البدء\",\n        \"endDate\": \"تاريخ الانتهاء\",\n        \"apply\": \"تطبيق\"\n      },\n      \"andMore\": \"والمزيد\",\n      \"stocks\": {\n        \"splits\": \"تجزئة الأسهم\",\n        \"earnings\": \"الأرباح\",\n        \"dividends\": \"التوزيعات\",\n        \"stockSplit\": \"تجزئة السهم\",\n        \"dividend\": \"توزيع\",\n        \"epsActual\": \"EPS الفعلي\",\n        \"epsForecast\": \"EPS المتوقع\",\n        \"revenueActual\": \"الإيرادات الفعلية\",\n        \"revenueForecast\": \"الإيرادات المتوقعة\",\n        \"exDate\": \"تاريخ الاستحقاق\",\n        \"cycle\": \"الدورة\",\n        \"payment\": \"الدفع\",\n        \"yield\": \"العائد\",\n        \"ratio\": \"النسبة\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"الإشارات\",\n    \"support\": \"الدعم\",\n    \"resistance\": \"المقاومة\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"ابحث في المسرد...\",\n    \"noResults\": \"لم يتم العثور على نتائج.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"الكل\",\n      \"forex\": \"الفوركس\",\n      \"stock\": \"الأسهم\",\n      \"crypto\": \"العملات الرقمية\",\n      \"cmd\": \"السلع\",\n      \"worldec\": \"الاقتصاد العالمي\",\n      \"regec\": \"الاقتصاد الإقليمي\"\n    },\n    \"searchPlaceholder\": \"ابحث في الأخبار والأسواق والرموز...\",\n    \"searchLabel\": \"البحث في الأخبار\",\n    \"articleCategoriesLabel\": \"فئات المقالات\",\n    \"latestNews\": \"أحدث الأخبار\",\n    \"noSearchResults\": \"لا توجد مقالات تطابق بحثك.\",\n    \"loading\": \"جارٍ التحميل...\",\n    \"loadMore\": \"عرض المزيد\",\n    \"popularTopics\": \"الموضوعات الشائعة\",\n    \"relatedNews\": \"أخبار ذات صلة\",\n    \"back\": \"رجوع\",\n    \"share\": \"مشاركة\",\n    \"readingTime\": \"وقت القراءة: {minutes} دقيقة\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"آخر تحديث مباشر\",\n      \"live\": \"مباشر\",\n      \"openFeed\": \"فتح البث المباشر\",\n      \"resume\": \"استئناف التحديثات المباشرة\",\n      \"pause\": \"إيقاف التحديثات المباشرة مؤقتًا\",\n      \"title\": \"تحديثات مباشرة\",\n      \"viewAll\": \"عرض جميع التحديثات\",\n      \"newestFirst\": \"الأحدث أولًا\",\n      \"oldestFirst\": \"الأقدم أولًا\",\n      \"sortOldestFirst\": \"ترتيب الأقدم أولًا\",\n      \"sortNewestFirst\": \"ترتيب الأحدث أولًا\",\n      \"newUpdate\": \"تحديث جديد واحد\",\n      \"newUpdates\": \"{count} تحديثات جديدة\",\n      \"loading\": \"جارٍ تحميل التحديثات المباشرة…\",\n      \"loadError\": \"تعذر تحميل التحديثات المباشرة.\",\n      \"tryAgain\": \"حاول مرة أخرى\",\n      \"empty\": \"لا توجد تحديثات مباشرة حتى الآن.\",\n      \"latest\": \"الأحدث\",\n      \"loadingEarlier\": \"جارٍ التحميل…\",\n      \"loadEarlier\": \"تحميل تحديثات أقدم\",\n      \"backToNews\": \"العودة إلى الأخبار\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"موجز السوق اليومي\",\n      \"title\": \"موجز السوق اليوم\",\n      \"description\": \"موجز فيديو يومي مختصر عن أهم التحركات وما يجب متابعته لاحقاً.\",\n      \"cta\": \"استكشف التحديث الكامل\",\n      \"share\": \"مشاركة\",\n      \"noVideo\": \"لا يوجد فيديو متاح بعد.\",\n      \"copied\": \"تم النسخ!\",\n      \"copyLink\": \"نسخ الرابط\",\n      \"shareOn\": \"مشاركة على {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"محركات السوق\",\n    \"active\": \"الأكثر نشاطًا\",\n    \"gainers\": \"الرابحون\",\n    \"losers\": \"الخاسرون\",\n    \"noData\": \"لا توجد بيانات\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"آخر 15 دقيقة\",\n      \"1h\": \"آخر ساعة\",\n      \"1d\": \"آخر يوم\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"النفط الخام\",\n      \"gold\": \"الذهب\",\n      \"silver\": \"الفضة\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"توصيات المحللين\",\n    \"strongSell\": \"بيع قوي\",\n    \"moderateSell\": \"بيع معتدل\",\n    \"hold\": \"احتفاظ\",\n    \"moderateBuy\": \"شراء معتدل\",\n    \"strongBuy\": \"شراء قوي\",\n    \"sell\": \"بيع\",\n    \"buy\": \"شراء\",\n    \"averageTarget\": \"متوسط السعر المستهدف\",\n    \"noData\": \"لا تتوفر توصيات المحللين لهذا الأصل.\",\n    \"loadError\": \"تعذر تحميل توصيات المحللين.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"الافتتاح\",\n    \"close\": \"الإغلاق\",\n    \"dayRange\": \"النطاق اليومي\",\n    \"volume\": \"الحجم\",\n    \"keyStatistics\": \"إحصاءات رئيسية\",\n    \"performance\": \"الأداء\",\n    \"week1\": \"أسبوع\",\n    \"month1\": \"شهر\",\n    \"month3\": \"3 أشهر\",\n    \"ytd\": \"منذ بداية العام\",\n    \"analystConsensus\": \"توافق المحللين\",\n    \"relatedNews\": \"أخبار ذات صلة\",\n    \"noData\": \"لا تتوفر بيانات\",\n    \"loadError\": \"تعذر تحميل البيانات\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"货币转换器\",\n    \"from\": \"从\",\n    \"to\": \"到\",\n    \"amount\": \"数量\",\n    \"convert\": \"转变\",\n    \"result\": \"结果\"\n  },\n  \"fibonacci\": {\n    \"title\": \"斐波那契\",\n    \"uptrend\": \"上升趋势\",\n    \"downtrend\": \"下降趋势\",\n    \"high\": \"高（b）\",\n    \"low\": \"低（a）\",\n    \"retracements\": \"回撤\",\n    \"extensions\": \"扩展\",\n    \"values\": \"价值观\",\n    \"result\": \"结果\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"保证金计算器\",\n    \"leverage\": \"杠杆\",\n    \"lotSize\": \"手数\",\n    \"accountCurrency\": \"账户基础货币\",\n    \"currencyPair\": \"货币对\",\n    \"accountType\": \"账户类型\",\n    \"price\": \"当前换算价格\",\n    \"requiredMargin\": \"所需保证金\",\n    \"result\": \"结果\"\n  },\n  \"pivots\": {\n    \"title\": \"枢轴\",\n    \"classic\": \"经典\",\n    \"woodie\": \"伍迪\",\n    \"camarilla\": \"卡马里拉\",\n    \"demark\": \"德马克\",\n    \"high\": \"高价\",\n    \"low\": \"低价\",\n    \"open\": \"开盘价\",\n    \"close\": \"收盘价\",\n    \"pivotPoints\": \"枢轴点\",\n    \"res-4\": \"4 阻力价位\",\n    \"res-3\": \"3 阻力价位\",\n    \"res-2\": \"2 阻力价位\",\n    \"res-1\": \"1 阻力价位\",\n    \"pivot\": \"枢轴点\",\n    \"sup-1\": \"1 支撑价位\",\n    \"sup-2\": \"2 支撑价位\",\n    \"sup-3\": \"3 支撑价位\",\n    \"sup-4\": \"4 支撑价位\",\n    \"result\": \"结果\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"止损/止盈\",\n    \"buy\": \"买入/做多\",\n    \"sell\": \"卖出/做空\",\n    \"open\": \"打开\",\n    \"value\": \"价值/点\",\n    \"lots\": \"股\",\n    \"stop\": \"停止\",\n    \"Limit\": \"限制\",\n    \"maxLoss\": \"最大亏损\",\n    \"maxProfit\": \"最大盈利\",\n    \"result\": \"结果\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"止损/获利水平\",\n    \"buy\": \"买入/做多\",\n    \"sell\": \"卖出/做空\",\n    \"open\": \"打开\",\n    \"value\": \"价值/点\",\n    \"lots\": \"股\",\n    \"risk\": \"相当风险\",\n    \"gain\": \"相当收益\",\n    \"stopLoss\": \"以...止损\",\n    \"takeProfit\": \"以...止盈\",\n    \"stopLossPips\": \"止损（点）\",\n    \"takeProfitPips\": \"止盈（点）\",\n    \"result\": \"结果\"\n  },\n  \"heatmap\": {\n    \"title\": \"热图\",\n    \"currencies\": \"行情\",\n    \"value\": \"价值\",\n    \"result\": \"结果\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"盘中15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"盘中60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"盘中240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"每日\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"每周\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"每月\"\n      }\n    },\n    \"tooManyCurrencies\": \"选择的货币太多。请选择最多 8 种货币。\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"经济日历\",\n    \"impact\": \"影响\",\n    \"high\": \"高\",\n    \"medium\": \"中\",\n    \"low\": \"低\",\n    \"countries\": \"国家\",\n    \"customRange\": \"自定义范围\",\n    \"yesterday\": \"昨天\",\n    \"today\": \"今天\",\n    \"tomorrow\": \"明天\",\n    \"thisWeek\": \"本周\",\n    \"lastWeek\": \"上周\",\n    \"nextWeek\": \"下周\",\n    \"noEventsFound\": \"没有找到事件\",\n    \"event\": \"事件\",\n    \"actual\": \"实际\",\n    \"forecast\": \"预测\",\n    \"previous\": \"之前\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"时间\",\n        \"news\": \"新闻\",\n        \"impact\": \"影响\",\n        \"impactedCurrency\": \"受影响的货币\",\n        \"actual\": \"实际\",\n        \"forecast\": \"预测\",\n        \"prior\": \"之前\",\n        \"impactedInstruments\": \"受影响的工具\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"自定义日期\",\n        \"selectDateRange\": \"选择日期范围\",\n        \"startDate\": \"开始日期\",\n        \"endDate\": \"结束日期\",\n        \"apply\": \"应用\"\n      },\n      \"andMore\": \"和更多\",\n      \"stocks\": {\n        \"splits\": \"拆股\",\n        \"earnings\": \"财报\",\n        \"dividends\": \"股息\",\n        \"stockSplit\": \"拆股\",\n        \"dividend\": \"股息\",\n        \"epsActual\": \"EPS实际\",\n        \"epsForecast\": \"EPS预期\",\n        \"revenueActual\": \"营收实际\",\n        \"revenueForecast\": \"营收预期\",\n        \"exDate\": \"除息日\",\n        \"cycle\": \"周期\",\n        \"payment\": \"支付\",\n        \"yield\": \"收益率\",\n        \"ratio\": \"比率\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"信号\",\n    \"support\": \"支持\",\n    \"resistance\": \"阻力\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"搜索词汇表...\",\n    \"noResults\": \"未找到结果。\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"全部\",\n      \"forex\": \"外汇\",\n      \"stock\": \"股票\",\n      \"crypto\": \"加密货币\",\n      \"cmd\": \"大宗商品\",\n      \"worldec\": \"全球经济\",\n      \"regec\": \"区域经济\"\n    },\n    \"searchPlaceholder\": \"搜索新闻、市场和代码...\",\n    \"searchLabel\": \"搜索新闻\",\n    \"articleCategoriesLabel\": \"文章分类\",\n    \"latestNews\": \"最新新闻\",\n    \"noSearchResults\": \"没有符合搜索条件的文章。\",\n    \"loading\": \"加载中...\",\n    \"loadMore\": \"加载更多\",\n    \"popularTopics\": \"热门话题\",\n    \"relatedNews\": \"相关新闻\",\n    \"back\": \"返回\",\n    \"share\": \"分享\",\n    \"readingTime\": \"阅读时间：{minutes} 分钟\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"最新实时更新\",\n      \"live\": \"直播\",\n      \"openFeed\": \"打开实时动态\",\n      \"resume\": \"恢复实时更新\",\n      \"pause\": \"暂停实时更新\",\n      \"title\": \"实时动态\",\n      \"viewAll\": \"查看全部动态\",\n      \"newestFirst\": \"最新优先\",\n      \"oldestFirst\": \"最早优先\",\n      \"sortOldestFirst\": \"按最早优先排序\",\n      \"sortNewestFirst\": \"按最新优先排序\",\n      \"newUpdate\": \"{count} 条新动态\",\n      \"newUpdates\": \"{count} 条新动态\",\n      \"loading\": \"正在加载实时动态…\",\n      \"loadError\": \"无法加载实时动态。\",\n      \"tryAgain\": \"重试\",\n      \"empty\": \"暂无实时动态。\",\n      \"latest\": \"最新\",\n      \"loadingEarlier\": \"加载中…\",\n      \"loadEarlier\": \"加载更早动态\",\n      \"backToNews\": \"返回新闻\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"每日市场简报\",\n      \"title\": \"今日市场简报\",\n      \"description\": \"每日视频简报，简明呈现重要行情变动以及接下来值得关注的内容。\",\n      \"cta\": \"查看完整更新\",\n      \"share\": \"分享\",\n      \"noVideo\": \"暂无视频。\",\n      \"copied\": \"已复制！\",\n      \"copyLink\": \"复制链接\",\n      \"shareOn\": \"分享到{name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"市场异动\",\n    \"active\": \"最活跃\",\n    \"gainers\": \"涨幅榜\",\n    \"losers\": \"跌幅榜\",\n    \"noData\": \"暂无数据\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"过去15分钟\",\n      \"1h\": \"过去1小时\",\n      \"1d\": \"过去1天\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"原油\",\n      \"gold\": \"黄金\",\n      \"silver\": \"白银\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"分析师建议\",\n    \"strongSell\": \"强力卖出\",\n    \"moderateSell\": \"适度卖出\",\n    \"hold\": \"持有\",\n    \"moderateBuy\": \"适度买入\",\n    \"strongBuy\": \"强力买入\",\n    \"sell\": \"卖出\",\n    \"buy\": \"买入\",\n    \"averageTarget\": \"平均目标价\",\n    \"noData\": \"该资产暂无分析师建议。\",\n    \"loadError\": \"无法加载分析师建议。\"\n  },\n  \"assetOverview\": {\n    \"open\": \"开盘\",\n    \"close\": \"收盘\",\n    \"dayRange\": \"日波动范围\",\n    \"volume\": \"成交量\",\n    \"keyStatistics\": \"关键统计\",\n    \"performance\": \"表现\",\n    \"week1\": \"1周\",\n    \"month1\": \"1个月\",\n    \"month3\": \"3个月\",\n    \"ytd\": \"年初至今\",\n    \"analystConsensus\": \"分析师共识\",\n    \"relatedNews\": \"相关新闻\",\n    \"noData\": \"暂无数据\",\n    \"loadError\": \"数据加载失败\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Převodník měn\",\n    \"from\": \"z\",\n    \"to\": \"na\",\n    \"amount\": \"částka\",\n    \"convert\": \"Převést\",\n    \"result\": \"Výsledek\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacciho\",\n    \"uptrend\": \"vzestup\",\n    \"downtrend\": \"pokles\",\n    \"high\": \"maximum\",\n    \"low\": \"minimum\",\n    \"retracements\": \"úrovně zpětných pohybů\",\n    \"extensions\": \"prodloužení\",\n    \"values\": \"Hodnoty\",\n    \"result\": \"Výsledek\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Kalkulačka marže\",\n    \"leverage\": \"pákový efekt\",\n    \"lotSize\": \"objem v lotech\",\n    \"accountCurrency\": \"základní měna účtu\",\n    \"currencyPair\": \"měnový pár\",\n    \"accountType\": \"typ účtu\",\n    \"price\": \"Aktuální konverzní cena\",\n    \"requiredMargin\": \"Požadovaná marže\",\n    \"result\": \"Výsledek\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivoty\",\n    \"classic\": \"Klasický\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Maximální cena\",\n    \"low\": \"Minimální cena\",\n    \"open\": \"otevírací cena\",\n    \"close\": \"cena zavření\",\n    \"pivotPoints\": \"Pivotní body\",\n    \"res-4\": \"4. rezistence\",\n    \"res-3\": \"3. rezistence\",\n    \"res-2\": \"2. rezistence\",\n    \"res-1\": \"1. rezistence\",\n    \"pivot\": \"Pivotní bod\",\n    \"sup-1\": \"1. podpora\",\n    \"sup-2\": \"2. podpora\",\n    \"sup-3\": \"3. podpora\",\n    \"sup-4\": \"4. podpora\",\n    \"result\": \"Výsledek\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"buy\": \"nákup\",\n    \"sell\": \"prodej\",\n    \"open\": \"otevřený\",\n    \"value\": \"Hodnota/Pip\",\n    \"lots\": \"Loty\",\n    \"stop\": \"stop\",\n    \"Limit\": \"limit\",\n    \"maxLoss\": \"Maximální ztráta\",\n    \"maxProfit\": \"Maximální zisk\",\n    \"result\": \"Výsledek\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Úrovně Stop Loss / Take Profit\",\n    \"buy\": \"nákup\",\n    \"sell\": \"prodej\",\n    \"open\": \"otevřený\",\n    \"value\": \"Hodnota/Pip\",\n    \"lots\": \"Loty\",\n    \"risk\": \"Objem rizika\",\n    \"gain\": \"Objem výnosu\",\n    \"stopLoss\": \"Stop Loss na\",\n    \"takeProfit\": \"Take Profit na\",\n    \"stopLossPips\": \"Stop Loss (Pipy)\",\n    \"takeProfitPips\": \"Take Profit (Pipy)\",\n    \"result\": \"Výsledek\"\n  },\n  \"heatmap\": {\n    \"title\": \"Tepelná mapa\",\n    \"currencies\": \"Měny\",\n    \"value\": \"Hodnota\",\n    \"result\": \"Výsledek\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Vnitrodenní15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Vnitrodenní60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Vnitrodenní240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Denně\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Týdně\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Měsíčně\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Ekonomický kalendář\",\n    \"impact\": \"Dopad\",\n    \"high\": \"Vysoký\",\n    \"medium\": \"Střední\",\n    \"low\": \"Nízký\",\n    \"countries\": \"Země\",\n    \"customRange\": \"Vlastní rozsah\",\n    \"yesterday\": \"Včera\",\n    \"today\": \"Dnes\",\n    \"tomorrow\": \"Zítra\",\n    \"thisWeek\": \"Tento týden\",\n    \"lastWeek\": \"Minulý týden\",\n    \"nextWeek\": \"Příští týden\",\n    \"noEventsFound\": \"Žádné události nenalezeny\",\n    \"event\": \"Událost\",\n    \"actual\": \"Skutečný\",\n    \"forecast\": \"Předpověď\",\n    \"previous\": \"Předchozí\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Čas\",\n        \"news\": \"Zprávy\",\n        \"impact\": \"Dopad\",\n        \"impactedCurrency\": \"Ovlivněná měna\",\n        \"actual\": \"Skutečný\",\n        \"forecast\": \"Předpověď\",\n        \"prior\": \"Předchozí\",\n        \"impactedInstruments\": \"Ovlivněné nástroje\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Vlastní data\",\n        \"selectDateRange\": \"Vyberte rozsah dat\",\n        \"startDate\": \"Datum začátku\",\n        \"endDate\": \"Datum konce\",\n        \"apply\": \"Použít\"\n      },\n      \"andMore\": \"a další\",\n      \"stocks\": {\n        \"splits\": \"Splity\",\n        \"earnings\": \"Zisky\",\n        \"dividends\": \"Dividendy\",\n        \"stockSplit\": \"Rozdělení akcií\",\n        \"dividend\": \"Dividenda\",\n        \"epsActual\": \"EPS skutečný\",\n        \"epsForecast\": \"EPS odhad\",\n        \"revenueActual\": \"Tržby skutečné\",\n        \"revenueForecast\": \"Tržby odhad\",\n        \"exDate\": \"Ex-datum\",\n        \"cycle\": \"Cyklus\",\n        \"payment\": \"Platba\",\n        \"yield\": \"Výnos\",\n        \"ratio\": \"Poměr\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Signály\",\n    \"support\": \"Podpora\",\n    \"resistance\": \"Odpor\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Hledat ve slovníku...\",\n    \"noResults\": \"Nebyly nalezeny žádné výsledky.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Vše\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Akcie\",\n      \"crypto\": \"Kryptoměny\",\n      \"cmd\": \"Komodity\",\n      \"worldec\": \"Světová ekonomika\",\n      \"regec\": \"Regionální ekonomika\"\n    },\n    \"searchPlaceholder\": \"Hledat zprávy, trhy, symboly...\",\n    \"searchLabel\": \"Hledat zprávy\",\n    \"articleCategoriesLabel\": \"Kategorie článků\",\n    \"latestNews\": \"Nejnovější zprávy\",\n    \"noSearchResults\": \"Vašemu hledání neodpovídají žádné články.\",\n    \"loading\": \"Načítání...\",\n    \"loadMore\": \"Načíst další\",\n    \"popularTopics\": \"Oblíbená témata\",\n    \"relatedNews\": \"Související zprávy\",\n    \"back\": \"Zpět\",\n    \"share\": \"Sdílet\",\n    \"readingTime\": \"Doba čtení: {minutes} min\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Nejnovější živá aktualizace\",\n      \"live\": \"ŽIVĚ\",\n      \"openFeed\": \"Otevřít živý přenos\",\n      \"resume\": \"Obnovit živé aktualizace\",\n      \"pause\": \"Pozastavit živé aktualizace\",\n      \"title\": \"Živé aktualizace\",\n      \"viewAll\": \"Zobrazit všechny aktualizace\",\n      \"newestFirst\": \"Nejnovější první\",\n      \"oldestFirst\": \"Nejstarší první\",\n      \"sortOldestFirst\": \"Seřadit od nejstarších\",\n      \"sortNewestFirst\": \"Seřadit od nejnovějších\",\n      \"newUpdate\": \"{count} nová aktualizace\",\n      \"newUpdates\": \"{count} nové aktualizace\",\n      \"loading\": \"Načítání živých aktualizací…\",\n      \"loadError\": \"Živé aktualizace se nepodařilo načíst.\",\n      \"tryAgain\": \"Zkusit znovu\",\n      \"empty\": \"Zatím žádné živé aktualizace.\",\n      \"latest\": \"NEJNOVĚJŠÍ\",\n      \"loadingEarlier\": \"Načítání…\",\n      \"loadEarlier\": \"Načíst starší aktualizace\",\n      \"backToNews\": \"Zpět na zprávy\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Denní přehled trhu\",\n      \"title\": \"Dnešní přehled trhu\",\n      \"description\": \"Stručný denní videopřehled důležitých pohybů a toho, co sledovat dál.\",\n      \"cta\": \"Zobrazit celou aktualizaci\",\n      \"share\": \"Sdílet\",\n      \"noVideo\": \"Video zatím není k dispozici.\",\n      \"copied\": \"Zkopírováno!\",\n      \"copyLink\": \"Kopírovat odkaz\",\n      \"shareOn\": \"Sdílet na {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Pohyby na trhu\",\n    \"active\": \"Nejaktivnější\",\n    \"gainers\": \"Rostoucí\",\n    \"losers\": \"Klesající\",\n    \"noData\": \"Žádná data\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Posledních 15 minut\",\n      \"1h\": \"Poslední hodina\",\n      \"1d\": \"Poslední den\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Ropa\",\n      \"gold\": \"Zlato\",\n      \"silver\": \"Stříbro\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Doporučení analytiků\",\n    \"strongSell\": \"Silně prodat\",\n    \"moderateSell\": \"Mírně prodat\",\n    \"hold\": \"Držet\",\n    \"moderateBuy\": \"Mírně koupit\",\n    \"strongBuy\": \"Silně koupit\",\n    \"sell\": \"Prodat\",\n    \"buy\": \"Koupit\",\n    \"averageTarget\": \"Průměrná cílová cena\",\n    \"noData\": \"Pro toto aktivum nejsou dostupná doporučení.\",\n    \"loadError\": \"Doporučení analytiků se nepodařilo načíst.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Otevření\",\n    \"close\": \"Uzavření\",\n    \"dayRange\": \"Denní rozsah\",\n    \"volume\": \"Objem\",\n    \"keyStatistics\": \"Klíčové statistiky\",\n    \"performance\": \"Výkonnost\",\n    \"week1\": \"1 týden\",\n    \"month1\": \"1 měsíc\",\n    \"month3\": \"3 měsíce\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Konsenzus analytiků\",\n    \"relatedNews\": \"Související zprávy\",\n    \"noData\": \"Žádná data\",\n    \"loadError\": \"Nelze načíst data\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Währungsrechner\",\n    \"from\": \"Von\",\n    \"to\": \"Bis\",\n    \"amount\": \"Menge\",\n    \"convert\": \"Umrechnen\",\n    \"result\": \"Ergebnis\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Aufwärtstrend\",\n    \"downtrend\": \"Abwärtstrend\",\n    \"high\": \"Hoch\",\n    \"low\": \"Tief\",\n    \"retracements\": \"Rückzüge\",\n    \"extensions\": \"Verlängerungen\",\n    \"values\": \"Werte\",\n    \"result\": \"Ergebnis\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Margin-Rechner\",\n    \"leverage\": \"Hebel\",\n    \"lotSize\": \"Volumen in Lots\",\n    \"accountCurrency\": \"Kontowährung\",\n    \"currencyPair\": \"Währungspaar\",\n    \"accountType\": \"Kontotyp\",\n    \"price\": \"Aktueller Kurs\",\n    \"requiredMargin\": \"Erforderliche Marge\",\n    \"result\": \"Ergebnis\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivot-Punkte\",\n    \"classic\": \"Klassisch\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Höchstpreis\",\n    \"low\": \"Tiefstpreis\",\n    \"open\": \"Eröffnungspreis\",\n    \"close\": \"Schlusspreis\",\n    \"pivotPoints\": \"Pivot-Punkte\",\n    \"res-4\": \"4. Widerstand\",\n    \"res-3\": \"3. Widerstand\",\n    \"res-2\": \"2. Widerstand\",\n    \"res-1\": \"1. Widerstand\",\n    \"pivot\": \"Drehpunkt\",\n    \"sup-1\": \"1. Unterstützung\",\n    \"sup-2\": \"2. Unterstützung\",\n    \"sup-3\": \"3. Unterstützung\",\n    \"sup-4\": \"4. Unterstützung\",\n    \"result\": \"Ergebnis\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"buy\": \"Kaufen/ Lang\",\n    \"sell\": \"Verkaufen / Kurz\",\n    \"open\": \"Offen\",\n    \"value\": \"Wert/Pip\",\n    \"lots\": \"Lots\",\n    \"stop\": \"Stop\",\n    \"Limit\": \"Grenze\",\n    \"maxLoss\": \"Maximaler Verlust\",\n    \"maxProfit\": \"Maximaler Gewinn\",\n    \"result\": \"Ergebnis\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Stop Loss / Take Profit Levels\",\n    \"buy\": \"Kaufen/ Lang\",\n    \"sell\": \"Verkaufen / Kurz\",\n    \"open\": \"Offen\",\n    \"value\": \"Wert/Pip\",\n    \"lots\": \"Lots\",\n    \"risk\": \"Risikobetrag\",\n    \"gain\": \"Zu gewinnender Betrag\",\n    \"stopLoss\": \"Verluststopp bei\",\n    \"takeProfit\": \"Gewinnmitnahme bei\",\n    \"stopLossPips\": \"Verluststopp\",\n    \"takeProfitPips\": \"Gewinnmitnahme\",\n    \"result\": \"Ergebnis\"\n  },\n  \"heatmap\": {\n    \"title\": \"Heatmap\",\n    \"currencies\": \"Währungen\",\n    \"value\": \"Wert\",\n    \"result\": \"Ergebnis\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"täglich\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"wöchentlich\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"monatlich\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Wirtschaftskalender\",\n    \"impact\": \"Auswirkungen\",\n    \"high\": \"Hoch\",\n    \"medium\": \"Mittel\",\n    \"low\": \"Niedrig\",\n    \"countries\": \"Länder\",\n    \"customRange\": \"Benutzerdefinierter Bereich\",\n    \"yesterday\": \"Gestern\",\n    \"today\": \"Heute\",\n    \"tomorrow\": \"Morgen\",\n    \"thisWeek\": \"Diese Woche\",\n    \"lastWeek\": \"Letzte Woche\",\n    \"nextWeek\": \"Nächste Woche\",\n    \"noEventsFound\": \"Keine Ereignisse gefunden\",\n    \"event\": \"Ereignis\",\n    \"actual\": \"Tatsächlich\",\n    \"forecast\": \"Prognose\",\n    \"previous\": \"Vorherige\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Zeit\",\n        \"news\": \"Nachrichten\",\n        \"impact\": \"Auswirkungen\",\n        \"impactedCurrency\": \"Betroffene Währung\",\n        \"actual\": \"Tatsächlich\",\n        \"forecast\": \"Prognose\",\n        \"prior\": \"Vorherige\",\n        \"impactedInstruments\": \"Betroffene Instrumente\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Benutzerdefinierte Daten\",\n        \"selectDateRange\": \"Datumsbereich auswählen\",\n        \"startDate\": \"Anfangsdatum\",\n        \"endDate\": \"Enddatum\",\n        \"apply\": \"Anwenden\"\n      },\n      \"andMore\": \"und mehr\",\n      \"stocks\": {\n        \"splits\": \"Splits\",\n        \"earnings\": \"Gewinne\",\n        \"dividends\": \"Dividenden\",\n        \"stockSplit\": \"Aktiensplit\",\n        \"dividend\": \"Dividende\",\n        \"epsActual\": \"EPS tatsächlich\",\n        \"epsForecast\": \"EPS Prognose\",\n        \"revenueActual\": \"Umsatz tatsächlich\",\n        \"revenueForecast\": \"Umsatz Prognose\",\n        \"exDate\": \"Ex-Datum\",\n        \"cycle\": \"Zyklus\",\n        \"payment\": \"Zahlung\",\n        \"yield\": \"Rendite\",\n        \"ratio\": \"Verhältnis\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Signale\",\n    \"support\": \"Unterstützung\",\n    \"resistance\": \"Widerstand\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Im Glossar suchen...\",\n    \"noResults\": \"Keine Ergebnisse gefunden.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Alle\",\n      \"forex\": \"Devisen\",\n      \"stock\": \"Aktien\",\n      \"crypto\": \"Krypto\",\n      \"cmd\": \"Rohstoffe\",\n      \"worldec\": \"Weltwirtschaft\",\n      \"regec\": \"Regionalwirtschaft\"\n    },\n    \"searchPlaceholder\": \"Nachrichten, Märkte, Symbole suchen...\",\n    \"searchLabel\": \"Nachrichten suchen\",\n    \"articleCategoriesLabel\": \"Artikelkategorien\",\n    \"latestNews\": \"Neueste Nachrichten\",\n    \"noSearchResults\": \"Keine Artikel entsprechen Ihrer Suche.\",\n    \"loading\": \"Wird geladen...\",\n    \"loadMore\": \"Mehr laden\",\n    \"popularTopics\": \"Beliebte Themen\",\n    \"relatedNews\": \"Ähnliche Nachrichten\",\n    \"back\": \"Zurück\",\n    \"share\": \"Teilen\",\n    \"readingTime\": \"{minutes} Min. Lesezeit\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Neueste Live-Aktualisierung\",\n      \"live\": \"LIVE\",\n      \"openFeed\": \"Live-Feed öffnen\",\n      \"resume\": \"Live-Aktualisierungen fortsetzen\",\n      \"pause\": \"Live-Aktualisierungen pausieren\",\n      \"title\": \"Live-Aktualisierungen\",\n      \"viewAll\": \"Alle Aktualisierungen anzeigen\",\n      \"newestFirst\": \"Neueste zuerst\",\n      \"oldestFirst\": \"Älteste zuerst\",\n      \"sortOldestFirst\": \"Älteste zuerst sortieren\",\n      \"sortNewestFirst\": \"Neueste zuerst sortieren\",\n      \"newUpdate\": \"{count} neue Aktualisierung\",\n      \"newUpdates\": \"{count} neue Aktualisierungen\",\n      \"loading\": \"Live-Aktualisierungen werden geladen…\",\n      \"loadError\": \"Live-Aktualisierungen konnten nicht geladen werden.\",\n      \"tryAgain\": \"Erneut versuchen\",\n      \"empty\": \"Noch keine Live-Aktualisierungen.\",\n      \"latest\": \"NEUESTE\",\n      \"loadingEarlier\": \"Wird geladen…\",\n      \"loadEarlier\": \"Ältere Aktualisierungen laden\",\n      \"backToNews\": \"Zurück zu den Nachrichten\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Tägliches Marktbriefing\",\n      \"title\": \"Das heutige Marktbriefing\",\n      \"description\": \"Ein kompaktes tägliches Video-Briefing zu den wichtigen Bewegungen und dazu, was als Nächstes zu beobachten ist.\",\n      \"cta\": \"Das vollständige Update ansehen\",\n      \"share\": \"Teilen\",\n      \"noVideo\": \"Noch kein Video verfügbar.\",\n      \"copied\": \"Kopiert!\",\n      \"copyLink\": \"Link kopieren\",\n      \"shareOn\": \"Auf {name} teilen\"\n  },\n  \"topMovers\": {\n    \"title\": \"Marktbeweger\",\n    \"active\": \"Meistgehandelt\",\n    \"gainers\": \"Gewinner\",\n    \"losers\": \"Verlierer\",\n    \"noData\": \"Keine Daten\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Letzte 15 Minuten\",\n      \"1h\": \"Letzte Stunde\",\n      \"1d\": \"Letzter Tag\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Rohöl\",\n      \"gold\": \"Gold\",\n      \"silver\": \"Silber\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Analystenempfehlungen\",\n    \"strongSell\": \"Stark verkaufen\",\n    \"moderateSell\": \"Moderat verkaufen\",\n    \"hold\": \"Halten\",\n    \"moderateBuy\": \"Moderat kaufen\",\n    \"strongBuy\": \"Stark kaufen\",\n    \"sell\": \"Verkaufen\",\n    \"buy\": \"Kaufen\",\n    \"averageTarget\": \"Durchschnittliches Kursziel\",\n    \"noData\": \"Für diesen Vermögenswert sind keine Analystenempfehlungen verfügbar.\",\n    \"loadError\": \"Analystenempfehlungen konnten nicht geladen werden.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Eröffnung\",\n    \"close\": \"Schluss\",\n    \"dayRange\": \"Tagesspanne\",\n    \"volume\": \"Volumen\",\n    \"keyStatistics\": \"Kennzahlen\",\n    \"performance\": \"Performance\",\n    \"week1\": \"1 Woche\",\n    \"month1\": \"1 Monat\",\n    \"month3\": \"3 Monate\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Analysten-Konsens\",\n    \"relatedNews\": \"Verwandte Nachrichten\",\n    \"noData\": \"Keine Daten verfügbar\",\n    \"loadError\": \"Daten konnten nicht geladen werden\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Currency Converter\",\n    \"from\": \"From\",\n    \"to\": \"To\",\n    \"amount\": \"Amount\",\n    \"convert\": \"Convert\",\n    \"result\": \"Result\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Uptrend\",\n    \"downtrend\": \"Downtrend\",\n    \"high\": \"High (b)\",\n    \"low\": \"Low (a)\",\n    \"retracements\": \"Retracements\",\n    \"extensions\": \"Extensions\",\n    \"values\": \"Values\",\n    \"result\": \"Result\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Margin Calculator\",\n    \"leverage\": \"Leverage\",\n    \"lotSize\": \"Volume in Lots\",\n    \"accountCurrency\": \"Account Currency\",\n    \"currencyPair\": \"Currency Pair\",\n    \"accountType\": \"Account Type\",\n    \"price\": \"Current Conversion Price\",\n    \"requiredMargin\": \"Required Margin\",\n    \"result\": \"Result\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivots\",\n    \"classic\": \"Classic\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"High Price\",\n    \"low\": \"Low Price\",\n    \"open\": \"Open Price\",\n    \"close\": \"Close Price\",\n    \"pivotPoints\": \"Pivot Points\",\n    \"res-4\": \"4th Resistance\",\n    \"res-3\": \"3rd Resistance\",\n    \"res-2\": \"2nd Resistance\",\n    \"res-1\": \"1st Resistance\",\n    \"pivot\": \"Pivot Point\",\n    \"sup-1\": \"1st Support\",\n    \"sup-2\": \"2nd Support\",\n    \"sup-3\": \"3rd Support\",\n    \"sup-4\": \"4th Support\",\n    \"result\": \"Result\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"open\": \"Open Price\",\n    \"value\": \"Value/Pip\",\n    \"buy\": \"Buy/Long\",\n    \"sell\": \"Sell/Short\",\n    \"lots\": \"Lots\",\n    \"stop\": \"Stop\",\n    \"Limit\": \"Limit\",\n    \"maxLoss\": \"Max Loss\",\n    \"maxProfit\": \"Max Profit\",\n    \"result\": \"Result\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Stop Loss / Take Profit Levels\",\n    \"buy\": \"Buy/Long\",\n    \"sell\": \"Sell/Short\",\n    \"open\": \"Open Price\",\n    \"value\": \"Value/Pip\",\n    \"lots\": \"Lots\",\n    \"risk\": \"Amount to Risk\",\n    \"gain\": \"Amount to Gain\",\n    \"stopLoss\": \"Stop Loss at\",\n    \"takeProfit\": \"Take Profit at\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Result\"\n  },\n  \"heatmap\": {\n    \"title\": \"Heatmap\",\n    \"currencies\": \"Currencies\",\n    \"value\": \"Value\",\n    \"result\": \"Result\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Daily\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Weekly\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Monthly\"\n      }\n    },\n    \"tooManyCurrencies\": \"Too many currencies selected. Please select up to 8 currencies.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"Economic Calendar\",\n    \"impact\": \"Impact\",\n    \"high\": \"High\",\n    \"medium\": \"Medium\",\n    \"low\": \"Low\",\n    \"countries\": \"Countries\",\n    \"customRange\": \"Custom Range\",\n    \"yesterday\": \"Yesterday\",\n    \"today\": \"Today\",\n    \"tomorrow\": \"Tomorrow\",\n    \"thisWeek\": \"This Week\",\n    \"lastWeek\": \"Last Week\",\n    \"nextWeek\": \"Next Week\",\n    \"noEventsFound\": \"No events found\",\n    \"event\": \"Event\",\n    \"actual\": \"Actual\",\n    \"forecast\": \"Forecast\",\n    \"previous\": \"Previous\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Time\",\n        \"news\": \"News\",\n        \"impact\": \"Impact\",\n        \"impactedCurrency\": \"Impacted Currency\",\n        \"actual\": \"Actual\",\n        \"forecast\": \"Forecast\",\n        \"prior\": \"Prior\",\n        \"impactedInstruments\": \"Impacted Instruments\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Custom Dates\",\n        \"selectDateRange\": \"Select Date Range\",\n        \"startDate\": \"Start Date\",\n        \"endDate\": \"End Date\",\n        \"apply\": \"Apply\"\n      },\n      \"andMore\": \"and more\",\n      \"stocks\": {\n        \"splits\": \"Splits\",\n        \"earnings\": \"Earnings\",\n        \"dividends\": \"Dividends\",\n        \"stockSplit\": \"Stock Split\",\n        \"dividend\": \"Dividend\",\n        \"epsActual\": \"EPS actual\",\n        \"epsForecast\": \"EPS forecast\",\n        \"revenueActual\": \"Revenue actual\",\n        \"revenueForecast\": \"Revenue forecast\",\n        \"exDate\": \"Ex-date\",\n        \"cycle\": \"Cycle\",\n        \"payment\": \"Payment\",\n        \"yield\": \"Yield\",\n        \"ratio\": \"Ratio\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Signals\",\n    \"support\": \"Support\",\n    \"resistance\": \"Resistance\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Search glossary...\",\n    \"noResults\": \"No results found.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"All\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Stocks\",\n      \"crypto\": \"Crypto\",\n      \"cmd\": \"Commodities\",\n      \"worldec\": \"World Economy\",\n      \"regec\": \"Regional Economy\",\n      \"latam\": \"Latin America\"\n    },\n    \"searchPlaceholder\": \"Search news, markets, tickers...\",\n    \"searchLabel\": \"Search news\",\n    \"articleCategoriesLabel\": \"Article categories\",\n    \"latestNews\": \"Latest News\",\n    \"noSearchResults\": \"No articles match your search.\",\n    \"loading\": \"Loading...\",\n    \"loadMore\": \"Load more\",\n    \"popularTopics\": \"Popular Topics\",\n    \"relatedNews\": \"Related News\",\n    \"back\": \"Back\",\n    \"share\": \"Share\",\n    \"readingTime\": \"{minutes} min read\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Latest live update\",\n      \"live\": \"LIVE\",\n      \"openFeed\": \"Open live feed\",\n      \"resume\": \"Resume live updates\",\n      \"pause\": \"Pause live updates\",\n      \"title\": \"Live updates\",\n      \"viewAll\": \"View all updates\",\n      \"newestFirst\": \"Newest first\",\n      \"oldestFirst\": \"Oldest first\",\n      \"sortOldestFirst\": \"Sort oldest first\",\n      \"sortNewestFirst\": \"Sort newest first\",\n      \"newUpdate\": \"{count} new update\",\n      \"newUpdates\": \"{count} new updates\",\n      \"loading\": \"Loading live updates…\",\n      \"loadError\": \"Unable to load live updates.\",\n      \"tryAgain\": \"Try again\",\n      \"empty\": \"No live updates yet.\",\n      \"latest\": \"LATEST\",\n      \"loadingEarlier\": \"Loading…\",\n      \"loadEarlier\": \"Load earlier updates\",\n      \"backToNews\": \"Back to news\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Daily market brief\",\n      \"title\": \"Today’s Market Brief\",\n      \"description\": \"A concise daily video briefing on the moves that matter and what to watch next.\",\n      \"cta\": \"Explore the full update\",\n      \"share\": \"Share\",\n      \"noVideo\": \"No video available yet.\",\n      \"copied\": \"Copied!\",\n      \"copyLink\": \"Copy link\",\n      \"shareOn\": \"Share on {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Market Movers\",\n    \"active\": \"Active\",\n    \"gainers\": \"Gainers\",\n    \"losers\": \"Losers\",\n    \"noData\": \"No data\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Past 15 minutes\",\n      \"1h\": \"Past hour\",\n      \"1d\": \"Past day\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Crude Oil\",\n      \"gold\": \"Gold\",\n      \"silver\": \"Silver\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Analyst recommendations\",\n    \"strongSell\": \"Strong Sell\",\n    \"moderateSell\": \"Moderate Sell\",\n    \"hold\": \"Hold\",\n    \"moderateBuy\": \"Moderate Buy\",\n    \"strongBuy\": \"Strong Buy\",\n    \"sell\": \"Sell\",\n    \"buy\": \"Buy\",\n    \"averageTarget\": \"Average target\",\n    \"noData\": \"No analyst recommendations are available for this asset.\",\n    \"loadError\": \"Unable to load analyst recommendations.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Open\",\n    \"close\": \"Close\",\n    \"dayRange\": \"Day Range\",\n    \"volume\": \"Volume\",\n    \"keyStatistics\": \"Key Statistics\",\n    \"performance\": \"Performance\",\n    \"week1\": \"1 Week\",\n    \"month1\": \"1 Month\",\n    \"month3\": \"3 Months\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Analyst Consensus\",\n    \"relatedNews\": \"Related News\",\n    \"noData\": \"No data available\",\n    \"loadError\": \"Unable to load data\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Convertidor de Divisas\",\n    \"from\": \"Desde\",\n    \"to\": \"A\",\n    \"amount\": \"Cantidad\",\n    \"convert\": \"Convertir\",\n    \"result\": \"Resultado\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Tendencia Alcista\",\n    \"downtrend\": \"Tendencia Bajista\",\n    \"high\": \"Alto (b)\",\n    \"low\": \"Bajo (a)\",\n    \"retracements\": \"Retrocesos\",\n    \"extensions\": \"Extensiones\",\n    \"values\": \"Valores\",\n    \"result\": \"Resultado\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Calculadora de Margen\",\n    \"leverage\": \"Apalancamiento\",\n    \"lotSize\": \"Volumen en Lotes\",\n    \"accountCurrency\": \"Moneda de la Cuenta\",\n    \"currencyPair\": \"Par de Divisas\",\n    \"accountType\": \"Tipo de Cuenta\",\n    \"price\": \"Precio de Conversión Actual\",\n    \"requiredMargin\": \"Margen Requerido\",\n    \"result\": \"Resultado\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivotes\",\n    \"classic\": \"Clásico\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Precio Alto\",\n    \"low\": \"Precio Bajo\",\n    \"open\": \"Precio de Apertura\",\n    \"close\": \"Precio de Cierre\",\n    \"pivotPoints\": \"Puntos Pivote\",\n    \"res-4\": \"4ª Resistencia\",\n    \"res-3\": \"3ª Resistencia\",\n    \"res-2\": \"2ª Resistencia\",\n    \"res-1\": \"1ª Resistencia\",\n    \"pivot\": \"Punto Pivote\",\n    \"sup-1\": \"1er Soporte\",\n    \"sup-2\": \"2º Soporte\",\n    \"sup-3\": \"3er Soporte\",\n    \"sup-4\": \"4º Soporte\",\n    \"result\": \"Resultado\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"open\": \"Precio de Apertura\",\n    \"value\": \"Valor/Pip\",\n    \"buy\": \"Comprar/Largo\",\n    \"sell\": \"Vender/Corto\",\n    \"lots\": \"Lotes\",\n    \"stop\": \"Parar\",\n    \"Limit\": \"Límite\",\n    \"maxLoss\": \"Pérdida Máxima\",\n    \"maxProfit\": \"Ganancia Máxima\",\n    \"result\": \"Resultado\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Niveles de Stop Loss / Take Profit\",\n    \"buy\": \"Comprar/Largo\",\n    \"sell\": \"Vender/Corto\",\n    \"open\": \"Precio de Apertura\",\n    \"value\": \"Valor/Pip\",\n    \"lots\": \"Lotes\",\n    \"risk\": \"Cantidad a Riesgar\",\n    \"gain\": \"Cantidad a Ganar\",\n    \"stopLoss\": \"Stop Loss en\",\n    \"takeProfit\": \"Take Profit en\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Resultado\"\n  },\n  \"heatmap\": {\n    \"title\": \"Mapa de Calor\",\n    \"currencies\": \"Divisas\",\n    \"value\": \"Valor\",\n    \"result\": \"Resultado\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intradía 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intradía 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intradía 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Diario\"\n      },\n      \"1w\": {\n        \"short\": \"1S\",\n        \"long\": \"Semanal\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Mensual\"\n      }\n    },\n    \"tooManyCurrencies\": \"¡Demasiadas divisas! Por favor, selecciona menos divisas.\"\n  },\n  \"video-iframe\": {\n    \"controls\": {\n      \"next\": \"Próxima lección\",\n      \"previous\": \"Lección anterior\",\n      \"unlockButton\": \"descubrir\",\n      \"unlockMessage1\": \"El resto de los vídeos están bloqueados...\",\n      \"unlockMessage2\": \"¡Albricias!\",\n      \"unlockMessage3\": \"¡Puedes desbloquearlos gratis!\"\n    },\n    \"signUpForm\": {\n      \"firstName\": \"Nombre de pila:\",\n      \"lastName\": \"Apellido:\",\n      \"email\": \"Correo electrónico:\",\n      \"telophon\": \"Teléfono:\",\n      \"birthDate\": \"Fecha de nacimiento:\",\n      \"approve\": \"¡Muéstrame más!\"\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Calendario Económico\",\n    \"impact\": \"Impacto\",\n    \"high\": \"Alto\",\n    \"medium\": \"Medio\",\n    \"low\": \"Bajo\",\n    \"countries\": \"Países\",\n    \"customRange\": \"Rango Personalizado\",\n    \"yesterday\": \"Ayer\",\n    \"today\": \"Hoy\",\n    \"tomorrow\": \"Mañana\",\n    \"thisWeek\": \"Esta Semana\",\n    \"lastWeek\": \"La Semana Pasada\",\n    \"nextWeek\": \"La Próxima Semana\",\n    \"noEventsFound\": \"No hay eventos\",\n    \"event\": \"Evento\",\n    \"actual\": \"Actual\",\n    \"forecast\": \"Pronóstico\",\n    \"previous\": \"Anterior\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Hora\",\n        \"news\": \"Noticias\",\n        \"impact\": \"Impacto\",\n        \"impactedCurrency\": \"Moneda Afectada\",\n        \"actual\": \"Actual\",\n        \"forecast\": \"Pronóstico\",\n        \"prior\": \"Anterior\",\n        \"impactedInstruments\": \"Instrumentos Afectados\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Fechas Personalizadas\",\n        \"selectDateRange\": \"Seleccionar Rango de Fechas\",\n        \"startDate\": \"Fecha de Inicio\",\n        \"endDate\": \"Fecha de Fin\",\n        \"apply\": \"Aplicar\"\n      },\n      \"andMore\": \"y más\",\n      \"stocks\": {\n        \"splits\": \"Splits\",\n        \"earnings\": \"Beneficios\",\n        \"dividends\": \"Dividendos\",\n        \"stockSplit\": \"Split de acciones\",\n        \"dividend\": \"Dividendo\",\n        \"epsActual\": \"EPS real\",\n        \"epsForecast\": \"EPS estimado\",\n        \"revenueActual\": \"Ingresos reales\",\n        \"revenueForecast\": \"Ingresos estimados\",\n        \"exDate\": \"Fecha ex-dividendo\",\n        \"cycle\": \"Ciclo\",\n        \"payment\": \"Pago\",\n        \"yield\": \"Rendimiento\",\n        \"ratio\": \"Ratio\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Señales\",\n    \"support\": \"Financiación\",\n    \"resistance\": \"Resistencia\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Buscar en el glosario...\",\n    \"noResults\": \"No se han encontrado resultados.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Todo\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Acciones\",\n      \"crypto\": \"Cripto\",\n      \"cmd\": \"Materias primas\",\n      \"worldec\": \"Economía mundial\",\n      \"regec\": \"Economía regional\",\n      \"latam\": \"Latinoamérica\"\n    },\n    \"searchPlaceholder\": \"Buscar noticias, mercados y símbolos...\",\n    \"searchLabel\": \"Buscar noticias\",\n    \"articleCategoriesLabel\": \"Categorías de artículos\",\n    \"latestNews\": \"Últimas noticias\",\n    \"noSearchResults\": \"No hay artículos que coincidan con tu búsqueda.\",\n    \"loading\": \"Cargando...\",\n    \"loadMore\": \"Ver más\",\n    \"popularTopics\": \"Temas populares\",\n    \"relatedNews\": \"Noticias relacionadas\",\n    \"back\": \"Volver\",\n    \"share\": \"Compartir\",\n    \"readingTime\": \"{minutes} min de lectura\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Última actualización en vivo\",\n      \"live\": \"EN VIVO\",\n      \"openFeed\": \"Abrir cobertura en vivo\",\n      \"resume\": \"Reanudar actualizaciones en vivo\",\n      \"pause\": \"Pausar actualizaciones en vivo\",\n      \"title\": \"Actualizaciones en vivo\",\n      \"viewAll\": \"Ver todas las actualizaciones\",\n      \"newestFirst\": \"Más recientes primero\",\n      \"oldestFirst\": \"Más antiguas primero\",\n      \"sortOldestFirst\": \"Ordenar por más antiguas\",\n      \"sortNewestFirst\": \"Ordenar por más recientes\",\n      \"newUpdate\": \"{count} actualización nueva\",\n      \"newUpdates\": \"{count} actualizaciones nuevas\",\n      \"loading\": \"Cargando actualizaciones en vivo…\",\n      \"loadError\": \"No se pudieron cargar las actualizaciones en vivo.\",\n      \"tryAgain\": \"Intentar de nuevo\",\n      \"empty\": \"Aún no hay actualizaciones en vivo.\",\n      \"latest\": \"MÁS RECIENTE\",\n      \"loadingEarlier\": \"Cargando…\",\n      \"loadEarlier\": \"Cargar actualizaciones anteriores\",\n      \"backToNews\": \"Volver a noticias\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Resumen diario del mercado\",\n      \"title\": \"El resumen del mercado de hoy\",\n      \"description\": \"Un resumen diario en vídeo de los movimientos que importan y de qué vigilar a continuación.\",\n      \"cta\": \"Ver la actualización completa\",\n      \"share\": \"Compartir\",\n      \"noVideo\": \"Aún no hay vídeo disponible.\",\n      \"copied\": \"¡Copiado!\",\n      \"copyLink\": \"Copiar enlace\",\n      \"shareOn\": \"Compartir en {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Movimientos del mercado\",\n    \"active\": \"Más activos\",\n    \"gainers\": \"Ganadores\",\n    \"losers\": \"Perdedores\",\n    \"noData\": \"No hay datos\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Últimos 15 minutos\",\n      \"1h\": \"Última hora\",\n      \"1d\": \"Último día\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Petróleo crudo\",\n      \"gold\": \"Oro\",\n      \"silver\": \"Plata\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Recomendaciones de analistas\",\n    \"strongSell\": \"Venta fuerte\",\n    \"moderateSell\": \"Venta moderada\",\n    \"hold\": \"Mantener\",\n    \"moderateBuy\": \"Compra moderada\",\n    \"strongBuy\": \"Compra fuerte\",\n    \"sell\": \"Venta\",\n    \"buy\": \"Compra\",\n    \"averageTarget\": \"Objetivo promedio\",\n    \"noData\": \"No hay recomendaciones de analistas disponibles para este activo.\",\n    \"loadError\": \"No se pudieron cargar las recomendaciones de analistas.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Apertura\",\n    \"close\": \"Cierre\",\n    \"dayRange\": \"Rango del día\",\n    \"volume\": \"Volumen\",\n    \"keyStatistics\": \"Estadísticas clave\",\n    \"performance\": \"Rendimiento\",\n    \"week1\": \"1 semana\",\n    \"month1\": \"1 mes\",\n    \"month3\": \"3 meses\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Consenso de analistas\",\n    \"relatedNews\": \"Noticias relacionadas\",\n    \"noData\": \"Sin datos disponibles\",\n    \"loadError\": \"No se pudieron cargar los datos\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Convertidor de Divisas\",\n    \"from\": \"Desde\",\n    \"to\": \"A\",\n    \"amount\": \"Cantidad\",\n    \"convert\": \"Convertir\",\n    \"result\": \"Resultado\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Tendencia Alcista\",\n    \"downtrend\": \"Tendencia Bajista\",\n    \"high\": \"Alto (b)\",\n    \"low\": \"Bajo (a)\",\n    \"retracements\": \"Retrocesos\",\n    \"extensions\": \"Extensiones\",\n    \"values\": \"Valores\",\n    \"result\": \"Resultado\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Calculadora de Margen\",\n    \"leverage\": \"Apalancamiento\",\n    \"lotSize\": \"Volumen en Lotes\",\n    \"accountCurrency\": \"Moneda de la Cuenta\",\n    \"currencyPair\": \"Par de Divisas\",\n    \"accountType\": \"Tipo de Cuenta\",\n    \"price\": \"Precio de Conversión Actual\",\n    \"requiredMargin\": \"Margen Requerido\",\n    \"result\": \"Resultado\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivotes\",\n    \"classic\": \"Clásico\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Precio Alto\",\n    \"low\": \"Precio Bajo\",\n    \"open\": \"Precio de Apertura\",\n    \"close\": \"Precio de Cierre\",\n    \"pivotPoints\": \"Puntos Pivote\",\n    \"res-4\": \"4ª Resistencia\",\n    \"res-3\": \"3ª Resistencia\",\n    \"res-2\": \"2ª Resistencia\",\n    \"res-1\": \"1ª Resistencia\",\n    \"pivot\": \"Punto Pivote\",\n    \"sup-1\": \"1er Soporte\",\n    \"sup-2\": \"2º Soporte\",\n    \"sup-3\": \"3er Soporte\",\n    \"sup-4\": \"4º Soporte\",\n    \"result\": \"Resultado\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"open\": \"Precio de Apertura\",\n    \"value\": \"Valor/Pip\",\n    \"buy\": \"Comprar/Largo\",\n    \"sell\": \"Vender/Corto\",\n    \"lots\": \"Lotes\",\n    \"stop\": \"Parar\",\n    \"Limit\": \"Límite\",\n    \"maxLoss\": \"Pérdida Máxima\",\n    \"maxProfit\": \"Ganancia Máxima\",\n    \"result\": \"Resultado\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Niveles de Stop Loss / Take Profit\",\n    \"buy\": \"Comprar/Largo\",\n    \"sell\": \"Vender/Corto\",\n    \"open\": \"Precio de Apertura\",\n    \"value\": \"Valor/Pip\",\n    \"lots\": \"Lotes\",\n    \"risk\": \"Cantidad a Riesgar\",\n    \"gain\": \"Cantidad a Ganar\",\n    \"stopLoss\": \"Stop Loss en\",\n    \"takeProfit\": \"Take Profit en\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Resultado\"\n  },\n  \"heatmap\": {\n    \"title\": \"Mapa de Calor\",\n    \"currencies\": \"Divisas\",\n    \"value\": \"Valor\",\n    \"result\": \"Resultado\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intradía 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intradía 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intradía 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Diario\"\n      },\n      \"1w\": {\n        \"short\": \"1S\",\n        \"long\": \"Semanal\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Mensual\"\n      }\n    },\n    \"tooManyCurrencies\": \"¡Demasiadas divisas! Por favor, selecciona menos divisas.\"\n  },\n  \"video-iframe\": {\n    \"controls\": {\n      \"next\": \"Próxima lección\",\n      \"previous\": \"Lección anterior\",\n      \"unlockButton\": \"descubrir\",\n      \"unlockMessage1\": \"El resto de los vídeos están bloqueados...\",\n      \"unlockMessage2\": \"¡Albricias!\",\n      \"unlockMessage3\": \"¡Puedes desbloquearlos gratis!\"\n    },\n    \"signUpForm\": {\n      \"firstName\": \"Nombre de pila:\",\n      \"lastName\": \"Apellido:\",\n      \"email\": \"Correo electrónico:\",\n      \"telophon\": \"Teléfono:\",\n      \"birthDate\": \"Fecha de nacimiento:\",\n      \"approve\": \"¡Muéstrame más!\"\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Calendario Económico\",\n    \"impact\": \"Impacto\",\n    \"high\": \"Alto\",\n    \"medium\": \"Medio\",\n    \"low\": \"Bajo\",\n    \"countries\": \"Países\",\n    \"customRange\": \"Rango Personalizado\",\n    \"yesterday\": \"Ayer\",\n    \"today\": \"Hoy\",\n    \"tomorrow\": \"Mañana\",\n    \"thisWeek\": \"Esta Semana\",\n    \"lastWeek\": \"La Semana Pasada\",\n    \"nextWeek\": \"La Próxima Semana\",\n    \"noEventsFound\": \"No hay eventos\",\n    \"event\": \"Evento\",\n    \"actual\": \"Actual\",\n    \"forecast\": \"Pronóstico\",\n    \"previous\": \"Anterior\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Hora\",\n        \"news\": \"Noticias\",\n        \"impact\": \"Impacto\",\n        \"impactedCurrency\": \"Moneda Afectada\",\n        \"actual\": \"Actual\",\n        \"forecast\": \"Pronóstico\",\n        \"prior\": \"Anterior\",\n        \"impactedInstruments\": \"Instrumentos Afectados\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Fechas Personalizadas\",\n        \"selectDateRange\": \"Seleccionar Rango de Fechas\",\n        \"startDate\": \"Fecha de Inicio\",\n        \"endDate\": \"Fecha de Fin\",\n        \"apply\": \"Aplicar\"\n      },\n      \"andMore\": \"y más\",\n      \"stocks\": {\n        \"splits\": \"Splits\",\n        \"earnings\": \"Beneficios\",\n        \"dividends\": \"Dividendos\",\n        \"stockSplit\": \"Split de acciones\",\n        \"dividend\": \"Dividendo\",\n        \"epsActual\": \"EPS real\",\n        \"epsForecast\": \"EPS estimado\",\n        \"revenueActual\": \"Ingresos reales\",\n        \"revenueForecast\": \"Ingresos estimados\",\n        \"exDate\": \"Fecha ex-dividendo\",\n        \"cycle\": \"Ciclo\",\n        \"payment\": \"Pago\",\n        \"yield\": \"Rendimiento\",\n        \"ratio\": \"Ratio\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Señales\",\n    \"support\": \"Financiación\",\n    \"resistance\": \"Resistencia\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Buscar en el glosario...\",\n    \"noResults\": \"No se han encontrado resultados.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Todo\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Acciones\",\n      \"crypto\": \"Cripto\",\n      \"cmd\": \"Materias primas\",\n      \"worldec\": \"Economía mundial\",\n      \"regec\": \"Economía regional\"\n    },\n    \"searchPlaceholder\": \"Buscar noticias, mercados y símbolos...\",\n    \"searchLabel\": \"Buscar noticias\",\n    \"articleCategoriesLabel\": \"Categorías de artículos\",\n    \"latestNews\": \"Últimas noticias\",\n    \"noSearchResults\": \"No hay artículos que coincidan con tu búsqueda.\",\n    \"loading\": \"Cargando...\",\n    \"loadMore\": \"Ver más\",\n    \"popularTopics\": \"Temas populares\",\n    \"relatedNews\": \"Noticias relacionadas\",\n    \"back\": \"Volver\",\n    \"share\": \"Compartir\",\n    \"readingTime\": \"{minutes} min de lectura\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Última actualización en vivo\",\n      \"live\": \"EN VIVO\",\n      \"openFeed\": \"Abrir cobertura en vivo\",\n      \"resume\": \"Reanudar actualizaciones en vivo\",\n      \"pause\": \"Pausar actualizaciones en vivo\",\n      \"title\": \"Actualizaciones en vivo\",\n      \"viewAll\": \"Ver todas las actualizaciones\",\n      \"newestFirst\": \"Más recientes primero\",\n      \"oldestFirst\": \"Más antiguas primero\",\n      \"sortOldestFirst\": \"Ordenar por más antiguas\",\n      \"sortNewestFirst\": \"Ordenar por más recientes\",\n      \"newUpdate\": \"{count} actualización nueva\",\n      \"newUpdates\": \"{count} actualizaciones nuevas\",\n      \"loading\": \"Cargando actualizaciones en vivo…\",\n      \"loadError\": \"No se pudieron cargar las actualizaciones en vivo.\",\n      \"tryAgain\": \"Intentar de nuevo\",\n      \"empty\": \"Aún no hay actualizaciones en vivo.\",\n      \"latest\": \"MÁS RECIENTE\",\n      \"loadingEarlier\": \"Cargando…\",\n      \"loadEarlier\": \"Cargar actualizaciones anteriores\",\n      \"backToNews\": \"Volver a noticias\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Resumen diario del mercado\",\n      \"title\": \"El resumen del mercado de hoy\",\n      \"description\": \"Un resumen diario en video de los movimientos que importan y de qué vigilar a continuación.\",\n      \"cta\": \"Ver la actualización completa\",\n      \"share\": \"Compartir\",\n      \"noVideo\": \"Aún no hay video disponible.\",\n      \"copied\": \"¡Copiado!\",\n      \"copyLink\": \"Copiar enlace\",\n      \"shareOn\": \"Compartir en {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Movimientos del mercado\",\n    \"active\": \"Más activas\",\n    \"gainers\": \"Ganadoras\",\n    \"losers\": \"Perdedoras\",\n    \"noData\": \"No hay datos\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Últimos 15 minutos\",\n      \"1h\": \"Última hora\",\n      \"1d\": \"Último día\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Petróleo crudo\",\n      \"gold\": \"Oro\",\n      \"silver\": \"Plata\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Recomendaciones de analistas\",\n    \"strongSell\": \"Venta fuerte\",\n    \"moderateSell\": \"Venta moderada\",\n    \"hold\": \"Mantener\",\n    \"moderateBuy\": \"Compra moderada\",\n    \"strongBuy\": \"Compra fuerte\",\n    \"sell\": \"Venta\",\n    \"buy\": \"Compra\",\n    \"averageTarget\": \"Precio objetivo promedio\",\n    \"noData\": \"No hay recomendaciones de analistas disponibles para este activo.\",\n    \"loadError\": \"No se pudieron cargar las recomendaciones de analistas.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Apertura\",\n    \"close\": \"Cierre\",\n    \"dayRange\": \"Rango del día\",\n    \"volume\": \"Volumen\",\n    \"keyStatistics\": \"Estadísticas clave\",\n    \"performance\": \"Rendimiento\",\n    \"week1\": \"1 semana\",\n    \"month1\": \"1 mes\",\n    \"month3\": \"3 meses\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Consenso de analistas\",\n    \"relatedNews\": \"Noticias relacionadas\",\n    \"noData\": \"Sin datos disponibles\",\n    \"loadError\": \"No se pudieron cargar los datos\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Convertisseur de devises\",\n    \"from\": \"De\",\n    \"to\": \"Vers\",\n    \"amount\": \"Montant\",\n    \"convert\": \"Convertir\",\n    \"result\": \"Résultat\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Haussier\",\n    \"downtrend\": \"Baissier\",\n    \"high\": \"Point haut (b)\",\n    \"low\": \"Point bas (a)\",\n    \"retracements\": \"Retracements\",\n    \"extensions\": \"Extensions\",\n    \"values\": \"Valeurs\",\n    \"result\": \"Résultat\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Calculateur de marge\",\n    \"leverage\": \"Levier\",\n    \"lotSize\": \"Volume en Lots\",\n    \"accountCurrency\": \"Devise de base du compte\",\n    \"currencyPair\": \"Paire de devises\",\n    \"accountType\": \"Type de compte\",\n    \"price\": \"Prix de conversion actuel\",\n    \"requiredMargin\": \"Marge requise\",\n    \"result\": \"Résultat\"\n  },\n  \"pivots\": {\n    \"title\": \"Points de pivot\",\n    \"classic\": \"Classique\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Point haut\",\n    \"low\": \"Point bas\",\n    \"open\": \"Prix d'ouverture\",\n    \"close\": \"Prix de clôture\",\n    \"pivotPoints\": \"Points de pivot\",\n    \"res-4\": \"4 Résistance\",\n    \"res-3\": \"3 Résistance\",\n    \"res-2\": \"2 Résistance\",\n    \"res-1\": \"1 Résistance\",\n    \"pivot\": \"Point de pivot\",\n    \"sup-1\": \"1 Support\",\n    \"sup-2\": \"2 Support\",\n    \"sup-3\": \"3 Support\",\n    \"sup-4\": \"4 Support\",\n    \"result\": \"Résultat\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"buy\": \"Acheter/ Long\",\n    \"sell\": \"Vendre / Short\",\n    \"open\": \"Ouverture\",\n    \"value\": \"Valeur/Pip\",\n    \"lots\": \"Lots\",\n    \"stop\": \"Stop\",\n    \"Limit\": \"Limite\",\n    \"maxLoss\": \"Perte maximum\",\n    \"maxProfit\": \"Profit maximum\",\n    \"result\": \"Résultat\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Niveaux de Stop Loss / Take Profit\",\n    \"buy\": \"Acheter/ Long\",\n    \"sell\": \"Vendre / Short\",\n    \"open\": \"Ouverture\",\n    \"value\": \"Valeur/Pip\",\n    \"lots\": \"Lots\",\n    \"risk\": \"Montant à risque\",\n    \"gain\": \"Montant à gagner\",\n    \"stopLoss\": \"Stop Loss à \",\n    \"takeProfit\": \"Take Profit à \",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Résultat\"\n  },\n  \"heatmap\": {\n    \"title\": \"Carte thermique\",\n    \"currencies\": \"Devises\",\n    \"value\": \"Valeur\",\n    \"result\": \"Résultat\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Journée\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Semaine\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Mois\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Calendrier économique\",\n    \"impact\": \"Impact\",\n    \"high\": \"Élevé\",\n    \"medium\": \"Moyen\",\n    \"low\": \"Faible\",\n    \"countries\": \"Pays\",\n    \"customRange\": \"Plage personnalisée\",\n    \"yesterday\": \"Hier\",\n    \"today\": \"Aujourd'hui\",\n    \"tomorrow\": \"Demain\",\n    \"thisWeek\": \"Cette semaine\",\n    \"lastWeek\": \"La semaine dernière\",\n    \"nextWeek\": \"La semaine prochaine\",\n    \"noEventsFound\": \"Aucun événement trouvé\",\n    \"event\": \"Événement\",\n    \"actual\": \"Actual\",\n    \"forecast\": \"Prévision\",\n    \"previous\": \"Précédent\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Heure\",\n        \"news\": \"Nouvelles\",\n        \"impact\": \"Impact\",\n        \"impactedCurrency\": \"Devise impactée\",\n        \"actual\": \"Actuel\",\n        \"forecast\": \"Prévision\",\n        \"prior\": \"Antérieur\",\n        \"impactedInstruments\": \"Instruments impactés\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Dates personnalisées\",\n        \"selectDateRange\": \"Sélectionner une plage de dates\",\n        \"startDate\": \"Date de début\",\n        \"endDate\": \"Date de fin\",\n        \"apply\": \"Appliquer\"\n      },\n      \"andMore\": \"et plus\",\n      \"stocks\": {\n        \"splits\": \"Fractionnements\",\n        \"earnings\": \"Résultats\",\n        \"dividends\": \"Dividendes\",\n        \"stockSplit\": \"Fractionnement d'actions\",\n        \"dividend\": \"Dividende\",\n        \"epsActual\": \"EPS réel\",\n        \"epsForecast\": \"EPS prévu\",\n        \"revenueActual\": \"Revenu réel\",\n        \"revenueForecast\": \"Revenu prévu\",\n        \"exDate\": \"Date ex-dividende\",\n        \"cycle\": \"Cycle\",\n        \"payment\": \"Paiement\",\n        \"yield\": \"Rendement\",\n        \"ratio\": \"Ratio\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Signaux\",\n    \"support\": \"Support\",\n    \"resistance\": \"Résistance\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Rechercher dans le glossaire...\",\n    \"noResults\": \"Aucun résultat trouvé.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Tout\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Actions\",\n      \"crypto\": \"Crypto\",\n      \"cmd\": \"Matières premières\",\n      \"worldec\": \"Économie mondiale\",\n      \"regec\": \"Économie régionale\"\n    },\n    \"searchPlaceholder\": \"Rechercher actualités, marchés, symboles...\",\n    \"searchLabel\": \"Rechercher des actualités\",\n    \"articleCategoriesLabel\": \"Catégories d’articles\",\n    \"latestNews\": \"Dernières actualités\",\n    \"noSearchResults\": \"Aucun article ne correspond à votre recherche.\",\n    \"loading\": \"Chargement...\",\n    \"loadMore\": \"Afficher plus\",\n    \"popularTopics\": \"Sujets populaires\",\n    \"relatedNews\": \"Actualités connexes\",\n    \"back\": \"Retour\",\n    \"share\": \"Partager\",\n    \"readingTime\": \"{minutes} min de lecture\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Dernière actualité en direct\",\n      \"live\": \"EN DIRECT\",\n      \"openFeed\": \"Ouvrir le fil en direct\",\n      \"resume\": \"Reprendre les actualités en direct\",\n      \"pause\": \"Mettre les actualités en direct en pause\",\n      \"title\": \"Actualités en direct\",\n      \"viewAll\": \"Voir toutes les actualités\",\n      \"newestFirst\": \"Plus récentes d’abord\",\n      \"oldestFirst\": \"Plus anciennes d’abord\",\n      \"sortOldestFirst\": \"Trier par plus anciennes\",\n      \"sortNewestFirst\": \"Trier par plus récentes\",\n      \"newUpdate\": \"{count} nouvelle actualité\",\n      \"newUpdates\": \"{count} nouvelles actualités\",\n      \"loading\": \"Chargement des actualités en direct…\",\n      \"loadError\": \"Impossible de charger les actualités en direct.\",\n      \"tryAgain\": \"Réessayer\",\n      \"empty\": \"Aucune actualité en direct pour le moment.\",\n      \"latest\": \"DERNIÈRE\",\n      \"loadingEarlier\": \"Chargement…\",\n      \"loadEarlier\": \"Charger les actualités précédentes\",\n      \"backToNews\": \"Retour aux actualités\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Brief quotidien du marché\",\n      \"title\": \"Le brief du marché du jour\",\n      \"description\": \"Un résumé vidéo quotidien des mouvements qui comptent et de ce qu’il faut surveiller ensuite.\",\n      \"cta\": \"Découvrir la mise à jour complète\",\n      \"share\": \"Partager\",\n      \"noVideo\": \"Aucune vidéo disponible pour le moment.\",\n      \"copied\": \"Copié !\",\n      \"copyLink\": \"Copier le lien\",\n      \"shareOn\": \"Partager sur {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Mouvements du marché\",\n    \"active\": \"Plus actifs\",\n    \"gainers\": \"Gagnants\",\n    \"losers\": \"Perdants\",\n    \"noData\": \"Aucune donnée\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"15 dernières minutes\",\n      \"1h\": \"Dernière heure\",\n      \"1d\": \"Dernier jour\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Pétrole brut\",\n      \"gold\": \"Or\",\n      \"silver\": \"Argent\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Recommandations des analystes\",\n    \"strongSell\": \"Vente forte\",\n    \"moderateSell\": \"Vente modérée\",\n    \"hold\": \"Conserver\",\n    \"moderateBuy\": \"Achat modéré\",\n    \"strongBuy\": \"Achat fort\",\n    \"sell\": \"Vente\",\n    \"buy\": \"Achat\",\n    \"averageTarget\": \"Objectif moyen\",\n    \"noData\": \"Aucune recommandation d’analyste n’est disponible pour cet actif.\",\n    \"loadError\": \"Impossible de charger les recommandations des analystes.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Ouverture\",\n    \"close\": \"Clôture\",\n    \"dayRange\": \"Fourchette journalière\",\n    \"volume\": \"Volume\",\n    \"keyStatistics\": \"Statistiques clés\",\n    \"performance\": \"Performance\",\n    \"week1\": \"1 semaine\",\n    \"month1\": \"1 mois\",\n    \"month3\": \"3 mois\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Consensus des analystes\",\n    \"relatedNews\": \"Actualités liées\",\n    \"noData\": \"Aucune donnée disponible\",\n    \"loadError\": \"Impossible de charger les données\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"ממיר מטבע\",\n    \"from\": \"מ\",\n    \"to\": \"אל\",\n    \"amount\": \"סכום\",\n    \"convert\": \"המר\",\n    \"result\": \"תוצאה\"\n  },\n  \"fibonacci\": {\n    \"title\": \"פיבונאצ'י\",\n    \"uptrend\": \"מגמת עלייה\",\n    \"downtrend\": \"מגמת ירידה\",\n    \"high\": \"עלייה\",\n    \"low\": \"שפל\",\n    \"retracements\": \"ערך עשרוני\",\n    \"extensions\": \"תוספת\",\n    \"values\": \"ערכים\",\n    \"result\": \"תוצאה\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"מחשבון מרווח\",\n    \"leverage\": \"יתרון\",\n    \"lotSize\": \"ערך\",\n    \"accountCurrency\": \"חשבון מבוסס מטבע\",\n    \"currencyPair\": \"מטבעות להשוואה\",\n    \"accountType\": \"סוג חשבון\",\n    \"price\": \"מחיר המרה נוכחי\",\n    \"requiredMargin\": \"מרווח נדרש\",\n    \"result\": \"תוצאה\"\n  },\n  \"pivots\": {\n    \"title\": \"נקודות פיבוט\",\n    \"classic\": \"קלאסי\",\n    \"woodie\": \"וודי\",\n    \"camarilla\": \"קאמרילייה\",\n    \"demark\": \"דה-מארק\",\n    \"high\": \"מחיר גבוה\",\n    \"low\": \"מחיר נמוך\",\n    \"open\": \"מחיר פתוח\",\n    \"close\": \"מחיר סגור\",\n    \"pivotPoints\": \"נקודות פיבוט\",\n    \"res-4\": \"התנגדות רביעית\",\n    \"res-3\": \"התנגדות שלישית\",\n    \"res-2\": \"התנגדות שנייה\",\n    \"res-1\": \"התנגדות ראשונה\",\n    \"pivot\": \"נקודת פיבוט\",\n    \"sup-1\": \"תמיכה ראשונה\",\n    \"sup-2\": \"תמיכה שנייה\",\n    \"sup-3\": \"תמיכה שלישית\",\n    \"sup-4\": \"תמיכה רביעית\",\n    \"result\": \"תוצאה\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"עצירת הפסד / לקיחת רווח\",\n    \"buy\": \"קנה/ארוך\",\n    \"sell\": \"מכר/קצר\",\n    \"open\": \"פתח\",\n    \"value\": \"ערך\",\n    \"lots\": \"סיכוי\",\n    \"stop\": \"עצור\",\n    \"Limit\": \"עד\",\n    \"maxLoss\": \"הפסד מקסימלי\",\n    \"maxProfit\": \"רווח מקסימלי\",\n    \"result\": \"תוצאה\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"רמות עצירת הפסד / לקיחת רווח\",\n    \"buy\": \"קנה/ארוך\",\n    \"sell\": \"מכר/קצר\",\n    \"open\": \"פתוח\",\n    \"value\": \"ערך\",\n    \"lots\": \"סיכוי\",\n    \"risk\": \"סכום לסיכון\",\n    \"gain\": \"סכום לצבירה\",\n    \"stopLoss\": \"עצירת הפסד ב\",\n    \"takeProfit\": \"לקיחת רווח ב\",\n    \"stopLossPips\": \"עצירת הפסד (פיפס)\",\n    \"takeProfitPips\": \"לקיחת רווח (פיפס)\",\n    \"result\": \"תוצאה\"\n  },\n  \"heatmap\": {\n    \"title\": \"מפת חום\",\n    \"currencies\": \" מטבעות סח\",\n    \"value\": \"ערך\",\n    \"result\": \"תוצאה\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15ד\",\n        \"long\": \"תוך יומי 15\"\n      },\n      \"60m\": {\n        \"short\": \"60ד\",\n        \"long\": \"תוך יומי 60\"\n      },\n      \"240m\": {\n        \"short\": \"240ד\",\n        \"long\": \"תוך יומי 240\"\n      },\n      \"1d\": {\n        \"short\": \"1י\",\n        \"long\": \"יומי\"\n      },\n      \"1w\": {\n        \"short\": \"1ש\",\n        \"long\": \"שבועי\"\n      },\n      \"1M\": {\n        \"short\": \"1ח\",\n        \"long\": \"חודשי\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"לוח שנה כלכלי\",\n    \"impact\": \"השפעה\",\n    \"high\": \"גבוה\",\n    \"medium\": \"בינוני\",\n    \"low\": \"נמוך\",\n    \"countries\": \"מדינות\",\n    \"customRange\": \"טווח מותאם אישית\",\n    \"yesterday\": \"אתמול\",\n    \"today\": \"היום\",\n    \"tomorrow\": \"מחר\",\n    \"thisWeek\": \"השבוע\",\n    \"lastWeek\": \"השבוע שעבר\",\n    \"nextWeek\": \"השבוע הבא\",\n    \"noEventsFound\": \"לא נמצאו אירועים\",\n    \"event\": \"אירוע\",\n    \"actual\": \"פועל\",\n    \"forecast\": \"תחזית\",\n    \"previous\": \"קודם\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"זמן\",\n        \"news\": \"חדשות\",\n        \"impact\": \"השפעה\",\n        \"impactedCurrency\": \"מטבע מושפע\",\n        \"actual\": \"פועל\",\n        \"forecast\": \"תחזית\",\n        \"prior\": \"קודם\",\n        \"impactedInstruments\": \"כלים מושפעים\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"תאריכים מותאמים אישית\",\n        \"selectDateRange\": \"בחר טווח תאריכים\",\n        \"startDate\": \"תאריך התחלה\",\n        \"endDate\": \"תאריך סיום\",\n        \"apply\": \"החל\"\n      },\n      \"andMore\": \"ועוד\",\n      \"stocks\": {\n        \"splits\": \"פיצולים\",\n        \"earnings\": \"רווחים\",\n        \"dividends\": \"דיבידנדים\",\n        \"stockSplit\": \"פיצול מניה\",\n        \"dividend\": \"דיבידנד\",\n        \"epsActual\": \"EPS בפועל\",\n        \"epsForecast\": \"EPS תחזית\",\n        \"revenueActual\": \"הכנסות בפועל\",\n        \"revenueForecast\": \"הכנסות תחזית\",\n        \"exDate\": \"תאריך אקס\",\n        \"cycle\": \"מחזור\",\n        \"payment\": \"תשלום\",\n        \"yield\": \"תשואה\",\n        \"ratio\": \"יחס\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"אותות\",\n    \"support\": \"תמיכה\",\n    \"resistance\": \"התנגדות\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"חפש במילון...\",\n    \"noResults\": \"לא נמצאו תוצאות.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"הכול\",\n      \"forex\": \"מט״ח\",\n      \"stock\": \"מניות\",\n      \"crypto\": \"קריפטו\",\n      \"cmd\": \"סחורות\",\n      \"worldec\": \"כלכלה עולמית\",\n      \"regec\": \"כלכלה אזורית\"\n    },\n    \"searchPlaceholder\": \"חיפוש חדשות, שווקים וסימולים...\",\n    \"searchLabel\": \"חיפוש חדשות\",\n    \"articleCategoriesLabel\": \"קטגוריות כתבות\",\n    \"latestNews\": \"חדשות אחרונות\",\n    \"noSearchResults\": \"לא נמצאו כתבות התואמות לחיפוש.\",\n    \"loading\": \"טוען...\",\n    \"loadMore\": \"הצג עוד\",\n    \"popularTopics\": \"נושאים פופולריים\",\n    \"relatedNews\": \"חדשות קשורות\",\n    \"back\": \"חזרה\",\n    \"share\": \"שיתוף\",\n    \"readingTime\": \"זמן קריאה: {minutes} דקות\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"העדכון החי האחרון\",\n      \"live\": \"שידור חי\",\n      \"openFeed\": \"פתיחת העדכונים החיים\",\n      \"resume\": \"המשך עדכונים חיים\",\n      \"pause\": \"השהיית עדכונים חיים\",\n      \"title\": \"עדכונים חיים\",\n      \"viewAll\": \"הצגת כל העדכונים\",\n      \"newestFirst\": \"החדשים תחילה\",\n      \"oldestFirst\": \"הישנים תחילה\",\n      \"sortOldestFirst\": \"מיון מהישן לחדש\",\n      \"sortNewestFirst\": \"מיון מהחדש לישן\",\n      \"newUpdate\": \"עדכון חדש אחד\",\n      \"newUpdates\": \"{count} עדכונים חדשים\",\n      \"loading\": \"טוען עדכונים חיים…\",\n      \"loadError\": \"לא ניתן לטעון את העדכונים החיים.\",\n      \"tryAgain\": \"נסה שוב\",\n      \"empty\": \"אין עדיין עדכונים חיים.\",\n      \"latest\": \"האחרון\",\n      \"loadingEarlier\": \"טוען…\",\n      \"loadEarlier\": \"טעינת עדכונים קודמים\",\n      \"backToNews\": \"חזרה לחדשות\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"סיכום שוק יומי\",\n      \"title\": \"סיכום השוק להיום\",\n      \"description\": \"סיכום וידאו יומי תמציתי על התנועות החשובות ועל מה כדאי לעקוב אחריו.\",\n      \"cta\": \"לעדכון המלא\",\n      \"share\": \"שיתוף\",\n      \"noVideo\": \"אין עדיין סרטון זמין.\",\n      \"copied\": \"הועתק!\",\n      \"copyLink\": \"העתק קישור\",\n      \"shareOn\": \"שיתוף ב-{name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"מובילי השוק\",\n    \"active\": \"הפעילים ביותר\",\n    \"gainers\": \"עולות\",\n    \"losers\": \"יורדות\",\n    \"noData\": \"אין נתונים\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"15 הדקות האחרונות\",\n      \"1h\": \"השעה האחרונה\",\n      \"1d\": \"היום האחרון\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"נפט גולמי\",\n      \"gold\": \"זהב\",\n      \"silver\": \"כסף\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"המלצות אנליסטים\",\n    \"strongSell\": \"מכירה חזקה\",\n    \"moderateSell\": \"מכירה מתונה\",\n    \"hold\": \"החזקה\",\n    \"moderateBuy\": \"קנייה מתונה\",\n    \"strongBuy\": \"קנייה חזקה\",\n    \"sell\": \"מכירה\",\n    \"buy\": \"קנייה\",\n    \"averageTarget\": \"מחיר יעד ממוצע\",\n    \"noData\": \"אין המלצות אנליסטים זמינות לנכס זה.\",\n    \"loadError\": \"לא ניתן לטעון את המלצות האנליסטים.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"פתיחה\",\n    \"close\": \"סגירה\",\n    \"dayRange\": \"טווח יומי\",\n    \"volume\": \"נפח\",\n    \"keyStatistics\": \"נתונים מרכזיים\",\n    \"performance\": \"ביצועים\",\n    \"week1\": \"שבוע 1\",\n    \"month1\": \"חודש 1\",\n    \"month3\": \"3 חודשים\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"קונצנזוס אנליסטים\",\n    \"relatedNews\": \"חדשות קשורות\",\n    \"noData\": \"אין נתונים\",\n    \"loadError\": \"לא ניתן לטעון נתונים\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"मुद्रा परिवर्तक\",\n    \"from\": \"से\",\n    \"to\": \"में\",\n    \"amount\": \"धनराशि\",\n    \"convert\": \"बदलना\",\n    \"result\": \"परिणाम\"\n  },\n  \"fibonacci\": {\n    \"title\": \"फाइबोनैचि\",\n    \"uptrend\": \"तेजी\",\n    \"downtrend\": \"गिरावट\",\n    \"high\": \"उच्च\",\n    \"low\": \"निम्न\",\n    \"retracements\": \"रिट्रेसमेंट\",\n    \"extensions\": \"एक्सटेंशन\",\n    \"values\": \"मान\",\n    \"result\": \"परिणाम\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"मार्जिन कैलकुलेटर\",\n    \"leverage\": \"उत्तोलन\",\n    \"lotSize\": \"लॉट में मात्रा\",\n    \"accountCurrency\": \"खाता आधार मुद्रा\",\n    \"currencyPair\": \"मुद्रा जोड़ी\",\n    \"accountType\": \"खाते का प्रकार\",\n    \"price\": \"वर्तमान रूपांतरण मूल्य\",\n    \"requiredMargin\": \"आवश्यक मार्जिन\",\n    \"result\": \"परिणाम\"\n  },\n  \"pivots\": {\n    \"title\": \"इन्हीं\",\n    \"classic\": \"क्लासिक\",\n    \"woodie\": \"वुडी\",\n    \"camarilla\": \"कमरैला\",\n    \"demark\": \"डी मार्क\",\n    \"high\": \"उच्च कीमत\",\n    \"low\": \"कम कीमत\",\n    \"open\": \"खुली कीमत\",\n    \"close\": \"बंद कीमत\",\n    \"pivotPoints\": \"धुरी बिंदु\",\n    \"res-4\": \"4 प्रतिरोध\",\n    \"res-3\": \"3 प्रतिरोध\",\n    \"res-2\": \"2 प्रतिरोध\",\n    \"res-1\": \"1 प्रतिरोध\",\n    \"pivot\": \"पीवॉट पॉइंट\",\n    \"sup-1\": \"1 समर्थन\",\n    \"sup-2\": \"2 समर्थन\",\n    \"sup-3\": \"3 समर्थन\",\n    \"sup-4\": \"4 समर्थन\",\n    \"result\": \"परिणाम\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"स्टॉप लॉस / टेक प्रॉफिट\",\n    \"buy\": \"क्रय/दीर्घकालिक\",\n    \"sell\": \"विक्रय/अल्पकालीन\",\n    \"open\": \"प्रारंभ\",\n    \"value\": \"मूल्य/पिप\",\n    \"lots\": \"लॉट\",\n    \"stop\": \"विराम\",\n    \"Limit\": \"सीमा\",\n    \"maxLoss\": \"अधिकतम घाटा\",\n    \"maxProfit\": \"अधिकतम लाभ\",\n    \"result\": \"परिणाम\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"स्टॉप लॉस / लाभ लेने के स्तर\",\n    \"buy\": \"क्रय/दीर्घकालिक\",\n    \"sell\": \"विक्रय/अल्पकालीन\",\n    \"open\": \"प्रारंभ\",\n    \"value\": \"मूल्य/पिप\",\n    \"lots\": \"लॉट\",\n    \"risk\": \"-जोखिम राशि\",\n    \"gain\": \"प्राप्त राशि\",\n    \"stopLoss\": \"स्टॉप लॉस पर \",\n    \"takeProfit\": \"इस पर लाभ लें \",\n    \"stopLossPips\": \"स्टॉप लॉस (पिप्स) \",\n    \"takeProfitPips\": \"लाभ प्राप्त करें (पिप्स) \",\n    \"result\": \"परिणाम\"\n  },\n  \"heatmap\": {\n    \"title\": \"हीटमैप\",\n    \"currencies\": \"मुद्राएँ\",\n    \"value\": \"कीमत\",\n    \"result\": \"परिणाम\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"इंट्राडे15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"इंट्राडे60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"इंट्राडे240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"दैनिक\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"साप्ताहिक\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"मासिक\"\n      }\n    },\n    \"tooManyCurrencies\": \"बहुत सारी मुद्राएँ चुनी गई हैं। कृपया 8 मुद्राएँ तक चुनें।\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"आर्थिक कैलेंडर\",\n    \"impact\": \"प्रभाव\",\n    \"high\": \"उच्च\",\n    \"medium\": \"मध्यम\",\n    \"low\": \"निम्न\",\n    \"countries\": \"देश\",\n    \"customRange\": \"कस्टम रेंज\",\n    \"yesterday\": \"कल\",\n    \"today\": \"आज\",\n    \"tomorrow\": \"कल\",\n    \"thisWeek\": \"इस सप्ताह\",\n    \"lastWeek\": \"पिछले सप्ताह\",\n    \"nextWeek\": \"अगले सप्ताह\",\n    \"noEventsFound\": \"कोई घटना नहीं मिली\",\n    \"event\": \"घटना\",\n    \"actual\": \"वास्तविक\",\n    \"forecast\": \"पूर्वानुमान\",\n    \"previous\": \"पिछला\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"समय\",\n        \"news\": \"समाचार\",\n        \"impact\": \"प्रभाव\",\n        \"impactedCurrency\": \"प्रभावित मुद्रा\",\n        \"actual\": \"वास्तविक\",\n        \"forecast\": \"पूर्वानुमान\",\n        \"prior\": \"पिछला\",\n        \"impactedInstruments\": \"प्रभावित उपकरण\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"कस्टम तिथियाँ\",\n        \"selectDateRange\": \"तिथि सीमा चुनें\",\n        \"startDate\": \"प्रारंभ तिथि\",\n        \"endDate\": \"समाप्ति तिथि\",\n        \"apply\": \"लागू करें\"\n      },\n      \"andMore\": \"और अधिक\",\n      \"stocks\": {\n        \"splits\": \"स्प्लिट\",\n        \"earnings\": \"आय\",\n        \"dividends\": \"लाभांश\",\n        \"stockSplit\": \"स्टॉक स्प्लिट\",\n        \"dividend\": \"लाभांश\",\n        \"epsActual\": \"EPS वास्तविक\",\n        \"epsForecast\": \"EPS अनुमान\",\n        \"revenueActual\": \"राजस्व वास्तविक\",\n        \"revenueForecast\": \"राजस्व अनुमान\",\n        \"exDate\": \"एक्स-डेट\",\n        \"cycle\": \"चक्र\",\n        \"payment\": \"भुगतान\",\n        \"yield\": \"प्रतिफल\",\n        \"ratio\": \"अनुपात\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"सिग्नल\",\n    \"support\": \"समर्थन\",\n    \"resistance\": \"प्रतिरोध\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"शब्दकोश खोजें...\",\n    \"noResults\": \"कोई परिणाम नहीं मिला।\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"सभी\",\n      \"forex\": \"फॉरेक्स\",\n      \"stock\": \"स्टॉक्स\",\n      \"crypto\": \"क्रिप्टो\",\n      \"cmd\": \"कमोडिटीज़\",\n      \"worldec\": \"विश्व अर्थव्यवस्था\",\n      \"regec\": \"क्षेत्रीय अर्थव्यवस्था\"\n    },\n    \"searchPlaceholder\": \"समाचार, बाज़ार और टिकर खोजें...\",\n    \"searchLabel\": \"समाचार खोजें\",\n    \"articleCategoriesLabel\": \"लेख श्रेणियाँ\",\n    \"latestNews\": \"ताज़ा समाचार\",\n    \"noSearchResults\": \"आपकी खोज से मेल खाने वाला कोई लेख नहीं मिला।\",\n    \"loading\": \"लोड हो रहा है...\",\n    \"loadMore\": \"और लोड करें\",\n    \"popularTopics\": \"लोकप्रिय विषय\",\n    \"relatedNews\": \"संबंधित समाचार\",\n    \"back\": \"वापस\",\n    \"share\": \"साझा करें\",\n    \"readingTime\": \"पढ़ने का समय: {minutes} मिनट\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"नवीनतम लाइव अपडेट\",\n      \"live\": \"लाइव\",\n      \"openFeed\": \"लाइव फ़ीड खोलें\",\n      \"resume\": \"लाइव अपडेट फिर शुरू करें\",\n      \"pause\": \"लाइव अपडेट रोकें\",\n      \"title\": \"लाइव अपडेट\",\n      \"viewAll\": \"सभी अपडेट देखें\",\n      \"newestFirst\": \"नवीनतम पहले\",\n      \"oldestFirst\": \"सबसे पुराने पहले\",\n      \"sortOldestFirst\": \"सबसे पुराने पहले क्रमित करें\",\n      \"sortNewestFirst\": \"नवीनतम पहले क्रमित करें\",\n      \"newUpdate\": \"{count} नया अपडेट\",\n      \"newUpdates\": \"{count} नए अपडेट\",\n      \"loading\": \"लाइव अपडेट लोड हो रहे हैं…\",\n      \"loadError\": \"लाइव अपडेट लोड नहीं हो सके।\",\n      \"tryAgain\": \"फिर कोशिश करें\",\n      \"empty\": \"अभी कोई लाइव अपडेट नहीं है।\",\n      \"latest\": \"नवीनतम\",\n      \"loadingEarlier\": \"लोड हो रहा है…\",\n      \"loadEarlier\": \"पुराने अपडेट लोड करें\",\n      \"backToNews\": \"समाचार पर वापस जाएँ\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"दैनिक बाज़ार ब्रीफ़\",\n      \"title\": \"आज का बाज़ार ब्रीफ़\",\n      \"description\": \"महत्वपूर्ण हलचलों और आगे किन बातों पर नज़र रखनी है, इस पर एक संक्षिप्त दैनिक वीडियो ब्रीफ़।\",\n      \"cta\": \"पूरा अपडेट देखें\",\n      \"share\": \"साझा करें\",\n      \"noVideo\": \"अभी कोई वीडियो उपलब्ध नहीं है।\",\n      \"copied\": \"कॉपी हो गया!\",\n      \"copyLink\": \"लिंक कॉपी करें\",\n      \"shareOn\": \"{name} पर साझा करें\"\n  },\n  \"topMovers\": {\n    \"title\": \"मार्केट मूवर्स\",\n    \"active\": \"सबसे सक्रिय\",\n    \"gainers\": \"तेज़ी वाले\",\n    \"losers\": \"गिरावट वाले\",\n    \"noData\": \"कोई डेटा नहीं\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"पिछले 15 मिनट\",\n      \"1h\": \"पिछला घंटा\",\n      \"1d\": \"पिछला दिन\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"कच्चा तेल\",\n      \"gold\": \"सोना\",\n      \"silver\": \"चाँदी\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"विश्लेषक अनुशंसाएँ\",\n    \"strongSell\": \"मजबूत बिक्री\",\n    \"moderateSell\": \"मध्यम बिक्री\",\n    \"hold\": \"होल्ड\",\n    \"moderateBuy\": \"मध्यम खरीद\",\n    \"strongBuy\": \"मजबूत खरीद\",\n    \"sell\": \"बिक्री\",\n    \"buy\": \"खरीद\",\n    \"averageTarget\": \"औसत लक्ष्य\",\n    \"noData\": \"इस परिसंपत्ति के लिए विश्लेषक अनुशंसाएँ उपलब्ध नहीं हैं।\",\n    \"loadError\": \"विश्लेषक अनुशंसाएँ लोड नहीं की जा सकीं।\"\n  },\n  \"assetOverview\": {\n    \"open\": \"खुलना\",\n    \"close\": \"बंद\",\n    \"dayRange\": \"दैनिक सीमा\",\n    \"volume\": \"मात्रा\",\n    \"keyStatistics\": \"प्रमुख आँकड़े\",\n    \"performance\": \"प्रदर्शन\",\n    \"week1\": \"1 सप्ताह\",\n    \"month1\": \"1 माह\",\n    \"month3\": \"3 माह\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"विश्लेषक सहमति\",\n    \"relatedNews\": \"संबंधित समाचार\",\n    \"noData\": \"कोई डेटा नहीं\",\n    \"loadError\": \"डेटा लोड नहीं हो सका\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Konverter Mata Uang\",\n    \"from\": \"Mata Uang Awal\",\n    \"to\": \"Mata Uang Akhir\",\n    \"amount\": \"Jumlah\",\n    \"convert\": \"Konversi\",\n    \"result\": \"Hasil\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"tren naik\",\n    \"downtrend\": \"kecenderungan untuk menurun\",\n    \"high\": \"tinggi\",\n    \"low\": \"rendah\",\n    \"retracements\": \"penelusuran kembali\",\n    \"extensions\": \"perpanjangan\",\n    \"values\": \"Nilai\",\n    \"result\": \"Hasil\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Kalkulator Margin\",\n    \"leverage\": \"Jumlah Utang\",\n    \"lotSize\": \"Volume Lot\",\n    \"accountCurrency\": \"Akun Valuta Acuan\",\n    \"currencyPair\": \"Pasangan Valuta\",\n    \"accountType\": \"Tipe Akun\",\n    \"price\": \"Harga Konversi Saat Ini\",\n    \"requiredMargin\": \"Margin yang Diperlukan\",\n    \"result\": \"Hasil\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivot\",\n    \"classic\": \"Classic\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Harga Tertinggi\",\n    \"low\": \"Harga Terendah\",\n    \"open\": \"Pembukaan\",\n    \"close\": \"Penutupan\",\n    \"pivotPoints\": \"Pivot Point\",\n    \"res-4\": \"4 Resistance\",\n    \"res-3\": \"3 Resistance\",\n    \"res-2\": \"2 Resistance\",\n    \"res-1\": \"1 Resistance\",\n    \"pivot\": \"Pivot Point\",\n    \"sup-1\": \"1 Support\",\n    \"sup-2\": \"2 Support\",\n    \"sup-3\": \"3 Support\",\n    \"sup-4\": \"4 Support\",\n    \"result\": \"Hasil\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"buy\": \"Beli / Long\",\n    \"sell\": \"Jual / Short\",\n    \"open\": \"Buka\",\n    \"value\": \"Nilai/Pip\",\n    \"lots\": \"Lots\",\n    \"stop\": \"Stop\",\n    \"Limit\": \"Tutup\",\n    \"maxLoss\": \"Loss maksimum\",\n    \"maxProfit\": \"Profit maksimum\",\n    \"result\": \"Hasil\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Level Stop Loss / Take Profit\",\n    \"buy\": \"Beli / Long\",\n    \"sell\": \"Jual / Short\",\n    \"open\": \"Buka\",\n    \"value\": \"Nilai/Pip\",\n    \"lots\": \"Lots\",\n    \"risk\": \"Jumlah Risiko\",\n    \"gain\": \"Jumlah Keuntungan\",\n    \"stopLoss\": \"Stop loss di\",\n    \"takeProfit\": \"Take profit di\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Hasil\"\n  },\n  \"heatmap\": {\n    \"title\": \"Peta Panas\",\n    \"currencies\": \"Mata uang\",\n    \"value\": \"Nilai\",\n    \"result\": \"Hasil\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Harian\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Mingguan\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Bulanan\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Kalender Ekonomi\",\n    \"impact\": \"Dampak\",\n    \"high\": \"Tinggi\",\n    \"medium\": \"Sedang\",\n    \"low\": \"Rendah\",\n    \"countries\": \"Negara\",\n    \"customRange\": \"Rentang Kustom\",\n    \"yesterday\": \"Kemarin\",\n    \"today\": \"Hari Ini\",\n    \"tomorrow\": \"Besok\",\n    \"thisWeek\": \"Minggu Ini\",\n    \"lastWeek\": \"Minggu Lalu\",\n    \"nextWeek\": \"Minggu Depan\",\n    \"noEventsFound\": \"Tidak Ada Acara\",\n    \"event\": \"Acara\",\n    \"actual\": \"Aktual\",\n    \"forecast\": \"Perkiraan\",\n    \"previous\": \"Sebelumnya\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"WAKTU\",\n        \"news\": \"BERITA\",\n        \"impact\": \"DAMPAK\",\n        \"impactedCurrency\": \"MATA UANG TERDAMPAK\",\n        \"actual\": \"AKTUAL\",\n        \"forecast\": \"PERKIRAAN\",\n        \"prior\": \"SEBELUMNYA\",\n        \"impactedInstruments\": \"INSTRUMEN TERDAMPAK\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Tanggal Kustom\",\n        \"selectDateRange\": \"Pilih Rentang Tanggal\",\n        \"startDate\": \"Tanggal Mulai\",\n        \"endDate\": \"Tanggal Selesai\",\n        \"apply\": \"Terapkan\"\n      },\n      \"andMore\": \"dan lebih\",\n      \"stocks\": {\n        \"splits\": \"Pemecahan\",\n        \"earnings\": \"Laba\",\n        \"dividends\": \"Dividen\",\n        \"stockSplit\": \"Pemecahan saham\",\n        \"dividend\": \"Dividen\",\n        \"epsActual\": \"EPS aktual\",\n        \"epsForecast\": \"EPS perkiraan\",\n        \"revenueActual\": \"Pendapatan aktual\",\n        \"revenueForecast\": \"Pendapatan perkiraan\",\n        \"exDate\": \"Tanggal ex-dividen\",\n        \"cycle\": \"Siklus\",\n        \"payment\": \"Pembayaran\",\n        \"yield\": \"Imbal hasil\",\n        \"ratio\": \"Rasio\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Sinyal\",\n    \"support\": \"Support\",\n    \"resistance\": \"Resistance\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Cari dalam glosarium...\",\n    \"noResults\": \"Tidak ada hasil yang ditemukan.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Semua\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Saham\",\n      \"crypto\": \"Kripto\",\n      \"cmd\": \"Komoditas\",\n      \"worldec\": \"Ekonomi Dunia\",\n      \"regec\": \"Ekonomi Regional\"\n    },\n    \"searchPlaceholder\": \"Cari berita, pasar, simbol...\",\n    \"searchLabel\": \"Cari berita\",\n    \"articleCategoriesLabel\": \"Kategori artikel\",\n    \"latestNews\": \"Berita Terbaru\",\n    \"noSearchResults\": \"Tidak ada artikel yang cocok dengan pencarian Anda.\",\n    \"loading\": \"Memuat...\",\n    \"loadMore\": \"Muat lebih banyak\",\n    \"popularTopics\": \"Topik Populer\",\n    \"relatedNews\": \"Berita Terkait\",\n    \"back\": \"Kembali\",\n    \"share\": \"Bagikan\",\n    \"readingTime\": \"Waktu baca: {minutes} menit\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Pembaruan langsung terbaru\",\n      \"live\": \"LANGSUNG\",\n      \"openFeed\": \"Buka feed langsung\",\n      \"resume\": \"Lanjutkan pembaruan langsung\",\n      \"pause\": \"Jeda pembaruan langsung\",\n      \"title\": \"Pembaruan langsung\",\n      \"viewAll\": \"Lihat semua pembaruan\",\n      \"newestFirst\": \"Terbaru lebih dulu\",\n      \"oldestFirst\": \"Terlama lebih dulu\",\n      \"sortOldestFirst\": \"Urutkan yang terlama\",\n      \"sortNewestFirst\": \"Urutkan yang terbaru\",\n      \"newUpdate\": \"{count} pembaruan baru\",\n      \"newUpdates\": \"{count} pembaruan baru\",\n      \"loading\": \"Memuat pembaruan langsung…\",\n      \"loadError\": \"Tidak dapat memuat pembaruan langsung.\",\n      \"tryAgain\": \"Coba lagi\",\n      \"empty\": \"Belum ada pembaruan langsung.\",\n      \"latest\": \"TERBARU\",\n      \"loadingEarlier\": \"Memuat…\",\n      \"loadEarlier\": \"Muat pembaruan sebelumnya\",\n      \"backToNews\": \"Kembali ke berita\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Ringkasan pasar harian\",\n      \"title\": \"Ringkasan pasar hari ini\",\n      \"description\": \"Ringkasan video harian yang singkat tentang pergerakan penting dan apa yang perlu dipantau berikutnya.\",\n      \"cta\": \"Lihat pembaruan lengkap\",\n      \"share\": \"Bagikan\",\n      \"noVideo\": \"Video belum tersedia.\",\n      \"copied\": \"Tersalin!\",\n      \"copyLink\": \"Salin tautan\",\n      \"shareOn\": \"Bagikan di {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Penggerak Pasar\",\n    \"active\": \"Paling Aktif\",\n    \"gainers\": \"Naik\",\n    \"losers\": \"Turun\",\n    \"noData\": \"Tidak ada data\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"15 menit terakhir\",\n      \"1h\": \"Satu jam terakhir\",\n      \"1d\": \"Satu hari terakhir\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Minyak Mentah\",\n      \"gold\": \"Emas\",\n      \"silver\": \"Perak\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Rekomendasi analis\",\n    \"strongSell\": \"Jual kuat\",\n    \"moderateSell\": \"Jual moderat\",\n    \"hold\": \"Tahan\",\n    \"moderateBuy\": \"Beli moderat\",\n    \"strongBuy\": \"Beli kuat\",\n    \"sell\": \"Jual\",\n    \"buy\": \"Beli\",\n    \"averageTarget\": \"Target rata-rata\",\n    \"noData\": \"Tidak ada rekomendasi analis untuk aset ini.\",\n    \"loadError\": \"Rekomendasi analis tidak dapat dimuat.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Pembukaan\",\n    \"close\": \"Penutupan\",\n    \"dayRange\": \"Rentang Hari\",\n    \"volume\": \"Volume\",\n    \"keyStatistics\": \"Statistik Utama\",\n    \"performance\": \"Kinerja\",\n    \"week1\": \"1 Minggu\",\n    \"month1\": \"1 Bulan\",\n    \"month3\": \"3 Bulan\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Konsensus Analis\",\n    \"relatedNews\": \"Berita Terkait\",\n    \"noData\": \"Tidak ada data\",\n    \"loadError\": \"Gagal memuat data\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"مبدل ارز\",\n    \"from\": \"از\",\n    \"to\": \"به\",\n    \"amount\": \"مبلغ / مقدار\",\n    \"convert\": \"تبدیل\",\n    \"result\": \"نتیجه\"\n  },\n  \"fibonacci\": {\n    \"title\": \"فیبوناچی\",\n    \"uptrend\": \"روند صعودی\",\n    \"downtrend\": \"روند نزولی\",\n    \"high\": \"بالاترین قیمت (نقطه b)\",\n    \"low\": \"پایین‌ترین قیمت (نقطه a)\",\n    \"retracements\": \"بازگشت‌ها یا اصلاحات قیمتی\",\n    \"extensions\": \"گسترش‌ها یا امتدادهای قیمتی\",\n    \"values\": \"مقادیر\",\n    \"result\": \"نتیجه\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"ماشین حساب مارجین\",\n    \"leverage\": \"اهرم معاملاتی\",\n    \"lotSize\": \"حجم معامله به لات\",\n    \"accountCurrency\": \"ارز پایه حساب\",\n    \"currencyPair\": \"جفت‌ارز\",\n    \"accountType\": \"نوع حساب\",\n    \"price\": \"قیمت تبدیل فعلی\",\n    \"requiredMargin\": \"مارجین مورد نیاز\",\n    \"result\": \"نتیجه\"\n  },\n  \"pivots\": {\n    \"title\": \"پیوت ها\",\n    \"classic\": \"کلاسیک\",\n    \"woodie\": \"وودی\",\n    \"camarilla\": \"کاماریلا\",\n    \"demark\": \"دمارک\",\n    \"high\": \"قیمت بالا\",\n    \"low\": \"قیمت پایین\",\n    \"open\": \"قیمت باز شدن\",\n    \"close\": \"قیمت بسته شدن\",\n    \"pivotPoints\": \"Pivot Points\",\n    \"res-4\": \"مقاومت چهارم\",\n    \"res-3\": \"مقاومت سوم\",\n    \"res-2\": \"مقاومت دوم\",\n    \"res-1\": \"مقاومت اول\",\n    \"pivot\": \"نقطه پیوت\",\n    \"sup-1\": \"حمایت اول\",\n    \"sup-2\": \"حمایت دوم\",\n    \"sup-3\": \"حمایت سوم\",\n    \"sup-4\": \"حمایت چهارم\",\n    \"result\": \"نتیجه\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"توقف ضرر / کسب سود\",\n    \"buy\": \"خرید\",\n    \"sell\": \"فروش\",\n    \"open\": \"باز\",\n    \"value\": \"ارزش/پیپ\",\n    \"lots\": \"لات‌ها\",\n    \"stop\": \"توقف\",\n    \"Limit\": \"حد\",\n    \"maxLoss\": \"حداکثر ضرر\",\n    \"maxProfit\": \"حداکثر سود\",\n    \"result\": \"نتیجه\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"سطوح توقف ضرر / کسب سود\",\n    \"buy\": \"خرید\",\n    \"sell\": \"فروش\",\n    \"open\": \"باز\",\n    \"value\": \"ارزش/پیپ\",\n    \"lots\": \"لات‌ها\",\n    \"risk\": \"مقدار ریسک\",\n    \"gain\": \"مقدار سود\",\n    \"stopLoss\": \"حد ضرر در\",\n    \"takeProfit\": \"حد سود در\",\n    \"stopLossPips\": \"توقف ضرر (پیپ‌)\",\n    \"takeProfitPips\": \"برداشت سود (پیپ‌)\",\n    \"result\": \"نتیجه\"\n  },\n  \"heatmap\": {\n    \"title\": \"نقشه حرارتی\",\n    \"currencies\": \"ارزها\",\n    \"value\": \"مقدار\",\n    \"result\": \"نتیجه\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"درون روز ۱۵ دقیقه\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"درون روز ۶۰ دقیقه\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"درون روز ۲۴۰ دقیقه\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"روزانه\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"هفتگی\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"ماهانه\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"تقویم اقتصادی\",\n    \"impact\": \"تأثیر\",\n    \"high\": \"زیاد\",\n    \"medium\": \"متوسط\",\n    \"low\": \"کم\",\n    \"countries\": \"کشورها\",\n    \"customRange\": \"بازه سفارشی\",\n    \"yesterday\": \"دیروز\",\n    \"today\": \"امروز\",\n    \"tomorrow\": \"فردا\",\n    \"thisWeek\": \"این هفته\",\n    \"lastWeek\": \"هفته گذشته\",\n    \"nextWeek\": \"هفته آینده\",\n    \"noEventsFound\": \"رویدادی یافت نشد\",\n    \"event\": \"رویداد\",\n    \"actual\": \"مقدار واقعی\",\n    \"forecast\": \"پیش‌بینی\",\n    \"previous\": \"قبلی\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"زمان\",\n        \"news\": \"اخبار\",\n        \"impact\": \"تأثیر\",\n        \"impactedCurrency\": \"ارز تحت تأثیر\",\n        \"actual\": \"مقدار واقعی\",\n        \"forecast\": \"پیش‌بینی\",\n        \"prior\": \"قبلی\",\n        \"impactedInstruments\": \"ابزارهای تحت تأثیر\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"تاریخ‌های سفارشی\",\n        \"selectDateRange\": \"انتخاب بازه تاریخی\",\n        \"startDate\": \"تاریخ شروع\",\n        \"endDate\": \"تاریخ پایان\",\n        \"apply\": \"اعمال\"\n      },\n      \"andMore\": \"و بیشتر\",\n      \"stocks\": {\n        \"splits\": \"تقسیم سهام\",\n        \"earnings\": \"درآمد\",\n        \"dividends\": \"سود سهام\",\n        \"stockSplit\": \"تقسیم سهام\",\n        \"dividend\": \"سود سهام\",\n        \"epsActual\": \"EPS واقعی\",\n        \"epsForecast\": \"EPS پیش‌بینی\",\n        \"revenueActual\": \"درآمد واقعی\",\n        \"revenueForecast\": \"درآمد پیش‌بینی\",\n        \"exDate\": \"تاریخ اکس\",\n        \"cycle\": \"چرخه\",\n        \"payment\": \"پرداخت\",\n        \"yield\": \"بازده\",\n        \"ratio\": \"نسبت\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"سیگنال‌ها\",\n    \"support\": \"حمایت\",\n    \"resistance\": \"مقاومت\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"جستجو در واژه‌نامه...\",\n    \"noResults\": \"هیچ نتیجه‌ای یافت نشد.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"همه\",\n      \"forex\": \"فارکس\",\n      \"stock\": \"سهام\",\n      \"crypto\": \"ارز دیجیتال\",\n      \"cmd\": \"کالاها\",\n      \"worldec\": \"اقتصاد جهانی\",\n      \"regec\": \"اقتصاد منطقه‌ای\"\n    },\n    \"searchPlaceholder\": \"جستجوی اخبار، بازارها و نمادها...\",\n    \"searchLabel\": \"جستجوی اخبار\",\n    \"articleCategoriesLabel\": \"دسته‌بندی مقالات\",\n    \"latestNews\": \"تازه‌ترین اخبار\",\n    \"noSearchResults\": \"مقاله‌ای مطابق جستجوی شما یافت نشد.\",\n    \"loading\": \"در حال بارگذاری...\",\n    \"loadMore\": \"نمایش بیشتر\",\n    \"popularTopics\": \"موضوعات محبوب\",\n    \"relatedNews\": \"اخبار مرتبط\",\n    \"back\": \"بازگشت\",\n    \"share\": \"اشتراک‌گذاری\",\n    \"readingTime\": \"زمان مطالعه: {minutes} دقیقه\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"آخرین به‌روزرسانی زنده\",\n      \"live\": \"زنده\",\n      \"openFeed\": \"باز کردن خبرهای زنده\",\n      \"resume\": \"ادامه به‌روزرسانی‌های زنده\",\n      \"pause\": \"توقف به‌روزرسانی‌های زنده\",\n      \"title\": \"به‌روزرسانی‌های زنده\",\n      \"viewAll\": \"مشاهده همه به‌روزرسانی‌ها\",\n      \"newestFirst\": \"جدیدترین ابتدا\",\n      \"oldestFirst\": \"قدیمی‌ترین ابتدا\",\n      \"sortOldestFirst\": \"مرتب‌سازی از قدیمی‌ترین\",\n      \"sortNewestFirst\": \"مرتب‌سازی از جدیدترین\",\n      \"newUpdate\": \"{count} به‌روزرسانی جدید\",\n      \"newUpdates\": \"{count} به‌روزرسانی جدید\",\n      \"loading\": \"در حال بارگذاری به‌روزرسانی‌های زنده…\",\n      \"loadError\": \"بارگذاری به‌روزرسانی‌های زنده ممکن نشد.\",\n      \"tryAgain\": \"تلاش دوباره\",\n      \"empty\": \"هنوز به‌روزرسانی زنده‌ای وجود ندارد.\",\n      \"latest\": \"جدیدترین\",\n      \"loadingEarlier\": \"در حال بارگذاری…\",\n      \"loadEarlier\": \"بارگذاری به‌روزرسانی‌های قبلی\",\n      \"backToNews\": \"بازگشت به اخبار\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"خلاصه روزانه بازار\",\n      \"title\": \"خلاصه بازار امروز\",\n      \"description\": \"خلاصه ویدیویی روزانه از حرکت‌های مهم بازار و مواردی که باید در ادامه دنبال کرد.\",\n      \"cta\": \"مشاهده به‌روزرسانی کامل\",\n      \"share\": \"اشتراک‌گذاری\",\n      \"noVideo\": \"هنوز ویدیویی موجود نیست.\",\n      \"copied\": \"کپی شد!\",\n      \"copyLink\": \"کپی لینک\",\n      \"shareOn\": \"اشتراک‌گذاری در {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"نمادهای برتر بازار\",\n    \"active\": \"پرتراکنش‌ترین\",\n    \"gainers\": \"بیشترین رشد\",\n    \"losers\": \"بیشترین افت\",\n    \"noData\": \"داده‌ای موجود نیست\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"۱۵ دقیقه گذشته\",\n      \"1h\": \"یک ساعت گذشته\",\n      \"1d\": \"یک روز گذشته\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"نفت خام\",\n      \"gold\": \"طلا\",\n      \"silver\": \"نقره\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"توصیه‌های تحلیلگران\",\n    \"strongSell\": \"فروش قوی\",\n    \"moderateSell\": \"فروش متوسط\",\n    \"hold\": \"نگهداری\",\n    \"moderateBuy\": \"خرید متوسط\",\n    \"strongBuy\": \"خرید قوی\",\n    \"sell\": \"فروش\",\n    \"buy\": \"خرید\",\n    \"averageTarget\": \"هدف قیمتی میانگین\",\n    \"noData\": \"برای این دارایی توصیه تحلیلگری موجود نیست.\",\n    \"loadError\": \"بارگیری توصیه‌های تحلیلگران ممکن نشد.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"باز شدن\",\n    \"close\": \"بسته شدن\",\n    \"dayRange\": \"دامنه روزانه\",\n    \"volume\": \"حجم\",\n    \"keyStatistics\": \"آمار کلیدی\",\n    \"performance\": \"عملکرد\",\n    \"week1\": \"1 هفته\",\n    \"month1\": \"1 ماه\",\n    \"month3\": \"3 ماه\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"اجماع تحلیلگران\",\n    \"relatedNews\": \"اخبار مرتبط\",\n    \"noData\": \"داده‌ای موجود نیست\",\n    \"loadError\": \"بارگذاری داده‌ها امکان‌پذیر نیست\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Convertitore di Valuta\",\n    \"from\": \"da\",\n    \"to\": \"a\",\n    \"amount\": \"importo\",\n    \"convert\": \"Converti\",\n    \"result\": \"Risultato\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"tenenza al rialzo\",\n    \"downtrend\": \"tendenza al ribasso\",\n    \"high\": \"Massimo\",\n    \"low\": \"Minimo\",\n    \"retracements\": \"Rintracciamenti\",\n    \"extensions\": \"Estensioni\",\n    \"values\": \"Valori\",\n    \"result\": \"Risultato\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Calcolatore di Margine\",\n    \"leverage\": \"leva\",\n    \"lotSize\": \"Volume in lotti\",\n    \"accountCurrency\": \"Valuta di base del conto\",\n    \"currencyPair\": \"Coppia di valute\",\n    \"accountType\": \"Tipo di conto\",\n    \"price\": \"prezzo di conversione attuale\",\n    \"requiredMargin\": \"margine richiesto\",\n    \"result\": \"Risultato\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivots\",\n    \"classic\": \"Classico\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Prezzo massimo\",\n    \"low\": \"Prezzo minimo\",\n    \"open\": \"Prezzo aperto\",\n    \"close\": \"Prezzo chiuso\",\n    \"pivotPoints\": \"Punti Pivot\",\n    \"res-4\": \"4 Resistenza\",\n    \"res-3\": \"3 Resistenza\",\n    \"res-2\": \"2 Resistenza\",\n    \"res-1\": \"1 Resistenza\",\n    \"pivot\": \"Punto pivot\",\n    \"sup-1\": \"1 Supporto\",\n    \"sup-2\": \"2 Supporto\",\n    \"sup-3\": \"3 Supporto\",\n    \"sup-4\": \"4 Supporto\",\n    \"result\": \"Risultato\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"buy\": \"Compra/Lungo\",\n    \"sell\": \"Vendi/Corto\",\n    \"open\": \"Aperto\",\n    \"value\": \"Valore/Pip\",\n    \"lots\": \"Lotti\",\n    \"stop\": \"Stop\",\n    \"Limit\": \"Limite\",\n    \"maxLoss\": \"perdita massima\",\n    \"maxProfit\": \"profitto massimo\",\n    \"result\": \"Risultato\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Livelli di Stop Loss / Take Profit\",\n    \"buy\": \"Compra/Lungo\",\n    \"sell\": \"Vendi/Corto\",\n    \"open\": \"Aperto\",\n    \"value\": \"Valore/Pip\",\n    \"lots\": \"Lotti\",\n    \"risk\": \"Importo a rischio\",\n    \"gain\": \"Importo da guadagnare\",\n    \"stopLoss\": \"Stop Loss a\",\n    \"takeProfit\": \"Take Profit a\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Risultato\"\n  },\n  \"heatmap\": {\n    \"title\": \"Mappa di Calore\",\n    \"currencies\": \"Valute\",\n    \"value\": \"Valore\",\n    \"result\": \"Risultato\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday a 15 minuti\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday a 60 minuti\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday a 240 minuti\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Giornaliero\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Settimanale\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Mensile\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Calendario Economico\",\n    \"impact\": \"Impatto\",\n    \"high\": \"Alto\",\n    \"medium\": \"Medio\",\n    \"low\": \"Basso\",\n    \"countries\": \"Paesi\",\n    \"customRange\": \"Intervallo personalizzato\",\n    \"yesterday\": \"Ieri\",\n    \"today\": \"Oggi\",\n    \"tomorrow\": \"Domani\",\n    \"thisWeek\": \"Questa settimana\",\n    \"lastWeek\": \"La settimana scorsa\",\n    \"nextWeek\": \"La settimana prossima\",\n    \"noEventsFound\": \"Nessun evento trovato\",\n    \"event\": \"Evento\",\n    \"actual\": \"Attuale\",\n    \"forecast\": \"Previsione\",\n    \"previous\": \"Precedente\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Ora\",\n        \"news\": \"Notizia\",\n        \"impact\": \"Impatto\",\n        \"impactedCurrency\": \"Valuta interessata\",\n        \"actual\": \"Attuale\",\n        \"forecast\": \"Previsione\",\n        \"prior\": \"Precedente\",\n        \"impactedInstruments\": \"Strumenti interessati\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Date personalizzate\",\n        \"selectDateRange\": \"Seleziona intervallo di date\",\n        \"startDate\": \"Data di inizio\",\n        \"endDate\": \"Data di fine\",\n        \"apply\": \"Applica\"\n      },\n      \"andMore\": \"e altro\",\n      \"stocks\": {\n        \"splits\": \"Frazionamenti\",\n        \"earnings\": \"Utili\",\n        \"dividends\": \"Dividendi\",\n        \"stockSplit\": \"Frazionamento azionario\",\n        \"dividend\": \"Dividendo\",\n        \"epsActual\": \"EPS effettivo\",\n        \"epsForecast\": \"EPS previsto\",\n        \"revenueActual\": \"Ricavi effettivi\",\n        \"revenueForecast\": \"Ricavi previsti\",\n        \"exDate\": \"Data stacco\",\n        \"cycle\": \"Ciclo\",\n        \"payment\": \"Pagamento\",\n        \"yield\": \"Rendimento\",\n        \"ratio\": \"Rapporto\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Segnali\",\n    \"support\": \"Supporto\",\n    \"resistance\": \"Resistenza\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Cerca nel glossario...\",\n    \"noResults\": \"Nessun risultato trovato.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Tutti\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Azioni\",\n      \"crypto\": \"Cripto\",\n      \"cmd\": \"Materie prime\",\n      \"worldec\": \"Economia mondiale\",\n      \"regec\": \"Economia regionale\"\n    },\n    \"searchPlaceholder\": \"Cerca notizie, mercati, simboli...\",\n    \"searchLabel\": \"Cerca notizie\",\n    \"articleCategoriesLabel\": \"Categorie degli articoli\",\n    \"latestNews\": \"Ultime notizie\",\n    \"noSearchResults\": \"Nessun articolo corrisponde alla ricerca.\",\n    \"loading\": \"Caricamento...\",\n    \"loadMore\": \"Carica altro\",\n    \"popularTopics\": \"Argomenti popolari\",\n    \"relatedNews\": \"Notizie correlate\",\n    \"back\": \"Indietro\",\n    \"share\": \"Condividi\",\n    \"readingTime\": \"{minutes} min di lettura\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Ultimo aggiornamento in diretta\",\n      \"live\": \"IN DIRETTA\",\n      \"openFeed\": \"Apri il feed in diretta\",\n      \"resume\": \"Riprendi gli aggiornamenti in diretta\",\n      \"pause\": \"Metti in pausa gli aggiornamenti in diretta\",\n      \"title\": \"Aggiornamenti in diretta\",\n      \"viewAll\": \"Visualizza tutti gli aggiornamenti\",\n      \"newestFirst\": \"Più recenti prima\",\n      \"oldestFirst\": \"Meno recenti prima\",\n      \"sortOldestFirst\": \"Ordina dai meno recenti\",\n      \"sortNewestFirst\": \"Ordina dai più recenti\",\n      \"newUpdate\": \"{count} nuovo aggiornamento\",\n      \"newUpdates\": \"{count} nuovi aggiornamenti\",\n      \"loading\": \"Caricamento degli aggiornamenti in diretta…\",\n      \"loadError\": \"Impossibile caricare gli aggiornamenti in diretta.\",\n      \"tryAgain\": \"Riprova\",\n      \"empty\": \"Nessun aggiornamento in diretta.\",\n      \"latest\": \"PIÙ RECENTE\",\n      \"loadingEarlier\": \"Caricamento…\",\n      \"loadEarlier\": \"Carica aggiornamenti precedenti\",\n      \"backToNews\": \"Torna alle notizie\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Brief quotidiano sul mercato\",\n      \"title\": \"Il brief di mercato di oggi\",\n      \"description\": \"Un breve video quotidiano sui movimenti che contano e su cosa tenere d’occhio dopo.\",\n      \"cta\": \"Scopri l’aggiornamento completo\",\n      \"share\": \"Condividi\",\n      \"noVideo\": \"Nessun video disponibile al momento.\",\n      \"copied\": \"Copiato!\",\n      \"copyLink\": \"Copia link\",\n      \"shareOn\": \"Condividi su {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Movimenti di mercato\",\n    \"active\": \"Più attivi\",\n    \"gainers\": \"In rialzo\",\n    \"losers\": \"In ribasso\",\n    \"noData\": \"Nessun dato\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Ultimi 15 minuti\",\n      \"1h\": \"Ultima ora\",\n      \"1d\": \"Ultimo giorno\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Petrolio greggio\",\n      \"gold\": \"Oro\",\n      \"silver\": \"Argento\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Raccomandazioni degli analisti\",\n    \"strongSell\": \"Vendita forte\",\n    \"moderateSell\": \"Vendita moderata\",\n    \"hold\": \"Mantenere\",\n    \"moderateBuy\": \"Acquisto moderato\",\n    \"strongBuy\": \"Acquisto forte\",\n    \"sell\": \"Vendita\",\n    \"buy\": \"Acquisto\",\n    \"averageTarget\": \"Target medio\",\n    \"noData\": \"Non sono disponibili raccomandazioni degli analisti per questo asset.\",\n    \"loadError\": \"Impossibile caricare le raccomandazioni degli analisti.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Apertura\",\n    \"close\": \"Chiusura\",\n    \"dayRange\": \"Range giornaliero\",\n    \"volume\": \"Volume\",\n    \"keyStatistics\": \"Statistiche chiave\",\n    \"performance\": \"Performance\",\n    \"week1\": \"1 settimana\",\n    \"month1\": \"1 mese\",\n    \"month3\": \"3 mesi\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Consenso analisti\",\n    \"relatedNews\": \"Notizie correlate\",\n    \"noData\": \"Nessun dato disponibile\",\n    \"loadError\": \"Impossibile caricare i dati\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"通貨コンバーター\",\n    \"from\": \"基本通貨\",\n    \"to\": \"相対通貨\",\n    \"amount\": \"金額\",\n    \"convert\": \"変換\",\n    \"result\": \"結果\"\n  },\n  \"fibonacci\": {\n    \"title\": \"フィボナッチ\",\n    \"uptrend\": \"上昇トレンド\",\n    \"downtrend\": \"下降トレンド\",\n    \"high\": \"高値\",\n    \"low\": \"安値\",\n    \"retracements\": \"リトレースメント\",\n    \"extensions\": \"エクステンション\",\n    \"values\": \"値\",\n    \"result\": \"結果\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"マージン計算機\",\n    \"leverage\": \"レバレッジ\",\n    \"lotSize\": \"ロット数\",\n    \"accountCurrency\": \"アカウント基準通貨\",\n    \"currencyPair\": \"通貨ペア\",\n    \"accountType\": \"アカウントの種類\",\n    \"price\": \"現在の換算価格\",\n    \"requiredMargin\": \"必要証拠金\",\n    \"result\": \"結果\"\n  },\n  \"pivots\": {\n    \"title\": \"ピボット\",\n    \"classic\": \"標準\",\n    \"woodie\": \"ウッディ\",\n    \"camarilla\": \"カマリリャ\",\n    \"demark\": \"デマーク\",\n    \"high\": \"高値\",\n    \"low\": \"安値\",\n    \"open\": \"始値\",\n    \"close\": \"終値\",\n    \"pivotPoints\": \"ピボットポイント\",\n    \"res-4\": \"レジスタンス4\",\n    \"res-3\": \"レジスタンス3\",\n    \"res-2\": \"レジスタンス2\",\n    \"res-1\": \"レジスタンス1\",\n    \"pivot\": \"ピボット・ポイント\",\n    \"sup-1\": \"サポート1\",\n    \"sup-2\": \"サポート2\",\n    \"sup-3\": \"サポート3\",\n    \"sup-4\": \"サポート4\",\n    \"result\": \"結果\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"ストップロス / テイクプロフィット\",\n    \"buy\": \"買い/ ロング\",\n    \"sell\": \"売る/ショート\",\n    \"open\": \"オープン\",\n    \"value\": \"数値/ピップ\",\n    \"lots\": \"ロット\",\n    \"stop\": \"逆指値\",\n    \"Limit\": \"指値\",\n    \"maxLoss\": \"最大損失額\",\n    \"maxProfit\": \"最大利益\",\n    \"result\": \"結果\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"ストップロス / テイクプロフィットレベル\",\n    \"buy\": \"買い/ ロング\",\n    \"sell\": \"売る/ショート\",\n    \"open\": \"オープン\",\n    \"value\": \"数値/ピップ\",\n    \"lots\": \"ロット\",\n    \"risk\": \"リスク額\",\n    \"gain\": \"利益額\",\n    \"stopLoss\": \"逆指値\",\n    \"takeProfit\": \"テイクプロフィット\",\n    \"stopLossPips\": \"逆指値（ピップス）\",\n    \"takeProfitPips\": \" テイクプロフィット(ピップス)\",\n    \"result\": \"結果\"\n  },\n  \"heatmap\": {\n    \"title\": \"ヒートマップ\",\n    \"currencies\": \"通貨\",\n    \"value\": \"価値\",\n    \"result\": \"結果\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"１５分足\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"１時間足\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"４時間足\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"日足\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"週足\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"月足\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"経済カレンダー\",\n    \"impact\": \"重要度\",\n    \"high\": \"高\",\n    \"medium\": \"中\",\n    \"low\": \"低\",\n    \"countries\": \"国\",\n    \"customRange\": \"カスタム範囲\",\n    \"yesterday\": \"昨日\",\n    \"today\": \"今日\",\n    \"tomorrow\": \"明日\",\n    \"thisWeek\": \"今週\",\n    \"lastWeek\": \"先週\",\n    \"nextWeek\": \"来週\",\n    \"noEventsFound\": \"イベントが見つかりませんでした\",\n    \"event\": \"イベント\",\n    \"actual\": \"結果\",\n    \"forecast\": \"予想\",\n    \"previous\": \"前回\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"時間\",\n        \"news\": \"ニュース\",\n        \"impact\": \"影響度\",\n        \"impactedCurrency\": \"影響を受ける通貨\",\n        \"actual\": \"結果\",\n        \"forecast\": \"予想\",\n        \"prior\": \"前回\",\n        \"impactedInstruments\": \"影響を受ける商品\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"カスタム日付\",\n        \"selectDateRange\": \"日付範囲を選択\",\n        \"startDate\": \"開始日\",\n        \"endDate\": \"終了日\",\n        \"apply\": \"適用\"\n      },\n      \"andMore\": \"その他\",\n      \"stocks\": {\n        \"splits\": \"株式分割\",\n        \"earnings\": \"決算\",\n        \"dividends\": \"配当\",\n        \"stockSplit\": \"株式分割\",\n        \"dividend\": \"配当\",\n        \"epsActual\": \"EPS実績\",\n        \"epsForecast\": \"EPS予想\",\n        \"revenueActual\": \"売上実績\",\n        \"revenueForecast\": \"売上予想\",\n        \"exDate\": \"権利落ち日\",\n        \"cycle\": \"サイクル\",\n        \"payment\": \"支払\",\n        \"yield\": \"利回り\",\n        \"ratio\": \"比率\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"シグナル\",\n    \"support\": \"支持レベル\",\n    \"resistance\": \"抵抗レベル\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"用語集を検索...\",\n    \"noResults\": \"結果が見つかりません。\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"すべて\",\n      \"forex\": \"外国為替\",\n      \"stock\": \"株式\",\n      \"crypto\": \"暗号資産\",\n      \"cmd\": \"コモディティ\",\n      \"worldec\": \"世界経済\",\n      \"regec\": \"地域経済\"\n    },\n    \"searchPlaceholder\": \"ニュース、市場、銘柄を検索...\",\n    \"searchLabel\": \"ニュースを検索\",\n    \"articleCategoriesLabel\": \"記事カテゴリー\",\n    \"latestNews\": \"最新ニュース\",\n    \"noSearchResults\": \"検索条件に一致する記事はありません。\",\n    \"loading\": \"読み込み中...\",\n    \"loadMore\": \"もっと見る\",\n    \"popularTopics\": \"人気のトピック\",\n    \"relatedNews\": \"関連記事\",\n    \"back\": \"戻る\",\n    \"share\": \"共有\",\n    \"readingTime\": \"読了目安：{minutes}分\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"最新のライブ更新\",\n      \"live\": \"ライブ\",\n      \"openFeed\": \"ライブフィードを開く\",\n      \"resume\": \"ライブ更新を再開\",\n      \"pause\": \"ライブ更新を一時停止\",\n      \"title\": \"ライブ更新\",\n      \"viewAll\": \"すべての更新を見る\",\n      \"newestFirst\": \"新しい順\",\n      \"oldestFirst\": \"古い順\",\n      \"sortOldestFirst\": \"古い順に並べ替え\",\n      \"sortNewestFirst\": \"新しい順に並べ替え\",\n      \"newUpdate\": \"新着更新 {count}件\",\n      \"newUpdates\": \"新着更新 {count}件\",\n      \"loading\": \"ライブ更新を読み込み中…\",\n      \"loadError\": \"ライブ更新を読み込めませんでした。\",\n      \"tryAgain\": \"再試行\",\n      \"empty\": \"ライブ更新はまだありません。\",\n      \"latest\": \"最新\",\n      \"loadingEarlier\": \"読み込み中…\",\n      \"loadEarlier\": \"過去の更新を読み込む\",\n      \"backToNews\": \"ニュースに戻る\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"デイリーマーケットブリーフ\",\n      \"title\": \"本日のマーケットブリーフ\",\n      \"description\": \"注目すべき動きと次に注目すべきポイントを、毎日の動画で簡潔にお届けします。\",\n      \"cta\": \"最新情報をすべて見る\",\n      \"share\": \"シェア\",\n      \"noVideo\": \"動画はまだありません。\",\n      \"copied\": \"コピーしました！\",\n      \"copyLink\": \"リンクをコピー\",\n      \"shareOn\": \"{name}でシェア\"\n  },\n  \"topMovers\": {\n    \"title\": \"マーケットムーバー\",\n    \"active\": \"出来高上位\",\n    \"gainers\": \"値上がり\",\n    \"losers\": \"値下がり\",\n    \"noData\": \"データがありません\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"過去15分間\",\n      \"1h\": \"過去1時間\",\n      \"1d\": \"過去1日間\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"原油\",\n      \"gold\": \"金\",\n      \"silver\": \"銀\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"アナリストの推奨\",\n    \"strongSell\": \"強い売り\",\n    \"moderateSell\": \"適度な売り\",\n    \"hold\": \"保有\",\n    \"moderateBuy\": \"適度な買い\",\n    \"strongBuy\": \"強い買い\",\n    \"sell\": \"売り\",\n    \"buy\": \"買い\",\n    \"averageTarget\": \"平均目標価格\",\n    \"noData\": \"この資産のアナリスト推奨はありません。\",\n    \"loadError\": \"アナリスト推奨を読み込めませんでした。\"\n  },\n  \"assetOverview\": {\n    \"open\": \"始値\",\n    \"close\": \"終値\",\n    \"dayRange\": \"日中値幅\",\n    \"volume\": \"出来高\",\n    \"keyStatistics\": \"主要指標\",\n    \"performance\": \"パフォーマンス\",\n    \"week1\": \"1週間\",\n    \"month1\": \"1ヶ月\",\n    \"month3\": \"3ヶ月\",\n    \"ytd\": \"年初来\",\n    \"analystConsensus\": \"アナリスト総意\",\n    \"relatedNews\": \"関連ニュース\",\n    \"noData\": \"データなし\",\n    \"loadError\": \"データの読み込み失敗\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Penukar Mata Wang\",\n    \"from\": \"Daripada\",\n    \"to\": \"Kepada\",\n    \"amount\": \"Jumlah\",\n    \"convert\": \"Tukar\",\n    \"result\": \"Keputusan\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Aliran Menaik\",\n    \"downtrend\": \"Aliran Menurun\",\n    \"high\": \"Tinggi\",\n    \"low\": \"Rendah\",\n    \"retracements\": \"Penarikan Semula\",\n    \"extensions\": \"Sambungan\",\n    \"values\": \"Nilai\",\n    \"result\": \"Keputusan\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Kalkulator Margin\",\n    \"leverage\": \"Kesulitan\",\n    \"lotSize\": \"Isipadu dalam Lots\",\n    \"accountCurrency\": \"Mata Wang Asas Akaun\",\n    \"currencyPair\": \"Pasangan Mata Wang\",\n    \"accountType\": \"Jenis Akaun\",\n    \"price\": \"Harga Penukaran Semasa\",\n    \"requiredMargin\": \"Jidar yang diperlukan\",\n    \"result\": \"Keputusan\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivots\",\n    \"classic\": \"Klasik\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Harga Tinggi\",\n    \"low\": \"Harga Rendah\",\n    \"open\": \"Harga Buka\",\n    \"close\": \"Harga Tutup\",\n    \"pivotPoints\": \"Titik Tunjang\",\n    \"res-4\": \"4 Rintangan\",\n    \"res-3\": \"3 Rintangan\",\n    \"res-2\": \"2 Rintangan\",\n    \"res-1\": \"1 Rintangan\",\n    \"pivot\": \"Titik Tunjang\",\n    \"sup-1\": \"1 Sokongan\",\n    \"sup-2\": \"2 Sokongan\",\n    \"sup-3\": \"3 Sokongan\",\n    \"sup-4\": \"4 Sokongan\",\n    \"result\": \"Keputusan\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Henti Kerugian / Ambil Untung\",\n    \"buy\": \"Beli/Panjang\",\n    \"sell\": \"Jual/Pendek\",\n    \"open\": \"Buka\",\n    \"value\": \"Nilai/Pip\",\n    \"lots\": \"Lots\",\n    \"stop\": \"Henti\",\n    \"Limit\": \"Had\",\n    \"maxLoss\": \"Kerugian Maksimum\",\n    \"maxProfit\": \"Keuntungan Maksimum\",\n    \"result\": \"Keputusan\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Tahap Henti Kerugian / Ambil Untung\",\n    \"buy\": \"Beli/Panjang\",\n    \"sell\": \"Jual/Pendek\",\n    \"open\": \"Buka\",\n    \"value\": \"Nilai/Pip\",\n    \"lots\": \"Lots\",\n    \"risk\": \"Jumlah untuk Dirisiko\",\n    \"gain\": \"Jumlah untuk Diperolehi\",\n    \"stopLoss\": \"Hentian Kerugian pada\",\n    \"takeProfit\": \"Ambil Untung pada\",\n    \"stopLossPips\": \"Hentian Kerugian (Pip)\",\n    \"takeProfitPips\": \"Ambilan Keuntungan (Pip)\",\n    \"result\": \"Keputusan\"\n  },\n  \"heatmap\": {\n    \"title\": \"Peta Panas\",\n    \"currencies\": \"Matawang\",\n    \"value\": \"Nilai\",\n    \"result\": \"Keputusan\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intrahari15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intrahari60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intrahari240\"\n      },\n      \"1d\": {\n        \"short\": \"1H\",\n        \"long\": \"Harian\"\n      },\n      \"1w\": {\n        \"short\": \"1M\",\n        \"long\": \"Mingguan\"\n      },\n      \"1M\": {\n        \"short\": \"1B\",\n        \"long\": \"Bulanan\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Kalendar Ekonomi\",\n    \"impact\": \"Kesan\",\n    \"high\": \"Tinggi\",\n    \"medium\": \"Sederhana\",\n    \"low\": \"Rendah\",\n    \"countries\": \"Negara\",\n    \"customRange\": \"Julat Tersuai\",\n    \"yesterday\": \"Semalam\",\n    \"today\": \"Hari Ini\",\n    \"tomorrow\": \"Esok\",\n    \"thisWeek\": \"Minggu Ini\",\n    \"lastWeek\": \"Minggu Lalu\",\n    \"nextWeek\": \"Minggu Depan\",\n    \"noEventsFound\": \"Tiada Acara Ditemui\",\n    \"event\": \"Acara\",\n    \"actual\": \"Sebenarnya\",\n    \"forecast\": \"Ramalan\",\n    \"previous\": \"Sebelumnya\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"MASA\",\n        \"news\": \"BERITA\",\n        \"impact\": \"KESAN\",\n        \"impactedCurrency\": \"MATA WANG TERJEJAS\",\n        \"actual\": \"SEBENARNYA\",\n        \"forecast\": \"RAMALAN\",\n        \"prior\": \"SEBELUMNYA\",\n        \"impactedInstruments\": \"INSTRUMEN TERJEJAS\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Tarikh Tersuai\",\n        \"selectDateRange\": \"Pilih Julat Tarikh\",\n        \"startDate\": \"Tarikh Mula\",\n        \"endDate\": \"Tarikh Tamat\",\n        \"apply\": \"Guna\"\n      },\n      \"andMore\": \"dan lebih\",\n      \"stocks\": {\n        \"splits\": \"Pecahan\",\n        \"earnings\": \"Pendapatan\",\n        \"dividends\": \"Dividen\",\n        \"stockSplit\": \"Pecahan saham\",\n        \"dividend\": \"Dividen\",\n        \"epsActual\": \"EPS sebenar\",\n        \"epsForecast\": \"EPS ramalan\",\n        \"revenueActual\": \"Hasil sebenar\",\n        \"revenueForecast\": \"Hasil ramalan\",\n        \"exDate\": \"Tarikh ex-dividen\",\n        \"cycle\": \"Kitaran\",\n        \"payment\": \"Pembayaran\",\n        \"yield\": \"Kadar hasil\",\n        \"ratio\": \"Nisbah\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Isyarat\",\n    \"support\": \"Sokongan\",\n    \"resistance\": \"Rintangan\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Cari dalam glosari...\",\n    \"noResults\": \"Tiada keputusan ditemui.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Semua\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Saham\",\n      \"crypto\": \"Kripto\",\n      \"cmd\": \"Komoditi\",\n      \"worldec\": \"Ekonomi Dunia\",\n      \"regec\": \"Ekonomi Serantau\"\n    },\n    \"searchPlaceholder\": \"Cari berita, pasaran, simbol...\",\n    \"searchLabel\": \"Cari berita\",\n    \"articleCategoriesLabel\": \"Kategori artikel\",\n    \"latestNews\": \"Berita Terkini\",\n    \"noSearchResults\": \"Tiada artikel yang sepadan dengan carian anda.\",\n    \"loading\": \"Memuatkan...\",\n    \"loadMore\": \"Muatkan lagi\",\n    \"popularTopics\": \"Topik Popular\",\n    \"relatedNews\": \"Berita Berkaitan\",\n    \"back\": \"Kembali\",\n    \"share\": \"Kongsi\",\n    \"readingTime\": \"Masa bacaan: {minutes} minit\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Kemas kini langsung terkini\",\n      \"live\": \"LANGSUNG\",\n      \"openFeed\": \"Buka suapan langsung\",\n      \"resume\": \"Sambung kemas kini langsung\",\n      \"pause\": \"Jeda kemas kini langsung\",\n      \"title\": \"Kemas kini langsung\",\n      \"viewAll\": \"Lihat semua kemas kini\",\n      \"newestFirst\": \"Terbaharu dahulu\",\n      \"oldestFirst\": \"Terlama dahulu\",\n      \"sortOldestFirst\": \"Isih yang terlama dahulu\",\n      \"sortNewestFirst\": \"Isih yang terbaharu dahulu\",\n      \"newUpdate\": \"{count} kemas kini baharu\",\n      \"newUpdates\": \"{count} kemas kini baharu\",\n      \"loading\": \"Memuatkan kemas kini langsung…\",\n      \"loadError\": \"Tidak dapat memuatkan kemas kini langsung.\",\n      \"tryAgain\": \"Cuba lagi\",\n      \"empty\": \"Belum ada kemas kini langsung.\",\n      \"latest\": \"TERBAHARU\",\n      \"loadingEarlier\": \"Memuatkan…\",\n      \"loadEarlier\": \"Muatkan kemas kini terdahulu\",\n      \"backToNews\": \"Kembali ke berita\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Ringkasan pasaran harian\",\n      \"title\": \"Ringkasan pasaran hari ini\",\n      \"description\": \"Ringkasan video harian yang padat tentang pergerakan penting dan apa yang perlu diperhatikan seterusnya.\",\n      \"cta\": \"Terokai kemas kini penuh\",\n      \"share\": \"Kongsi\",\n      \"noVideo\": \"Video belum tersedia.\",\n      \"copied\": \"Disalin!\",\n      \"copyLink\": \"Salin pautan\",\n      \"shareOn\": \"Kongsi di {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Penggerak Pasaran\",\n    \"active\": \"Paling Aktif\",\n    \"gainers\": \"Untung\",\n    \"losers\": \"Rugi\",\n    \"noData\": \"Tiada data\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"15 minit lalu\",\n      \"1h\": \"1 jam lalu\",\n      \"1d\": \"1 hari lalu\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Minyak Mentah\",\n      \"gold\": \"Emas\",\n      \"silver\": \"Perak\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Cadangan penganalisis\",\n    \"strongSell\": \"Jual kukuh\",\n    \"moderateSell\": \"Jual sederhana\",\n    \"hold\": \"Pegang\",\n    \"moderateBuy\": \"Beli sederhana\",\n    \"strongBuy\": \"Beli kukuh\",\n    \"sell\": \"Jual\",\n    \"buy\": \"Beli\",\n    \"averageTarget\": \"Sasaran purata\",\n    \"noData\": \"Tiada cadangan penganalisis untuk aset ini.\",\n    \"loadError\": \"Cadangan penganalisis tidak dapat dimuatkan.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Buka\",\n    \"close\": \"Tutup\",\n    \"dayRange\": \"Julat Hari\",\n    \"volume\": \"Isipadu\",\n    \"keyStatistics\": \"Statistik Utama\",\n    \"performance\": \"Prestasi\",\n    \"week1\": \"1 Minggu\",\n    \"month1\": \"1 Bulan\",\n    \"month3\": \"3 Bulan\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Konsensus Analis\",\n    \"relatedNews\": \"Berita Berkaitan\",\n    \"noData\": \"Tiada data\",\n    \"loadError\": \"Tidak dapat memuatkan data\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Konwerter walut\",\n    \"from\": \"Od\",\n    \"to\": \"Do\",\n    \"amount\": \"Ilość\",\n    \"convert\": \"Konwertować\",\n    \"result\": \"Wynik\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Trend wzrostowy\",\n    \"downtrend\": \"Trend spadkowy\",\n    \"high\": \"Wysoki (b)\",\n    \"low\": \"Niski (a)\",\n    \"retracements\": \"Zniesienia\",\n    \"extensions\": \"Rozszerzenia\",\n    \"values\": \"Wartości\",\n    \"result\": \"Wynik\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Kalkulator marży\",\n    \"leverage\": \"Wpływ\",\n    \"lotSize\": \"Objętość w Partiach\",\n    \"accountCurrency\": \"Waluta Podstawowa Konta\",\n    \"currencyPair\": \"Para Walut\",\n    \"accountType\": \"Typ Konta\",\n    \"price\": \"Aktualna Cena Konwersji\",\n    \"requiredMargin\": \"Wymagany Depozyt Zabezpieczający\",\n    \"result\": \"Wynik\"\n  },\n  \"pivots\": {\n    \"title\": \"Obroty\",\n    \"classic\": \"Klasyczny\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Klika\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Wysoka Cena\",\n    \"low\": \"Niska Cena\",\n    \"open\": \"Otwórz Cenę\",\n    \"close\": \"Zamknij Cenę\",\n    \"pivotPoints\": \"Punkty obrotowe\",\n    \"res-4\": \"4 Opór\",\n    \"res-3\": \"3 Opór\",\n    \"res-2\": \"2 Opór\",\n    \"res-1\": \"1 Opór\",\n    \"pivot\": \"Punkt Obrotu\",\n    \"sup-1\": \"1 Wsparcie\",\n    \"sup-2\": \"2 Wsparcie\",\n    \"sup-3\": \"3 Wsparcie\",\n    \"sup-4\": \"4 Wsparcie\",\n    \"result\": \"Wynik\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Zatrzymaj stratę / Weź zysk\",\n    \"buy\": \"Kup / Długo\",\n    \"sell\": \"Sprzedaj / Krótko\",\n    \"open\": \"Otwórz\",\n    \"value\": \"Wartość/Pips\",\n    \"lots\": \"Partie\",\n    \"stop\": \"Zatrzymaj\",\n    \"Limit\": \"Limit\",\n    \"maxLoss\": \"Maksymalna Strata\",\n    \"maxProfit\": \"Maksymalny Zysk\",\n    \"result\": \"Wynik\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Poziomy Zatrzymaj stratę / Weź zysk\",\n    \"buy\": \"Kup / Długo\",\n    \"sell\": \"Sprzedaj / Krótko\",\n    \"open\": \"Otwórz\",\n    \"value\": \"Wartość/Pips\",\n    \"lots\": \"Partie\",\n    \"risk\": \"Kwota do Zaryzykowania\",\n    \"gain\": \"Kwota do Zdobycia\",\n    \"stopLoss\": \"Zatrzymaj stratę na\",\n    \"takeProfit\": \"Zdobądź zysk w\",\n    \"stopLossPips\": \"Stop Loss (pipsy)\",\n    \"takeProfitPips\": \"Zdobądź Zysk (pipsy)\",\n    \"result\": \"Wynik\"\n  },\n  \"heatmap\": {\n    \"title\": \"Mapa cieplna\",\n    \"currencies\": \"Waluty\",\n    \"value\": \"Wartość\",\n    \"result\": \"Wynik\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Dziennie\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Tygodniowo\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Miesięcznie\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Kalendarz Ekonomiczny\",\n    \"impact\": \"Wpływ\",\n    \"high\": \"Wysoki\",\n    \"medium\": \"Średni\",\n    \"low\": \"Niski\",\n    \"countries\": \"Kraje\",\n    \"customRange\": \"Zakres niestandardowy\",\n    \"yesterday\": \"Wczoraj\",\n    \"today\": \"Dziś\",\n    \"tomorrow\": \"Jutro\",\n    \"thisWeek\": \"W tym tygodniu\",\n    \"lastWeek\": \"W zeszłym tygodniu\",\n    \"nextWeek\": \"W następnym tygodniu\",\n    \"noEventsFound\": \"Nie znaleziono wydarzeń\",\n    \"event\": \"Wydarzenie\",\n    \"actual\": \"Rzeczywisty\",\n    \"forecast\": \"Prognoza\",\n    \"previous\": \"Poprzedni\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Czas\",\n        \"news\": \"Wiadomości\",\n        \"impact\": \"Wpływ\",\n        \"impactedCurrency\": \"Wpływ na walutę\",\n        \"actual\": \"Rzeczywisty\",\n        \"forecast\": \"Prognoza\",\n        \"prior\": \"Poprzedni\",\n        \"impactedInstruments\": \"Wpływ na instrumenty\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Niestandardowe daty\",\n        \"selectDateRange\": \"Wybierz zakres dat\",\n        \"startDate\": \"Data początkowa\",\n        \"endDate\": \"Data końcowa\",\n        \"apply\": \"Zastosuj\"\n      },\n      \"andMore\": \"i więcej\",\n      \"stocks\": {\n        \"splits\": \"Splity\",\n        \"earnings\": \"Zyski\",\n        \"dividends\": \"Dywidendy\",\n        \"stockSplit\": \"Split akcji\",\n        \"dividend\": \"Dywidenda\",\n        \"epsActual\": \"EPS rzeczywisty\",\n        \"epsForecast\": \"EPS prognoza\",\n        \"revenueActual\": \"Przychód rzeczywisty\",\n        \"revenueForecast\": \"Przychód prognoza\",\n        \"exDate\": \"Data ex-dywidendy\",\n        \"cycle\": \"Cykl\",\n        \"payment\": \"Wypłata\",\n        \"yield\": \"Rentowność\",\n        \"ratio\": \"Wskaźnik\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Sygnaly\",\n    \"support\": \"Pomoc\",\n    \"resistance\": \"Opór\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Szukaj w słowniku...\",\n    \"noResults\": \"Nie znaleziono wyników.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Wszystkie\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Akcje\",\n      \"crypto\": \"Krypto\",\n      \"cmd\": \"Surowce\",\n      \"worldec\": \"Gospodarka światowa\",\n      \"regec\": \"Gospodarka regionalna\"\n    },\n    \"searchPlaceholder\": \"Szukaj wiadomości, rynków, symboli...\",\n    \"searchLabel\": \"Szukaj wiadomości\",\n    \"articleCategoriesLabel\": \"Kategorie artykułów\",\n    \"latestNews\": \"Najnowsze wiadomości\",\n    \"noSearchResults\": \"Brak artykułów pasujących do wyszukiwania.\",\n    \"loading\": \"Ładowanie...\",\n    \"loadMore\": \"Pokaż więcej\",\n    \"popularTopics\": \"Popularne tematy\",\n    \"relatedNews\": \"Powiązane wiadomości\",\n    \"back\": \"Wstecz\",\n    \"share\": \"Udostępnij\",\n    \"readingTime\": \"Czas czytania: {minutes} min\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Najnowsza aktualizacja na żywo\",\n      \"live\": \"NA ŻYWO\",\n      \"openFeed\": \"Otwórz relację na żywo\",\n      \"resume\": \"Wznów aktualizacje na żywo\",\n      \"pause\": \"Wstrzymaj aktualizacje na żywo\",\n      \"title\": \"Aktualizacje na żywo\",\n      \"viewAll\": \"Zobacz wszystkie aktualizacje\",\n      \"newestFirst\": \"Najnowsze najpierw\",\n      \"oldestFirst\": \"Najstarsze najpierw\",\n      \"sortOldestFirst\": \"Sortuj od najstarszych\",\n      \"sortNewestFirst\": \"Sortuj od najnowszych\",\n      \"newUpdate\": \"{count} nowa aktualizacja\",\n      \"newUpdates\": \"{count} nowe aktualizacje\",\n      \"loading\": \"Ładowanie aktualizacji na żywo…\",\n      \"loadError\": \"Nie udało się załadować aktualizacji na żywo.\",\n      \"tryAgain\": \"Spróbuj ponownie\",\n      \"empty\": \"Brak aktualizacji na żywo.\",\n      \"latest\": \"NAJNOWSZA\",\n      \"loadingEarlier\": \"Ładowanie…\",\n      \"loadEarlier\": \"Załaduj wcześniejsze aktualizacje\",\n      \"backToNews\": \"Wróć do wiadomości\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Codzienny przegląd rynku\",\n      \"title\": \"Dzisiejszy przegląd rynku\",\n      \"description\": \"Zwięzły codzienny przegląd wideo najważniejszych ruchów i tego, co obserwować dalej.\",\n      \"cta\": \"Zobacz pełną aktualizację\",\n      \"share\": \"Udostępnij\",\n      \"noVideo\": \"Wideo nie jest jeszcze dostępne.\",\n      \"copied\": \"Skopiowano!\",\n      \"copyLink\": \"Kopiuj link\",\n      \"shareOn\": \"Udostępnij w {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Liderzy rynku\",\n    \"active\": \"Najaktywniejsze\",\n    \"gainers\": \"Wzrosty\",\n    \"losers\": \"Spadki\",\n    \"noData\": \"Brak danych\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Ostatnie 15 minut\",\n      \"1h\": \"Ostatnia godzina\",\n      \"1d\": \"Ostatni dzień\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Ropa naftowa\",\n      \"gold\": \"Złoto\",\n      \"silver\": \"Srebro\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Rekomendacje analityków\",\n    \"strongSell\": \"Silna sprzedaż\",\n    \"moderateSell\": \"Umiarkowana sprzedaż\",\n    \"hold\": \"Trzymaj\",\n    \"moderateBuy\": \"Umiarkowane kupno\",\n    \"strongBuy\": \"Silne kupno\",\n    \"sell\": \"Sprzedaż\",\n    \"buy\": \"Kupno\",\n    \"averageTarget\": \"Średnia cena docelowa\",\n    \"noData\": \"Brak rekomendacji analityków dla tego aktywa.\",\n    \"loadError\": \"Nie udało się wczytać rekomendacji analityków.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Otwarcie\",\n    \"close\": \"Zamknięcie\",\n    \"dayRange\": \"Zakres dzienny\",\n    \"volume\": \"Wolumen\",\n    \"keyStatistics\": \"Kluczowe statystyki\",\n    \"performance\": \"Wyniki\",\n    \"week1\": \"1 tydzień\",\n    \"month1\": \"1 miesiąc\",\n    \"month3\": \"3 miesiące\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Konsensus analityków\",\n    \"relatedNews\": \"Powiązane wiadomości\",\n    \"noData\": \"Brak danych\",\n    \"loadError\": \"Nie można załadować danych\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Conversor de Moedas\",\n    \"from\": \"De\",\n    \"to\": \"Para\",\n    \"amount\": \"Quantia\",\n    \"convert\": \"Converter\",\n    \"result\": \"Resultado\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Tendência de Alta\",\n    \"downtrend\": \"Tendência de Baixa\",\n    \"high\": \"Alta (b)\",\n    \"low\": \"Baixa (a)\",\n    \"retracements\": \"Retrações\",\n    \"extensions\": \"Extensões\",\n    \"values\": \"Valores\",\n    \"result\": \"Resultado\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Calculadora de Margem\",\n    \"leverage\": \"Alavancagem\",\n    \"lotSize\": \"Volume em Lotes\",\n    \"accountCurrency\": \"Moeda da Conta\",\n    \"currencyPair\": \"Par de Moedas\",\n    \"accountType\": \"Tipo de Conta\",\n    \"price\": \"Preço Atual de Conversão\",\n    \"requiredMargin\": \"Margem Requerida\",\n    \"result\": \"Resultado\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivôs\",\n    \"classic\": \"Clássico\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Preço Alto\",\n    \"low\": \"Preço Baixo\",\n    \"open\": \"Preço de Abertura\",\n    \"close\": \"Preço de Fechamento\",\n    \"pivotPoints\": \"Pontos de Pivô\",\n    \"res-4\": \"4ª Resistência\",\n    \"res-3\": \"3ª Resistência\",\n    \"res-2\": \"2ª Resistência\",\n    \"res-1\": \"1ª Resistência\",\n    \"pivot\": \"Ponto de Pivô\",\n    \"sup-1\": \"1º Suporte\",\n    \"sup-2\": \"2º Suporte\",\n    \"sup-3\": \"3º Suporte\",\n    \"sup-4\": \"4º Suporte\",\n    \"result\": \"Resultado\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"open\": \"Preço de Abertura\",\n    \"value\": \"Valor/Pip\",\n    \"buy\": \"Comprar/Longo\",\n    \"sell\": \"Vender/Curto\",\n    \"lots\": \"Lotes\",\n    \"stop\": \"Parar\",\n    \"Limit\": \"Limite\",\n    \"maxLoss\": \"Perda Máxima\",\n    \"maxProfit\": \"Lucro Máximo\",\n    \"result\": \"Resultado\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Níveis de Stop Loss / Take Profit\",\n    \"buy\": \"Comprar/Longo\",\n    \"sell\": \"Vender/Curto\",\n    \"open\": \"Preço de Abertura\",\n    \"value\": \"Valor/Pip\",\n    \"lots\": \"Lotes\",\n    \"risk\": \"Quantia a Arriscar\",\n    \"gain\": \"Quantia a Ganhar\",\n    \"stopLoss\": \"Stop Loss em\",\n    \"takeProfit\": \"Take Profit em\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Resultado\"\n  },\n  \"heatmap\": {\n    \"title\": \"Mapa de Calor\",\n    \"currencies\": \"Moedas\",\n    \"value\": \"Valor\",\n    \"result\": \"Resultado\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intradiário 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intradiário 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intradiário 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Diário\"\n      },\n      \"1w\": {\n        \"short\": \"1S\",\n        \"long\": \"Semanal\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Mensal\"\n      }\n    },\n    \"tooManyCurrencies\": \"Muitas moedas selecionadas\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"Calendário Econômico\",\n    \"impact\": \"Impacto\",\n    \"high\": \"Alto\",\n    \"medium\": \"Médio\",\n    \"low\": \"Baixo\",\n    \"countries\": \"Países\",\n    \"customRange\": \"Intervalo Personalizado\",\n    \"yesterday\": \"Ontem\",\n    \"today\": \"Hoje\",\n    \"tomorrow\": \"Amanhã\",\n    \"thisWeek\": \"Esta Semana\",\n    \"lastWeek\": \"Semana Passada\",\n    \"nextWeek\": \"Próxima Semana\",\n    \"noEventsFound\": \"Não foram encontrados eventos\",\n    \"event\": \"Evento\",\n    \"actual\": \"Real\",\n    \"forecast\": \"Previsão\",\n    \"previous\": \"Anterior\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Hora\",\n        \"news\": \"Notícia\",\n        \"impact\": \"Impacto\",\n        \"impactedCurrency\": \"Moeda Impactada\",\n        \"actual\": \"Real\",\n        \"forecast\": \"Previsão\",\n        \"prior\": \"Anterior\",\n        \"impactedInstruments\": \"Instrumentos Impactados\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Datas Personalizadas\",\n        \"selectDateRange\": \"Selecionar Intervalo de Datas\",\n        \"startDate\": \"Data de Início\",\n        \"endDate\": \"Data de Término\",\n        \"apply\": \"Aplicar\"\n      },\n      \"andMore\": \"e mais\",\n      \"stocks\": {\n        \"splits\": \"Desdobramentos\",\n        \"earnings\": \"Lucros\",\n        \"dividends\": \"Dividendos\",\n        \"stockSplit\": \"Desdobramento\",\n        \"dividend\": \"Dividendo\",\n        \"epsActual\": \"EPS real\",\n        \"epsForecast\": \"EPS previsto\",\n        \"revenueActual\": \"Receita real\",\n        \"revenueForecast\": \"Receita prevista\",\n        \"exDate\": \"Data ex-dividendo\",\n        \"cycle\": \"Ciclo\",\n        \"payment\": \"Pagamento\",\n        \"yield\": \"Rendimento\",\n        \"ratio\": \"Proporção\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Sinais\",\n    \"support\": \"Suporte\",\n    \"resistance\": \"Resistência\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Pesquisar no glossário...\",\n    \"noResults\": \"Nenhum resultado encontrado.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Todos\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Ações\",\n      \"crypto\": \"Cripto\",\n      \"cmd\": \"Commodities\",\n      \"worldec\": \"Economia mundial\",\n      \"regec\": \"Economia regional\"\n    },\n    \"searchPlaceholder\": \"Buscar notícias, mercados e códigos...\",\n    \"searchLabel\": \"Buscar notícias\",\n    \"articleCategoriesLabel\": \"Categorias de artigos\",\n    \"latestNews\": \"Últimas notícias\",\n    \"noSearchResults\": \"Nenhum artigo corresponde à sua busca.\",\n    \"loading\": \"Carregando...\",\n    \"loadMore\": \"Ver mais\",\n    \"popularTopics\": \"Tópicos populares\",\n    \"relatedNews\": \"Notícias relacionadas\",\n    \"back\": \"Voltar\",\n    \"share\": \"Compartilhar\",\n    \"readingTime\": \"{minutes} min de leitura\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Última atualização ao vivo\",\n      \"live\": \"AO VIVO\",\n      \"openFeed\": \"Abrir feed ao vivo\",\n      \"resume\": \"Retomar atualizações ao vivo\",\n      \"pause\": \"Pausar atualizações ao vivo\",\n      \"title\": \"Atualizações ao vivo\",\n      \"viewAll\": \"Ver todas as atualizações\",\n      \"newestFirst\": \"Mais recentes primeiro\",\n      \"oldestFirst\": \"Mais antigas primeiro\",\n      \"sortOldestFirst\": \"Ordenar pelas mais antigas\",\n      \"sortNewestFirst\": \"Ordenar pelas mais recentes\",\n      \"newUpdate\": \"{count} nova atualização\",\n      \"newUpdates\": \"{count} novas atualizações\",\n      \"loading\": \"Carregando atualizações ao vivo…\",\n      \"loadError\": \"Não foi possível carregar as atualizações ao vivo.\",\n      \"tryAgain\": \"Tentar novamente\",\n      \"empty\": \"Ainda não há atualizações ao vivo.\",\n      \"latest\": \"MAIS RECENTE\",\n      \"loadingEarlier\": \"Carregando…\",\n      \"loadEarlier\": \"Carregar atualizações anteriores\",\n      \"backToNews\": \"Voltar às notícias\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Resumo diário do mercado\",\n      \"title\": \"O resumo do mercado de hoje\",\n      \"description\": \"Um resumo diário em vídeo dos movimentos que importam e do que acompanhar a seguir.\",\n      \"cta\": \"Ver a atualização completa\",\n      \"share\": \"Compartilhar\",\n      \"noVideo\": \"Nenhum vídeo disponível ainda.\",\n      \"copied\": \"Copiado!\",\n      \"copyLink\": \"Copiar link\",\n      \"shareOn\": \"Compartilhar no {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Movimentações do mercado\",\n    \"active\": \"Mais ativos\",\n    \"gainers\": \"Maiores altas\",\n    \"losers\": \"Maiores baixas\",\n    \"noData\": \"Sem dados\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Últimos 15 minutos\",\n      \"1h\": \"Última hora\",\n      \"1d\": \"Último dia\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Petróleo bruto\",\n      \"gold\": \"Ouro\",\n      \"silver\": \"Prata\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Recomendações de analistas\",\n    \"strongSell\": \"Venda forte\",\n    \"moderateSell\": \"Venda moderada\",\n    \"hold\": \"Manter\",\n    \"moderateBuy\": \"Compra moderada\",\n    \"strongBuy\": \"Compra forte\",\n    \"sell\": \"Venda\",\n    \"buy\": \"Compra\",\n    \"averageTarget\": \"Preço-alvo médio\",\n    \"noData\": \"Não há recomendações de analistas para este ativo.\",\n    \"loadError\": \"Não foi possível carregar as recomendações dos analistas.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Abertura\",\n    \"close\": \"Fechamento\",\n    \"dayRange\": \"Variação do dia\",\n    \"volume\": \"Volume\",\n    \"keyStatistics\": \"Estatísticas chave\",\n    \"performance\": \"Desempenho\",\n    \"week1\": \"1 semana\",\n    \"month1\": \"1 mês\",\n    \"month3\": \"3 meses\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Consenso dos analistas\",\n    \"relatedNews\": \"Notícias relacionadas\",\n    \"noData\": \"Sem dados disponíveis\",\n    \"loadError\": \"Não foi possível carregar os dados\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Конвертер валют\",\n    \"from\": \"Из\",\n    \"to\": \"В\",\n    \"amount\": \"Сумма\",\n    \"convert\": \"Конвертировать\",\n    \"result\": \"Результат\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Фибоначчи\",\n    \"uptrend\": \"Восходящий тренд\",\n    \"downtrend\": \"Нисходящий тренд\",\n    \"high\": \"Высокие (b)\",\n    \"low\": \"Низкие (a)\",\n    \"retracements\": \"Отскоки\",\n    \"extensions\": \"Расширения\",\n    \"values\": \"Ценности\",\n    \"result\": \"Результат\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Калькулятор маржи\",\n    \"pair\": \"пара\",\n    \"leverage\": \"Рычаг\",\n    \"lotSize\": \"Объем в лотах\",\n    \"accountCurrency\": \"Базовая валюта счета\",\n    \"currencyPair\": \"Валютная пара\",\n    \"accountType\": \"Тип аккаунта\",\n    \"price\": \"Текущая цена конвертации\",\n    \"requiredMargin\": \"Требуемая маржа\",\n    \"result\": \"Результат\"\n  },\n  \"pivots\": {\n    \"title\": \"Повороты\",\n    \"classic\": \"Классический\",\n    \"woodie\": \"Вуди\",\n    \"camarilla\": \"Камарилья\",\n    \"demark\": \"ДеМарк\",\n    \"high\": \"Высокая цена\",\n    \"low\": \"Низкая цена\",\n    \"open\": \"Цена при открытии\",\n    \"close\": \"Цена закрытия\",\n    \"pivotPoints\": \"Точки опоры\",\n    \"res-4\": \"4 Сопротивление\",\n    \"res-3\": \"3 Сопротивление\",\n    \"res-2\": \"2 Сопротивление\",\n    \"res-1\": \"1 Сопротивление\",\n    \"pivot\": \"очка поворота пивот\",\n    \"sup-1\": \"1 Поддержка\",\n    \"sup-2\": \"2 Поддержка\",\n    \"sup-3\": \"3 Поддержка\",\n    \"sup-4\": \"4 Поддержка\",\n    \"result\": \"Результат\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Стоп-лосс/Тейк-профит\",\n    \"buy\": \"Купить/ Длинные\",\n    \"sell\": \"Продать/ Короткие\",\n    \"open\": \"Открытие\",\n    \"value\": \"Значение/Пипс\",\n    \"lots\": \"Лоты\",\n    \"stop\": \"Стоп\",\n    \"Limit\": \"Лимит\",\n    \"maxLoss\": \" Максимальная потеря\",\n    \"maxProfit\": \" Максимальная прибыль \",\n    \"result\": \"Результат\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Уровни стоп-лосса/тейк-профита\",\n    \"buy\": \"Купить/ Длинные\",\n    \"sell\": \"Продать/ Короткие\",\n    \"open\": \"Открытие\",\n    \"value\": \"Значение/Пипс\",\n    \"lots\": \"Лоты\",\n    \"risk\": \"Сумма риска\",\n    \"gain\": \"Сумма к получению\",\n    \"stopLoss\": \"Стоп-лосс на\",\n    \"takeProfit\": \"Тейк-профит на\",\n    \"stopLossPips\": \"Стоп-лосс (пункты)\",\n    \"takeProfitPips\": \"Тейк-профит (пункты)\",\n    \"result\": \"Результат\"\n  },\n  \"heatmap\": {\n    \"title\": \"Тепловая карта\",\n    \"currencies\": \"Валюты\",\n    \"value\": \"Ценить\",\n    \"result\": \"Результат\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Внутридневные 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Внутридневные 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Внутридневные 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"⁠Суточный\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Недельный\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Месячный\"\n      }\n    },\n    \"tooManyCurrencies\": \"Выбрано слишком много валют. Пожалуйста, выберите до 8 валют.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"Экономический Календарь\",\n    \"impact\": \"Влияние\",\n    \"high\": \"Высокий\",\n    \"medium\": \"Средний\",\n    \"low\": \"Низкий\",\n    \"countries\": \"Страны\",\n    \"customRange\": \"Пользовательский диапазон\",\n    \"yesterday\": \"Вчера\",\n    \"today\": \"Сегодня\",\n    \"tomorrow\": \"Завтра\",\n    \"thisWeek\": \"На этой неделе\",\n    \"lastWeek\": \"На прошлой неделе\",\n    \"nextWeek\": \"На следующей неделе\",\n    \"noEventsFound\": \"Не найдено событий\",\n    \"event\": \"Событие\",\n    \"actual\": \"Фактический\",\n    \"forecast\": \"Прогноз\",\n    \"previous\": \"Предыдущий\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"ВРЕМЯ\",\n        \"news\": \"НОВОСТИ\",\n        \"impact\": \"ВЛИЯНИЕ\",\n        \"impactedCurrency\": \"ПОСТРАДАВШАЯ ВАЛЮТА\",\n        \"actual\": \"ФАКТИЧЕСКИЙ\",\n        \"forecast\": \"ПРОГНОЗ\",\n        \"prior\": \"ПРЕДЫДУЩИЙ\",\n        \"impactedInstruments\": \"ПОСТРАДАВШИЕ ИНСТРУМЕНТЫ\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Пользовательские даты\",\n        \"selectDateRange\": \"Выберите диапазон дат\",\n        \"startDate\": \"Дата начала\",\n        \"endDate\": \"Дата окончания\",\n        \"apply\": \"Применить\"\n      },\n      \"andMore\": \"и более\",\n      \"stocks\": {\n        \"splits\": \"Сплиты\",\n        \"earnings\": \"Прибыль\",\n        \"dividends\": \"Дивиденды\",\n        \"stockSplit\": \"Дробление акций\",\n        \"dividend\": \"Дивиденд\",\n        \"epsActual\": \"EPS факт\",\n        \"epsForecast\": \"EPS прогноз\",\n        \"revenueActual\": \"Выручка факт\",\n        \"revenueForecast\": \"Выручка прогноз\",\n        \"exDate\": \"Экс-дата\",\n        \"cycle\": \"Цикл\",\n        \"payment\": \"Выплата\",\n        \"yield\": \"Доходность\",\n        \"ratio\": \"Коэффициент\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Сигналы\",\n    \"support\": \"Поддержка\",\n    \"resistance\": \"Сопротивление\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Поиск в глоссарии...\",\n    \"noResults\": \"Результаты не найдены.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Все\",\n      \"forex\": \"Форекс\",\n      \"stock\": \"Акции\",\n      \"crypto\": \"Криптовалюты\",\n      \"cmd\": \"Сырьё\",\n      \"worldec\": \"Мировая экономика\",\n      \"regec\": \"Региональная экономика\"\n    },\n    \"searchPlaceholder\": \"Поиск новостей, рынков и тикеров...\",\n    \"searchLabel\": \"Поиск новостей\",\n    \"articleCategoriesLabel\": \"Категории статей\",\n    \"latestNews\": \"Последние новости\",\n    \"noSearchResults\": \"Нет статей, соответствующих вашему запросу.\",\n    \"loading\": \"Загрузка...\",\n    \"loadMore\": \"Показать ещё\",\n    \"popularTopics\": \"Популярные темы\",\n    \"relatedNews\": \"Похожие новости\",\n    \"back\": \"Назад\",\n    \"share\": \"Поделиться\",\n    \"readingTime\": \"Время чтения: {minutes} мин\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Последнее обновление в реальном времени\",\n      \"live\": \"В ЭФИРЕ\",\n      \"openFeed\": \"Открыть ленту\",\n      \"resume\": \"Возобновить обновления\",\n      \"pause\": \"Приостановить обновления\",\n      \"title\": \"Обновления в реальном времени\",\n      \"viewAll\": \"Показать все обновления\",\n      \"newestFirst\": \"Сначала новые\",\n      \"oldestFirst\": \"Сначала старые\",\n      \"sortOldestFirst\": \"Сортировать от старых\",\n      \"sortNewestFirst\": \"Сортировать от новых\",\n      \"newUpdate\": \"{count} новое обновление\",\n      \"newUpdates\": \"{count} новых обновления\",\n      \"loading\": \"Загрузка обновлений…\",\n      \"loadError\": \"Не удалось загрузить обновления.\",\n      \"tryAgain\": \"Повторить\",\n      \"empty\": \"Обновлений пока нет.\",\n      \"latest\": \"ПОСЛЕДНЕЕ\",\n      \"loadingEarlier\": \"Загрузка…\",\n      \"loadEarlier\": \"Загрузить предыдущие обновления\",\n      \"backToNews\": \"Назад к новостям\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Ежедневный обзор рынка\",\n      \"title\": \"Обзор рынка на сегодня\",\n      \"description\": \"Краткий ежедневный видеообзор важных движений рынка и того, за чем следить дальше.\",\n      \"cta\": \"Читать полный обзор\",\n      \"share\": \"Поделиться\",\n      \"noVideo\": \"Видео пока недоступно.\",\n      \"copied\": \"Скопировано!\",\n      \"copyLink\": \"Копировать ссылку\",\n      \"shareOn\": \"Поделиться в {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Лидеры рынка\",\n    \"active\": \"Самые активные\",\n    \"gainers\": \"Лидеры роста\",\n    \"losers\": \"Лидеры падения\",\n    \"noData\": \"Нет данных\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Последние 15 минут\",\n      \"1h\": \"Последний час\",\n      \"1d\": \"Последний день\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Сырая нефть\",\n      \"gold\": \"Золото\",\n      \"silver\": \"Серебро\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Рекомендации аналитиков\",\n    \"strongSell\": \"Активно продавать\",\n    \"moderateSell\": \"Умеренно продавать\",\n    \"hold\": \"Держать\",\n    \"moderateBuy\": \"Умеренно покупать\",\n    \"strongBuy\": \"Активно покупать\",\n    \"sell\": \"Продавать\",\n    \"buy\": \"Покупать\",\n    \"averageTarget\": \"Средняя целевая цена\",\n    \"noData\": \"Для этого актива нет рекомендаций аналитиков.\",\n    \"loadError\": \"Не удалось загрузить рекомендации аналитиков.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Открытие\",\n    \"close\": \"Закрытие\",\n    \"dayRange\": \"Дневной диапазон\",\n    \"volume\": \"Объём\",\n    \"keyStatistics\": \"Ключевые показатели\",\n    \"performance\": \"Результаты\",\n    \"week1\": \"1 неделя\",\n    \"month1\": \"1 месяц\",\n    \"month3\": \"3 месяца\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Консенсус аналитиков\",\n    \"relatedNews\": \"Связанные новости\",\n    \"noData\": \"Нет данных\",\n    \"loadError\": \"Не удалось загрузить данные\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"ตัวแปลงสกุลเงิน\",\n    \"from\": \"จาก\",\n    \"to\": \"เป็น\",\n    \"amount\": \"จำนวน\",\n    \"convert\": \"แปลง\",\n    \"result\": \"ผลลัพธ์\"\n  },\n  \"fibonacci\": {\n    \"title\": \"ฟีโบนักชี\",\n    \"uptrend\": \"แนวโน้มขาขึ้น\",\n    \"downtrend\": \"แนวโน้มขาลง\",\n    \"high\": \"สูง\",\n    \"low\": \"ต่ำ\",\n    \"retracements\": \"การถอยกลับ\",\n    \"extensions\": \"การเติบโต\",\n    \"values\": \"ค่า\",\n    \"result\": \"ผลลัพธ์\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"เครื่องคำนวณมาร์จิ้น\",\n    \"leverage\": \"เลเวอเลจ\",\n    \"lotSize\": \"ปริมาณในการซื้อ\",\n    \"accountCurrency\": \"สกุลเงินหลักของบัญชี\",\n    \"currencyPair\": \"คู่สกุลเงิน\",\n    \"accountType\": \"ประเภทบัญชี\",\n    \"price\": \"ราคาปัจจุบันในการแปลง\",\n    \"requiredMargin\": \"มาร์จิ้นที่ต้องการ\",\n    \"result\": \"ผลลัพธ์\"\n  },\n  \"pivots\": {\n    \"title\": \"จุดหมุน\",\n    \"classic\": \"คลาสสิค\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"ราคาสูงสุด\",\n    \"low\": \"ราคาต่ำสุด\",\n    \"open\": \"ราคาเปิด\",\n    \"close\": \"ราคาปิด\",\n    \"pivotPoints\": \"จุดหมุน\",\n    \"res-4\": \"แนวต้านที่ 4\",\n    \"res-3\": \"แนวต้านที่ 3\",\n    \"res-2\": \"แนวต้านที่ 2\",\n    \"res-1\": \"แนวต้านที่ 1\",\n    \"pivot\": \"จุดหมุน\",\n    \"sup-1\": \"แนวรับที่ 1\",\n    \"sup-2\": \"แนวรับที่ 2\",\n    \"sup-3\": \"แนวรับที่ 3\",\n    \"sup-4\": \"แนวรับที่ 4\",\n    \"result\": \"ผลลัพธ์\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"หยุดขาดทุน / ทำกำไร\",\n    \"buy\": \"ซื้อ/Long\",\n    \"sell\": \"ขาย/Short\",\n    \"open\": \"เปิด\",\n    \"value\": \"มูลค่า/Pip\",\n    \"lots\": \"ล็อต\",\n    \"stop\": \"หยุด\",\n    \"Limit\": \"ลิมิต\",\n    \"maxLoss\": \"ขาดทุนสูงสุด\",\n    \"maxProfit\": \"กำไรสูงสุด\",\n    \"result\": \"ผลลัพธ์\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"ระดับหยุดขาดทุน / ทำกำไร\",\n    \"buy\": \"ซื้อ/Long\",\n    \"sell\": \"ขาย/Short\",\n    \"open\": \"เปิด\",\n    \"value\": \"มูลค่า/Pip\",\n    \"lots\": \"ล็อต\",\n    \"risk\": \"ปริมาณความเสี่ยง\",\n    \"gain\": \"ผลกำไร\",\n    \"stopLoss\": \"หยุดขาดทุนที่\",\n    \"takeProfit\": \"ทำกำไรที่\",\n    \"stopLossPips\": \"หยุดขาดทุน (Pips)\",\n    \"takeProfitPips\": \"ทำกำไร (Pips)\",\n    \"result\": \"ผลลัพธ์\"\n  },\n  \"heatmap\": {\n    \"title\": \"แผนที่ความร้อน\",\n    \"currencies\": \"สกุลเงิน\",\n    \"value\": \"มูลค่า\",\n    \"result\": \"ผลลัพธ์\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"ประจำ 15 นาที\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"ประจำ 60 นาที\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"ประจำ 240 นาที\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"รายวัน\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"รายสัปดาห์\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"รายเดือน\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"ปฏิทินเศรษฐกิจ\",\n    \"impact\": \"ผลกระทบ\",\n    \"high\": \"สูง\",\n    \"medium\": \"กลาง\",\n    \"low\": \"ต่ำ\",\n    \"countries\": \"ประเทศ\",\n    \"customRange\": \"ช่วงที่กำหนดเอง\",\n    \"yesterday\": \"เมื่อวาน\",\n    \"today\": \"วันนี้\",\n    \"tomorrow\": \"พรุ่งนี้\",\n    \"thisWeek\": \"ในสัปดาห์นี้\",\n    \"lastWeek\": \"สัปดาห์ที่แล้ว\",\n    \"nextWeek\": \"สัปดาห์หน้า\",\n    \"noEventsFound\": \"ไม่พบเหตุการณ์\",\n    \"event\": \"เหตุการณ์\",\n    \"actual\": \"จริง\",\n    \"forecast\": \"คาดการณ์\",\n    \"previous\": \"ก่อนหน้า\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"เวลา\",\n        \"news\": \"ข่าว\",\n        \"impact\": \"ผลกระทบ\",\n        \"impactedCurrency\": \"สกุลเงินที่ได้รับผลกระทบ\",\n        \"actual\": \"จริง\",\n        \"forecast\": \"คาดการณ์\",\n        \"prior\": \"ก่อนหน้า\",\n        \"impactedInstruments\": \"เครื่องมือที่ได้รับผลกระทบ\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"วันที่กำหนดเอง\",\n        \"selectDateRange\": \"เลือกช่วงวันที่\",\n        \"startDate\": \"วันที่เริ่มต้น\",\n        \"endDate\": \"วันที่สิ้นสุด\",\n        \"apply\": \"ใช้\"\n      },\n      \"andMore\": \"และอื่นๆ\",\n      \"stocks\": {\n        \"splits\": \"การแตกหุ้น\",\n        \"earnings\": \"กำไร\",\n        \"dividends\": \"เงินปันผล\",\n        \"stockSplit\": \"การแตกหุ้น\",\n        \"dividend\": \"เงินปันผล\",\n        \"epsActual\": \"EPS จริง\",\n        \"epsForecast\": \"EPS คาดการณ์\",\n        \"revenueActual\": \"รายได้จริง\",\n        \"revenueForecast\": \"รายได้คาดการณ์\",\n        \"exDate\": \"วันขึ้น XD\",\n        \"cycle\": \"รอบ\",\n        \"payment\": \"การจ่าย\",\n        \"yield\": \"อัตราผลตอบแทน\",\n        \"ratio\": \"อัตราส่วน\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"สัญญาณ\",\n    \"support\": \"แนวรับ\",\n    \"resistance\": \"แนวต้าน\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"ค้นหาในอภิธานศัพท์...\",\n    \"noResults\": \"ไม่พบผลลัพธ์\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"ทั้งหมด\",\n      \"forex\": \"ฟอเร็กซ์\",\n      \"stock\": \"หุ้น\",\n      \"crypto\": \"คริปโต\",\n      \"cmd\": \"สินค้าโภคภัณฑ์\",\n      \"worldec\": \"เศรษฐกิจโลก\",\n      \"regec\": \"เศรษฐกิจภูมิภาค\"\n    },\n    \"searchPlaceholder\": \"ค้นหาข่าว ตลาด และสัญลักษณ์...\",\n    \"searchLabel\": \"ค้นหาข่าว\",\n    \"articleCategoriesLabel\": \"หมวดหมู่บทความ\",\n    \"latestNews\": \"ข่าวล่าสุด\",\n    \"noSearchResults\": \"ไม่พบบทความที่ตรงกับการค้นหาของคุณ\",\n    \"loading\": \"กำลังโหลด...\",\n    \"loadMore\": \"ดูเพิ่มเติม\",\n    \"popularTopics\": \"หัวข้อยอดนิยม\",\n    \"relatedNews\": \"ข่าวที่เกี่ยวข้อง\",\n    \"back\": \"ย้อนกลับ\",\n    \"share\": \"แชร์\",\n    \"readingTime\": \"เวลาอ่าน: {minutes} นาที\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"อัปเดตสดล่าสุด\",\n      \"live\": \"สด\",\n      \"openFeed\": \"เปิดฟีดสด\",\n      \"resume\": \"เล่นอัปเดตสดต่อ\",\n      \"pause\": \"หยุดอัปเดตสดชั่วคราว\",\n      \"title\": \"อัปเดตสด\",\n      \"viewAll\": \"ดูอัปเดตทั้งหมด\",\n      \"newestFirst\": \"ใหม่ล่าสุดก่อน\",\n      \"oldestFirst\": \"เก่าสุดก่อน\",\n      \"sortOldestFirst\": \"เรียงจากเก่าสุด\",\n      \"sortNewestFirst\": \"เรียงจากใหม่ล่าสุด\",\n      \"newUpdate\": \"อัปเดตใหม่ {count} รายการ\",\n      \"newUpdates\": \"อัปเดตใหม่ {count} รายการ\",\n      \"loading\": \"กำลังโหลดอัปเดตสด…\",\n      \"loadError\": \"ไม่สามารถโหลดอัปเดตสดได้\",\n      \"tryAgain\": \"ลองอีกครั้ง\",\n      \"empty\": \"ยังไม่มีอัปเดตสด\",\n      \"latest\": \"ล่าสุด\",\n      \"loadingEarlier\": \"กำลังโหลด…\",\n      \"loadEarlier\": \"โหลดอัปเดตก่อนหน้า\",\n      \"backToNews\": \"กลับไปที่ข่าว\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"สรุปตลาดประจำวัน\",\n      \"title\": \"สรุปตลาดวันนี้\",\n      \"description\": \"วิดีโอสรุปรายวันที่กระชับ เกี่ยวกับความเคลื่อนไหวสำคัญและสิ่งที่ควรติดตามต่อไป\",\n      \"cta\": \"ดูอัปเดตฉบับเต็ม\",\n      \"share\": \"แชร์\",\n      \"noVideo\": \"ยังไม่มีวิดีโอ\",\n      \"copied\": \"คัดลอกแล้ว!\",\n      \"copyLink\": \"คัดลอกลิงก์\",\n      \"shareOn\": \"แชร์ไปที่ {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"หุ้นเคลื่อนไหวเด่น\",\n    \"active\": \"ซื้อขายสูงสุด\",\n    \"gainers\": \"ปรับขึ้น\",\n    \"losers\": \"ปรับลง\",\n    \"noData\": \"ไม่มีข้อมูล\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"15 นาทีที่ผ่านมา\",\n      \"1h\": \"1 ชั่วโมงที่ผ่านมา\",\n      \"1d\": \"1 วันที่ผ่านมา\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"น้ำมันดิบ\",\n      \"gold\": \"ทองคำ\",\n      \"silver\": \"เงิน\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"คำแนะนำจากนักวิเคราะห์\",\n    \"strongSell\": \"ขายอย่างมาก\",\n    \"moderateSell\": \"ขายปานกลาง\",\n    \"hold\": \"ถือ\",\n    \"moderateBuy\": \"ซื้อปานกลาง\",\n    \"strongBuy\": \"ซื้ออย่างมาก\",\n    \"sell\": \"ขาย\",\n    \"buy\": \"ซื้อ\",\n    \"averageTarget\": \"ราคาเป้าหมายเฉลี่ย\",\n    \"noData\": \"ไม่มีคำแนะนำจากนักวิเคราะห์สำหรับสินทรัพย์นี้\",\n    \"loadError\": \"ไม่สามารถโหลดคำแนะนำจากนักวิเคราะห์ได้\"\n  },\n  \"assetOverview\": {\n    \"open\": \"เปิด\",\n    \"close\": \"ปิด\",\n    \"dayRange\": \"ช่วงราคาวัน\",\n    \"volume\": \"ปริมาณ\",\n    \"keyStatistics\": \"สถิติสำคัญ\",\n    \"performance\": \"ผลการดำเนินงาน\",\n    \"week1\": \"1 สัปดาห์\",\n    \"month1\": \"1 เดือน\",\n    \"month3\": \"3 เดือน\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"ฉันทามติของนักวิเคราะห์\",\n    \"relatedNews\": \"ข่าวที่เกี่ยวข้อง\",\n    \"noData\": \"ไม่มีข้อมูล\",\n    \"loadError\": \"โหลดข้อมูลไม่ได้\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Döviz Çevirici\",\n    \"from\": \"Döviz Cinsi\",\n    \"to\": \"Çevirilecek Döviz Cinsi\",\n    \"amount\": \"Miktar\",\n    \"convert\": \"Çevir\",\n    \"result\": \"Sonuç\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Yükseliş trendi\",\n    \"downtrend\": \"Düşüş Trendi\",\n    \"high\": \"Yüksek\",\n    \"low\": \"Alçak\",\n    \"retracements\": \"Daraltmalar\",\n    \"extensions\": \"Genişletmeler\",\n    \"values\": \"Değerler\",\n    \"result\": \"Sonuç\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Marjin Hesaplayıcı\",\n    \"leverage\": \"Kaldıraç\",\n    \"lotSize\": \"Hisse cinsinden hacmi\",\n    \"accountCurrency\": \"Hesap Temel Para Birimi\",\n    \"currencyPair\": \"Döviz Çifti\",\n    \"accountType\": \"Hesap Türü\",\n    \"price\": \"Şu anki dönüştürme fiyatı\",\n    \"requiredMargin\": \"Gerekli Marj\",\n    \"result\": \"Sonuç\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivotlar\",\n    \"classic\": \"Klasik\",\n    \"woodie\": \"Woodie Yöntemi\",\n    \"camarilla\": \"Camarilla Yöntemi\",\n    \"demark\": \"DeMark Yöntemi\",\n    \"high\": \"Yüksek Fiyat\",\n    \"low\": \"Düşük Fiyat\",\n    \"open\": \"Açık Fiyat\",\n    \"close\": \"Kapalı Fiyat\",\n    \"pivotPoints\": \"Pivot Noktaları\",\n    \"res-4\": \"4 Direnç\",\n    \"res-3\": \"3 Direnç\",\n    \"res-2\": \"2 Direnç\",\n    \"res-1\": \"1 Direnç\",\n    \"pivot\": \"Eksen Noktası\",\n    \"sup-1\": \"1 Destek\",\n    \"sup-2\": \"2 Destek\",\n    \"sup-3\": \"3 Destek\",\n    \"sup-4\": \"4 Destek\",\n    \"result\": \"Sonuç\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Zarar Durdur / Kar Al\",\n    \"buy\": \"Al / Fazla\",\n    \"sell\": \"Sat / Açık\",\n    \"open\": \"Açık\",\n    \"value\": \"Değer / Fiyat Faiz Noktası\",\n    \"lots\": \"Hisseler\",\n    \"stop\": \"Dur Noktası\",\n    \"Limit\": \"Sınır Noktası\",\n    \"maxLoss\": \"En Fazla Kayıp\",\n    \"maxProfit\": \"En Fazla Kazanç\",\n    \"result\": \"Sonuç\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Zarar Durdur / Kar Al Seviyeleri\",\n    \"buy\": \"Al / Fazla\",\n    \"sell\": \"Sat / Açık\",\n    \"open\": \"Açık\",\n    \"value\": \"Değer / Fiyat Faiz Noktası\",\n    \"lots\": \"Hisseler\",\n    \"risk\": \"Risk Miktarı\",\n    \"gain\": \"Kazanç Miktarı\",\n    \"stopLoss\": \"Kayıp Durdur\",\n    \"takeProfit\": \"Kazanım Al\",\n    \"stopLossPips\": \"Kayıp Durdur (Pips)\",\n    \"takeProfitPips\": \"Kazanım Al (Pips)\",\n    \"result\": \"Sonuç\"\n  },\n  \"heatmap\": {\n    \"title\": \"Isı Haritası\",\n    \"currencies\": \"Para Birimleri\",\n    \"value\": \"Değer\",\n    \"result\": \"Sonuç\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"15 Dakikalık Gün İçi\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"60 Dakikalık Gün İçi\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"240 Dakikalık Gün İçi\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Günlük\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Haftalık\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Aylık\"\n      }\n    }\n  },\n  \"economicCalendar\": {\n    \"title\": \"Ekonomik Takvim\",\n    \"impact\": \"Etkisi\",\n    \"high\": \"Yüksek\",\n    \"medium\": \"Orta\",\n    \"low\": \"Düşük\",\n    \"countries\": \"Ülkeler\",\n    \"customRange\": \"Özel Aralık\",\n    \"yesterday\": \"Dün\",\n    \"today\": \"Bugün\",\n    \"tomorrow\": \"Yarın\",\n    \"thisWeek\": \"Bu Hafta\",\n    \"lastWeek\": \"Geçen Hafta\",\n    \"nextWeek\": \"Gelecek Hafta\",\n    \"noEventsFound\": \"Hiçbir etkinlik bulunamadı\",\n    \"event\": \"Etkinlik\",\n    \"actual\": \"Gerçek\",\n    \"forecast\": \"Tahmin\",\n    \"previous\": \"Önceki\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"ZAMAN\",\n        \"news\": \"HABER\",\n        \"impact\": \"ETKİSİ\",\n        \"impactedCurrency\": \"ETKİLENEN PARA BİRİMİ\",\n        \"actual\": \"GERÇEK\",\n        \"forecast\": \"TAHMİN\",\n        \"prior\": \"ÖNCEKİ\",\n        \"impactedInstruments\": \"ETKİLENEN ENSTRÜMANLAR\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Özel Tarihler\",\n        \"selectDateRange\": \"Tarih Aralığını Seçin\",\n        \"startDate\": \"Başlangıç Tarihi\",\n        \"endDate\": \"Bitiş Tarihi\",\n        \"apply\": \"Uygula\"\n      },\n      \"andMore\": \"ve daha fazlası\",\n      \"stocks\": {\n        \"splits\": \"Bölünmeler\",\n        \"earnings\": \"Kazançlar\",\n        \"dividends\": \"Temettüler\",\n        \"stockSplit\": \"Hisse bölünmesi\",\n        \"dividend\": \"Temettü\",\n        \"epsActual\": \"EPS gerçekleşen\",\n        \"epsForecast\": \"EPS tahmini\",\n        \"revenueActual\": \"Gelir gerçekleşen\",\n        \"revenueForecast\": \"Gelir tahmini\",\n        \"exDate\": \"Temettü öncesi tarih\",\n        \"cycle\": \"Döngü\",\n        \"payment\": \"Ödeme\",\n        \"yield\": \"Getiri\",\n        \"ratio\": \"Oran\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Sinyaller\",\n    \"support\": \"Destek\",\n    \"resistance\": \"Direnç\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Sözlükte ara...\",\n    \"noResults\": \"Sonuç bulunamadı.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Tümü\",\n      \"forex\": \"Forex\",\n      \"stock\": \"Hisseler\",\n      \"crypto\": \"Kripto\",\n      \"cmd\": \"Emtialar\",\n      \"worldec\": \"Dünya Ekonomisi\",\n      \"regec\": \"Bölgesel Ekonomi\"\n    },\n    \"searchPlaceholder\": \"Haber, piyasa ve sembol ara...\",\n    \"searchLabel\": \"Haber ara\",\n    \"articleCategoriesLabel\": \"Makale kategorileri\",\n    \"latestNews\": \"Son Haberler\",\n    \"noSearchResults\": \"Aramanızla eşleşen makale yok.\",\n    \"loading\": \"Yükleniyor...\",\n    \"loadMore\": \"Daha fazla göster\",\n    \"popularTopics\": \"Popüler Konular\",\n    \"relatedNews\": \"İlgili Haberler\",\n    \"back\": \"Geri\",\n    \"share\": \"Paylaş\",\n    \"readingTime\": \"Okuma süresi: {minutes} dk\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"En son canlı güncelleme\",\n      \"live\": \"CANLI\",\n      \"openFeed\": \"Canlı akışı aç\",\n      \"resume\": \"Canlı güncellemeleri sürdür\",\n      \"pause\": \"Canlı güncellemeleri duraklat\",\n      \"title\": \"Canlı güncellemeler\",\n      \"viewAll\": \"Tüm güncellemeleri görüntüle\",\n      \"newestFirst\": \"En yeni ilk\",\n      \"oldestFirst\": \"En eski ilk\",\n      \"sortOldestFirst\": \"En eskiden sırala\",\n      \"sortNewestFirst\": \"En yeniden sırala\",\n      \"newUpdate\": \"{count} yeni güncelleme\",\n      \"newUpdates\": \"{count} yeni güncelleme\",\n      \"loading\": \"Canlı güncellemeler yükleniyor…\",\n      \"loadError\": \"Canlı güncellemeler yüklenemedi.\",\n      \"tryAgain\": \"Tekrar dene\",\n      \"empty\": \"Henüz canlı güncelleme yok.\",\n      \"latest\": \"EN SON\",\n      \"loadingEarlier\": \"Yükleniyor…\",\n      \"loadEarlier\": \"Önceki güncellemeleri yükle\",\n      \"backToNews\": \"Haberlere dön\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Günlük piyasa özeti\",\n      \"title\": \"Bugünün piyasa özeti\",\n      \"description\": \"Önemli hareketlere ve sıradaki takip edilecek gelişmelere dair kısa günlük video özeti.\",\n      \"cta\": \"Tüm güncellemeyi keşfet\",\n      \"share\": \"Paylaş\",\n      \"noVideo\": \"Henüz video yok.\",\n      \"copied\": \"Kopyalandı!\",\n      \"copyLink\": \"Bağlantıyı kopyala\",\n      \"shareOn\": \"{name} üzerinde paylaş\"\n  },\n  \"topMovers\": {\n    \"title\": \"Piyasa Hareketleri\",\n    \"active\": \"En Aktif\",\n    \"gainers\": \"Yükselenler\",\n    \"losers\": \"Düşenler\",\n    \"noData\": \"Veri yok\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Son 15 dakika\",\n      \"1h\": \"Son 1 saat\",\n      \"1d\": \"Son 1 gün\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Ham Petrol\",\n      \"gold\": \"Altın\",\n      \"silver\": \"Gümüş\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Analist önerileri\",\n    \"strongSell\": \"Güçlü sat\",\n    \"moderateSell\": \"Orta düzey sat\",\n    \"hold\": \"Tut\",\n    \"moderateBuy\": \"Orta düzey al\",\n    \"strongBuy\": \"Güçlü al\",\n    \"sell\": \"Sat\",\n    \"buy\": \"Al\",\n    \"averageTarget\": \"Ortalama hedef\",\n    \"noData\": \"Bu varlık için analist önerisi bulunmuyor.\",\n    \"loadError\": \"Analist önerileri yüklenemedi.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Açılış\",\n    \"close\": \"Kapanış\",\n    \"dayRange\": \"Günlük Aralık\",\n    \"volume\": \"Hacim\",\n    \"keyStatistics\": \"Temel İstatistikler\",\n    \"performance\": \"Performans\",\n    \"week1\": \"1 Hafta\",\n    \"month1\": \"1 Ay\",\n    \"month3\": \"3 Ay\",\n    \"ytd\": \"YBB\",\n    \"analystConsensus\": \"Analist Konsensüsü\",\n    \"relatedNews\": \"İlgili Haberler\",\n    \"noData\": \"Veri yok\",\n    \"loadError\": \"Veriler yüklenemiyor\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Bộ chuyển đổi tiền tệ\",\n    \"from\": \"Đổi từ\",\n    \"to\": \"chuyển đổi thành\",\n    \"amount\": \"số tiền\",\n    \"convert\": \"Chuyển thành\",\n    \"result\": \"Kết quả\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Xu hướng giá tăng\",\n    \"downtrend\": \"Xu hướng giá giảm\",\n    \"high\": \"Cao (b)\",\n    \"low\": \"Thấp (b)\",\n    \"retracements\": \"Bồi thường\",\n    \"extensions\": \"Mở rộng\",\n    \"values\": \"Giá trị\",\n    \"result\": \"Kết quả\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Máy tính biên độ\",\n    \"leverage\": \"Đòn bẩy tài chính\",\n    \"lotSize\": \"Khối lượng tính bằng Lots\",\n    \"accountCurrency\": \"Đồng cơ sở\",\n    \"currencyPair\": \"Cặp tiền tệ\",\n    \"accountType\": \"Loại tài khoản\",\n    \"price\": \"giá chuyển đổi \",\n    \"requiredMargin\": \"kĩ quý bắt buộc\",\n    \"result\": \"Kết quả\"\n  },\n  \"pivots\": {\n    \"title\": \"Trục xoay\",\n    \"classic\": \"CLASSIC\",\n    \"woodie\": \"WOODIE\",\n    \"camarilla\": \"CAMARILLA\",\n    \"demark\": \"DEMARK\",\n    \"high\": \"Giá cao\",\n    \"low\": \"Giá thấp\",\n    \"open\": \"Giá mở cửa\",\n    \"close\": \"Giá đóng cửa\",\n    \"pivotPoints\": \"Điểm trục\",\n    \"res-4\": \"4 Vùng kháng cự\",\n    \"res-3\": \"3 Vùng kháng cự\",\n    \"res-2\": \"2 Vùng kháng cự\",\n    \"res-1\": \"1 Vùng kháng cự\",\n    \"pivot\": \"điểm xoay\",\n    \"sup-1\": \"1 hỗ trợ\",\n    \"sup-2\": \"2 hỗ trợ\",\n    \"sup-3\": \"3 hỗ trợ\",\n    \"sup-4\": \"4 hỗ trợ\",\n    \"result\": \"Kết quả\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Dừng lỗ/Chốt lời\",\n    \"buy\": \"Mua/ Long\",\n    \"sell\": \"Bán/ Short\",\n    \"open\": \"Giá mở cửa\",\n    \"value\": \"Đơn vị/ Pip\",\n    \"lots\": \"Lô\",\n    \"stop\": \"Dừng\",\n    \"Limit\": \"Giới hạn\",\n    \"maxLoss\": \"lỗ tối đa\",\n    \"maxProfit\": \"lãi tối đa\",\n    \"result\": \"Kết quả\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Mức dừng lỗ/chốt lời\",\n    \"buy\": \"Mua/ Long\",\n    \"sell\": \"Bán/ Short\",\n    \"open\": \"Giá mở cửa\",\n    \"value\": \"Đơn vị/ Pip\",\n    \"lots\": \"Lô\",\n    \"risk\": \"Số tiền rủi ro\",\n    \"gain\": \"Số tiền thu được\",\n    \"stopLoss\": \"cắt lỗ tại\",\n    \"takeProfit\": \"chốt lãi tại\",\n    \"stopLossPips\": \"cắt lỗ\",\n    \"takeProfitPips\": \"chốt lãi tại\",\n    \"result\": \"Kết quả\"\n  },\n  \"heatmap\": {\n    \"title\": \"Bản đồ nhiệt\",\n    \"currencies\": \"Tiền tệ\",\n    \"value\": \"Giá trị\",\n    \"result\": \"Kết quả\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15p\",\n        \"long\": \"Giao dịch trong ngày 15 phút\"\n      },\n      \"60m\": {\n        \"short\": \"60p\",\n        \"long\": \"Giao dịch trong ngày 60 phút\"\n      },\n      \"240m\": {\n        \"short\": \"240p\",\n        \"long\": \"Giao dịch trong ngày 240 phút\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Hàng ngày\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Hàng tuần\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Hàng tháng\"\n      }\n    },\n    \"tooManyCurrencies\": \"Quá nhiều tiền tệ được chọn. Vui lòng chọn tối đa 8 loại tiền tệ.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"Lịch kinh tế\",\n    \"impact\": \"Tác động\",\n    \"high\": \"Cao\",\n    \"medium\": \"Trung bình\",\n    \"low\": \"Thấp\",\n    \"countries\": \"Quốc gia\",\n    \"customRange\": \"Phạm vi tùy chỉnh\",\n    \"yesterday\": \"Hôm qua\",\n    \"today\": \"Hôm nay\",\n    \"tomorrow\": \"Ngày mai\",\n    \"thisWeek\": \"Tuần này\",\n    \"lastWeek\": \"Tuần trước\",\n    \"nextWeek\": \"Tuần tới\",\n    \"noEventsFound\": \"Không tìm thấy sự kiện nào\",\n    \"event\": \"Sự kiện\",\n    \"actual\": \"Thực tế\",\n    \"forecast\": \"Dự báo\",\n    \"previous\": \"Trước đó\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Thời gian\",\n        \"news\": \"Tin tức\",\n        \"impact\": \"Tác động\",\n        \"impactedCurrency\": \"Tiền tệ bị ảnh hưởng\",\n        \"actual\": \"Thực tế\",\n        \"forecast\": \"Dự báo\",\n        \"prior\": \"Trước đó\",\n        \"impactedInstruments\": \"Công cụ bị ảnh hưởng\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Ngày tùy chỉnh\",\n        \"selectDateRange\": \"Chọn phạm vi ngày\",\n        \"startDate\": \"Ngày bắt đầu\",\n        \"endDate\": \"Ngày kết thúc\",\n        \"apply\": \"Áp dụng\"\n      },\n      \"andMore\": \"và nhiều hơn nữa\",\n      \"stocks\": {\n        \"splits\": \"Chia tách\",\n        \"earnings\": \"Lợi nhuận\",\n        \"dividends\": \"Cổ tức\",\n        \"stockSplit\": \"Chia tách cổ phiếu\",\n        \"dividend\": \"Cổ tức\",\n        \"epsActual\": \"EPS thực tế\",\n        \"epsForecast\": \"EPS dự báo\",\n        \"revenueActual\": \"Doanh thu thực tế\",\n        \"revenueForecast\": \"Doanh thu dự báo\",\n        \"exDate\": \"Ngày GDKHQ\",\n        \"cycle\": \"Chu kỳ\",\n        \"payment\": \"Thanh toán\",\n        \"yield\": \"Lợi suất\",\n        \"ratio\": \"Tỷ lệ\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Tín hiệu\",\n    \"support\": \"Hỗ trợ\",\n    \"resistance\": \"Đối kháng\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Tìm kiếm trong mục từ vựng...\",\n    \"noResults\": \"Không tìm thấy kết quả.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Tất cả\",\n      \"forex\": \"Ngoại hối\",\n      \"stock\": \"Cổ phiếu\",\n      \"crypto\": \"Tiền mã hóa\",\n      \"cmd\": \"Hàng hóa\",\n      \"worldec\": \"Kinh tế thế giới\",\n      \"regec\": \"Kinh tế khu vực\"\n    },\n    \"searchPlaceholder\": \"Tìm kiếm tin tức, thị trường, mã...\",\n    \"searchLabel\": \"Tìm kiếm tin tức\",\n    \"articleCategoriesLabel\": \"Danh mục bài viết\",\n    \"latestNews\": \"Tin mới nhất\",\n    \"noSearchResults\": \"Không có bài viết phù hợp với tìm kiếm của bạn.\",\n    \"loading\": \"Đang tải...\",\n    \"loadMore\": \"Xem thêm\",\n    \"popularTopics\": \"Chủ đề phổ biến\",\n    \"relatedNews\": \"Tin liên quan\",\n    \"back\": \"Quay lại\",\n    \"share\": \"Chia sẻ\",\n    \"readingTime\": \"Thời gian đọc: {minutes} phút\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Cập nhật trực tiếp mới nhất\",\n      \"live\": \"TRỰC TIẾP\",\n      \"openFeed\": \"Mở bảng tin trực tiếp\",\n      \"resume\": \"Tiếp tục cập nhật trực tiếp\",\n      \"pause\": \"Tạm dừng cập nhật trực tiếp\",\n      \"title\": \"Cập nhật trực tiếp\",\n      \"viewAll\": \"Xem tất cả cập nhật\",\n      \"newestFirst\": \"Mới nhất trước\",\n      \"oldestFirst\": \"Cũ nhất trước\",\n      \"sortOldestFirst\": \"Sắp xếp cũ nhất trước\",\n      \"sortNewestFirst\": \"Sắp xếp mới nhất trước\",\n      \"newUpdate\": \"{count} cập nhật mới\",\n      \"newUpdates\": \"{count} cập nhật mới\",\n      \"loading\": \"Đang tải cập nhật trực tiếp…\",\n      \"loadError\": \"Không thể tải cập nhật trực tiếp.\",\n      \"tryAgain\": \"Thử lại\",\n      \"empty\": \"Chưa có cập nhật trực tiếp.\",\n      \"latest\": \"MỚI NHẤT\",\n      \"loadingEarlier\": \"Đang tải…\",\n      \"loadEarlier\": \"Tải các cập nhật trước\",\n      \"backToNews\": \"Quay lại tin tức\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Bản tin thị trường hằng ngày\",\n      \"title\": \"Bản tin thị trường hôm nay\",\n      \"description\": \"Bản tin video ngắn gọn mỗi ngày về những biến động đáng chú ý và điều cần theo dõi tiếp theo.\",\n      \"cta\": \"Xem toàn bộ cập nhật\",\n      \"share\": \"Chia sẻ\",\n      \"noVideo\": \"Chưa có video.\",\n      \"copied\": \"Đã sao chép!\",\n      \"copyLink\": \"Sao chép liên kết\",\n      \"shareOn\": \"Chia sẻ trên {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Biến động thị trường\",\n    \"active\": \"Sôi động nhất\",\n    \"gainers\": \"Tăng giá\",\n    \"losers\": \"Giảm giá\",\n    \"noData\": \"Không có dữ liệu\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"15 phút qua\",\n      \"1h\": \"1 giờ qua\",\n      \"1d\": \"1 ngày qua\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Dầu thô\",\n      \"gold\": \"Vàng\",\n      \"silver\": \"Bạc\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Khuyến nghị của nhà phân tích\",\n    \"strongSell\": \"Bán mạnh\",\n    \"moderateSell\": \"Bán vừa\",\n    \"hold\": \"Nắm giữ\",\n    \"moderateBuy\": \"Mua vừa\",\n    \"strongBuy\": \"Mua mạnh\",\n    \"sell\": \"Bán\",\n    \"buy\": \"Mua\",\n    \"averageTarget\": \"Giá mục tiêu trung bình\",\n    \"noData\": \"Không có khuyến nghị của nhà phân tích cho tài sản này.\",\n    \"loadError\": \"Không thể tải khuyến nghị của nhà phân tích.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Mở cửa\",\n    \"close\": \"Đóng cửa\",\n    \"dayRange\": \"Biên độ ngày\",\n    \"volume\": \"Khối lượng\",\n    \"keyStatistics\": \"Thống kê chính\",\n    \"performance\": \"Hiệu suất\",\n    \"week1\": \"1 tuần\",\n    \"month1\": \"1 tháng\",\n    \"month3\": \"3 tháng\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Đồng thuận phân tích\",\n    \"relatedNews\": \"Tin tức liên quan\",\n    \"noData\": \"Không có dữ liệu\",\n    \"loadError\": \"Không thể tải dữ liệu\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Currency Converter\",\n    \"from\": \"Från\",\n    \"to\": \"Till\",\n    \"amount\": \"Belopp\",\n    \"convert\": \"Konvertera\",\n    \"result\": \"Resultat\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Uppåtgående trend\",\n    \"downtrend\": \"Nedåtgående trend\",\n    \"high\": \"Hög\",\n    \"low\": \"Låg\",\n    \"retracements\": \"Retracementer\",\n    \"extensions\": \"Tillägg\",\n    \"values\": \"Värden\",\n    \"result\": \"Resultat\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Margin Calculator\",\n    \"leverage\": \"Uttnytja\",\n    \"lotSize\": \"Volym i Lotter\",\n    \"accountCurrency\": \"Kontots Basvaluta\",\n    \"currencyPair\": \"Valutapar\",\n    \"accountType\": \"Kontotyp\",\n    \"price\": \"Nuvarande Konverteringspris\",\n    \"requiredMargin\": \"Krävd Marginal\",\n    \"result\": \"Resultat\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivots\",\n    \"classic\": \"Klassisk\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Kamrilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"Högt Pris\",\n    \"low\": \"Lågt Pris\",\n    \"open\": \"Öppningspris\",\n    \"close\": \"Stängningskurs\",\n    \"pivotPoints\": \"Vändpunkt\",\n    \"res-4\": \"4:e Motstånd\",\n    \"res-3\": \"3:e Motstånd\",\n    \"res-2\": \"2:a Motstånd\",\n    \"res-1\": \"1:a Motstånd\",\n    \"pivot\": \"Pivot Point\",\n    \"sup-1\": \"1:a Stöd\",\n    \"sup-2\": \"2:a Stöd\",\n    \"sup-3\": \"3:e Stöd\",\n    \"sup-4\": \"4:e Stöd\",\n    \"result\": \"Resultat\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"open\": \"Öppen\",\n    \"value\": \"Värde/Pip\",\n    \"buy\": \"Köpa/Lång\",\n    \"sell\": \"Sälj/Blankning\",\n    \"lots\": \"Massor\",\n    \"stop\": \"Stopp\",\n    \"Limit\": \"Gräns\",\n    \"maxLoss\": \"Maxförlus\",\n    \"maxProfit\": \"Maxvinst\",\n    \"result\": \"Resultat\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Stop Loss / Take Profit Levels\",\n    \"buy\": \"Köpa/Lång\",\n    \"sell\": \"Sälj/Blankning\",\n    \"open\": \"Öppen\",\n    \"value\": \"Värde/Pip\",\n    \"lots\": \"Massor\",\n    \"risk\": \"Belopp att Vinna\",\n    \"gain\": \"Belopp att Riskera\",\n    \"stopLoss\": \"Stop Loss Vid\",\n    \"takeProfit\": \"Ta Profit Vid\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Ta Profit (Pips)\",\n    \"result\": \"Resultat\"\n  },\n  \"heatmap\": {\n    \"title\": \"Heatmap\",\n    \"currencies\": \"Valutor\",\n    \"value\": \"Värde\",\n    \"result\": \"Resultat\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intradag 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intradag 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intradag 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Dagligen\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Veckovis\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Månadsvis\"\n      }\n    },\n    \"tooManyCurrencies\": \"Too many currencies selected. Please select up to 8 currencies.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"Economic Calendar\",\n    \"impact\": \"Påverkan\",\n    \"high\": \"Hög\",\n    \"medium\": \"Medel\",\n    \"low\": \"Låg\",\n    \"countries\": \"Länder\",\n    \"customRange\": \"Eget intervall\",\n    \"yesterday\": \"Igår\",\n    \"today\": \"Idag\",\n    \"tomorrow\": \"Imorgon\",\n    \"thisWeek\": \"Denna vecka\",\n    \"lastWeek\": \"Förra veckan\",\n    \"nextWeek\": \"Nästa vecka\",\n    \"noEventsFound\": \"Inga händelser hittades\",\n    \"event\": \"Händelse\",\n    \"actual\": \"Utfall\",\n    \"forecast\": \"Prognos\",\n    \"previous\": \"Föregående\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"Time\",\n        \"news\": \"News\",\n        \"impact\": \"Impact\",\n        \"impactedCurrency\": \"Impacted Currency\",\n        \"actual\": \"Actual\",\n        \"forecast\": \"Forecast\",\n        \"prior\": \"Prior\",\n        \"impactedInstruments\": \"Impacted Instruments\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"Custom Dates\",\n        \"selectDateRange\": \"Select Date Range\",\n        \"startDate\": \"Start Date\",\n        \"endDate\": \"End Date\",\n        \"apply\": \"Apply\"\n      },\n      \"andMore\": \"and more\",\n      \"stocks\": {\n        \"splits\": \"Splittar\",\n        \"earnings\": \"Vinster\",\n        \"dividends\": \"Utdelningar\",\n        \"stockSplit\": \"Aktiesplit\",\n        \"dividend\": \"Utdelning\",\n        \"epsActual\": \"EPS faktisk\",\n        \"epsForecast\": \"EPS prognos\",\n        \"revenueActual\": \"Intäkter faktiska\",\n        \"revenueForecast\": \"Intäkter prognos\",\n        \"exDate\": \"X-dag\",\n        \"cycle\": \"Cykel\",\n        \"payment\": \"Betalning\",\n        \"yield\": \"Avkastning\",\n        \"ratio\": \"Kvot\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Signals\",\n    \"support\": \"Stöd\",\n    \"resistance\": \"Motstånd\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Sök i ordlistan...\",\n    \"noResults\": \"Inga resultat hittades.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"Alla\",\n      \"forex\": \"Valutor\",\n      \"stock\": \"Aktier\",\n      \"crypto\": \"Krypto\",\n      \"cmd\": \"Råvaror\",\n      \"worldec\": \"Världsekonomi\",\n      \"regec\": \"Regional ekonomi\"\n    },\n    \"searchPlaceholder\": \"Sök nyheter, marknader, symboler...\",\n    \"searchLabel\": \"Sök nyheter\",\n    \"articleCategoriesLabel\": \"Artikelkategorier\",\n    \"latestNews\": \"Senaste nytt\",\n    \"noSearchResults\": \"Inga artiklar matchar din sökning.\",\n    \"loading\": \"Laddar...\",\n    \"loadMore\": \"Visa fler\",\n    \"popularTopics\": \"Populära ämnen\",\n    \"relatedNews\": \"Relaterade nyheter\",\n    \"back\": \"Tillbaka\",\n    \"share\": \"Dela\",\n    \"readingTime\": \"{minutes} min läsning\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"Senaste liveuppdateringen\",\n      \"live\": \"LIVE\",\n      \"openFeed\": \"Öppna liveflödet\",\n      \"resume\": \"Återuppta liveuppdateringar\",\n      \"pause\": \"Pausa liveuppdateringar\",\n      \"title\": \"Liveuppdateringar\",\n      \"viewAll\": \"Visa alla uppdateringar\",\n      \"newestFirst\": \"Nyaste först\",\n      \"oldestFirst\": \"Äldsta först\",\n      \"sortOldestFirst\": \"Sortera äldsta först\",\n      \"sortNewestFirst\": \"Sortera nyaste först\",\n      \"newUpdate\": \"{count} ny uppdatering\",\n      \"newUpdates\": \"{count} nya uppdateringar\",\n      \"loading\": \"Laddar liveuppdateringar…\",\n      \"loadError\": \"Det gick inte att ladda liveuppdateringarna.\",\n      \"tryAgain\": \"Försök igen\",\n      \"empty\": \"Inga liveuppdateringar ännu.\",\n      \"latest\": \"SENASTE\",\n      \"loadingEarlier\": \"Laddar…\",\n      \"loadEarlier\": \"Ladda tidigare uppdateringar\",\n      \"backToNews\": \"Tillbaka till nyheter\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"Daglig marknadsöversikt\",\n      \"title\": \"Dagens marknadsöversikt\",\n      \"description\": \"En kortfattad daglig videosammanfattning av de rörelser som spelar roll och vad du bör bevaka härnäst.\",\n      \"cta\": \"Se hela uppdateringen\",\n      \"share\": \"Dela\",\n      \"noVideo\": \"Ingen video tillgänglig ännu.\",\n      \"copied\": \"Kopierat!\",\n      \"copyLink\": \"Kopiera länk\",\n      \"shareOn\": \"Dela på {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"Marknadsrörelser\",\n    \"active\": \"Mest aktiva\",\n    \"gainers\": \"Vinnare\",\n    \"losers\": \"Förlorare\",\n    \"noData\": \"Inga data\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"Senaste 15 minuterna\",\n      \"1h\": \"Senaste timmen\",\n      \"1d\": \"Senaste dagen\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"Råolja\",\n      \"gold\": \"Guld\",\n      \"silver\": \"Silver\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"Analytikerrekommendationer\",\n    \"strongSell\": \"Starkt sälj\",\n    \"moderateSell\": \"Måttligt sälj\",\n    \"hold\": \"Behåll\",\n    \"moderateBuy\": \"Måttligt köp\",\n    \"strongBuy\": \"Starkt köp\",\n    \"sell\": \"Sälj\",\n    \"buy\": \"Köp\",\n    \"averageTarget\": \"Genomsnittlig riktkurs\",\n    \"noData\": \"Det finns inga analytikerrekommendationer för denna tillgång.\",\n    \"loadError\": \"Det gick inte att läsa in analytikerrekommendationerna.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"Öppning\",\n    \"close\": \"Stängning\",\n    \"dayRange\": \"Dagsintervall\",\n    \"volume\": \"Volym\",\n    \"keyStatistics\": \"Nyckelstatistik\",\n    \"performance\": \"Avkastning\",\n    \"week1\": \"1 vecka\",\n    \"month1\": \"1 månad\",\n    \"month3\": \"3 månader\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"Analytikerkonsensus\",\n    \"relatedNews\": \"Relaterade nyheter\",\n    \"noData\": \"Inga data\",\n    \"loadError\": \"Kan inte ladda data\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"통화 변환기\",\n    \"from\": \"기준 통화\",\n    \"to\": \"대상 통화\",\n    \"amount\": \"금액\",\n    \"convert\": \"변환\",\n    \"result\": \"결과\"\n  },\n  \"fibonacci\": {\n    \"title\": \"피보나치\",\n    \"uptrend\": \"상승 추세\",\n    \"downtrend\": \"하락 추세\",\n    \"high\": \"고점 (b)\",\n    \"low\": \"저점 (a)\",\n    \"retracements\": \"되돌림\",\n    \"extensions\": \"확장\",\n    \"values\": \"값\",\n    \"result\": \"결과\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"마진 계산기\",\n    \"leverage\": \"레버리지\",\n    \"lotSize\": \"거래량(랏)\",\n    \"accountCurrency\": \"계정 통화\",\n    \"currencyPair\": \"통화쌍\",\n    \"accountType\": \"계정 유형\",\n    \"price\": \"현재 환산 가격\",\n    \"requiredMargin\": \"필요 증거금\",\n    \"result\": \"결과\"\n  },\n  \"pivots\": {\n    \"title\": \"피벗\",\n    \"classic\": \"클래식\",\n    \"woodie\": \"우디\",\n    \"camarilla\": \"카마릴라\",\n    \"demark\": \"디마크\",\n    \"high\": \"고가\",\n    \"low\": \"저가\",\n    \"open\": \"시가\",\n    \"close\": \"종가\",\n    \"pivotPoints\": \"피벗 포인트\",\n    \"res-4\": \"4차 저항선\",\n    \"res-3\": \"3차 저항선\",\n    \"res-2\": \"2차 저항선\",\n    \"res-1\": \"1차 저항선\",\n    \"pivot\": \"피벗 포인트\",\n    \"sup-1\": \"1차 지지선\",\n    \"sup-2\": \"2차 지지선\",\n    \"sup-3\": \"3차 지지선\",\n    \"sup-4\": \"4차 지지선\",\n    \"result\": \"결과\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"손절 / 이익실현\",\n    \"open\": \"진입 가격\",\n    \"value\": \"핍당 가치\",\n    \"buy\": \"매수/롱\",\n    \"sell\": \"매도/숏\",\n    \"lots\": \"랏\",\n    \"stop\": \"손절\",\n    \"Limit\": \"이익실현\",\n    \"maxLoss\": \"최대 손실\",\n    \"maxProfit\": \"최대 수익\",\n    \"result\": \"결과\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"손절 / 이익실현 레벨\",\n    \"buy\": \"매수/롱\",\n    \"sell\": \"매도/숏\",\n    \"open\": \"진입 가격\",\n    \"value\": \"핍당 가치\",\n    \"lots\": \"랏\",\n    \"risk\": \"감수 금액\",\n    \"gain\": \"목표 수익\",\n    \"stopLoss\": \"손절 가격\",\n    \"takeProfit\": \"이익실현 가격\",\n    \"stopLossPips\": \"손절(핍)\",\n    \"takeProfitPips\": \"이익실현(핍)\",\n    \"result\": \"결과\"\n  },\n  \"heatmap\": {\n    \"title\": \"히트맵\",\n    \"currencies\": \"통화\",\n    \"value\": \"값\",\n    \"result\": \"결과\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"15분\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"60분\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"240분\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"일간\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"주간\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"월간\"\n      }\n    },\n    \"tooManyCurrencies\": \"너무 많은 통화가 선택되었습니다. 최대 8개까지 선택할 수 있습니다.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"경제 캘린더\",\n    \"impact\": \"영향도\",\n    \"high\": \"높음\",\n    \"medium\": \"중간\",\n    \"low\": \"낮음\",\n    \"countries\": \"국가\",\n    \"customRange\": \"사용자 지정 기간\",\n    \"yesterday\": \"어제\",\n    \"today\": \"오늘\",\n    \"tomorrow\": \"내일\",\n    \"thisWeek\": \"이번 주\",\n    \"lastWeek\": \"지난주\",\n    \"nextWeek\": \"다음 주\",\n    \"noEventsFound\": \"이벤트가 없습니다\",\n    \"event\": \"이벤트\",\n    \"actual\": \"실제\",\n    \"forecast\": \"예측\",\n    \"previous\": \"이전\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"시간\",\n        \"news\": \"뉴스\",\n        \"impact\": \"영향도\",\n        \"impactedCurrency\": \"영향받는 통화\",\n        \"actual\": \"실제\",\n        \"forecast\": \"예측\",\n        \"prior\": \"이전\",\n        \"impactedInstruments\": \"영향받는 상품\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"사용자 지정 날짜\",\n        \"selectDateRange\": \"기간 선택\",\n        \"startDate\": \"시작 날짜\",\n        \"endDate\": \"종료 날짜\",\n        \"apply\": \"적용\"\n      },\n      \"andMore\": \"외\",\n      \"stocks\": {\n        \"splits\": \"액면분할\",\n        \"earnings\": \"실적\",\n        \"dividends\": \"배당\",\n        \"stockSplit\": \"주식분할\",\n        \"dividend\": \"배당금\",\n        \"epsActual\": \"EPS 실제\",\n        \"epsForecast\": \"EPS 예상\",\n        \"revenueActual\": \"매출 실제\",\n        \"revenueForecast\": \"매출 예상\",\n        \"exDate\": \"배당락일\",\n        \"cycle\": \"주기\",\n        \"payment\": \"지급\",\n        \"yield\": \"수익률\",\n        \"ratio\": \"비율\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"시그널\",\n    \"support\": \"지지\",\n    \"resistance\": \"저항\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"용어 검색...\",\n    \"noResults\": \"검색 결과가 없습니다.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"전체\",\n      \"forex\": \"외환\",\n      \"stock\": \"주식\",\n      \"crypto\": \"암호화폐\",\n      \"cmd\": \"원자재\",\n      \"worldec\": \"세계 경제\",\n      \"regec\": \"지역 경제\"\n    },\n    \"searchPlaceholder\": \"뉴스, 시장, 종목 검색...\",\n    \"searchLabel\": \"뉴스 검색\",\n    \"articleCategoriesLabel\": \"기사 카테고리\",\n    \"latestNews\": \"최신 뉴스\",\n    \"noSearchResults\": \"검색과 일치하는 기사가 없습니다.\",\n    \"loading\": \"불러오는 중...\",\n    \"loadMore\": \"더 보기\",\n    \"popularTopics\": \"인기 주제\",\n    \"relatedNews\": \"관련 뉴스\",\n    \"back\": \"뒤로\",\n    \"share\": \"공유\",\n    \"readingTime\": \"읽는 시간: {minutes}분\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"최신 실시간 업데이트\",\n      \"live\": \"실시간\",\n      \"openFeed\": \"실시간 피드 열기\",\n      \"resume\": \"실시간 업데이트 재개\",\n      \"pause\": \"실시간 업데이트 일시 중지\",\n      \"title\": \"실시간 업데이트\",\n      \"viewAll\": \"모든 업데이트 보기\",\n      \"newestFirst\": \"최신순\",\n      \"oldestFirst\": \"오래된순\",\n      \"sortOldestFirst\": \"오래된순으로 정렬\",\n      \"sortNewestFirst\": \"최신순으로 정렬\",\n      \"newUpdate\": \"새 업데이트 {count}개\",\n      \"newUpdates\": \"새 업데이트 {count}개\",\n      \"loading\": \"실시간 업데이트 불러오는 중…\",\n      \"loadError\": \"실시간 업데이트를 불러올 수 없습니다.\",\n      \"tryAgain\": \"다시 시도\",\n      \"empty\": \"아직 실시간 업데이트가 없습니다.\",\n      \"latest\": \"최신\",\n      \"loadingEarlier\": \"불러오는 중…\",\n      \"loadEarlier\": \"이전 업데이트 불러오기\",\n      \"backToNews\": \"뉴스로 돌아가기\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"데일리 마켓 브리프\",\n      \"title\": \"오늘의 마켓 브리프\",\n      \"description\": \"주요 시장 움직임과 다음에 주목할 포인트를 매일 영상으로 간결하게 전해드립니다.\",\n      \"cta\": \"전체 업데이트 보기\",\n      \"share\": \"공유\",\n      \"noVideo\": \"아직 영상이 없습니다.\",\n      \"copied\": \"복사됨!\",\n      \"copyLink\": \"링크 복사\",\n      \"shareOn\": \"{name}에서 공유\"\n  },\n  \"topMovers\": {\n    \"title\": \"시장 주요 종목\",\n    \"active\": \"거래량 상위\",\n    \"gainers\": \"상승\",\n    \"losers\": \"하락\",\n    \"noData\": \"데이터 없음\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"최근 15분\",\n      \"1h\": \"최근 1시간\",\n      \"1d\": \"최근 1일\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"원유\",\n      \"gold\": \"금\",\n      \"silver\": \"은\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"애널리스트 추천\",\n    \"strongSell\": \"적극 매도\",\n    \"moderateSell\": \"매도\",\n    \"hold\": \"보유\",\n    \"moderateBuy\": \"매수\",\n    \"strongBuy\": \"적극 매수\",\n    \"sell\": \"매도\",\n    \"buy\": \"매수\",\n    \"averageTarget\": \"평균 목표가\",\n    \"noData\": \"이 자산에 대한 애널리스트 추천이 없습니다.\",\n    \"loadError\": \"애널리스트 추천을 불러올 수 없습니다.\"\n  },\n  \"assetOverview\": {\n    \"open\": \"시가\",\n    \"close\": \"종가\",\n    \"dayRange\": \"일간 변동범위\",\n    \"volume\": \"거래량\",\n    \"keyStatistics\": \"주요 통계\",\n    \"performance\": \"성과\",\n    \"week1\": \"1주\",\n    \"month1\": \"1개월\",\n    \"month3\": \"3개월\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"애널리스트 컨센서스\",\n    \"relatedNews\": \"관련 뉴스\",\n    \"noData\": \"데이터 없음\",\n    \"loadError\": \"데이터를 불러올 수 없음\"\n  }\n}\n","{\n  \"currencyConverter\": {\n    \"title\": \"Currency Converter\",\n    \"from\": \"From\",\n    \"to\": \"To\",\n    \"amount\": \"Amount\",\n    \"convert\": \"Convert\",\n    \"result\": \"Result\"\n  },\n  \"fibonacci\": {\n    \"title\": \"Fibonacci\",\n    \"uptrend\": \"Uptrend\",\n    \"downtrend\": \"Downtrend\",\n    \"high\": \"High (b)\",\n    \"low\": \"Low (a)\",\n    \"retracements\": \"Retracements\",\n    \"extensions\": \"Extensions\",\n    \"values\": \"Values\",\n    \"result\": \"Result\"\n  },\n  \"marginCalculator\": {\n    \"title\": \"Margin Calculator\",\n    \"leverage\": \"Leverage\",\n    \"lotSize\": \"Volume in Lots\",\n    \"accountCurrency\": \"Account Currency\",\n    \"currencyPair\": \"Currency Pair\",\n    \"accountType\": \"Account Type\",\n    \"price\": \"Current Conversion Price\",\n    \"requiredMargin\": \"Required Margin\",\n    \"result\": \"Result\"\n  },\n  \"pivots\": {\n    \"title\": \"Pivots\",\n    \"classic\": \"Classic\",\n    \"woodie\": \"Woodie\",\n    \"camarilla\": \"Camarilla\",\n    \"demark\": \"DeMark\",\n    \"high\": \"High Price\",\n    \"low\": \"Low Price\",\n    \"open\": \"Open Price\",\n    \"close\": \"Close Price\",\n    \"pivotPoints\": \"Pivot Points\",\n    \"res-4\": \"4th Resistance\",\n    \"res-3\": \"3rd Resistance\",\n    \"res-2\": \"2nd Resistance\",\n    \"res-1\": \"1st Resistance\",\n    \"pivot\": \"Pivot Point\",\n    \"sup-1\": \"1st Support\",\n    \"sup-2\": \"2nd Support\",\n    \"sup-3\": \"3rd Support\",\n    \"sup-4\": \"4th Support\",\n    \"result\": \"Result\"\n  },\n  \"stopLossTakeProfit\": {\n    \"title\": \"Stop Loss / Take Profit\",\n    \"open\": \"Open Price\",\n    \"value\": \"Value/Pip\",\n    \"buy\": \"Buy/Long\",\n    \"sell\": \"Sell/Short\",\n    \"lots\": \"Lots\",\n    \"stop\": \"Stop\",\n    \"Limit\": \"Limit\",\n    \"maxLoss\": \"Max Loss\",\n    \"maxProfit\": \"Max Profit\",\n    \"result\": \"Result\"\n  },\n  \"stopLossTakeProfitLevels\": {\n    \"title\": \"Stop Loss / Take Profit Levels\",\n    \"buy\": \"Buy/Long\",\n    \"sell\": \"Sell/Short\",\n    \"open\": \"Open Price\",\n    \"value\": \"Value/Pip\",\n    \"lots\": \"Lots\",\n    \"risk\": \"Amount to Risk\",\n    \"gain\": \"Amount to Gain\",\n    \"stopLoss\": \"Stop Loss at\",\n    \"takeProfit\": \"Take Profit at\",\n    \"stopLossPips\": \"Stop Loss (Pips)\",\n    \"takeProfitPips\": \"Take Profit (Pips)\",\n    \"result\": \"Result\"\n  },\n  \"heatmap\": {\n    \"title\": \"Heatmap\",\n    \"currencies\": \"Currencies\",\n    \"value\": \"Value\",\n    \"result\": \"Result\",\n    \"periods\": {\n      \"15m\": {\n        \"short\": \"15m\",\n        \"long\": \"Intraday 15\"\n      },\n      \"60m\": {\n        \"short\": \"60m\",\n        \"long\": \"Intraday 60\"\n      },\n      \"240m\": {\n        \"short\": \"240m\",\n        \"long\": \"Intraday 240\"\n      },\n      \"1d\": {\n        \"short\": \"1D\",\n        \"long\": \"Daily\"\n      },\n      \"1w\": {\n        \"short\": \"1W\",\n        \"long\": \"Weekly\"\n      },\n      \"1M\": {\n        \"short\": \"1M\",\n        \"long\": \"Monthly\"\n      }\n    },\n    \"tooManyCurrencies\": \"Too many currencies selected. Please select up to 8 currencies.\"\n  },\n  \"economicCalendar\": {\n    \"title\": \"ប្រតិទិនសេដ្ឋកិច្ច\",\n    \"impact\": \"ផលប៉ះពាល់\",\n    \"high\": \"ខ្ពស់\",\n    \"medium\": \"មធ្យម\",\n    \"low\": \"ទាប\",\n    \"countries\": \"ប្រទេស\",\n    \"customRange\": \"ចន្លោះផ្ទាល់ខ្លួន\",\n    \"yesterday\": \"ម្សិលមិញ\",\n    \"today\": \"ថ្ងៃនេះ\",\n    \"tomorrow\": \"ថ្ងៃស្អែក\",\n    \"thisWeek\": \"សប្តាហ៍នេះ\",\n    \"lastWeek\": \"សប្តាហ៍មុន\",\n    \"nextWeek\": \"សប្តាហ៍ក្រោយ\",\n    \"noEventsFound\": \"រកមិនឃើញព្រឹត្តិការណ៍\",\n    \"event\": \"ព្រឹត្តិការណ៍\",\n    \"actual\": \"ជាក់ស្តែង\",\n    \"forecast\": \"ការព្យាករណ៍\",\n    \"previous\": \"មុន\",\n    \"holaPrime\": {\n      \"columns\": {\n        \"time\": \"ពេលវេលា\",\n        \"news\": \"ព័ត៌មាន\",\n        \"impact\": \"ផលប៉ះពាល់\",\n        \"impactedCurrency\": \"រូបិយប័ណ្ណរងផលប៉ះពាល់\",\n        \"actual\": \"ជាក់ស្តែង\",\n        \"forecast\": \"ការព្យាករណ៍\",\n        \"prior\": \"មុន\",\n        \"impactedInstruments\": \"ឧបករណ៍រងផលប៉ះពាល់\"\n      },\n      \"dateRangePicker\": {\n        \"customDates\": \"កាលបរិច្ឆេទផ្ទាល់ខ្លួន\",\n        \"selectDateRange\": \"ជ្រើសរើសចន្លោះកាលបរិច្ឆេទ\",\n        \"startDate\": \"កាលបរិច្ឆេទចាប់ផ្តើម\",\n        \"endDate\": \"កាលបរិច្ឆេទបញ្ចប់\",\n        \"apply\": \"អនុវត្ត\"\n      },\n      \"andMore\": \"និងច្រើនទៀត\",\n      \"stocks\": {\n        \"splits\": \"ការបំបែកភាគហ៊ុន\",\n        \"earnings\": \"ប្រាក់ចំណូល\",\n        \"dividends\": \"ភាគលាភ\",\n        \"stockSplit\": \"ការបំបែកភាគហ៊ុន\",\n        \"dividend\": \"ភាគលាភ\",\n        \"epsActual\": \"EPS ជាក់ស្តែង\",\n        \"epsForecast\": \"EPS ព្យាករណ៍\",\n        \"revenueActual\": \"ចំណូលជាក់ស្តែង\",\n        \"revenueForecast\": \"ចំណូលព្យាករណ៍\",\n        \"exDate\": \"កាលបរិច្ឆេទ Ex\",\n        \"cycle\": \"វដ្ត\",\n        \"payment\": \"ការទូទាត់\",\n        \"yield\": \"ទិន្នផល\",\n        \"ratio\": \"សមាមាត្រ\"\n      }\n    }\n  },\n  \"signals\": {\n    \"title\": \"Signals\",\n    \"support\": \"Support\",\n    \"resistance\": \"Resistance\"\n  },\n  \"glossary\": {\n    \"searchPlaceholder\": \"Search glossary...\",\n    \"noResults\": \"No results found.\"\n  },\n  \"news\": {\n    \"categories\": {\n      \"all\": \"ទាំងអស់\",\n      \"forex\": \"រូបិយប័ណ្ណ\",\n      \"stock\": \"ភាគហ៊ុន\",\n      \"crypto\": \"គ្រីបតូ\",\n      \"cmd\": \"ទំនិញ\",\n      \"worldec\": \"សេដ្ឋកិច្ចពិភពលោក\",\n      \"regec\": \"សេដ្ឋកិច្ចតំបន់\"\n    },\n    \"searchPlaceholder\": \"ស្វែងរកព័ត៌មាន ទីផ្សារ និងនិមិត្តសញ្ញា...\",\n    \"searchLabel\": \"ស្វែងរកព័ត៌មាន\",\n    \"articleCategoriesLabel\": \"ប្រភេទអត្ថបទ\",\n    \"latestNews\": \"ព័ត៌មានថ្មីៗ\",\n    \"noSearchResults\": \"មិនមានអត្ថបទត្រូវនឹងការស្វែងរករបស់អ្នកទេ។\",\n    \"loading\": \"កំពុងផ្ទុក...\",\n    \"loadMore\": \"ផ្ទុកបន្ថែម\",\n    \"popularTopics\": \"ប្រធានបទពេញនិយម\",\n    \"relatedNews\": \"ព័ត៌មានពាក់ព័ន្ធ\",\n    \"back\": \"ត្រឡប់ក្រោយ\",\n    \"share\": \"ចែករំលែក\",\n    \"readingTime\": \"ពេលអាន៖ {minutes} នាទី\",\n    \"liveUpdates\": {\n      \"latestAriaLabel\": \"បច្ចុប្បន្នភាពផ្ទាល់ចុងក្រោយ\",\n      \"live\": \"ផ្សាយផ្ទាល់\",\n      \"openFeed\": \"បើកព័ត៌មានផ្ទាល់\",\n      \"resume\": \"បន្តបច្ចុប្បន្នភាពផ្ទាល់\",\n      \"pause\": \"ផ្អាកបច្ចុប្បន្នភាពផ្ទាល់\",\n      \"title\": \"បច្ចុប្បន្នភាពផ្ទាល់\",\n      \"viewAll\": \"មើលបច្ចុប្បន្នភាពទាំងអស់\",\n      \"newestFirst\": \"ថ្មីបំផុតមុន\",\n      \"oldestFirst\": \"ចាស់បំផុតមុន\",\n      \"sortOldestFirst\": \"តម្រៀបចាស់បំផុតមុន\",\n      \"sortNewestFirst\": \"តម្រៀបថ្មីបំផុតមុន\",\n      \"newUpdate\": \"បច្ចុប្បន្នភាពថ្មី {count}\",\n      \"newUpdates\": \"បច្ចុប្បន្នភាពថ្មី {count}\",\n      \"loading\": \"កំពុងផ្ទុកបច្ចុប្បន្នភាពផ្ទាល់…\",\n      \"loadError\": \"មិនអាចផ្ទុកបច្ចុប្បន្នភាពផ្ទាល់បានទេ។\",\n      \"tryAgain\": \"ព្យាយាមម្តងទៀត\",\n      \"empty\": \"មិនទាន់មានបច្ចុប្បន្នភាពផ្ទាល់ទេ។\",\n      \"latest\": \"ថ្មីបំផុត\",\n      \"loadingEarlier\": \"កំពុងផ្ទុក…\",\n      \"loadEarlier\": \"ផ្ទុកបច្ចុប្បន្នភាពមុនៗ\",\n      \"backToNews\": \"ត្រឡប់ទៅព័ត៌មាន\"\n    }\n  },\n  \"videoNews\": {\n      \"eyebrow\": \"សង្ខេបទីផ្សារប្រចាំថ្ងៃ\",\n      \"title\": \"សង្ខេបទីផ្សារថ្ងៃនេះ\",\n      \"description\": \"វីដេអូសង្ខេបប្រចាំថ្ងៃអំពីចលនាសំខាន់ៗ និងអ្វីដែលគួរតាមដានបន្ទាប់។\",\n      \"cta\": \"មើលព័ត៌មានថ្មីពេញលេញ\",\n      \"share\": \"ចែករំលែក\",\n      \"noVideo\": \"មិនទាន់មានវីដេអូនៅឡើយទេ។\",\n      \"copied\": \"បានចម្លង!\",\n      \"copyLink\": \"ចម្លងតំណ\",\n      \"shareOn\": \"ចែករំលែកលើ {name}\"\n  },\n  \"topMovers\": {\n    \"title\": \"ចលនាទីផ្សារ\",\n    \"active\": \"សកម្មបំផុត\",\n    \"gainers\": \"ឡើងថ្លៃ\",\n    \"losers\": \"ចុះថ្លៃ\",\n    \"noData\": \"គ្មានទិន្នន័យ\"\n  },\n  \"stockWidget\": {\n    \"periods\": {\n      \"15m\": \"១៥ នាទីចុងក្រោយ\",\n      \"1h\": \"១ ម៉ោងចុងក្រោយ\",\n      \"1d\": \"១ ថ្ងៃចុងក្រោយ\"\n    },\n    \"assets\": {\n      \"crudeOil\": \"ប្រេងឆៅ\",\n      \"gold\": \"មាស\",\n      \"silver\": \"ប្រាក់\"\n    }\n  },\n  \"analystRecommendations\": {\n    \"title\": \"អនុសាសន៍របស់អ្នកវិភាគ\",\n    \"strongSell\": \"លក់ខ្លាំង\",\n    \"moderateSell\": \"លក់មធ្យម\",\n    \"hold\": \"កាន់\",\n    \"moderateBuy\": \"ទិញមធ្យម\",\n    \"strongBuy\": \"ទិញខ្លាំង\",\n    \"sell\": \"លក់\",\n    \"buy\": \"ទិញ\",\n    \"averageTarget\": \"តម្លៃគោលដៅមធ្យម\",\n    \"noData\": \"មិនមានអនុសាសន៍របស់អ្នកវិភាគសម្រាប់ទ្រព្យសកម្មនេះទេ។\",\n    \"loadError\": \"មិនអាចផ្ទុកអនុសាសន៍របស់អ្នកវិភាគបានទេ។\"\n  },\n  \"assetOverview\": {\n    \"open\": \"ការបើក\",\n    \"close\": \"ការបិទ\",\n    \"dayRange\": \"ជួរប្រចាំថ្ងៃ\",\n    \"volume\": \"ទំហំ\",\n    \"keyStatistics\": \"ស្ថិតិសំខាន់\",\n    \"performance\": \"ការអនុវត្ត\",\n    \"week1\": \"1 សប្ដាហ៍\",\n    \"month1\": \"1 ខែ\",\n    \"month3\": \"3 ខែ\",\n    \"ytd\": \"YTD\",\n    \"analystConsensus\": \"ការឯកភាពអ្នកវិភាគ\",\n    \"relatedNews\": \"ព័ត៌មានពាក់ព័ន្ធ\",\n    \"noData\": \"គ្មានទិន្នន័យ\",\n    \"loadError\": \"មិនអាចផ្ទុកទិន្នន័យ\"\n  }\n}\n","[\n  {\n    \"id\": \"347175\",\n    \"event\": \"AULEI\",\n    \"title\": \"Westpac Leading Index MoM\",\n    \"indicator\": \"Leading Economic Index\",\n    \"comment\": \"The Westpac-Melbourne Institute Leading Index of Economic Activity combines a selection of economic variables that typically lead fluctuations in economic activity into a single measure that provides a reliable cyclical indicator for the Australian economy. The index includes the following components: S&P/ASX 200, dwelling approvals, US industrial production, RBA Commodity Prices Index (A$), aggregate monthly hours worked, Westpac-MI CSI expectations index, Westpac-MI Unemployment expectations index, yield spread (10Y bond â€“ 90D bill). The index has a base value of 100 as of 1996.\",\n    \"country\": \"AU\",\n    \"currency\": \"AUD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.1\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Melbourne Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 00:00:00\"\n  },\n  {\n    \"id\": \"347114\",\n    \"event\": \"JPSPMI\",\n    \"title\": \"Jibun Bank Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The au Jibun Bank Japan Services PMI is compiled by S&P Global from responses to questionnaires sent to a panel of around 400 service sector companies. The sectors covered include consumer (excluding retail), transport, information, communication, finance, insurance, real estate and business services. The headline figure is the Services Business Activity Index. This is a diffusion index calculated from a question that asks for changes in the volume of business activity compared with one month previously. The Services Business Activity Index is comparable to the Manufacturing Output Index. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"52.5\",\n    \"forecast\": \"\",\n    \"previous\": \"53.1\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 00:30:00\"\n  },\n  {\n    \"id\": \"347113\",\n    \"event\": \"JPCOMPPMI\",\n    \"title\": \"Jibun Bank Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"The au Jibun Bank Japan Composite PMI Output Index, which is a weighted average of the Manufacturing Output Index and the Services Business Activity Index, tracks business trends across private sector activity based on data collected from a representative panel of around 800 companies. The index tracks variables such as sales, new orders, employment, inventories and prices. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"50.3\",\n    \"forecast\": \"\",\n    \"previous\": \"51.5\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 00:30:00\"\n  },\n  {\n    \"id\": \"347112\",\n    \"event\": \"JPMPMI\",\n    \"title\": \"Jibun Bank Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"The au Jibun Bank Japan Manufacturing PMI is compiled by S&P Global from responses to monthly questionnaires sent to purchasing managers in a panel of around 400 manufacturers. The headline figure is the Purchasing Managersâ€™ Index (PMI), which is a weighted average of the following five indices: New Orders (30%), Output (25%), Employment (20%), Suppliersâ€™ Delivery Times (15%) and Stocks of Purchases (10%). For the PMI calculation the Suppliersâ€™ Delivery Times Index is inverted so that it moves in a comparable direction to the other indices. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"47.2\",\n    \"forecast\": \"48.2\",\n    \"previous\": \"48\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 00:30:00\"\n  },\n  {\n    \"id\": \"363417\",\n    \"event\": \"KRINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In South Korea the interest rates decisions are taken by the Bank of Koreaâ€™s (BOK) Monetary Policy Committee. The official interest rate is the Bank of Korea Base Rate which was changed from overnight call rate on March 2008.\",\n    \"country\": \"KR\",\n    \"currency\": \"KRW\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"3.5\",\n    \"forecast\": \"3.5\",\n    \"previous\": \"3.5\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 01:00:00\"\n  },\n  {\n    \"id\": \"347180\",\n    \"event\": \"258088\",\n    \"title\": \"Credit Card Spending YoY\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"NZ\",\n    \"currency\": \"NZD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.3\",\n    \"forecast\": \"\",\n    \"previous\": \"4.3\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 02:00:00\"\n  },\n  {\n    \"id\": \"363290\",\n    \"event\": \"311726\",\n    \"title\": \"3-Month Bill Auction\",\n    \"indicator\": \"3 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"-0.112\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.1157\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 03:35:00\"\n  },\n  {\n    \"id\": \"364562\",\n    \"event\": \"INCOMPPMI\",\n    \"title\": \"HSBC Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"In India, the Nikkei India Composite Output Index is a weighted average of the Manufacturing Output Index and the Services Business Activity Index and tracks business trends across private sector activity, based on data collected from a representative panel of around 800 companies. The index tracks variables such as sales, new orders, employment, inventories and prices. A reading above 50 indicates expansion in business activity and below 50 indicates that it is generally declining.\\n\\n.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"61.5\",\n    \"forecast\": \"\",\n    \"previous\": \"61.2\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 05:00:00\"\n  },\n  {\n    \"id\": \"364552\",\n    \"event\": \"INSPMI\",\n    \"title\": \"HSBC Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The IHS Markit India Services PMI (Purchasing Managers' Index) is based on data compiled from monthly replies to questionnaires sent to purchasing executives in around 350 private service sector companies. The index tracks variables such as sales, employment, inventories and prices. A reading above 50 indicates that the services sector is generally expanding; below 50 indicates that it is generally declining.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"62\",\n    \"forecast\": \"\",\n    \"previous\": \"61.8\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 05:00:00\"\n  },\n  {\n    \"id\": \"364542\",\n    \"event\": \"INMPMI\",\n    \"title\": \"HSBC Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"The S&P Global India Manufacturing Purchasing Managersâ€™ Index measures the performance of the manufacturing sector and is derived from a survey of 500 manufacturing companies. The Manufacturing Purchasing Managers Index is based on five individual indexes with the following weights: New Orders (30 percent), Output (25 percent), Employment (20 percent), Suppliersâ€™ Delivery Times (15 percent) and Stock of Items Purchased (10 percent), with the Delivery Times index inverted so that it moves in a comparable direction. A reading above 50 indicates an expansion of the manufacturing sector compared to the previous month; below 50 represents a contraction; while 50 indicates no change.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"56.7\",\n    \"forecast\": \"\",\n    \"previous\": \"56.5\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 05:00:00\"\n  },\n  {\n    \"id\": \"347120\",\n    \"event\": \"DKBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Denmark, the tendency survey in manufacturing provides information on the current situation as well as expectations for the coming three months for the manufacturing industries. The most important variables used in the survey are production, employment, new orders, sales prices, investment plans and limits to production.\",\n    \"country\": \"DK\",\n    \"currency\": \"DKK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"-7\",\n    \"forecast\": \"\",\n    \"previous\": \"-5\",\n    \"source\": \"Danmarks Statistik\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 07:00:00\"\n  },\n  {\n    \"id\": \"364886\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB Fernandez-Bollo Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 07:30:00\"\n  },\n  {\n    \"id\": \"347269\",\n    \"event\": \"HUWG\",\n    \"title\": \"Gross Wage YoY\",\n    \"indicator\": \"Wage Growth\",\n    \"comment\": \"Gross wage measures the year over year change in gross monthly average earnings of full-time employees in the national economy.\",\n    \"country\": \"HU\",\n    \"currency\": \"HUF\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"16.4\",\n    \"forecast\": \"\",\n    \"previous\": \"14.1\",\n    \"source\": \"Central Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 07:30:00\"\n  },\n  {\n    \"id\": \"347195\",\n    \"event\": \"FRBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In France, Business Climate measures industrial entrepreneursâ€™ sentiment about current business situation and expectation about business conditions. The survey sample comprises about 4,000 enterprises in the manufacturing and mining industries. The indicator is calculated using factor analysis technique. The index is then calculated in a way to measure the current sentiment in relation to the historic index values of the period 1993-2011. A value over 110 indicates unusually high optimism and a value under 90 indicates unusually high pessimism. The value 100 indicates neutrality.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"100\",\n    \"forecast\": \"99\",\n    \"previous\": \"98\",\n    \"source\": \"INSEE\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 07:45:00\"\n  },\n  {\n    \"id\": \"347194\",\n    \"event\": \"FRBCLI\",\n    \"title\": \"Business Climate Indicator\",\n    \"indicator\": \"Business Climate Indicator\",\n    \"comment\": \"In France, the Business Climate Composite Indicator summarizes the information provided by the surveys in manufacturing, services, trade (retail and wholesale), and construction. The business climate is built from 26 balances of opinion from these surveys.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"98\",\n    \"forecast\": \"\",\n    \"previous\": \"99\",\n    \"source\": \"INSEE\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 07:45:00\"\n  },\n  {\n    \"id\": \"347385\",\n    \"event\": \"PSBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Palestine reports chronic trade deficits due to the territories' inability to access key resources and because of the mobility restrictions imposed by Israel. Palestine mainly exports cement, base metals, iron and steel, food and beverages, furniture, plastics and dairy products. Palestine mainly imports oil, food, vegetables, machinery, metals, vehicles, chemicals, livestock, beverages and salt. Palestine's main trading partner is Israel (accounting for around 74 percent of total trade). Other trading partners include China, Turkey, Germany, Italy and France. \\n.\",\n    \"country\": \"PS\",\n    \"currency\": \"ILS\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"-326.6\",\n    \"forecast\": \"\",\n    \"previous\": \"-401.7\",\n    \"source\": \"Central Bureau of Statistics\",\n    \"scale\": \"M\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347285\",\n    \"event\": \"SKHIRMM\",\n    \"title\": \"Harmonised Inflation Rate MoM\",\n    \"indicator\": \"Harmonised Inflation Rate MoM\",\n    \"comment\": \"\",\n    \"country\": \"SK\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"0.8\",\n    \"forecast\": \"0.6\",\n    \"previous\": \"-0.1\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347284\",\n    \"event\": \"SKHIRYY\",\n    \"title\": \"Harmonised Inflation Rate YoY\",\n    \"indicator\": \"Harmonised Inflation Rate YoY\",\n    \"comment\": \"The Harmonised Index of Consumer Prices (HICP) is an indicator of inflation and price stability for the European Central Bank (ECB). The HICP is compiled by Eurostat and the national statistical institutes in accordance with harmonised statistical methods. The ECB aims to maintain annual inflation rates as measured by the HICP below, but close to, 2% over the medium term.\",\n    \"country\": \"SK\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"4.4\",\n    \"forecast\": \"4.3\",\n    \"previous\": \"6.6\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347283\",\n    \"event\": \"ATIRMM\",\n    \"title\": \"Inflation Rate MoM Final\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"AT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.2\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"Statistics Austria\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347282\",\n    \"event\": \"ATIRYY\",\n    \"title\": \"Inflation Rate YoY Final\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Austria, the most important category in the consumer price index is Housing and Utilities (19 percent of total weight). Transport accounts for 14 percent; Restaurants and Hotels for 13 percent; Recreation and Culture for 11 percent; Food and Non-Alcoholic Beverages for 11 percent and Miscellaneous Goods and Services for 9 percent. Alcoholic Beverages and Tobacco; Clothing and Footwear; Household Goods; Health; Communication and Education account for the remaining 23 percent of total weight.\",\n    \"country\": \"AT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"4.5\",\n    \"forecast\": \"\",\n    \"previous\": \"5.6\",\n    \"source\": \"Statistics Austria\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347281\",\n    \"event\": \"ATHIRYY\",\n    \"title\": \"Harmonised Inflation Rate YoY Final\",\n    \"indicator\": \"Harmonised Inflation Rate YoY\",\n    \"comment\": \"The Harmonised Index of Consumer Prices (HICP) is an indicator of inflation and price stability for the European Central Bank (ECB). The HICP is compiled by Eurostat and the national statistical institutes in accordance with harmonised statistical methods. The ECB aims to maintain annual inflation rates as measured by the HICP below, but close to, 2% over the medium term.\",\n    \"country\": \"AT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"4.3\",\n    \"forecast\": \"\",\n    \"previous\": \"5.7\",\n    \"source\": \"Statistics Austria\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347280\",\n    \"event\": \"ATHIRMM\",\n    \"title\": \"Harmonised Inflation Rate MoM Final\",\n    \"indicator\": \"Harmonised Inflation Rate MoM\",\n    \"comment\": \"\",\n    \"country\": \"AT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.4\",\n    \"forecast\": \"\",\n    \"previous\": \"0.5\",\n    \"source\": \"Statistics Austria\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347279\",\n    \"event\": \"ATCPI\",\n    \"title\": \"CPI\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"In Austria, the Consumer Price Index or CPI measures changes in the prices paid by consumers for a basket of goods and services.\",\n    \"country\": \"AT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"122.4\",\n    \"forecast\": \"\",\n    \"previous\": \"122.6\",\n    \"source\": \"Statistics Austria\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:00:00\"\n  },\n  {\n    \"id\": \"347128\",\n    \"event\": \"FRSPMI\",\n    \"title\": \"HCOB Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The HCOB France Services PMI is compiled by S&P Global from responses to questionnaires sent to a panel of around 400 service sector companies. The sectors covered include consumer (excluding retail), transport, information, communication, finance, insurance, real estate and business services. The headline figure is the Services Business Activity Index. This is a diffusion index calculated from a question that asks for changes in the volume of business activity compared with one month previously. The Services Business Activity Index is comparable to the Manufacturing Output Index. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"48\",\n    \"forecast\": \"45.6\",\n    \"previous\": \"45.4\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:15:00\"\n  },\n  {\n    \"id\": \"347127\",\n    \"event\": \"FRMPMI\",\n    \"title\": \"HCOB Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"The HCOB France Manufacturing PMI is compiled by S&P Global from responses to monthly questionnaires sent to purchasing managers in a panel of around 400 manufacturers. The headline figure is the Purchasing Managersâ€™ Index (PMI), which is a weighted average of the following five indices: New Orders (30%), Output (25%), Employment (20%), Suppliersâ€™ Delivery Times (15%) and Stocks of Purchases (10%). For the PMI calculation the Suppliersâ€™ Delivery Times Index is inverted so that it moves in a comparable direction to the other indices. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"46.8\",\n    \"forecast\": \"43.5\",\n    \"previous\": \"43.1\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:15:00\"\n  },\n  {\n    \"id\": \"347126\",\n    \"event\": \"FRCOMPPMI\",\n    \"title\": \"HCOB Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"The HCOB France Composite Output Index, which is a weighted average of the Manufacturing Output Index and the Services Business Activity Index, tracks business trends across private sector activity. The index tracks variables such as sales, new orders, employment, inventories and prices; and varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"47.7\",\n    \"forecast\": \"45\",\n    \"previous\": \"44.6\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:15:00\"\n  },\n  {\n    \"id\": \"363431\",\n    \"event\": \"HKCPI\",\n    \"title\": \"Consumer Price Index CPI\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"In Hong Kong, the Consumer Price Index or CPI measures changes in the prices paid by consumers for a basket of goods and services.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"106.6\",\n    \"forecast\": \"\",\n    \"previous\": \"106.7\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:30:00\"\n  },\n  {\n    \"id\": \"347290\",\n    \"event\": \"HKIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.1\",\n    \"forecast\": \"\",\n    \"previous\": \"0.1\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:30:00\"\n  },\n  {\n    \"id\": \"347289\",\n    \"event\": \"HKIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Hong Kong, the composite consumer price index is based on a monthly survey conducted throughout the territory. The indicator consists of 980 consumer goods and services classified into 9 major groups. Housing accounts for 40.3 percent of total weight, Food for 27.4 percent and Miscellaneous Services such as education, communications, information and medical care for 13.1 percent. Transport constitutes 6.2 percent of total index; Durable Goods for 4 percent; Miscellaneous Goods for 3.3 percent and Clothing and Footwear for 2.4 percent. Electricity, Gas and Water account for 2.8 percent and Alcoholic Drinks and Tobacco for the remaining 0.5 percent.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"1.7\",\n    \"forecast\": \"2.2\",\n    \"previous\": \"2.4\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 08:30:00\"\n  },\n  {\n    \"id\": \"347131\",\n    \"event\": \"DEMPMI\",\n    \"title\": \"HCOB Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"The HCOB Germany Manufacturing PMI is compiled by S&P Global from responses to monthly questionnaires sent to purchasing managers in a panel of around 420 manufacturers. The headline figure is the Purchasing Managersâ€™ Index (PMI), which is a weighted average of the following five indices: New Orders (30%), Output (25%), Employment (20%), Suppliersâ€™ Delivery Times (15%) and Stocks of Purchases (10%). For the PMI calculation the Suppliersâ€™ Delivery Times Index is inverted so that it moves in a comparable direction to the other indices. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"2\",\n    \"period\": \"Feb\",\n    \"actual\": \"42.3\",\n    \"forecast\": \"46.1\",\n    \"previous\": \"45.5\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:30:00\"\n  },\n  {\n    \"id\": \"347130\",\n    \"event\": \"DESPMI\",\n    \"title\": \"HCOB Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The HCOB Germany Services PMI is compiled by S&P Global from responses to questionnaires sent to a panel of around 400 service sector companies. The sectors covered include consumer (excluding retail), transport, information, communication, finance, insurance, real estate and business services. The headline figure is the Services Business Activity Index. This is a diffusion index calculated from a question that asks for changes in the volume of business activity compared with one month previously. The Services Business Activity Index is comparable to the Manufacturing Output Index. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"48.2\",\n    \"forecast\": \"48\",\n    \"previous\": \"47.7\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:30:00\"\n  },\n  {\n    \"id\": \"347129\",\n    \"event\": \"DECOMPPMI\",\n    \"title\": \"HCOB Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"The HCOB Germany Composite Output Index, which is a weighted average of the Manufacturing Output Index and the Services Business Activity Index, tracks business trends across private sector activity. The index tracks variables such as sales, new orders, employment, inventories and prices; and varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"46.1\",\n    \"forecast\": \"47.5\",\n    \"previous\": \"47\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 08:30:00\"\n  },\n  {\n    \"id\": \"347210\",\n    \"event\": \"ITCPI\",\n    \"title\": \"CPI Final\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"In Italy, the most important categories in the Consumer Price Index are: food and non-alcoholic beverages (16 percent of total weight); transport (15 percent); restaurants and hotels (12 percent); housing, water, electricity and other fuels (10 percent); and miscellaneous goods and services (10 percent). The index also includes: health (9 percent); recreation and culture (8 percent); clothing and footwear (7 percent); and furnishing and household equipment (7 percent). Alcoholic beverages, tobacco, communication and education contribute with the remaining 6 percent.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"119.7\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347209\",\n    \"event\": \"ITIRYY\",\n    \"title\": \"Inflation Rate YoY Final\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Italy, the most important categories in the Consumer Price Index are: food and non-alcoholic beverages (18 percent of total weight); transport (14 percent); and housing, water, electricity and other fuels (11 percent). The index also includes: miscellaneous goods and services (9 percent); restaurants and hotels (9 percent); health (9 percent); furnishings, household equipment and maintenance (8 percent); recreation and culture (7 percent); and clothing and footwear (6 percent). Alcoholic beverages and tobacco, communication, and education contribute to the remaining 7 percent of total weight.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"0.8\",\n    \"forecast\": \"0.8\",\n    \"previous\": \"0.6\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347207\",\n    \"event\": \"ITIRMM\",\n    \"title\": \"Inflation Rate MoM Final\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"In Italy, the most important categories in the Consumer Price Index are: food and non-alcoholic beverages (16 percent of total weight); transport (15 percent); restaurants and hotels (12 percent); housing, water, electricity and other fuels (10 percent); and miscellaneous goods and services (10 percent). The index also includes: health (9 percent); recreation and culture (8 percent); clothing and footwear (7 percent); and furnishing and household equipment (7 percent). Alcoholic beverages, tobacco, communication and education contribute with the remaining 6 percent.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"0.3\",\n    \"forecast\": \"0.3\",\n    \"previous\": \"0.2\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347205\",\n    \"event\": \"ITHIRMM\",\n    \"title\": \"Harmonised Inflation Rate MoM Final\",\n    \"indicator\": \"Harmonised Inflation Rate MoM\",\n    \"comment\": \"\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-1.1\",\n    \"forecast\": \"-1.1\",\n    \"previous\": \"0.2\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347203\",\n    \"event\": \"ITHIRYY\",\n    \"title\": \"Harmonised Inflation Rate YoY Final\",\n    \"indicator\": \"Harmonised Inflation Rate YoY\",\n    \"comment\": \"The Harmonised Index of Consumer Prices (HICP) is an indicator of inflation and price stability for the European Central Bank (ECB). The HICP is compiled by Eurostat and the national statistical institutes in accordance with harmonised statistical methods. The ECB aims to maintain annual inflation rates as measured by the HICP below, but close to, 2% over the medium term.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"0.9\",\n    \"forecast\": \"0.9\",\n    \"previous\": \"0.5\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347201\",\n    \"event\": \"CHESI\",\n    \"title\": \"Economic Sentiment Index\",\n    \"indicator\": \"Zew Economic Sentiment Index\",\n    \"comment\": \"In Switzerland, the CS-CFA Society Economic Sentiment Index measures the level of optimism that analysts have about the expected economic developments over the next 6 months. The survey covers up to 350 financial and economic analysts. The index is constructed as the difference between the percentage share of analysts that are optimistic and the percentage of analysts that are pessimistic about the development of the economy. Therefore, the indicator measures the confidence on a scale of -100 (all analysts expect the economy to deteriorate) up to 100 (all analysts expect it to improve). A 0 value indicates neutrality.\",\n    \"country\": \"CH\",\n    \"currency\": \"CHF\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-19.5\",\n    \"source\": \"UBS and CFA Society\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347136\",\n    \"event\": \"EUSPMI\",\n    \"title\": \"HCOB Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The HCOB Eurozone Services PMI is compiled by S&P Global from responses to questionnaires sent to a panel of service providers in Germany, France, Italy, Spain and Ireland. The sectors covered include consumer (excluding retail), transport, information, communication, finance, insurance, real estate and business services. The headline figure is the Services Business Activity Index. This is a diffusion index calculated from a question that asks for changes in the volume of business activity compared with one month previously. The Services Business Activity Index is comparable to the Manufacturing Output Index. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"50\",\n    \"forecast\": \"48.8\",\n    \"previous\": \"48.4\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347135\",\n    \"event\": \"EUMPMI\",\n    \"title\": \"HCOB Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"The HCOB Eurozone Manufacturing PMI is compiled by S&P Global from responses to monthly questionnaires sent to survey panels of manufacturers in Germany, France, Italy, Spain, the Netherlands, Austria, Ireland and Greece, totaling around 3,000 private sector companies. The headline figure is the Purchasing Managersâ€™ Index (PMI), which is a weighted average of the following five indices: New Orders (30%), Output (25%), Employment (20%), Suppliersâ€™ Delivery Times (15%) and Stocks of Purchases (10%). For the PMI calculation the Suppliersâ€™ Delivery Times Index is inverted so that it moves in a comparable direction to the other indices. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"46.1\",\n    \"forecast\": \"47\",\n    \"previous\": \"46.6\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347134\",\n    \"event\": \"EUCOMPPMI\",\n    \"title\": \"HCOB Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"The HCOB Eurozone Composite Output Index, which is a weighted average of the Manufacturing Output Index and the Services Business Activity Index, is compiled by S&P Global from responses to questionnaires sent to survey panels of manufacturers in Germany, France, Italy, Spain, the Netherlands, Austria, Ireland and Greece, and of service providers in Germany, France, Italy, Spain and Ireland, totaling around 5,000 private sector companies. The index tracks variables such as sales, new orders, employment, inventories and prices; and varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"48.9\",\n    \"forecast\": \"48.5\",\n    \"previous\": \"47.9\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"347133\",\n    \"event\": \"PLRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Poland, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"PL\",\n    \"currency\": \"PLN\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3\",\n    \"forecast\": \"1.4\",\n    \"previous\": \"-2.3\",\n    \"source\": \"Central Statistical Office (GUS)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:00:00\"\n  },\n  {\n    \"id\": \"364887\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB Tuominen Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:25:00\"\n  },\n  {\n    \"id\": \"364602\",\n    \"event\": \"RWINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Rwanda interest rates decisions are taken by the National Bank of Rwanda. The official interest rate is the Key Repo Rate.\",\n    \"country\": \"RW\",\n    \"currency\": \"RWF\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"7.5\",\n    \"forecast\": \"\",\n    \"previous\": \"7.5\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"347216\",\n    \"event\": \"MAIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"MA\",\n    \"currency\": \"MAD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.6\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.1\",\n    \"source\": \"Haut Commissariat au Plan\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"347215\",\n    \"event\": \"MAIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Morocco, the inflation rate measures a broad rise or fall in prices that consumers pay for a standard basket of goods.\",\n    \"country\": \"MA\",\n    \"currency\": \"MAD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"2.3\",\n    \"forecast\": \"\",\n    \"previous\": \"3.4\",\n    \"source\": \"Haut Commissariat au Plan\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"347140\",\n    \"event\": \"SICCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Slovenia, the consumer confidence indicator is the average of balances from answers to the questions about the expected household financial situation, the expected general economic situation in the country, the question about expected unemployment, and the question about savings over the next 12 months. The consumer confidence indicator uses a scale of -100 to +100.\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"-29\",\n    \"forecast\": \"\",\n    \"previous\": \"-28\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"347139\",\n    \"event\": \"GBMPMI\",\n    \"title\": \"S&P Global Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"Markit/CIPS UK Manufacturing Purchasing Managersâ€™ Index measures the performance of the manufacturing sector and is derived from a survey of 600 industrial companies. The Manufacturing Purchasing Managers Index is based on five individual indexes with the following weights: New Orders (30 percent), Output (25 percent), Employment (20 percent), Suppliersâ€™ Delivery Times (15 percent) and Stock of Items Purchased (10 percent), with the Delivery Times index inverted so that it moves in a comparable direction. A reading above 50 indicates an expansion of the manufacturing sector compared to the previous month; below 50 represents a contraction; while 50 indicates no change.\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"47.1\",\n    \"forecast\": \"47.5\",\n    \"previous\": \"47\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"347138\",\n    \"event\": \"GBSPMI\",\n    \"title\": \"S&P Global Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The S&P Global/CIPS UK Services PMI (Purchasing Managers' Index) is based on data collected from companies in the transport and communication sector, financial intermediation, business services, personal services, computing and IT and hotels and restaurants. The index tracks variables such as sales, employment, inventories and prices. A reading above 50 indicates that the services sector is generally expanding; below 50 indicates that it is generally declining.\\n.\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"54.3\",\n    \"forecast\": \"54.1\",\n    \"previous\": \"54.3\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"347137\",\n    \"event\": \"GBCOMPPMI\",\n    \"title\": \"S&P Global Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"The UK Composite PMI is a weighted average of the Manufacturing Output Index and the Services Business Activity Index.\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"53.3\",\n    \"forecast\": \"52.9\",\n    \"previous\": \"52.9\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 09:30:00\"\n  },\n  {\n    \"id\": \"364509\",\n    \"event\": \"HRIRMM\",\n    \"title\": \"Inflation Rate MoM Final\",\n    \"indicator\": \"Inflation Rate MoM\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"HR\",\n    \"currency\": \"HRK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.4\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.5\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"364505\",\n    \"event\": \"HRIRYY\",\n    \"title\": \"Inflation Rate YoY Final\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Croatia, the most important category in the consumer price index is Food and Non-Alcoholic Beverages (26 percent of total weight) followed by Housing and Utilities (17 percent), Transport (15 percent), Miscellaneous Goods and Services (6 percent); Clothing and Footwear (6 percent) and Communication (6 percent). Recreation and Culture; Alcoholic Beverages and Tobacco; Furniture, Household Goods and Maintenance; Restaurant and Hotels; Health and Education account for the remaining 25 percent of total weight.\",\n    \"country\": \"HR\",\n    \"currency\": \"HRK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"4.1\",\n    \"forecast\": \"\",\n    \"previous\": \"4.5\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"363238\",\n    \"event\": \"BWINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Botswana, interest rates decisions are taken by The Bank of Botswana. The official interest rate is the Bank Rate.\",\n    \"country\": \"BW\",\n    \"currency\": \"BWP\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"2.4\",\n    \"forecast\": \"\",\n    \"previous\": \"2.4\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347309\",\n    \"event\": \"MTIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Malta, the most important categories in the consumer price index are Food and Non-Alcoholic Beverages accounts for 18 percent and Restaurant and Hotels for 15 percent; Transport for 12 percent; and Housing and Utilities for 10 percent. The index also includes: Furnishings, Household Equipment and Maintenance (9 percent); Miscellaneous Goods and Service (8 percent); and Recreation and Culture (8 percent). Health; Clothing and Footwear; Communication; Alcoholic Beverages and Tobacco; and Education account for the remaining 20 percent of total weight.\",\n    \"country\": \"MT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.7\",\n    \"forecast\": \"\",\n    \"previous\": \"3.7\",\n    \"source\": \"National Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347308\",\n    \"event\": \"EUIRYY\",\n    \"title\": \"Inflation Rate YoY Final\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Euro Area, the inflation rate is calculated using the weighted average of the Harmonised Index of Consumer Price (HICP) aggregates. The main components of the HICP are: food, alcohol and tobacco (21 percent of the total weight), energy (11 percent), non-energy industrial goods (27 percent) and services (42 percent). The HICP aggregates are computed as the weighted average of each countryâ€™s HICP components. The weight of a country is its share of household final monetary consumption expenditure in the total of the countryâ€™s group. The local HICPs are supplied to the Eurostat by the National Statistical Institutes.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"2.8\",\n    \"forecast\": \"2.8\",\n    \"previous\": \"2.9\",\n    \"source\": \"EUROSTAT\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347307\",\n    \"event\": \"EUCIR\",\n    \"title\": \"Core Inflation Rate YoY Final\",\n    \"indicator\": \"Core Inflation Rate\",\n    \"comment\": \"In Euro Area, the core inflation rate is calculated using the weighted average of the Harmonised Index of Consumer Price (HICP) aggregates, excluding energy, food, alcohol & tobacco that face volatile price movements.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.3\",\n    \"forecast\": \"3.3\",\n    \"previous\": \"3.4\",\n    \"source\": \"EUROSTAT\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347306\",\n    \"event\": \"EUIRMM\",\n    \"title\": \"Inflation Rate MoM Final\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.4\",\n    \"forecast\": \"-0.4\",\n    \"previous\": \"0.2\",\n    \"source\": \"EUROSTAT\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347304\",\n    \"event\": \"EUCPI\",\n    \"title\": \"CPI Final\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"123.6\",\n    \"forecast\": \"123.58\",\n    \"previous\": \"124.05\",\n    \"source\": \"EUROSTAT\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347302\",\n    \"event\": \"HRCPI\",\n    \"title\": \"CPI\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"In Croatia, the Consumer Price Index or CPI measures changes in the prices paid by consumers for a basket of goods and services.\",\n    \"country\": \"HR\",\n    \"currency\": \"HRK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"126.9\",\n    \"forecast\": \"\",\n    \"previous\": \"127.4\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347293\",\n    \"event\": \"CYHIRYY\",\n    \"title\": \"Harmonised Inflation Rate YoY\",\n    \"indicator\": \"Harmonised Inflation Rate YoY\",\n    \"comment\": \"The Harmonised Index of Consumer Prices (HICP) is an indicator of inflation and price stability for the European Central Bank (ECB). The HICP is compiled by Eurostat and the national statistical institutes in accordance with harmonised statistical methods. The ECB aims to maintain annual inflation rates as measured by the HICP below, but close to, 2% over the medium term.\",\n    \"country\": \"CY\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"2.1\",\n    \"forecast\": \"\",\n    \"previous\": \"1.9\",\n    \"source\": \"Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 10:00:00\"\n  },\n  {\n    \"id\": \"347231\",\n    \"event\": \"RSPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"RS\",\n    \"currency\": \"RSD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"0\",\n    \"forecast\": \"\",\n    \"previous\": \"1.6\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347230\",\n    \"event\": \"IEPPIYY\",\n    \"title\": \"Wholesale Prices YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"IE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"2.2\",\n    \"forecast\": \"\",\n    \"previous\": \"2.1\",\n    \"source\": \"Central Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347229\",\n    \"event\": \"IEPPIMM\",\n    \"title\": \"Wholesale Prices MoM\",\n    \"indicator\": \"Producer Price Inflation MoM\",\n    \"comment\": \"In Ireland, Wholesale Price Inflation MoM measures a month-over-month change in the price of goods and services sold by manufacturers and producers in the wholesale market.\",\n    \"country\": \"IE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"1.4\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.6\",\n    \"source\": \"Central Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347228\",\n    \"event\": \"MWIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Malawi, the inflation rate measures a broad rise or fall in prices that consumers pay for a standard basket of goods.\",\n    \"country\": \"MW\",\n    \"currency\": \"MWK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"35\",\n    \"forecast\": \"\",\n    \"previous\": \"34.5\",\n    \"source\": \"National Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347226\",\n    \"event\": \"GHPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"GH\",\n    \"currency\": \"GHS\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"17.4\",\n    \"forecast\": \"\",\n    \"previous\": \"18.2\",\n    \"source\": \"Statistical Services\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347224\",\n    \"event\": \"ILMPMI\",\n    \"title\": \"Manufacturing PMI\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"In Israel, the Purchasing Managersâ€™ Index measures the performance of the manufacturing sector and is derived from a survey of a large number of industrial companies. The Purchasing Managers Index is based on six individual indexes: New Orders, Production, Employment, Suppliersâ€™ Delivery Time, Inventories and Prices of Raw-Materials. A reading above 50 indicates an expansion of the manufacturing sector compared to the previous month; below 50 represents a contraction; while 50 indicates no change.\",\n    \"country\": \"IL\",\n    \"currency\": \"ILS\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"50.8\",\n    \"forecast\": \"\",\n    \"previous\": \"49.2\",\n    \"source\": \"Bank Hapoalim/ILPMA\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347147\",\n    \"event\": \"ILMPRMM\",\n    \"title\": \"Manufacturing Production MoM\",\n    \"indicator\": \"Manufacturing Production MoM\",\n    \"comment\": \"\",\n    \"country\": \"IL\",\n    \"currency\": \"ILS\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"-2.7\",\n    \"forecast\": \"\",\n    \"previous\": \"2.6\",\n    \"source\": \"Central Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"338238\",\n    \"event\": \"TRLR\",\n    \"title\": \"Overnight Lending Rate\",\n    \"indicator\": \"Lending Rate\",\n    \"comment\": \"In Turkey, lending rate refers to central bank overnight lending rate.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"46.5\",\n    \"forecast\": \"\",\n    \"previous\": \"46.5\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"338226\",\n    \"event\": \"TRDIR\",\n    \"title\": \"Overnight Borrowing Rate\",\n    \"indicator\": \"Deposit Interest Rate\",\n    \"comment\": \"In Turkey, the Overnight Borrowing Rate refers to the rate under which banks lend or deposit money to the Central Bank.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"43.5\",\n    \"forecast\": \"\",\n    \"previous\": \"43.5\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"338196\",\n    \"event\": \"TRINTR\",\n    \"title\": \"TCMB Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Turkey, benchmark interest rates are set by the Central Bank of the Republic of Turkey Monetary Policy Committee (TÃ¼rkiye Cumhuriyet Merkez Bankasi - TCMB). From June 1st 2018, the main interest rate is the one-week repo rate and the overnight borrowing and lending rates will be determined at 150 bps below/above the one-week repo rate. The central bank simplified its monetary policy framework on May 28th 2018 from a different system with four main key rates, with the late liquidity window lending rate being one of the most followed.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"45\",\n    \"forecast\": \"45\",\n    \"previous\": \"45\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 11:00:00\"\n  },\n  {\n    \"id\": \"347320\",\n    \"event\": \"ALHIRYY\",\n    \"title\": \"Harmonised Inflation Rate YoY\",\n    \"indicator\": \"Harmonised Inflation Rate YoY\",\n    \"comment\": \"The Harmonised Index of Consumer Prices (HICP) is an indicator of inflation and price stability for the European Central Bank (ECB). The HICP is compiled by Eurostat and the national statistical institutes in accordance with harmonised statistical methods. The ECB aims to maintain annual inflation rates as measured by the HICP below, but close to, 2% over the medium term.\",\n    \"country\": \"AL\",\n    \"currency\": \"ALL\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.8\",\n    \"forecast\": \"\",\n    \"previous\": \"4.5\",\n    \"source\": \"Institute of Statistics (INSTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 11:15:00\"\n  },\n  {\n    \"id\": \"342424\",\n    \"event\": \"TRFER\",\n    \"title\": \"Foreign Exchange Reserves\",\n    \"indicator\": \"Foreign Exchange Reserves\",\n    \"comment\": \"In Turkey, Foreign Exchange Reserves refer to gross foreign exchange reserves held or controlled by the country's central bank, excluding gold.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"86.09\",\n    \"forecast\": \"\",\n    \"previous\": \"86.37\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:30:00\"\n  },\n  {\n    \"id\": \"364806\",\n    \"event\": \"ININTR\",\n    \"title\": \"Monetary Policy Meeting Minutes\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In India, interest rate decisions are taken by the Reserve Bank of India's Central Board of Directors. The official interest rate is the benchmark repurchase rate. In 2014, the primary objective of the RBI monetary policy became price stability, giving less importance to government's borrowing, the stability of the rupee exchange rate and the need to protect exports. In February 2015, the government and the central bank agreed to set a consumer inflation target of 4 percent, with a band of plus or minus 2 percentage points, from the financial year ending in March 2017.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 11:30:00\"\n  },\n  {\n    \"id\": \"347332\",\n    \"event\": \"MXGDPYY\",\n    \"title\": \"GDP Growth Rate YoY Final\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"Mexico is the second largest economy in Latin America. The country has an export-oriented economy: more than 90 percent of trade is under free trade agreements. In Mexico, services account for 62 percent of total GDP. The biggest segments within services are: wholesale and retail trade (16 percent); real estate (10 percent); transport, warehousing and communications (7 percent) and financial services and insurance (6 percent). Industry constitutes 18 percent of output and the largest segments within this sector are: automobile industry (4 percent of total GDP) and food industry (3.8 percent). The remaining share is divided by: construction, water, gas and electricity distribution (8 percent), mining (5 percent), government (4 percent ) and agriculture, forestry, fishing and hunting (3 percent).\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"2.5\",\n    \"forecast\": \"2.4\",\n    \"previous\": \"3.3\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347331\",\n    \"event\": \"MXMGDPMM\",\n    \"title\": \"Economic Activity MoM\",\n    \"indicator\": \"Monthly GDP MoM\",\n    \"comment\": \"In Mexico, the overall index of economic activity measures the evolution of the real sector of the economy, in the short term, providing valuable information for decision-making.\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"0\",\n    \"forecast\": \"-0.2\",\n    \"previous\": \"-0.4\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347330\",\n    \"event\": \"MXGDPQQ\",\n    \"title\": \"GDP Growth Rate QoQ Final\",\n    \"indicator\": \"GDP Growth Rate\",\n    \"comment\": \"In Mexico, services account for 62 percent of total GDP. The biggest segments within services are: wholesale and retail trade (16 percent); real estate (10 percent); transport, warehousing and communications (7 percent) and financial services and insurance (6 percent). Industry constitutes 18 percent of output and the largest segments within this sector are: automobile industry (4 percent of total GDP) and food industry (3.8 percent). The remaining share is divided by: construction, water, gas and electricity distribution (8 percent), mining (5 percent), government (4 percent ) and agriculture, forestry, fishing and hunting (3 percent).\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"0.1\",\n    \"forecast\": \"0.1\",\n    \"previous\": \"1.1\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347329\",\n    \"event\": \"MXMGDPYY\",\n    \"title\": \"Economic Activity YoY\",\n    \"indicator\": \"Monthly GDP YoY\",\n    \"comment\": \"In Mexico, the overall index of economic activity measures the evolution of the real sector of the economy, in the short term, providing valuable information for decision-making.\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"1.1\",\n    \"forecast\": \"0.7\",\n    \"previous\": \"2.3\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347324\",\n    \"event\": \"284512\",\n    \"title\": \"Mid-month Core Inflation Rate YoY\",\n    \"indicator\": \"Mid-month Core Inflation Rate YoY\",\n    \"comment\": \"\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"4.63\",\n    \"forecast\": \"4.67\",\n    \"previous\": \"4.78\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347323\",\n    \"event\": \"130234\",\n    \"title\": \"Mid-month Inflation Rate MoM\",\n    \"indicator\": \"Mid-month Inflation Rate MoM\",\n    \"comment\": \"\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"-0.1\",\n    \"forecast\": \"0.15\",\n    \"previous\": \"0.49\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347322\",\n    \"event\": \"130233\",\n    \"title\": \"Mid-month Inflation Rate YoY\",\n    \"indicator\": \"Mid-month Inflation Rate YoY\",\n    \"comment\": \"\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"4.45\",\n    \"forecast\": \"4.7\",\n    \"previous\": \"4.9\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347321\",\n    \"event\": \"130232\",\n    \"title\": \"Mid-month Core Inflation Rate MoM\",\n    \"indicator\": \"Mid-month Core Inflation Rate MoM\",\n    \"comment\": \"\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"0.24\",\n    \"forecast\": \"0.28\",\n    \"previous\": \"0.25\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:00:00\"\n  },\n  {\n    \"id\": \"347440\",\n    \"event\": \"PECA\",\n    \"title\": \"Current Account\",\n    \"indicator\": \"Current Account\",\n    \"comment\": \"Current Account is the sum of the balance of trade (exports minus imports of goods and services), net factor income (such as interest and dividends) and net transfer payments (such as foreign aid).\",\n    \"country\": \"PE\",\n    \"currency\": \"PEN\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"1.63\",\n    \"forecast\": \"\",\n    \"previous\": \"0.44\",\n    \"source\": \"Central Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 12:15:00\"\n  },\n  {\n    \"id\": \"364888\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB Monetary Policy Meeting Accounts\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 12:30:00\"\n  },\n  {\n    \"id\": \"347234\",\n    \"event\": \"NGGDPYY\",\n    \"title\": \"GDP Growth Rate YoY\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"Nigeria is the biggest economy in Africa. Services is the largest sector of the economy, accounting for about 50 percent of total GDP. One of the fastest growing segments in Services are Information and Communication, which together account for about 10 percent of the total output. Agriculture, which in the past was the biggest sector, now weights around 23 percent. Crude Petroleum and Natural Gas constitute only 11 percent of total GDP, while being the main exports. Industry and Construction account for the remaining 16 percent of GDP.\",\n    \"country\": \"NG\",\n    \"currency\": \"NGN\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"3.46\",\n    \"forecast\": \"2.4\",\n    \"previous\": \"2.54\",\n    \"source\": \"National Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:50:00\"\n  },\n  {\n    \"id\": \"347233\",\n    \"event\": \"NGGDPQQ\",\n    \"title\": \"GDP Growth Rate QoQ\",\n    \"indicator\": \"GDP Growth Rate\",\n    \"comment\": \"Nigeria is one of the most developed countries in Africa. Services is the largest sector of the economy, accounting for about 50 percent of total GDP. One of the fastest growing segments in Services are Information and Communication, which together account for about 10 percent of the total output. Agriculture, which in the past was the biggest sector, now weights around 23 percent. Crude Petroleum and Natural Gas constitute only 11 percent of total GDP, while being the main exports. Industry and Construction account for the remaining 16 percent of GDP.\",\n    \"country\": \"NG\",\n    \"currency\": \"NGN\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"12\",\n    \"forecast\": \"\",\n    \"previous\": \"9.7\",\n    \"source\": \"National Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 12:50:00\"\n  },\n  {\n    \"id\": \"347235\",\n    \"event\": \"PLM3\",\n    \"title\": \"M3 Money Supply YoY\",\n    \"indicator\": \"Money Supply M3\",\n    \"comment\": \"Poland Money Supply M3 includes M2 plus long-term time deposits in banks.\",\n    \"country\": \"PL\",\n    \"currency\": \"PLN\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"7.7\",\n    \"forecast\": \"7.9\",\n    \"previous\": \"8.5\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 13:00:00\"\n  },\n  {\n    \"id\": \"347354\",\n    \"event\": \"USCFNAI\",\n    \"title\": \"Chicago Fed National Activity Index\",\n    \"indicator\": \"Chicago Fed National Activity Index\",\n    \"comment\": \"The Chicago Fed National Activity Index (CFNAI) is designed to gauge overall economic activity and related inflationary pressure. The CFNAI is based on a weighted average of 85 existing monthly indicators of national economic activity. It has an average value of zero and a standard deviation of one. Since economic activity tends toward trend growth rate over time, a positive reading corresponds to growth above trend and a negative reading corresponds to growth below trend.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.3\",\n    \"forecast\": \"\",\n    \"previous\": \"0.02\",\n    \"source\": \"Federal Reserve Bank of Chicago\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"347237\",\n    \"event\": \"CAHPIYY\",\n    \"title\": \"New Housing Price Index YoY\",\n    \"indicator\": \"House Price Index YoY\",\n    \"comment\": \"\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.7\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.9\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"347236\",\n    \"event\": \"CAHPIMM\",\n    \"title\": \"New Housing Price Index MoM\",\n    \"indicator\": \"House Price Index MoM\",\n    \"comment\": \"In Canada, New Housing Price Index (NHPI) measures changes over time in the contractors' selling prices of new residential houses, where specifications of each house remain the same between two consecutive periods.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.1\",\n    \"forecast\": \"0.1\",\n    \"previous\": \"\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"342427\",\n    \"event\": \"USJC4W\",\n    \"title\": \"Jobless Claims 4-week Average\",\n    \"indicator\": \"Jobless Claims 4-week Average\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/17\",\n    \"actual\": \"215.25\",\n    \"forecast\": \"\",\n    \"previous\": \"218.75\",\n    \"source\": \"Department of Labour\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"342426\",\n    \"event\": \"USIJC\",\n    \"title\": \"Initial Jobless Claims\",\n    \"indicator\": \"Initial Jobless Claims\",\n    \"comment\": \"Initial jobless claims have a big impact in financial markets because unlike continued claims data which measures the number of persons claiming unemployment benefits, Initial jobless claims measures new and emerging unemployment.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb/17\",\n    \"actual\": \"201\",\n    \"forecast\": \"218\",\n    \"previous\": \"213\",\n    \"source\": \"Department of Labour\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"342425\",\n    \"event\": \"USCJC\",\n    \"title\": \"Continuing Jobless Claims\",\n    \"indicator\": \"Continuing Jobless Claims\",\n    \"comment\": \"Continuing Jobless Claims refer to actual number of unemployed and currently receiving unemployment benefits who filed for unemployment benefits at least two weeks ago.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/10\",\n    \"actual\": \"1862\",\n    \"forecast\": \"1885\",\n    \"previous\": \"1889\",\n    \"source\": \"Department of Labour\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"339877\",\n    \"event\": \"CARSEA\",\n    \"title\": \"Retail Sales Ex Autos MoM\",\n    \"indicator\": \"Retail Sales Ex Autos\",\n    \"comment\": \"Retail Sales Ex Autos report in Canada provides aggregated measure of sales of retail goods and services excluding the automobile sector over a period of a month.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"1\",\n    \"period\": \"Dec\",\n    \"actual\": \"0.6\",\n    \"forecast\": \"0.7\",\n    \"previous\": \"-0.4\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"339874\",\n    \"event\": \"CARSMM\",\n    \"title\": \"Retail Sales MoM\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In Canada, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In Canada, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"1\",\n    \"period\": \"Dec\",\n    \"actual\": \"0.9\",\n    \"forecast\": \"0.8\",\n    \"previous\": \"\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"339871\",\n    \"event\": \"CARSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Canada, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"2.9\",\n    \"forecast\": \"\",\n    \"previous\": \"1.8\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 13:30:00\"\n  },\n  {\n    \"id\": \"347238\",\n    \"event\": \"BEBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Belgium, the business confidence survey measures the level of optimism that people who run companies have about the current economic situation and how they feel about their organizationsâ€™ prospects in the next three months. Every month, a panel of around 6000 business leaders is contacted.\",\n    \"country\": \"BE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-16.4\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 14:00:00\"\n  },\n  {\n    \"id\": \"347165\",\n    \"event\": \"USSPMI\",\n    \"title\": \"S&P Global Services PMI Flash\",\n    \"indicator\": \"Services PMI\",\n    \"comment\": \"The S&P Global US Services PMI is compiled by S&P Global from responses to questionnaires sent to a panel of around 400 service sector companies. The sectors covered include consumer (excluding retail), transport, information, communication, finance, insurance, real estate and business services. The index tracks variables such as sales, employment, inventories and prices; and varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease. The headline figure is the Services Business Activity Index, which is a diffusion index calculated from a question that asks for changes in the volume of business activity compared with one month previously. The Services Business Activity Index is comparable to the Manufacturing Output Index.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"51.3\",\n    \"forecast\": \"52\",\n    \"previous\": \"52.5\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 14:45:00\"\n  },\n  {\n    \"id\": \"347164\",\n    \"event\": \"USCOMPPMI\",\n    \"title\": \"S&P Global Composite PMI Flash\",\n    \"indicator\": \"Composite PMI\",\n    \"comment\": \"In the United States, the S&P Global Composite PMI Output Index, which is a weighted average of the Manufacturing Output Index and the Services Business Activity Index, tracks business trends across both manufacturing and service sectors. The index is based on data collected from a representative panel of over 800 companies and follows variables such as sales, new orders, employment, inventories and prices. A reading above 50 indicates expansion in business activity while below 50 points to contraction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"51.4\",\n    \"forecast\": \"\",\n    \"previous\": \"52\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 14:45:00\"\n  },\n  {\n    \"id\": \"347163\",\n    \"event\": \"USMPMI\",\n    \"title\": \"S&P Global Manufacturing PMI Flash\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"The S&P Global US Manufacturing PMI is compiled by S&P Global from responses to questionnaires sent to purchasing managers in a panel of around 800 manufacturers. The headline figure is the Purchasing Managersâ€™ Index (PMI), which is a weighted average of the following five indices: New Orders (30%), Output (25%), Employment (20%), Suppliersâ€™ Delivery Times (15%) and Stocks of Purchases (10%). For the PMI calculation the Suppliersâ€™ Delivery Times Index is inverted so that it moves in a comparable direction to the other indices. The index varies between 0 and 100, with a reading above 50 indicating an overall increase compared to the previous month, and below 50 an overall decrease.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"51.5\",\n    \"forecast\": \"50.5\",\n    \"previous\": \"50.7\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 14:45:00\"\n  },\n  {\n    \"id\": \"364869\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Jefferson Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 15:00:00\"\n  },\n  {\n    \"id\": \"364596\",\n    \"event\": \"MXINTR\",\n    \"title\": \"Monetary Policy Meeting Minutes\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Mexico, interest rate decisions are taken by the Bank of Mexico (Banco de MÃ©xico). Starting January of 2008, Banco de MÃ©xico has adopted as an operating target the overnight interbank rate (tasa de fondeo bancario) instead of the level of commercial banksâ€™ current account balances at the central bank (corto).\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 15:00:00\"\n  },\n  {\n    \"id\": \"347167\",\n    \"event\": \"USEHS\",\n    \"title\": \"Existing Home Sales\",\n    \"indicator\": \"Existing Home Sales\",\n    \"comment\": \"In the United States, Existing Home Sales occur when the mortgages are closed. Mortgage closing usually takes place 30-60 days after the sales contract is closed.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"4\",\n    \"forecast\": \"3.97\",\n    \"previous\": \"3.88\",\n    \"source\": \"National Association of Realtors\",\n    \"scale\": \"M\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 15:00:00\"\n  },\n  {\n    \"id\": \"347166\",\n    \"event\": \"USEHSMM\",\n    \"title\": \"Existing Home Sales MoM\",\n    \"indicator\": \"Existing Home Sales MoM\",\n    \"comment\": \"In the United States, Existing Home Sales occur when the mortgages are closed. Mortgage closing usually takes place 30-60 days after the sales contract is closed.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.1\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.8\",\n    \"source\": \"National Association of Realtors\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 15:00:00\"\n  },\n  {\n    \"id\": \"364890\",\n    \"event\": \"282596\",\n    \"title\": \"NY Fed Treasury Purchases 4.5 to 7 yrs\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"55\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 15:30:00\"\n  },\n  {\n    \"id\": \"342428\",\n    \"event\": \"USNGSC\",\n    \"title\": \"EIA Natural Gas Stocks Change\",\n    \"indicator\": \"Natural Gas Stocks Change\",\n    \"comment\": \"Natural Gas Stocks Change refers to the weekly change of the natural gas supply situation.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"-60\",\n    \"forecast\": \"-64\",\n    \"previous\": \"-54\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 15:30:00\"\n  },\n  {\n    \"id\": \"342421\",\n    \"event\": \"USHOS\",\n    \"title\": \"EIA Heating Oil Stocks Change\",\n    \"indicator\": \"Heating Oil Stocks\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"-0.351\",\n    \"forecast\": \"\",\n    \"previous\": \"1.536\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342420\",\n    \"event\": \"USGPRO\",\n    \"title\": \"EIA Gasoline Production Change\",\n    \"indicator\": \"Gasoline Production\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"-0.146\",\n    \"forecast\": \"\",\n    \"previous\": \"0.164\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342419\",\n    \"event\": \"USDFS\",\n    \"title\": \"EIA Distillate Stocks Change\",\n    \"indicator\": \"Distillate Stocks\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"-4.009\",\n    \"forecast\": \"-1.739\",\n    \"previous\": \"-1.915\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342418\",\n    \"event\": \"USGSCH\",\n    \"title\": \"EIA Gasoline Stocks Change\",\n    \"indicator\": \"Gasoline Stocks Change\",\n    \"comment\": \"Stocks of gasoline refers to the weekly change of the gasoline supply situation.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"-0.294\",\n    \"forecast\": \"-2.113\",\n    \"previous\": \"-3.658\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342417\",\n    \"event\": \"USDFP\",\n    \"title\": \"EIA Distillate Fuel Production Change\",\n    \"indicator\": \"Distillate Fuel Production\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"0.095\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.281\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342416\",\n    \"event\": \"USRCR\",\n    \"title\": \"EIA Refinery Crude Runs Change\",\n    \"indicator\": \"Refinery Crude Runs\",\n    \"comment\": \"Crude Runs refer to the volume of crude oil consumed by refineries.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"0.031\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.298\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342415\",\n    \"event\": \"USCOSC\",\n    \"title\": \"EIA Crude Oil Stocks Change\",\n    \"indicator\": \"Crude Oil Stocks Change\",\n    \"comment\": \"Stocks of crude oil refer to the weekly change of the crude oil supply situation.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"3.514\",\n    \"forecast\": \"3.879\",\n    \"previous\": \"12.018\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342414\",\n    \"event\": \"USCCOS\",\n    \"title\": \"EIA Cushing Crude Oil Stocks Change\",\n    \"indicator\": \"Cushing Crude Oil Stocks\",\n    \"comment\": \"Change in the number of barrels of crude oil held in storage at the Cushing, Oklahoma during the past week.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"0.741\",\n    \"forecast\": \"\",\n    \"previous\": \"0.71\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342413\",\n    \"event\": \"USCOI\",\n    \"title\": \"EIA Crude Oil Imports Change\",\n    \"indicator\": \"Crude Oil Imports\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"-0.434\",\n    \"forecast\": \"\",\n    \"previous\": \"-1.188\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:00:00\"\n  },\n  {\n    \"id\": \"342430\",\n    \"event\": \"228305\",\n    \"title\": \"8-Week Bill Auction\",\n    \"indicator\": \"8 Week Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"5.275\",\n    \"forecast\": \"\",\n    \"previous\": \"5.27\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:30:00\"\n  },\n  {\n    \"id\": \"342429\",\n    \"event\": \"130351\",\n    \"title\": \"4-Week Bill Auction\",\n    \"indicator\": \"4 Week Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"5.285\",\n    \"forecast\": \"\",\n    \"previous\": \"5.28\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 16:30:00\"\n  },\n  {\n    \"id\": \"347362\",\n    \"event\": \"PEGDPYY\",\n    \"title\": \"GDP Growth Rate YoY\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"Peru is one of the fastest growing economies in Latin America. The services sector is the most important and accounts for 60 percent of GDP. The biggest segments within services are: wholesale and retail trade (17 percent of total GDP); other services (11 percent); transport and communications (10 percent); services provided to companies (8 percent) and government services (6 percent). Manufacturing creates 16 percent of the wealth and construction and water, gas and electricity distribution 10 percent. The agriculture and fishing sector fuels 9 percent of the GDP and the mining sector accounts for the remaining 5 percent.\",\n    \"country\": \"PE\",\n    \"currency\": \"PEN\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"-0.4\",\n    \"forecast\": \"\",\n    \"previous\": \"-1\",\n    \"source\": \"Instituto Nacional de EstadÃ­stica e InformÃ¡tica (INEI)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 17:00:00\"\n  },\n  {\n    \"id\": \"342432\",\n    \"event\": \"338617\",\n    \"title\": \"15-Year Mortgage Rate\",\n    \"indicator\": \"15 Year Mortgage Rate\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/21\",\n    \"actual\": \"6.29\",\n    \"forecast\": \"\",\n    \"previous\": \"6.12\",\n    \"source\": \"Freddie\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 17:00:00\"\n  },\n  {\n    \"id\": \"342431\",\n    \"event\": \"US30YMR\",\n    \"title\": \"30-Year Mortgage Rate\",\n    \"indicator\": \"30 Year Mortgage Rate\",\n    \"comment\": \"The Primary Mortgage Market Survey (PMMS) is focused on conventional, conforming, fully amortizing home purchase loans for borrowers who put 20 percent down and have excellent credit. Average commitment rates should be reported along with average fees and points to reflect the total upfront cost of obtaining the mortgage. The interest rate a lender would charge to lend mortgage money to a qualified borrower exclusive of the fees and points required by the lender. This commitment rate applies only to conventional financing on conforming mortgages with loan-to-value rates of 80 percent or less.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/21\",\n    \"actual\": \"6.9\",\n    \"forecast\": \"\",\n    \"previous\": \"6.77\",\n    \"source\": \"Freddie\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 17:00:00\"\n  },\n  {\n    \"id\": \"339764\",\n    \"event\": \"256652\",\n    \"title\": \"30-Year TIPS Auction\",\n    \"indicator\": \"30 Year TIPS Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"2.2\",\n    \"forecast\": \"\",\n    \"previous\": \"1.97\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 18:00:00\"\n  },\n  {\n    \"id\": \"364133\",\n    \"event\": \"UYINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"The Central Bank of Uruguay reintroduced on September 3rd, 2020, the monetary policy rate after seven years of trying to control inflation through changes in the money supply. The central bank had abandoned the use of a single benchmark interest rate in 2013.\",\n    \"country\": \"UY\",\n    \"currency\": \"UYI\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"9\",\n    \"forecast\": \"\",\n    \"previous\": \"9\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 19:00:00\"\n  },\n  {\n    \"id\": \"347363\",\n    \"event\": \"ARMGDPYY\",\n    \"title\": \"Economic Activity YoY\",\n    \"indicator\": \"Monthly GDP YoY\",\n    \"comment\": \"In Argentina, the Monthly Economic Activity Estimator (EMAE) is a provisional indicator of the evolution of the GDP. Its calculation is structured in the aggregation of the added value at basic prices of each one of the economic activities plus the net taxes of subsidies to the products, using the weights of the national accounts.\",\n    \"country\": \"AR\",\n    \"currency\": \"ARS\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"-4.5\",\n    \"forecast\": \"-2.3\",\n    \"previous\": \"-0.9\",\n    \"source\": \"Instituto Nacional de EstadÃ­stica y Censos (INDEC)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 19:00:00\"\n  },\n  {\n    \"id\": \"364877\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Harker Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 20:15:00\"\n  },\n  {\n    \"id\": \"347371\",\n    \"event\": \"NZRSMM\",\n    \"title\": \"Retail Sales QoQ\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In New Zealand, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In New Zealand, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"NZ\",\n    \"currency\": \"NZD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"-1.9\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.8\",\n    \"source\": \"Stats NZ\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 21:45:00\"\n  },\n  {\n    \"id\": \"347370\",\n    \"event\": \"NZRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In New Zealand, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"NZ\",\n    \"currency\": \"NZD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"-4.1\",\n    \"forecast\": \"\",\n    \"previous\": \"-3.4\",\n    \"source\": \"Stats NZ\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-22 21:45:00\"\n  },\n  {\n    \"id\": \"364878\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Kashkari Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 22:00:00\"\n  },\n  {\n    \"id\": \"364871\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Cook Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-22 22:00:00\"\n  },\n  {\n    \"id\": \"364176\",\n    \"event\": \"148730\",\n    \"title\": \"Eurogroup Meeting\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:00:00\"\n  },\n  {\n    \"id\": \"341587\",\n    \"event\": \"254115\",\n    \"title\": \"Defense of the Fatherland Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:00:00\"\n  },\n  {\n    \"id\": \"340919\",\n    \"event\": \"333817\",\n    \"title\": \"Fatherland Defenderâ€™s Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"KG\",\n    \"currency\": \"KGS\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:00:00\"\n  },\n  {\n    \"id\": \"340846\",\n    \"event\": \"309008\",\n    \"title\": \"The Emperorâ€™s Birthday\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:00:00\"\n  },\n  {\n    \"id\": \"340182\",\n    \"event\": \"152649\",\n    \"title\": \"National Days\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"BN\",\n    \"currency\": \"BND\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:00:00\"\n  },\n  {\n    \"id\": \"347246\",\n    \"event\": \"IECCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Ireland, the Consumer Sentiment Index survey covers a minimum of 1,100 households across all regions of the country.  The questionnaire assesses respondentsâ€™ perceptions on the general economy in the previous 12 months as well as expectations for next 12 months; perceptions of recent trends in unemployment and inflation; recent trends and likely future evolution in the householdâ€™s financial situation as well as savings and major purchases intentions. The Consumer Sentiment Index is calculated as the percentage of favourable replies minus the percentage of unfavourable replies, plus 100. The indicator varies on a scale of 0 to 200; a value of 0 indicates extreme lack of confidence, 100 neutrality and 200 extreme confidence.\",\n    \"country\": \"IE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"74.2\",\n    \"source\": \"KBC Bank Ireland/ESRI\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:01:00\"\n  },\n  {\n    \"id\": \"347245\",\n    \"event\": \"GBCCI\",\n    \"title\": \"Gfk Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In the United Kingdom, the consumer confidence survey measures the level of optimism that consumers have about the performance of the economy in the next 12 months. The GfK Consumer Confidence is derived from the survey of about 2,000 consumers which are ask to rate the relative level of past and future economic conditions including personal financial situation, climate for major purchases, overall economic situation and savings level.\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"-21\",\n    \"forecast\": \"-18\",\n    \"previous\": \"-19\",\n    \"source\": \"GfK Group\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:01:00\"\n  },\n  {\n    \"id\": \"347247\",\n    \"event\": \"GBCAP\",\n    \"title\": \"Car Production YoY\",\n    \"indicator\": \"Car Production\",\n    \"comment\": \"\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"20.7\",\n    \"source\": \"Society of Motor Manufacturers and Traders Limited (SMMT)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:30:00\"\n  },\n  {\n    \"id\": \"364872\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Waller Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 00:35:00\"\n  },\n  {\n    \"id\": \"347115\",\n    \"event\": \"SGCA\",\n    \"title\": \"Current Account\",\n    \"indicator\": \"Current Account\",\n    \"comment\": \"Current Account is the sum of the balance of trade (exports minus imports of goods and services), net factor income (such as interest and dividends) and net transfer payments (such as foreign aid).\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"34.41\",\n    \"forecast\": \"\",\n    \"previous\": \"33.96\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"B\",\n    \"unit\": \"S$\",\n    \"date\": \"2024-02-23 01:00:00\"\n  },\n  {\n    \"id\": \"346963\",\n    \"event\": \"CNHPI\",\n    \"title\": \"House Price Index YoY\",\n    \"indicator\": \"Housing Index\",\n    \"comment\": \"In China, Housing Index is measured by year-over-year change in the index of newly built residential buildings in 70 medium and large cities. The index is calculated in weighted average method and the weight of each city is based on the population.\",\n    \"country\": \"CN\",\n    \"currency\": \"CNY\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.7\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.4\",\n    \"source\": \"National Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 01:30:00\"\n  },\n  {\n    \"id\": \"347270\",\n    \"event\": \"IDM2\",\n    \"title\": \"M2 Money Supply YoY\",\n    \"indicator\": \"Money Supply M2\",\n    \"comment\": \"Indonesia Money Supply M2 includes M1 plus short-term time deposits in banks.\",\n    \"country\": \"ID\",\n    \"currency\": \"IDR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"5.4\",\n    \"forecast\": \"\",\n    \"previous\": \"3.5\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 03:00:00\"\n  },\n  {\n    \"id\": \"347254\",\n    \"event\": \"MYIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"MY\",\n    \"currency\": \"MYR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"0.2\",\n    \"forecast\": \"\",\n    \"previous\": \"0.2\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 04:00:00\"\n  },\n  {\n    \"id\": \"347253\",\n    \"event\": \"MYIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Malaysia, the most important categories in the consumer price index are Food and non-alcoholic beverages (30 percent of total weight) and Housing, water, electricity, gas and other fuels (24 percent of total weight). The index also includes: Transport (15 percent); Miscellaneous goods and services (7 percent); Communication (5 percent); Recreation and culture (5 percent); Furnishings, household equipment and routine household maintenance (4 percent); Clothing and footwear (3 percent); Restaurants and hotels (3 percent); Alcoholic beverages and tobacco (2 percent); Health (2 percent); and Education (1 percent).\",\n    \"country\": \"MY\",\n    \"currency\": \"MYR\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"1.5\",\n    \"forecast\": \"1.6\",\n    \"previous\": \"1.5\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 04:00:00\"\n  },\n  {\n    \"id\": \"347252\",\n    \"event\": \"MYLEI\",\n    \"title\": \"Leading Index MoM\",\n    \"indicator\": \"Leading Economic Index\",\n    \"comment\": \"In Malaysia, the Leading Index provides early signal on the direction in which the economy is going. It is calculated based on  real money supply M1, Bursa Malaysia industrial index, real total traded (eight major trading partners: Japan, USA, Germany, UK, Singapore, Thailand, China, Canada), CPI for services (inverted), industrial material price index, ratio of price to unit labor cost (manufacturing), number of housing permits approved, number of new companies registered, trend adjustment factor. The index has a base value of 100 as of 2005.\",\n    \"country\": \"MY\",\n    \"currency\": \"MYR\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"0.3\",\n    \"forecast\": \"\",\n    \"previous\": \"0.5\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 04:00:00\"\n  },\n  {\n    \"id\": \"347251\",\n    \"event\": \"MYCIND\",\n    \"title\": \"Coincident Index MoM\",\n    \"indicator\": \"Coincident Index\",\n    \"comment\": \"Coincident Index correlates with the business cycle, and is used to identify the current state of the economy. In general, increasing coincident index shows that the economy is in an expansion phase, and decreasing coincident index reflects that the economy is in a contraction phase. The index is calculated using month-over-month percentage changes.\",\n    \"country\": \"MY\",\n    \"currency\": \"MYR\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"-0.5\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.3\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 04:00:00\"\n  },\n  {\n    \"id\": \"347260\",\n    \"event\": \"SGIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.7\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 05:00:00\"\n  },\n  {\n    \"id\": \"347259\",\n    \"event\": \"SGIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Singapore, the most important categories in the Consumer Price Index are: Housing (25%) and Food (21%). The index also includes: Transport (17%); Recreation & Culture (8%); Education (7%); Healthcare (7%); Communications (4%); Clothing & Footwear (2%); Miscellaneous Goods & Services (5%); and Household Durables & Services (5%).\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"2.9\",\n    \"forecast\": \"3.8\",\n    \"previous\": \"3.7\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 05:00:00\"\n  },\n  {\n    \"id\": \"347258\",\n    \"event\": \"SGCIR\",\n    \"title\": \"Core Inflation Rate YoY\",\n    \"indicator\": \"Core Inflation Rate\",\n    \"comment\": \"In Singapore, the core inflation rate tracks changes in prices that consumers pay for a basket of goods excluding changes in the price of cars and accommodation, which are influenced more by government policies.\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.1\",\n    \"forecast\": \"3.6\",\n    \"previous\": \"3.3\",\n    \"source\": \"Monetary Authority\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 05:00:00\"\n  },\n  {\n    \"id\": \"347257\",\n    \"event\": \"SGCPI\",\n    \"title\": \"CPI\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"In Singapore, the Consumer Price Index or CPI measures changes in the prices paid by consumers for a basket of goods and services.\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"114.6\",\n    \"forecast\": \"\",\n    \"previous\": \"115.3\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 05:00:00\"\n  },\n  {\n    \"id\": \"363574\",\n    \"event\": \"KZINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Kazakhstan, interest rates decisions are taken by The National Bank of Kazakhstan. The National Bank of Kazakhstan official interest rate is the overnight policy rate. Policymakers set the overnight repo rate as the new benchmark on September 2nd, 2015, instead of the refinancing rate, after abandoning the currency peg in August.\",\n    \"country\": \"KZ\",\n    \"currency\": \"KZT\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"14.75\",\n    \"forecast\": \"15\",\n    \"previous\": \"15.25\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 06:00:00\"\n  },\n  {\n    \"id\": \"347265\",\n    \"event\": \"DEGDPQQ\",\n    \"title\": \"GDP Growth Rate QoQ Final\",\n    \"indicator\": \"GDP Growth Rate\",\n    \"comment\": \"Germany is the fifth largest economy in the world and the largest within the Euro Area. Germany is the second largest exporter in the world and exports account for more than one-third of national output. As such, the export of high added value products has been the main driver of growth in recent years. Composition of the GDP on the expenditure side: household consumption (55 percent), gross capital formation (20 percent, of which 10 percent in construction, 6 percent in machinery and equipment and 4 percent in other products) and government expenditure (19 percent). Exports of goods and services account for 46 percent of GDP while imports for 39 percent, adding 7 percent to total GDP.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"-0.3\",\n    \"forecast\": \"-0.3\",\n    \"previous\": \"\",\n    \"source\": \"Federal Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 07:00:00\"\n  },\n  {\n    \"id\": \"347264\",\n    \"event\": \"DEGDPYY\",\n    \"title\": \"GDP Growth Rate YoY Final\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"The German economy - the fifth largest economy in the world and Europe's largest - is a leading exporter of machinery, vehicles, chemicals, and household equipment and benefits from a highly skilled labor force. Composition of the GDP on the expenditure side: household consumption (55 percent), gross capital formation (20 percent, of which 10 percent in construction, 6 percent in machinery and equipment and 4 percent in other products) and government expenditure (19 percent). Exports of goods and services account for 46 percent of GDP while imports account for 39 percent, adding 7 percent to total GDP.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"-0.2\",\n    \"forecast\": \"-0.2\",\n    \"previous\": \"-0.3\",\n    \"source\": \"Federal Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 07:00:00\"\n  },\n  {\n    \"id\": \"347261\",\n    \"event\": \"NOLG\",\n    \"title\": \"Loan Growth YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"Loan growth in Norway refers to an annual change in the general publicâ€™s gross domestic debt.\",\n    \"country\": \"NO\",\n    \"currency\": \"NOK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.5\",\n    \"forecast\": \"\",\n    \"previous\": \"3.7\",\n    \"source\": \"Statistics Norway\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 07:00:00\"\n  },\n  {\n    \"id\": \"347187\",\n    \"event\": \"TRBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Turkey, the Business Tendency Survey (BTS) compiles the assessments of the senior managers on the recent past, current situation and their expectations regarding the future course of business environment in the manufacturing industry. A score above 100 indicates an optimistic outlook to the economic activities while below 100 points to a pessimistic outlook.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"101.5\",\n    \"forecast\": \"\",\n    \"previous\": \"100.9\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 07:00:00\"\n  },\n  {\n    \"id\": \"347185\",\n    \"event\": \"TRCU\",\n    \"title\": \"Capacity Utilization\",\n    \"indicator\": \"Capacity Utilization\",\n    \"comment\": \"In Turkey, Capacity Utilization is a measure of how much of the economy's potential output is being used.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"76.4\",\n    \"forecast\": \"\",\n    \"previous\": \"76.2\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 07:00:00\"\n  },\n  {\n    \"id\": \"347268\",\n    \"event\": \"CHNFP\",\n    \"title\": \"Non Farm Payrolls\",\n    \"indicator\": \"Non Farm Payrolls\",\n    \"comment\": \"In Switzerland, Non Farm Payrolls include employee jobs in secondary and tertiary sectors, self-employed jobs, apprentices and business owners.\",\n    \"country\": \"CH\",\n    \"currency\": \"CHF\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"5.488\",\n    \"forecast\": \"\",\n    \"previous\": \"5.465\",\n    \"source\": \"Federal Statistical Office\",\n    \"scale\": \"M\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 07:30:00\"\n  },\n  {\n    \"id\": \"347267\",\n    \"event\": \"HUUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Hungary, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"HU\",\n    \"currency\": \"HUF\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"4.6\",\n    \"forecast\": \"\",\n    \"previous\": \"4.4\",\n    \"source\": \"Central Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 07:30:00\"\n  },\n  {\n    \"id\": \"347278\",\n    \"event\": \"TRTA\",\n    \"title\": \"Tourist Arrivals YoY\",\n    \"indicator\": \"Tourist Arrivals\",\n    \"comment\": \"In Turkey, tourist arrivals refer to the number of visiting foreigners.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"2.1\",\n    \"forecast\": \"\",\n    \"previous\": \"3.51\",\n    \"source\": \"Ministry of Culture and Tourism\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 08:00:00\"\n  },\n  {\n    \"id\": \"347274\",\n    \"event\": \"CZCCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Czech Republic, the Czech Statistical Office consumer confidence indicator is the average of four indicators: expected financial situation of consumers, expected total economic situation, expected total unemployment (with inverted sign) and savings expected in 12 months to come. Generally consumer confidence is high when the unemployment rate is low and GDP growth is high. Measures of average consumer confidence can be useful indicators of how much consumers are likely to spend.\",\n    \"country\": \"CZ\",\n    \"currency\": \"CZK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"94\",\n    \"forecast\": \"\",\n    \"previous\": \"91.2\",\n    \"source\": \"Statistical Office (CSU)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 08:00:00\"\n  },\n  {\n    \"id\": \"347273\",\n    \"event\": \"CZBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Czech Republic, the business confidence survey measures the level of optimism that people who run companies have about the performance of the economy and how they feel about their organizationsâ€™ prospects. Czech Statistical Office business confidence indicator is a weighted average of seasonally adjusted confidence indicators in industry, construction, trade and in selected services.\",\n    \"country\": \"CZ\",\n    \"currency\": \"CZK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"89.9\",\n    \"forecast\": \"\",\n    \"previous\": \"92.7\",\n    \"source\": \"Statistical Office (CSU)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 08:00:00\"\n  },\n  {\n    \"id\": \"347297\",\n    \"event\": \"ISPPIMM\",\n    \"title\": \"PPI MoM\",\n    \"indicator\": \"Producer Price Inflation MoM\",\n    \"comment\": \"In Iceland, the Producer Price Inflation MoM measures a month-over-month change in the price of goods and services sold by manufacturers and producers in the wholesale market.\",\n    \"country\": \"IS\",\n    \"currency\": \"ISK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.4\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.4\",\n    \"source\": \"Statistics Iceland\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"347295\",\n    \"event\": \"ISPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"\",\n    \"country\": \"IS\",\n    \"currency\": \"ISK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-5.9\",\n    \"forecast\": \"\",\n    \"previous\": \"-3.9\",\n    \"source\": \"Statistics Iceland\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"347294\",\n    \"event\": \"PLUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Poland, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"PL\",\n    \"currency\": \"PLN\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"5.4\",\n    \"forecast\": \"5.4\",\n    \"previous\": \"5.1\",\n    \"source\": \"Central Statistical Office (GUS)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"347213\",\n    \"event\": \"DEBCOI\",\n    \"title\": \"Ifo Business Climate\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Germany, the IFO Business Climate Index measures entrepreneursâ€™ sentiment about current business situation and their expectations for the next 6 months. The survey is made by phone and covers 9,000 firms in manufacturing, the service sector, trade and construction. The Business Climate Balance is constructed as the difference between the percentage share of executives that are optimistic and the share that are pessimistic. This balance can take values between -100 (all responding firms assess their situation as poor and expect business to deteriorate) and +100 (all responding firms assessed their situation as good and expect an improvement in their business). For the calculation of the IFO Business Climate Index, the Balance is normalized to the average of a base year (currently 2015).\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"2\",\n    \"period\": \"Feb\",\n    \"actual\": \"85.5\",\n    \"forecast\": \"85.5\",\n    \"previous\": \"85.2\",\n    \"source\": \"Ifo Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"347212\",\n    \"event\": \"DEIFOE\",\n    \"title\": \"Ifo Expectations\",\n    \"indicator\": \"Ifo Expectations\",\n    \"comment\": \"Expectations With Regard to Business Developments in the Next 6 Months.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"84.1\",\n    \"forecast\": \"84\",\n    \"previous\": \"83.5\",\n    \"source\": \"Ifo Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"347211\",\n    \"event\": \"DEIFOCC\",\n    \"title\": \"Ifo Current Conditions\",\n    \"indicator\": \"Ifo Current Conditions\",\n    \"comment\": \"Assessment of the Business Situation.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"86.9\",\n    \"forecast\": \"86.7\",\n    \"previous\": \"86.9\",\n    \"source\": \"Ifo Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"363039\",\n    \"event\": \"EUIE\",\n    \"title\": \"Consumer Inflation Expectations\",\n    \"indicator\": \"Inflation Expectations\",\n    \"comment\": \"In the Euro Area, inflation expectations refer to median expectations for inflation over the next 12 months and are part of the Consumer Expectations Survey published by the ECB.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"3.3\",\n    \"forecast\": \"\",\n    \"previous\": \"3.2\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 09:00:00\"\n  },\n  {\n    \"id\": \"364882\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB Schnabel Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 09:20:00\"\n  },\n  {\n    \"id\": \"347299\",\n    \"event\": \"SITA\",\n    \"title\": \"Tourist Arrivals YoY\",\n    \"indicator\": \"Tourist Arrivals\",\n    \"comment\": \"\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-2.6\",\n    \"forecast\": \"\",\n    \"previous\": \"10.6\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 09:30:00\"\n  },\n  {\n    \"id\": \"347298\",\n    \"event\": \"SIPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-1\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 09:30:00\"\n  },\n  {\n    \"id\": \"347214\",\n    \"event\": \"SIBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Slovenia, business tendency in manufacturing sentiment indicator measures the level of optimism that people who run companies have about the performance of the economy and how they feel about their organizationsâ€™ prospects. Business confidence surveys can provide useful signs about the current condition of the economy, because companies often have information about consumer demand sooner than government statisticians do.\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"-10\",\n    \"forecast\": \"\",\n    \"previous\": \"-8\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 09:30:00\"\n  },\n  {\n    \"id\": \"364889\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB Jochnick Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 09:30:00\"\n  },\n  {\n    \"id\": \"347313\",\n    \"event\": \"MOIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"MO\",\n    \"currency\": \"MOP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-0.17\",\n    \"forecast\": \"\",\n    \"previous\": \"0.27\",\n    \"source\": \"Statistics and Census Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 10:00:00\"\n  },\n  {\n    \"id\": \"347312\",\n    \"event\": \"MOIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Macau, the most important categories in the consumer price index are housing, water, electricity, gas and other fuels (34 percent of total weight) and food and non-alcoholic beverages (28 percent). The index also includes: miscellaneous goods and services (9 percent); transport (8 percent); recreation and culture (5 percent); household furnishings and services (4 percent); communication (3 percent); clothing and footwear (3 percent); health (3 percent); education (2 percent); and alcoholic beverages (1 percent).\",\n    \"country\": \"MO\",\n    \"currency\": \"MOP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"1.01\",\n    \"forecast\": \"\",\n    \"previous\": \"1.42\",\n    \"source\": \"Statistics and Census Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 10:00:00\"\n  },\n  {\n    \"id\": \"347088\",\n    \"event\": \"MOTA\",\n    \"title\": \"Tourist Arrivals YoY\",\n    \"indicator\": \"Tourist Arrivals\",\n    \"comment\": \"\",\n    \"country\": \"MO\",\n    \"currency\": \"MOP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"104.7\",\n    \"forecast\": \"\",\n    \"previous\": \"656\",\n    \"source\": \"Statistics and Census Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 10:00:00\"\n  },\n  {\n    \"id\": \"364912\",\n    \"event\": \"339380\",\n    \"title\": \"30-Year BTPâ‚¬i Auction\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"2.19\",\n    \"forecast\": \"\",\n    \"previous\": \"2.59\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 10:10:00\"\n  },\n  {\n    \"id\": \"364031\",\n    \"event\": \"364030\",\n    \"title\": \"BTP Index-Linked Auction\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"1.73\",\n    \"forecast\": \"\",\n    \"previous\": \"1.61\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 10:10:00\"\n  },\n  {\n    \"id\": \"364020\",\n    \"event\": \"364019\",\n    \"title\": \"BTP Short Term Auction\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"3.41\",\n    \"forecast\": \"\",\n    \"previous\": \"3.21\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 10:10:00\"\n  },\n  {\n    \"id\": \"347319\",\n    \"event\": \"GBDT\",\n    \"title\": \"CBI Distributive Trades\",\n    \"indicator\": \"CBI Distributive Trades\",\n    \"comment\": \"The Confederation of British Industry's (CBI) monthly retail sales balance is a gauge of retail sales versus a year ago. The reading is compiled from a survey of about 150 retail and wholesale companies. It includes measures of sales activity across the distributive trades. It is a leading indicator of consumer spending. The figure is the difference between the percentage of retailers reporting an increase in sales and those reporting a decrease.\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-50\",\n    \"source\": \"Confederation of British Industry\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 11:00:00\"\n  },\n  {\n    \"id\": \"347316\",\n    \"event\": \"BREOI\",\n    \"title\": \"FGV Consumer Confidence\",\n    \"indicator\": \"Economic Optimism Index\",\n    \"comment\": \"IBRE/FGV's monthly Consumer Confidence Survey is designed to capture the sentiment of consumers about the general state of economy and their personal finances. Happy and optimistic consumers are likely to spend more; unhappy and pessimistic consumers spend less. Consumer confidence can thus operate to induce or reduce economic growth. Monitoring consumer sentiment can produce signals about future spending and saving that are useful for anticipating what will happen to the economy in the short run. The IBRE/FGV studies obtain, among other information, consumer assessments and forecasts about the local and family economic situation at the time and for the following months, employment prospects, and intentions and likelihood of buying high-value goods in the next six months. The Consumer Confidence Survey was started in 2002, and data are collected from over 2,000 informants in seven major state capitals:  Belo Horizonte, Brasilia, Porto Alegre, Recife, Salvador, Rio de Janeiro, and SÃ£o Paulo.\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"89.7\",\n    \"forecast\": \"\",\n    \"previous\": \"90.8\",\n    \"source\": \"Getulio Vargas Foundation\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 11:00:00\"\n  },\n  {\n    \"id\": \"347315\",\n    \"event\": \"LUBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Luxembourg is an export-intensive economy. The country has traditionally imported most of its consumer goods and exported industrial products (steel). Exports now also include chemical and rubber products, finished glass and the most profitable financial services. The nation remains dependent on energy imports. European Union is by far its largest trading partner, accounting for about 84% of exports and 87% of imports.\",\n    \"country\": \"LU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.6\",\n    \"source\": \"STATEC\",\n    \"scale\": \"B\",\n    \"unit\": \"â‚¬\",\n    \"date\": \"2024-02-23 11:00:00\"\n  },\n  {\n    \"id\": \"347314\",\n    \"event\": \"LVUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Latvia, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"LV\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"6.8\",\n    \"forecast\": \"\",\n    \"previous\": \"6.5\",\n    \"source\": \"Central Statistical Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 11:00:00\"\n  },\n  {\n    \"id\": \"342497\",\n    \"event\": \"INDG\",\n    \"title\": \"Deposit Growth YoY\",\n    \"indicator\": \"Deposit Growth\",\n    \"comment\": \"In India, deposit growth refers to the year-over-year change of the commercial banks deposits.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/09\",\n    \"actual\": \"13.6\",\n    \"forecast\": \"\",\n    \"previous\": \"13.2\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 11:30:00\"\n  },\n  {\n    \"id\": \"342495\",\n    \"event\": \"INLG\",\n    \"title\": \"Bank Loan Growth YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"In India, bank loan growth refers to the year-over-year change of the overall commercial banks credit to the economy, including food credit, non-food credit and loans, cash credit and overdrafts.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/09\",\n    \"actual\": \"20.3\",\n    \"forecast\": \"\",\n    \"previous\": \"20.3\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 11:30:00\"\n  },\n  {\n    \"id\": \"342433\",\n    \"event\": \"INFER\",\n    \"title\": \"Foreign Exchange Reserves\",\n    \"indicator\": \"Foreign Exchange Reserves\",\n    \"comment\": \"In India, Foreign Exchange Reserves are the foreign assets held or controlled by the country central bank. The reserves are made of gold or a specific currency. They can also be special drawing rights and marketable securities denominated in foreign currencies like treasury bills, government bonds, corporate bonds and equities and foreign currency loans.\",\n    \"country\": \"IN\",\n    \"currency\": \"INR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/16\",\n    \"actual\": \"616.1\",\n    \"forecast\": \"\",\n    \"previous\": \"617.23\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 11:30:00\"\n  },\n  {\n    \"id\": \"347328\",\n    \"event\": \"CLPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"In Chile, the Producer Price Index measures the average change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"CL\",\n    \"currency\": \"CLF\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"1.2\",\n    \"forecast\": \"\",\n    \"previous\": \"0.5\",\n    \"source\": \"National Institute of Statistics (INE)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 12:00:00\"\n  },\n  {\n    \"id\": \"347356\",\n    \"event\": \"XKBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Kosovo has reported increasingly large trade deficits (57 percent of GDP in 2007) due to having a very weak export base. Kosovo predominantly exports metals (47 percent of total exports) and mineral products (30 percent of total exports). Kosovoâ€™s main imports are mineral products, appliances and electric materials, prepared food, beverages and tobacco. Kosovoâ€™s main trading partners are Macedonia, Germany, Italy, Serbia, China and Turkey.\\n.\",\n    \"country\": \"XK\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"-319.7\",\n    \"forecast\": \"\",\n    \"previous\": \"-477.7\",\n    \"source\": \"Agency of Statistics\",\n    \"scale\": \"M\",\n    \"unit\": \"â‚¬\",\n    \"date\": \"2024-02-23 13:00:00\"\n  },\n  {\n    \"id\": \"364883\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB Schnabel Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 13:00:00\"\n  },\n  {\n    \"id\": \"347346\",\n    \"event\": \"BRGR\",\n    \"title\": \"Federal Tax Revenues\",\n    \"indicator\": \"Government Revenues\",\n    \"comment\": \"Government Revenues refer to all receipts the government gets, including taxes, custom duties, revenue from state-owned enterprises, capital revenues and foreign aid. Government Revenues are part of government budget balance calculation.\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"280.636\",\n    \"forecast\": \"\",\n    \"previous\": \"231.225\",\n    \"source\": \"MinistÃ©rio da Fazenda\",\n    \"scale\": \"B\",\n    \"unit\": \"BRL\",\n    \"date\": \"2024-02-23 13:30:00\"\n  },\n  {\n    \"id\": \"347345\",\n    \"event\": \"CAMS\",\n    \"title\": \"Manufacturing Sales MoM Prel\",\n    \"indicator\": \"Manufacturing Sales\",\n    \"comment\": \"In Canada, Manufacturing Sales provides a current 'snapshot' of sales of goods manufactured values by the Canadian manufacturing sector, enabling analysis of the state of the Canadian economy, as well as the health of specific industries in the short- to medium-term.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.7\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 13:30:00\"\n  },\n  {\n    \"id\": \"347337\",\n    \"event\": \"CAWS\",\n    \"title\": \"Wholesale Sales MoM Prel\",\n    \"indicator\": \"Wholesale Sales\",\n    \"comment\": \"The Monthly Wholesale Trade Survey presents estimates of monthly sales for wholesale merchants in Canada, providing information on the performance of the wholesale trade sector as an important indicator of the health of the Canadian economy. In addition, the business community uses the data to analyse market performance.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.3\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 13:30:00\"\n  },\n  {\n    \"id\": \"347355\",\n    \"event\": \"ARCCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Argentina, the Consumer Confidence Index (ICC - Ãndice de Confianza del Consumidor) is based on a survey consisting of six questions referring to the perception of current personal financial situation and economic situation in the country; the future economic situation in the short term and in the long term and expectations regarding the purchase of household items and consumption durables, such as vehicles. The index is a weighted average of three regional indexes: Federal Capital (15.9 percent), Countryside (30.7 percent) and Greater Buenos Aires (53.4 percent). The index is based on the proportion of positive and negative answers over the total number of people surveyed. The value of the index would be equal to 100 if all the answers to a specific question were positive, while in the opposite case the value would be equal to 0.\",\n    \"country\": \"AR\",\n    \"currency\": \"ARS\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"35.6\",\n    \"source\": \"Torcuato di Tella University\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 14:00:00\"\n  },\n  {\n    \"id\": \"347357\",\n    \"event\": \"MXCA\",\n    \"title\": \"Current Account\",\n    \"indicator\": \"Current Account\",\n    \"comment\": \"Current Account is the sum of the balance of trade (exports minus imports of goods and services), net factor income (such as interest and dividends) and net transfer payments (such as foreign aid).\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"5000\",\n    \"previous\": \"2628\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"M\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-23 15:00:00\"\n  },\n  {\n    \"id\": \"363564\",\n    \"event\": \"CAGBV\",\n    \"title\": \"Budget Balance\",\n    \"indicator\": \"Government Budget Value\",\n    \"comment\": \"The government budget balance is the difference between government revenues and expenses, excluding public debt charges. The budget is balanced when outlays equal to receipts, the country reports budget surplus when revenues are higher than expenses and deficit when expenses exceed the revenues.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-4.01\",\n    \"source\": \"Department of Finance\",\n    \"scale\": \"B\",\n    \"unit\": \"C$\",\n    \"date\": \"2024-02-23 16:00:00\"\n  },\n  {\n    \"id\": \"364111\",\n    \"event\": \"PYPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"PY\",\n    \"currency\": \"PYG\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-1.67\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 17:00:00\"\n  },\n  {\n    \"id\": \"342440\",\n    \"event\": \"USTRG\",\n    \"title\": \"Baker Hughes Total Rigs Count\",\n    \"indicator\": \"Total Rigs\",\n    \"comment\": \"US Total Rigs refer to the number of active US rigs drilling in a given week.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"621\",\n    \"source\": \"Baker Hughes Company\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 18:00:00\"\n  },\n  {\n    \"id\": \"342439\",\n    \"event\": \"USCOR\",\n    \"title\": \"Baker Hughes Oil Rig Count\",\n    \"indicator\": \"Crude Oil Rigs\",\n    \"comment\": \"US Crude Oil Rigs refer to the number of active US rigs drilling for oil in a given week.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"497\",\n    \"source\": \"Baker Hughes Company\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-23 18:00:00\"\n  },\n  {\n    \"id\": \"347364\",\n    \"event\": \"ARLEI\",\n    \"title\": \"Leading Indicator MoM\",\n    \"indicator\": \"Leading Economic Index\",\n    \"comment\": \"In Argentina, the Leading Index (ILCIF) anticipates turning points in economic activity throughout the cycle. The index is composed by ten selected series according to their compliance, temporal consistency, economic rationality, representativeness and availability. These series are the following: stock market index of Buenos Aires, Merval Argentina, approved building plans, cement dispatches, bankruptcies, authorized contracts of property transactions, consumer confidence index, M2 Money Supply, metallurgical industry, use of intermediate goods. The index has a base value of 100 as of January of 1993.\",\n    \"country\": \"AR\",\n    \"currency\": \"ARS\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-6.79\",\n    \"source\": \"Torcuato di Tella University\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-23 22:00:00\"\n  },\n  {\n    \"id\": \"341734\",\n    \"event\": \"254247\",\n    \"title\": \"Nawam Full Moon Poya Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"LK\",\n    \"currency\": \"LKR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-24 00:00:00\"\n  },\n  {\n    \"id\": \"340491\",\n    \"event\": \"152719\",\n    \"title\": \"Independence Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"EE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-24 00:00:00\"\n  },\n  {\n    \"id\": \"340183\",\n    \"event\": \"152649\",\n    \"title\": \"National Dayx\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"BN\",\n    \"currency\": \"BND\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-24 00:00:00\"\n  },\n  {\n    \"id\": \"347272\",\n    \"event\": \"ESPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"ES\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-6.3\",\n    \"source\": \"National Statistics Institute (INE)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-24 08:00:00\"\n  },\n  {\n    \"id\": \"347369\",\n    \"event\": \"COBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Colombia, the business confidence index (ICI), measures the level of optimism that business executives in industrial and commercial sectors have about the performance of the economy and how they feel about their organizationsâ€™ prospects. The index also assesses the expectations regarding investment climate, export activity, capacity utilization and employment. The index varies on a scale of -100 to 100, where -100 indicates an extreme lack of confidence, 0 neutrality and 100 extreme confidence.\",\n    \"country\": \"CO\",\n    \"currency\": \"COP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-4.3\",\n    \"source\": \"Fedesarrollo\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-24 15:00:00\"\n  },\n  {\n    \"id\": \"364070\",\n    \"event\": \"364070\",\n    \"title\": \"Parliamentary Election\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"BY\",\n    \"currency\": \"BYN\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-25 00:00:00\"\n  },\n  {\n    \"id\": \"364066\",\n    \"event\": \"364066\",\n    \"title\": \"Senate Election\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"KH\",\n    \"currency\": \"KHR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-25 00:00:00\"\n  },\n  {\n    \"id\": \"340905\",\n    \"event\": \"152779\",\n    \"title\": \"National Daym\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"KW\",\n    \"currency\": \"KWD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-25 00:00:00\"\n  },\n  {\n    \"id\": \"340727\",\n    \"event\": \"333660\",\n    \"title\": \"Imam Mahdiâ€™s Birthday\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"IR\",\n    \"currency\": \"IRR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-25 00:00:00\"\n  },\n  {\n    \"id\": \"338373\",\n    \"event\": \"338373\",\n    \"title\": \"Presidential Election\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"SN\",\n    \"currency\": \"XOF\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-25 00:00:00\"\n  },\n  {\n    \"id\": \"347333\",\n    \"event\": \"ILLEI\",\n    \"title\": \"Composite Economic Index MoM\",\n    \"indicator\": \"Leading Economic Index\",\n    \"comment\": \"In Israel, the Composite State-of-the-Economy Index is a synthetic indicator examining the direction in which real economic activity is moving in a real time. It is calculated based on 10 different components: industrial production index, trade revenue, services revenue, imports of consumer products, imports of manufacturing inputs, export of goods, export of services, number of employee posts in the private sector, rate of vacant employee positions and the number of building starts. The index has a base value of 100 as of 2011.\",\n    \"country\": \"IL\",\n    \"currency\": \"ILS\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-25 12:15:00\"\n  },\n  {\n    \"id\": \"341831\",\n    \"event\": \"254335\",\n    \"title\": \"Makha Bucha\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"TH\",\n    \"currency\": \"THB\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 00:00:00\"\n  },\n  {\n    \"id\": \"340906\",\n    \"event\": \"152782\",\n    \"title\": \"Liberation Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"KW\",\n    \"currency\": \"KWD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 00:00:00\"\n  },\n  {\n    \"id\": \"347256\",\n    \"event\": \"SGIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Singapore, industrial production measures the output of businesses integrated in the manufacturing sector of the economy.\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"4.5\",\n    \"previous\": \"-2.5\",\n    \"source\": \"Economic Development Board\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 05:00:00\"\n  },\n  {\n    \"id\": \"347255\",\n    \"event\": \"SGIPMM\",\n    \"title\": \"Industrial Production MoM\",\n    \"indicator\": \"Industrial Production Mom\",\n    \"comment\": \"In Singapore, industrial production measures the output of businesses integrated in the manufacturing sector of the economy.\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"3\",\n    \"previous\": \"-1.7\",\n    \"source\": \"Economic Development Board\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 05:00:00\"\n  },\n  {\n    \"id\": \"362713\",\n    \"event\": \"NOUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Norway, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"NO\",\n    \"currency\": \"NOK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.5\",\n    \"source\": \"Statistics Norway\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 07:00:00\"\n  },\n  {\n    \"id\": \"347403\",\n    \"event\": \"AMIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Armenia, industrial production measures the output of businesses integrated in industrial sector of the economy. Manufacturing is the most important sector and accounts for 61 percent of total production. The biggest segments within manufacturing are: food products (20 percent); metals (11 percent); tobacco (9 percent); and drinks (7 percent). Electricity, gas, steam and air conditioning supply accounts for 20 percent of total output, mining and quarrying for 18 percent and water supply, sewerage, waste management and remediation for 1 percent.\",\n    \"country\": \"AM\",\n    \"currency\": \"AMD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"20\",\n    \"source\": \"National Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 08:00:00\"\n  },\n  {\n    \"id\": \"347402\",\n    \"event\": \"AMCOUT\",\n    \"title\": \"Construction Output YoY\",\n    \"indicator\": \"Construction Output\",\n    \"comment\": \"In Armenia, construction output refers to the year over year change in the volume of construction work done.\",\n    \"country\": \"AM\",\n    \"currency\": \"AMD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"11.5\",\n    \"source\": \"National Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 08:00:00\"\n  },\n  {\n    \"id\": \"347401\",\n    \"event\": \"AMPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"In Armenia, Producer Prices Change measures the average change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"AM\",\n    \"currency\": \"AMD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.1\",\n    \"source\": \"National Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 08:00:00\"\n  },\n  {\n    \"id\": \"347399\",\n    \"event\": \"AMRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Armenia, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"AM\",\n    \"currency\": \"AMD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"35.9\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 08:00:00\"\n  },\n  {\n    \"id\": \"347397\",\n    \"event\": \"AMLEI\",\n    \"title\": \"Economic Activity YoY\",\n    \"indicator\": \"Leading Economic Index\",\n    \"comment\": \"In Armenia, the Economic Activity Index is a composite indicator that estimates the activity of the different economic sectors in a given month. It is presented in previous year prices.\",\n    \"country\": \"AM\",\n    \"currency\": \"AMD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"9.5\",\n    \"source\": \"National Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 08:00:00\"\n  },\n  {\n    \"id\": \"347396\",\n    \"event\": \"AMBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Armeniaâ€™s foreign trade is limited due to landlocked location and border disputes with Turkey to the west and Azerbaijan to the east. As a result Armenia usually reports high trade deficits. Armeniaâ€™s main exports are metals and precious stones followed by energy, beverages, and vegetables and fruit.  Armenia mainly imports oil, natural gas, cereals, rubber manufactures, cork and wood, and electrical machinery. Armeniaâ€™s main trading partners are Russia, Germany, Iran, the United States, China, Ukraine and Turkey\\n.\",\n    \"country\": \"AM\",\n    \"currency\": \"AMD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"96.8\",\n    \"source\": \"National Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 08:00:00\"\n  },\n  {\n    \"id\": \"348209\",\n    \"event\": \"BAIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Bosnia and Herzegovina, industrial production measures the output of businesses integrated in industrial sector of the economy such as manufacturing, mining, and utilities.\",\n    \"country\": \"BA\",\n    \"currency\": \"BAM\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-8\",\n    \"source\": \"Agency of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 10:00:00\"\n  },\n  {\n    \"id\": \"347857\",\n    \"event\": \"BAIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Bosnia and Herzegovina, the inflation rate measures a broad rise or fall in prices that consumers pay for a standard basket of goods.\",\n    \"country\": \"BA\",\n    \"currency\": \"BAM\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.2\",\n    \"source\": \"Agency of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 10:00:00\"\n  },\n  {\n    \"id\": \"347856\",\n    \"event\": \"BAIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"BA\",\n    \"currency\": \"BAM\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.2\",\n    \"source\": \"Agency of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 10:00:00\"\n  },\n  {\n    \"id\": \"348271\",\n    \"event\": \"BAPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"BA\",\n    \"currency\": \"BAM\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.7\",\n    \"source\": \"Agency of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 10:30:00\"\n  },\n  {\n    \"id\": \"342441\",\n    \"event\": \"BRINTR\",\n    \"title\": \"BCB Focus Market Readout\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Brazil, interest rate decisions are taken by The Central Bank of Brazil's Monetary Policy Committee (COPOM). The official interest rate is the Special System of Clearance and Custody rate (SELIC) which is the overnight lending rate.\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 11:30:00\"\n  },\n  {\n    \"id\": \"347338\",\n    \"event\": \"USBP\",\n    \"title\": \"Building Permits Final\",\n    \"indicator\": \"Building Permits\",\n    \"comment\": \"Building Permits refer to the approvals given by a local jurisdictions before the construction of a new or existing building can legally occur. Not all areas of the United States require a permit for construction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.493\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"M\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 13:00:00\"\n  },\n  {\n    \"id\": \"347336\",\n    \"event\": \"USBPMM\",\n    \"title\": \"Building Permits MoM Final\",\n    \"indicator\": \"Building Permits MoM\",\n    \"comment\": \"Building Permits refer to the approvals given by a local jurisdictions before the construction of a new or existing building can legally occur. Not all areas of the United States require a permit for construction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.8\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 13:00:00\"\n  },\n  {\n    \"id\": \"363447\",\n    \"event\": \"ILINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Israel, the interest rates decisions are taken by the Bank of Israel. The official interest rate is the \\\"headline\\\" rate.\",\n    \"country\": \"IL\",\n    \"currency\": \"ILS\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"4.38\",\n    \"previous\": \"4.5\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 14:00:00\"\n  },\n  {\n    \"id\": \"342444\",\n    \"event\": \"148242\",\n    \"title\": \"3-Month BTF Auction\",\n    \"indicator\": \"3 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.838\",\n    \"source\": \"Agence TrÃ©sor\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 14:00:00\"\n  },\n  {\n    \"id\": \"342443\",\n    \"event\": \"148246\",\n    \"title\": \"12-Month BTF Auction\",\n    \"indicator\": \"52 Week Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.477\",\n    \"source\": \"Agence TrÃ©sor\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 14:00:00\"\n  },\n  {\n    \"id\": \"342442\",\n    \"event\": \"148238\",\n    \"title\": \"6-Month BTF Auction\",\n    \"indicator\": \"6 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.746\",\n    \"source\": \"Agence TrÃ©sor\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 14:00:00\"\n  },\n  {\n    \"id\": \"347359\",\n    \"event\": \"USNHS\",\n    \"title\": \"New Home Sales\",\n    \"indicator\": \"New Home Sales\",\n    \"comment\": \"A sale of the new house occurs with the signing of a sales contract or the acceptance of a deposit. The house can be in any stage of construction: not yet started, under construction, or already completed. New home sales account for about 10 percent of the US housing market. New single-family home sales are extremely volatile month-to-month and preliminary figures are subject to large revisions because they are mostly drawn from building permits data.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"0.68\",\n    \"previous\": \"0.664\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 15:00:00\"\n  },\n  {\n    \"id\": \"347358\",\n    \"event\": \"USNHSMM\",\n    \"title\": \"New Home Sales MoM\",\n    \"indicator\": \"New Home Sales MoM\",\n    \"comment\": \"A sale of the new house occurs with the signing of a sales contract or the acceptance of a deposit. The house can be in any stage of construction: not yet started, under construction, or already completed. New home sales account for about 10 percent of the US housing market. New single-family home sales are extremely volatile month-to-month and preliminary figures are subject to large revisions because they are mostly drawn from building permits data.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"8\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 15:00:00\"\n  },\n  {\n    \"id\": \"347449\",\n    \"event\": \"USDFMI\",\n    \"title\": \"Dallas Fed Manufacturing Index\",\n    \"indicator\": \"Dallas Fed Manufacturing Index\",\n    \"comment\": \"The Dallas Fed Manufacturing Index measures the performance of manufacturing sector in the state of Texas. The index is derived from a survey of around 100 business executives and tracks variables such as output, employment, orders and prices. A reading above 0 indicates an expansion of the factory activity compared to the previous month; below 0 represents a contraction; while 0 indicates no change. Texas produces around 9.5 percent of manufacturing output in US. The state ranks second behind California in factory production and first as an exporter of manufactured goods.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-27.4\",\n    \"source\": \"Federal Reserve Bank of Dallas\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 15:30:00\"\n  },\n  {\n    \"id\": \"364917\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB President Lagarde Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 16:00:00\"\n  },\n  {\n    \"id\": \"342446\",\n    \"event\": \"130305\",\n    \"title\": \"3-Month Bill Auction\",\n    \"indicator\": \"3 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.23\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 16:30:00\"\n  },\n  {\n    \"id\": \"342445\",\n    \"event\": \"130306\",\n    \"title\": \"6-Month Bill Auction\",\n    \"indicator\": \"6 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.1\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 16:30:00\"\n  },\n  {\n    \"id\": \"339754\",\n    \"event\": \"130354\",\n    \"title\": \"5-Year Note Auction\",\n    \"indicator\": \"5 Year Note Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.055\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 18:00:00\"\n  },\n  {\n    \"id\": \"339751\",\n    \"event\": \"130308\",\n    \"title\": \"2-Year Note Auction\",\n    \"indicator\": \"2 Year Note Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.365\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 18:00:00\"\n  },\n  {\n    \"id\": \"347368\",\n    \"event\": \"JPIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Japan, the most important categories in the consumer price index are Food (26 percent of total weight) and Housing (21 percent). Transportation and communications account for 15 percent; Culture and recreation for 9 percent; Fuel, light and water charges for 7 percent; Miscellaneous goods and services for 6 percent; and Medical care for 5 percent.  Furniture and household utensils, Clothes and footwear, and Education account for the remaining 10 percent of total weight.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"2\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.6\",\n    \"source\": \"Ministry of Internal Affairs and Communications\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2025-04-09 23:30:00\"\n  },\n  {\n    \"id\": \"347367\",\n    \"event\": \"JPCIR\",\n    \"title\": \"Core Inflation Rate YoY\",\n    \"indicator\": \"Core Inflation Rate\",\n    \"comment\": \"In Japan, the core inflation rate tracks changes in prices that consumers pay for a basket of goods which excludes prices of fresh food.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"1.8\",\n    \"previous\": \"2.3\",\n    \"source\": \"Statistics Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 23:30:00\"\n  },\n  {\n    \"id\": \"347366\",\n    \"event\": \"JPIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.1\",\n    \"source\": \"Statistics Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-26 23:30:00\"\n  },\n  {\n    \"id\": \"347365\",\n    \"event\": \"JPCCPI\",\n    \"title\": \"Inflation Rate Ex-Food and Energy YoY\",\n    \"indicator\": \"CPI Core Core\",\n    \"comment\": \"In Japan, the \\\"core core\\\" inflation rate tracks changes in prices that consumers pay for a basket of goods which excludes prices of fresh food and energy.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.7\",\n    \"source\": \"Statistics Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-26 23:30:00\"\n  },\n  {\n    \"id\": \"340425\",\n    \"event\": \"152789\",\n    \"title\": \"Independence Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"DO\",\n    \"currency\": \"DOP\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 00:00:00\"\n  },\n  {\n    \"id\": \"363385\",\n    \"event\": \"KGINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Kyrgyzstan, interest rate decisions are taken by the National Bank of the Kyrgyz Republic. The official interest rate is the discount rate.\",\n    \"country\": \"KG\",\n    \"currency\": \"KGS\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"13\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 04:00:00\"\n  },\n  {\n    \"id\": \"347375\",\n    \"event\": \"MYPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"MY\",\n    \"currency\": \"MYR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-1.3\",\n    \"source\": \"Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 04:00:00\"\n  },\n  {\n    \"id\": \"347374\",\n    \"event\": \"VNFDI\",\n    \"title\": \"Foreign Direct Investment\",\n    \"indicator\": \"Foreign Direct Investment\",\n    \"comment\": \"\",\n    \"country\": \"VN\",\n    \"currency\": \"VND\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.48\",\n    \"source\": \"Ministry of Planning and Investment\",\n    \"scale\": \"B\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-27 04:00:00\"\n  },\n  {\n    \"id\": \"364276\",\n    \"event\": \"337976\",\n    \"title\": \"MAS 12-Week Bill Auction\",\n    \"indicator\": \"3 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.93\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 05:00:00\"\n  },\n  {\n    \"id\": \"364250\",\n    \"event\": \"337947\",\n    \"title\": \"MAS 4-Week Bill Auction\",\n    \"indicator\": \"1 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.99\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 05:00:00\"\n  },\n  {\n    \"id\": \"364204\",\n    \"event\": \"364204\",\n    \"title\": \"20 Year Bond Yield\",\n    \"indicator\": \"20 Year Bond Yield\",\n    \"comment\": \"\",\n    \"country\": \"SG\",\n    \"currency\": \"SGD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.8\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 05:00:00\"\n  },\n  {\n    \"id\": \"347381\",\n    \"event\": \"FIBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"The industrial confidence indicator measures the confidence among executives in the manufacturing sector. It is calculated from the answers to three questions: production expectations in the coming months, order backlog and finished product inventories compared to normal (in reverse).\",\n    \"country\": \"FI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-13\",\n    \"source\": \"Confederation of Finnish Industries (EK)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 06:00:00\"\n  },\n  {\n    \"id\": \"347380\",\n    \"event\": \"JOIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Jordan, industrial production measures the output of businesses integrated in industrial sector of the economy such as manufacturing, mining, and utilities.\",\n    \"country\": \"JO\",\n    \"currency\": \"JOD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"1.2\",\n    \"forecast\": \"\",\n    \"previous\": \"-4.6\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 06:00:00\"\n  },\n  {\n    \"id\": \"347379\",\n    \"event\": \"FICCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Finland, the Statistics of Finland consumer survey expresses consumersâ€™ views and intentions relating to economic matters. The data system of Statistics Finlandâ€™s consumer survey is comprised of respondent-specific original data from phones interviews, which may not be disclosed, and published data concerning reply distributions and time series. Generally consumer confidence is high when the unemployment rate is low and GDP growth is high. Measures of average consumer confidence can be useful indicators of how much consumers are likely to spend.\",\n    \"country\": \"FI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-9.1\",\n    \"source\": \"Statistics Finland\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 06:00:00\"\n  },\n  {\n    \"id\": \"347395\",\n    \"event\": \"SELG\",\n    \"title\": \"Household Lending Growth YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"In Sweden, Household Lending Growth refers to the year-on-year change in credit extended to households by domestic MFIs. Lending to households is divided into three categories: housing loans, consumer credit, and other lending. The purpose of a loan is not directly measured, but is approximated by categorizing lending by type of collateral. Housing loans are defined as loans to private individuals or entrepreneurial households with housing as collateral. Consumer credit refers to lending to private individuals, generally without collateral. Other lending includes all other lending, for example lending to non-profit institutions serving households.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"Statistics Sweden\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 07:00:00\"\n  },\n  {\n    \"id\": \"347266\",\n    \"event\": \"DECCI\",\n    \"title\": \"GfK Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"The GfK Consumer Climate Indicator is based on a survey of 2000 individuals age 14 and above. The questionnaire focuses on income expectations, buying propensity and savings. The components of the indicator are calculated as the difference between positive and negative answers to the questions asked. Their value can vary between minus 100 and plus 100 points with 0 representing the long term average.\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"2\",\n    \"period\": \"Mar\",\n    \"actual\": \"\",\n    \"forecast\": \"-29\",\n    \"previous\": \"-29.7\",\n    \"source\": \"GfK Group\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 07:00:00\"\n  },\n  {\n    \"id\": \"347271\",\n    \"event\": \"FRCCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In France, the consumer confidence index is based on a survey of about 2 000 households.  The questionnaire focuses on: past and future economic situation in France, past and future personal financial situation, unemployment, intention to make major purchases, current savings capacity and expected savings capacity. The indicator is calculated using factor analysis technique. The index is then calculated in a way to measure the current sentiment in relation to the historic index values of the period 1987-2011. A value over 110 indicates unusually high optimism and a value under 90 indicates unusually high pessimism. The value 100 indicates neutrality.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"91\",\n    \"source\": \"INSEE\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 07:45:00\"\n  },\n  {\n    \"id\": \"347077\",\n    \"event\": \"TWNO\",\n    \"title\": \"Export Orders YoY\",\n    \"indicator\": \"New Orders\",\n    \"comment\": \"In Taiwan, because new orders heavily affect business confidence they are a leading indicator for growth in gross domsestic product.\",\n    \"country\": \"TW\",\n    \"currency\": \"TWD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-16\",\n    \"source\": \"Ministry of Economic Affairs (MOEA)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 08:00:00\"\n  },\n  {\n    \"id\": \"347405\",\n    \"event\": \"BHIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"BH\",\n    \"currency\": \"BHD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.2\",\n    \"source\": \"Information and EGovernment Authority\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 08:15:00\"\n  },\n  {\n    \"id\": \"347404\",\n    \"event\": \"BHIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Bahrain, the inflation rate measures a broad rise or fall in prices that consumers pay for a standard basket of goods.\",\n    \"country\": \"BH\",\n    \"currency\": \"BHD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.3\",\n    \"source\": \"Information and EGovernment Authority\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 08:15:00\"\n  },\n  {\n    \"id\": \"347288\",\n    \"event\": \"TWM2\",\n    \"title\": \"M2 Money Supply YoY\",\n    \"indicator\": \"Money Supply M2\",\n    \"comment\": \"Taiwan Money Supply M2 includes M1 plus short-term time deposits in banks.\",\n    \"country\": \"TW\",\n    \"currency\": \"TWD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.3\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 08:20:00\"\n  },\n  {\n    \"id\": \"347079\",\n    \"event\": \"TWCA\",\n    \"title\": \"Current Account\",\n    \"indicator\": \"Current Account\",\n    \"comment\": \"Current Account is the sum of the balance of trade (exports minus imports of goods and services), net factor income (such as interest and dividends) and net transfer payments (such as foreign aid).\",\n    \"country\": \"TW\",\n    \"currency\": \"TWD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"27.22\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"B\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-27 08:20:00\"\n  },\n  {\n    \"id\": \"347408\",\n    \"event\": \"HKIMPYY\",\n    \"title\": \"Imports YoY\",\n    \"indicator\": \"Imports YoY\",\n    \"comment\": \"Hong Kong imports mainly machinery and transport equipment (66 percent of total imports); miscellaneous manufactured articles (14 percent); manufactured goods (9 percent) and food and live animals (4 percent). Main import partners are: China (47 percent), Taiwan (8 percent) and Singapore (7 percent). Others include: Japan, South Korea and the United States.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"11.6\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 08:30:00\"\n  },\n  {\n    \"id\": \"347407\",\n    \"event\": \"HKEXPYY\",\n    \"title\": \"Exports YoY\",\n    \"indicator\": \"Exports YoY\",\n    \"comment\": \"Hong Kong has an export oriented economy with 99 percent of shipments coming from re-exports. Major exports are electrical machinery, apparatus and appliances which accounts for 36 percent of total shipments. Other exports include: telecommunications and sound equipment (20 percent); office and automatic data processing machines (10 percent); miscellaneous manufactured articles (5 percent) and non-metallic mineral manufactures (5 percent). Main export partners are China (40 percent), the United States (8 percent), Vietnam (6 percent), Singapore (5 percent), Taiwan and Macau.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"11\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 08:30:00\"\n  },\n  {\n    \"id\": \"347406\",\n    \"event\": \"HKBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Since the late 1990â€™s Hong Kong has been recording trade deficits, as imports grew at a faster pace than exports. Hong Kong major exports are electrical machinery, apparatus and appliances; telecommunications and sound equipment and automatic data processing machines. The country imports mainly machinery and transport equipment; miscellaneous manufactured articles; manufactured goods and food and live animals. Main trading partner is China (40 percent of total exports and 47 percent of total imports). Others include: Japan, Singapore, Taiwan and the United States.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-59.9\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"B\",\n    \"unit\": \"H$\",\n    \"date\": \"2024-02-27 08:30:00\"\n  },\n  {\n    \"id\": \"347409\",\n    \"event\": \"BGTA\",\n    \"title\": \"Tourist Arrivals YoY\",\n    \"indicator\": \"Tourist Arrivals\",\n    \"comment\": \"\",\n    \"country\": \"BG\",\n    \"currency\": \"BGN\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.1\",\n    \"source\": \"National Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 09:00:00\"\n  },\n  {\n    \"id\": \"347296\",\n    \"event\": \"ATMPMI\",\n    \"title\": \"Bank Austria Manufacturing PMI\",\n    \"indicator\": \"Manufacturing PMI\",\n    \"comment\": \"In Austria, the Bank Austria Manufacturing PMI measures the performance of the manufacturing sector. The Manufacturing Purchasing Managers Index is based on five individual indexes with the following weights: New Orders (30 percent), Output (25 percent), Employment (20 percent), Suppliersâ€™ Delivery Times (15 percent) and Stock of Items Purchased (10 percent), with the Delivery Times index inverted so that it moves in a comparable direction.  A reading above 50 indicates an expansion of the manufacturing sector compared to the previous month; below 50 represents a contraction; while 50 indicates no change.\",\n    \"country\": \"AT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"43\",\n    \"source\": \"S&P Global\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 09:00:00\"\n  },\n  {\n    \"id\": \"347417\",\n    \"event\": \"EULPS\",\n    \"title\": \"Loans to Companies YoY\",\n    \"indicator\": \"Loans to Private Sector\",\n    \"comment\": \"In the Euro Area, Loans to Private Sector refers to adjusted loans to Euro Area non-financial corporations.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 09:00:00\"\n  },\n  {\n    \"id\": \"347413\",\n    \"event\": \"EULG\",\n    \"title\": \"Loans to Households YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"In the Euro Area, loan growth refers to year over year change in loans to households adjusted for sales and securitisation.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.3\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 09:00:00\"\n  },\n  {\n    \"id\": \"347410\",\n    \"event\": \"EUM3\",\n    \"title\": \"M3 Money Supply YoY\",\n    \"indicator\": \"Money Supply M3\",\n    \"comment\": \"Euro Area Money Supply M3 is the sum of M2, repurchase agreements, money market fund shares/units and debt securities with a maturity of up to two years.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"0.3\",\n    \"previous\": \"0.1\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 09:00:00\"\n  },\n  {\n    \"id\": \"363212\",\n    \"event\": \"363212\",\n    \"title\": \"15-Year Index-Linked Treasury Gilt Auction\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.265\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 10:00:00\"\n  },\n  {\n    \"id\": \"347545\",\n    \"event\": \"HRGDPYY\",\n    \"title\": \"GDP Growth Rate YoY\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"Croatia joined the European Union in 2013, following a decade-long application process. Croatia's main industries are tourism, ICT, automotive, food, pharmaceutical, logistics, metal and textile. On the expenditure side, household consumption is the main component of GDP and accounts for 60 percent of its total use, followed by government expenditure (20 percent) and gross fixed capital formation (19 percent). Exports of goods and services account for 46 percent of GDP while imports account for 44 percent, adding 2 percent of total GDP.\",\n    \"country\": \"HR\",\n    \"currency\": \"HRK\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.8\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 10:00:00\"\n  },\n  {\n    \"id\": \"347429\",\n    \"event\": \"SNIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Senegal, industrial production measures the output of businesses integrated in the industrial sector of the economy. Manufacturing is the most important sector and accounts for around 81 percent of total production. The biggest segments within manufacturing are: food (41 percent of total production), chemicals (17 percent of total production) and construction materials (16 percent of total production). Utilities including electricity and water account for 14 percent of total production and mining for the remaining 4 percent.\",\n    \"country\": \"SN\",\n    \"currency\": \"XOF\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"-7\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.5\",\n    \"source\": \"ANSD\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 10:00:00\"\n  },\n  {\n    \"id\": \"347424\",\n    \"event\": \"MORSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Macau, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.  The biggest segments are household appliances (21 percent of total sales); watches, clocks and jewelry (20 percent); goods in department stores (15.1 percent); adults' clothing (11.7 percent); leather goods (11.3 percent); cosmetics and sanitary articles; goods in pharmacies (7.9 percent); goods in supermarkets (7.7 percent) and motor vehicles and automotive fuels (6.2 percent).\",\n    \"country\": \"MO\",\n    \"currency\": \"MOP\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"78\",\n    \"source\": \"Statistics and Census Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 10:00:00\"\n  },\n  {\n    \"id\": \"347310\",\n    \"event\": \"MOUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Macau, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"MO\",\n    \"currency\": \"MOP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.3\",\n    \"source\": \"Statistics and Census Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 10:00:00\"\n  },\n  {\n    \"id\": \"363996\",\n    \"event\": \"130401\",\n    \"title\": \"6-Month BOT Auction\",\n    \"indicator\": \"6 Month Bill Yield\",\n    \"comment\": \"\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.77\",\n    \"source\": \"Dipartimento del Tesoro\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 10:10:00\"\n  },\n  {\n    \"id\": \"363770\",\n    \"event\": \"338935\",\n    \"title\": \"10-Year Bund/g Auction\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.39\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 10:30:00\"\n  },\n  {\n    \"id\": \"362934\",\n    \"event\": \"RUINTR\",\n    \"title\": \"Monetary Policy Report\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Russia, interest rate decisions are taken by the Central Bank of the Russian Federation.  From September 16th of 2013, the official interest rate is the one-week auction repo rate. Until September 15th of 2013, the official interest rate was the refinancing rate, which was seen as a ceiling for borrowing money and a benchmark for calculating tax payments.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 10:30:00\"\n  },\n  {\n    \"id\": \"347559\",\n    \"event\": \"GRLG\",\n    \"title\": \"Total Credit YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"Total credit expansion to domestic non-monetary financial institutions by domestic monetary financial institutions.\",\n    \"country\": \"GR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.5\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 11:00:00\"\n  },\n  {\n    \"id\": \"347433\",\n    \"event\": \"FRUP\",\n    \"title\": \"Jobseekers Total\",\n    \"indicator\": \"Unemployed Persons\",\n    \"comment\": \"The jobseekers total in France refers to the registered number of unemployed at the end of the month at employment center which are obliged to actively seek a job.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2825.2\",\n    \"source\": \"DARES\",\n    \"scale\": \"K\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 11:00:00\"\n  },\n  {\n    \"id\": \"347431\",\n    \"event\": \"FRIJC\",\n    \"title\": \"Unemployment Benefit Claims\",\n    \"indicator\": \"Initial Jobless Claims\",\n    \"comment\": \"In France, unemployment benefit claims refer to the change in number of people claiming unemployment benefits in mainland France.\",\n    \"country\": \"FR\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-1.4\",\n    \"source\": \"DARES\",\n    \"scale\": \"K\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 11:00:00\"\n  },\n  {\n    \"id\": \"348886\",\n    \"event\": \"BHM2\",\n    \"title\": \"M2 Money Supply YoY\",\n    \"indicator\": \"Money Supply M2\",\n    \"comment\": \"Bahrain Money Supply M2 includes M1 plus short-term time deposits in banks.\",\n    \"country\": \"BH\",\n    \"currency\": \"BHD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.04\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 11:15:00\"\n  },\n  {\n    \"id\": \"348885\",\n    \"event\": \"BHLG\",\n    \"title\": \"Private Sector Credit YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"\",\n    \"country\": \"BH\",\n    \"currency\": \"BHD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.6\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 11:15:00\"\n  },\n  {\n    \"id\": \"347335\",\n    \"event\": \"BRFDI\",\n    \"title\": \"Foreign Direct Investment\",\n    \"indicator\": \"Foreign Direct Investment\",\n    \"comment\": \"In Brazil, Foreign Direct Investment refers to net inflows of foreign direct investments received from abroad, including equity capital and intercompany loans.\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.39\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 11:30:00\"\n  },\n  {\n    \"id\": \"347334\",\n    \"event\": \"BRCA\",\n    \"title\": \"Current Account\",\n    \"indicator\": \"Current Account\",\n    \"comment\": \"Current Account is the sum of the balance of trade (exports minus imports of goods and services), net factor income (such as interest and dividends) and net transfer payments (such as foreign aid).\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-5.8\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 11:30:00\"\n  },\n  {\n    \"id\": \"348009\",\n    \"event\": \"BARSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Bosnia and Herzegovina, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"BA\",\n    \"currency\": \"BAM\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"14.1\",\n    \"source\": \"Agency of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 12:00:00\"\n  },\n  {\n    \"id\": \"347439\",\n    \"event\": \"MXBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Mexico's main exports are manufactured products (88 percent of total shipments) , followed by oil and oil products (7 percent), the agricultural sector with (4 percent). Main imports are: metallic products, machinery and equipment (59 percent of total purchases), oil products (12 percent) and agricultural goods (3 percent). The country's top trading partner is the United States (72 percent of total exports and 38 percent of total imports). Others include: China, Japan and Germany. In 2022, trade between Mexico and the United States reached USD 738 billion, with Mexico posting a surplus of near USD 208 billion.\",\n    \"country\": \"MX\",\n    \"currency\": \"MXN\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.242\",\n    \"source\": \"INEGI - Instituto Nacional de Estadistica, Geografia e Informatica\",\n    \"scale\": \"B\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-27 12:00:00\"\n  },\n  {\n    \"id\": \"347438\",\n    \"event\": \"ESBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Spain, the Industrial Confidence Indicator (ICI) measures the level of optimism of entrepreneurs for the future development of industrial activity. The ICI is conducted based on the sample of 2500 enterprises representing different sizes, regions and sectors of Spanish economy. The response rate is around 60 percent. ICI is measured on a scale of -100 (extreme lack of confidence) to +100 (extreme confidence).\",\n    \"country\": \"ES\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-5.6\",\n    \"source\": \"Ministerio de Industria, Comercio y Turismo\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 12:00:00\"\n  },\n  {\n    \"id\": \"347327\",\n    \"event\": \"130117\",\n    \"title\": \"IPCA mid-month CPI YoY\",\n    \"indicator\": \"Mid-month Inflation Rate YoY\",\n    \"comment\": \"\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.47\",\n    \"source\": \"Institute of Geography and Statistics (IBGE)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 12:00:00\"\n  },\n  {\n    \"id\": \"347326\",\n    \"event\": \"130116\",\n    \"title\": \"IPCA mid-month CPI MoM\",\n    \"indicator\": \"Mid-month Inflation Rate MoM\",\n    \"comment\": \"\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.31\",\n    \"source\": \"Institute of Geography and Statistics (IBGE)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 12:00:00\"\n  },\n  {\n    \"id\": \"363097\",\n    \"event\": \"HUDIR\",\n    \"title\": \"Deposit Interest Rate\",\n    \"indicator\": \"Deposit Interest Rate\",\n    \"comment\": \"The Deposit Interest Rate is the average rate paid by commercial banks to individuals or corporations on deposits.\",\n    \"country\": \"HU\",\n    \"currency\": \"HUF\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"8.25\",\n    \"previous\": \"9\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 13:00:00\"\n  },\n  {\n    \"id\": \"363065\",\n    \"event\": \"HUINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"\",\n    \"country\": \"HU\",\n    \"currency\": \"HUF\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"9\",\n    \"previous\": \"10\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 13:00:00\"\n  },\n  {\n    \"id\": \"364523\",\n    \"event\": \"NGINTR\",\n    \"title\": \"Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Nigeria, interest rate decisions are taken by The Central Bank of Nigeria. The official interest rate is the Monetary Policy Rate (MPR).\",\n    \"country\": \"NG\",\n    \"currency\": \"NGN\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"18.75\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 13:30:00\"\n  },\n  {\n    \"id\": \"347446\",\n    \"event\": \"USDGOED\",\n    \"title\": \"Durable Goods Orders ex Defense MoM\",\n    \"indicator\": \"Durable Goods Orders Ex Defense\",\n    \"comment\": \"Durable Goods Orders Excluding Defense refer to new orders placed with manufacturers for delivery of hard goods in the future excluding defense orders.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.5\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 13:30:00\"\n  },\n  {\n    \"id\": \"347445\",\n    \"event\": \"USDGOET\",\n    \"title\": \"Durable Goods Orders Ex Transp MoM\",\n    \"indicator\": \"Durable Goods Orders Ex Transportation\",\n    \"comment\": \"Durable Goods Orders Excluding Transportation refer to new orders placed with manufacturers for delivery of hard goods in the future excluding transportation orders.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"0.3\",\n    \"previous\": \"0.6\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 13:30:00\"\n  },\n  {\n    \"id\": \"347444\",\n    \"event\": \"USDGO\",\n    \"title\": \"Durable Goods Orders MoM\",\n    \"indicator\": \"Durable Goods Orders\",\n    \"comment\": \"Durable Goods Orders refer to new orders placed with manufacturers for delivery of hard goods which meant to last at least three years.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"2\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"-4\",\n    \"previous\": \"\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 13:30:00\"\n  },\n  {\n    \"id\": \"347443\",\n    \"event\": \"USNDCGOEA\",\n    \"title\": \"Non Defense Goods Orders Ex Air\",\n    \"indicator\": \"Non Defense Capital Goods Orders Ex Aircraft\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.3\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 13:30:00\"\n  },\n  {\n    \"id\": \"342448\",\n    \"event\": \"USRI\",\n    \"title\": \"Redbook YoY\",\n    \"indicator\": \"Redbook Index\",\n    \"comment\": \"The Johnson Redbook Index is a sales-weighted of year-over-year same-store sales growth in a sample of large US general merchandise retailers representing about 9,000 stores. Same-store sales are sales in stores continuously open for 12 months or longer. By dollar value, the Index represents over 80% of the equivalent 'official' retail sales series collected and published by the US Department of Commerce. Redbook compiles the Index by collecting and interpreting performance estimates from retailers. The Index and its sub-groups are sales-weighted aggregates of these estimates. Weeks are retail weeks (Sunday to Saturday), and equally weighted within the month.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/24\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3\",\n    \"source\": \"Redbook Research Inc.\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 13:55:00\"\n  },\n  {\n    \"id\": \"347605\",\n    \"event\": \"USCSHPIYY\",\n    \"title\": \"S&P/Case-Shiller Home Price YoY\",\n    \"indicator\": \"Case Shiller Home Price Index YoY\",\n    \"comment\": \"The S&P CoreLogic Case-Shiller 20-City Composite Home Price Index measures changes in residential house prices in 20 metropolitan regions in the United States: Atlanta, Boston, Charlotte, Chicago, Cleveland, Dallas, Denver, Detroit, Las Vegas, Los Angeles, Miami, Minneapolis, New York, Phoenix, Portland, San Diego, San Francisco, Seattle, Tampa and Washington D.C.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.4\",\n    \"source\": \"Standard and Poor's\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 14:00:00\"\n  },\n  {\n    \"id\": \"347604\",\n    \"event\": \"USCSHPIMM\",\n    \"title\": \"S&P/Case-Shiller Home Price MoM\",\n    \"indicator\": \"Case Shiller Home Price Index MoM\",\n    \"comment\": \"The S&P CoreLogic Case-Shiller 20-City Composite Home Price Index measures changes in residential house prices in 20 metropolitan regions in the United States: Atlanta, Boston, Charlotte, Chicago, Cleveland, Dallas, Denver, Detroit, Las Vegas, Los Angeles, Miami, Minneapolis, New York, Phoenix, Portland, San Diego, San Francisco, Seattle, Tampa and Washington D.C.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.2\",\n    \"source\": \"Standard and Poor's\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 14:00:00\"\n  },\n  {\n    \"id\": \"347603\",\n    \"event\": \"USHPIMM\",\n    \"title\": \"House Price Index MoM\",\n    \"indicator\": \"House Price Index MoM\",\n    \"comment\": \"The FHFA (Federal Housing Finance Agency) House Price Index measures month over month changes in average prices of single-family houses with mortgages guaranteed by Fannie Mae and Freddie Mac.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.3\",\n    \"source\": \"Federal Housing Finance Agency\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 14:00:00\"\n  },\n  {\n    \"id\": \"347602\",\n    \"event\": \"USHPIYY\",\n    \"title\": \"House Price Index YoY\",\n    \"indicator\": \"House Price Index YoY\",\n    \"comment\": \"The FHFA (Federal Housing Finance Agency) House Price Index measures month over month changes in average prices of single-family houses with mortgages guaranteed by Fannie Mae and Freddie Mac.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"6.6\",\n    \"source\": \"Federal Housing Finance Agency\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 14:00:00\"\n  },\n  {\n    \"id\": \"347601\",\n    \"event\": \"USHPI\",\n    \"title\": \"House Price Index\",\n    \"indicator\": \"Housing Index\",\n    \"comment\": \"The FHFA (Federal Housing Finance Agency) House Price Index measures month over month changes in average prices of single-family houses with mortgages guaranteed by Fannie Mae and Freddie Mac.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"417.4\",\n    \"source\": \"Federal Housing Finance Agency\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 14:00:00\"\n  },\n  {\n    \"id\": \"347610\",\n    \"event\": \"USRFMI\",\n    \"title\": \"Richmond Fed Manufacturing Index\",\n    \"indicator\": \"Richmond Fed Manufacturing Index\",\n    \"comment\": \"The Richmond Manufacturing Index measures the conditions of the manufacturing sector for the District of Columbia, Maryland, North Carolina, South Carolina, Virginia, and most of West Virginia. The index is derived from a survey of 190 manufacturing plants and based on three individual index with the following weights: Shipments (33 percent), New Orders (40 percent) and Employment (27 percent). The index can range between +100 and -100; a reading above zero indicates expansion, while below zero suggests a contraction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-15\",\n    \"source\": \"Federal Reserve Bank of Richmond\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 15:00:00\"\n  },\n  {\n    \"id\": \"347609\",\n    \"event\": \"USRFMSI\",\n    \"title\": \"Richmond Fed Manufacturing Shipments Index\",\n    \"indicator\": \"Richmond Fed Manufacturing Shipments\",\n    \"comment\": \"The Richmond Manufacturing Index measures the conditions of the manufacturing sector for the District of Columbia, Maryland, North Carolina, South Carolina, Virginia, and most of West Virginia. The index is derived from a survey of 190 manufacturing plants and based on three individual index with the following weights: Shipments (33 percent), New Orders (40 percent) and Employment (27 percent). The index can range between +100 and -100; a reading above zero indicates expansion, while below zero suggests a contraction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-15\",\n    \"source\": \"Federal Reserve Bank of Richmond\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 15:00:00\"\n  },\n  {\n    \"id\": \"347608\",\n    \"event\": \"130349\",\n    \"title\": \"CB Consumer Confidence\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"114.8\",\n    \"previous\": \"114.8\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 15:00:00\"\n  },\n  {\n    \"id\": \"347607\",\n    \"event\": \"USRFSI\",\n    \"title\": \"Richmond Fed Services Index\",\n    \"indicator\": \"Richmond Fed Services Index\",\n    \"comment\": \"The data come from the Fifth District Survey of Service Sector Activity. Respondents to the survey are firms located within the Fifth Federal Reserve District which includes the District of Columbia, Maryland, North Carolina, South Carolina, Virginia, and most of West Virginia. Respondents indicate whether measures of activity rose, were unchanged, or decreased since the last survey. The responses are converted into diffusion indexes by subtracting the percentage of reported decreases from the percentage of increases.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4\",\n    \"source\": \"Federal Reserve Bank of Richmond\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 15:00:00\"\n  },\n  {\n    \"id\": \"347612\",\n    \"event\": \"USDFSI\",\n    \"title\": \"Dallas Fed Services Index\",\n    \"indicator\": \"Dallas Fed Services Index\",\n    \"comment\": \"The Dallas Fed conducts the Texas Service Sector Outlook Survey monthly to obtain a timely assessment of the state's service sector activity. Firms are asked whether revenue, employment, prices, general business activity and other indicators increased, decreased or remained unchanged over the previous month. Responses are aggregated into balance indexes where positive values generally indicate growth while negative values generally indicate contraction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-9.3\",\n    \"source\": \"Federal Reserve Bank of Dallas\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 15:30:00\"\n  },\n  {\n    \"id\": \"347611\",\n    \"event\": \"USDFSRI\",\n    \"title\": \"Dallas Fed Services Revenues Index\",\n    \"indicator\": \"Dallas Fed Services Revenues Index\",\n    \"comment\": \"The Dallas Fed conducts the Texas Service Sector Outlook Survey monthly to obtain a timely assessment of the state's service sector activity. Firms are asked whether revenue, employment, prices, general business activity and other indicators increased, decreased or remained unchanged over the previous month. Responses are aggregated into balance indexes where positive values generally indicate growth while negative values generally indicate contraction.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-3.6\",\n    \"source\": \"Federal Reserve Bank of Dallas\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 15:30:00\"\n  },\n  {\n    \"id\": \"339760\",\n    \"event\": \"130538\",\n    \"title\": \"7-Year Note Auction\",\n    \"indicator\": \"7 Year Note Yield\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.109\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 18:00:00\"\n  },\n  {\n    \"id\": \"347450\",\n    \"event\": \"ARRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Argentina, retail sales measure the annual change in the value of retail sales in shopping malls in the greater Buenos Aires area.\",\n    \"country\": \"AR\",\n    \"currency\": \"ARS\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"168.4\",\n    \"source\": \"Instituto Nacional de EstadÃ­stica y Censos (INDEC)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-27 19:00:00\"\n  },\n  {\n    \"id\": \"342449\",\n    \"event\": \"USCSC\",\n    \"title\": \"API Crude Oil Stock Change\",\n    \"indicator\": \"API Crude Oil Stock Change\",\n    \"comment\": \"Stocks of crude oil refer to the weekly change of the crude oil supply situation.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.168\",\n    \"source\": \"American Petroleum Institute (API)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-27 21:30:00\"\n  },\n  {\n    \"id\": \"341791\",\n    \"event\": \"254298\",\n    \"title\": \"228 Peace Memorial Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"TW\",\n    \"currency\": \"TWD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 00:00:00\"\n  },\n  {\n    \"id\": \"347635\",\n    \"event\": \"AUMCPI\",\n    \"title\": \"Monthly CPI Indicator\",\n    \"indicator\": \"Monthly CPI Indicator\",\n    \"comment\": \"In Australia, the Monthly CPI Indicator measures monthly changes in the price of a 'basket' of goods and services which account for a high proportion of expenditure by the CPI population group (i.e. metropolitan households).\",\n    \"country\": \"AU\",\n    \"currency\": \"AUD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"3.5\",\n    \"previous\": \"3.4\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 00:30:00\"\n  },\n  {\n    \"id\": \"347178\",\n    \"event\": \"AUCOUT\",\n    \"title\": \"Construction Work Done QoQ\",\n    \"indicator\": \"Construction Output\",\n    \"comment\": \"In Australia, construction output refers to the quarter-over-quarter change in the value of construction work done, including building and engineering for both the private and public sectors.\",\n    \"country\": \"AU\",\n    \"currency\": \"AUD\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"0.8\",\n    \"previous\": \"1.3\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 00:30:00\"\n  },\n  {\n    \"id\": \"334839\",\n    \"event\": \"NZINTR\",\n    \"title\": \"RBNZ Interest Rate Decision\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In New Zealand, interest rates decisions are taken by the Reserve Bank of New Zealand. The official interest rate is the Official Cash Rate (OCR). The OCR was introduced in March 1999 and is reviewed eight times a year by the Bank. The OCR influences the price of borrowing money in New Zealand and provides the Reserve Bank with a means of influencing the level of economic activity and inflation.\",\n    \"country\": \"NZ\",\n    \"currency\": \"NZD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"5.5\",\n    \"previous\": \"5.5\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 01:00:00\"\n  },\n  {\n    \"id\": \"362983\",\n    \"event\": \"NZINTR\",\n    \"title\": \"RBNZ Press Conference\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In New Zealand, interest rates decisions are taken by the Reserve Bank of New Zealand. The official interest rate is the Official Cash Rate (OCR). The OCR was introduced in March 1999 and is reviewed eight times a year by the Bank. The OCR influences the price of borrowing money in New Zealand and provides the Reserve Bank with a means of influencing the level of economic activity and inflation.\",\n    \"country\": \"NZ\",\n    \"currency\": \"NZD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 02:00:00\"\n  },\n  {\n    \"id\": \"347467\",\n    \"event\": \"THIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Thailand, industrial production measures the output of businesses integrated in manufacturing sector of the economy.\",\n    \"country\": \"TH\",\n    \"currency\": \"THB\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"-5.4\",\n    \"previous\": \"-6.27\",\n    \"source\": \"Office of Industrial Economics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 04:00:00\"\n  },\n  {\n    \"id\": \"347181\",\n    \"event\": \"HKGDPQQ\",\n    \"title\": \"GDP Growth Rate QoQ Final\",\n    \"indicator\": \"GDP Growth Rate\",\n    \"comment\": \"Hong Kong has an export oriented economy and in spite of small size is the 8th largest trading entity in the world with the value of goods and services exchanged four times the size of GDP. In recent years, Hong Kong has become an international hub for business, trade and finance importers willing to access the Chinese market. As such, the largest sector of the economy is services, which accounts for around 93 percent of GDP.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.3\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 04:30:00\"\n  },\n  {\n    \"id\": \"347377\",\n    \"event\": \"JPCIND\",\n    \"title\": \"Coincident Index Final\",\n    \"indicator\": \"Coincident Index\",\n    \"comment\": \"Coincident Index correlates with the business cycle, and is used to identify the current state of the economy. In general, increasing coincident index shows that the economy is in an expansion phase, and decreasing coincident index reflects that the economy is in a contraction phase. The index is calculated using month-over-month percentage changes in 11 leading indicators, 11 coincident indicators, and 6 lagging indicators.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"114.6\",\n    \"source\": \"Cabinet Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 05:00:00\"\n  },\n  {\n    \"id\": \"347376\",\n    \"event\": \"JPLEI\",\n    \"title\": \"Leading Economic Index Final\",\n    \"indicator\": \"Leading Economic Index\",\n    \"comment\": \"In Japan, the Leading Composite Index consists of 12 indexes such as account inventory ratios, machinery orders, stock prices and other leading economic indicators. The index anticipates changes in the direction of the Japanese economy in the coming months. In general, increase in the index reflects that the economy is in an expansion phase, and decreasing coincident index reflects that the economy is in a contraction phase. The index is used to make official judgement on when the business cycle begins and ends.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"108.1\",\n    \"source\": \"Cabinet Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 05:00:00\"\n  },\n  {\n    \"id\": \"347378\",\n    \"event\": \"NLBCOI\",\n    \"title\": \"Business confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Netherlands, the producer confidence survey covers 1,700 manufacturing companies and gathers up-to-date information on economic developments for all activities of the manufacturing industry. The survey covers three components: how companies evaluate their order positions, their stocks of finished products in the month under review and the anticipated economic activity for the next three months. The index is calculated as the percentage of positive answers minus the percentage of negative answers. Therefore, the indicator varies from -100 (all participants evaluate their situation as poor and expect it to become worse) to 100 (all companies are happy with current situation and expect it to improve); 0 indicates neutrality.\",\n    \"country\": \"NL\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-4.4\",\n    \"source\": \"Statistics Netherlands\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 05:30:00\"\n  },\n  {\n    \"id\": \"347182\",\n    \"event\": \"HKGDPYY\",\n    \"title\": \"GDP Growth Rate YoY Final\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"In recent years, Hong Kong has become an international hub for business, trade and finance importers willing to access the Chinese market. As such, the largest sector of the economy is services, which accounts for around 93 percent of GDP. Within services, the most important are wholesale and retail trade (25 percent of GDP); public administration and social services (17 percent); finance and insurance (16 percent); real estate and business services (11 percent); ownership of premises (10 percent) and transportation and postal services (6 percent). Information and communications and food and accommodation account for 8 percent. Construction represents 3.5 percent of GDP and electricity, water and gas supply, waste management and manufacturing 3.4 percent.\",\n    \"country\": \"HK\",\n    \"currency\": \"HKD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.1\",\n    \"source\": \"Census and Statistics Department\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 05:30:00\"\n  },\n  {\n    \"id\": \"347384\",\n    \"event\": \"FIEPYY\",\n    \"title\": \"Export Prices YoY\",\n    \"indicator\": \"Export Prices YoY\",\n    \"comment\": \"In Finland, Export Prices correspond to the rate of change in the prices of goods and services sold by residents of that country to foreign buyers. Export Prices are heavily affected by exchange rates.\",\n    \"country\": \"FI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-7.7\",\n    \"source\": \"Statistics Finland\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 06:00:00\"\n  },\n  {\n    \"id\": \"347383\",\n    \"event\": \"FIIPRIYY\",\n    \"title\": \"Import Prices YoY\",\n    \"indicator\": \"Import Prices YoY\",\n    \"comment\": \"In Finland, Import Prices correspond to the rate of change in the prices of goods and services purchased by residents of that country from, and supplied by, foreign sellers. Import Prices are heavily affected by exchange rates.\",\n    \"country\": \"FI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-9.4\",\n    \"source\": \"Statistics Finland\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 06:00:00\"\n  },\n  {\n    \"id\": \"347382\",\n    \"event\": \"FIPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"In Finland, producer price index for manufactured products measures development in the producer prices of goods manufactured in the country. The index includes both goods sold at home and exported goods. The price for domestic goods is the factory price exclusive of taxes and the price for export goods is the f.o.b. price. The index covers commodities of industry categories B to E.\",\n    \"country\": \"FI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-7.6\",\n    \"source\": \"Statistics Finland\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 06:00:00\"\n  },\n  {\n    \"id\": \"347501\",\n    \"event\": \"SEPPIMM\",\n    \"title\": \"PPI MoM\",\n    \"indicator\": \"Producer Price Inflation MoM\",\n    \"comment\": \"In Sweden, the Producer Price Inflation MoM measures a month-over-month change in the price of goods and services sold by manufacturers and producers in the wholesale market.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-1.6\",\n    \"source\": \"Statistics Sweden\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347500\",\n    \"event\": \"LTIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Lithuania, industrial production measures the output of businesses integrated in industrial sector of the economy such as manufacturing, mining, and utilities.\",\n    \"country\": \"LT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-7.4\",\n    \"source\": \"Lithuanian Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347499\",\n    \"event\": \"LTIPMM\",\n    \"title\": \"Industrial Production MoM\",\n    \"indicator\": \"Industrial Production Mom\",\n    \"comment\": \"\",\n    \"country\": \"LT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-1.5\",\n    \"source\": \"Lithuanian Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347498\",\n    \"event\": \"SEPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-7.7\",\n    \"source\": \"Statistics Sweden\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347489\",\n    \"event\": \"LTRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Lithuania, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"LT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.9\",\n    \"source\": \"Lithuanian Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347487\",\n    \"event\": \"LTRSMM\",\n    \"title\": \"Retail Sales MoM\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In Lithuania, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In Lithuania, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"LT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.3\",\n    \"source\": \"Lithuanian Department of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347482\",\n    \"event\": \"SEEXP\",\n    \"title\": \"Exports\",\n    \"indicator\": \"Exports\",\n    \"comment\": \"Sweden is an export-oriented market economy. Timber, hydropower, and iron ore constitute the resource base of an economy heavily oriented toward foreign trade. Sweden's engineering sector accounts for 50% of output and exports. Telecommunications, the automotive industry and the pharmaceutical industries are also of great importance. Main export partners are Germany, United States and Norway.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"160.2\",\n    \"source\": \"Statistics Sweden\",\n    \"scale\": \"B\",\n    \"unit\": \"SEK\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347481\",\n    \"event\": \"SEBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Sweden exports mostly machinery, motor vehicles, paper products, pulp and wood, iron, steel products, chemicals. The country imports machinery, petroleum and petroleum products, chemicals, motor vehicles, iron and steel; foodstuffs and clothing. European Union is by far its largest trading partner accounting for about 61% of exports and 72% of imports. Norway, Russia, The United States and China play also an important role.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.8\",\n    \"source\": \"Statistics Sweden\",\n    \"scale\": \"B\",\n    \"unit\": \"SEK\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347480\",\n    \"event\": \"SEIMP\",\n    \"title\": \"Imports\",\n    \"indicator\": \"Imports\",\n    \"comment\": \"Sweden imports mainly machinery, petroleum and petroleum products, chemicals, motor vehicles, iron and steel; foodstuffs and clothing. Its principal import partners are European Union countries (Germany, Denmark, Netherlands, Finland), Norway and China.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"156.4\",\n    \"source\": \"Statistics Sweden\",\n    \"scale\": \"B\",\n    \"unit\": \"SEK\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347394\",\n    \"event\": \"TREOI\",\n    \"title\": \"Economic Confidence Index\",\n    \"indicator\": \"Economic Optimism Index\",\n    \"comment\": \"In Turkey, economic confidence index is a composite index that encapsulates consumersâ€™ and producersâ€™ evaluations, expectations and tendencies about general economic situation. The index is combined by means of a weighted aggregation of normalized sub-indices of consumer confidence, seasonally adjusted real sector (manufacturing industry), services, retail trade and construction confidence indices. The economic confidence index indicates an optimistic outlook about the general economic situation when the index is above 100, on contrary it indicates a pessimistic outlook when it is below 100.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"99.4\",\n    \"source\": \"Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347393\",\n    \"event\": \"TRBOT\",\n    \"title\": \"Balance of Trade Final\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"The Turkish trade balance has been in deficit since 1947. Turkey major exports are road vehicles, textiles, iron and steel, clothing and food, while imports were machinery and transport equipment, manufactured goods, mineral fuels and lubricants and chemicals. The biggest trade deficits were recorded with China, Russia, Germany, South Korea, Switzerland, India, Iran and Japan; and the largest surpluses were recorded with Iraq, the UAE, the UK, Israel, Syria, Northern Cyprus and Azerbaijan.\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-6.04\",\n    \"source\": \"Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347388\",\n    \"event\": \"TREXP\",\n    \"title\": \"Exports Final\",\n    \"indicator\": \"Exports\",\n    \"comment\": \"Turkey's major exports are: machinery and transport equipment (31 percent of total exports), of which road vehicles (15 percent) and electrical machinery, apparatus and appliances (6 percent); manufactured goods (25 percent), of which textile yarn, fabrics, made-up articles (7 percent), iron and steel (6 percent) and manufactures of metals (4 percent); miscellaneous manufactured articles (18 percent), of which articles of apparel and clothing accessories (10 percent); food and live animals (9 percent), of which fruits and vegetables (4 percent); chemicals and related products (6 percent); and gold,non-monetary (4 percent). Turkey's main export partners were: Germany (10 percent of total exports); the UK, the UAE, Iraq and the US (6 percent each); Italy (5 percent); France and Spain (4 percent each).\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"23\",\n    \"source\": \"Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347386\",\n    \"event\": \"TRIMP\",\n    \"title\": \"Imports Final\",\n    \"indicator\": \"Imports\",\n    \"comment\": \"Turkey's main imports are machinery and transport equipment (31 percent of total imports), of which road vehicles (7 percent) and electrical machinery, apparatus and appliances (6 percent); manufactured goods (16 percent), of which iron and steel (5 percent); mineral fuels, lubricants and related materials (16 percent), of which petroleum and petroleum products (4 percent); chemicals and related products (13 percent), of which plastics (4 percent); gold, non-monetary (7 percent); crude materials, inedible, except fuels (7 percent); miscellaneous manufactured articles (6 percent); and food and live animals (4 percent). The country's main imports' sources were: China (10 percent of total imports); Germany (9 percent); Russia (8 percent); the US and Italy (5 percent each); France, Iran, Switzerland, South Korea, the UK, Spain and India (3 percent each).\",\n    \"country\": \"TR\",\n    \"currency\": \"TRY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"29.04\",\n    \"source\": \"Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347263\",\n    \"event\": \"DKRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Denmark, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"DK\",\n    \"currency\": \"DKK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.5\",\n    \"source\": \"Danmarks Statistik\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347262\",\n    \"event\": \"DKRSMM\",\n    \"title\": \"Retail Sales MoM\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In Denmark, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In Denmark, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"DK\",\n    \"currency\": \"DKK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-1\",\n    \"source\": \"Danmarks Statistik\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 07:00:00\"\n  },\n  {\n    \"id\": \"347515\",\n    \"event\": \"CZPPIMM\",\n    \"title\": \"PPI MoM\",\n    \"indicator\": \"Producer Price Inflation MoM\",\n    \"comment\": \"In the Czech Republic, Producer Price Inflation MoM measures a month-over-month change in the price of goods and services sold by manufacturers and producers in the wholesale market.\",\n    \"country\": \"CZ\",\n    \"currency\": \"CZK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"2.2\",\n    \"previous\": \"-0.5\",\n    \"source\": \"Statistical Office (CSU)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347513\",\n    \"event\": \"CZPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"CZ\",\n    \"currency\": \"CZK\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"-1.8\",\n    \"previous\": \"1.4\",\n    \"source\": \"Statistical Office (CSU)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347400\",\n    \"event\": \"SKBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Slovakia, the confidence indicator in industry measures the level of optimism that companies have about the performance of the economy and how they feel about their organizationsâ€™ prospects. Statistical Office of the Slovak Republic confidence indicator in industry is a composite indicator calculated as an arithmetic average of balances of the demand, stock of finished goods (with an opposite sign) and the expected production.\",\n    \"country\": \"SK\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-8.3\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347398\",\n    \"event\": \"SKCCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Slovakia, the consumer confidence survey measures the level of optimism that consumers have about the performance of the economy. The consumer confidence indicator is the arithmetic average of the balances (%) of four questions: the financial situation of households, the general economic situation, unemployment expectations (with inverted sign) and savings, all over the next 12 months.\",\n    \"country\": \"SK\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-11.9\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347277\",\n    \"event\": \"SEIE\",\n    \"title\": \"Consumer Inflation Expectations\",\n    \"indicator\": \"Inflation Expectations\",\n    \"comment\": \"In Sweden, inflation expectations refer to median one year ahead expected inflation rate.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.1\",\n    \"source\": \"National Institute of Economic Research\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347276\",\n    \"event\": \"SEBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Sweden, the confidence indicator for the business sector is intended to provide a quick qualitative indication of actual outcomes, current situation and future expectations of Swedish companies. The variables in the survey include new orders, output, and employment. The survey covers  6,000 firms in the business sector.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"91.7\",\n    \"source\": \"National Institute of Economic Research\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347275\",\n    \"event\": \"SECCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Sweden, the Consumer Confidence indicator is based on a survey of 1500 households that are interviewed each month. The questions cover consumersâ€™ assessment of their personal finances and the Swedish economy, expectations for interest rates and inflation, and plans for major purchases and savings.\",\n    \"country\": \"SE\",\n    \"currency\": \"SEK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"82.3\",\n    \"source\": \"National Institute of Economic Research\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 08:00:00\"\n  },\n  {\n    \"id\": \"347528\",\n    \"event\": \"UGIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Uganda, the main components of the Consumer Price Index are: Food and Non-Alcoholic Beverages (27%), Transport (10%), and Housing (10%). Restaurants & Hotels accounts for 9%, Clothing & Footwear for 7% and Education for 6%. The index also includes: Miscellaneous Goods & Services (5%), Recreation & Culture (5%), Furniture & Household Goods (5%), Communication (4%), Alcoholic Beverages, Tobacco and Narcotics (4%), and Medical Care (2%).\",\n    \"country\": \"UG\",\n    \"currency\": \"UGX\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.8\",\n    \"source\": \"Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 08:30:00\"\n  },\n  {\n    \"id\": \"347537\",\n    \"event\": \"BGPPIMM\",\n    \"title\": \"PPI MoM\",\n    \"indicator\": \"Producer Price Inflation MoM\",\n    \"comment\": \"In Bulgaria, the Producer Price Inflation MoM measures a month-over-month change in the price of goods and services sold by manufacturers and producers in the wholesale market.\",\n    \"country\": \"BG\",\n    \"currency\": \"BGN\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.6\",\n    \"source\": \"National Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347536\",\n    \"event\": \"BGPPIYY\",\n    \"title\": \"PPI YoY\",\n    \"indicator\": \"Producer Prices Change\",\n    \"comment\": \"Producer prices change refers to year over year change in price of goods and services sold by manufacturers and producers in the wholesale market during a given period.\",\n    \"country\": \"BG\",\n    \"currency\": \"BGN\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-14.6\",\n    \"source\": \"National Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347535\",\n    \"event\": \"BGBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Bulgaria, the business climate in industry measures the level of optimism that companies have about the performance of the economy and how they feel about their organizationsâ€™ prospects over the future. Business confidence surveys can provide useful signs about the current condition of the economy, because companies often have information about consumer demand sooner than government statisticians do.\",\n    \"country\": \"BG\",\n    \"currency\": \"BGN\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"23.3\",\n    \"source\": \"National Statistical Institute\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347416\",\n    \"event\": \"ITBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Italy, the Manufacturing Confidence Index covers 4,000 Italian companies. The questionnaire focuses on the current trend of order books, production and inventories, short-term forecasts on order books, production, prices and the general economic situation. The business confidence index is adjusted for seasonal effects and fixed to a base year of 2005. The value 100 indicates no evolution in business sentiment, a value over 100 shows increasing confidence and a value under 100 indicates low expectations.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"88.3\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347415\",\n    \"event\": \"ITCCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Italy, the Confidence Climate Index covers 2,000 Italian consumers. The survey is done by phone and assesses householdsâ€™ economic conditions, employment and saving prospects and expected purchases of durable goods. The consumer confidence index is adjusted for seasonal effects and fixed to a base year of 2005. The value 100 indicates no evolution in consumer sentiment, a value over 100 shows increasing confidence and a value under 100 indicates low expectations.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"96.4\",\n    \"source\": \"National Institute of Statistics (ISTAT)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347414\",\n    \"event\": \"ISIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"IS\",\n    \"currency\": \"ISK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.16\",\n    \"source\": \"Statistics Iceland\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347412\",\n    \"event\": \"ISIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Iceland, the most important categories in the consumer price index are housing and utilities (29 percent of total weight); transport (15 percent); and food and non-alcoholic beverages (15 percent). The index also includes: recreation and culture (10 percent); miscellaneous goods and services (7 percent); and furnishings and household equipment (7 percent). Hotels, cafes and restaurants, health, clothing and footwear, alcoholic beverages and tobacco, communication and education account for the remaining 17 percent of total weight.\",\n    \"country\": \"IS\",\n    \"currency\": \"ISK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"6.7\",\n    \"source\": \"Statistics Iceland\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347411\",\n    \"event\": \"ISCPI\",\n    \"title\": \"CPI\",\n    \"indicator\": \"Consumer Price Index CPI\",\n    \"comment\": \"In Iceland, the Consumer Price Index or CPI measures changes in the prices paid by consumers for a basket of goods and services.\",\n    \"country\": \"IS\",\n    \"currency\": \"ISK\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"607.3\",\n    \"source\": \"Statistics Iceland\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:00:00\"\n  },\n  {\n    \"id\": \"347541\",\n    \"event\": \"SIHIRYY\",\n    \"title\": \"Harmonised Inflation Rate YoY\",\n    \"indicator\": \"Harmonised Inflation Rate YoY\",\n    \"comment\": \"The Harmonised Index of Consumer Prices (HICP) is an indicator of inflation and price stability for the European Central Bank (ECB). The HICP is compiled by Eurostat and the national statistical institutes in accordance with harmonised statistical methods. The ECB aims to maintain annual inflation rates as measured by the HICP below, but close to, 2% over the medium term.\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.4\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:30:00\"\n  },\n  {\n    \"id\": \"347538\",\n    \"event\": \"LKIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Sri Lanka, the Consumer Price Index (CPI) is composed of two main groups: Food Items (41%) and Non-food Items (59%). Food items are mainly composed of: Bread & Cereals (8%), Fish & Sea food (6%) and Vegetables (6%). The most important Non-Food Items are: Housing, Water, Electricity, Gas & Other Fuels (24%), Transport (12%), and Restaurants & Hotels (6%).\",\n    \"country\": \"LK\",\n    \"currency\": \"LKR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"6.4\",\n    \"source\": \"Department of Census and Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 09:30:00\"\n  },\n  {\n    \"id\": \"347421\",\n    \"event\": \"PTBCOI\",\n    \"title\": \"Business confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Portugal, the National Statistics Institute (INE) economic climate indicator on three terms moving averages is calculated in order to receive a timely composite indicator for the several sectors of economic activity. It is estimated using balances of questions from the Manufacturing Industry (1179 companies), Trade (1102 companies), Construction and Public Works (822 companies) and Services (1427 companies) surveys. The calculation is based on the factor analysis and the estimated series (the common component) is calibrated using the GDP change rates. The use of moving averages smooths out the series by removing the irregular movements, allowing the detection of the short-term trends.\",\n    \"country\": \"PT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.5\",\n    \"source\": \"National Statistics Institute (INE)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:30:00\"\n  },\n  {\n    \"id\": \"347420\",\n    \"event\": \"SIRSMM\",\n    \"title\": \"Retail Sales MoM\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In Slovenia, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In Slovenia, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-3.6\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 09:30:00\"\n  },\n  {\n    \"id\": \"347419\",\n    \"event\": \"PTCCI\",\n    \"title\": \"Consumer Confidence\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Portugal, the consumer confidence index on three terms moving averages is based on interviews with consumers about their perceptions of the country's current and future economic situation and their tendencies to purchase. It is estimated using the difference between the share of positive evaluation responses and negative evaluation responses, but do not include the share of neutral responses. The use of moving averages smooths out the series by removing the irregular movements, allowing the detection of the short-term trends.\",\n    \"country\": \"PT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-26.9\",\n    \"source\": \"National Statistics Institute (INE)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 09:30:00\"\n  },\n  {\n    \"id\": \"347418\",\n    \"event\": \"SIRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Slovenia, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"SI\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-15\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 09:30:00\"\n  },\n  {\n    \"id\": \"363213\",\n    \"event\": \"311213\",\n    \"title\": \"7-Year Treasury Gilt Auction\",\n    \"indicator\": \"7 Year Note Yield\",\n    \"comment\": \"\",\n    \"country\": \"GB\",\n    \"currency\": \"GBP\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Department of Treasury\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347732\",\n    \"event\": \"MTGDPYY\",\n    \"title\": \"GDP Growth Rate YoY\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"Malta's economy is dependent on foreign trade (serving as a freight trans-shipment point), manufacturing of electronics and textiles, tourism and financial services as it offers low-cost environment and an advantageous tax regime. On the expenditure side, household consumption is the main component of GDP and accounts for 55 percent of its total use, followed by government expenditure (20 percent) and gross fixed capital formation (19 percent). Exports of goods and services account for 149 percent while imports account for 143 percent, adding 6 percent of total GDP.\",\n    \"country\": \"MT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.1\",\n    \"source\": \"National Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347549\",\n    \"event\": \"BEGDPYY\",\n    \"title\": \"GDP Growth Rate YoY Final\",\n    \"indicator\": \"GDP Annual Growth Rate\",\n    \"comment\": \"In Belgium, household consumption is the main component of GDP and accounts for 52 percent of its total use, followed by government expenditure (25 percent) and gross fixed capital formation (23 percent). Exports of goods and services account for 84 percent of GDP while imports account for 83 percent, adding 1 percent of total GDP.\",\n    \"country\": \"BE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.4\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347548\",\n    \"event\": \"META\",\n    \"title\": \"Tourist Arrivals YoY\",\n    \"indicator\": \"Tourist Arrivals\",\n    \"comment\": \"\",\n    \"country\": \"ME\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"23.2\",\n    \"source\": \"Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347547\",\n    \"event\": \"BEGDPQQ\",\n    \"title\": \"GDP Growth Rate QoQ Final\",\n    \"indicator\": \"GDP Growth Rate\",\n    \"comment\": \"In Belgium, household consumption is the main component of GDP and accounts for 52 percent of its total use, followed by government expenditure (25 percent) and gross fixed capital formation (23 percent). Exports of goods and services account for 84 percent of GDP while imports account for 83 percent, adding 1 percent of total GDP.\",\n    \"country\": \"BE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"0.4\",\n    \"previous\": \"0.4\",\n    \"source\": \"National Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347428\",\n    \"event\": \"284859\",\n    \"title\": \"Selling Price Expectations\",\n    \"indicator\": \"Selling Price Expectations\",\n    \"comment\": \"\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.6\",\n    \"source\": \"European Commission\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347427\",\n    \"event\": \"EUIS\",\n    \"title\": \"Industrial Sentiment\",\n    \"indicator\": \"Industrial Sentiment\",\n    \"comment\": \"In the Euro Area, Industrial Sentiment measures the confidence level among manufacturers and accounts for 40 percent of the Economic Sentiment Indicator.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"-9.2\",\n    \"previous\": \"-9.4\",\n    \"source\": \"European Commission\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347426\",\n    \"event\": \"EUSS\",\n    \"title\": \"Services Sentiment\",\n    \"indicator\": \"Services Sentiment\",\n    \"comment\": \"In the Euro Area, Services Sentiment measures the confidence level among service providers and accounts for 30 percent of the Economic Sentiment Indicator.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"9\",\n    \"previous\": \"8.8\",\n    \"source\": \"European Commission\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347425\",\n    \"event\": \"EUCCI\",\n    \"title\": \"Consumer Confidence Final\",\n    \"indicator\": \"Consumer Confidence\",\n    \"comment\": \"In Euro Area, the Consumer Economic Sentiment Indicator measures the level of optimism that consumers have about the economy. The survey is made by phone and covers 23 000 households in the Euro Area. The number of households sample varies across the zone. The questions focus on current economic and financial situation, savings intention as well as on expected developments regarding: consumer price indexes, general economic situation and major purchases of durable goods. The Consumer ESI measures consumer confidence on a scale of -100 to 100, where -100 indicate extreme lack of confidence, 0 neutrality and 100 extreme confidence.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"-15.5\",\n    \"previous\": \"-16.1\",\n    \"source\": \"European Commission\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347423\",\n    \"event\": \"EUCCPT\",\n    \"title\": \"Consumer Inflation Expectations\",\n    \"indicator\": \"Consumer Confidence Price Trends\",\n    \"comment\": \"In the Euro Area, inflation expectations refer to median expectations for inflation over the next 12 months and are part of the Consumer Expectations Survey published by the ECB.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"11.9\",\n    \"source\": \"European Commission\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347422\",\n    \"event\": \"EUEOI\",\n    \"title\": \"Economic Sentiment\",\n    \"indicator\": \"Economic Optimism Index\",\n    \"comment\": \"In the Euro Area, the Economic sentiment indicator is a composite measure (average=100) that calculates the confidence level among: manufacturers (40 percent of the index); service providers (30 percent); consumers (20 percent); retailers (5 percent) and constructors (5 percent).\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"96.6\",\n    \"previous\": \"96.2\",\n    \"source\": \"European Commission\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"347311\",\n    \"event\": \"CYIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Cyprus, industrial production measures the output of businesses integrated in industrial sector of the economy. Manufacturing is the most important sector and accounts for 72 percent of total production. The biggest segments within Manufacturing are: food products (32 percent of total production); other non-metallic mineral products (7 percent); basic pharmaceutical products and pharmaceutical preparations (6 percent); and fabricated metal products, except machinery and equipment (5 percent). Mining and quarrying, and electricity, gas, steam and air conditioning supply account for 20 percent of total output; and water supply, sewerage, waste management and remediation activities account for the remaining 8 percent.\",\n    \"country\": \"CY\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.8\",\n    \"source\": \"Statistical Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:00:00\"\n  },\n  {\n    \"id\": \"363984\",\n    \"event\": \"130513\",\n    \"title\": \"5-Year BTP Auction\",\n    \"indicator\": \"5 Year Note Yield\",\n    \"comment\": \"\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.14\",\n    \"source\": \"Dipartimento del Tesoro\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:10:00\"\n  },\n  {\n    \"id\": \"363912\",\n    \"event\": \"130512\",\n    \"title\": \"10-Year BTP Auction\",\n    \"indicator\": \"Government Bond 10Y\",\n    \"comment\": \"Generally, a government bond is issued by a national government and is denominated in the country`s own currency. Bonds issued by national governments in foreign currencies are normally referred to as sovereign bonds. The yield required by investors to loan funds to governments reflects inflation expectations and the likelihood that the debt will be repaid.\",\n    \"country\": \"IT\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.69\",\n    \"source\": \"Dipartimento del Tesoro\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:10:00\"\n  },\n  {\n    \"id\": \"363756\",\n    \"event\": \"284390\",\n    \"title\": \"15-Year Bund Auction\",\n    \"indicator\": \"15 Year Bond Yield\",\n    \"comment\": \"\",\n    \"country\": \"DE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.51\",\n    \"source\": \"Department of Treasury\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:30:00\"\n  },\n  {\n    \"id\": \"347555\",\n    \"event\": \"THRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Thailand, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"TH\",\n    \"currency\": \"THB\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"11\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 10:30:00\"\n  },\n  {\n    \"id\": \"347436\",\n    \"event\": \"BEIRMM\",\n    \"title\": \"Inflation Rate MoM\",\n    \"indicator\": \"Inflation Rate Mom\",\n    \"comment\": \"Inflation Rate MoM measures month over month change in the price of goods and services.\",\n    \"country\": \"BE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.49\",\n    \"source\": \"Belgian Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 10:30:00\"\n  },\n  {\n    \"id\": \"347557\",\n    \"event\": \"LKBOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"Sri Lanka exports mostly textiles and garments (40% of total exports) and tea (17%). Others include: spices, gems, coconut products, rubber and fish. Main export partners are United States, United Kingdom, Germany, Belgium and Italy. Sri Lanka imports petroleum, textile fabrics, foodstuffes and  machinery and transportation equipment. Main import partners are India, China, Iran and Singapore.\",\n    \"country\": \"LK\",\n    \"currency\": \"LKR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-490\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"M\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-28 10:45:00\"\n  },\n  {\n    \"id\": \"347885\",\n    \"event\": \"KWLG\",\n    \"title\": \"Private Bank Lending YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"\",\n    \"country\": \"KW\",\n    \"currency\": \"KWD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.41\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 11:00:00\"\n  },\n  {\n    \"id\": \"347884\",\n    \"event\": \"KWM2\",\n    \"title\": \"M2 Money Supply YoY\",\n    \"indicator\": \"Money Supply M2\",\n    \"comment\": \"Kuwait Money Supply M2 includes M1 plus short-term time deposits in banks.\",\n    \"country\": \"KW\",\n    \"currency\": \"KWD\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.04\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 11:00:00\"\n  },\n  {\n    \"id\": \"347563\",\n    \"event\": \"IERSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Ireland, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"IE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.9\",\n    \"source\": \"Central Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 11:00:00\"\n  },\n  {\n    \"id\": \"347562\",\n    \"event\": \"IERSMM\",\n    \"title\": \"Retail Sales MoM\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In Ireland, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In Ireland, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"IE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.9\",\n    \"source\": \"Central Statistics Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 11:00:00\"\n  },\n  {\n    \"id\": \"347435\",\n    \"event\": \"BEIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Belgium, the most important category in the consumer price index is Housing and Utilities (18 percent of total weight). Food and Non-Alcoholic Beverages account for 17 percent; Transport for 16 percent; Recreation and Culture for 9 percent;  Miscellaneous Goods and Services for 9 percent and Restaurants and Hotels for 8 percent. Furniture, Household Goods and Maintenance; Clothing and Footwear; Communication; Health; Alcoholic Beverages and Tobacco and Education account for the remaining 23 percent of total weight.\",\n    \"country\": \"BE\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.75\",\n    \"source\": \"Belgian Statistical Office\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 11:00:00\"\n  },\n  {\n    \"id\": \"347434\",\n    \"event\": \"337533\",\n    \"title\": \"IGP-M Inflation MoM\",\n    \"indicator\": \"IGP-M Inflation MoM\",\n    \"comment\": \"The IGP-M Inflation Index in Brazil is an index that measures and tracks the changes in price of goods in the stages before the retail level. Wholesale price indexes (WPIs) report monthly to show the average price changes of goods sold in bulk, and they are a group of the indicators that follow growth in the economy.\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.07\",\n    \"source\": \"FGV - Fundacao Getulio Vargas\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 11:00:00\"\n  },\n  {\n    \"id\": \"347441\",\n    \"event\": \"BRLG\",\n    \"title\": \"Bank Lending MoM\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"Private Sector Credit in Brazil refers to the outstanding amount of total credit extended to the private sector.\",\n    \"country\": \"BR\",\n    \"currency\": \"BRL\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"1.4\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 11:30:00\"\n  },\n  {\n    \"id\": \"347582\",\n    \"event\": \"ZABOT\",\n    \"title\": \"Balance of Trade\",\n    \"indicator\": \"Balance of Trade\",\n    \"comment\": \"In 2021, South Africa recorded a trade surplus for the fifth consecutive year. The top exports of South Africa are mineral products; base metals and articles of base metal; vehicles and aircraft vessels and machinery (6.8 percent), shipped primarily to China, the United States and Germany. The top imports of South Africa are machinery, mineral products, chemicals and vehicles & transport equipment, sourced mainly from China, India and the United States.\",\n    \"country\": \"ZA\",\n    \"currency\": \"ZAR\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"14.1\",\n    \"source\": \"Revenue Service\",\n    \"scale\": \"B\",\n    \"unit\": \"ZAR\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"347437\",\n    \"event\": \"CLUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Chile, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"CL\",\n    \"currency\": \"CLF\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"8.5\",\n    \"source\": \"National Institute of Statistics (INE)\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"342455\",\n    \"event\": \"USMRI\",\n    \"title\": \"MBA Mortgage Refinance Index\",\n    \"indicator\": \"MBA Mortgage Refinance Index\",\n    \"comment\": \"The MBA Weekly Mortgage Application Survey is a comprehensive overview of the nationwide mortgage market and covers all types of mortgage originators, including commercial banks, thrift institutions and mortgage banking companies. The entire market is represented by the Market Index which covers all mortgage applications during the week. This includes all conventional and government applications, all fixed-rate mortgages (FRMs), all adjustable-rate mortgages (ARMs), whether for a purchase or to refinance.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"427\",\n    \"source\": \"Mortgage Bankers Association of America\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"342454\",\n    \"event\": \"USMMI\",\n    \"title\": \"MBA Mortgage Market Index\",\n    \"indicator\": \"MBA Mortgage Market Index\",\n    \"comment\": \"The MBA Weekly Mortgage Application Survey is a comprehensive overview of the nationwide mortgage market and covers all types of mortgage originators, including commercial banks, thrift institutions and mortgage banking companies. The entire market is represented by the Market Index which covers all mortgage applications during the week. This includes all conventional and government applications, all fixed-rate mortgages (FRMs), all adjustable-rate mortgages (ARMs), whether for a purchase or to refinance.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"181.6\",\n    \"source\": \"Mortgage Bankers Association of America\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"342453\",\n    \"event\": \"USMAPL\",\n    \"title\": \"MBA Mortgage Applications\",\n    \"indicator\": \"Mortgage Applications\",\n    \"comment\": \"In the US, the MBA Weekly Mortgage Application Survey is a comprehensive overview of the nationwide mortgage market and covers all types of mortgage originators, including commercial banks, thrift institutions and mortgage banking companies. The entire market is represented by the Market Index which covers all mortgage applications during the week, whether for a purchase or to refinance. The survey covers over 75% of all US retail residential mortgage applications.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-10.6\",\n    \"source\": \"Mortgage Bankers Association of America\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"342452\",\n    \"event\": \"USPIND\",\n    \"title\": \"MBA Purchase Index\",\n    \"indicator\": \"MBA Purchase Index\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"133.6\",\n    \"source\": \"Mortgage Bankers Association of America\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"342451\",\n    \"event\": \"USMR\",\n    \"title\": \"MBA 30-Year Mortgage Rate\",\n    \"indicator\": \"Mortgage Rate\",\n    \"comment\": \"MBA 30-Year Mortgage Rate is average 30-year fixed mortgage lending rateÂ measured during the reported week and backed by the Mortgage Bankers Association.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.06\",\n    \"source\": \"Mortgage Bankers Association of America\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 12:00:00\"\n  },\n  {\n    \"id\": \"347595\",\n    \"event\": \"USGTB\",\n    \"title\": \"Goods Trade Balance Adv\",\n    \"indicator\": \"Goods Trade Balance\",\n    \"comment\": \"In the US, goods trade balance is equal to goods exports less goods imports.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-88.46\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"B\",\n    \"unit\": \"$\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347594\",\n    \"event\": \"USWI\",\n    \"title\": \"Wholesale Inventories MoM Adv\",\n    \"indicator\": \"Wholesale Inventories\",\n    \"comment\": \"The Wholesale Inventories are the stock of unsold goods held by wholesalers. Inventories are a key component of gross domestic product changes. A high inventory points to economic slowdown in the US, while a low reading points to a stronger growth.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347593\",\n    \"event\": \"USRIEA\",\n    \"title\": \"Retail Inventories Ex Autos MoM Adv\",\n    \"indicator\": \"Retail Inventories Ex Autos\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.4\",\n    \"source\": \"Census Bureau\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347442\",\n    \"event\": \"CACA\",\n    \"title\": \"Current Account\",\n    \"indicator\": \"Current Account\",\n    \"comment\": \"Current Account is the sum of the balance of trade (exports minus imports of goods and services), net factor income (such as interest and dividends) and net transfer payments (such as foreign aid).\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-3.22\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"B\",\n    \"unit\": \"C$\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347353\",\n    \"event\": \"USCPCEPQQ\",\n    \"title\": \"Core PCE Prices QoQ 2nd Est\",\n    \"indicator\": \"Core PCE Prices QoQ\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2\",\n    \"source\": \"Bureau of Economics Analysis\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347352\",\n    \"event\": \"USPCEPQQ\",\n    \"title\": \"PCE Prices QoQ 2nd Est\",\n    \"indicator\": \"PCE Prices QoQ\",\n    \"comment\": \"The Personal Consumption Expenditure (PCE) Prices measure the changes in the price of goods and services purchased by consumers for the purpose of consumption. Prices are weighted according to total expenditure per item.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.6\",\n    \"source\": \"Bureau of Economics Analysis\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347351\",\n    \"event\": \"USGDPQQ\",\n    \"title\": \"GDP Growth Rate QoQ 2nd Est\",\n    \"indicator\": \"GDP Growth Rate\",\n    \"comment\": \"On the expenditure side, personal consumption expenditures accounts for 68 percent of total GDP out of which purchases of goods constitute 23 percent and services 45 percent. Private investment accounts for 16 percent of GDP and government consumption and investment for 18 percent. As the value of goods exported (13.5 percent) is lower than the value of goods imported (16.5 percent), net exports subtracts 3 percent from the total GDP value.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"2\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"3.3\",\n    \"previous\": \"4.9\",\n    \"source\": \"Bureau of Economics Analysis\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347350\",\n    \"event\": \"USGDPD\",\n    \"title\": \"GDP Price Index QoQ 2nd Est\",\n    \"indicator\": \"GDP Deflator\",\n    \"comment\": \"The GDP Deflator measures the change in prices of final goods and services and it is considered as a key indicator for inflationary pressures, that provides insight into the future direction of monetary policy.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.3\",\n    \"source\": \"Bureau of Economics Analysis\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347349\",\n    \"event\": \"USGDPSA\",\n    \"title\": \"GDP Sales QoQ 2nd Est\",\n    \"indicator\": \"GDP Sales QoQ\",\n    \"comment\": \"In the United States, final sales of domestic product equals GDP less change in private inventories. It is also equal to the sum of personal consumption expenditures, gross private fixed investment, government consumption expenditures and gross investment, and net exports of goods and services.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.6\",\n    \"source\": \"Bureau of Economics Analysis\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347348\",\n    \"event\": \"CAWG\",\n    \"title\": \"Average Weekly Earnings YoY\",\n    \"indicator\": \"Wage Growth\",\n    \"comment\": \"In Canada, average weekly earnings (including overtime) refers to the gross taxable payroll (including overtime) divided by the number of employees. It is calculated for all types of employees. In general, changes in weekly earnings reflect a number of factors, including wage growth; changes in the composition of employment by industry, occupation and level of job experience; and average hours worked per week.\",\n    \"country\": \"CA\",\n    \"currency\": \"CAD\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"4.1\",\n    \"source\": \"Statistics Canada\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"347347\",\n    \"event\": \"USRCNSMSPND\",\n    \"title\": \"Real Consumer Spending QoQ 2nd Est\",\n    \"indicator\": \"Real Consumer Spending\",\n    \"comment\": \"In the United States, personal consumption expenditure (PCE) is the primary measure of consumer spending in the U.S. economy. It is the National Income and Product Account (NIPA) final-demand component that measures the value of the goods and services purchased by, or on the behalf of, persons who reside in the United States.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Q4\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.1\",\n    \"source\": \"Bureau of Economics Analysis\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 13:30:00\"\n  },\n  {\n    \"id\": \"364916\",\n    \"event\": \"EUINTR\",\n    \"title\": \"ECB McCaul Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the Euro Area, benchmark interest rate is set by the Governing Council of the European Central Bank. The primary objective of the ECBâ€™s monetary policy is to maintain price stability which is to keep inflation below, but close to 2 percent over the medium term. In times of prolonged low inflation and low interest rates, ECB may also adopt non-standard monetary policy measures, such as asset purchase programmes. The official interest rate is the Main refinancing operations rate.\",\n    \"country\": \"EU\",\n    \"currency\": \"EUR\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"European Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 14:00:00\"\n  },\n  {\n    \"id\": \"347592\",\n    \"event\": \"SALG\",\n    \"title\": \"Private Bank Lending YoY\",\n    \"indicator\": \"Loan Growth\",\n    \"comment\": \"\",\n    \"country\": \"SA\",\n    \"currency\": \"SAR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"10\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 14:00:00\"\n  },\n  {\n    \"id\": \"347591\",\n    \"event\": \"SAM3\",\n    \"title\": \"M3 Money Supply YoY\",\n    \"indicator\": \"Money Supply M3\",\n    \"comment\": \"Saudi Arabia Money Supply M3 includes M2 plus long-term time deposits in banks.\",\n    \"country\": \"SA\",\n    \"currency\": \"SAR\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.6\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 14:00:00\"\n  },\n  {\n    \"id\": \"342464\",\n    \"event\": \"USHOS\",\n    \"title\": \"EIA Heating Oil Stocks Change\",\n    \"indicator\": \"Heating Oil Stocks\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.351\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342463\",\n    \"event\": \"USGPRO\",\n    \"title\": \"EIA Gasoline Production Change\",\n    \"indicator\": \"Gasoline Production\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.146\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342462\",\n    \"event\": \"USDFS\",\n    \"title\": \"EIA Distillate Stocks Change\",\n    \"indicator\": \"Distillate Stocks\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-4.009\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342461\",\n    \"event\": \"USGSCH\",\n    \"title\": \"EIA Gasoline Stocks Change\",\n    \"indicator\": \"Gasoline Stocks Change\",\n    \"comment\": \"Stocks of gasoline refers to the weekly change of the gasoline supply situation.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.294\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342460\",\n    \"event\": \"USDFP\",\n    \"title\": \"EIA Distillate Fuel Production Change\",\n    \"indicator\": \"Distillate Fuel Production\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.095\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342459\",\n    \"event\": \"USRCR\",\n    \"title\": \"EIA Refinery Crude Runs Change\",\n    \"indicator\": \"Refinery Crude Runs\",\n    \"comment\": \"Crude Runs refer to the volume of crude oil consumed by refineries.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.031\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342458\",\n    \"event\": \"USCOI\",\n    \"title\": \"EIA Crude Oil Imports Change\",\n    \"indicator\": \"Crude Oil Imports\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.434\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"364891\",\n    \"event\": \"282591\",\n    \"title\": \"NY Fed Treasury Purchases 22.5 to 30 yrs\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"55\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342457\",\n    \"event\": \"USCCOS\",\n    \"title\": \"EIA Cushing Crude Oil Stocks Change\",\n    \"indicator\": \"Cushing Crude Oil Stocks\",\n    \"comment\": \"Change in the number of barrels of crude oil held in storage at the Cushing, Oklahoma during the past week.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"0.741\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"342456\",\n    \"event\": \"USCOSC\",\n    \"title\": \"EIA Crude Oil Stocks Change\",\n    \"indicator\": \"Crude Oil Stocks Change\",\n    \"comment\": \"Stocks of crude oil refer to the weekly change of the crude oil supply situation.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb/23\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3.514\",\n    \"source\": \"U.S. Energy Information Administration\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 15:30:00\"\n  },\n  {\n    \"id\": \"348241\",\n    \"event\": \"RUCPR\",\n    \"title\": \"Corporate Profits\",\n    \"indicator\": \"Corporate Profits\",\n    \"comment\": \"Corporate Profits in Russia is balanced financial result (profit minus loss) of organizations, excluding small businesses, banks, insurance companies and budgetary institutions. Corporate Profits is cumulative value.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"32.1\",\n    \"source\": \"Federal State Statistics Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"347777\",\n    \"event\": \"RUMGDPYY\",\n    \"title\": \"GDP YoY\",\n    \"indicator\": \"Monthly GDP YoY\",\n    \"comment\": \"In Russia, Monthly GDP YoY measures the change in the value of the goods and services produced by the country's economy compared to the corresponding month in the previous year.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Ministry of Economic Development\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"347776\",\n    \"event\": \"RUBCOI\",\n    \"title\": \"Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In Russia, the business confidence index measures morale among manufacturers. The index is calculated as the arithmetic average balances of assessments of actually existing levels of demand, stocks of finished products (with opposite sign) as well as change in output expected in the next 3 months. The index shows the difference between the percentage share of executives that are optimistic and the percentage of that is pessimistic. The index takes a value between -100 (all responding entities asses their situation as poor and expect it to become worse) up to 100 (all participants are satisfied with the current situation and expect it to improve); 0 indicates neutrality.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.8\",\n    \"source\": \"Federal State Statistics Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"347775\",\n    \"event\": \"RUWG\",\n    \"title\": \"Real Wage Growth YoY\",\n    \"indicator\": \"Wage Growth\",\n    \"comment\": \"In Russia, Real Wage Growth measures the year-on-year change in average monthly wages adjusted for inflation.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"Dec\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.2\",\n    \"source\": \"Federal State Statistics Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"347774\",\n    \"event\": \"RUUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Russia, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"3\",\n    \"source\": \"Federal State Statistics Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"347773\",\n    \"event\": \"RURSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Russia, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"10.2\",\n    \"source\": \"Federal State Statistics Service\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"347241\",\n    \"event\": \"RUIPYY\",\n    \"title\": \"Industrial Production YoY\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Russia, industrial production measures the output of businesses integrated in industrial sector of the economy. Manufacturing is the most important sector and accounts for 55 percent of total production. The biggest segments within manufacturing are: metallurgy (9.6 percent); coke and refined petroleum products (9.5 percent); food beverages and tobacco (8.4 percent); chemicals (4 percent); machinery and equipment (3.8 percent); transport (3.7 percent) and electrical equipment (3.4 percent). Mining and quarrying accounts for 35 percent, and natural gas and crude oil exploration represents 29 percent of total output. Also, electricity, gas and water supply accounts for 11 percent.\",\n    \"country\": \"RU\",\n    \"currency\": \"RUB\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"2.7\",\n    \"source\": \"Federal State Statistics Service\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 16:00:00\"\n  },\n  {\n    \"id\": \"339735\",\n    \"event\": \"312443\",\n    \"title\": \"17-Week Bill Auction\",\n    \"indicator\": \"Calendar\",\n    \"comment\": \"\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"5.215\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:30:00\"\n  },\n  {\n    \"id\": \"347613\",\n    \"event\": \"EGM2\",\n    \"title\": \"M2 Money Supply YoY\",\n    \"indicator\": \"Money Supply M2\",\n    \"comment\": \"Egypt Money Supply M2 includes M1 plus short-term time deposits in banks.\",\n    \"country\": \"EG\",\n    \"currency\": \"EGP\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"19.92\",\n    \"source\": \"Central Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 16:40:00\"\n  },\n  {\n    \"id\": \"364915\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Bostic Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 17:00:00\"\n  },\n  {\n    \"id\": \"347615\",\n    \"event\": \"KEIRYY\",\n    \"title\": \"Inflation Rate YoY\",\n    \"indicator\": \"Inflation Rate\",\n    \"comment\": \"In Kenya, the Consumer Price Index (CPI) is based on expenditures of both urban and rural households. The most important category in the CPI is Food and Non-Alcoholic Beverages (33 percent of total weight). Housing, Water, Electricity, Gas and other Fuels account for 15 percent; Transport for 10 percent; Restaurants and Accommodation Services for 8 percent; Communication for 8 percent; and Education for 6 percent. Alcoholic Beverages, Tobacco and Narcotics; Clothing and Footwear; Furnishings, Household Equipment and Maintenance; Health; Recreation, Sport and Culture; Insurance and Financial Services; and Personal Care, Social Protection and Miscellaneous Goods and Services account for the remaining 21 percent of total weight.\",\n    \"country\": \"KE\",\n    \"currency\": \"KES\",\n    \"importance\": \"0\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"6.9\",\n    \"source\": \"National Bureau of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 17:15:00\"\n  },\n  {\n    \"id\": \"364918\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Collins Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 17:15:00\"\n  },\n  {\n    \"id\": \"348360\",\n    \"event\": \"UYUR\",\n    \"title\": \"Unemployment Rate\",\n    \"indicator\": \"Unemployment Rate\",\n    \"comment\": \"In Uruguay, the unemployment rate measures the number of people actively looking for a job as a percentage of the labour force.\",\n    \"country\": \"UY\",\n    \"currency\": \"UYI\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"7.8\",\n    \"source\": \"National Institute of Statistics\",\n    \"scale\": \"\",\n    \"unit\": \"%\",\n    \"date\": \"2024-02-28 17:30:00\"\n  },\n  {\n    \"id\": \"364919\",\n    \"event\": \"USINTR\",\n    \"title\": \"Fed Williams Speech\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In the United States, the authority to set interest rates is divided between the Board of Governors of the Federal Reserve (Board) and the Federal Open Market Committee (FOMC). The Board decides on changes in discount rates after recommendations submitted by one or more of the regional Federal Reserve Banks. The FOMC decides on open market operations, including the desired levels of central bank money or the desired federal funds market rate.\",\n    \"country\": \"US\",\n    \"currency\": \"USD\",\n    \"importance\": \"1\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Federal Reserve\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 17:45:00\"\n  },\n  {\n    \"id\": \"347454\",\n    \"event\": \"JPIPMM\",\n    \"title\": \"Industrial Production MoM Prel\",\n    \"indicator\": \"Industrial Production Mom\",\n    \"comment\": \"In Japan, industrial production measures the output of businesses integrated in industrial sector of the economy such as manufacturing, mining, and utilities.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"-7.3\",\n    \"previous\": \"1.4\",\n    \"source\": \"Ministry of Economy Trade and Industry (METI)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 23:50:00\"\n  },\n  {\n    \"id\": \"347453\",\n    \"event\": \"JPIPYY\",\n    \"title\": \"Industrial Production YoY Prel\",\n    \"indicator\": \"Industrial Production\",\n    \"comment\": \"In Japan, industrial production measures the output of businesses integrated in industrial sector of the economy such as manufacturing, mining, and utilities.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-0.7\",\n    \"source\": \"Ministry of Economy Trade and Industry (METI)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 23:50:00\"\n  },\n  {\n    \"id\": \"347452\",\n    \"event\": \"JPRSYY\",\n    \"title\": \"Retail Sales YoY\",\n    \"indicator\": \"Retail Sales YoY\",\n    \"comment\": \"In Japan, the year-over-year change in Retail sales compares the aggregated sales of retail goods and services during a certain month to the same month a year ago.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"1\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"2.3\",\n    \"previous\": \"2.1\",\n    \"source\": \"Ministry of Economy Trade and Industry (METI)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 23:50:00\"\n  },\n  {\n    \"id\": \"347451\",\n    \"event\": \"JPRSMM\",\n    \"title\": \"Retail Sales MoM\",\n    \"indicator\": \"Retail Sales MoM\",\n    \"comment\": \"In Japan, the Retail sales report provides an aggregated measure of sales of retail goods and services over a specific time period. In Japan, Retail sales are seasonal, volatile and relatively important to the overall economy.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Jan\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-2.9\",\n    \"source\": \"Ministry of Economy Trade and Industry (METI)\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 23:50:00\"\n  },\n  {\n    \"id\": \"342466\",\n    \"event\": \"JPFBI\",\n    \"title\": \"Foreign Bond Investment\",\n    \"indicator\": \"Foreign Bond Investment\",\n    \"comment\": \"The net data shows the difference between acquisition and disposition of long-term debt securities: a plus sign indicates net purchases of foreign securities by Japanese investors; a minus sign indicates net selling and inflows of funds into Japan. It excludes Bank of Japan.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/24\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"-560.8\",\n    \"source\": \"Ministry of Finance\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 23:50:00\"\n  },\n  {\n    \"id\": \"342465\",\n    \"event\": \"JPFSI\",\n    \"title\": \"Stock Investment by Foreigners\",\n    \"indicator\": \"Foreign Stock Investment\",\n    \"comment\": \"Foreign Investments in Japanese Stocks refers to the net difference between inflow and outflow of investments in Japanese stock market by foreigners.\",\n    \"country\": \"JP\",\n    \"currency\": \"JPY\",\n    \"importance\": \"0\",\n    \"period\": \"Feb/24\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"382\",\n    \"source\": \"Ministry of Finance\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-28 23:50:00\"\n  },\n  {\n    \"id\": \"347455\",\n    \"event\": \"NZBCOI\",\n    \"title\": \"ANZ Business Confidence\",\n    \"indicator\": \"Business Confidence\",\n    \"comment\": \"In New Zealand, the business confidence index is designed to provide a snapshot of business opinions regarding the expected future state of their business and economy overall. The survey covers around 700 respondents. The Net index is calculated by subtracting the percentage number of businesses that expect that the economic situation improves from the number that expect decline.\",\n    \"country\": \"NZ\",\n    \"currency\": \"NZD\",\n    \"importance\": \"1\",\n    \"period\": \"Feb\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"36.6\",\n    \"source\": \"ANZ Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-29 00:00:00\"\n  },\n  {\n    \"id\": \"341792\",\n    \"event\": \"254298\",\n    \"title\": \"228 Peace Memorial Day\",\n    \"indicator\": \"Holidays\",\n    \"comment\": \"\",\n    \"country\": \"TW\",\n    \"currency\": \"TWD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-29 00:00:00\"\n  },\n  {\n    \"id\": \"364881\",\n    \"event\": \"AUINTR\",\n    \"title\": \"RBA Payments System Board Meeting\",\n    \"indicator\": \"Interest Rate\",\n    \"comment\": \"In Australia, interest rates decisions are taken by the Reserve Bank of Australia's Board. The official interest rate is the cash rate. The cash rate is the rate charged on overnight loans between financial intermediaries, is determined in the money market as a result of the interaction of demand for and supply of overnight funds.\",\n    \"country\": \"AU\",\n    \"currency\": \"AUD\",\n    \"importance\": \"0\",\n    \"period\": \"\",\n    \"actual\": \"\",\n    \"forecast\": \"\",\n    \"previous\": \"\",\n    \"source\": \"Reserve Bank\",\n    \"scale\": \"\",\n    \"unit\": \"\",\n    \"date\": \"2024-02-29 00:00:00\"\n  }\n]","import ar from './assets/dictionaries/ar.json';\nimport cn from './assets/dictionaries/cn.json';\nimport cs from './assets/dictionaries/cs.json';\nimport de from './assets/dictionaries/de.json';\nimport en from './assets/dictionaries/en.json';\nimport es from './assets/dictionaries/es.json';\nimport esmx from './assets/dictionaries/esmx.json';\nimport fr from './assets/dictionaries/fr.json';\nimport he from './assets/dictionaries/he.json';\nimport hi from './assets/dictionaries/hi.json';\nimport id from './assets/dictionaries/id.json';\nimport ir from './assets/dictionaries/ir.json';\nimport it from './assets/dictionaries/it.json';\nimport jp from './assets/dictionaries/jp.json';\nimport my from './assets/dictionaries/my.json';\nimport pl from './assets/dictionaries/pl.json';\nimport ptbr from './assets/dictionaries/ptbr.json';\nimport ru from './assets/dictionaries/ru.json';\nimport th from './assets/dictionaries/th.json';\nimport tr from './assets/dictionaries/tr.json';\nimport vn from './assets/dictionaries/vn.json';\nimport sv from './assets/dictionaries/sv.json';\nimport kr from './assets/dictionaries/kr.json';\nimport km from './assets/dictionaries/km.json';\nimport economic from './assets/data/economic.json';\n\nconst dictionaries: { [key: string]: any } = {\n    ar,\n    cn,\n    cs,\n    cz: cs,\n    de,\n    en,\n    es,\n    esmx,\n    fr,\n    he,\n    hi,\n    id,\n    ir,\n    it,\n    jp,\n    my,\n    pl,\n    ptbr,\n    ru,\n    th,\n    tr,\n    vn,\n    sv,\n    kr,\n    km,\n    economic\n};\n\nexport default dictionaries;\n","import { EcoCal } from \"../types/EcoCal\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchEconomicCalendar(lang: string, start: string, end: string): Promise<EcoCal.EconomicEventWithTranslation[] | null> {\n  const url = `${WIDGET_API_BASE}/api/widgets/economic-calendar`;\n\n  try {\n    const formattedLang = lang.replace(/-/g, \"_\").toUpperCase(); // Ensure lang is in the correct format\n    const response = await fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ lang: formattedLang, start, end }),\n    });\n    const jsonData = await response.json();\n\n    if (!response.ok || !jsonData?.data) {\n      console.error('API Error:', jsonData?.error || 'No data');\n      return null;\n    }\n\n    return jsonData.data as EcoCal.EconomicEventWithTranslation[];\n  } catch (error) {\n    console.error('Fetch error:', error);\n    return null;\n  }\n}\n","import React from \"react\";\nimport { LuLoaderCircle } from \"react-icons/lu\";\n\nconst keyframes = `\n@keyframes floatSquare {\n  0% { transform: translate(50px, 0px) rotate(0deg); }\n    25% { transform: translate(-70px, 15px) rotate(-20deg); }\n  50% { transform: translate(0px, -15px) rotate(20deg); }\n    75% { transform: translate(-30px, 10px) rotate(-20deg); }\n  100% { transform: translate(50px, 0px) rotate(0deg); }\n}\n\n@keyframes floatTriangle {\n  0% { transform: translate(-70px, 0px) rotate(0deg); }\n    25% { transform: translate(50px, -25px) rotate(75deg); }\n  50% { transform: translate(75px, 25px) rotate(-75deg); }\n  100% { transform: translate(-70px, 0px) rotate(0deg); }\n}\n\n@keyframes floatBlob {\n  0% { transform: translate(0px, 0px) scale(1); }\n    25% { transform: translate(10px, -5px) scale(1.2); }\n  50% { transform: translate(10px, 5px) scale(0.5); }\n    75% { transform: translate(-10px, -5px) scale(1.3); }\n  100% { transform: translate(0px, 0px) scale(1); }\n}\n`;\n\nconst shapeBase: React.CSSProperties = {\n  position: \"absolute\",\n  mixBlendMode: \"screen\",\n  opacity: 0.7,\n};\n\n// export const FancyLoader: React.FC = () => {\n//     return (\n//         <div style={{ width: 200, height: 200, position: \"relative\", overflow: \"hidden\", zIndex: 1000 }}>\n//             <style>{keyframes}</style>\n\n//             {/* Square */}\n//             <div\n//                 style={{\n//                     ...shapeBase,\n//                     width: 100,\n//                     height: 100,\n//                     borderRadius: 20,\n//                     background: \"linear-gradient(135deg, #f87171, #facc15)\",\n//                     animation: \"floatSquare 6s ease-in-out infinite\",\n//                     top: 20,\n//                     left: 20,\n//                 }}\n//             />\n\n//             {/* Triangle via clip-path */}\n//             <div\n//                 style={{\n//                     ...shapeBase,\n//                     width: 0,\n//                     height: 0,\n//                     borderLeft: \"60px solid transparent\",\n//                     borderRight: \"60px solid transparent\",\n//                     borderBottom: \"100px solid #34d399\",\n//                     animation: \"floatTriangle 7s ease-in-out infinite\",\n//                     top: 30,\n//                     left: 50,\n//                 }}\n//             />\n\n//             {/* Organic blob via SVG */}\n//             <svg\n//                 width={150}\n//                 height={150}\n//                 viewBox=\"0 0 200 200\"\n//                 style={{\n//                     ...shapeBase,\n//                     animation: \"floatBlob 5s ease-in-out infinite\",\n//                     top: 10,\n//                     left: 40,\n//                 }}\n//             >\n//                 <path\n//                     fill=\"#60a5fa\"\n//                     d=\"M42.3,-69.1C55.3,-61.6,66.1,-49.4,72.3,-35.6C78.6,-21.9,80.3,-6.6,75.6,6.8C70.9,20.1,59.7,31.6,48.1,41.4C36.5,51.2,24.5,59.2,9.4,66.4C-5.6,73.6,-23.8,80,-38.5,75.3C-53.2,70.6,-64.4,54.8,-67.2,39.2C-70,23.6,-64.3,8.3,-61.6,-7.3C-58.9,-22.8,-59.1,-38.7,-51.2,-49.5C-43.4,-60.3,-27.5,-66,-11.7,-69.5C4.1,-72.9,20.6,-74.9,42.3,-69.1Z\"\n//                     transform=\"translate(100 100)\"\n//                 />\n//             </svg>\n//         </div>\n//     );\n// };\n\nexport const FancyLoader: React.FC = () => {\n  return <LuLoaderCircle size={24} stroke=\"#60a5fa\" className=\"animate-spin\" />;\n}","import { EcoCal } from \"../../../../types/EcoCal\";\n\nexport function groupEventsByDate(\n    events: EcoCal.EconomicEventWithTranslation[],\n    selectedTimeZone: string\n): EcoCal.EventsByDate {\n    const now = new Date();\n    const grouped: EcoCal.EventsByDate = {};\n\n    const sortedEvents = [...events].sort(\n        (a, b) =>\n            new Date(a.event_datetime).getTime() - new Date(b.event_datetime).getTime()\n    );\n\n    let lastPastIndex = -1;\n    for (let i = 0; i < sortedEvents.length; i++) {\n        const eventTime = new Date(sortedEvents[i].event_datetime);\n        if (eventTime < now) {\n            lastPastIndex = i;\n        } else {\n            break;\n        }\n    }\n\n    const processed = sortedEvents.map((event, idx) => ({\n        ...event,\n        isLastPastEvent: idx === lastPastIndex,\n        isClosestEvent: idx === lastPastIndex + 1,\n    }));\n\n    for (const event of processed) {\n        const utcDate = new Date(event.event_datetime);\n\n        // Shift date to local time zone\n        const localDateStr = convertUtcToLocalYMD(utcDate, selectedTimeZone);\n\n        if (!grouped[localDateStr]) {\n            grouped[localDateStr] = [];\n        }\n        grouped[localDateStr].push(event);\n    }\n\n    return grouped;\n}\n\nfunction convertUtcToLocalYMD(utcDate: Date, timeZone: string): string {\n    const parts = new Intl.DateTimeFormat(\"en-CA\", {\n        timeZone,\n        year: \"numeric\",\n        month: \"2-digit\",\n        day: \"2-digit\",\n    }).formatToParts(utcDate);\n\n    const y = parts.find(p => p.type === \"year\")?.value!;\n    const m = parts.find(p => p.type === \"month\")?.value!;\n    const d = parts.find(p => p.type === \"day\")?.value!;\n\n    return `${y}-${m}-${d}`; // e.g., 2025-07-30\n}","import { EcoCal } from \"../types/EcoCal\";\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nexport function addDaysToDateString(dateStr: string, days: number): string {\n    const [year, month, day] = dateStr.split(\"-\").map(Number);\n    const date = new Date(Date.UTC(year, month - 1, day + days));\n\n    return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nexport function formatDateInTimeZone(date: Date, timeZone: string): string {\n    const parts = new Intl.DateTimeFormat(\"en-CA\", {\n        timeZone,\n        year: \"numeric\",\n        month: \"2-digit\",\n        day: \"2-digit\",\n    }).formatToParts(date);\n\n    const year = parts.find((p) => p.type === \"year\")?.value;\n    const month = parts.find((p) => p.type === \"month\")?.value;\n    const day = parts.find((p) => p.type === \"day\")?.value;\n\n    return `${year}-${month}-${day}`;\n}\n\nexport function getCurrentUTCDateString(): string {\n    return formatDateInTimeZone(new Date(), \"UTC\");\n}\n\nexport function getTodayDateRange(timeZone = \"UTC\"): EcoCal.StringDateRange {\n    const today = formatDateInTimeZone(new Date(), timeZone);\n    return { start: today, end: today };\n}\n\n\n/**\n * Converts a date range from a specific time zone to UTC.\n * @param range The date range with start and end dates in \"YYYY-MM-DD\" format.\n * @param timeZone The IANA time zone name, e.g., \"America/New_York\".\n * @returns The converted date range with start and end dates in UTC.\n */\nexport function convertDateRangeToUTC(\n    range: { start: string; end: string },\n    timeZone: string\n): { start: string; end: string } {\n    const getOffsetMs = (date: Date, timeZone: string) => {\n        const parts = new Intl.DateTimeFormat(\"en-US\", {\n            timeZone,\n            year: \"numeric\",\n            month: \"2-digit\",\n            day: \"2-digit\",\n            hour: \"2-digit\",\n            minute: \"2-digit\",\n            second: \"2-digit\",\n            hourCycle: \"h23\",\n        }).formatToParts(date);\n\n        const value = (type: Intl.DateTimeFormatPartTypes) =>\n            Number(parts.find((part) => part.type === type)?.value);\n        const hour = value(\"hour\");\n        const zoneAsUTC = Date.UTC(\n            value(\"year\"),\n            value(\"month\") - 1,\n            value(\"day\"),\n            hour === 24 ? 0 : hour,\n            value(\"minute\"),\n            value(\"second\")\n        );\n\n        return zoneAsUTC - date.getTime();\n    };\n\n    const shift = (dateStr: string, hour: number, minute: number, timeZone: string) => {\n        const [y, m, d] = dateStr.split(\"-\").map(Number);\n        const localAsUTC = Date.UTC(y, m - 1, d, hour, minute);\n        const firstGuess = new Date(localAsUTC);\n        let utcDate = new Date(localAsUTC - getOffsetMs(firstGuess, timeZone));\n        const correctedOffset = getOffsetMs(utcDate, timeZone);\n        utcDate = new Date(localAsUTC - correctedOffset);\n\n        return `${utcDate.getUTCFullYear()}-${pad(utcDate.getUTCMonth() + 1)}-${pad(utcDate.getUTCDate())} ${pad(utcDate.getUTCHours())}:${pad(utcDate.getUTCMinutes())}:00`;\n    };\n\n    // Shift `end` to **start of the day AFTER** the selected end\n    const [ey, em, ed] = range.end.split(\"-\").map(Number);\n    const nextDay = new Date(Date.UTC(ey, em - 1, ed + 1));\n\n    const nextDayStr = `${nextDay.getUTCFullYear()}-${pad(nextDay.getUTCMonth() + 1)}-${pad(nextDay.getUTCDate())}`;\n\n    return {\n        start: shift(range.start, 0, 0, timeZone),         // inclusive\n        end: shift(nextDayStr, 0, 0, timeZone),            // exclusive\n    };\n}\n\nexport const fallbackTimeZones = [\n    \"Etc/GMT+12\",                       // UTC−12:00\n    \"Pacific/Pago_Pago\",                // UTC−11:00\n    \"Pacific/Honolulu\",                 // UTC−10:00\n    \"America/Anchorage\",                // UTC−09:00\n    \"America/Los_Angeles\",              // UTC−08:00\n    \"America/Denver\",                   // UTC−07:00\n    \"America/Chicago\",                  // UTC−06:00\n    \"America/New_York\",                 // UTC−05:00\n    \"America/Santiago\",                 // UTC−04:00\n    \"America/Argentina/Buenos_Aires\",   // UTC−03:00\n    \"America/Noronha\",                  // UTC−02:00\n    \"Atlantic/Azores\",                  // UTC−01:00\n    \"UTC\",                              // UTC±00:00\n    \"Europe/Berlin\",                    // UTC+01:00\n    \"Europe/Athens\",                    // UTC+02:00\n    \"Asia/Riyadh\",                      // UTC+03:00\n    \"Asia/Tehran\",                      // UTC+03:30\n    \"Asia/Dubai\",                       // UTC+04:00\n    \"Asia/Kabul\",                       // UTC+04:30\n    \"Asia/Karachi\",                     // UTC+05:00\n    \"Asia/Kolkata\",                     // UTC+05:30\n    \"Asia/Kathmandu\",                   // UTC+05:45\n    \"Asia/Dhaka\",                       // UTC+06:00\n    \"Asia/Yangon\",                      // UTC+06:30\n    \"Asia/Bangkok\",                     // UTC+07:00\n    \"Asia/Shanghai\",                    // UTC+08:00\n    \"Australia/Eucla\",                  // UTC+08:45\n    \"Asia/Tokyo\",                       // UTC+09:00\n    \"Australia/Darwin\",                 // UTC+09:30\n    \"Australia/Sydney\",                 // UTC+10:00\n    \"Australia/Lord_Howe\",              // UTC+10:30\n    \"Pacific/Noumea\",                   // UTC+11:00\n    \"Pacific/Auckland\",                 // UTC+12:00\n    \"Pacific/Chatham\",                  // UTC+12:45\n    \"Pacific/Tongatapu\",                // UTC+13:00\n    \"Pacific/Kiritimati\",               // UTC+14:00\n];\n\n/**\n * Formats a time zone label for display.\n * @param zone - The time zone identifier (e.g., \"America/New_York\").\n * @param date - The date to use for formatting.\n * @return A string representing the time zone label, including the pretty name and offset. For example, \"America/New_York (UTC-05:00)\".\n */\nexport function formatZoneLabel(zone: string, date: Date): string {\n    const parts = new Intl.DateTimeFormat(\"en-US\", {\n        timeZone: zone,\n        hour: \"2-digit\",\n        minute: \"2-digit\",\n        hour12: false,\n        timeZoneName: \"shortOffset\",\n    }).formatToParts(date);\n\n    const offsetPart = parts.find(p => p.type === \"timeZoneName\");\n    const offset = offsetPart?.value.replace(\"UTC\", \"UTC\") || \"\";\n    const prettyName = zone.split(\"/\").pop()?.replace(/_/g, \" \") || zone;\n\n    return `${prettyName} (${offset})`;\n}\n\n/**\n * Formats a time in a specific time zone.\n * @param zone - The time zone identifier (e.g., \"America/New_York\").\n * @param date - The date to format.\n * @return A string representing the time in the specified time zone, or \"Invalid\" if the zone is not recognized. For example, \"14:30\" for 2:30 PM.\n */\nexport function formatTimeInZone(zone: string, date: Date): string {\n    try {\n        return new Intl.DateTimeFormat(\"en-US\", {\n            timeZone: zone,\n            hour: \"2-digit\",\n            minute: \"2-digit\",\n            hour12: false,\n        }).format(date);\n    } catch {\n        return \"Invalid\";\n    }\n}\n\n/**\n * Given a UTC date string and a desired format, returns the date formatted according to that format.\n * Supported format tokens are \"d\", \"dd\", \"m\", \"mm\", \"yy\", and \"yyyy\".\n * Examples:\n * - buildDateStringFromFormat(\"2024-06-15T00:00:00Z\", \"mm/dd/yyyy\") => \"06/15/2024\"\n * - buildDateStringFromFormat(\"2024-06-15T00:00:00Z\", \"d-m-yyyy\") => \"15-6-2024\"\n * - buildDateStringFromFormat(\"2024-06-15T00:00:00Z\", \"yy/mm/d\") => \"24/06/15\"\n * @param UTCStr \n * @param format \n * @returns \n */\nexport const buildDateStringFromFormat = (UTCStr: string, format: string): string => {\n    let structure: {\n        part1: { type: 'd' | 'm' | 'y'; length: number };\n        del1: string | null;\n        part2: { type: 'd' | 'm' | 'y'; length: number } | null;\n        del2: string | null;\n        part3: { type: 'd' | 'm' | 'y'; length: number } | null;\n    } | null = null;\n\n    // Walk through the format string to determine the structure\n    let i = 0;\n    const parts: any[] = [];\n    while (i < format.length) {\n        const char = format[i].toLowerCase();\n        if (char === 'd' || char === 'm' || char === 'y') {\n            let length = 1;\n            while (i + length < format.length && format[i + length] === char) {\n                length++;\n            }\n            parts.push({ type: char, length });\n            i += length;\n        } else {\n            i++;\n        }\n    }\n\n    if (parts.length === 0) {\n        throw new Error(\"Invalid date format\");\n    }\n\n    // If we have 3 parts, we expect them to be in order: day, month, year\n    if (parts.length === 3) {\n        structure = {\n            part1: parts[0],\n            del1: format[parts[0].length],\n            part2: parts[1],\n            del2: format[parts[0].length + 1 + parts[1].length],\n            part3: parts[2],\n        };\n    } else if (parts.length === 2) {\n        structure = {\n            part1: parts[0],\n            del1: format[parts[0].length],\n            part2: parts[1],\n            del2: null,\n            part3: null,\n        };\n    } else if (parts.length === 1) {\n        structure = {\n            part1: parts[0],\n            del1: null,\n            part2: null,\n            del2: null,\n            part3: null,\n        };\n    } else {\n        throw new Error(\"Unsupported date format\");\n    }\n\n    const date = new Date(UTCStr);\n    const day = date.getUTCDate();\n    const month = date.getUTCMonth() + 1;\n    const year = date.getUTCFullYear();\n\n    const buildPart = (part: { type: 'd' | 'm' | 'y'; length: number }) => {\n        let str = '';\n        if (part.type === 'd') {\n            str = part.length === 2 ? String(day).padStart(2, '0') : String(day);\n        } else if (part.type === 'm') {\n            str = part.length === 2 ? String(month).padStart(2, '0') : String(month);\n        } else if (part.type === 'y') {\n            str = part.length === 4 ? String(year) : String(year).slice(-2);\n        }\n        return str;\n    }\n\n    const part1Str = buildPart(structure.part1);\n    const part2Str = structure.part2 ? buildPart(structure.part2) : '';\n    const part3Str = structure.part3 ? buildPart(structure.part3) : '';\n\n    return `${part1Str}${structure.del1 || ''}${part2Str}${structure.del2 || ''}${part3Str}`;\n};\n","import { Dictionary } from \"../../../../types/Dictionary\";\nimport { EcoCal } from \"../../../../types/EcoCal\";\nimport {\n    addDaysToDateString,\n    formatDateInTimeZone,\n} from \"../../../../utils/datesAndTimes\";\n\nexport const getDateFilterData = (\n    key: EcoCal.DateFilterKey,\n    t: Dictionary[\"economicCalendar\"],\n    timeZone = \"UTC\"\n): { label: string; value: EcoCal.StringDateRange } => {\n    const today = formatDateInTimeZone(new Date(), timeZone);\n    const yesterday = addDaysToDateString(today, -1);\n    const tomorrow = addDaysToDateString(today, 1);\n\n    switch (key) {\n        case \"yesterday\":\n            return {\n                label: t.yesterday,\n                value: { start: yesterday, end: yesterday },\n            };\n        case \"today\":\n            return {\n                label: t.today,\n                value: { start: today, end: today },\n            };\n        case \"tomorrow\":\n            return {\n                label: t.tomorrow,\n                value: { start: tomorrow, end: tomorrow },\n            };\n        case \"week\":\n            return {\n                label: t.thisWeek,\n                value: {\n                    start: addDaysToDateString(today, -6),\n                    end: today,\n                },\n            };\n        default:\n            return {\n                label: t.today,\n                value: { start: today, end: today },\n            };\n    }\n};\n","import { Dispatch, FC } from \"react\";\nimport Branded from \"../../../Branded\";\nimport { Dictionary } from \"../../../../types/Dictionary\";\nimport { EcoCal } from \"../../../../types/EcoCal\";\nimport {\n  fallbackTimeZones,\n  formatTimeInZone,\n  formatZoneLabel,\n} from \"../../../../utils/datesAndTimes\";\nimport { getDateFilterData } from \"../functions/getDateFilterData\";\n\nconst countryOptions = [\n  { name: \"AR\", code: \"ar\" },\n  { name: \"AU\", code: \"au\" },\n  { name: \"BR\", code: \"br\" },\n  { name: \"CA\", code: \"ca\" },\n  { name: \"CN\", code: \"cn\" },\n  { name: \"EU\", code: \"eu\" },\n  { name: \"FR\", code: \"fr\" },\n  { name: \"DE\", code: \"de\" },\n  { name: \"IN\", code: \"in\" },\n  { name: \"ID\", code: \"id\" },\n  { name: \"IT\", code: \"it\" },\n  { name: \"JP\", code: \"jp\" },\n  { name: \"MX\", code: \"mx\" },\n  { name: \"RU\", code: \"ru\" },\n  { name: \"SA\", code: \"sa\" },\n  { name: \"ZA\", code: \"za\" },\n  { name: \"KR\", code: \"kr\" },\n  { name: \"ES\", code: \"es\" },\n  { name: \"TR\", code: \"tr\" },\n  { name: \"GB\", code: \"gb\" },\n  { name: \"US\", code: \"us\" },\n];\n\nconst allTimeZones = Intl.supportedValuesOf?.(\"timeZone\") || fallbackTimeZones;\n\ninterface EconomicCalendarFiltersProps {\n  t: Dictionary[\"economicCalendar\"];\n  isSmall: boolean;\n  now: Date;\n  impact: \"High\" | \"Low\" | \"Medium\" | \"Impact\";\n  setImpact: (impact: \"High\" | \"Low\" | \"Medium\" | \"Impact\") => void;\n  selectedCountries: string[];\n  setSelectedCountries: Dispatch<React.SetStateAction<string[]>>;\n  selectedDateRange: EcoCal.StringDateRange;\n  setSelectedDateRange: (range: EcoCal.StringDateRange) => void;\n  selectedTimeZone: string;\n  setSelectedTimeZone: (zone: string) => void;\n  selectedLang: string;\n  setSelectedLang: (lang: string) => void;\n}\n\nexport const EconomicCalendarFilters: FC<EconomicCalendarFiltersProps> = ({\n  t,\n  isSmall,\n  now,\n  impact,\n  setImpact,\n  selectedCountries,\n  setSelectedCountries,\n  selectedDateRange,\n  setSelectedDateRange,\n  selectedTimeZone,\n  setSelectedTimeZone,\n  selectedLang,\n  setSelectedLang,\n}) => {\n  const impactOptions = [\n    { value: \"Impact\", content: t.impact },\n    { value: \"High\", content: t.high },\n    { value: \"Medium\", content: t.medium },\n    { value: \"Low\", content: t.low },\n  ];\n\n  const timeZoneOptions = allTimeZones.map((zone) => ({\n    value: zone,\n    label: formatZoneLabel(zone, now), // searchable string\n    content: (\n      <div\n        style={{\n          display: \"flex\",\n          justifyContent: \"space-between\",\n          width: \"100%\",\n        }}\n      >\n        <span>{formatZoneLabel(zone, now)}</span>\n        <span style={{ opacity: 0.6 }}>{formatTimeInZone(zone, now)}</span>\n      </div>\n    ),\n  }));\n\n  const handleQuickDateFilter = (filter: EcoCal.DateFilterKey) => {\n    setSelectedDateRange(getDateFilterData(filter, t, selectedTimeZone).value);\n  };\n\n  const selectedFilterLabel = (): string => {\n    if (!selectedDateRange.start || !selectedDateRange.end) {\n      return \"\";\n    }\n\n    const selectedFilter = (\n      [\"yesterday\", \"today\", \"tomorrow\", \"week\"] as EcoCal.DateFilterKey[]\n    ).find(\n      (key) =>\n        getDateFilterData(key, t, selectedTimeZone).value.start ===\n          selectedDateRange.start &&\n        getDateFilterData(key, t, selectedTimeZone).value.end ===\n          selectedDateRange.end\n    );\n\n    return selectedFilter\n      ? getDateFilterData(selectedFilter, t, selectedTimeZone).label\n      : t.customRange;\n  };\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        display: \"flex\",\n        flexWrap: \"wrap\",\n        gap: \"1rem\",\n      }}\n    >\n      {/* Impact Dropdown */}\n      <div style={{ display: \"flex\", flexGrow: 1 }}>\n        <Branded.Dropdown\n          label={\n            impactOptions.find((opt) => opt.value === impact)?.content ||\n            \"Impact\"\n          }\n          items={impactOptions}\n          onSelect={(value) => {\n            setImpact(value as typeof impact);\n          }}\n          selected={impact}\n        />\n      </div>\n\n      {/* Country Dropdown */}\n      <div style={{ display: \"flex\", flexGrow: 1 }}>\n        <Branded.Dropdown\n          label={t.countries}\n          items={countryOptions.map(({ name, code }) => ({\n            content: (\n              <div\n                style={{\n                  display: \"flex\",\n                  alignItems: \"center\",\n                  gap: \"0.5rem\",\n                }}\n              >\n                <img\n                  src={`https://flagcdn.com/w40/${code}.png`}\n                  alt={`${name} flag`}\n                  style={{\n                    width: \"24px\",\n                    height: \"16px\",\n                    borderRadius: \"4px\",\n                    objectFit: \"cover\",\n                  }}\n                />\n                <span>{name}</span>\n              </div>\n            ),\n            value: code,\n          }))}\n          onSelect={(value) => {\n            const code = value as string;\n            setSelectedCountries((prev) =>\n              prev.includes(code)\n                ? prev.filter((c) => c !== code)\n                : [...prev, code]\n            );\n          }}\n          selected={selectedCountries}\n          multiple\n        />\n      </div>\n\n      {/* Quick Date Filters */}\n      {isSmall ? (\n        <Branded.Dropdown\n          label={selectedFilterLabel() || \"Quick Date Filter\"}\n          items={(\n            [\"yesterday\", \"today\", \"tomorrow\", \"week\"] as EcoCal.DateFilterKey[]\n          ).map((key) => ({\n            content: getDateFilterData(key, t, selectedTimeZone).label,\n            value: key,\n          }))}\n          onSelect={(value) =>\n            handleQuickDateFilter(value as EcoCal.DateFilterKey)\n          }\n          selected={selectedFilterLabel()}\n        />\n      ) : (\n        <Branded.ButtonGroup\n          items={(\n            [\"yesterday\", \"today\", \"tomorrow\", \"week\"] as EcoCal.DateFilterKey[]\n          ).map((key) => ({\n            label: getDateFilterData(key, t, selectedTimeZone).label,\n            onClick: () => handleQuickDateFilter(key as EcoCal.DateFilterKey),\n          }))}\n          selected={\n            selectedDateRange.start && selectedDateRange.end\n              ? selectedFilterLabel()\n              : \"\"\n          }\n        />\n      )}\n\n      {/* Date Range */}\n      <Branded.DateRangePicker\n        value={selectedDateRange}\n        onChange={(range) => setSelectedDateRange(range)}\n      />\n\n      {/* Time Zone Dropdown */}\n      <div style={{ width: \"200px\" }}>\n        <Branded.Dropdown\n          label={formatZoneLabel(selectedTimeZone, now)}\n          items={timeZoneOptions}\n          onSelect={(value) => setSelectedTimeZone(value as string)}\n          selected={selectedTimeZone}\n          searchable\n        />\n      </div>\n\n      {/* Language Selector */}\n      <div style={{ width: \"200px\" }}>\n        <Branded.LangDropdown\n          selected={selectedLang}\n          onSelect={(lang) => setSelectedLang(lang)}\n        />\n      </div>\n    </div>\n  );\n};\n","import React, { useLayoutEffect, useRef } from \"react\";\nimport { useBrandedColors } from \"..\";\nimport { adjustColorContrast } from \"../../../utils/colors\";\n\ntype Column<T> = {\n    key?: keyof T;\n    header: string;\n    width?: number | string;\n    cell?: (row: T) => React.ReactNode;\n};\n\n// complex rows/items model (now with optional `key` for rock-solid row identity)\ntype CellsRow<T> = { kind: \"cells\"; data: T; key?: string | number };\ntype SpannedRow = { kind: \"spanned\"; content: React.ReactNode; colSpan?: number | \"all\"; key?: string | number };\nexport type DividerRow = { kind: \"divider\"; thickness?: number; bg?: string; marginY?: number; key?: string | number };\ntype ComplexRow<T> = CellsRow<T> | SpannedRow | DividerRow;\n\ntype Item<T> = {\n    key?: string | number;\n    rows: ComplexRow<T>[];\n    className?: string;\n    style?: React.CSSProperties;\n};\n\ntype Group<T> = { title: string; items: Item<T>[] };\n\n// legacy shape support\ntype LegacyGroup<T> = { title: string; rows: T[] };\n\ntype Props<T extends object> = {\n    columns: Column<T>[];\n    groups: Array<Group<T> | LegacyGroup<T>>;\n    hideHeader?: boolean;\n};\n\nexport function ComplexTable<T extends object>({ columns, groups, hideHeader }: Props<T>) {\n    const { style } = useBrandedColors();\n\n    const containerRef = useRef<HTMLDivElement>(null);\n    const theadRef = useRef<HTMLTableSectionElement>(null);\n\n    // sticky offset: keep --thead-h accurate when header is hidden/shown\n    useLayoutEffect(() => {\n        const el = containerRef.current;\n        const thead = theadRef.current;\n        if (!el) return;\n\n        if (hideHeader || !thead) {\n            el.style.setProperty(\"--thead-h\", \"0px\");\n            return;\n        }\n\n        const setVar = () => el.style.setProperty(\"--thead-h\", `${thead.getBoundingClientRect().height}px`);\n        setVar();\n        const ro = new ResizeObserver(setVar);\n        ro.observe(thead);\n        return () => ro.disconnect();\n    }, [hideHeader]);\n\n    const tableHeadCellStyle: React.CSSProperties = {\n        background: style.table_head_background || style.base_text_color,\n        color: style.table_head_text_color || style.base_background,\n        padding: \"0.5rem 1rem\",\n        fontWeight: style.font_weight_heading,\n        fontSize: style.table_head_font_size || style.main_font_size,\n    };\n\n    // theming from context only\n    const baseBg = style.table_body_background || style.base_background;\n    const stripeBg = style.table_striped ? adjustColorContrast(baseBg, 10) : baseBg;\n\n    const rowSep = style.table_row_separator as string | undefined;\n    const colSep = style.table_column_separator as string | undefined;\n\n    // legacy normalize\n    const normalizedGroups: Group<T>[] = groups.map((g) => {\n        if ((g as any).items) return g as Group<T>;\n        const legacy = g as LegacyGroup<T>;\n        return {\n            title: legacy.title,\n            items: legacy.rows.map((r, i) => ({ rows: [{ kind: \"cells\", data: r }], key: i })),\n        };\n    });\n\n    return (\n        <div\n            ref={containerRef}\n            className=\"table-scroll\"\n            style={{\n                height: \"100%\",\n                maxHeight: \"100vh\",\n                width: \"100%\",\n                overflow: \"auto\",\n                border: style.table_border || style.main_border,\n                boxShadow: style.table_shadow || style.main_shadow,\n                borderRadius: style.table_rounded || style.main_rounded,\n            }}\n        >\n            <table\n                style={{\n                    borderCollapse: \"separate\",\n                    borderSpacing: \"0\",\n                    width: \"100%\",\n                }}\n            >\n                {!hideHeader && (\n                    <thead ref={theadRef}>\n                        <tr>\n                            {columns.map((col, ci) => (\n                                <th\n                                    key={String(col.key ?? col.header)}\n                                    scope=\"col\"\n                                    style={{\n                                        width: col.width || \"auto\",\n                                        position: \"sticky\",\n                                        top: 0,\n                                        zIndex: 3,\n                                        padding: \"0.5rem 1rem\",\n                                        background: tableHeadCellStyle.background,\n                                        color: tableHeadCellStyle.color,\n                                        ...(colSep && ci > 0 ? { borderLeft: colSep } : null),\n                                    }}\n                                >\n                                    {col.header}\n                                </th>\n                            ))}\n                        </tr>\n                    </thead>\n                )}\n\n                <tbody>\n                    {normalizedGroups.map((g, gi) => {\n                        const groupHeader = (\n                            <tr className=\"group-header\" key={`g-${gi}`}>\n                                <th\n                                    scope=\"colgroup\"\n                                    colSpan={columns.length}\n                                    style={{\n                                        position: \"sticky\",\n                                        top: \"var(--thead-h, 0px)\",\n                                        zIndex: 2,\n                                        background: tableHeadCellStyle.background,\n                                        color: tableHeadCellStyle.color,\n                                        fontWeight: 600,\n                                        borderTop: rowSep || undefined,\n                                    }}\n                                >\n                                    <span style={{\n                                        display: \"block\",\n                                        textAlign: \"start\",\n                                        width: \"100%\",\n                                        padding: \"0.25rem 1rem\",\n                                    }}>\n                                        {g.title}\n                                    </span>\n                                </th>\n                            </tr>\n                        );\n\n                        const itemRows: React.ReactNode[] = [];\n                        let dataRowIndexInGroup = 0; // counts only data/spanned rows for zebra + default row separators\n\n                        g.items.forEach((item, ii) => {\n                            item.rows.forEach((r, ri) => {\n                                if (r.kind === \"divider\") {\n                                    itemRows.push(\n                                        <tr key={String(r.key ?? `g${gi}-i${ii}-div-${ri}`)} aria-hidden=\"true\">\n                                            <td colSpan={columns.length} style={{ padding: 0 }}>\n                                                <div\n                                                    style={{\n                                                        height: r.thickness ?? 2,\n                                                        margin: `${r.marginY ?? 0}px 0`,\n                                                        width: \"100%\",\n                                                        background: r.bg, // builder supplies color\n                                                    }}\n                                                />\n                                            </td>\n                                        </tr>\n                                    );\n                                    // divider is not a data row → do not increment\n                                    return;\n                                }\n\n                                const isStriped = !!style.table_striped && dataRowIndexInGroup % 2 === 1;\n                                const bg = isStriped ? stripeBg : baseBg;\n                                const rowTopBorder = dataRowIndexInGroup > 0 ? rowSep : undefined;\n\n                                if (r.kind === \"spanned\") {\n                                    itemRows.push(\n                                        <tr\n                                            key={String(r.key ?? `g${gi}-i${ii}-r${ri}`)}\n                                            className={item.className}\n                                            style={item.style}\n                                        >\n                                            <td\n                                                colSpan={r.colSpan === \"all\" || !r.colSpan ? columns.length : r.colSpan}\n                                                style={{\n                                                    padding: \"0.5rem 1rem\",\n                                                    background: bg,\n                                                    color: style.table_body_text_color || style.base_text_color,\n                                                    borderTop: rowTopBorder,\n                                                }}\n                                            >\n                                                {r.content}\n                                            </td>\n                                        </tr>\n                                    );\n                                } else {\n                                    itemRows.push(\n                                        <tr\n                                            key={String(r.key ?? `g${gi}-i${ii}-r${ri}`)}\n                                            className={item.className}\n                                            style={item.style}\n                                        >\n                                            {columns.map((col, ci) => {\n                                                const raw = col.key != null ? (r.data as any)[col.key] : undefined;\n                                                const content = col.cell ? col.cell(r.data) : raw;\n                                                return (\n                                                    <td\n                                                        key={String(col.key ?? col.header)}\n                                                        style={{\n                                                            padding: \"0.5rem 1rem\",\n                                                            background: bg,\n                                                            color: style.table_body_text_color || style.base_text_color,\n                                                            borderTop: rowTopBorder,\n                                                            ...(colSep && ci > 0 ? { borderLeft: colSep } : null),\n                                                        }}\n                                                    >\n                                                        {content}\n                                                    </td>\n                                                );\n                                            })}\n                                        </tr>\n                                    );\n                                }\n\n                                dataRowIndexInGroup++; // increment only for data/spanned rows\n                            });\n                        });\n\n                        return (\n                            <React.Fragment key={gi}>\n                                {groupHeader}\n                                {itemRows}\n                            </React.Fragment>\n                        );\n                    })}\n                </tbody>\n            </table>\n        </div>\n    );\n}\n","// buildEconomicCalendarTableV2.tsx\nimport * as Popover from \"@radix-ui/react-popover\";\nimport { HiInformationCircle } from \"react-icons/hi2\";\nimport { formatNumberToShort } from \"../../../utils/numbers\";\nimport { formatZoneLabel } from \"../../../utils/datesAndTimes\";\nimport { EcoCal } from \"../../../types/EcoCal\";\nimport { Dictionary } from \"../../../types/Dictionary\";\nimport React from \"react\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { TimeAndFlagCell } from \"./parts/TimeAndFlagCell\";\nimport { ImpactBadge } from \"./parts/ImpactBadge\";\nimport { DividerRow } from \"../../Branded/elements/ComplexTable\";\nimport { createUnit } from \"../../../utils/createUnit\";\n\n// ---- match the new table types ----\nexport type CellsRow<T> = { kind: \"cells\"; data: T };\nexport type SpannedRow = {\n  kind: \"spanned\";\n  content: React.ReactNode;\n  colSpan?: number | \"all\";\n};\nexport type ComplexRow<T> = CellsRow<T> | SpannedRow | DividerRow;\n\nexport type Item<T> = {\n  key?: string | number;\n  rows: ComplexRow<T>[];\n  className?: string;\n  style?: React.CSSProperties;\n  // flags kept for future use if you want, table ignores them\n  separatorAbove?: boolean;\n  separatorBelow?: boolean;\n};\n\ntype Built = {\n  columns: { key: string; header: string }[];\n  groups: { title: string; items: Item<any>[] }[];\n};\n\nexport function buildEconomicCalendarTable(params: {\n  groupedData: EcoCal.EventsByDate;\n  styles: WidgetStyle;\n  selectedTimeZone: string;\n  now: Date;\n  t: Dictionary[\"economicCalendar\"];\n  isSmall: boolean;\n  decorateItem?: (\n    event: EcoCal.ProcessedEvent,\n    indexInGroup: number,\n    groupTitle: string\n  ) => Partial<Item<any>> | void;\n}): Built {\n  const {\n    groupedData,\n    styles,\n    selectedTimeZone,\n    now,\n    t,\n    isSmall,\n    decorateItem,\n  } = params;\n\n  const fullCols = [\n    { key: \"event_datetime\", header: formatZoneLabel(selectedTimeZone, now) },\n    { key: \"translated_name\", header: t.event },\n    { key: \"impact_description\", header: t.impact },\n    { key: \"actual\", header: t.actual },\n    { key: \"consensus\", header: t.forecast },\n    { key: \"previous\", header: t.previous },\n  ];\n\n  const smallCols = [\n    { key: \"event_datetime\", header: formatZoneLabel(selectedTimeZone, now) },\n    { key: \"translated_name\", header: t.event },\n    { key: \"impact_description\", header: t.impact },\n  ];\n\n  const columns = isSmall ? smallCols : fullCols;\n\n  const groups = Object.entries(groupedData).map(([date, events]) => {\n    const items: Item<any>[] = [];\n\n    for (let idx = 0; idx < events.length; idx++) {\n      const event = events[idx];\n\n      const datetimeCell = (\n        <TimeAndFlagCell\n          event={event}\n          styles={styles}\n          selectedTimeZone={selectedTimeZone}\n        />\n      );\n\n      const nameCell = (\n        <Popover.Root>\n          <Popover.Trigger>\n            <div\n              style={{\n                display: \"flex\",\n                alignItems: \"center\",\n                gap: \"0.5rem\",\n                fontWeight: event.isClosestEvent ? \"bold\" : \"normal\",\n                cursor: \"pointer\",\n                overflowWrap: \"break-word\",\n                whiteSpace: \"normal\",\n              }}\n            >\n              <HiInformationCircle\n                size={20}\n                style={{\n                  cursor: \"pointer\",\n                  color: styles.table_body_text_color || \"black\",\n                  minWidth: \"24px\",\n                }}\n              />\n              <span\n                style={{\n                  textAlign: \"start\",\n                  overflowWrap: \"break-word\",\n                  whiteSpace: \"normal\",\n                }}\n              >\n                {event.translated_name}\n              </span>\n            </div>\n          </Popover.Trigger>\n          <Popover.Portal>\n            <Popover.Content\n              style={{\n                zIndex: 99999,\n                padding: \"0.5rem\",\n                borderRadius: styles.base_rounded,\n                boxShadow: styles.base_shadow,\n                width: \"300px\",\n                maxWidth: \"90vw\",\n                background: styles.base_background,\n                color: styles.base_text_color,\n                overflowWrap: \"break-word\",\n                whiteSpace: \"normal\",\n              }}\n            >\n              {event.definition || \"No definition available.\"}\n            </Popover.Content>\n          </Popover.Portal>\n        </Popover.Root>\n      );\n\n      const impactCell = (\n        <ImpactBadge impact={event.impact_description} styles={styles} t={t} />\n      );\n\n      const unit = createUnit(event.unit);\n      const actual = event.actual\n        ? formatNumberToShort(event.actual) + unit\n        : \"-\";\n      const forecast = event.consensus\n        ? formatNumberToShort(event.consensus) + unit\n        : \"-\";\n      const previous = event.previous\n        ? formatNumberToShort(event.previous) + unit\n        : \"-\";\n\n      if (!isSmall) {\n        // Desktop: one physical row per event (same as before)\n        const desktopRowData = {\n          ...event,\n          event_datetime: datetimeCell,\n          translated_name: nameCell,\n          impact_description: impactCell,\n          actual,\n          consensus: forecast,\n          previous,\n        };\n\n        const item: Item<any> = {\n          key:\n            event.id ??\n            `${event.translated_name}-${event.event_datetime}-${idx}`,\n          rows: [{ kind: \"cells\", data: desktopRowData }],\n          ...(decorateItem?.(event, idx, date) || {}),\n        };\n        items.push(item);\n      } else {\n        // Mobile: two physical rows per event\n        const topRowData = {\n          event_datetime: datetimeCell,\n          translated_name: nameCell,\n          impact_description: impactCell,\n        };\n\n        const bottomRowContent = (\n          <div\n            style={{\n              maxWidth: 480,\n              display: \"grid\",\n              gridTemplateColumns: \"1fr 1fr 1fr\",\n              gap: \"0.5rem\",\n              alignItems: \"center\",\n            }}\n          >\n            <div\n              style={{\n                display: \"flex\",\n                gap: \"0.25rem\",\n                alignItems: \"baseline\",\n              }}\n            >\n              <strong style={{ opacity: 0.7 }}>A:</strong>\n              <strong>{actual}</strong>\n            </div>\n            <div\n              style={{\n                display: \"flex\",\n                gap: \"0.25rem\",\n                alignItems: \"baseline\",\n              }}\n            >\n              <strong style={{ opacity: 0.7 }}>F:</strong>\n              <strong>{forecast}</strong>\n            </div>\n            <div\n              style={{\n                display: \"flex\",\n                gap: \"0.25rem\",\n                alignItems: \"baseline\",\n              }}\n            >\n              <strong style={{ opacity: 0.7 }}>P:</strong>\n              <strong>{previous}</strong>\n            </div>\n          </div>\n        );\n\n        const item: Item<any> = {\n          key:\n            event.id ??\n            `${event.translated_name}-${event.event_datetime}-${idx}`,\n          rows: [\n            { kind: \"cells\", data: topRowData },\n            { kind: \"spanned\", content: bottomRowContent, colSpan: \"all\" },\n          ],\n          ...(decorateItem?.(event, idx, date) || {}),\n        };\n        items.push(item);\n      }\n\n      // ---- ADD SEPARATOR after the last past event (if there are events after it) ----\n      if (event.isLastPastEvent && idx < events.length - 1) {\n        items.push({\n          key: `divider-${date}-${idx}`,\n          rows: [\n            {\n              kind: \"divider\",\n              bg: styles.econ_coming_soon_color || \"rgb(185, 14, 14)\",\n              thickness: 2,\n              marginY: 4,\n            },\n          ],\n        });\n      }\n    }\n\n    return { title: date, items };\n  });\n\n  return { columns, groups };\n}\n","export function formatNumberToShort(value: string): string {\n    const isNegative = value.startsWith(\"-\");\n    const unsignedValue = isNegative ? value.slice(1) : value;\n    const numValue = Number(unsignedValue.replace(/,/g, \"\"));\n    if (isNaN(numValue)) {\n        return \"-\";\n    }\n    if (isNegative) {\n        return `-${formatNumberToShort(unsignedValue)}`;\n    }\n\n    if (numValue >= 1e9) {\n        return `${(numValue / 1e9).toFixed(2)} B`;\n    } else if (numValue >= 1e6) {\n        return `${(numValue / 1e6).toFixed(2)} M`;\n    } else if (numValue >= 1e3) {\n        return `${(numValue / 1e3).toFixed(2)} K`;\n    }\n    return value.toString();\n}\n\nexport function isValidNumber(value: unknown): boolean {\n    return value !== null && value !== undefined && !isNaN(Number(value));\n};","import { EcoCal } from \"../../../../types/EcoCal\";\nimport { WidgetStyle } from \"../../../../types/WidgetStyle\";\n\nexport const TimeAndFlagCell: React.FC<{\n    event: EcoCal.ProcessedEvent;\n    styles: WidgetStyle;\n    selectedTimeZone: string;\n}> = ({ event, styles, selectedTimeZone }) => {\n    return <div style={{\n        display: \"flex\",\n        flexWrap: \"wrap\",\n        alignItems: \"center\",\n        gap: \"0.5rem\",\n    }}>\n        <span style={{\n            fontWeight: event.isClosestEvent ? \"bold\" : \"normal\",\n            color: event.isClosestEvent ? (styles.econ_coming_soon_color || \"rgb(185, 14, 14)\") : \"inherit\",\n            textWrap: \"nowrap\",\n        }}>\n            {new Date(event.event_datetime).toLocaleTimeString(\"en-US\", {\n                hour: \"2-digit\",\n                minute: \"2-digit\",\n                hour12: true,\n                timeZone: selectedTimeZone,\n            }) ?? \"-\"}\n        </span>\n        <img\n            src={`https://flagcdn.com/w40/${event.iso_country_code.toLowerCase()}.png`}\n            alt={`${event.iso_country_code} flag`}\n            style={{\n                width: \"24px\",\n                height: \"16px\",\n                borderRadius: \"4px\",\n                objectFit: \"cover\",\n            }}\n        />\n    </div>\n};","import { FC } from \"react\";\nimport { Dictionary } from \"../../../../types/Dictionary\";\nimport { WidgetStyle } from \"../../../../types/WidgetStyle\";\n\nexport const ImpactBadge: FC<{\n    impact: \"HIGH\" | \"MEDIUM\" | \"LOW\";\n    styles: WidgetStyle;\n    t: Dictionary[\"economicCalendar\"];\n}> = ({ impact, styles, t }) => {\n    const impactText = impact === \"HIGH\"\n        ? t.high\n        : impact === \"MEDIUM\"\n            ? t.medium\n            : t.low;\n\n    const impactBgColor = impact === \"HIGH\"\n        ? (styles.econ_impact_high_bg || \"#dc2626\") //Default Red for High\n        : impact === \"MEDIUM\"\n            ? (styles.econ_impact_med_bg || \"#164efa\") // Default Blue for Medium\n            : (styles.econ_impact_low_bg || \"#f6dc00\"); // Default Yellow for Low\n\n    const impactTextColor = impact === \"HIGH\"\n        ? (styles.econ_impact_high_txt || \"#ffffff\") // Default White text for High\n        : impact === \"MEDIUM\"\n            ? (styles.econ_impact_med_txt || \"#ffffff\") // Default White text for Medium\n            : (styles.econ_impact_low_txt || \"#000000\"); // Default Black text for Low\n\n    return <div\n        style={{\n            width: \"fit-content\",\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            padding: \"0.25rem 0.5rem\",\n            fontSize: \"0.75rem\",\n            fontWeight: \"bold\",\n            borderRadius: styles.base_rounded,\n            background: impactBgColor,\n            color: impactTextColor,\n        }}\n        title={`Economic Impact: ${impactText}`}\n    >\n        {impactText}\n    </div>;\n}","export function createUnit(unit: string | null | undefined): string {\n    if (!unit) return \"\";\n    switch (unit.toLowerCase()) {\n        case \"percent\":\n            return \"%\";\n        case \"points\":\n            return \" pts\";\n        default:\n            return ` ${unit}`;\n    }\n}\n\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport Branded from \"../../Branded\";\nimport { WidgetComboType, WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { fetchSignalsData } from \"../../../functions/fetchSignalsData\";\nimport { getTextColor } from \"../../../utils/colors\";\nimport { Dictionary } from \"../../../types/Dictionary\";\nimport dictionaries from \"../../../dictionaries\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport { SingleAssetLayout } from \"./parts/layouts/SingleAssetLayout\";\nimport { ListLayout } from \"./parts/layouts/ListLayout\";\nimport { decideColumnMode } from \"./functions/decideColumnMode\";\nimport { decideLayoutMode } from \"./functions/decideLayoutMode\";\nimport { SignalStyle } from \"./parts/Signal\";\n\nexport type SignalsStyles = {\n  signal: SignalStyle;\n  fontFamily: string;\n  columnMode: boolean | null;\n  singleAsset: boolean;\n};\n\nexport interface SignalItem {\n  date: string;\n  symbol: string;\n  headline: string;\n  description: string;\n  s1: string;\n  s2: string;\n  r1: string;\n  r2: string;\n  image: string;\n  h: number;\n  l: number;\n  o: number;\n  c: number;\n}\n\nexport interface RawSignalsProps {\n  lang: string;\n  styles: SignalsStyles;\n  assets: {\n    forex: number[];\n    stock: number[];\n  };\n  isSmall: boolean;\n  inCombo?: WidgetComboType;\n}\n\ninterface SignalsProps {\n  styles: WidgetStyle;\n  assets: {\n    forex: number[];\n    stock: number[];\n  };\n  inCombo?: WidgetComboType;\n  size?: \"full\" | \"screen\";\n}\n\nexport function RawSignals({\n  lang,\n  styles,\n  assets,\n  isSmall,\n  inCombo,\n}: RawSignalsProps) {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [signalsValues, setSignalsValues] = useState<SignalItem[] | null>(null);\n\n  const isColumnMode = decideColumnMode(styles.columnMode, isSmall, inCombo);\n\n  const layoutMode = decideLayoutMode(styles.singleAsset, inCombo);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = lang.toLowerCase();\n        const translation: Dictionary =\n          dictionaries[selectedLang] || dictionaries[\"en\"];\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.fontFamily] },\n        });\n      });\n    }\n  }, [lang, styles.fontFamily]);\n  useEffect(() => {\n    const fetchData = async () => {\n      setLoading(true);\n      try {\n        let forexAssetIds = assets.forex;\n        let stockAssetIds = assets.stock;\n\n        if (layoutMode.maxItems) {\n          if (layoutMode.randomize) {\n            forexAssetIds = [...forexAssetIds].sort(() => 0.5 - Math.random());\n            stockAssetIds = [...stockAssetIds].sort(() => 0.5 - Math.random());\n          }\n          const numberOfForexItems = Math.floor(\n            Math.random() * (layoutMode.maxItems + 1),\n          );\n          const numberOfStockItems = layoutMode.maxItems - numberOfForexItems;\n          forexAssetIds = forexAssetIds.slice(0, numberOfForexItems);\n          stockAssetIds = stockAssetIds.slice(0, numberOfStockItems);\n        }\n\n        const newForexSignals =\n          assets.forex.length > 0\n            ? await fetchSignalsData(\"forex\", lang, forexAssetIds)\n            : [];\n        if (!Array.isArray(newForexSignals)) {\n          throw new Error(\"Failed to fetch forex data\");\n        }\n\n        const newStockSignals =\n          assets.stock.length > 0\n            ? await fetchSignalsData(\"stock\", lang, stockAssetIds)\n            : [];\n\n        if (!Array.isArray(newStockSignals)) {\n          throw new Error(\"Failed to fetch stock data\");\n        }\n\n        setSignalsValues([...newForexSignals, ...newStockSignals]);\n      } catch (e) {\n        console.error(\"Error fetching signals data:\", e);\n        setSignalsValues([]);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n  }, [assets.forex, assets.stock]);\n\n  if (loading) {\n    return (\n      <div\n        style={{\n          maxWidth: \"100%\",\n          margin: \"0 auto\",\n          padding: \"1.5rem 1rem\",\n          textAlign: \"center\",\n          color: \"#4A5568\", // gray-600\n        }}\n      >\n        <FancyLoader />\n      </div>\n    );\n  }\n\n  if (!signalsValues || signalsValues.length === 0) {\n    return (\n      <div\n        style={{\n          maxWidth: \"100%\",\n          margin: \"0 auto\",\n          padding: \"1.5rem 1rem\",\n          textAlign: \"center\",\n          color: \"#4A5568\", // gray-600\n        }}\n      >\n        No technical analysis signals available.\n      </div>\n    );\n  }\n\n  if (!translations) return <></>;\n  const t = translations.signals;\n\n  return (\n    <div style={{ width: \"100%\" }}>\n      {!signalsValues ||\n        (signalsValues.length === 0 && (\n          <div\n            style={{\n              maxWidth: \"100%\",\n              margin: \"0 auto\",\n              padding: \"1.5rem 1rem\",\n              textAlign: \"center\",\n              color: \"#4A5568\",\n            }}\n          >\n            No technical analysis signals available.\n          </div>\n        ))}\n\n      {!loading &&\n        signalsValues &&\n        signalsValues.length > 0 &&\n        (layoutMode.isSingle ? (\n          <SingleAssetLayout\n            signalsValues={signalsValues}\n            signalStyle={{\n              background: styles.signal.background,\n              borderColor: styles.signal.borderColor,\n              borderStyle: styles.signal.borderStyle,\n              borderWidth: styles.signal.borderWidth,\n              borderRadius: styles.signal.borderRadius,\n              textColor: styles.signal.textColor,\n              resistanceBackground: styles.signal.resistanceBackground,\n              resistanceText: styles.signal.resistanceText,\n              supportBackground: styles.signal.supportBackground,\n              supportText: styles.signal.supportText,\n            }}\n            isColumnMode={isColumnMode}\n            t={t}\n          />\n        ) : (\n          <ListLayout\n            signalStyle={{\n              background: styles.signal.background,\n              borderColor: styles.signal.borderColor,\n              borderStyle: styles.signal.borderStyle,\n              borderWidth: styles.signal.borderWidth,\n              borderRadius: styles.signal.borderRadius,\n              textColor: styles.signal.textColor,\n              resistanceBackground: styles.signal.resistanceBackground,\n              resistanceText: styles.signal.resistanceText,\n              supportBackground: styles.signal.supportBackground,\n              supportText: styles.signal.supportText,\n            }}\n            signalsValues={signalsValues}\n            isColumnMode={isColumnMode}\n            t={t}\n          />\n        ))}\n    </div>\n  );\n}\n\nexport default function Signals({\n  styles,\n  assets,\n  inCombo,\n  size = \"screen\",\n}: SignalsProps) {\n  const [isSmall, setIsSmall] = useState(false); // State to track if the container is small\n  const observerRef = useRef<ResizeObserver | null>(null);\n\n  const containerRef = useCallback((node: HTMLDivElement | null) => {\n    if (observerRef.current) {\n      observerRef.current.disconnect();\n      observerRef.current = null;\n    }\n\n    if (node) {\n      observerRef.current = new ResizeObserver((entries) => {\n        const width = entries[0]?.contentRect.width;\n        if (width !== undefined) {\n          setIsSmall(width < 1000);\n        }\n      });\n\n      observerRef.current.observe(node);\n    }\n  }, []);\n\n  function getBorderParts(border: string): {\n    width: string;\n    color: string;\n    style: string;\n  } {\n    const parts = border.split(\" \");\n    if (parts.length !== 3) {\n      return {\n        width: \"0px\",\n        color: \"transparent\",\n        style: \"solid\",\n      };\n    }\n    const [width, color, style] = parts;\n    return { width, color, style };\n  }\n\n  const signalsStyles: SignalsStyles = {\n    signal: {\n      background: styles.results_background || styles.base_background,\n      textColor: styles.results_text_color || styles.base_text_color,\n      borderWidth: getBorderParts(\n        styles.results_border || styles.base_border || \"\",\n      ).width,\n      borderColor: getBorderParts(\n        styles.results_border || styles.base_border || \"\",\n      ).color,\n      borderStyle: getBorderParts(\n        styles.results_border || styles.base_border || \"\",\n      ).style,\n      borderRadius: styles.results_rounded || styles.base_rounded,\n      supportBackground: styles.signals_sup_res_background || \"#E2E8F0\", // default to gray-200\n      supportText: getTextColor(styles.signals_sup_res_background || \"#E2E8F0\"), // determine text color based on background\n      resistanceBackground: styles.signals_sup_res_background || \"#E2E8F0\", // default to gray-200\n      resistanceText: getTextColor(\n        styles.signals_sup_res_background || \"#E2E8F0\",\n      ), // determine text color based on background\n    },\n    columnMode: styles.signals_column_mode || false,\n    singleAsset: styles.signals_single_asset || false,\n    fontFamily: styles.font_family,\n  };\n\n  return (\n    <Branded style={styles}>\n      <div\n        ref={containerRef}\n        style={{ height: \"100%\", width: \"100%\", overflowY: \"auto\" }}\n      >\n        <Branded.WidgetContainer widgetName=\"signals\" size={size}>\n          <RawSignals\n            lang={styles.lang}\n            styles={signalsStyles}\n            assets={assets}\n            isSmall={isSmall}\n            inCombo={inCombo}\n          />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","import { SignalItem } from \"../components/widgets/Signals\";\nimport { Asset } from \"../types/Asset\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchSignalsData(\n    assetType: 'forex' | 'stock',\n    lang: string,\n    assetIds: number[]\n): Promise<SignalItem[] | null> {\n    try {\n        const response = await fetch(`${WIDGET_API_BASE}/api/widgets/technical-analysis`, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ assetType, lang, assetIds }),\n        });\n\n        if (!response.ok) {\n            const error = await response.json();\n            throw new Error(`Error fetching signals: ${error.message}`);\n        }\n\n        const data = await response.json();\n\n        const rawSignals = data.data as (Asset & {\n            h: number;\n            l: number;\n            c: number;\n            o: number;\n        })[];\n\n        // Used to be for filtering signals based on today's date.\n        // Left here for potential future use.\n        const filteredSignals = rawSignals;\n\n        const imageUrls: Record<string, string | null> = {};\n\n        await Promise.all(\n            filteredSignals.map(async (signal) => {\n                const imageResponse = await fetch(`${WIDGET_API_BASE}/api/widgets/technical-analysis/chart`, {\n                    method: 'POST',\n                    headers: {\n                        'Content-Type': 'application/json',\n                    },\n                    body: JSON.stringify({ chartName: signal.chart_name }),\n                });\n                if (!imageResponse.ok) {\n                    imageUrls[signal.chart_name] = null;\n                    return; // Skip this signal if the image fetch fails\n                }\n                const imageData = await imageResponse.json();\n                imageUrls[signal.chart_name] = imageData.url;\n            })\n        );\n\n        const signals: SignalItem[] = filteredSignals\n            .filter((signal) =>\n                signal.chart_name &&\n                imageUrls[signal.chart_name] !== null\n            )\n            .map((signal) => {\n                return {\n                    date: new Date(signal.updated).toISOString().split('T')[0],\n                    symbol: signal.symbol,\n                    headline: signal.lower_line,\n                    description: signal.indicator_line,\n                    s1: parseFloat(signal.S1).toFixed(2),\n                    s2: parseFloat(signal.S2).toFixed(2),\n                    r1: parseFloat(signal.R1).toFixed(2),\n                    r2: parseFloat(signal.R2).toFixed(2),\n                    image: imageUrls[signal.chart_name] as string,\n                    h: signal.h,\n                    l: signal.l,\n                    o: signal.o,\n                    c: signal.c,\n                };\n            });\n        return signals;\n    } catch (error) {\n        console.error('Fetch error:', error);\n        return null;\n    }\n}\n","import { FC, useState } from \"react\";\nimport { SignalItem } from \"../..\";\nimport { Dictionary } from \"../../../../../types/Dictionary\";\nimport Branded from \"../../../../Branded\";\nimport { Signal, SignalStyle } from \"../Signal\";\n\ninterface Props {\n  signalsValues: SignalItem[];\n  signalStyle: SignalStyle;\n  isColumnMode: boolean;\n  t: Dictionary[\"signals\"];\n}\n\nexport const SingleAssetLayout: FC<Props> = ({\n  signalsValues,\n  signalStyle,\n  isColumnMode,\n  t,\n}) => {\n  const [selectedAsset, setSelectedAsset] = useState<string>(\n    signalsValues[0].symbol,\n  );\n\n  const signal =\n    signalsValues.find((signal) => signal.symbol === selectedAsset) ||\n    signalsValues[0];\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexDirection: \"column\",\n        gap: \"1.5rem\",\n      }}\n    >\n      <div style={{ width: \"17rem\" }}>\n        <Branded.Dropdown\n          label={<span style={{ fontWeight: \"bold\" }}>{selectedAsset}</span>}\n          items={signalsValues.map((signal) => ({\n            content: signal.symbol,\n            value: signal.symbol,\n          }))}\n          onSelect={(value) => {\n            setSelectedAsset(value as string);\n          }}\n          selected={selectedAsset}\n        />\n      </div>\n\n      <Signal\n        style={signalStyle}\n        signal={signal}\n        isColumnMode={isColumnMode}\n        t={t}\n      />\n    </div>\n  );\n};\n","import { FC, useEffect, useRef, useState } from \"react\";\nimport { SignalItem } from \"..\";\nimport { Dictionary } from \"../../../../types/Dictionary\";\nimport Branded from \"../../../Branded\";\n\nexport type SignalStyle = {\n  background: string;\n  textColor: string;\n  borderWidth: string;\n  borderColor: string;\n  borderStyle: string;\n  borderRadius: string;\n  supportBackground: string;\n  supportText: string;\n  resistanceBackground: string;\n  resistanceText: string;\n};\n\nexport const Signal: FC<{\n  signal: SignalItem;\n  style: SignalStyle;\n  isColumnMode: boolean;\n  t: Dictionary[\"signals\"];\n}> = ({ signal, style, isColumnMode, t }) => {\n  const [supportResistanceContainerWidth, setSupportResistanceContainerWidth] =\n    useState<number>(0);\n  const supportResistanceContainerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const el = supportResistanceContainerRef.current;\n    if (!el) return;\n\n    const updateWidths = () => {\n      setSupportResistanceContainerWidth(el.offsetWidth);\n    };\n\n    const ro = new ResizeObserver(() => {\n      updateWidths();\n    });\n\n    ro.observe(el);\n\n    // initial measurement\n    updateWidths();\n\n    return () => {\n      ro.disconnect();\n    };\n  }, []);\n\n  const hcloColor =\n    signal.o > signal.c\n      ? \"#f32b2bff\"\n      : signal.o < signal.c\n        ? \"#06b45dff\"\n        : \"#4A5568\";\n\n  return (\n    <Branded.ResultsContainer\n      customStyle={{\n        width: \"100%\",\n        padding: 0,\n        margin: 0,\n        overflow: \"hidden\",\n        background: style.background,\n        borderWidth: style.borderWidth,\n        borderColor: style.borderColor,\n        borderStyle: style.borderStyle,\n        borderRadius: style.borderRadius,\n      }}\n    >\n      <div\n        style={{\n          width: \"100%\",\n          maxWidth: \"100%\",\n          display: \"flex\",\n          flexDirection: isColumnMode ? \"column\" : \"row\",\n          alignItems: \"center\",\n          gap: \"8px\",\n        }}\n      >\n        {/* Text section */}\n        <div\n          style={{\n            width: \"100%\",\n            maxWidth: \"100%\",\n            display: \"flex\",\n            flexDirection: isColumnMode ? \"row\" : \"column\",\n            alignItems: \"flex-start\",\n            justifyContent: \"space-between\",\n          }}\n        >\n          <div\n            style={{\n              width: \"100%\",\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"flex-start\",\n            }}\n          >\n            <Branded.Label\n              customStyle={{\n                fontSize: \"0.875rem\", // 14px\n                padding: \"0.25rem 0.5rem\",\n                lineHeight: \"1.5\",\n                color: style.textColor,\n              }}\n            >\n              {signal.date}\n            </Branded.Label>\n            <Branded.Label\n              customStyle={{\n                fontSize: \"1.5rem\", // 14px\n                padding: \"0.25rem 0.5rem\",\n                lineHeight: \"1\",\n                color: style.textColor,\n                fontWeight: \"bold\", // Ensure the symbol is bold\n              }}\n            >\n              {signal.symbol}\n            </Branded.Label>\n            <Branded.Label\n              customStyle={{\n                padding: \"0.25rem 0.5rem\",\n                fontSize: \"0.75rem\", // 12px\n                color: hcloColor,\n                textWrap: \"nowrap\", // Prevent text wrapping\n              }}\n            >\n              O: {signal.o}, H: {signal.h}, L: {signal.l}, C: {signal.c}\n            </Branded.Label>\n            <Branded.Label\n              customStyle={{\n                padding: \"0.25rem 0.5rem\",\n                wordBreak: \"break-word\", // Ensure long headlines break correctly\n                fontSize: \"0.875rem\", // 14px\n                width: \"100%\",\n                textAlign: \"start\", // Align text to the left\n                textWrap: \"wrap\", // Allow text to wrap\n                lineHeight: \"1.5\", // Improve readability\n                color: style.textColor,\n              }}\n            >\n              <strong>{signal.headline}</strong>\n              <br />\n              {signal.description}\n            </Branded.Label>\n          </div>\n\n          {/* Support and Resistance section */}\n          <div\n            ref={supportResistanceContainerRef}\n            style={{\n              display: \"flex\",\n              flexDirection:\n                supportResistanceContainerWidth < 300 ? \"column\" : \"row\",\n              width: \"100%\",\n              maxWidth: \"100%\",\n              justifyContent: \"space-between\",\n              alignItems: \"center\",\n              gap: \"0.5rem\",\n              padding: \"0.5rem\",\n            }}\n          >\n            <div\n              style={{\n                width: \"100%\",\n                padding: \"0.25rem 0.5rem\",\n                background: style.supportBackground,\n                borderRadius: \"0.375rem\", // rounded-md\n                display: \"flex\",\n                flexDirection: \"column\",\n                alignItems: \"center\",\n                textAlign: \"center\",\n                flex: 1,\n                gap: \"0.25rem\",\n              }}\n            >\n              <Branded.Label\n                customStyle={{\n                  fontSize: \"0.875rem\", // 14px\n                  color: style.supportText,\n                  textWrap: \"nowrap\", // Prevent text wrapping\n                }}\n              >\n                {`${t.support}1: ${signal.s1}`}\n              </Branded.Label>\n              <Branded.Label\n                customStyle={{\n                  fontSize: \"0.875rem\", // 14px\n                  color: style.supportText,\n                  textWrap: \"nowrap\", // Prevent text wrapping\n                }}\n              >\n                {`${t.support}2: ${signal.s2}`}\n              </Branded.Label>\n            </div>\n            <div\n              style={{\n                width: \"100%\",\n                padding: \"0.25rem 0.5rem\",\n                background: style.resistanceBackground,\n                borderRadius: \"0.375rem\", // rounded-md\n                display: \"flex\",\n                flexDirection: \"column\",\n                alignItems: \"center\",\n                textAlign: \"center\",\n                flex: 1,\n                gap: \"0.25rem\",\n              }}\n            >\n              <Branded.Label\n                customStyle={{\n                  fontSize: \"0.875rem\", // 14px\n                  color: style.resistanceText,\n                  textWrap: \"nowrap\", // Prevent text wrapping\n                }}\n              >\n                {`${t.resistance}1: ${signal.r1}`}\n              </Branded.Label>\n              <Branded.Label\n                customStyle={{\n                  fontSize: \"0.875rem\", // 14px\n                  color: style.resistanceText,\n                  textWrap: \"nowrap\", // Prevent text wrapping\n                }}\n              >\n                {`${t.resistance}2: ${signal.r2}`}\n              </Branded.Label>\n            </div>\n          </div>\n        </div>\n\n        {/* Image section */}\n        <div\n          style={{\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            width: \"100%\",\n            height: \"100%\",\n            minWidth: isColumnMode ? 0 : \"200px\",\n          }}\n        >\n          <img\n            src={signal.image}\n            alt={signal.symbol || \"Technical analysis image\"}\n            style={{\n              height: \"100%\",\n              objectFit: \"contain\", // Ensure image covers the area\n              objectPosition: isColumnMode ? \"center\" : \"right\",\n            }}\n          />\n        </div>\n      </div>\n    </Branded.ResultsContainer>\n  );\n};\n","import { FC } from \"react\";\nimport { SignalItem } from \"../..\";\nimport { Dictionary } from \"../../../../../types/Dictionary\";\nimport { Signal, SignalStyle } from \"../Signal\";\n\ninterface Props {\n  signalsValues: SignalItem[];\n  signalStyle: SignalStyle;\n  isColumnMode: boolean;\n  t: Dictionary[\"signals\"];\n}\n\nexport const ListLayout: FC<Props> = ({\n  signalsValues,\n  signalStyle,\n  isColumnMode,\n  t,\n}) => {\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        minWidth: 0,\n        display: \"flex\",\n        flexDirection: \"column\",\n        gap: \"1.5rem\",\n      }}\n    >\n      {signalsValues.map((signal, idx) => (\n        <Signal\n          key={idx}\n          style={signalStyle}\n          signal={signal}\n          isColumnMode={isColumnMode}\n          t={t}\n        />\n      ))}\n    </div>\n  );\n};\n","import { WidgetComboType } from \"../../../../types/WidgetStyle\";\n\nexport const decideColumnMode = (\n    styleDefault: boolean | null,\n    isSmall: boolean,\n    inCombo?: WidgetComboType\n) => {\n    if (inCombo) return isSmall;\n    return !!styleDefault || isSmall;\n};","import { WidgetComboType } from \"../../../../types/WidgetStyle\";\n\nexport interface SignalsLayoutMode {\n    isSingle: boolean;\n    maxItems: number | null;\n    randomize: boolean;\n}\n\nexport const decideLayoutMode = (\n    isSingle: boolean,\n    inCombo?: WidgetComboType\n): SignalsLayoutMode => {\n    if (inCombo) return {\n        isSingle: false,\n        maxItems: 3,\n        randomize: true,\n    };\n    return {\n        isSingle: isSingle,\n        maxItems: null,\n        randomize: false,\n    };\n};","import { useEffect, useRef, useState } from \"react\";\nimport { groupEventsByDate } from \"./functions/groupEventsByDate\";\nimport { EconomicCalendarFilters } from \"./parts/EconomicCalendarFilters\";\nimport { buildEconomicCalendarTable } from \"./buildEconomicCalendarTable\";\nimport { Dictionary } from \"../../../../types/Dictionary\";\nimport { HolaPrimeEcoCal, StockEcoCal } from \"../../../../types/EcoCal\";\nimport {\n  convertDateRangeToUTC,\n  addDaysToDateString,\n  getTodayDateRange,\n} from \"../../../../utils/datesAndTimes\";\nimport dictionaries from \"../../../../dictionaries\";\nimport { fetchHolaPrimeEconomicData } from \"../../../../functions/fetchHolaPrimeEconomicData\";\nimport { FancyLoader } from \"../../../FancyLoader\";\nimport SegmentedToggle from \"./parts/SegmentedToggle\";\nimport { ComplexTable } from \"./elements/ComplexTable\";\nimport { fetchHolaPrimeStockData } from \"../../../../functions/fetchHolaPrimeStockData\";\nimport { buildStockCalendarTable } from \"./buildStockCalendarTable\";\n\nconst formatSelectedLang = (lang: string) => {\n  if (lang === \"PT-BR\") return \"PT\";\n  return lang;\n};\n\ninterface Props {\n  countries: { name: string; code: string }[];\n  dev?: boolean;\n  stocksEnabled?: boolean;\n}\n\nexport default function HolaPrimeEconomicCalendar({\n  countries,\n  dev = false,\n  stocksEnabled = false,\n}: Props): JSX.Element {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [selectedLang, setSelectedLang] = useState(formatSelectedLang(\"EN\"));\n  const [now, setNow] = useState(new Date());\n  const [impact, setImpact] = useState<\"High\" | \"Low\" | \"Medium\" | \"Impact\">(\n    \"Impact\"\n  );\n  const [selectedCountries, setSelectedCountries] = useState<string[]>([]);\n  const [selectedDateRange, setSelectedDateRange] =\n    useState<HolaPrimeEcoCal.StringDateRange>(getTodayDateRange());\n  const [selectedTimeZone, setSelectedTimeZone] = useState(\"UTC\");\n\n  const [allEvents, setAllEvents] = useState<\n    HolaPrimeEcoCal.EconomicEventWithTranslation[] | null\n  >(null);\n  const [impactedInstrumentsType, setImpactedInstrumentsType] = useState<\n    \"forex\" | \"futures\" | \"stocks\"\n  >(\"forex\");\n  const [stockType, setStockType] = useState<\"splits\" | \"earnings\" | \"dividends\">(\"splits\");\n  const [stockEvents, setStockEvents] = useState<StockEcoCal.Event[]>([]);\n  const [stockStatus, setStockStatus] = useState<\"ready\" | \"loading\" | \"error\">(\"ready\");\n  const [groupedData, setGroupedData] = useState<HolaPrimeEcoCal.EventsByDate>(\n    {}\n  );\n  const [status, setStatus] = useState<\"ready\" | \"loading\" | \"error\">(\"ready\");\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  const [isSmall, setIsSmall] = useState<boolean>(false);\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setNow(new Date());\n    }, 60000); // update every minute\n\n    return () => clearInterval(interval);\n  }, []);\n\n  useEffect(() => {\n    if (typeof ResizeObserver === \"undefined\") return;\n\n    if (!containerRef.current) {\n      console.error(\"Container not rendered yet.\");\n      return;\n    }\n\n    const observer = new ResizeObserver((entries) => {\n      for (let entry of entries) {\n        if (entry.contentRect) {\n          setIsSmall(entry.contentRect.width < 768);\n        }\n      }\n    });\n\n    observer.observe(containerRef.current);\n\n    return () => observer.disconnect();\n  }, [containerRef.current]);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const translation: Dictionary =\n          dictionaries[selectedLang.toLowerCase()] || dictionaries[\"en\"];\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [\"Inter\", \"Ariel\"] },\n        });\n      });\n    }\n  }, [selectedLang]);\n\n  const fetchData = async () => {\n    setStatus(\"loading\");\n\n    try {\n      const rangeInUTC = convertDateRangeToUTC(\n        selectedDateRange,\n        selectedTimeZone\n      );\n      const events = await fetchHolaPrimeEconomicData(\n        selectedLang,\n        rangeInUTC.start,\n        rangeInUTC.end\n      );\n\n      if (!events) {\n        setGroupedData({});\n        setStatus(\"error\");\n        return;\n      }\n\n      setAllEvents(events);\n\n      let filteredEvents = events;\n      if (impact !== \"Impact\") {\n        filteredEvents = filteredEvents.filter((event) => {\n          return (\n            event.impact_description?.toLowerCase() === impact.toLowerCase()\n          );\n        });\n      }\n      if (selectedCountries.length > 0) {\n        filteredEvents = filteredEvents.filter((event) => {\n          const code = event.iso_country_code?.toLowerCase();\n          return selectedCountries.includes(code);\n        });\n      }\n\n      const grouped = groupEventsByDate(filteredEvents, selectedTimeZone);\n      setGroupedData(grouped);\n      setStatus(\"ready\");\n    } catch (error) {\n      console.error(\"Error fetching economic data:\", error);\n      setGroupedData({});\n      setStatus(\"error\");\n    }\n  };\n\n  useEffect(() => {\n    fetchData();\n  }, [selectedDateRange, selectedTimeZone, selectedLang]);\n\n  useEffect(() => {\n    if (!stocksEnabled) return;\n    const fetchStocks = async () => {\n      setStockStatus(\"loading\");\n      const events = await fetchHolaPrimeStockData(\n        selectedDateRange.start,\n        addDaysToDateString(selectedDateRange.end, 1)\n      );\n      if (!events) {\n        setStockEvents([]);\n        setStockStatus(\"error\");\n        return;\n      }\n      setStockEvents(events);\n      setStockStatus(\"ready\");\n    };\n    fetchStocks();\n  }, [stocksEnabled, selectedDateRange]);\n\n  useEffect(() => {\n    if (!allEvents) return;\n    let filteredEvents = allEvents;\n    if (impact !== \"Impact\") {\n      filteredEvents = filteredEvents.filter(\n        (event) =>\n          event.impact_description.toLowerCase() === impact.toLowerCase()\n      );\n    }\n    if (selectedCountries.length > 0) {\n      filteredEvents = filteredEvents.filter((event) =>\n        selectedCountries.includes(event.iso_country_code.toLowerCase())\n      );\n    }\n    const grouped = groupEventsByDate(filteredEvents, selectedTimeZone);\n    setGroupedData(grouped);\n  }, [impact, selectedCountries]);\n\n  if (!translations) return <></>;\n\n  const t = translations.economicCalendar;\n\n  const filteredStockEvents = stockEvents.filter((event) => event.type === stockType);\n  const isStocks = impactedInstrumentsType === \"stocks\";\n  const { columns, groups } = isStocks\n    ? buildStockCalendarTable(filteredStockEvents, t, isSmall)\n    : buildEconomicCalendarTable({\n        impactedInstrumentsType,\n        groupedData,\n        selectedTimeZone,\n        now,\n        t,\n        isSmall,\n      });\n  const currentStatus = isStocks ? stockStatus : status;\n  const hasEvents = isStocks\n    ? filteredStockEvents.length > 0\n    : groupedData && Object.entries(groupedData).length > 0;\n\n  const radius = 12;\n  const sep = \"1px solid #E6E8EE\";\n  const mobileGroupHeaderStyle: React.CSSProperties = {\n    position: \"sticky\",\n    top: \"var(--thead-h, 0px)\",\n    zIndex: 4,\n    background: \"#FFFFFF\",\n    color: \"#111827\",\n    textAlign: \"left\",\n    fontWeight: 700,\n    fontSize: 12,\n    letterSpacing: \"0.08em\",\n    textTransform: \"uppercase\",\n    padding: \"12px 14px\",\n    borderBottom: sep,\n    overflow: \"hidden\",\n  };\n\n  return (\n    <div style={wrapperStyle(dev)} ref={containerRef}>\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          gap: \"1rem\",\n          width: \"100%\",\n          height: \"100%\",\n        }}\n      >\n        <SegmentedToggle\n          items={[\n            { label: \"Forex\", value: \"forex\" as const },\n            { label: \"Futures\", value: \"futures\" as const },\n            ...(stocksEnabled ? [{ label: \"Stocks\", value: \"stocks\" as const }] : []),\n          ]}\n          value={impactedInstrumentsType}\n          onChange={(next) => setImpactedInstrumentsType(next)}\n        />\n        {isStocks && (\n          <SegmentedToggle\n            items={[\n              { label: t.holaPrime.stocks.splits, value: \"splits\" as const },\n              { label: t.holaPrime.stocks.earnings, value: \"earnings\" as const },\n              { label: t.holaPrime.stocks.dividends, value: \"dividends\" as const },\n            ]}\n            value={stockType}\n            onChange={(next) => setStockType(next)}\n            size=\"sm\"\n            style={{ marginTop: 8 }}\n          />\n        )}\n        <div style={contentStyle}>\n          <EconomicCalendarFilters\n            countryOptions={countries}\n            t={t}\n            isSmall={isSmall}\n            now={now}\n            impact={impact}\n            setImpact={setImpact}\n            selectedCountries={selectedCountries}\n            setSelectedCountries={setSelectedCountries}\n            selectedDateRange={selectedDateRange}\n            setSelectedDateRange={setSelectedDateRange}\n            selectedTimeZone={selectedTimeZone}\n            setSelectedTimeZone={setSelectedTimeZone}\n            selectedLang={selectedLang}\n            setSelectedLang={setSelectedLang}\n            hideCountryFilter={isStocks}\n            hideImpactFilter={isStocks}\n          />\n\n          {currentStatus === \"loading\" ? (\n            <div\n              style={{\n                width: \"100%\",\n                height: \"100%\",\n                display: \"flex\",\n                justifyContent: \"center\",\n                alignItems: \"center\",\n                padding: \"2rem 0\",\n              }}\n            >\n              <FancyLoader />\n            </div>\n          ) : hasEvents ? (\n            <div style={tableContainerStyle}>\n              <ComplexTable\n                columns={columns}\n                groups={groups}\n                hideHeader={isSmall}\n                customGroupHeaderStyle={\n                  isSmall ? mobileGroupHeaderStyle : undefined\n                }\n              />\n            </div>\n          ) : (\n            <div\n              style={{\n                width: \"100%\",\n                height: \"100%\",\n                display: \"flex\",\n                justifyContent: \"center\",\n                alignItems: \"center\",\n                padding: \"2rem 0\",\n                fontSize: \"1.2rem\",\n                color: \"black\",\n              }}\n            >\n              {t.noEventsFound}\n            </div>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nconst wrapperStyle = (dev: boolean): React.CSSProperties => ({\n  width: dev ? \"100%\" : \"100vw\",\n  height: dev ? \"100%\" : \"100vh\",\n  display: \"flex\",\n  flexDirection: \"column\",\n  gap: \"1rem\",\n  fontFamily: \"Inter\",\n  fontWeight: 400,\n});\n\nconst contentStyle: React.CSSProperties = {\n  flexGrow: 1,\n  overflowY: \"auto\",\n  padding: \"21px 20px\",\n  display: \"flex\",\n  flexDirection: \"column\",\n  gap: \"14px\",\n};\n\nconst tableContainerStyle: React.CSSProperties = {\n  overflow: \"hidden\",\n  backgroundColor: \"white\",\n  borderRadius: \"10px\",\n};\n","import { HolaPrimeEcoCal } from \"../../../../../types/EcoCal\";\n\nexport function groupEventsByDate(\n    events: HolaPrimeEcoCal.EconomicEventWithTranslation[],\n    selectedTimeZone: string\n): HolaPrimeEcoCal.EventsByDate {\n    const now = new Date();\n    const grouped: HolaPrimeEcoCal.EventsByDate = {};\n\n    const sortedEvents = [...events].sort(\n        (a, b) =>\n            new Date(a.event_datetime).getTime() - new Date(b.event_datetime).getTime()\n    );\n\n    let lastPastIndex = -1;\n    for (let i = 0; i < sortedEvents.length; i++) {\n        const eventTime = new Date(sortedEvents[i].event_datetime);\n        if (eventTime < now) {\n            lastPastIndex = i;\n        } else {\n            break;\n        }\n    }\n\n    const processed = sortedEvents.map((event, idx) => ({\n        ...event,\n        isLastPastEvent: idx === lastPastIndex,\n        isClosestEvent: idx === lastPastIndex + 1,\n    }));\n\n    for (const event of processed) {\n        const utcDate = new Date(event.event_datetime);\n\n        // Shift date to local time zone\n        const localDateStr = convertUtcToLocalYMD(utcDate, selectedTimeZone);\n\n        if (!grouped[localDateStr]) {\n            grouped[localDateStr] = [];\n        }\n        grouped[localDateStr].push(event);\n    }\n\n    return grouped;\n}\n\nfunction convertUtcToLocalYMD(utcDate: Date, timeZone: string): string {\n    const parts = new Intl.DateTimeFormat(\"en-CA\", {\n        timeZone,\n        year: \"numeric\",\n        month: \"2-digit\",\n        day: \"2-digit\",\n    }).formatToParts(utcDate);\n\n    const y = parts.find(p => p.type === \"year\")?.value!;\n    const m = parts.find(p => p.type === \"month\")?.value!;\n    const d = parts.find(p => p.type === \"day\")?.value!;\n\n    return `${y}-${m}-${d}`; // e.g., 2025-07-30\n}","import React, { Dispatch, FC, useMemo, useRef, useState } from \"react\";\nimport { getDateFilterData } from \"../functions/getDateFilterData\";\nimport {\n  fallbackTimeZones,\n  formatTimeInZone,\n  formatZoneLabel,\n} from \"../../../../../utils/datesAndTimes\";\nimport { Dictionary } from \"../../../../../types/Dictionary\";\nimport { EcoCal } from \"../../../../../types/EcoCal\";\nimport { Dropdown } from \"../elements/Dropdown\";\nimport { LangDropdown } from \"../elements/LangDropdown\";\nimport { DateRangePicker } from \"../elements/DateRangePicker\";\nimport { DatePicker } from \"../elements/DatePicker\";\n\n/**\n * Mobile UI (matches reference):\n * - Top bar: Timezone dropdown + Filters button with badge.\n * - Filters open as a bottom drawer (no gaps to window edges).\n * - Drawer animates in/out.\n * - Drawer content scrolls, footer is pinned (Clear All / Apply).\n */\n\nconst allTimeZones = Intl.supportedValuesOf?.(\"timeZone\") || fallbackTimeZones;\n\ninterface EconomicCalendarFiltersProps {\n  countryOptions: { name: string; code: string }[];\n  t: Dictionary[\"economicCalendar\"];\n  isSmall: boolean;\n  now: Date;\n\n  impact: \"High\" | \"Low\" | \"Medium\" | \"Impact\";\n  setImpact: (impact: \"High\" | \"Low\" | \"Medium\" | \"Impact\") => void;\n\n  selectedCountries: string[];\n  setSelectedCountries: Dispatch<React.SetStateAction<string[]>>;\n\n  selectedDateRange: EcoCal.StringDateRange;\n  setSelectedDateRange: (range: EcoCal.StringDateRange) => void;\n\n  selectedTimeZone: string;\n  setSelectedTimeZone: (zone: string) => void;\n\n  selectedLang: string;\n  setSelectedLang: (lang: string) => void;\n  hideCountryFilter?: boolean;\n  hideImpactFilter?: boolean;\n}\n\n// We show currency “USD/GBP…” like screenshot, but store COUNTRY CODE (iso).\nconst COUNTRY_CURRENCY_MAP: Record<string, string> = {\n  us: \"USD\",\n  cn: \"CNY\",\n  jp: \"JPY\",\n  gb: \"GBP\",\n  de: \"EUR\",\n  ca: \"CAD\",\n  fr: \"EUR\",\n  au: \"AUD\",\n  it: \"EUR\",\n  kr: \"KRW\",\n  es: \"EUR\",\n  br: \"BRL\",\n  ch: \"CHF\",\n  in: \"INR\",\n  eu: \"EUR\",\n};\n\nconst LANG_CHIPS = [\"AR\", \"CN\", \"CZ\", \"DE\", \"EN\", \"ES\", \"ES-MX\"] as const;\n\ntype ImpactChip = \"Low\" | \"Medium\" | \"High\";\ntype PeriodChip = EcoCal.DateFilterKey;\n\n// ------------------------- BottomDrawer (inline) ------------------------------\n\ntype BottomDrawerProps = {\n  open: boolean;\n  onClose: () => void;\n  title?: React.ReactNode;\n  children: React.ReactNode;\n};\n\nconst BottomDrawer: FC<BottomDrawerProps> = ({\n  open,\n  onClose,\n  title,\n  children,\n}) => {\n  const [mounted, setMounted] = useState(open);\n  const [visible, setVisible] = useState(open);\n\n  // mount/unmount with animation\n  React.useEffect(() => {\n    if (open) {\n      setMounted(true);\n      requestAnimationFrame(() => setVisible(true));\n    } else {\n      setVisible(false);\n      const t = window.setTimeout(() => setMounted(false), 220);\n      return () => window.clearTimeout(t);\n    }\n  }, [open]);\n\n  // ESC to close\n  React.useEffect(() => {\n    if (!open) return;\n    const handler = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") onClose();\n    };\n    window.addEventListener(\"keydown\", handler);\n    return () => window.removeEventListener(\"keydown\", handler);\n  }, [open, onClose]);\n\n  // prevent background scroll\n  React.useEffect(() => {\n    if (!open) return;\n    const prev = document.body.style.overflow;\n    document.body.style.overflow = \"hidden\";\n    return () => {\n      document.body.style.overflow = prev;\n    };\n  }, [open]);\n\n  if (!mounted) return null;\n\n  const overlay: React.CSSProperties = {\n    position: \"fixed\",\n    inset: 0,\n    background: \"rgba(0,0,0,0.35)\",\n    opacity: visible ? 1 : 0,\n    transition: \"opacity 220ms ease\",\n    zIndex: 9999,\n    display: \"flex\",\n    alignItems: \"flex-end\",\n    justifyContent: \"center\",\n  };\n\n  const sheet: React.CSSProperties = {\n    width: \"100vw\", // no gaps to edges\n    maxWidth: \"100vw\",\n    height: \"min(72vh, 720px)\",\n    background: \"white\",\n    borderTopLeftRadius: 12,\n    borderTopRightRadius: 12,\n    boxShadow: \"0 -10px 30px rgba(0,0,0,0.18)\",\n    transform: visible ? \"translateY(0px)\" : \"translateY(24px)\",\n    opacity: visible ? 1 : 0,\n    transition: \"transform 220ms ease, opacity 220ms ease\",\n    display: \"flex\",\n    flexDirection: \"column\",\n    overflow: \"hidden\",\n  };\n\n  const header: React.CSSProperties = {\n    padding: \"14px 16px\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    borderBottom: \"1px solid #E5E7EB\",\n  };\n\n  const titleStyle: React.CSSProperties = {\n    fontSize: 14,\n    fontWeight: 600,\n    color: \"#111827\",\n  };\n\n  const closeBtn: React.CSSProperties = {\n    border: \"none\",\n    background: \"transparent\",\n    cursor: \"pointer\",\n    width: 32,\n    height: 32,\n    borderRadius: 8,\n    fontSize: 18,\n    lineHeight: 1,\n    color: \"#111827\",\n  };\n\n  const stop = (e: React.MouseEvent) => e.stopPropagation();\n\n  return (\n    <div style={overlay} onClick={onClose} role=\"presentation\">\n      <div style={sheet} onClick={stop} role=\"dialog\" aria-modal=\"true\">\n        <div style={header}>\n          <div style={titleStyle}>{title}</div>\n          <button\n            type=\"button\"\n            aria-label=\"Close\"\n            onClick={onClose}\n            style={closeBtn}\n          >\n            ✕\n          </button>\n        </div>\n        {children}\n      </div>\n    </div>\n  );\n};\n\n// ------------------------- Main component -------------------------------------\n\nexport const EconomicCalendarFilters: FC<EconomicCalendarFiltersProps> = ({\n  countryOptions,\n  t,\n  isSmall,\n  now,\n  impact,\n  setImpact,\n  selectedCountries,\n  setSelectedCountries,\n  selectedDateRange,\n  setSelectedDateRange,\n  selectedTimeZone,\n  setSelectedTimeZone,\n  selectedLang,\n  setSelectedLang,\n  hideCountryFilter = false,\n  hideImpactFilter = false,\n}) => {\n  const impactOptions = [\n    { value: \"Impact\", content: t.impact },\n    { value: \"High\", content: t.high },\n    { value: \"Medium\", content: t.medium },\n    { value: \"Low\", content: t.low },\n  ];\n\n  const timeZoneOptions = allTimeZones.map((zone) => ({\n    value: zone,\n    label: formatZoneLabel(zone, now),\n    content: (\n      <div\n        style={{\n          display: \"flex\",\n          justifyContent: \"space-between\",\n          width: \"100%\",\n        }}\n      >\n        <span>{formatZoneLabel(zone, now)}</span>\n        <span style={{ opacity: 0.6 }}>{formatTimeInZone(zone, now)}</span>\n      </div>\n    ),\n  }));\n\n  // ---------- DESKTOP (unchanged layout) ----------\n  if (!isSmall) {\n    const handleQuickDateFilter = (filter: EcoCal.DateFilterKey) => {\n      setSelectedDateRange(getDateFilterData(filter, t, selectedTimeZone).value);\n    };\n\n    const selectedFilterLabel = (): string => {\n      const selectedFilter = (\n        [\n          \"yesterday\",\n          \"today\",\n          \"tomorrow\",\n          \"week\",\n          \"lastWeek\",\n          \"nextWeek\",\n        ] as EcoCal.DateFilterKey[]\n      ).find(\n        (key) =>\n          getDateFilterData(key, t, selectedTimeZone).value.start ===\n            selectedDateRange.start &&\n          getDateFilterData(key, t, selectedTimeZone).value.end ===\n            selectedDateRange.end\n      );\n\n      return selectedFilter\n        ? getDateFilterData(selectedFilter, t, selectedTimeZone).label\n        : t.customRange;\n    };\n\n    return (\n      <div\n        style={{\n          width: \"100%\",\n          display: \"flex\",\n          flexWrap: \"wrap\",\n          justifyContent: \"space-between\",\n          gap: \"1rem\",\n        }}\n      >\n        <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n          {/* Impact Dropdown */}\n          {!hideImpactFilter && <div style={{ width: 160 }}>\n            <Dropdown\n              label={\n                impactOptions.find((opt) => opt.value === impact)?.content ||\n                \"Impact\"\n              }\n              items={impactOptions}\n              onSelect={(value) => setImpact(value as typeof impact)}\n              selected={impact}\n            />\n          </div>}\n\n          {/* Country Dropdown */}\n          {!hideCountryFilter && <div style={{ width: 160 }}>\n            <Dropdown\n              label={t.countries}\n              items={countryOptions.map(({ name, code }) => ({\n                content: (\n                  <div\n                    style={{\n                      display: \"flex\",\n                      alignItems: \"center\",\n                      gap: \"0.5rem\",\n                    }}\n                  >\n                    <img\n                      src={`https://flagcdn.com/w40/${code}.png`}\n                      alt={`${name} flag`}\n                      style={{\n                        width: \"24px\",\n                        height: \"16px\",\n                        borderRadius: \"4px\",\n                        objectFit: \"cover\",\n                      }}\n                    />\n                    <span>{name}</span>\n                  </div>\n                ),\n                value: code,\n              }))}\n              onSelect={(value) => {\n                const code = value as string;\n                setSelectedCountries((prev) =>\n                  prev.includes(code)\n                    ? prev.filter((c) => c !== code)\n                    : [...prev, code]\n                );\n              }}\n              selected={selectedCountries}\n              multiple\n            />\n          </div>}\n\n          {/* Quick Date Filters */}\n          <div style={{ width: 160 }}>\n            <Dropdown\n              label={selectedFilterLabel() || \"Quick Date Filter\"}\n              items={(\n                [\n                  \"yesterday\",\n                  \"today\",\n                  \"tomorrow\",\n                  \"week\",\n                  \"lastWeek\",\n                  \"nextWeek\",\n                ] as EcoCal.DateFilterKey[]\n              ).map((key) => ({\n                content: getDateFilterData(key, t, selectedTimeZone).label,\n                value: key,\n              }))}\n              onSelect={(value) =>\n                handleQuickDateFilter(value as EcoCal.DateFilterKey)\n              }\n              selected={selectedFilterLabel()}\n            />\n          </div>\n\n          {/* Date Range */}\n          <div style={{ minWidth: 160, width: \"fit-content\", height: 40 }}>\n            <DateRangePicker\n              t={t.holaPrime.dateRangePicker}\n              value={selectedDateRange}\n              onChange={(date) => setSelectedDateRange(date)}\n            />\n          </div>\n        </div>\n\n        <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"1rem\" }}>\n          {/* Time Zone Dropdown */}\n          <div style={{ width: \"160px\" }}>\n            <Dropdown\n              label={formatZoneLabel(selectedTimeZone, now)}\n              items={timeZoneOptions}\n              onSelect={(value) => setSelectedTimeZone(value as string)}\n              selected={selectedTimeZone}\n              searchable\n            />\n          </div>\n\n          {/* Language Selector */}\n          <div style={{ width: \"82px\" }}>\n            <LangDropdown\n              selected={selectedLang}\n              onSelect={(lang) => setSelectedLang(lang)}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  // ---------- MOBILE (bottom drawer, matches screenshot) ----------\n  const [open, setOpen] = useState(false);\n\n  // Draft state (Apply commits)\n  const [draftImpact, setDraftImpact] = useState<ImpactChip | null>(() => {\n    if (impact === \"High\" || impact === \"Medium\" || impact === \"Low\")\n      return impact;\n    return null;\n  });\n  const [draftCountries, setDraftCountries] = useState<string[]>(\n    () => selectedCountries\n  );\n  const [draftLang, setDraftLang] = useState<string>(() => selectedLang);\n  const [draftRange, setDraftRange] = useState<EcoCal.StringDateRange>(\n    () => selectedDateRange\n  );\n\n  const openDrawer = () => {\n    setDraftImpact(\n      impact === \"High\" || impact === \"Medium\" || impact === \"Low\"\n        ? impact\n        : null\n    );\n    setDraftCountries(selectedCountries);\n    setDraftLang(selectedLang);\n    setDraftRange(selectedDateRange);\n    setOpen(true);\n  };\n\n  const apply = () => {\n    setImpact(draftImpact ?? \"Impact\");\n    setSelectedCountries(draftCountries);\n    setSelectedLang(draftLang);\n    setSelectedDateRange(draftRange);\n    setOpen(false);\n  };\n\n  const clearAll = () => {\n    setDraftImpact(null);\n    setDraftCountries([]);\n    setDraftLang(\"EN\");\n    setDraftRange(getDateFilterData(\"today\", t, selectedTimeZone).value);\n  };\n\n  const periodKeys: PeriodChip[] = [\n    \"yesterday\",\n    \"today\",\n    \"tomorrow\",\n    \"week\",\n    \"lastWeek\",\n    \"nextWeek\",\n  ];\n\n  const currentPeriodKey = useMemo(() => {\n    const found = periodKeys.find((k) => {\n      const v = getDateFilterData(k, t, selectedTimeZone).value;\n      return v.start === draftRange.start && v.end === draftRange.end;\n    });\n    return found || null;\n  }, [draftRange.start, draftRange.end, selectedTimeZone, t]);\n\n  const currencyChips = useMemo(() => {\n    const codes = countryOptions\n      .map((c) => c.code.toLowerCase())\n      .filter((code) => COUNTRY_CURRENCY_MAP[code]);\n\n    const byCurrency: Record<string, string> = {};\n    for (const code of codes) {\n      const cur = COUNTRY_CURRENCY_MAP[code];\n      if (!byCurrency[cur]) byCurrency[cur] = code;\n    }\n\n    const preferredOrder = [\n      \"USD\",\n      \"GBP\",\n      \"CAD\",\n      \"JPY\",\n      \"AUD\",\n      \"CNY\",\n      \"EUR\",\n      \"CHF\",\n      \"NZD\",\n      \"BRL\",\n      \"KRW\",\n      \"INR\",\n    ];\n\n    const entries = Object.entries(byCurrency);\n    entries.sort((a, b) => {\n      const ai = preferredOrder.indexOf(a[0]);\n      const bi = preferredOrder.indexOf(b[0]);\n      if (ai === -1 && bi === -1) return a[0].localeCompare(b[0]);\n      if (ai === -1) return 1;\n      if (bi === -1) return -1;\n      return ai - bi;\n    });\n\n    return entries.map(([currency, code]) => ({ currency, code }));\n  }, [countryOptions]);\n\n  const setQuickPeriod = (key: EcoCal.DateFilterKey) => {\n    setDraftRange(getDateFilterData(key, t, selectedTimeZone).value);\n  };\n\n  const formatChipDate = (dateStr: string) => {\n    const d = new Date(dateStr + \"T00:00:00\");\n    return d.toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" }); // \"4 Nov\"\n  };\n\n  const onChangeDate = (type: \"start\" | \"end\", value: string) => {\n    if (!value) return;\n    setDraftRange((prev) => ({ ...prev, [type]: value }));\n  };\n\n  const ImpactDot = ({ type }: { type: ImpactChip }) => {\n    const color =\n      type === \"Low\" ? \"#F59E0B\" : type === \"Medium\" ? \"#2563EB\" : \"#EF4444\";\n    return (\n      <span\n        style={{\n          width: 8,\n          height: 8,\n          borderRadius: 999,\n          background: color,\n          display: \"inline-block\",\n        }}\n      />\n    );\n  };\n\n  const SectionTitle = ({ children }: { children: React.ReactNode }) => (\n    <div style={{ fontSize: 12, color: \"#6B7280\", marginBottom: 10 }}>\n      {children}\n    </div>\n  );\n\n  const Divider = () => (\n    <div style={{ height: 1, background: \"#E5E7EB\", margin: \"14px 0\" }} />\n  );\n\n  const clearAllStyle: React.CSSProperties = {\n    border: \"none\",\n    background: \"transparent\",\n    color: \"#111827\",\n    fontSize: 14,\n    fontWeight: 600,\n    cursor: \"pointer\",\n  };\n\n  const applyStyle: React.CSSProperties = {\n    minWidth: 140,\n    height: 40,\n    borderRadius: 6,\n    border: \"1px solid #0B5ED7\",\n    background: \"#0B5ED7\",\n    color: \"white\",\n    fontSize: 14,\n    cursor: \"pointer\",\n    fontWeight: 500,\n  };\n\n  const Chip = ({\n    selected,\n    children,\n    onClick,\n  }: {\n    selected: boolean;\n    children: React.ReactNode;\n    onClick: () => void;\n  }) => (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      style={{\n        borderRadius: 999,\n        border: selected ? \"1px solid #111827\" : \"1px solid #E5E7EB\",\n        background: \"white\",\n        padding: \"8px 12px\",\n        fontSize: 12,\n        lineHeight: \"14px\",\n        cursor: \"pointer\",\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        gap: 8,\n        color: \"#111827\",\n      }}\n    >\n      {children}\n    </button>\n  );\n\n  // badge count like screenshot (top-right on Filters)\n  const activeCount =\n    (impact !== \"Impact\" ? 1 : 0) +\n    (selectedCountries.length > 0 ? 1 : 0) +\n    (selectedLang !== \"EN\" ? 1 : 0) +\n    (() => {\n      const today = getDateFilterData(\"today\", t, selectedTimeZone).value;\n      return selectedDateRange.start !== today.start ||\n        selectedDateRange.end !== today.end\n        ? 1\n        : 0;\n    })();\n\n  const FiltersButton = () => (\n    <button\n      type=\"button\"\n      onClick={openDrawer}\n      style={{\n        height: 40,\n        padding: \"0 12px\",\n        borderRadius: 6,\n        border: \"2px solid #0B5ED7\",\n        background: \"white\",\n        color: \"#0B5ED7\",\n        fontSize: 14,\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: 8,\n        cursor: \"pointer\",\n        position: \"relative\",\n        whiteSpace: \"nowrap\",\n        fontWeight: 500,\n      }}\n    >\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n        <path\n          d=\"M4 6h16M7 12h10M10 18h4\"\n          stroke=\"#0B5ED7\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n        />\n      </svg>\n      Filters\n      {activeCount > 0 && (\n        <span\n          style={{\n            position: \"absolute\",\n            top: -7,\n            right: -7,\n            width: 18,\n            height: 18,\n            borderRadius: 999,\n            background: \"#0B5ED7\",\n            color: \"white\",\n            fontSize: 12,\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            fontWeight: 600,\n          }}\n        >\n          {activeCount}\n        </span>\n      )}\n    </button>\n  );\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        display: \"flex\",\n        justifyContent: \"space-between\",\n        gap: 12,\n      }}\n    >\n      {/* Timezone (left) */}\n      <div style={{ flex: 1, minWidth: 0 }}>\n        <Dropdown\n          label={formatZoneLabel(selectedTimeZone, now)}\n          items={timeZoneOptions}\n          onSelect={(value) => setSelectedTimeZone(value as string)}\n          selected={selectedTimeZone}\n          searchable\n        />\n      </div>\n\n      {/* Filters button (right) */}\n      <FiltersButton />\n\n      {/* Bottom Drawer */}\n      <BottomDrawer\n        open={open}\n        onClose={() => setOpen(false)}\n        title=\"Account Filters\"\n      >\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            flex: 1,\n            minHeight: 0,\n          }}\n        >\n          <div\n            style={{ flex: 1, minHeight: 0, overflowY: \"auto\", padding: 16 }}\n          >\n            {/* Scrollable content */}\n            <div\n              style={{ flex: 1, minHeight: 0, overflowY: \"auto\", padding: 16 }}\n            >\n              {/* Impact */}\n              <SectionTitle>Impact</SectionTitle>\n              <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 10 }}>\n                {([\"Low\", \"Medium\", \"High\"] as ImpactChip[]).map((x) => (\n                  <Chip\n                    key={x}\n                    selected={draftImpact === x}\n                    onClick={() =>\n                      setDraftImpact((prev) => (prev === x ? null : x))\n                    }\n                  >\n                    <ImpactDot type={x} />\n                    {x}\n                  </Chip>\n                ))}\n              </div>\n\n              <Divider />\n\n              {!hideCountryFilter && <>\n              {/* Impacted Currency */}\n              <SectionTitle>Impacted Currency</SectionTitle>\n              <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 10 }}>\n                <Chip\n                  selected={draftCountries.length === 0}\n                  onClick={() => setDraftCountries([])}\n                >\n                  All\n                </Chip>\n\n                {currencyChips.map(({ currency, code }) => {\n                  const selected = draftCountries.includes(code);\n                  return (\n                    <Chip\n                      key={currency}\n                      selected={selected}\n                      onClick={() =>\n                        setDraftCountries((prev) =>\n                          prev.includes(code)\n                            ? prev.filter((c) => c !== code)\n                            : [...prev, code]\n                        )\n                      }\n                    >\n                      {currency}\n                    </Chip>\n                  );\n                })}\n              </div>\n\n              <Divider />\n              </>}\n\n              {/* Time Period */}\n              <SectionTitle>Time Period</SectionTitle>\n              <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 10 }}>\n                {(\n                  [\n                    \"yesterday\",\n                    \"today\",\n                    \"tomorrow\",\n                    \"week\",\n                    \"lastWeek\",\n                  ] as EcoCal.DateFilterKey[]\n                ).map((k) => (\n                  <Chip\n                    key={k}\n                    selected={currentPeriodKey === k}\n                    onClick={() => setQuickPeriod(k)}\n                  >\n                    {getDateFilterData(k, t, selectedTimeZone).label}\n                  </Chip>\n                ))}\n              </div>\n\n              <Divider />\n\n              {/* Language */}\n              <SectionTitle>Language</SectionTitle>\n              <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 10 }}>\n                {LANG_CHIPS.map((lng) => (\n                  <Chip\n                    key={lng}\n                    selected={draftLang === lng}\n                    onClick={() => setDraftLang(lng)}\n                  >\n                    {lng}\n                  </Chip>\n                ))}\n              </div>\n\n              <Divider />\n\n              {/* Custom Dates */}\n              <SectionTitle>Custom Dates</SectionTitle>\n              <div style={{ display: \"flex\", gap: 10 }}>\n                <div style={{ flex: 1 }}>\n                  <div\n                    style={{ fontSize: 11, color: \"#6B7280\", marginBottom: 6 }}\n                  >\n                    From\n                  </div>\n                  <DatePicker\n                    value={draftRange.start}\n                    onChange={(v) => onChangeDate(\"start\", v)}\n                  />\n                </div>\n\n                <div style={{ flex: 1 }}>\n                  <div\n                    style={{ fontSize: 11, color: \"#6B7280\", marginBottom: 6 }}\n                  >\n                    To\n                  </div>\n                  <DatePicker\n                    value={draftRange.end}\n                    onChange={(v) => onChangeDate(\"end\", v)}\n                  />\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div\n            style={{\n              borderTop: \"1px solid #E5E7EB\",\n              padding: \"12px 16px\",\n              display: \"flex\",\n              justifyContent: \"space-between\",\n              alignItems: \"center\",\n              background: \"white\",\n            }}\n          >\n            <button type=\"button\" onClick={clearAll} style={clearAllStyle}>\n              Clear All\n            </button>\n\n            <button type=\"button\" onClick={apply} style={applyStyle}>\n              Apply\n            </button>\n          </div>\n        </div>\n      </BottomDrawer>\n    </div>\n  );\n};\n","import { Dictionary } from \"../../../../../types/Dictionary\";\nimport { EcoCal } from \"../../../../../types/EcoCal\";\nimport {\n    addDaysToDateString,\n    formatDateInTimeZone,\n} from \"../../../../../utils/datesAndTimes\";\n\nexport const getDateFilterData = (\n    key: EcoCal.DateFilterKey,\n    t: Dictionary[\"economicCalendar\"],\n    timeZone = \"UTC\"\n): { label: string; value: EcoCal.StringDateRange } => {\n    const today = formatDateInTimeZone(new Date(), timeZone);\n    const weekday = new Date(`${today}T00:00:00Z`).getUTCDay();\n    const yesterday = addDaysToDateString(today, -1);\n    const tomorrow = addDaysToDateString(today, 1);\n\n    switch (key) {\n        case \"yesterday\":\n            return {\n                label: t.yesterday,\n                value: { start: yesterday, end: yesterday },\n            };\n        case \"today\":\n            return {\n                label: t.today,\n                value: { start: today, end: today },\n            };\n        case \"tomorrow\":\n            return {\n                label: t.tomorrow,\n                value: { start: tomorrow, end: tomorrow },\n            };\n        case \"week\":\n            return {\n                label: t.thisWeek,\n                value: {\n                    start: addDaysToDateString(today, -((weekday + 6) % 7)),\n                    end: addDaysToDateString(today, (7 - weekday) % 7),\n                },\n            };\n        case \"lastWeek\":\n            return {\n                label: t.lastWeek,\n                value: {\n                    start: addDaysToDateString(today, -((weekday + 6) % 7) - 7),\n                    end: addDaysToDateString(today, -((weekday + 6) % 7) - 1),\n                }\n            };\n        case \"nextWeek\":\n            const daysUntilNextMonday = (8 - weekday) % 7 || 7;\n            return {\n                label: t.nextWeek,\n                value: {\n                    start: addDaysToDateString(today, daysUntilNextMonday),\n                    end: addDaysToDateString(today, daysUntilNextMonday + 6),\n                }\n            };\n    }\n};\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { FC, useState } from 'react';\nimport { FaChevronDown } from 'react-icons/fa6';\nimport { HiCheck } from 'react-icons/hi2';\nimport { adjustColorContrast } from '../../../../../utils/colors';\n\ntype BaseItem = {\n    content: React.ReactNode | string;\n    value: string | number;\n};\n\ntype SearchableItem = BaseItem & { label: string };\ntype NonSearchableItem = BaseItem;\n\ntype DropdownProps =\n    | {\n        label: React.ReactNode | string;\n        items: SearchableItem[];\n        selected: string | number | (string | number)[];\n        onSelect: (value: string | number) => void;\n        multiple?: boolean;\n        searchable: true;\n        searchPlaceholder?: string;\n    }\n    | {\n        label: React.ReactNode | string;\n        items: NonSearchableItem[];\n        selected: string | number | (string | number)[];\n        onSelect: (value: string | number) => void;\n        multiple?: boolean;\n        searchable?: false;\n        searchPlaceholder?: string;\n    };\n\nconst Dropdown: FC<DropdownProps> = (props) => {\n    const { label, items, selected, onSelect, multiple = false, searchable = false, searchPlaceholder } = props;\n\n    const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n    const [filterText, setFilterText] = useState<string>(\"\");\n\n    if (multiple && !Array.isArray(selected)) {\n        throw new Error('When multiple is true, selected must be an array.');\n    }\n\n    // Runtime check (optional but helpful)\n    if (searchable) {\n        for (const item of items) {\n            if (!(item as SearchableItem).label) {\n                throw new Error(\"All items must have a `label` when `searchable` is true.\");\n            }\n        }\n    }\n\n    const triggerStyle: React.CSSProperties = {\n        background: 'white',\n        color: 'black',\n        borderRadius: '4px',\n        fontSize: '14px',\n        fontWeight: 'normal',\n        border: '1px solid lightgray',\n        display: 'flex',\n        gap: '0.5rem',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        padding: '0.5rem',\n        cursor: 'pointer',\n        whiteSpace: 'nowrap',\n        width: '100%',\n        height: 40,\n    };\n\n    const contentStyle: React.CSSProperties = {\n        background: 'white',\n        color: 'black',\n        border: '1px solid lightgray',\n        boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n        fontSize: 'inherit',\n        maxHeight: '16rem',\n        overflowY: 'auto',\n        borderRadius: '4px',\n        minWidth: '10rem',\n        zIndex: 50,\n    };\n\n    const itemBaseStyle: React.CSSProperties = {\n        display: 'flex',\n        alignItems: 'center',\n        gap: '0.5rem',\n        padding: '0.5rem',\n        cursor: 'pointer',\n        width: '100%',\n        background: 'transparent',\n        transition: 'background 0.2s ease-in-out',\n    };\n\n    const hoverColor = adjustColorContrast('#ffffff', 20);\n\n    const filteredItems = searchable\n        ? (items as SearchableItem[]).filter(item =>\n            item.label.toLowerCase().includes(filterText.toLowerCase())\n        )\n        : items;\n\n    return (\n        <DropdownMenu.Root>\n            <DropdownMenu.Trigger asChild>\n                <div style={triggerStyle}>\n                    {label}\n                    <FaChevronDown />\n                </div>\n            </DropdownMenu.Trigger>\n\n            <DropdownMenu.Portal>\n                <DropdownMenu.Content sideOffset={4} style={contentStyle}>\n                    {searchable && (\n                        <div\n                            style={{\n                                position: 'sticky',\n                                top: 0,\n                                background: 'white',\n                                paddingBottom: '0.25rem',\n                                zIndex: 1,\n                            }}\n                        >\n                            <input\n                                type=\"text\"\n                                placeholder={searchPlaceholder || 'Search...'}\n                                value={filterText}\n                                onChange={(e) => setFilterText(e.target.value)}\n                                onKeyDown={(e) => e.stopPropagation()}\n                                style={{\n                                    width: '100%',\n                                    padding: '0.4rem 0.6rem',\n                                    borderRadius: '4px',\n                                    border: '1px solid #ccc',\n                                    fontSize: 'inherit',\n                                }}\n                            />\n                        </div>\n                    )}\n\n                    {filteredItems.map((item, index) => {\n                        const isSelected = Array.isArray(selected)\n                            ? selected.includes(item.value)\n                            : selected === item.value;\n\n                        const isHovered = hoveredIndex === index;\n\n                        const itemStyle = {\n                            ...itemBaseStyle,\n                            backgroundColor: isHovered ? hoverColor : 'transparent',\n                        };\n\n                        return (\n                            <DropdownMenu.Item\n                                key={item.value}\n                                onSelect={(e) => {\n                                    if (multiple) e.preventDefault(); // keep open\n                                    onSelect(item.value);\n                                }}\n                                onMouseEnter={() => setHoveredIndex(index)}\n                                onMouseLeave={() => setHoveredIndex(null)}\n                                style={itemStyle}\n                            >\n                                {\n                                    multiple && <div style={{\n                                        width: '1rem',\n                                        height: '1rem',\n                                        display: 'flex',\n                                        alignItems: 'center',\n                                        justifyContent: 'center'\n                                    }}>\n                                        {isSelected && <HiCheck />}\n                                    </div>\n                                }\n\n                                {item.content}\n                            </DropdownMenu.Item>\n                        );\n                    })}\n                </DropdownMenu.Content>\n            </DropdownMenu.Portal>\n        </DropdownMenu.Root>\n    );\n};\n\nexport { Dropdown };","import { FC, useEffect, useState } from 'react';\nimport { fetchLangs } from '../../../../../functions/fetchLangs';\nimport { Dropdown } from './Dropdown';\n\nexport interface LangDropdownProps {\n    selected: string | string[];\n    onSelect: (lang: string) => void;\n    multiple?: boolean;\n}\n\nconst LangDropdown: FC<LangDropdownProps> = ({\n    selected,\n    onSelect,\n    multiple = false,\n}) => {\n    const [langs, setLangs] = useState<string[]>([\"EN\"]);\n\n    useEffect(() => {\n        console.log(\"Fetching languages...\");\n        const fetchLanguages = async () => {\n            const fetchedLangs = await fetchLangs();\n            setLangs(fetchedLangs);\n        };\n        fetchLanguages();\n    }, []);\n\n    return <Dropdown\n        label={selected}\n        items={langs.map(lang => ({\n            value: lang,\n            label: lang,\n            content: lang,\n        }))}\n        onSelect={(value) => onSelect(value as string)}\n        selected={selected}\n        searchable\n    />;\n};\n\nexport { LangDropdown };","import { EcoCal } from \"../../../../../types/EcoCal\";\nimport { Popover, PopoverContent, PopoverPortal, PopoverTrigger } from \"@radix-ui/react-popover\";\nimport { Calendar } from \"../../../../Calendar\";\nimport { useEffect, useState } from \"react\";\nimport { StringDatePicker } from \"../../../../StringDatePicker\";\nimport { EconomicCalendarDictionary } from \"../../../../../types/Dictionary\";\n\n// validate user input: MM/DD/YYYY\nfunction verifyDateString(dateStr: string): boolean {\n    const formatMatch = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/.test(dateStr);\n    if (!formatMatch) return false;\n\n    const [month, day, year] = dateStr.split('/').map(Number);\n    const date = new Date(year, month - 1, day);\n    return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;\n}\n\nfunction toInputValue(dateStr: string): string {\n    const [year, month, day] = dateStr.split('-');\n    return `${month}/${day}/${year}`;\n}\n\nfunction toCalendarValue(dateStr: string): string {\n    const [month, day, year] = dateStr.split('/');\n    return `${year}-${month}-${day}`;\n}\n\nconst DateRangePicker = ({\n    t,\n    value,\n    onChange,\n}: {\n    t: EconomicCalendarDictionary[\"holaPrime\"][\"dateRangePicker\"];\n    value: EcoCal.StringDateRange;\n    onChange?: (value: EcoCal.StringDateRange) => void;\n}) => {\n    const [open, setOpen] = useState(false);\n    const [localValue, setLocalValue] = useState<EcoCal.StringDateRange>(value);\n    const [localInputValue, setLocalInputValue] = useState<EcoCal.StringDateRange>({\n        start: toInputValue(value.start),\n        end: toInputValue(value.end),\n    });\n    const [wrongInput, setWrongInput] = useState<{ start: boolean; end: boolean }>({ start: false, end: false });\n    const [isSmall, setIsSmall] = useState<boolean>(false);\n\n    useEffect(() => {\n        if (typeof window === 'undefined') return;\n        const handleResize = () => {\n            setIsSmall(window.innerWidth < 850);\n        };\n        window.addEventListener('resize', handleResize);\n        handleResize();\n        return () => window.removeEventListener('resize', handleResize);\n    }, []);\n\n    useEffect(() => {\n        setLocalValue(value);\n        setLocalInputValue({\n            start: toInputValue(value.start),\n            end: toInputValue(value.end),\n        });\n    }, [value]);\n\n    const handleChangeInput = (date: string, type: \"start\" | \"end\") => {\n        if (!verifyDateString(date)) {\n            setWrongInput(prev => ({ ...prev, [type]: true }));\n        } else {\n            setWrongInput(prev => ({ ...prev, [type]: false }));\n            const cal = toCalendarValue(date); // -> YYYY-MM-DD\n            setLocalValue(prev => ({ ...prev, [type]: cal }));\n        }\n        setLocalInputValue(prev => ({ ...prev, [type]: date }));\n    };\n\n    const handleChangeCalendar = (date: string, type: \"start\" | \"end\") => {\n        const newRange: EcoCal.StringDateRange = {\n            start: type === \"start\" ? date : localValue.start,\n            end: type === \"end\" ? date : localValue.end,\n        };\n        setLocalValue(newRange);\n\n        const newInputRange: EcoCal.StringDateRange = {\n            start: type === \"start\" ? toInputValue(date) : localInputValue.start,\n            end: type === \"end\" ? toInputValue(date) : localInputValue.end,\n        };\n        setLocalInputValue(newInputRange);\n    };\n\n\n\n    return <Popover open={open} onOpenChange={setOpen}>\n        <PopoverTrigger style={triggerStyle}>\n            <span style={{ textWrap: 'nowrap' }}>{t.customDates}</span>\n            <svg width={24} height={24} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M19.5 3H17.25V2.25C17.25 2.05109 17.171 1.86032 17.0303 1.71967C16.8897 1.57902 16.6989 1.5 16.5 1.5C16.3011 1.5 16.1103 1.57902 15.9697 1.71967C15.829 1.86032 15.75 2.05109 15.75 2.25V3H8.25V2.25C8.25 2.05109 8.17098 1.86032 8.03033 1.71967C7.88968 1.57902 7.69891 1.5 7.5 1.5C7.30109 1.5 7.11032 1.57902 6.96967 1.71967C6.82902 1.86032 6.75 2.05109 6.75 2.25V3H4.5C4.10218 3 3.72064 3.15804 3.43934 3.43934C3.15804 3.72064 3 4.10218 3 4.5V19.5C3 19.8978 3.15804 20.2794 3.43934 20.5607C3.72064 20.842 4.10218 21 4.5 21H19.5C19.8978 21 20.2794 20.842 20.5607 20.5607C20.842 20.2794 21 19.8978 21 19.5V4.5C21 4.10218 20.842 3.72064 20.5607 3.43934C20.2794 3.15804 19.8978 3 19.5 3ZM6.75 4.5V5.25C6.75 5.44891 6.82902 5.63968 6.96967 5.78033C7.11032 5.92098 7.30109 6 7.5 6C7.69891 6 7.88968 5.92098 8.03033 5.78033C8.17098 5.63968 8.25 5.44891 8.25 5.25V4.5H15.75V5.25C15.75 5.44891 15.829 5.63968 15.9697 5.78033C16.1103 5.92098 16.3011 6 16.5 6C16.6989 6 16.8897 5.92098 17.0303 5.78033C17.171 5.63968 17.25 5.44891 17.25 5.25V4.5H19.5V7.5H4.5V4.5H6.75ZM19.5 19.5H4.5V9H19.5V19.5ZM13.125 12.375C13.125 12.5975 13.059 12.815 12.9354 13C12.8118 13.185 12.6361 13.3292 12.4305 13.4144C12.225 13.4995 11.9988 13.5218 11.7805 13.4784C11.5623 13.435 11.3618 13.3278 11.2045 13.1705C11.0472 13.0132 10.94 12.8127 10.8966 12.5945C10.8532 12.3762 10.8755 12.15 10.9606 11.9445C11.0458 11.7389 11.19 11.5632 11.375 11.4396C11.56 11.316 11.7775 11.25 12 11.25C12.2984 11.25 12.5845 11.3685 12.7955 11.5795C13.0065 11.7905 13.125 12.0766 13.125 12.375ZM17.25 12.375C17.25 12.5975 17.184 12.815 17.0604 13C16.9368 13.185 16.7611 13.3292 16.5555 13.4144C16.35 13.4995 16.1238 13.5218 15.9055 13.4784C15.6873 13.435 15.4868 13.3278 15.3295 13.1705C15.1722 13.0132 15.065 12.8127 15.0216 12.5945C14.9782 12.3762 15.0005 12.15 15.0856 11.9445C15.1708 11.7389 15.315 11.5632 15.5 11.4396C15.685 11.316 15.9025 11.25 16.125 11.25C16.4234 11.25 16.7095 11.3685 16.9205 11.5795C17.1315 11.7905 17.25 12.0766 17.25 12.375ZM9 16.125C9 16.3475 8.93402 16.565 8.8104 16.75C8.68679 16.935 8.51109 17.0792 8.30552 17.1644C8.09995 17.2495 7.87375 17.2718 7.65552 17.2284C7.43729 17.185 7.23684 17.0778 7.0795 16.9205C6.92217 16.7632 6.81502 16.5627 6.77162 16.3445C6.72821 16.1262 6.75049 15.9 6.83564 15.6945C6.92078 15.4889 7.06498 15.3132 7.24998 15.1896C7.43499 15.066 7.6525 15 7.875 15C8.17337 15 8.45952 15.1185 8.6705 15.3295C8.88147 15.5405 9 15.8266 9 16.125ZM13.125 16.125C13.125 16.3475 13.059 16.565 12.9354 16.75C12.8118 16.935 12.6361 17.0792 12.4305 17.1644C12.225 17.2495 11.9988 17.2718 11.7805 17.2284C11.5623 17.185 11.3618 17.0778 11.2045 16.9205C11.0472 16.7632 10.94 16.5627 10.8966 16.3445C10.8532 16.1262 10.8755 15.9 10.9606 15.6945C11.0458 15.4889 11.19 15.3132 11.375 15.1896C11.56 15.066 11.7775 15 12 15C12.2984 15 12.5845 15.1185 12.7955 15.3295C13.0065 15.5405 13.125 15.8266 13.125 16.125ZM17.25 16.125C17.25 16.3475 17.184 16.565 17.0604 16.75C16.9368 16.935 16.7611 17.0792 16.5555 17.1644C16.35 17.2495 16.1238 17.2718 15.9055 17.2284C15.6873 17.185 15.4868 17.0778 15.3295 16.9205C15.1722 16.7632 15.065 16.5627 15.0216 16.3445C14.9782 16.1262 15.0005 15.9 15.0856 15.6945C15.1708 15.4889 15.315 15.3132 15.5 15.1896C15.685 15.066 15.9025 15 16.125 15C16.4234 15 16.7095 15.1185 16.9205 15.3295C17.1315 15.5405 17.25 15.8266 17.25 16.125Z\" fill=\"#7E84A3\" />\n            </svg>\n        </PopoverTrigger>\n        <PopoverPortal>\n            <PopoverContent style={popoverContentStyle}>\n                {\n                    isSmall ? (\n                        <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', padding: '1rem' }}>\n                            <h3 style={titleStyle}>{t.selectDateRange}</h3>\n                            <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n                                <label style={labelStyle}>{t.startDate}</label>\n                                <StringDatePicker value={localValue.start} onChange={(date) => handleChangeCalendar(date, \"start\")} />\n                            </div>\n                            <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n                                <label style={labelStyle}>{t.endDate}</label>\n                                <StringDatePicker value={localValue.end} onChange={(date) => handleChangeCalendar(date, \"end\")} />\n                            </div>\n                        </div>\n                    ) : (\n                        <div style={{ maxWidth: \"100%\" }}>\n                            <div style={{ display: 'flex', flexWrap: 'wrap', gap: '1rem', padding: '1rem' }}>\n                                <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', padding: '1rem' }}>\n                                    <h3 style={titleStyle}>{t.selectDateRange}</h3>\n                                    <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n                                        <label style={labelStyle}>{t.startDate}</label>\n                                        <input style={inputStyle} value={localInputValue.start} onChange={(e) => handleChangeInput(e.target.value, \"start\")} />\n                                        <span style={{ color: 'red', fontSize: '0.75rem', visibility: wrongInput.start ? 'visible' : 'hidden' }}>Invalid date format. Use MM/DD/YYYY.</span>\n                                    </div>\n                                    <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n                                        <label style={labelStyle}>{t.endDate}</label>\n                                        <input style={inputStyle} value={localInputValue.end} onChange={(e) => handleChangeInput(e.target.value, \"end\")} />\n                                        <span style={{ color: 'red', fontSize: '0.75rem', visibility: wrongInput.end ? 'visible' : 'hidden' }}>Invalid date format. Use MM/DD/YYYY.</span>\n                                    </div>\n                                </div>\n                                <Calendar value={localValue.start} onChange={(date) => handleChangeCalendar(date, \"start\")} />\n                                <Calendar value={localValue.end} onChange={(date) => handleChangeCalendar(date, \"end\")} />\n                            </div>\n                            <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '0 0.5rem 0.5rem 0' }}>\n                                <button style={applyButtonStyle} onClick={() => {\n                                    onChange?.(localValue);\n                                    setOpen(false);\n                                }}>\n                                    {t.apply}\n                                </button>\n                            </div>\n                        </div>\n                    )\n                }\n            </PopoverContent>\n        </PopoverPortal>\n    </Popover>;\n};\n\n\n\nconst triggerStyle: React.CSSProperties = {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    padding: '0.5rem 1rem',\n    width: 'fit-content',\n    fontSize: '14px',\n    border: '1px solid lightgray',\n    borderRadius: '4px',\n    cursor: 'pointer',\n};\n\nconst popoverContentStyle: React.CSSProperties = {\n    maxWidth: \"100vw\",\n    background: 'white',\n    color: 'black',\n    border: '1px solid #ccc',\n    borderRadius: '0.5rem',\n    boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n    zIndex: 1000,\n};\n\nconst titleStyle: React.CSSProperties = {\n    margin: 0,\n    marginBottom: '0.5rem',\n    fontSize: '1.25rem',\n    fontWeight: 'bold',\n};\n\nconst labelStyle: React.CSSProperties = {\n    marginBottom: '0.25rem',\n    fontSize: '0.875rem',\n    fontWeight: '500',\n};\n\nconst inputStyle: React.CSSProperties = {\n    padding: '0.5rem',\n    fontSize: '1rem',\n    border: '1px solid lightgray',\n    borderRadius: '4px',\n};\n\nconst applyButtonStyle: React.CSSProperties = {\n    padding: '0.5rem 1rem',\n    fontSize: '1rem',\n    backgroundColor: '#007bff',\n    color: 'white',\n    border: 'none',\n    borderRadius: '4px',\n    cursor: 'pointer',\n};\n\nexport { DateRangePicker };\n","import { FC, useEffect, useState } from \"react\";\n\ninterface Props {\n    value?: string | null; // YYYY-MM-DD\n    onChange?: (date: string) => void;\n    background?: string;\n    textColor?: string;\n    selectedBackground?: string;\n    selectedTextColor?: string;\n    border?: string;\n    triggerBorderRadius?: string;\n    contentBorderRadius?: string;\n    fontSize?: string;\n    fontWeight?: string;\n    shadow?: string;\n}\n\nexport const Calendar: FC<Props> = (props) => {\n    const today = new Date();\n    const [month, setMonth] = useState(today.getMonth());\n    const [year, setYear] = useState(today.getFullYear());\n    const [selectedDate, setSelectedDate] = useState<string | null>(props.value ?? null);\n    const [open, setOpen] = useState(false);\n    const [hoveredDay, setHoveredDay] = useState<number | null>(null);\n\n    useEffect(() => {\n        if (props.value) {\n            setSelectedDate(props.value);\n            const parsed = new Date(props.value);\n            setMonth(parsed.getMonth());\n            setYear(parsed.getFullYear());\n        }\n    }, [props.value]);\n\n    useEffect(() => {\n        if (open && selectedDate) {\n            const parsed = new Date(selectedDate);\n            setMonth(parsed.getMonth());\n            setYear(parsed.getFullYear());\n        }\n    }, [open]);\n\n    const monthNames = [\n        \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n        \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n    ];\n\n    const daysInMonth = new Date(year, month + 1, 0).getDate();\n    const startDay = new Date(year, month, 1).getDay();\n\n    const isSelected = (day: number) => {\n        if (!selectedDate) return false;\n        const [y, m, d] = selectedDate.split('-').map(Number);\n        return y === year && m - 1 === month && d === day;\n    };\n\n    const handleSelect = (day: number) => {\n        const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n        setSelectedDate(dateStr);\n        props.onChange?.(dateStr);\n        setOpen(false);\n    };\n\n    const goToPrevMonth = () => {\n        if (month === 0) {\n            setMonth(11);\n            setYear((y) => y - 1);\n        } else {\n            setMonth((m) => m - 1);\n        }\n    };\n\n    const goToNextMonth = () => {\n        if (month === 11) {\n            setMonth(0);\n            setYear((y) => y + 1);\n        } else {\n            setMonth((m) => m + 1);\n        }\n    };\n\n    return <div\n        style={{\n            padding: '1rem',\n            background: props.background || 'white',\n            color: props.textColor || 'black',\n            border: props.border,\n            borderRadius: props.contentBorderRadius,\n            boxShadow: props.shadow,\n            zIndex: 1000,\n        }}\n    >\n        <div\n            style={{\n                display: 'flex',\n                justifyContent: 'space-between',\n                alignItems: 'center',\n                marginBottom: '0.5rem',\n                fontWeight: 'bold',\n            }}\n        >\n            <button onClick={goToPrevMonth} style={{ cursor: \"pointer\" }}>&lt;</button>\n            <div>{`${monthNames[month]} ${year}`}</div>\n            <button onClick={goToNextMonth} style={{ cursor: \"pointer\" }}>&gt;</button>\n        </div>\n\n        <div\n            style={{\n                display: 'grid',\n                gridTemplateColumns: 'repeat(7, 1fr)',\n                textAlign: 'center',\n                fontSize: '12px',\n                marginBottom: '0.25rem',\n                fontWeight: 'bold',\n            }}\n        >\n            {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((d) => (\n                <div key={d}>{d}</div>\n            ))}\n        </div>\n\n        <div\n            style={{\n                display: 'grid',\n                gridTemplateColumns: 'repeat(7, 1fr)',\n                textAlign: 'center',\n                fontSize: '12px',\n                gap: '0.25rem',\n            }}\n        >\n            {Array(startDay).fill(null).map((_, i) => <div key={`e-${i}`} />)}\n\n            {Array(daysInMonth).fill(null).map((_, i) => {\n                const day = i + 1;\n                const selected = isSelected(day);\n                const hovered = hoveredDay === day;\n\n                return (\n                    <button\n                        key={day}\n                        onClick={() => handleSelect(day)}\n                        onMouseEnter={() => setHoveredDay(day)}\n                        onMouseLeave={() => setHoveredDay(null)}\n                        style={{\n                            background: selected\n                                ? props.selectedBackground || '#0070f3'\n                                : hovered\n                                    ? '#eee'\n                                    : 'transparent',\n                            color: selected\n                                ? props.selectedTextColor || 'white'\n                                : props.textColor || 'black',\n                            borderRadius: '9999px',\n                            padding: '0.25rem 0.5rem',\n                            border: 'none',\n                            cursor: 'pointer',\n                            transition: 'background 0.2s ease',\n                        }}\n                    >\n                        {day}\n                    </button>\n                );\n            })}\n        </div>\n    </div>;\n}","import React, { FC, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype Props = {\n  label?: string; // e.g. \"15 Jan\" (display text). If omitted, derived from value.\n  value: string; // YYYY-MM-DD\n  onChange: (v: string) => void;\n\n  // optional: min/max in YYYY-MM-DD\n  min?: string;\n  max?: string;\n\n  // optional: close after pick (default true)\n  closeOnSelect?: boolean;\n};\n\nconst MONTHS = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nconst WEEKDAYS = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nfunction pad2(n: number) {\n  return n < 10 ? `0${n}` : `${n}`;\n}\n\nfunction clampDateStr(v: string, min?: string, max?: string) {\n  if (min && v < min) return min;\n  if (max && v > max) return max;\n  return v;\n}\n\nfunction isValidYmd(s: string) {\n  return /^\\d{4}-\\d{2}-\\d{2}$/.test(s);\n}\n\nfunction ymdToDate(ymd: string) {\n  // Interpret as local date at midnight\n  const [y, m, d] = ymd.split(\"-\").map(Number);\n  return new Date(y, m - 1, d);\n}\n\nfunction dateToYmd(d: Date) {\n  const y = d.getFullYear();\n  const m = pad2(d.getMonth() + 1);\n  const day = pad2(d.getDate());\n  return `${y}-${m}-${day}`;\n}\n\nfunction fmtShort(ymd: string) {\n  const d = ymdToDate(ymd);\n  // \"15 Jan\"\n  return d.toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\n}\n\nfunction startOfMonth(d: Date) {\n  return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nfunction addMonths(d: Date, delta: number) {\n  return new Date(d.getFullYear(), d.getMonth() + delta, 1);\n}\n\nfunction daysInMonth(d: Date) {\n  return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\n}\n\n// Monday-first index (0=Mon ... 6=Sun)\nfunction mondayFirstWeekdayIndex(date: Date) {\n  const js = date.getDay(); // 0=Sun..6=Sat\n  return (js + 6) % 7; // shift so Mon=0\n}\n\nfunction inRange(ymd: string, min?: string, max?: string) {\n  if (min && ymd < min) return false;\n  if (max && ymd > max) return false;\n  return true;\n}\n\nexport const DatePicker: FC<Props> = ({\n  label,\n  value,\n  onChange,\n  min,\n  max,\n  closeOnSelect = true,\n}) => {\n  const [open, setOpen] = useState(false);\n\n  const safeValue = useMemo(() => {\n    if (!isValidYmd(value)) return dateToYmd(new Date());\n    return clampDateStr(value, min, max);\n  }, [value, min, max]);\n\n  // anchor month to current value\n  const [monthCursor, setMonthCursor] = useState<Date>(() =>\n    startOfMonth(ymdToDate(safeValue))\n  );\n\n  useEffect(() => {\n    // when value changes externally, keep month view aligned\n    setMonthCursor(startOfMonth(ymdToDate(safeValue)));\n  }, [safeValue]);\n\n  // Close on ESC\n  useEffect(() => {\n    if (!open) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") setOpen(false);\n    };\n    window.addEventListener(\"keydown\", onKey);\n    return () => window.removeEventListener(\"keydown\", onKey);\n  }, [open]);\n\n  // Prevent background scroll when open\n  useEffect(() => {\n    if (!open) return;\n    const prev = document.body.style.overflow;\n    document.body.style.overflow = \"hidden\";\n    return () => {\n      document.body.style.overflow = prev;\n    };\n  }, [open]);\n\n  const grid = useMemo(() => {\n    const first = startOfMonth(monthCursor);\n    const offset = mondayFirstWeekdayIndex(first);\n    const dim = daysInMonth(monthCursor);\n\n    // 6 rows * 7 days = 42 cells (stable layout)\n    const cells: Array<{ ymd: string | null; day: number | null }> = [];\n    for (let i = 0; i < 42; i++) {\n      const dayNum = i - offset + 1;\n      if (dayNum < 1 || dayNum > dim) {\n        cells.push({ ymd: null, day: null });\n      } else {\n        const d = new Date(first.getFullYear(), first.getMonth(), dayNum);\n        cells.push({ ymd: dateToYmd(d), day: dayNum });\n      }\n    }\n    return cells;\n  }, [monthCursor]);\n\n  const displayLabel = label ?? fmtShort(safeValue);\n\n  const openPicker = () => setOpen(true);\n  const closePicker = () => setOpen(false);\n\n  const pick = (ymd: string) => {\n    if (!inRange(ymd, min, max)) return;\n    onChange(ymd);\n    if (closeOnSelect) closePicker();\n  };\n\n  // Styling to match your boxes\n  const fieldStyle: React.CSSProperties = {\n    width: \"100%\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    gap: 10,\n    border: \"1px solid #9CA3AF\",\n    borderRadius: 6,\n    padding: \"10px 10px\",\n    background: \"white\",\n    cursor: \"pointer\",\n    textAlign: \"left\",\n  };\n\n  const overlayStyle: React.CSSProperties = {\n    position: \"fixed\",\n    inset: 0,\n    background: \"rgba(0,0,0,0.35)\",\n    zIndex: 20000, // above your BottomDrawer\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    padding: 12,\n  };\n\n  const panelStyle: React.CSSProperties = {\n    width: \"min(520px, 100%)\",\n    maxWidth: \"100%\",\n    background: \"white\",\n    borderRadius: 12,\n    boxShadow: \"0 10px 30px rgba(0,0,0,0.18)\",\n    display: \"flex\",\n    flexDirection: \"column\",\n    overflow: \"hidden\",\n\n    // ✅ never overflow the screen\n    maxHeight: \"calc(100vh - 24px)\",\n  };\n\n  const headerStyle: React.CSSProperties = {\n    padding: \"14px 16px\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    borderBottom: \"1px solid #E5E7EB\",\n  };\n\n  const titleStyle: React.CSSProperties = {\n    fontSize: 14,\n    fontWeight: 600,\n    color: \"#111827\",\n  };\n\n  const closeBtnStyle: React.CSSProperties = {\n    border: \"none\",\n    background: \"transparent\",\n    cursor: \"pointer\",\n    width: 32,\n    height: 32,\n    borderRadius: 8,\n    fontSize: 18,\n    lineHeight: 1,\n    color: \"#111827\",\n  };\n\n  const navBtnStyle: React.CSSProperties = {\n    border: \"1px solid #E5E7EB\",\n    background: \"white\",\n    width: 36,\n    height: 36,\n    borderRadius: 10,\n    cursor: \"pointer\",\n    display: \"inline-flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    color: \"#111827\",\n  };\n\n  const dayBtnBase: React.CSSProperties = {\n    border: \"1px solid transparent\",\n    background: \"transparent\",\n    height: 40,\n    borderRadius: 10,\n    cursor: \"pointer\",\n    fontSize: 13,\n    color: \"#111827\",\n  };\n\n  const stop = (e: React.MouseEvent) => e.stopPropagation();\n\n  return (\n    <>\n      <button type=\"button\" onClick={openPicker} style={fieldStyle}>\n        <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n          {/* calendar icon */}\n          <svg\n            width=\"18\"\n            height=\"18\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            aria-hidden=\"true\"\n          >\n            <path\n              d=\"M7 3v2M17 3v2M4 8h16M6 6h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2Z\"\n              stroke=\"#111827\"\n              strokeWidth=\"1.6\"\n              strokeLinecap=\"round\"\n            />\n          </svg>\n          <div style={{ fontSize: 13, color: \"#111827\" }}>{displayLabel}</div>\n        </div>\n\n        {/* tiny chevron (optional) */}\n        <svg\n          width=\"18\"\n          height=\"18\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d=\"M7 10l5 5 5-5\"\n            stroke=\"#111827\"\n            strokeWidth=\"1.8\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          />\n        </svg>\n      </button>\n\n      {open && (\n        <div style={overlayStyle} onClick={closePicker} role=\"presentation\">\n          <div\n            style={panelStyle}\n            onClick={stop}\n            role=\"dialog\"\n            aria-modal=\"true\"\n          >\n            <div style={headerStyle}>\n              <div style={titleStyle}>Select date</div>\n              <button\n                type=\"button\"\n                aria-label=\"Close\"\n                onClick={closePicker}\n                style={closeBtnStyle}\n              >\n                ✕\n              </button>\n            </div>\n\n            <div\n              style={{ padding: 16, overflowY: \"auto\", flex: 1, minHeight: 0 }}\n            >\n              {/* Month header */}\n              <div\n                style={{\n                  display: \"flex\",\n                  alignItems: \"center\",\n                  justifyContent: \"space-between\",\n                  marginBottom: 12,\n                }}\n              >\n                <button\n                  type=\"button\"\n                  style={navBtnStyle}\n                  onClick={() => setMonthCursor((d) => addMonths(d, -1))}\n                  aria-label=\"Previous month\"\n                >\n                  ‹\n                </button>\n\n                <div\n                  style={{ fontSize: 14, fontWeight: 600, color: \"#111827\" }}\n                >\n                  {MONTHS[monthCursor.getMonth()]} {monthCursor.getFullYear()}\n                </div>\n\n                <button\n                  type=\"button\"\n                  style={navBtnStyle}\n                  onClick={() => setMonthCursor((d) => addMonths(d, 1))}\n                  aria-label=\"Next month\"\n                >\n                  ›\n                </button>\n              </div>\n\n              {/* Weekdays */}\n              <div\n                style={{\n                  display: \"grid\",\n                  gridTemplateColumns: \"repeat(7, 1fr)\",\n                  gap: 8,\n                  marginBottom: 8,\n                }}\n              >\n                {WEEKDAYS.map((w) => (\n                  <div\n                    key={w}\n                    style={{\n                      fontSize: 12,\n                      color: \"#6B7280\",\n                      textAlign: \"center\",\n                    }}\n                  >\n                    {w}\n                  </div>\n                ))}\n              </div>\n\n              {/* Days grid */}\n              <div\n                style={{\n                  display: \"grid\",\n                  gridTemplateColumns: \"repeat(7, 1fr)\",\n                  gap: 8,\n                }}\n              >\n                {grid.map((cell, idx) => {\n                  if (!cell.ymd) return <div key={idx} />;\n\n                  const selected = cell.ymd === safeValue;\n                  const enabled = inRange(cell.ymd, min, max);\n\n                  const style: React.CSSProperties = {\n                    ...dayBtnBase,\n                    border: selected\n                      ? \"1px solid #111827\"\n                      : \"1px solid transparent\",\n                    background: selected ? \"#F3F4F6\" : \"transparent\",\n                    opacity: enabled ? 1 : 0.35,\n                    cursor: enabled ? \"pointer\" : \"not-allowed\",\n                  };\n\n                  return (\n                    <button\n                      key={cell.ymd}\n                      type=\"button\"\n                      style={style}\n                      disabled={!enabled}\n                      onClick={() => pick(cell.ymd!)}\n                      aria-pressed={selected}\n                    >\n                      {cell.day}\n                    </button>\n                  );\n                })}\n              </div>\n\n              {/* Quick actions (optional but nice) */}\n              <div style={{ display: \"flex\", gap: 10, marginTop: 14 }}>\n                <button\n                  type=\"button\"\n                  onClick={() => pick(dateToYmd(new Date()))}\n                  style={{\n                    flex: 1,\n                    height: 40,\n                    borderRadius: 10,\n                    border: \"1px solid #E5E7EB\",\n                    background: \"white\",\n                    cursor: \"pointer\",\n                    fontSize: 14,\n                  }}\n                >\n                  Today\n                </button>\n\n                <button\n                  type=\"button\"\n                  onClick={closePicker}\n                  style={{\n                    flex: 1,\n                    height: 40,\n                    borderRadius: 10,\n                    border: \"1px solid #0B5ED7\",\n                    background: \"#0B5ED7\",\n                    color: \"white\",\n                    cursor: \"pointer\",\n                    fontSize: 14,\n                    fontWeight: 500,\n                  }}\n                >\n                  Done\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n    </>\n  );\n};\n","import * as Popover from \"@radix-ui/react-popover\";\nimport { HiInformationCircle } from \"react-icons/hi2\";\nimport React, { ReactNode } from \"react\";\nimport { ImpactBadge } from \"./parts/ImpactBadge\";\nimport { Dictionary } from \"../../../../types/Dictionary\";\nimport { HolaPrimeEcoCal } from \"../../../../types/EcoCal\";\nimport { formatZoneLabel } from \"../../../../utils/datesAndTimes\";\nimport { formatNumberToShort } from \"../../../../utils/numbers\";\nimport { DividerRow } from \"../../../Branded/elements/ComplexTable\";\nimport { ImpactedInstrumentsCell } from \"./parts/ImpactedInstrumentsCell\";\nimport { createUnit } from \"../../../../utils/createUnit\";\n\nconst COUNRTY_CURRENCY_MAP = {\n  us: \"USD\",\n  cn: \"CNY\",\n  jp: \"JPY\",\n  gb: \"GBP\",\n  de: \"EUR\",\n  ca: \"CAD\",\n  fr: \"EUR\",\n  au: \"AUD\",\n  it: \"EUR\",\n  kr: \"KRW\",\n  es: \"EUR\",\n  br: \"BRL\",\n  ch: \"CHF\",\n  in: \"INR\",\n  eu: \"EUR\",\n};\n\nfunction toMobileGroupTitle(dateString: string) {\n  const d = new Date(`${dateString}T00:00:00`);\n  const weekday = d\n    .toLocaleDateString(\"en-US\", { weekday: \"long\" })\n    .toUpperCase();\n  const month = d.toLocaleDateString(\"en-US\", { month: \"short\" }).toUpperCase();\n  const day = String(d.getDate()).padStart(2, \"0\");\n\n  return (\n    <p>\n      <strong>{weekday}</strong>,{\" \"}\n      <span style={{ fontWeight: 200, display: \"inline\" }}>{month}</span>{\" \"}\n      <strong>{day}</strong>\n    </p>\n  );\n}\n\n/**\n * Desktop title: \"Tuesday, November 4, 2025\"\n */\nconst convertDateToTitle = (dateString: string): string => {\n  const [year, month, day] = dateString.split(\"-\").map(Number);\n  const date = new Date(year, month - 1, day);\n  const options: Intl.DateTimeFormatOptions = {\n    weekday: \"long\",\n    year: \"numeric\",\n    month: \"long\",\n    day: \"numeric\",\n  };\n  return date.toLocaleDateString(\"en-US\", options);\n};\n\n// ---- match the new table types ----\nexport type CellsRow<T> = { kind: \"cells\"; data: T };\nexport type SpannedRow = {\n  kind: \"spanned\";\n  content: React.ReactNode;\n  colSpan?: number | \"all\";\n};\nexport type ComplexRow<T> = CellsRow<T> | SpannedRow | DividerRow;\n\nexport type Item<T> = {\n  key?: string | number;\n  rows: ComplexRow<T>[];\n  className?: string;\n  style?: React.CSSProperties;\n  // flags kept for future use if you want, table ignores them\n  separatorAbove?: boolean;\n  separatorBelow?: boolean;\n};\n\ntype Built = {\n  columns: { key: string; header: ReactNode }[];\n  groups: { title: ReactNode; items: Item<any>[] }[];\n};\n\nexport function buildEconomicCalendarTable(params: {\n  impactedInstrumentsType: \"forex\" | \"futures\";\n  groupedData: HolaPrimeEcoCal.EventsByDate;\n  selectedTimeZone: string;\n  now: Date;\n  t: Dictionary[\"economicCalendar\"];\n  isSmall: boolean;\n  decorateItem?: (\n    event: HolaPrimeEcoCal.ProcessedEvent,\n    indexInGroup: number,\n    groupTitle: string\n  ) => Partial<Item<any>> | void;\n}): Built {\n  const { groupedData, selectedTimeZone, now, t, isSmall, decorateItem } =\n    params;\n\n  const fullCols = [\n    { key: \"event_datetime\", header: t.holaPrime.columns.time.toUpperCase() },\n    { key: \"translated_name\", header: t.holaPrime.columns.news.toUpperCase() },\n    { key: \"impact_description\", header: t.impact.toUpperCase() },\n    {\n      key: \"impacted_currency\",\n      header: (\n        <span style={{ textWrap: \"nowrap\" }}>\n          {t.holaPrime.columns.impactedCurrency.toUpperCase()}\n        </span>\n      ),\n    },\n    { key: \"actual\", header: t.holaPrime.columns.actual.toUpperCase() },\n    { key: \"consensus\", header: t.holaPrime.columns.forecast.toUpperCase() },\n    { key: \"previous\", header: t.holaPrime.columns.prior.toUpperCase() },\n    {\n      key: \"impacted_instruments\",\n      header: (\n        <span style={{ textWrap: \"nowrap\" }}>\n          {t.holaPrime.columns.impactedInstruments.toUpperCase()}\n        </span>\n      ),\n    },\n  ];\n\n  const smallCols = [\n    { key: \"event_datetime\", header: formatZoneLabel(selectedTimeZone, now) },\n    { key: \"translated_name\", header: t.event },\n    { key: \"impact_description\", header: t.impact },\n  ];\n\n  const columns = isSmall ? smallCols : fullCols;\n\n  const groups = Object.entries(groupedData).map(([date, events]) => {\n    const items: Item<any>[] = [];\n\n    for (let idx = 0; idx < events.length; idx++) {\n      const event = events[idx];\n\n      const datetimeCell = (\n        <span\n          style={{\n            fontWeight: event.isClosestEvent ? \"bold\" : \"normal\",\n            color: event.isClosestEvent ? \"rgb(185, 14, 14)\" : \"inherit\",\n            textWrap: \"nowrap\",\n          }}\n        >\n          {new Date(event.event_datetime).toLocaleTimeString(\"en-US\", {\n            hour: \"2-digit\",\n            minute: \"2-digit\",\n            hour12: false,\n            timeZone: selectedTimeZone,\n          }) ?? \"-\"}\n        </span>\n      );\n\n      const nameCell = (\n        <Popover.Root>\n          <Popover.Trigger>\n            <div\n              style={{\n                display: \"flex\",\n                alignItems: \"center\",\n                gap: \"0.5rem\",\n                fontWeight: event.isClosestEvent ? \"bold\" : \"normal\",\n                cursor: \"pointer\",\n                overflowWrap: \"break-word\",\n                whiteSpace: \"normal\",\n              }}\n            >\n              <HiInformationCircle\n                size={20}\n                style={{\n                  cursor: \"pointer\",\n                  color: \"black\",\n                  minWidth: \"24px\",\n                }}\n              />\n              <span\n                style={{\n                  textAlign: \"start\",\n                  overflowWrap: \"break-word\",\n                  whiteSpace: \"normal\",\n                }}\n              >\n                {event.translated_name}\n              </span>\n            </div>\n          </Popover.Trigger>\n          <Popover.Content\n            style={{\n              padding: \"0.5rem\",\n              borderRadius: \"4px\",\n              boxShadow: \"rgba(0, 0, 0, 0.24) 0px 3px 8px\",\n              width: \"300px\",\n              maxWidth: \"90vw\",\n              background: \"white\",\n              color: \"black\",\n              overflowWrap: \"break-word\",\n              whiteSpace: \"normal\",\n            }}\n          >\n            {event.definition || \"No extra data available.\"}\n          </Popover.Content>\n        </Popover.Root>\n      );\n\n      const impactBadgeStyle = {\n        bg: {\n          HIGH: \"#FCD5D9\",\n          MEDIUM: \"#E3F1FF\",\n          LOW: \"#FFF4C9\",\n        },\n        text: {\n          HIGH: \"#F0142F\",\n          MEDIUM: \"#007AFF\",\n          LOW: \"#F99600\",\n        },\n        borderRadius: \"4px\",\n      };\n\n      const impactCell = (\n        <ImpactBadge\n          impact={event.impact_description}\n          styles={impactBadgeStyle}\n          t={t}\n        />\n      );\n\n      const impactedCurrencyCell = (\n        <div\n          style={{\n            width: \"fit-content\",\n            display: \"flex\",\n            alignItems: \"center\",\n            borderRadius: \"999px\",\n            border: `1px solid #364153`,\n            padding: \"0.5rem 0.6rem\",\n            gap: \"0.5rem\",\n          }}\n        >\n          <img\n            src={`https://flagcdn.com/w40/${event.iso_country_code.toLowerCase()}.png`}\n            alt={`${event.iso_country_code} flag`}\n            style={{\n              width: \"18px\",\n              height: \"12px\",\n              borderRadius: \"4px\",\n              objectFit: \"cover\",\n              boxShadow: \"1px 1px 2px 1px rgba(0,0,0,0.3)\",\n            }}\n          />\n          <span\n            style={{\n              fontSize: 14,\n              lineHeight: \"20px\",\n              fontFamily: \"Ariel, sans-serif\",\n              color: \"#99A1AF\",\n            }}\n          >\n            {COUNRTY_CURRENCY_MAP[\n              event.iso_country_code.toLowerCase() as keyof typeof COUNRTY_CURRENCY_MAP\n            ] || \"-\"}\n          </span>\n        </div>\n      );\n\n      const unit = createUnit(event.unit);\n      const actual = event.actual\n        ? formatNumberToShort(event.actual) + unit\n        : \"-\";\n      const forecast = event.consensus\n        ? formatNumberToShort(event.consensus) + unit\n        : \"-\";\n      const previous = event.previous\n        ? formatNumberToShort(event.previous) + unit\n        : \"-\";\n\n      const instruments =\n        params.impactedInstrumentsType === \"forex\"\n          ? event.impacted_forex_instruments\n          : event.impacted_future_instruments;\n\n      const impactedInstrumentsCell = (\n        <ImpactedInstrumentsCell\n          instruments={instruments}\n          andMoreText={t.holaPrime.andMore}\n          impactLevel={event.impact_description}\n          isSmall={false}\n        />\n      );\n\n      if (!isSmall) {\n        // Desktop: one physical row per event (same as before)\n        const desktopRowData = {\n          ...event,\n          event_datetime: datetimeCell,\n          translated_name: nameCell,\n          impact_description: impactCell,\n          impacted_currency: impactedCurrencyCell,\n          actual,\n          consensus: forecast,\n          previous,\n          impacted_instruments: impactedInstrumentsCell,\n        };\n\n        const item: Item<any> = {\n          key: `${event.translated_name}-${event.event_datetime}-${idx}-${\n            event.id ?? \"\"\n          }`,\n          rows: [{ kind: \"cells\", data: desktopRowData }],\n          ...(decorateItem?.(event, idx, date) || {}),\n        };\n        items.push(item);\n      } else {\n        // ✅ MOBILE: render a flat row (NOT a card) so the table looks like the reference\n\n        const currency =\n          COUNRTY_CURRENCY_MAP[\n            event.iso_country_code.toLowerCase() as keyof typeof COUNRTY_CURRENCY_MAP\n          ] || \"-\";\n\n        const instruments =\n          params.impactedInstrumentsType === \"forex\"\n            ? event.impacted_forex_instruments\n            : event.impacted_future_instruments;\n\n        const impactedInstrumentsCellSmall = (\n          <ImpactedInstrumentsCell\n            instruments={instruments}\n            impactLevel={event.impact_description}\n            andMoreText={t.holaPrime.andMore}\n            isSmall={true}\n          />\n        );\n\n        const row = (\n          <div\n            style={{\n              background: \"transparent\",\n              padding: \"14px 16px\",\n              display: \"flex\",\n              gap: 12,\n              borderBottom: \"1px solid #E5E7EB\", // ✅ table-like divider between rows\n            }}\n          >\n            {/* Left column: time + flag + currency */}\n            <div\n              style={{\n                minWidth: 64,\n                display: \"flex\",\n                flexDirection: \"column\",\n                gap: 10,\n              }}\n            >\n              <div style={{ fontSize: 12, color: \"#111827\" }}>\n                {datetimeCell}\n              </div>\n\n              <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n                <img\n                  src={`https://flagcdn.com/w40/${event.iso_country_code.toLowerCase()}.png`}\n                  alt={`${event.iso_country_code} flag`}\n                  style={{\n                    width: 20,\n                    height: 14,\n                    borderRadius: 4,\n                    objectFit: \"cover\",\n                    boxShadow: \"1px 1px 2px rgba(0,0,0,0.25)\",\n                  }}\n                />\n                <div\n                  style={{\n                    fontSize: 12,\n                    color: \"#6B7280\",\n                    fontFamily: \"Ariel, sans-serif\",\n                  }}\n                >\n                  {currency}\n                </div>\n              </div>\n            </div>\n\n            {/* Right column: name + grid + instruments */}\n            <div\n              style={{\n                flex: 1,\n                minWidth: 0,\n                display: \"flex\",\n                flexDirection: \"column\",\n                gap: 10,\n              }}\n            >\n              <div\n                style={{\n                  fontSize: 14,\n                  fontWeight: 600,\n                  color: \"#111827\",\n                  lineHeight: \"18px\",\n                }}\n              >\n                {event.translated_name}\n              </div>\n\n              <div\n                style={{\n                  display: \"grid\",\n                  gridTemplateColumns: \"auto 1fr 1fr 1fr\",\n                  gap: 10,\n                  alignItems: \"center\",\n                  fontSize: 12,\n                }}\n              >\n                <div\n                  style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}\n                >\n                  <div style={{ color: \"#6B7280\" }}>Impact</div>\n                  {impactCell}\n                </div>\n\n                <div\n                  style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}\n                >\n                  <div style={{ color: \"#6B7280\" }}>Actual</div>\n                  <div style={{ fontWeight: 600 }}>{actual}</div>\n                </div>\n\n                <div\n                  style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}\n                >\n                  <div style={{ color: \"#6B7280\" }}>Forecast</div>\n                  <div style={{ fontWeight: 600 }}>{forecast}</div>\n                </div>\n\n                <div\n                  style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}\n                >\n                  <div style={{ color: \"#6B7280\" }}>Prior</div>\n                  <div style={{ fontWeight: 600 }}>{previous}</div>\n                </div>\n              </div>\n\n              {event.impact_description === \"HIGH\" && (\n                <div style={{ fontSize: 12, color: \"#6B7280\" }}>\n                  <div style={{ marginBottom: 4 }}>Impacted Instruments</div>\n                  <div style={{ color: \"#111827\" }}>\n                    {impactedInstrumentsCellSmall}\n                  </div>\n                </div>\n              )}\n            </div>\n          </div>\n        );\n\n        const item: Item<any> = {\n          key: `${event.translated_name}-${event.event_datetime}-${idx}-${\n            event.id ?? \"\"\n          }`,\n          rows: [{ kind: \"spanned\", content: row, colSpan: \"all\" }],\n          ...(decorateItem?.(event, idx, date) || {}),\n        };\n        items.push(item);\n      }\n\n      // ---- ADD SEPARATOR after the last past event (if there are events after it) ----\n      if (event.isLastPastEvent && idx < events.length - 1) {\n        items.push({\n          key: `divider-${date}-${idx}`,\n          rows: [\n            {\n              kind: \"divider\",\n              bg: \"rgb(185, 14, 14)\",\n              thickness: 2,\n              marginY: 4,\n            },\n          ],\n        });\n      }\n    }\n\n    // ✅ Title format differs on mobile only\n    const title = isSmall ? toMobileGroupTitle(date) : convertDateToTitle(date);\n\n    return { title, items };\n  });\n\n  return { columns, groups };\n}\n","import { FC } from \"react\";\nimport { Dictionary } from \"../../../../../types/Dictionary\";\n\nexport const ImpactBadge: FC<{\n    impact: \"HIGH\" | \"MEDIUM\" | \"LOW\";\n    styles: {\n        bg: {\n            HIGH?: string,\n            MEDIUM?: string,\n            LOW?: string,\n        },\n        text: {\n            HIGH?: string,\n            MEDIUM?: string,\n            LOW?: string,\n        },\n        borderRadius: string,\n    };\n    t: Dictionary[\"economicCalendar\"];\n}> = ({ impact, styles, t }) => {\n    const impactText = impact === \"HIGH\"\n        ? t.high\n        : impact === \"MEDIUM\"\n            ? t.medium\n            : t.low;\n\n    const impactBgColor = impact === \"HIGH\"\n        ? (styles.bg.HIGH || \"#dc2626\") //Default Red for High\n        : impact === \"MEDIUM\"\n            ? (styles.bg.MEDIUM || \"#164efa\") // Default Blue for Medium\n            : (styles.bg.LOW || \"#f6dc00\"); // Default Yellow for Low\n\n    const impactTextColor = impact === \"HIGH\"\n        ? (styles.text.HIGH || \"#ffffff\") // Default White text for High\n        : impact === \"MEDIUM\"\n            ? (styles.text.MEDIUM || \"#ffffff\") // Default White text for Medium\n            : (styles.text.LOW || \"#000000\"); // Default Black text for Low\n\n    return <div\n        style={{\n            width: \"fit-content\",\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            padding: \"0.25rem 0.5rem\",\n            fontSize: \"0.75rem\",\n            fontWeight: 400,\n            borderRadius: styles.borderRadius,\n            background: impactBgColor,\n            color: impactTextColor,\n        }}\n        title={`Economic Impact: ${impactText}`}\n    >\n        {impactText}\n    </div>;\n}","import { useMemo, useState } from \"react\";\nimport {\n  Popover,\n  PopoverContent,\n  PopoverPortal,\n  PopoverTrigger,\n} from \"@radix-ui/react-popover\";\nimport { Dialog } from \"../elements/Dialog\"; // adjust import path to where you place Dialog\n\nexport const ImpactedInstrumentsCell = ({\n  instruments,\n  impactLevel,\n  andMoreText,\n  isSmall,\n}: {\n  instruments: string[];\n  impactLevel: \"HIGH\" | \"MEDIUM\" | \"LOW\";\n  andMoreText: string;\n  isSmall: boolean;\n}) => {\n  const [open, setOpen] = useState(false);\n\n  const clean = useMemo(\n    () => (instruments || []).filter(Boolean),\n    [instruments]\n  );\n  if (!clean || clean.length === 0) return <div />;\n\n  if (!instruments || instruments.length === 0 || impactLevel !== \"HIGH\") {\n    return <div></div>;\n  }\n\n  if (clean.length <= 3) return <span>{clean.join(\", \")}</span>;\n\n  const displayed = clean.slice(0, 3);\n  const remaining = clean.slice(3);\n\n  const trigger = (\n    <button\n      type=\"button\"\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: \"0.2rem\",\n        border: \"none\",\n        background: \"transparent\",\n        padding: \"0.2rem 0.4rem\",\n        cursor: \"pointer\",\n        color: \"#007AFF\",\n      }}\n    >\n      <span>{` ${andMoreText} `}</span>\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n        <path\n          d=\"M8 2C6.81331 2 5.65328 2.35189 4.66658 3.01118C3.67989 3.67047 2.91085 4.60754 2.45673 5.7039C2.0026 6.80025 1.88378 8.00666 2.11529 9.17054C2.3468 10.3344 2.91825 11.4035 3.75736 12.2426C4.59648 13.0818 5.66557 13.6532 6.82946 13.8847C7.99335 14.1162 9.19975 13.9974 10.2961 13.5433C11.3925 13.0891 12.3295 12.3201 12.9888 11.3334C13.6481 10.3467 14 9.18669 14 8C13.9983 6.40922 13.3656 4.88407 12.2408 3.75921C11.1159 2.63436 9.59078 2.00168 8 2Z\"\n          fill=\"#007AFF\"\n        />\n      </svg>\n    </button>\n  );\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexWrap: \"wrap\",\n        alignItems: \"center\",\n        lineHeight: \"1rem\",\n        padding: \"0.5rem 0\",\n      }}\n    >\n      {displayed.map((inst) => (\n        <span key={inst} style={{ marginRight: \"0.2rem\" }}>\n          {`${inst},`}\n        </span>\n      ))}\n\n      {isSmall ? (\n        <>\n          <span onClick={() => setOpen(true)}>{trigger}</span>\n          <Dialog\n            open={open}\n            onClose={() => setOpen(false)}\n            title=\"Impacted Instruments\"\n            width={360}\n          >\n            <div style={{ color: \"#6B7280\", fontSize: 12, lineHeight: \"16px\" }}>\n              {clean.join(\", \")}\n            </div>\n          </Dialog>\n        </>\n      ) : (\n        <Popover>\n          <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n          <PopoverPortal>\n            <PopoverContent style={{ zIndex: 1000, margin: \"0.5rem\" }}>\n              <div\n                style={{\n                  padding: \"0.5rem\",\n                  borderRadius: \"8px\",\n                  boxShadow: \"rgba(0, 0, 0, 0.24) 0px 3px 8px\",\n                  maxWidth: \"300px\",\n                  background: \"white\",\n                  color: \"black\",\n                  overflowWrap: \"break-word\",\n                  whiteSpace: \"normal\",\n                }}\n              >\n                {remaining.join(\", \")}\n              </div>\n            </PopoverContent>\n          </PopoverPortal>\n        </Popover>\n      )}\n    </div>\n  );\n};\n","import React, { useEffect, useRef } from \"react\";\n\nexport interface DialogProps {\n  open: boolean;\n  onClose?: () => void;\n  children: React.ReactNode;\n  title?: React.ReactNode;\n  width?: number | string;\n  modality?: \"modal\" | \"non-modal\";\n}\n\nexport function Dialog({\n  open,\n  onClose,\n  children,\n  title,\n  width = 340,\n  modality = \"modal\",\n}: DialogProps) {\n  const panelRef = useRef<HTMLDivElement | null>(null);\n\n  useEffect(() => {\n    if (!open) return;\n    const handler = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") {\n        e.preventDefault();\n        onClose?.();\n      }\n    };\n    window.addEventListener(\"keydown\", handler);\n    return () => window.removeEventListener(\"keydown\", handler);\n  }, [open, onClose]);\n\n  useEffect(() => {\n    if (open && panelRef.current) panelRef.current.focus();\n  }, [open]);\n\n  if (!open) return null;\n\n  const resolvedWidth = typeof width === \"number\" ? `${width}px` : width;\n\n  const overlay: React.CSSProperties = {\n    position: \"fixed\",\n    inset: 0,\n    background: modality === \"modal\" ? \"rgba(0,0,0,0.35)\" : \"transparent\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    padding: 16,\n    zIndex: 9999,\n  };\n\n  const panel: React.CSSProperties = {\n    background: \"white\",\n    borderRadius: 12,\n    width: resolvedWidth,\n    maxWidth: \"92vw\",\n    boxShadow: \"0 12px 30px rgba(0,0,0,0.20)\",\n    border: \"1px solid rgba(0,0,0,0.08)\",\n    overflow: \"hidden\",\n    outline: \"none\",\n  };\n\n  const header: React.CSSProperties = {\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    padding: \"12px 14px\",\n    borderBottom: \"1px solid #E5E7EB\",\n    fontSize: 14,\n    fontWeight: 600,\n    color: \"#111827\",\n  };\n\n  const body: React.CSSProperties = {\n    padding: 14,\n    color: \"#111827\",\n  };\n\n  const closeBtn: React.CSSProperties = {\n    background: \"transparent\",\n    border: \"none\",\n    cursor: \"pointer\",\n    fontSize: 18,\n    lineHeight: 1,\n    padding: 6,\n    borderRadius: 8,\n    color: \"#111827\",\n  };\n\n  const onOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n    if (modality !== \"modal\") return;\n    if (e.target === e.currentTarget) onClose?.();\n  };\n\n  return (\n    <div\n      role=\"dialog\"\n      aria-modal={modality === \"modal\"}\n      style={overlay}\n      onClick={onOverlayClick}\n    >\n      <div ref={panelRef} tabIndex={-1} style={panel}>\n        {(title || onClose) && (\n          <div style={header}>\n            <div>{title}</div>\n            {onClose && (\n              <button\n                type=\"button\"\n                aria-label=\"Close\"\n                onClick={onClose}\n                style={closeBtn}\n              >\n                ✕\n              </button>\n            )}\n          </div>\n        )}\n        <div style={body}>{children}</div>\n      </div>\n    </div>\n  );\n}\n","import { HolaPrimeEcoCal } from \"../types/EcoCal\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchHolaPrimeEconomicData(lang: string, start: string, end: string): Promise<HolaPrimeEcoCal.EconomicEventWithTranslation[] | null> {\n  const url = `${WIDGET_API_BASE}/api/widgets/economic-calendar/hola-prime`;\n\n  try {\n    const formattedLang = lang.replace(/-/g, \"_\").toUpperCase(); // Ensure lang is in the correct format\n    const response = await fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ lang: formattedLang, start, end }),\n    });\n    const jsonData = await response.json();\n\n    if (!response.ok || !jsonData?.data) {\n      console.error('API Error:', jsonData?.error || 'No data');\n      return null;\n    }\n\n    console.table(jsonData.data);\n\n    return jsonData.data as HolaPrimeEcoCal.EconomicEventWithTranslation[];\n  } catch (error) {\n    console.error('Fetch error:', error);\n    return null;\n  }\n}\n","// SegmentedToggle.tsx\nimport React from \"react\";\n\n/** Segment with a literal value type */\nexport type Segment<V extends string = string> = { label: string; value: V };\n\n/** Extract union of values from a tuple/array of Segments */\ntype ValuesOf<T> = T extends readonly Segment<infer V>[] ? V : string;\n\nexport type SegmentedToggleProps<\n    TItems extends readonly Segment<string>[] | undefined = undefined\n> = {\n    /** Provide as `as const` to get a literal union for value/defaultValue/onChange */\n    items?: TItems;\n    value?: ValuesOf<TItems>;\n    defaultValue?: ValuesOf<TItems>;\n    onChange?: (next: ValuesOf<TItems>) => void;\n    size?: \"sm\" | \"md\" | \"lg\";\n    style?: React.CSSProperties;\n    buttonStyle?: React.CSSProperties;\n    ariaLabel?: string;\n};\n\nfunction focusRing(on: boolean): string {\n    return on ? \"0 0 0 3px rgba(59,130,246,0.45)\" : \"none\";\n}\n\nexport default function SegmentedToggle<\n    const TItems extends readonly Segment<string>[] | undefined\n>({\n    items = [\n        { label: \"Option 1\", value: \"option1\" },\n        { label: \"Option 2\", value: \"option2\" },\n    ] as unknown as TItems, // keeps inference when caller passes items\n    value,\n    defaultValue,\n    onChange,\n    style,\n    buttonStyle,\n    ariaLabel = \"Segmented Toggle\",\n}: SegmentedToggleProps<TItems>) {\n    const isControlled = value !== undefined;\n\n    const [internal, setInternal] = React.useState<ValuesOf<TItems>>(\n        (defaultValue ??\n            (items && (items as readonly Segment<string>[])[0]?.value) ??\n            \"\") as ValuesOf<TItems>\n    );\n\n    const current: ValuesOf<TItems> = (isControlled ? value : internal)!;\n\n    const setValue = (v: ValuesOf<TItems>) => {\n        if (!isControlled) setInternal(v);\n        onChange?.(v);\n    };\n\n    // Keyboard navigation (Left/Right)\n    const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n        const arr = (items as readonly Segment<string>[]) ?? [];\n        const idx = arr.findIndex((i) => i.value === (current as string));\n        if (idx < 0) return;\n        if (e.key === \"ArrowRight\") {\n            const next = arr[(idx + 1) % arr.length];\n            setValue(next.value as ValuesOf<TItems>);\n            e.preventDefault();\n        } else if (e.key === \"ArrowLeft\") {\n            const prev = arr[(idx - 1 + arr.length) % arr.length];\n            setValue(prev.value as ValuesOf<TItems>);\n            e.preventDefault();\n        }\n    };\n\n    const arr = (items as readonly Segment<string>[]) ?? [];\n\n    return (\n        <div\n            role=\"tablist\"\n            aria-label={ariaLabel}\n            onKeyDown={onKeyDown}\n            style={{\n                display: \"inline-flex\",\n                width: \"fit-content\",\n                alignItems: \"center\",\n                gap: 0,\n                background: \"#D8DDE3\",\n                borderRadius: 9999,\n                boxShadow: \"inset 0 1px 2px rgba(0,0,0,0.06)\",\n                userSelect: \"none\",\n                ...style,\n            }}\n        >\n            {arr.map((item) => {\n                const active = item.value === (current as string);\n                return (\n                    <button\n                        key={item.value}\n                        role=\"tab\"\n                        aria-selected={active}\n                        onClick={() => setValue(item.value as ValuesOf<TItems>)}\n                        style={{\n                            width: 70,\n                            height: \"26px\",\n                            minHeight: \"100%\",\n                            display: \"flex\",\n                            alignItems: \"center\",\n                            justifyContent: \"center\",\n                            border: \"none\",\n                            outline: \"none\",\n                            borderRadius: 9999,\n                            fontSize: 14,\n                            fontStyle: \"normal\",\n                            fontWeight: 500,\n                            lineHeight: 1,\n                            cursor: \"pointer\",\n                            transition:\n                                \"box-shadow 0.15s ease, color 0.15s ease, background 0.15s ease\",\n                            color: active ? \"#FFFFFF\" : \"#324054\",\n                            background: active\n                                ? \"linear-gradient(90deg, #326DAC 0%, #073361 100%)\"\n                                : \"transparent\",\n                            boxShadow: focusRing(false),\n                            ...buttonStyle,\n                        }}\n                        onFocus={(e) => {\n                            e.currentTarget.style.boxShadow = focusRing(true);\n                        }}\n                        onBlur={(e) => {\n                            e.currentTarget.style.boxShadow = focusRing(false);\n                        }}\n                    >\n                        {item.label}\n                    </button>\n                );\n            })}\n        </div>\n    );\n}\n","import React, { ReactNode, useLayoutEffect, useRef } from \"react\";\n\ntype Column<T> = {\n  key?: keyof T;\n  header: React.ReactNode;\n  width?: number | string;\n  cell?: (row: T) => React.ReactNode;\n};\n\n// complex rows/items model (now with optional `key` for rock-solid row identity)\ntype CellsRow<T> = { kind: \"cells\"; data: T; key?: string | number };\ntype SpannedRow = {\n  kind: \"spanned\";\n  content: React.ReactNode;\n  colSpan?: number | \"all\";\n  key?: string | number;\n};\nexport type DividerRow = {\n  kind: \"divider\";\n  thickness?: number;\n  bg?: string;\n  marginY?: number;\n  key?: string | number;\n};\ntype ComplexRow<T> = CellsRow<T> | SpannedRow | DividerRow;\n\ntype Item<T> = {\n  key?: string | number;\n  rows: ComplexRow<T>[];\n  className?: string;\n  style?: React.CSSProperties;\n};\n\ntype Group<T> = { title: ReactNode; items: Item<T>[] };\n\n// legacy shape support\ntype LegacyGroup<T> = { title: string; rows: T[] };\n\ntype Props<T extends object> = {\n  columns: Column<T>[];\n  groups: Array<Group<T> | LegacyGroup<T>>;\n  customGroupHeaderStyle?: React.CSSProperties;\n  hideHeader?: boolean;\n};\n\nexport function ComplexTable<T extends object>({\n  columns,\n  groups,\n  customGroupHeaderStyle,\n  hideHeader,\n}: Props<T>) {\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const theadRef = useRef<HTMLTableSectionElement>(null);\n\n  // sticky offset: keep --thead-h accurate when header is hidden/shown\n  useLayoutEffect(() => {\n    if (typeof ResizeObserver === \"undefined\") return;\n\n    const el = scrollRef.current;\n    const thead = theadRef.current;\n    if (!el) return;\n\n    if (hideHeader || !thead) {\n      el.style.setProperty(\"--thead-h\", \"0px\");\n      return;\n    }\n\n    const setVar = () =>\n      el.style.setProperty(\n        \"--thead-h\",\n        `${thead.getBoundingClientRect().height}px`\n      );\n\n    setVar();\n    const ro = new ResizeObserver(setVar);\n    ro.observe(thead);\n    return () => ro.disconnect();\n  }, [hideHeader]);\n\n  const tableHeadCellStyle: React.CSSProperties = {\n    position: \"sticky\",\n    top: 0,\n    zIndex: 5, // above group header\n    background: \"#fff\", // opaque cover for sticky\n    color: \"#6A7282\",\n    padding: \"1rem\",\n    fontWeight: \"bold\",\n    fontSize: \"12px\",\n    lineHeight: \"16px\",\n    textAlign: \"left\",\n  };\n\n  const rowSep = \"1px solid #E0E0E0\";\n\n  const groupHeaderStyle: React.CSSProperties = {\n    position: \"sticky\",\n    top: \"var(--thead-h, 0px)\",\n    zIndex: 2,\n    height: 36,\n    background: \"#F5F5F7\",\n    color: \"black\",\n    borderBottom: \"0.67px solid #E0E0E0\",\n    fontSize: \"14px\",\n    fontWeight: 500,\n    textAlign: \"center\",\n    borderTop: rowSep,\n    ...(customGroupHeaderStyle || {}),\n  };\n\n  // legacy normalize\n  const normalizedGroups: Group<T>[] = groups.map((g) => {\n    if ((g as any).items) return g as Group<T>;\n    const legacy = g as LegacyGroup<T>;\n    return {\n      title: legacy.title,\n      items: legacy.rows.map((r, i) => ({\n        rows: [{ kind: \"cells\", data: r }],\n        key: i,\n      })),\n    };\n  });\n\n  // ---- styles to make the TABLE look like a single rounded card (like your pic)\n  const radius = 12;\n\n  return (\n    // OUTER CARD: rounded + clipped (this is what makes it look like the pic)\n    <div\n      style={{\n        width: \"100%\",\n        height: \"100%\",\n        background: \"white\",\n        borderRadius: hideHeader ? 0 : radius,\n        border: hideHeader ? \"none\" : \"1px solid #E0E0E0\",\n        boxShadow: hideHeader ? \"none\" : \"0 2px 8px rgba(0,0,0,0.10)\",\n        overflow: \"hidden\", // ✅ clips table/header corners\n      }}\n    >\n      {/* INNER SCROLLER: handles scrolling, NOT rounded */}\n      <div\n        ref={scrollRef}\n        className=\"table-scroll\"\n        style={{\n          height: \"100%\",\n          maxHeight: \"100vh\",\n          width: \"100%\",\n          overflow: \"auto\",\n          WebkitOverflowScrolling: \"touch\",\n          background: \"white\",\n        }}\n      >\n        <table\n          style={{\n            borderCollapse: \"separate\",\n            borderSpacing: 0,\n            width: \"100%\",\n            background: \"white\",\n          }}\n        >\n          {!hideHeader && (\n            <thead ref={theadRef}>\n              <tr>\n                {columns.map((col) => (\n                  <th\n                    key={String(col.key ?? col.header)}\n                    scope=\"col\"\n                    style={tableHeadCellStyle}\n                  >\n                    {col.header}\n                  </th>\n                ))}\n              </tr>\n            </thead>\n          )}\n\n          <tbody>\n            {normalizedGroups.map((g, gi) => {\n              const groupHeader = (\n                <tr className=\"group-header\" key={`g-${gi}`}>\n                  <th\n                    scope=\"colgroup\"\n                    colSpan={columns.length}\n                    style={groupHeaderStyle}\n                  >\n                    {g.title}\n                  </th>\n                </tr>\n              );\n\n              const itemRows: React.ReactNode[] = [];\n              let dataRowIndexInGroup = 0;\n\n              g.items.forEach((item, ii) => {\n                item.rows.forEach((r, ri) => {\n                  if (r.kind === \"divider\") {\n                    itemRows.push(\n                      <tr\n                        key={String(r.key ?? `g${gi}-i${ii}-div-${ri}`)}\n                        aria-hidden=\"true\"\n                      >\n                        <td colSpan={columns.length} style={{ padding: 0 }}>\n                          <div\n                            style={{\n                              height: r.thickness ?? 2,\n                              margin: `${r.marginY ?? 0}px 0`,\n                              width: \"100%\",\n                              background: r.bg,\n                            }}\n                          />\n                        </td>\n                      </tr>\n                    );\n                    return;\n                  }\n\n                  const bg = \"white\";\n                  const rowTopBorder =\n                    dataRowIndexInGroup > 0 ? rowSep : undefined;\n\n                  if (r.kind === \"spanned\") {\n                    itemRows.push(\n                      <tr\n                        key={String(r.key ?? `g${gi}-i${ii}-r${ri}`)}\n                        className={item.className}\n                        style={item.style}\n                      >\n                        <td\n                          colSpan={\n                            r.colSpan === \"all\" || !r.colSpan\n                              ? columns.length\n                              : r.colSpan\n                          }\n                          style={{\n                            padding: hideHeader ? 0 : \"0.5rem 1rem\",\n                            borderTop: rowTopBorder,\n                            background: bg,\n                          }}\n                        >\n                          {r.content}\n                        </td>\n                      </tr>\n                    );\n                  } else {\n                    itemRows.push(\n                      <tr\n                        key={String(r.key ?? `g${gi}-i${ii}-r${ri}`)}\n                        className={item.className}\n                        style={item.style}\n                      >\n                        {columns.map((col) => {\n                          const raw =\n                            col.key != null\n                              ? (r.data as any)[col.key]\n                              : undefined;\n                          const content = col.cell ? col.cell(r.data) : raw;\n\n                          return (\n                            <td\n                              key={String(col.key ?? col.header)}\n                              style={{\n                                height: 52,\n                                padding: \"0 24px\",\n                                background: bg,\n                                color: \"black\",\n                                borderTop: rowTopBorder,\n                                textAlign: \"left\",\n                                verticalAlign: \"middle\",\n                              }}\n                            >\n                              {content}\n                            </td>\n                          );\n                        })}\n                      </tr>\n                    );\n                  }\n\n                  dataRowIndexInGroup++;\n                });\n              });\n\n              return (\n                <React.Fragment key={gi}>\n                  {groupHeader}\n                  {itemRows}\n                </React.Fragment>\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n}\n","import { StockEcoCal } from \"../types/EcoCal\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchHolaPrimeStockData(\n  start: string,\n  end: string\n): Promise<StockEcoCal.Event[] | null> {\n  try {\n    const response = await fetch(\n      `${WIDGET_API_BASE}/api/widgets/economic-calendar/stocks`,\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ start, end }),\n      }\n    );\n    const json = await response.json();\n    if (!response.ok || !Array.isArray(json?.data)) return null;\n    return json.data as StockEcoCal.Event[];\n  } catch (error) {\n    console.error(\"Failed to fetch stock calendar data:\", error);\n    return null;\n  }\n}\n","import React from \"react\";\nimport { StockEcoCal } from \"../../../../types/EcoCal\";\nimport { Dictionary } from \"../../../../types/Dictionary\";\n\nconst formatDate = (value?: string | null) => {\n  if (!value) return \"—\";\n  const [year, month, day] = value.slice(0, 10).split(\"-\").map(Number);\n  return new Date(year, month - 1, day).toLocaleDateString(\"en-US\", {\n    month: \"short\", day: \"numeric\", year: \"numeric\",\n  });\n};\n\nconst formatCompact = (value?: number | null) => {\n  if (value === null || value === undefined) return \"—\";\n  return new Intl.NumberFormat(\"en-US\", { notation: \"compact\", maximumFractionDigits: 2 }).format(value);\n};\n\nconst Detail = ({ label, value }: { label: string; value: React.ReactNode }) => (\n  <span style={{ display: \"inline-flex\", gap: 4, whiteSpace: \"nowrap\" }}>\n    <span style={{ color: \"#6B7280\" }}>{label}</span>\n    <strong style={{ color: \"#111827\", fontWeight: 600 }}>{value}</strong>\n  </span>\n);\n\nconst NewsCell = ({ event, t }: { event: StockEcoCal.Event; t: Dictionary[\"economicCalendar\"] }) => {\n  const s = t.holaPrime.stocks;\n  const typeMeta = event.type === \"earnings\"\n    ? { label: s.earnings, color: \"#1D4ED8\", background: \"#DBEAFE\" }\n    : event.type === \"dividends\"\n      ? { label: s.dividend, color: \"#047857\", background: \"#D1FAE5\" }\n      : { label: s.stockSplit, color: \"#7E22CE\", background: \"#F3E8FF\" };\n  let details: React.ReactNode;\n  if (event.type === \"earnings\") {\n    details = <>\n      <Detail label={s.epsActual} value={formatCompact(event.eps_actual)} />\n      <Detail label={s.epsForecast} value={formatCompact(event.eps_estimated)} />\n      <Detail label={s.revenueActual} value={formatCompact(event.revenue_actual)} />\n      <Detail label={s.revenueForecast} value={formatCompact(event.revenue_estimated)} />\n    </>;\n  } else if (event.type === \"dividends\") {\n    details = <>\n      <Detail label={s.exDate} value={formatDate(event.ex_dividend_date)} />\n      <Detail label={s.dividend} value={formatCompact(event.dividend)} />\n      <Detail label={s.cycle} value={event.frequency || \"—\"} />\n      <Detail label={s.payment} value={formatDate(event.payment_date)} />\n      <Detail label={s.yield} value={event.dividend_yield == null ? \"—\" : `${formatCompact(event.dividend_yield)}%`} />\n    </>;\n  } else {\n    details = <Detail label={s.ratio} value={event.split_ratio || (\n      event.split_from != null && event.split_to != null ? `${event.split_from}:${event.split_to}` : \"—\"\n    )} />;\n  }\n  const name = event.asset_name && event.asset_name !== event.symbol ? event.asset_name : null;\n  return <div style={{ minWidth: 240 }}>\n    <div style={{ display: \"flex\", alignItems: \"center\", flexWrap: \"wrap\", gap: 8, marginBottom: 6 }}>\n      <span style={{ fontWeight: 600, color: \"#111827\" }}>{name ? `${name} (${event.symbol})` : event.symbol}</span>\n      <span style={{\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        minHeight: 22,\n        padding: \"2px 8px\",\n        borderRadius: 999,\n        fontSize: 11,\n        lineHeight: \"16px\",\n        fontWeight: 600,\n        color: typeMeta.color,\n        background: typeMeta.background,\n      }}>{typeMeta.label}</span>\n    </div>\n    <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"5px 14px\", fontSize: 12 }}>{details}</div>\n  </div>;\n};\n\nconst dateTitle = (date: string) => {\n  const [year, month, day] = date.split(\"-\").map(Number);\n  return new Date(year, month - 1, day).toLocaleDateString(\"en-US\", {\n    weekday: \"long\", year: \"numeric\", month: \"long\", day: \"numeric\",\n  });\n};\n\nexport function buildStockCalendarTable(events: StockEcoCal.Event[], t: Dictionary[\"economicCalendar\"], isSmall: boolean) {\n  const grouped = events.reduce<Record<string, StockEcoCal.Event[]>>((result, event) => {\n    (result[event.event_date] ||= []).push(event);\n    return result;\n  }, {});\n  const columns = [\n    { key: \"news\", header: t.holaPrime.columns.news.toUpperCase() },\n  ];\n  const groups = Object.entries(grouped).map(([date, rows]) => ({\n    title: dateTitle(date),\n    items: rows.map((event) => {\n      if (isSmall) {\n        return { key: `${event.type}-${event.id}`, rows: [{ kind: \"spanned\" as const, colSpan: \"all\" as const, content:\n          <div style={{ padding: \"14px 16px\", borderBottom: \"1px solid #E5E7EB\" }}>\n            <NewsCell event={event} t={t} />\n          </div>\n        }] };\n      }\n      return { key: `${event.type}-${event.id}`, rows: [{ kind: \"cells\" as const, data: {\n        news: <NewsCell event={event} t={t} />,\n      }}] };\n    }),\n  }));\n  return { columns, groups };\n}\n","import HolaPrimeEconomicCalendar from \"./HolaPrimeEconomicCalendar\";\n\ntype Props = { countries: { name: string; code: string }[]; dev?: boolean };\n\nexport default function HolaPrimeEconomicCalendarWithStocks(props: Props) {\n  return <HolaPrimeEconomicCalendar {...props} stocksEnabled />;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { fetchAcademyChapters } from \"../../../../functions/fetchAcademyChapters\";\nimport { ChaptersGrid } from \"./parts/ChaptersGrid\";\nimport { ChapterPage } from \"./parts/ChapterPage\";\nimport AcademyBranding, { useAcademyBranding } from \"./AcademyBranding\";\nimport { AcademyWidget } from \"../../../../types/academy\";\nimport { FancyLoader } from \"../../../FancyLoader\";\n\nconst MAX_TILE_WIDTH = 250;\nconst GAP_BETWEEN_TILES = 16;\n\nexport interface AcademyEpisode {\n  name: string;\n  key: string;\n  levelId: number;\n  description: string;\n}\n\nexport interface AcademyChapter {\n  name: string;\n  episodes: AcademyEpisode[];\n  levelId: number;\n}\n\nexport interface RawAcademyChaptersProps {\n  containerWidth: number;\n  brandName: string;\n  langCode: string;\n  widgetId: string;\n}\n\ninterface AcademyChaptersProps {\n  data: AcademyWidget;\n  dev?: boolean;\n}\n\nexport function RawAcademyChapters({\n  containerWidth,\n  brandName,\n  langCode,\n  widgetId,\n}: RawAcademyChaptersProps) {\n  const { style } = useAcademyBranding();\n  const [loading, setLoading] = useState(true);\n\n  const [chapters, setChapters] = useState<AcademyChapter[] | null>(null);\n  const [activeChapter, setActiveChapter] = useState<AcademyChapter | null>(\n    null,\n  );\n\n  useEffect(() => {\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [style.font_family] },\n        });\n      });\n    }\n  }, [style.font_family]);\n\n  useEffect(() => {\n    const fetchData = async () => {\n      setLoading(true);\n      try {\n        const newChapters = await fetchAcademyChapters(brandName, langCode);\n        setChapters(newChapters);\n      } catch (e) {\n        console.error(\"Error fetching signals data:\", e);\n        setChapters(null);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n  }, [langCode, brandName]);\n\n  if (loading) {\n    return (\n      <div\n        style={{\n          maxWidth: \"100%\",\n          margin: \"0 auto\",\n          padding: \"1.5rem 1rem\",\n          textAlign: \"center\",\n          color: \"#4A5568\", // gray-600\n        }}\n      >\n        <FancyLoader />\n      </div>\n    );\n  }\n\n  if (!chapters) {\n    return <>No chapters available</>;\n  }\n\n  const numberOfTilesPerRow = Math.floor(\n    (containerWidth + GAP_BETWEEN_TILES) / (MAX_TILE_WIDTH + GAP_BETWEEN_TILES),\n  );\n\n  return (\n    <div style={{ width: \"100%\", maxHeight: \"100%\" }}>\n      {activeChapter ? (\n        <ChapterPage\n          chapter={activeChapter}\n          onClose={() => setActiveChapter(null)}\n          containerWidth={containerWidth}\n        />\n      ) : (\n        <ChaptersGrid\n          chapters={chapters}\n          numberOfTilesPerRow={numberOfTilesPerRow}\n          gapBetweenTiles={GAP_BETWEEN_TILES}\n          setActiveChapter={setActiveChapter}\n          widgetId={widgetId}\n          headerImageExists={style.header_image_exists}\n        />\n      )}\n    </div>\n  );\n}\n\nexport default function AcademyChapters({\n  data,\n  dev = false,\n}: AcademyChaptersProps) {\n  const [containerWidth, setContainerWidth] = useState(0);\n  const observerRef = useRef<ResizeObserver | null>(null);\n\n  const containerRef = useCallback((node: HTMLDivElement | null) => {\n    if (observerRef.current) {\n      observerRef.current.disconnect();\n      observerRef.current = null;\n    }\n\n    if (node) {\n      observerRef.current = new ResizeObserver((entries) => {\n        const width = entries[0]?.contentRect.width;\n        if (width !== undefined) {\n          setContainerWidth(width);\n        }\n      });\n\n      observerRef.current.observe(node);\n    }\n  }, []);\n\n  return (\n    <AcademyBranding data={data}>\n      <div\n        ref={containerRef}\n        style={{ height: \"100%\", width: \"100%\", overflowY: \"auto\" }}\n      >\n        <AcademyBranding.WidgetContainer dev={dev}>\n          <RawAcademyChapters\n            containerWidth={containerWidth}\n            brandName={data.brand_name}\n            langCode={data.lang_code}\n            widgetId={data.id}\n          />\n        </AcademyBranding.WidgetContainer>\n      </div>\n    </AcademyBranding>\n  );\n}\n","import { AcademyChapter } from \"../components/widgets/academy/Chapters\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchAcademyChapters(brandName: string, lang: string): Promise<AcademyChapter[] | null> {\n    const url = `${WIDGET_API_BASE}/api/academy/chapters`;\n\n    try {\n        const response = await fetch(url, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ brandName, lang }),\n        });\n\n        if (!response.ok) {\n            throw new Error('API Error: ' + response.statusText);\n        }\n\n        const responseData: { data: AcademyChapter[] } | { error: string } = await response.json();\n\n        if ('error' in responseData) {\n            throw new Error('API Error: ' + responseData.error);\n        }\n\n        return responseData.data;\n    } catch (error) {\n        console.error('Fetch academy chapters error:', error);\n        return null;\n    }\n}\n\n","import { FC, useEffect, useMemo, useRef, useState } from \"react\";\nimport { AcademyChapter } from \"..\";\nimport { ChapterTile } from \"./ChapterTile\";\nimport { Image } from \"../../../../utils/Image\";\nimport { fetchAcademyHeaderImage } from \"../../../../../functions/fetchAcademyHeaderImage\";\nimport { adjustColorBrightness } from \"../../../../../utils/colors\";\nimport { useAcademyBranding } from \"../AcademyBranding\";\n\ninterface Props {\n  chapters: AcademyChapter[];\n  numberOfTilesPerRow: number;\n  gapBetweenTiles: number;\n  setActiveChapter: (chapter: AcademyChapter) => void;\n  widgetId: string;\n\n  headerImageExists: boolean;\n  imageVersion?: string | number | null;\n}\n\nconst FALLBACK_IMAGE = \"/images/academy.png\";\n\nexport const ChaptersGrid: FC<Props> = ({\n  chapters,\n  numberOfTilesPerRow,\n  gapBetweenTiles,\n  setActiveChapter,\n  widgetId,\n  headerImageExists,\n  imageVersion = null,\n}) => {\n  const { style } = useAcademyBranding();\n\n  const [imageSrc, setImageSrc] = useState<string | null>(null);\n\n  const [isFetchingUrl, setIsFetchingUrl] = useState(false);\n  const [isImgReady, setIsImgReady] = useState(false);\n  const [hasError, setHasError] = useState(false);\n\n  const [retryNonce, setRetryNonce] = useState(0);\n  const seqRef = useRef(0);\n\n  const fetchKey = useMemo(\n    () =>\n      `${widgetId}:${headerImageExists}:${imageVersion ?? \"\"}:${retryNonce}`,\n    [widgetId, headerImageExists, imageVersion, retryNonce]\n  );\n\n  useEffect(() => {\n    let alive = true;\n    const seq = ++seqRef.current;\n\n    setIsImgReady(false);\n    setHasError(false);\n\n    // If DB says no image, settle immediately (no shimmer, no fetch)\n    if (!headerImageExists) {\n      setIsFetchingUrl(false);\n      setImageSrc(FALLBACK_IMAGE);\n      return () => {\n        alive = false;\n      };\n    }\n\n    // DB says image exists: fetch presigned URL\n    setIsFetchingUrl(true);\n    setImageSrc(null); // shimmer only until url is fetched\n\n    (async () => {\n      try {\n        const urlOrNull = await fetchAcademyHeaderImage(widgetId);\n        if (!alive || seq !== seqRef.current) return;\n\n        setImageSrc(urlOrNull ?? FALLBACK_IMAGE);\n      } catch (e) {\n        console.error(\"Failed to fetch header image URL:\", e);\n        if (!alive || seq !== seqRef.current) return;\n\n        // If API fails, fall back (or keep null + show error)\n        setImageSrc(FALLBACK_IMAGE);\n      } finally {\n        if (!alive || seq !== seqRef.current) return;\n        setIsFetchingUrl(false);\n      }\n    })();\n\n    return () => {\n      alive = false;\n    };\n  }, [fetchKey, widgetId, headerImageExists]);\n\n  useEffect(() => {\n    setIsImgReady(false);\n    setHasError(false);\n  }, [imageSrc]);\n\n  const showShimmer = headerImageExists && (isFetchingUrl || !isImgReady);\n  const shouldRenderImg = imageSrc != null;\n\n  const renderSrc = hasError ? FALLBACK_IMAGE : imageSrc ?? FALLBACK_IMAGE;\n\n  const baseShimmerColor = adjustColorBrightness(\n    style.grid.container.backgroundColor,\n    30\n  );\n  const lowShimmerColor = adjustColorBrightness(\n    style.grid.container.backgroundColor,\n    10\n  );\n  const highShimmerColor = adjustColorBrightness(\n    style.grid.container.backgroundColor,\n    50\n  );\n\n  return (\n    <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}>\n      <div\n        style={{\n          position: \"relative\",\n          width: \"100%\",\n          height: 220,\n          borderRadius: \"12px\",\n          overflow: \"hidden\",\n          background: \"#ccc\",\n        }}\n      >\n        {showShimmer && (\n          <>\n            <div\n              style={{\n                position: \"absolute\",\n                inset: 0,\n\n                // diagonal + soft highlight band\n                background: `linear-gradient(\n                  115deg,\n                  ${lowShimmerColor} 0%,\n                  ${baseShimmerColor} 35%,\n                  ${highShimmerColor} 50%,\n                  ${baseShimmerColor} 65%,\n                  ${lowShimmerColor} 100%\n                )`,\n\n                // less extreme than 400%, feels more “natural”\n                backgroundSize: \"250% 250%\",\n                backgroundPosition: \"0% 0%\",\n\n                // smoother motion\n                animation:\n                  \"academyHeaderShimmer 1.25s cubic-bezier(0.4, 0, 0.2, 1) infinite\",\n\n                // optional: makes it feel less “stripy”\n                filter: \"blur(0.2px)\",\n                opacity: 0.95,\n              }}\n            />\n            <div\n              style={{\n                position: \"absolute\",\n                inset: 0,\n                background:\n                  \"linear-gradient(to bottom, rgba(255,255,255,0.10), rgba(255,255,255,0.00))\",\n                pointerEvents: \"none\",\n              }}\n            />\n          </>\n        )}\n\n        {shouldRenderImg && (\n          <Image\n            key={renderSrc}\n            src={renderSrc}\n            alt=\"academy poster\"\n            onLoad={() => setIsImgReady(true)}\n            onError={() => {\n              // If a signed URL fails, refetch once (new presign) before falling back\n              if (imageSrc && imageSrc !== FALLBACK_IMAGE && retryNonce === 0) {\n                setRetryNonce(1);\n                return;\n              }\n              setHasError(true);\n              setIsImgReady(true); // stop shimmer\n            }}\n            style={{\n              position: \"absolute\",\n              inset: 0,\n              width: \"100%\",\n              height: \"100%\",\n              objectFit: \"cover\",\n              objectPosition: \"10% 50%\",\n              opacity: isImgReady ? 1 : 0,\n              transition: \"opacity 300ms ease\",\n            }}\n          />\n        )}\n      </div>\n\n      <div\n        style={{\n          display: \"grid\",\n          gridTemplateColumns: `repeat(${numberOfTilesPerRow}, 1fr)`,\n          gap: `${gapBetweenTiles}px`,\n          marginBottom: \"1rem\",\n        }}\n      >\n        {chapters.map((chapter) => (\n          <ChapterTile\n            key={chapter.name}\n            chapter={chapter}\n            onSelect={() => setActiveChapter(chapter)}\n          />\n        ))}\n      </div>\n\n      <style>\n        {`\n          @keyframes academyHeaderShimmer {\n            0%   { background-position: 0% 0%; }\n            100% { background-position: 100% 100%; }\n          }\n        `}\n      </style>\n    </div>\n  );\n};\n","import { IconProps } from \"../types/icons\";\n\nexport function Star({\n  full = false,\n  size = 24,\n  color = \"currentColor\",\n  className,\n}: IconProps) {\n  const common = {\n    width: size,\n    height: size,\n    viewBox: \"0 0 24 24\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    className,\n    \"aria-hidden\": true,\n    focusable: false,\n  } as const;\n\n  return (\n    <svg {...common}>\n      <path\n        d=\"M12 2.6l2.97 6.02 6.65.97-4.81 4.69 1.14 6.62L12 17.98 6.05 20.9l1.14-6.62-4.81-4.69 6.65-.97L12 2.6z\"\n        fill={full ? color : \"none\"}\n        stroke={color}\n        strokeWidth={2}\n        strokeLinejoin=\"round\"\n      />\n    </svg>\n  );\n}\n","import { IconProps } from \"../types/icons\";\n\nexport function LocationPoint({\n  full = false,\n  size = 24,\n  color = \"currentColor\",\n  className,\n}: IconProps) {\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      className={className}\n      aria-hidden\n    >\n      <path\n        d=\"M12 2c-3.86 0-7 3.14-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7z\"\n        fill={full ? color : \"none\"}\n        stroke={color}\n        strokeWidth={2}\n        strokeLinejoin=\"round\"\n      />\n      <circle\n        cx=\"12\"\n        cy=\"9\"\n        r=\"2.5\"\n        fill={full ? \"none\" : color}\n        stroke={color}\n        strokeWidth={2}\n      />\n    </svg>\n  );\n}\n","import { IconProps } from \"../types/icons\";\n\nexport function Stopwatch({\n  full = false,\n  size = 24,\n  color = \"currentColor\",\n  className,\n}: IconProps) {\n  return (\n    <svg\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      className={className}\n      aria-hidden\n    >\n      <circle\n        cx=\"12\"\n        cy=\"13\"\n        r=\"8\"\n        fill={full ? color : \"none\"}\n        stroke={color}\n        strokeWidth={2}\n      />\n      <path\n        d=\"M9 2h6M12 13l3-2\"\n        stroke={full ? \"white\" : color}\n        strokeWidth={2}\n        strokeLinecap=\"round\"\n      />\n    </svg>\n  );\n}\n","import React, { createContext, useContext } from \"react\";\nimport { WidgetContainer } from \"./elements/WidgetContainer\";\nimport { Button } from \"./elements/Button\";\nimport { ScrollContainer } from \"./elements/ScrollContainer\";\nimport {\n  AcademyWidget,\n  AcademyWidgetStyle,\n} from \"../../../../../types/academy\";\n\ninterface AcademyBrandingContextType {\n  style: AcademyWidgetStyle;\n}\n\nconst AcademyBrandingContext = createContext<\n  AcademyBrandingContextType | undefined\n>(undefined);\nexport const useAcademyBranding = () => {\n  const context = useContext(AcademyBrandingContext);\n  if (!context) {\n    throw new Error(\n      \"useAcademyBranding must be used within an AcademyBranding component\"\n    );\n  }\n  return context; // now includes logoSrc\n};\n\nconst brandedElements = {\n  WidgetContainer,\n  ScrollContainer,\n  Button,\n};\n\ntype AcademyBrandingProps = {\n  data: AcademyWidget;\n  children: React.ReactNode;\n};\n\nconst AcademyBranding = Object.assign(\n  ({ data, children }: AcademyBrandingProps) => {\n    return (\n      <AcademyBrandingContext.Provider value={{ style: data.payload }}>\n        {children}\n      </AcademyBrandingContext.Provider>\n    );\n  },\n  brandedElements\n);\n\nexport default AcademyBranding;\n","import { forwardRef } from \"react\";\nimport { useAcademyBranding } from \"..\";\n\ntype WidgetContainerProps = {\n  children: React.ReactNode;\n  dev?: boolean;\n};\n\nconst WidgetContainer = forwardRef<HTMLDivElement, WidgetContainerProps>(\n  ({ children, dev = false }, ref) => {\n    const { style } = useAcademyBranding();\n\n    return (\n      <div\n        style={{\n          position: \"relative\",\n          padding: \"1rem\",\n          width: dev ? \"100%\" : \"100vw\",\n          height: dev ? \"100%\" : \"100vh\",\n          boxSizing: \"border-box\",\n        }}\n      >\n        <div\n          style={{\n            position: \"relative\",\n            display: \"flex\",\n            flexDirection: \"column\",\n            width: \"100%\",\n            gap: \"1rem\",\n            alignItems: \"center\",\n            overflowY: \"auto\",\n            height: \"calc(100% - 2rem)\",\n            padding: \"1rem\",\n            fontFamily: style.font_family,\n            background: style.grid.container.backgroundColor,\n            color: style.grid.container.color,\n            borderRadius: style.grid.container.borderRadius,\n          }}\n          ref={ref}\n        >\n          {children}\n        </div>\n      </div>\n    );\n  }\n);\n\nWidgetContainer.displayName = \"BrandedWidgetContainer\";\n\nexport { WidgetContainer };\n","import { forwardRef, useState } from \"react\";\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  hoverStyle?: React.CSSProperties;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n  const [isHovered, setIsHovered] = useState(false);\n\n  return (\n    <button\n      {...props}\n      onClick={props.onClick}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n      style={{\n        opacity: isHovered ? 0.75 : 1,\n        padding: \"0.5rem 1rem\",\n        cursor: \"pointer\",\n        transition: \"opacity 0.2s ease-in-out\",\n        ...props.style,\n        ...(isHovered ? props.hoverStyle : {}),\n      }}\n    >\n      {props.children}\n    </button>\n  );\n});\n\nButton.displayName = \"AcademyBranding.Button\";\nexport { Button as Button };\n","import React, {\n  forwardRef,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { useAcademyBranding } from \"..\";\n\ntype ScrollContainerProps = {\n  baseColor: string;\n  style?: React.CSSProperties;\n  className?: string;\n  children: React.ReactNode;\n};\n\nfunction withAlpha(color: string, alpha: number) {\n  const c = (color || \"\").trim();\n\n  const m = c.match(\n    /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*([0-9.]+))?\\s*\\)$/i\n  );\n  if (m) {\n    return `rgba(${m[1]}, ${m[2]}, ${m[3]}, ${alpha})`;\n  }\n\n  const hex = c.startsWith(\"#\") ? c.slice(1) : c;\n  if (hex.length === 3) {\n    const r = parseInt(hex[0] + hex[0], 16);\n    const g = parseInt(hex[1] + hex[1], 16);\n    const b = parseInt(hex[2] + hex[2], 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n  if (hex.length === 6) {\n    const r = parseInt(hex.slice(0, 2), 16);\n    const g = parseInt(hex.slice(2, 4), 16);\n    const b = parseInt(hex.slice(4, 6), 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n\n  return `rgba(255,255,255,${alpha})`;\n}\n\nconst ScrollContainer = forwardRef<HTMLDivElement, ScrollContainerProps>(\n  ({ baseColor, style: customStyle, className, children }, forwardedRef) => {\n    const { style } = useAcademyBranding();\n    const { height, ...restStyle } = customStyle ?? {};\n\n    const dir = (style as any)?.dir === \"rtl\" ? \"rtl\" : \"ltr\";\n    const isRTL = dir === \"rtl\";\n\n    const outerRef = useRef<HTMLDivElement>(null);\n    const viewportRef = useRef<HTMLDivElement>(null);\n    const trackRef = useRef<HTMLDivElement>(null);\n\n    // forward ref to the scroll viewport\n    useLayoutEffect(() => {\n      if (!forwardedRef) return;\n      const el = viewportRef.current;\n      if (!el) return;\n\n      if (typeof forwardedRef === \"function\") forwardedRef(el);\n      else forwardedRef.current = el;\n    }, [forwardedRef]);\n\n    const [hasOverflow, setHasOverflow] = useState(false);\n    const [thumb, setThumb] = useState({ top: 0, height: 24 });\n\n    const draggingRef = useRef(false);\n    const dragStartRef = useRef({ y: 0, scrollTop: 0, thumbTop: 0 });\n\n    const colors = useMemo(() => {\n      const base = baseColor;\n      return {\n        track: withAlpha(base, 0.1),\n        thumb: withAlpha(base, 0.35),\n        thumbHover: withAlpha(base, 0.55),\n        thumbActive: withAlpha(base, 0.75),\n      };\n    }, [baseColor]);\n\n    const recalc = () => {\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      const clientH = vp.clientHeight;\n      const scrollH = vp.scrollHeight;\n      const trackH = tr.clientHeight;\n\n      const overflow = scrollH > clientH + 1;\n      setHasOverflow(overflow);\n\n      if (!overflow) {\n        setThumb({ top: 0, height: 24 });\n        return;\n      }\n\n      const minThumb = 24;\n      const ratio = clientH / scrollH;\n      const thumbH = Math.max(minThumb, Math.floor(trackH * ratio));\n      const maxThumbTop = Math.max(0, trackH - thumbH);\n      const maxScrollTop = Math.max(1, scrollH - clientH);\n\n      const top = (vp.scrollTop / maxScrollTop) * maxThumbTop;\n      setThumb({ top, height: thumbH });\n    };\n\n    useLayoutEffect(() => {\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      let raf = 0;\n      const schedule = () => {\n        cancelAnimationFrame(raf);\n        raf = requestAnimationFrame(recalc);\n      };\n\n      schedule();\n\n      vp.addEventListener(\"scroll\", schedule, { passive: true });\n\n      const ro = new ResizeObserver(schedule);\n      ro.observe(vp);\n      ro.observe(tr);\n\n      return () => {\n        cancelAnimationFrame(raf);\n        vp.removeEventListener(\"scroll\", schedule);\n        ro.disconnect();\n      };\n    }, []);\n\n    const onTrackPointerDown = (e: React.PointerEvent) => {\n      if (!hasOverflow) return;\n      if ((e.target as HTMLElement)?.dataset?.role === \"thumb\") return;\n\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      const rect = tr.getBoundingClientRect();\n      const clickY = e.clientY - rect.top;\n\n      const maxThumbTop = tr.clientHeight - thumb.height;\n      const desiredThumbTop = Math.min(\n        maxThumbTop,\n        Math.max(0, clickY - thumb.height / 2)\n      );\n\n      const maxScrollTop = vp.scrollHeight - vp.clientHeight;\n      vp.scrollTop = (desiredThumbTop / maxThumbTop) * maxScrollTop;\n    };\n\n    const onThumbPointerDown = (e: React.PointerEvent) => {\n      if (!hasOverflow) return;\n\n      draggingRef.current = true;\n      (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n\n      dragStartRef.current = {\n        y: e.clientY,\n        scrollTop: viewportRef.current!.scrollTop,\n        thumbTop: thumb.top,\n      };\n    };\n\n    const onThumbPointerMove = (e: React.PointerEvent) => {\n      if (!draggingRef.current) return;\n\n      const vp = viewportRef.current!;\n      const tr = trackRef.current!;\n      const dy = e.clientY - dragStartRef.current.y;\n\n      const maxThumbTop = tr.clientHeight - thumb.height;\n      const maxScrollTop = vp.scrollHeight - vp.clientHeight;\n\n      const nextThumbTop = Math.min(\n        maxThumbTop,\n        Math.max(0, dragStartRef.current.thumbTop + dy)\n      );\n\n      vp.scrollTop = (nextThumbTop / maxThumbTop) * maxScrollTop;\n    };\n\n    const onThumbPointerUp = (e: React.PointerEvent) => {\n      draggingRef.current = false;\n      try {\n        (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n      } catch {}\n    };\n\n    return (\n      <div\n        ref={outerRef}\n        style={{\n          position: \"relative\",\n          width: \"100%\",\n          boxSizing: \"border-box\",\n\n          ...(height != null ? { height } : {}),\n          ...(restStyle.flex != null ? {} : { flex: \"1 1 auto\" }),\n          minHeight: 0,\n\n          ...restStyle,\n        }}\n        className={className}\n      >\n        <style>{`\n          .nfViewport {\n            overflow: auto;\n            scrollbar-width: none;\n          }\n          .nfViewport::-webkit-scrollbar {\n            width: 0;\n            height: 0;\n          }\n          .nfTrack {\n            position: absolute;\n            top: 0;\n            bottom: 0;\n            width: var(--sbw, 10px);\n            opacity: 0;\n            transition: opacity 160ms ease;\n          }\n          .nfScrollRoot:hover .nfTrack {\n            opacity: 1;\n          }\n          .nfThumb {\n            position: absolute;\n            left: 1px;\n            right: 1px;\n            border-radius: 999px;\n            cursor: pointer;\n            touch-action: none;\n          }\n          @media (hover: none) {\n            .nfTrack { opacity: 0.25; }\n            .nfScrollRoot { --sbw: 6px; }\n          }\n        `}</style>\n\n        <div\n          className=\"nfScrollRoot\"\n          dir={dir}\n          style={{\n            position: \"relative\",\n            display: \"flex\",\n            flexDirection: \"column\",\n            height: \"100%\",\n            minHeight: 0,\n          }}\n        >\n          <div\n            ref={viewportRef}\n            className=\"nfViewport\"\n            style={{\n              flex: \"1 1 auto\",\n              minHeight: 0,\n              paddingRight: isRTL ? undefined : `var(--sbw, 10px)`,\n              paddingLeft: isRTL ? `var(--sbw, 10px)` : undefined,\n            }}\n          >\n            {children}\n          </div>\n\n          <div\n            ref={trackRef}\n            className=\"nfTrack\"\n            onPointerDown={onTrackPointerDown}\n            style={{\n              display: hasOverflow ? \"block\" : \"none\",\n              background: colors.track,\n              borderRadius: 999,\n              right: isRTL ? undefined : 0,\n              left: isRTL ? 0 : undefined,\n            }}\n          >\n            <div\n              data-role=\"thumb\"\n              className=\"nfThumb\"\n              onPointerDown={onThumbPointerDown}\n              onPointerMove={onThumbPointerMove}\n              onPointerUp={onThumbPointerUp}\n              onPointerCancel={onThumbPointerUp}\n              style={{\n                top: thumb.top,\n                height: thumb.height,\n                background: colors.thumb,\n              }}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n);\n\nScrollContainer.displayName = \"BrandedScrollContainer\";\nexport { ScrollContainer };\n","import { FC } from \"react\";\nimport { AcademyChapter } from \"..\";\nimport { Star } from \"../../../../Star\";\nimport { LocationPoint } from \"../../../../LoactionPoint\";\nimport { Stopwatch } from \"../../../../Stopwatch\";\nimport AcademyBranding, { useAcademyBranding } from \"../AcademyBranding\";\n\nconst EXAMPLE_DESCRIPTION =\n  \"This is an example description for the chapter page. It provides an overview of the chapter content and objectives.\";\n\ninterface Props {\n  chapter: AcademyChapter;\n  onSelect: () => void;\n}\n\nexport const ChapterTile: FC<Props> = ({ chapter, onSelect }) => {\n  const { style } = useAcademyBranding();\n\n  const handleCheckout = () => {\n    //alert(`Proceeding to checkout for chapter: ${chapter.name}`);\n  };\n\n  const title = chapter.name.replace(/^\\d+\\.\\s*/, \"\");\n\n  return (\n    <>\n      <div className=\"tile-container\" onClick={onSelect}>\n        <div className=\"tile-content\">\n          <h3 className=\"tile-title\">{title}</h3>\n\n          <ChapterDetails\n            online={true}\n            numberOfEpisodes={chapter.episodes.length}\n          />\n\n          <p className=\"tile-description\">{EXAMPLE_DESCRIPTION}</p>\n        </div>\n        <ChapterLevel levelId={chapter.levelId} />\n        <AcademyBranding.Button\n          style={{ ...style.grid.checkoutButton, width: \"fit-content\" }}\n          hoverStyle={style.grid.checkoutButton.hover}\n          onClick={onSelect}\n        >\n          Checkout\n        </AcademyBranding.Button>\n      </div>\n      <style>{`\n        .tile-container {\n          display: flex;\n          flex-direction: column;\n          justify-content: space-between;\n          gap: 1rem;\n          width: 100%;\n          min-height: 200px;\n          padding: 1rem;\n          transition: all 0.3s ease;\n          background: ${style.grid.tile.backgroundColor};\n          border-radius: ${style.grid.tile.borderRadius};\n          border-width: ${style.grid.tile.borderWidth};\n          border-style: solid;\n          border-color: ${style.grid.tile.borderColor};\n          color: ${style.grid.tile.color};\n        }\n        .tile-container:hover {\n          background: ${style.grid.tile.hover.backgroundColor};\n          border-style: solid;\n          border-color: ${style.grid.tile.hover.borderColor};\n          color: ${style.grid.tile.hover.color};\n          cursor: pointer;\n        }\n        .tile-content {\n          flex: 1;\n          display: flex;\n          flex-direction: column;\n          gap: 0.5rem;\n        }\n        .tile-description {\n          font-size: 0.75rem;\n        }\n        .tile-title {\n          margin: 0;\n          font-size: 1rem;\n          font-weight: 600;\n        }\n      `}</style>\n    </>\n  );\n};\n\nconst ChapterDetails: FC<{ online: boolean; numberOfEpisodes: number }> = ({\n  online,\n  numberOfEpisodes,\n}) => {\n  const { style } = useAcademyBranding();\n  return (\n    <div className=\"chapter-details-container\">\n      <div className=\"chapter-detail\">\n        <LocationPoint full={false} size={20} />\n        <span>{online ? \"Online\" : \"Offline\"}</span>\n      </div>\n      <div className=\"chapter-detail\">\n        <Stopwatch full={false} size={20} />\n        <span>{numberOfEpisodes} episodes</span>\n      </div>\n\n      <style>{`\n        .chapter-details-container {\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n          font-size: 0.75rem;\n          opacity: 0.6;\n        }\n        .chapter-detail {\n          display: flex;\n          align-items: center;\n        }\n      `}</style>\n    </div>\n  );\n};\n\nconst ChapterLevel: FC<{ levelId: number }> = ({ levelId }) => {\n  const color = \"#ffb204\"; // Gold color for stars\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"space-around\",\n        gap: \"0.5rem\",\n      }}\n    >\n      <span style={{ color, fontSize: \"0.875rem\", fontWeight: \"bold\" }}>\n        {levelId === 1\n          ? \"Beginner\"\n          : levelId === 2\n          ? \"Intermediate\"\n          : \"Advanced\"}\n      </span>\n      <div style={{ display: \"flex\", alignItems: \"center\" }}>\n        <Star full={levelId >= 1} color={color} size={20} />\n        <Star full={levelId >= 2} color={color} size={20} />\n        <Star full={levelId >= 3} color={color} size={20} />\n      </div>\n    </div>\n  );\n};\n","import { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchAcademyHeaderImage(widgetId: string): Promise<string | null> {\n    const url = `${WIDGET_API_BASE}/api/academy/header-image`;\n\n    const response = await fetch(url, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ widgetId, widgetType: \"academy\" }),\n    });\n\n    const data = await response.json().catch(() => ({}));\n\n    if (!response.ok) throw new Error(`Header image API failed: ${response.status}`);\n\n    return (data?.imageUrl ?? null) as string | null;\n}\n","\"use client\";\n\nimport { FC, useEffect, useState } from \"react\";\nimport { AcademyChapter, AcademyEpisode } from \"..\";\nimport { fetchAcademyPdfUrl } from \"../../../../../functions/fetchAcademyPdfUrl\";\nimport { pdfjs } from \"react-pdf\";\nimport { PdfModal } from \"./PdfModal\";\nimport { PdfThumbnails } from \"./PdfThumbnails\";\nimport AcademyBranding, { useAcademyBranding } from \"../AcademyBranding\";\n\n// IMPORTANT: must be in the SAME module that uses <Document>/<Page>/<Thumbnail>\npdfjs.GlobalWorkerOptions.workerSrc = `https://unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\n\ninterface Props {\n  chapter: AcademyChapter;\n  containerWidth: number;\n  onClose: () => void;\n}\n\nexport const ChapterPage: FC<Props> = ({\n  chapter,\n  containerWidth,\n  onClose,\n}) => {\n  const { style } = useAcademyBranding();\n  const [activeEpisodeIndex, setActiveEpisodeIndex] = useState<number>(0);\n  const activeEpisode = chapter.episodes[activeEpisodeIndex];\n  const chapterTitle = chapter.name.replace(/^\\d+\\.\\s*/, \"\");\n\n  const [pdfUrl, setPdfUrl] = useState<string | null>(null);\n  const [numPages, setNumPages] = useState<number>(0);\n  const [pdfOpen, setPdfOpen] = useState(false);\n  const [selectedPage, setSelectedPage] = useState<number>(1);\n\n  const [lessonListOpen, setLessonListOpen] = useState<boolean>(false);\n\n  useEffect(() => {\n    // Load Dyntube script\n    const src = \"https://embed.dyntube.com/v1.0/dyntube.js\";\n    if (document.querySelector(`script[src=\"${src}\"]`)) return;\n\n    const script = document.createElement(\"script\");\n    script.src = src;\n    script.async = true;\n    document.body.appendChild(script);\n  }, []);\n\n  useEffect(() => {\n    // Fetch PDF URL for the active episode\n    const fetchPdfUrl = async () => {\n      try {\n        const url = await fetchAcademyPdfUrl(chapterTitle, activeEpisode.name);\n        setPdfUrl(url);\n      } catch (error) {\n        console.error(\"Error fetching PDF URL:\", error);\n        setPdfUrl(null);\n      }\n    };\n\n    fetchPdfUrl();\n    // reset modal state when switching episode\n    setPdfOpen(false);\n    setSelectedPage(1);\n    setNumPages(0);\n  }, [activeEpisode, chapterTitle]);\n\n  const isNarrow = containerWidth < 660;\n\n  useEffect(() => {\n    // Close lesson list when resizing to wide\n    if (!isNarrow) {\n      setLessonListOpen(false);\n    }\n  }, [isNarrow]);\n\n  useEffect(() => {\n    if (!lessonListOpen) return;\n    const prev = document.body.style.overflow;\n    document.body.style.overflow = \"hidden\";\n    return () => {\n      document.body.style.overflow = prev;\n    };\n  }, [lessonListOpen]);\n\n  useEffect(() => {\n    if (!lessonListOpen) return;\n    const onKeyDown = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") setLessonListOpen(false);\n    };\n    window.addEventListener(\"keydown\", onKeyDown);\n    return () => window.removeEventListener(\"keydown\", onKeyDown);\n  }, [lessonListOpen]);\n\n  return (\n    <>\n      <div className=\"chapter-page-container\">\n        <div className=\"chapter-header\">\n          <h1 className=\"chapter-title\">{chapterTitle}</h1>\n          <p className=\"chapter-description\">{activeEpisode.description}</p>\n        </div>\n\n        <div className=\"page-content\">\n          {/* Desktop sidebar */}\n          {!isNarrow && (\n            <NavigationBar\n              onClose={onClose}\n              episodes={chapter.episodes}\n              activeIndex={activeEpisodeIndex}\n              onSelectIndex={setActiveEpisodeIndex}\n              isMobileMenu={false}\n            />\n          )}\n\n          <div className=\"chapter-content\">\n            {/* Mobile: open menu button */}\n            {isNarrow && (\n              <div className=\"mobile-menu-bar\">\n                <AcademyBranding.Button\n                  onClick={() => setLessonListOpen(true)}\n                  style={style.chapter.navigationButton}\n                  hoverStyle={style.chapter.navigationButton.hover}\n                >\n                  Show Lessons\n                </AcademyBranding.Button>\n              </div>\n            )}\n\n            <AcademyBranding.ScrollContainer\n              style={{ flex: 1, minHeight: 0 }}\n              baseColor={style.grid.container.color || \"black\"}\n            >\n              <div className=\"academy-view\">\n                <div\n                  style={{ maxWidth: pdfUrl ? 600 : \"100%\", padding: \"0.5rem\" }}\n                >\n                  <div\n                    key={activeEpisode.key}\n                    data-dyntube-key={activeEpisode.key}\n                  />\n                </div>\n\n                {pdfUrl && (\n                  <div className=\"pdf-section\">\n                    <PdfThumbnails\n                      pdfUrl={pdfUrl}\n                      onSelectPage={(pageNumber) => {\n                        setSelectedPage(pageNumber);\n                        setPdfOpen(true);\n                      }}\n                      numPages={numPages}\n                      setNumPages={setNumPages}\n                    />\n\n                    {pdfOpen && numPages > 0 && (\n                      <PdfModal\n                        pdfUrl={pdfUrl}\n                        numPages={numPages}\n                        initialPage={selectedPage}\n                        onClose={() => setPdfOpen(false)}\n                      />\n                    )}\n                  </div>\n                )}\n              </div>\n            </AcademyBranding.ScrollContainer>\n          </div>\n\n          {/* Mobile overlay drawer */}\n          {isNarrow && lessonListOpen && (\n            <div\n              className=\"nav-overlay\"\n              role=\"dialog\"\n              aria-modal=\"true\"\n              aria-label=\"Lessons menu\"\n              onMouseDown={(e) => {\n                // click outside drawer closes\n                if (e.target === e.currentTarget) setLessonListOpen(false);\n              }}\n            >\n              <div className=\"nav-backdrop\" />\n              <div className=\"nav-drawer\">\n                <NavigationBar\n                  onClose={onClose}\n                  episodes={chapter.episodes}\n                  activeIndex={activeEpisodeIndex}\n                  onSelectIndex={(i) => {\n                    setActiveEpisodeIndex(i);\n                    setLessonListOpen(false);\n                  }}\n                  isMobileMenu={true}\n                  onRequestCloseMenu={() => setLessonListOpen(false)}\n                />\n              </div>\n            </div>\n          )}\n        </div>\n      </div>\n\n      <style>{`\n        .chapter-page-container {\n          width: 100%;\n          height: 100%;\n          min-height: 0;\n          display: flex;\n          flex-direction: column;\n          gap: 1rem;\n          background: ${style.chapter.container.backgroundColor};\n          color: ${style.chapter.container.color};\n        }\n\n        .chapter-header {\n          width: 100%;\n          display: flex;\n          flex-direction: column;\n          gap: 0.25rem;\n          flex: 0 0 auto;\n          background: ${style.chapter.header.backgroundColor};\n          color: ${style.chapter.header.color};\n          padding: 1rem;\n          border-radius: ${style.chapter.header.borderRadius};\n          border-width: ${style.chapter.header.borderWidth};\n          border-style: solid;\n          border-color: ${style.chapter.header.borderColor};\n        }\n\n        .chapter-title {\n          margin: 0;\n          font-size: 1.5rem;\n          font-weight: bold;\n        }\n\n        .page-content {\n          flex: 1;\n          min-height: 0;\n          display: flex;\n          gap: 1rem;\n        }\n\n        .navigation {\n          width: 250px;\n          min-height: 0;\n          display: flex;\n          flex-direction: column;\n          padding: 1rem;\n          padding: 0.5rem;\n          gap: 0.75rem;\n        }\n\n        .chapter-content {\n          flex: 1;\n          min-width: 0;\n          min-height: 0;\n          display: flex;\n          flex-direction: column;\n        }\n\n        .episode-list {\n          list-style: none;\n          padding: 0;\n          margin: 0.5rem 0 0;\n          display: flex;\n          flex-direction: column;\n          padding: 0 0.5rem;\n          gap: 0.5rem;\n        }\n\n        .episode-item { margin: 0; }\n\n        .episode-btn {\n          width: 100%;\n          border-radius: ${style.chapter.episodeListButton.borderRadius};\n          padding: 0.65rem 0.75rem;\n          display: flex;\n          align-items: center;\n          gap: 0.6rem;\n          cursor: pointer;\n          text-align: left;\n          transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;\n          background: ${style.chapter.episodeListButton.backgroundColor};\n          color: ${style.chapter.episodeListButton.color};\n          border-width: ${style.chapter.episodeListButton.borderWidth};\n          border-style: solid;\n          border-color: ${style.chapter.episodeListButton.borderColor};\n        }\n        \n        .episode-btn:hover {\n          transform: translateY(-1px);\n          background: ${style.chapter.episodeListButton.hover.backgroundColor};\n          color: ${style.chapter.episodeListButton.hover.color};\n          border-style: solid;\n          border-color: ${style.chapter.episodeListButton.hover.borderColor};\n        }\n\n        .episode-btn.is-active {\n          background: ${style.chapter.episodeListButton.active.backgroundColor};\n          color: ${style.chapter.episodeListButton.active.color};\n          border-width: ${style.chapter.episodeListButton.active.borderWidth};\n          border-style: solid;\n          border-color: ${style.chapter.episodeListButton.active.borderColor};\n        }\n\n        .episode-dot {\n          width: 10px;\n          height: 10px;\n          border-radius: 999px;\n          border: 2px solid rgba(255,255,255,0.45);\n          flex: 0 0 auto;\n        }\n\n        .episode-name {\n          font-size: 0.95rem;\n          line-height: 1.2;\n          word-break: break-word;\n        }\n\n        .pdf-section {\n          margin-top: 1rem;\n        }\n\n        .page-content {\n  flex: 1;\n  min-height: 0;\n  display: flex;\n  gap: 1rem;\n}\n\n.mobile-menu-bar {\n  position: sticky;\n  top: 0;\n  z-index: 5;\n  padding-bottom: 0.75rem;\n  backdrop-filter: blur(8px);\n}\n\n.navigation {\n  width: 250px;\n  min-height: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 0.75rem;\n  padding: 0.5rem;\n}\n\n.nav-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 0.75rem;\n}\n\n.nav-close {\n  width: 40px;\n  height: 40px;\n  border-radius: 12px;\n  border: 1px solid rgba(255,255,255,0.18);\n  background: rgba(0,0,0,0.25);\n  color: inherit;\n  cursor: pointer;\n  transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;\n}\n.nav-close:hover {\n  transform: translateY(-1px);\n  background: rgba(0,0,0,0.35);\n  border-color: rgba(255,255,255,0.28);\n}\n\n/* MOBILE OVERLAY */\n.nav-overlay {\n  position: fixed;\n  inset: 0;\n  z-index: 2000;\n  display: flex;\n  justify-content: flex-start;\n  align-items: stretch;\n}\n\n.nav-backdrop {\n  position: absolute;\n  inset: 0;\n  background: rgba(0,0,0,0.55);\n  backdrop-filter: blur(6px);\n}\n\n.nav-drawer {\n  position: relative;\n  height: 100%;\n  width: min(92vw, 360px);\n  padding: 0.75rem;\n  box-sizing: border-box;\n  background: ${style.chapter.container.backgroundColor};\n  border-right: 1px solid rgba(255,255,255,0.12);\n  box-shadow: 12px 0 30px rgba(0,0,0,0.35);\n  animation: navSlideIn 160ms ease-out;\n}\n\n/* drawer nav should fill drawer, not fixed 250px */\n.navigation.is-mobile-menu {\n  width: 100%;\n  max-width: 100%;\n}\n\n@keyframes navSlideIn {\n  from { transform: translateX(-12px); opacity: 0.85; }\n  to   { transform: translateX(0); opacity: 1; }\n}\n      `}</style>\n    </>\n  );\n};\n\nconst NavigationBar: FC<{\n  onClose: () => void;\n  episodes: AcademyEpisode[];\n  activeIndex: number;\n  onSelectIndex: (index: number) => void;\n  isMobileMenu?: boolean;\n  onRequestCloseMenu?: () => void; // NEW\n}> = ({\n  onClose,\n  episodes,\n  activeIndex,\n  onSelectIndex,\n  isMobileMenu,\n  onRequestCloseMenu,\n}) => {\n  const { style } = useAcademyBranding();\n\n  return (\n    <div className={`navigation ${isMobileMenu ? \"is-mobile-menu\" : \"\"}`}>\n      <div className=\"nav-header\">\n        <AcademyBranding.Button\n          onClick={onClose}\n          style={{\n            ...style.chapter.navigationButton,\n            width: \"100%\",\n            marginLeft: \"0.5rem\",\n            marginRight: \"1.0rem\",\n          }}\n          hoverStyle={style.chapter.navigationButton.hover}\n        >\n          Back to Chapters\n        </AcademyBranding.Button>\n\n        {isMobileMenu && (\n          <button\n            type=\"button\"\n            className=\"nav-close\"\n            onClick={onRequestCloseMenu}\n            aria-label=\"Close lessons menu\"\n          >\n            ✕\n          </button>\n        )}\n      </div>\n\n      <AcademyBranding.ScrollContainer\n        style={{ flex: 1, minHeight: 0 }}\n        baseColor={style.grid.container.color || \"black\"}\n      >\n        <ul className=\"episode-list\" role=\"radiogroup\" aria-label=\"Episodes\">\n          {episodes.map((episode, index) => {\n            const active = index === activeIndex;\n\n            return (\n              <li key={episode.key} className=\"episode-item\">\n                <button\n                  type=\"button\"\n                  className={`episode-btn ${active ? \"is-active\" : \"\"}`}\n                  onClick={() => onSelectIndex(index)}\n                  aria-checked={active}\n                  role=\"radio\"\n                >\n                  <span className=\"episode-dot\" aria-hidden=\"true\" />\n                  <span className=\"episode-name\">{episode.name}</span>\n                </button>\n              </li>\n            );\n          })}\n        </ul>\n      </AcademyBranding.ScrollContainer>\n    </div>\n  );\n};\n","import { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchAcademyPdfUrl(chapter: string, lesson: string): Promise<string | null> {\n    const url = `${WIDGET_API_BASE}/api/academy/pdf`;\n\n    try {\n        const response = await fetch(url, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ chapter, lesson }),\n        });\n        const responseData: { pdfSrc: string } | { error: string } = await response.json();\n\n        if (!response.ok || ('error' in responseData)) {\n            if ('error' in responseData) {\n                throw new Error('API Error: ' + responseData.error);\n            }\n            throw new Error('API Error: No data');\n        }\n\n        return responseData.pdfSrc;\n    } catch (error) {\n        console.error('Fetch error:', error);\n        return null;\n    }\n}","\"use client\";\n\nimport { FC, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Document, Page } from \"react-pdf\";\nimport AcademyBranding, { useAcademyBranding } from \"../AcademyBranding\";\n\nconst clamp = (v: number, min: number, max: number) =>\n  Math.max(min, Math.min(max, v));\n\nexport const PdfModal: FC<{\n  pdfUrl: string;\n  numPages: number;\n  initialPage: number;\n  onClose: () => void;\n}> = ({ pdfUrl, numPages, initialPage, onClose }) => {\n  const { style } = useAcademyBranding();\n\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const pageElsRef = useRef<(HTMLDivElement | null)[]>([]);\n\n  // --- Zoom controls ---\n  const [zoom, setZoom] = useState<number>(1); // 1 = 100%\n  const [fitWidth, setFitWidth] = useState<boolean>(true);\n\n  // Fit-width: compute a zoom that fits a \"base page width\" into the container\n  // (tune BASE_PAGE_WIDTH to whatever your PDF typically looks like)\n  const BASE_PAGE_WIDTH = 900;\n\n  useEffect(() => {\n    if (!fitWidth) return;\n\n    const el = containerRef.current;\n    if (!el) return;\n\n    const compute = () => {\n      // subtract padding; your css uses padding: 1rem\n      const paddingPx = 32; // ~ 1rem left + 1rem right\n      const available = Math.max(320, el.clientWidth - paddingPx);\n      const nextZoom = clamp(available / BASE_PAGE_WIDTH, 0.5, 2.5);\n      setZoom(nextZoom);\n    };\n\n    compute();\n\n    const ro = new ResizeObserver(() => compute());\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [fitWidth]);\n\n  // Reset zoom when opening a new doc (optional)\n  useEffect(() => {\n    setFitWidth(true);\n  }, [pdfUrl]);\n\n  const zoomPct = Math.round(zoom * 100);\n\n  // Ensure stable array length\n  useEffect(() => {\n    pageElsRef.current = Array.from(\n      { length: numPages },\n      (_, i) => pageElsRef.current[i] ?? null\n    );\n  }, [numPages]);\n\n  // Close on ESC + add zoom hotkeys\n  useEffect(() => {\n    const onKeyDown = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") onClose();\n\n      // Ctrl/Cmd +/- zoom\n      const ctrl = e.ctrlKey || e.metaKey;\n      if (!ctrl) return;\n\n      if (e.key === \"+\" || e.key === \"=\") {\n        e.preventDefault();\n        setFitWidth(false);\n        setZoom((z) => clamp(z + 0.1, 0.5, 3));\n      } else if (e.key === \"-\") {\n        e.preventDefault();\n        setFitWidth(false);\n        setZoom((z) => clamp(z - 0.1, 0.5, 3));\n      } else if (e.key.toLowerCase() === \"0\") {\n        e.preventDefault();\n        setFitWidth(false);\n        setZoom(1);\n      }\n    };\n\n    window.addEventListener(\"keydown\", onKeyDown);\n    return () => window.removeEventListener(\"keydown\", onKeyDown);\n  }, [onClose]);\n\n  // Scroll to selected page after render\n  useEffect(() => {\n    const idx = Math.max(1, Math.min(numPages, initialPage)) - 1;\n\n    const raf1 = requestAnimationFrame(() => {\n      const raf2 = requestAnimationFrame(() => {\n        const el = pageElsRef.current[idx];\n        if (el) el.scrollIntoView({ block: \"start\" });\n        else if (containerRef.current) containerRef.current.scrollTop = 0;\n      });\n      return () => cancelAnimationFrame(raf2);\n    });\n\n    return () => cancelAnimationFrame(raf1);\n  }, [initialPage, numPages]);\n\n  return (\n    <div\n      className=\"pdf-modal-backdrop\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n      onMouseDown={onClose}\n    >\n      <div className=\"pdf-modal\" onMouseDown={(e) => e.stopPropagation()}>\n        <div className=\"pdf-modal-header\">\n          <AcademyBranding.Button\n            style={{\n              ...style.chapter.pdfModal.closeButton,\n              width: \"fit-content\",\n            }}\n            hoverStyle={style.chapter.pdfModal.closeButton.hover}\n            onClick={onClose}\n          >\n            Close\n          </AcademyBranding.Button>\n\n          <div className=\"pdf-modal-title\">\n            PDF · Page {initialPage} / {numPages}\n          </div>\n\n          {/* Zoom controls (right side) */}\n          <div className=\"pdf-zoom\">\n            <button\n              type=\"button\"\n              className=\"pdf-zoom-btn\"\n              onClick={() => {\n                setFitWidth(false);\n                setZoom((z) => clamp(z - 0.1, 0.5, 3));\n              }}\n              aria-label=\"Zoom out\"\n              title=\"Zoom out\"\n            >\n              −\n            </button>\n\n            <button\n              type=\"button\"\n              className=\"pdf-zoom-pill\"\n              onClick={() => {\n                setFitWidth(false);\n                setZoom(1);\n              }}\n              title=\"Reset zoom\"\n            >\n              {zoomPct}%\n            </button>\n\n            <button\n              type=\"button\"\n              className=\"pdf-zoom-btn\"\n              onClick={() => {\n                setFitWidth(false);\n                setZoom((z) => clamp(z + 0.1, 0.5, 3));\n              }}\n              aria-label=\"Zoom in\"\n              title=\"Zoom in\"\n            >\n              +\n            </button>\n\n            <button\n              type=\"button\"\n              className={`pdf-zoom-fit ${fitWidth ? \"is-on\" : \"\"}`}\n              onClick={() => setFitWidth((v) => !v)}\n              title=\"Fit to width\"\n            >\n              Fit\n            </button>\n          </div>\n        </div>\n\n        <div className=\"pdf-modal-body\" ref={containerRef}>\n          <Document file={pdfUrl}>\n            {Array.from({ length: numPages }, (_, i) => {\n              const pageNumber = i + 1;\n              return (\n                <div\n                  key={pageNumber}\n                  className=\"pdf-page-wrap\"\n                  ref={(node) => {\n                    pageElsRef.current[pageNumber - 1] = node;\n                  }}\n                >\n                  <Page\n                    pageNumber={pageNumber}\n                    scale={zoom}\n                    renderTextLayer={false}\n                    renderAnnotationLayer={false}\n                  />\n                </div>\n              );\n            })}\n          </Document>\n        </div>\n      </div>\n\n      <style>{`\n        .pdf-modal-backdrop {\n            position: fixed;\n            inset: 0;\n            backdrop-filter: blur(6px);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            z-index: 9999;\n            padding: 1rem;\n        }\n\n        .pdf-modal {\n            width: min(1100px, 100%);\n            height: min(90vh, 900px);\n            background: rgba(20,20,20,0.95);\n            border: 1px solid rgba(255,255,255,0.12);\n            border-radius: 14px;\n            display: flex;\n            flex-direction: column;\n            overflow: hidden;\n        }\n\n        .pdf-modal-header {\n            display: grid;\n            grid-template-columns: 1fr auto 1fr;\n            align-items: center;\n            padding: 0.75rem;\n            border-bottom: 1px solid rgba(255,255,255,0.12);\n            gap: 0.75rem;\n            background: ${style.chapter.pdfModal.content.backgroundColor};\n            color: ${style.chapter.pdfModal.content.color};\n        }\n\n        .pdf-close {\n            justify-self: start;\n            border-radius: 10px;\n            padding: 0.45rem 0.7rem;\n            background: ${style.chapter.pdfModal.closeButton.backgroundColor};\n            color: ${style.chapter.pdfModal.closeButton.color};\n            border: ${style.chapter.pdfModal.closeButton.borderWidth} solid ${style.chapter.pdfModal.closeButton.borderColor};\n            cursor: pointer;\n        }\n        \n        .pdf-close:hover {\n            background: ${style.chapter.pdfModal.closeButton.hover.backgroundColor};\n            color: ${style.chapter.pdfModal.closeButton.hover.color};\n            border: ${style.chapter.pdfModal.closeButton.hover.borderWidth} solid ${style.chapter.pdfModal.closeButton.hover.borderColor};\n        }\n\n        .pdf-modal-title {\n            font-weight: 600;\n            opacity: 0.9;\n            text-align: center;\n        }\n\n        .pdf-zoom {\n            justify-self: end;\n            display: inline-flex;\n            align-items: center;\n            gap: 0.4rem;\n        }\n\n        .pdf-zoom-btn, .pdf-zoom-pill, .pdf-zoom-fit {\n            border-radius: 10px;\n            padding: 0.45rem 0.65rem;\n            background: rgba(255,255,255,0.08);\n            cursor: pointer;\n            user-select: none;\n        }\n\n        .pdf-zoom-pill {\n            min-width: 64px;\n            text-align: center;\n            opacity: 0.95;\n        }\n\n        .pdf-zoom-fit.is-on {\n            background: rgba(255,255,255,0.16);\n        }\n\n        .pdf-modal-body {\n            flex: 1;\n            overflow: auto;\n            padding: 1rem;\n        }\n\n        .pdf-page-wrap {\n            margin: 0 auto 1rem;\n            width: fit-content;\n            border-radius: 10px;\n            overflow: hidden;\n            border: 1px solid rgba(255,255,255,0.10);\n        }\n      `}</style>\n    </div>\n  );\n};\n","import { FC, useState } from \"react\";\nimport { Document, Thumbnail } from \"react-pdf\";\n\ninterface Props {\n  pdfUrl: string;\n  onSelectPage: (pageNumber: number) => void;\n  numPages: number;\n  setNumPages: (numPages: number) => void;\n}\n\nexport const PdfThumbnails: FC<Props> = ({\n  pdfUrl,\n  onSelectPage,\n  numPages,\n  setNumPages,\n}) => {\n  return (\n    <div className=\"pdf-tiles\">\n      <Document\n        file={pdfUrl}\n        onLoadSuccess={({ numPages }) => {\n          console.log(\"PDF loaded, pages:\", numPages);\n          setNumPages(numPages);\n        }}\n        onLoadError={(err) => console.error(\"PDF load error:\", err)}\n        onSourceError={(err) => console.error(\"PDF source error:\", err)}\n        loading={<div className=\"pdf-loading\">Loading PDF…</div>}\n        error={\n          <div className=\"pdf-error\">Failed to load PDF (check console).</div>\n        }\n      >\n        {Array.from({ length: numPages }, (_, i) => {\n          const pageNumber = i + 1;\n          return (\n            <button\n              key={pageNumber}\n              type=\"button\"\n              className=\"pdf-tile\"\n              onClick={() => onSelectPage(pageNumber)}\n              aria-label={`Open PDF page ${pageNumber}`}\n            >\n              {/* Thumbnail is lighter than Page for tiles */}\n              <Thumbnail pageNumber={pageNumber} width={256} />\n              <div className=\"pdf-tile-label\">Page {pageNumber}</div>\n            </button>\n          );\n        })}\n      </Document>\n      <style>{`\n        .pdf-tiles {\n            width: 100%;\n            display: flex;\n            flex-wrap: nowrap;\n            overflow-x: auto;\n            gap: 0.75rem;\n        }\n\n        .pdf-tile {\n          border: 1px solid rgba(255,255,255,0.15);\n          border-radius: 12px;\n          padding: 0.5rem;\n          background: rgba(0,0,0,0.15);\n          cursor: pointer;\n          text-align: center;\n        }\n\n        .pdf-tile:hover {\n          transform: translateY(-1px);\n        }\n\n        .pdf-tile-label {\n          margin-top: 0.35rem;\n          font-size: 0.85rem;\n          opacity: 0.8;\n        }\n      `}</style>\n    </div>\n  );\n};\n","import { useEffect, useState, useRef } from \"react\";\nimport { HiXMark } from \"react-icons/hi2\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { Dictionary, HeatmapPeriodsT } from \"../../../types/Dictionary\";\nimport { HeatmapPeriodOption } from \"../../../types/Heatmap\";\nimport { fetchHeatmapData } from \"../../../functions/fetchHeatmapData\";\nimport { MAX_CURRENCIES, PERIOD_CODE_MAP } from \"./constants\";\nimport dictionaries from \"../../../dictionaries\";\nimport { formatLangFilename } from \"../../../utils/formatLangFilename\";\nimport Branded from \"../../Branded\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport { Image } from \"../../../components/utils/Image\";\nimport { LogoBG } from \"../../Branded/elements/LogoBG\";\nimport FitText from \"../../FitText\";\nimport { PeriodNavigator } from \"./PeriodNavigator\";\nimport { CellContent } from \"./CellContent\";\n\ninterface RawHeatmapProps {\n  currencies: string[];\n  styles: WidgetStyle;\n  containerWidth: number;\n}\n\ninterface HeatmapProps {\n  currencies: string[];\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nexport function RawHeatmap({\n  styles,\n  currencies,\n  containerWidth,\n}: RawHeatmapProps) {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [selectedCurrencies, setSelectedCurrencies] = useState<string[]>(\n    currencies.slice(0, 6),\n  );\n  const [tooManyCurrencies, setTooManyCurrencies] = useState<boolean>(false);\n  const [selectedPeriod, setSelectedPeriod] =\n    useState<HeatmapPeriodOption>(\"15m\");\n  const [heatmapValues, setHeatmapValues] = useState<Record<\n    string,\n    number\n  > | null>(null);\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, []);\n\n  useEffect(() => {\n    const fetchData = async () => {\n      setLoading(true);\n      try {\n        const newHeatmapValues = await fetchHeatmapData(\n          selectedCurrencies,\n          PERIOD_CODE_MAP[selectedPeriod],\n        );\n        if (!newHeatmapValues) {\n          throw new Error(\"Failed to fetch data\");\n        }\n        setHeatmapValues(newHeatmapValues);\n      } catch (e) {\n        console.error(e);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n  }, [selectedCurrencies, selectedPeriod]);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation: Dictionary =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n  }, []);\n\n  const selectCurrency = (currency: string, isSelected: boolean) => {\n    if (isSelected) {\n      setSelectedCurrencies(selectedCurrencies.filter((c) => c !== currency));\n    } else {\n      if (selectedCurrencies.length >= MAX_CURRENCIES) {\n        setTooManyCurrencies(true);\n        return;\n      }\n      setSelectedCurrencies([...selectedCurrencies, currency]);\n    }\n  };\n\n  if (!translations) {\n    return null;\n  }\n\n  const t = translations.heatmap;\n\n  console.log(\"values\", heatmapValues);\n\n  return (\n    <>\n      {tooManyCurrencies && (\n        <div\n          style={{\n            position: \"absolute\",\n            top: \"0.5rem\",\n            left: \"0.5rem\",\n            display: \"flex\",\n            alignItems: \"center\",\n            gap: \"1rem\",\n            backgroundColor: \"#f87171\",\n            color: \"#ffffff\",\n            padding: \"0.5rem 1rem\",\n            borderRadius: \"0.375rem\",\n          }}\n        >\n          <p>{t.tooManyCurrencies}</p>\n          <button onClick={() => setTooManyCurrencies(false)}>\n            <HiXMark />\n          </button>\n        </div>\n      )}\n      <div\n        style={{\n          display: \"flex\",\n          width: \"100%\",\n          gap: \"1rem\",\n          justifyContent: \"space-between\",\n        }}\n      >\n        <Branded.CurrencyDropdown\n          label={t.currencies}\n          currencies={currencies}\n          onSelect={(currency) =>\n            selectCurrency(currency, selectedCurrencies.includes(currency))\n          }\n          selected={selectedCurrencies}\n          multiple\n        />\n        <div style={{ width: \"100%\" }}>\n          <PeriodNavigator\n            width={containerWidth}\n            selectedPeriod={selectedPeriod}\n            updateHeatmapValues={setSelectedPeriod}\n            periods={t.periods}\n          />\n        </div>\n      </div>\n\n      <div\n        style={{\n          position: \"relative\",\n          display: \"flex\",\n          width: \"100%\",\n          height: \"100%\",\n          maxHeight: \"100%\",\n          border: styles.table_border || styles.main_border,\n          borderRadius: styles.table_rounded || styles.main_rounded,\n          boxShadow: styles.table_shadow || styles.main_shadow,\n          overflow: \"auto\",\n        }}\n      >\n        <table\n          style={{\n            width: \"100%\",\n            maxWidth: \"100%\",\n            tableLayout: \"fixed\",\n          }}\n        >\n          <tbody>\n            <tr style={{ height: \"2.5rem\" }}>\n              <th\n                style={{\n                  maxWidth:\n                    containerWidth > 600\n                      ? (\n                          44 +\n                          5 *\n                            Number(\n                              (\n                                styles.table_head_font_size ||\n                                styles.base_font_size\n                              ).replace(\"px\", \"\"),\n                            )\n                        ).toString() + \"px\"\n                      : \"2.5rem\",\n                  width:\n                    containerWidth > 600\n                      ? (\n                          44 +\n                          5 *\n                            Number(\n                              (\n                                styles.table_head_font_size ||\n                                styles.base_font_size\n                              ).replace(\"px\", \"\"),\n                            )\n                        ).toString() + \"px\"\n                      : \"2.5rem\",\n                  background:\n                    styles.table_head_background || styles.base_text_color,\n                  color: styles.table_head_text_color || styles.base_background,\n                }}\n              >\n                <div\n                  style={{\n                    display: \"flex\",\n                    alignItems: \"center\",\n                    justifyContent: \"center\",\n                    gap: \"0.5rem\",\n                    minWidth: \"1.75rem\",\n                  }}\n                >\n                  {loading && <FancyLoader />}\n                </div>\n              </th>\n              {selectedCurrencies.map((currency) => (\n                <td\n                  key={currency}\n                  style={{\n                    background:\n                      styles.table_head_background || styles.base_text_color,\n                    color:\n                      styles.table_head_text_color || styles.base_background,\n                    fontSize:\n                      styles.table_head_font_size || styles.base_font_size,\n                    padding: \"0.5rem\",\n                    minWidth: \"0\",\n                    textAlign: \"center\",\n                  }}\n                >\n                  <div\n                    style={{\n                      display: \"flex\",\n                      alignItems: \"center\",\n                      justifyContent: \"center\",\n                      gap: \"0.5rem\",\n                      minWidth: \"max-content\",\n                      width: \"100%\",\n                    }}\n                  >\n                    <Image\n                      src={`/images/currencies/${currency}.svg`}\n                      alt={currency}\n                      width={20}\n                      height={20}\n                      style={\n                        styles.currency_logos_rounded\n                          ? {\n                              borderRadius: \"9999px\",\n                              overflow: \"hidden\",\n                            }\n                          : undefined\n                      }\n                    />\n                    {containerWidth > 600 && currency}\n                  </div>\n                </td>\n              ))}\n            </tr>\n            {selectedCurrencies.map((currency1) => (\n              <tr key={currency1}>\n                <td\n                  style={{\n                    alignItems: \"center\",\n                    justifyContent: \"center\",\n                    padding: \"0.5rem\",\n                    minWidth: \"0\",\n                    textAlign: \"center\",\n                    background:\n                      styles.table_head_background || styles.base_text_color,\n                    color:\n                      styles.table_head_text_color || styles.base_background,\n                    fontSize:\n                      styles.table_head_font_size || styles.base_font_size,\n                  }}\n                >\n                  <div\n                    style={{\n                      display: \"flex\",\n                      alignItems: \"center\",\n                      justifyContent: \"center\",\n                      gap: \"0.5rem\",\n                      minWidth: \"max-content\",\n                      width: \"100%\",\n                    }}\n                  >\n                    <Image\n                      src={`/images/currencies/${currency1}.svg`}\n                      alt={currency1}\n                      width={20}\n                      height={20}\n                      style={\n                        styles.currency_logos_rounded\n                          ? {\n                              borderRadius: \"9999px\",\n                              overflow: \"hidden\",\n                            }\n                          : undefined\n                      }\n                    />\n                    {containerWidth > 600 && currency1}\n                  </div>\n                </td>\n                {selectedCurrencies.map((currency2) => {\n                  const pair = [currency1, currency2];\n                  const key = pair.join(\"/\");\n                  const value = heatmapValues ? heatmapValues[key] : null;\n                  return (\n                    <CellContent\n                      key={key}\n                      loading={loading}\n                      value={value}\n                      pair={pair}\n                      logoBackground={\n                        styles.heatmap_logo_background || styles.base_background\n                      }\n                    />\n                  );\n                })}\n              </tr>\n            ))}\n          </tbody>\n        </table>\n      </div>\n    </>\n  );\n}\n\nexport function Heatmap({ styles, currencies, size = \"screen\" }: HeatmapProps) {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [containerWidth, setContainerWidth] = useState(0); // Store the container width\n\n  useEffect(() => {\n    if (!containerRef.current) {\n      console.error(\"Container not rendered yet.\");\n      return;\n    }\n\n    const observer = new ResizeObserver((entries) => {\n      for (let entry of entries) {\n        if (entry.contentRect) {\n          setContainerWidth(entry.contentRect.width);\n        }\n      }\n    });\n\n    observer.observe(containerRef.current);\n\n    return () => observer.disconnect();\n  }, [containerRef.current]);\n\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }} ref={containerRef}>\n        <Branded.WidgetContainer widgetName=\"heatmap\" size={size}>\n          <RawHeatmap\n            styles={styles}\n            currencies={currencies}\n            containerWidth={containerWidth}\n          />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","import { HeatmapPeriodCode } from \"../types/Heatmap\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\ntype HeatmapResponse = Record<string, number>;\n\nexport async function fetchHeatmapData(\n  currencies: string[],\n  period: HeatmapPeriodCode\n): Promise<HeatmapResponse | null> {\n  try {\n    const response = await fetch(`${WIDGET_API_BASE}/api/widgets/heatmap`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ currencies, period }),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      console.error('Error fetching heatmap data:', error.error);\n      return null;\n    }\n\n    const data = await response.json();\n    return data.data as HeatmapResponse;\n  } catch (error) {\n    console.error('Fetch error:', error);\n    return null;\n  }\n}\n","import { HeatmapPeriodCode, HeatmapPeriodOption } from \"../../../types/Heatmap\";\n\nexport const MAX_CURRENCIES = 8 as const;\n\nexport const PERIOD_CODE_MAP: Record<HeatmapPeriodOption, HeatmapPeriodCode> = {\n    \"15m\": \"intradayfifteen\",\n    \"60m\": \"intradaysixty\",\n    \"240m\": \"intradaytwohundredforty\",\n    \"1d\": \"daily\",\n    \"1w\": \"weekly\",\n    \"1M\": \"monthly\",\n} as const;","export const formatLangFilename = (lang: string): string => {\n    const normalized = lang.trim().replace(/_/g, '-').toLowerCase();\n    const formattedLang = normalized.replace(/-/g, '');\n    const baseLang = normalized.split('-')[0];\n\n    if (normalized === 'es-mx' || formattedLang === 'esmx') return 'esmx';\n    if (baseLang === 'pt' || formattedLang === 'ptbr') return 'ptbr';\n    if (baseLang === 'ja' || formattedLang === 'jp') return 'jp';\n    if (baseLang === 'zh' || formattedLang === 'cn') return 'cn';\n    if (baseLang === 'ko' || formattedLang === 'kr') return 'kr';\n    if (baseLang === 'vi' || formattedLang === 'vn') return 'vn';\n    if (baseLang === 'fa' || formattedLang === 'ir') return 'ir';\n    if (baseLang === 'ms' || formattedLang === 'my') return 'my';\n\n    return baseLang;\n}\n","import { FC } from \"react\";\nimport { HeatmapPeriodOption } from \"../../../types/Heatmap\";\nimport { HeatmapPeriodsT } from \"../../../types/Dictionary\";\nimport Branded from \"../../Branded\";\nimport { PERIOD_CODE_MAP } from \"./constants\";\n\ninterface Props {\n  width: number;\n  selectedPeriod: HeatmapPeriodOption;\n  updateHeatmapValues: (period: HeatmapPeriodOption) => void;\n  periods: HeatmapPeriodsT;\n}\n\nexport const PeriodNavigator: FC<Props> = ({\n  width,\n  selectedPeriod,\n  updateHeatmapValues,\n  periods,\n}: {\n  width: number;\n  selectedPeriod: HeatmapPeriodOption;\n  updateHeatmapValues: (period: HeatmapPeriodOption) => void;\n  periods: HeatmapPeriodsT;\n}) => {\n  if (width < 500) {\n    return (\n      <Branded.Dropdown\n        label={periods[selectedPeriod].long}\n        items={Object.keys(PERIOD_CODE_MAP).map((period) => ({\n          content: periods[period as HeatmapPeriodOption].long,\n          // onClick: () => updateHeatmapValues(period as HeatmapPeriodOption),\n          value: period as HeatmapPeriodOption,\n        }))}\n        onSelect={(period) =>\n          updateHeatmapValues(period as HeatmapPeriodOption)\n        }\n        selected={periods[selectedPeriod].long}\n      />\n    );\n  } else if (width < 800) {\n    return (\n      <Branded.ButtonGroup\n        items={Object.keys(periods).map((period) => ({\n          label: periods[period as HeatmapPeriodOption].short,\n          onClick: () => updateHeatmapValues(period as HeatmapPeriodOption),\n        }))}\n        selected={periods[selectedPeriod].short}\n      />\n    );\n  }\n  return (\n    <Branded.ButtonGroup\n      items={Object.keys(periods).map((period) => ({\n        label: periods[period as HeatmapPeriodOption].long,\n        onClick: () => updateHeatmapValues(period as HeatmapPeriodOption),\n      }))}\n      selected={periods[selectedPeriod].long}\n    />\n  );\n};\n","import { useBrandedColors } from \"..\";\n\nexport const LogoBG: React.FC<{ padding?: string; style?: React.CSSProperties }> = ({ padding = \"0.5rem\", style }) => {\n    const { logoSrc } = useBrandedColors();\n    if (!logoSrc) return null;\n\n    return (\n        <div\n            style={{\n                width: \"100%\",\n                height: \"100%\",\n                backgroundImage: `url(${logoSrc})`,\n                backgroundRepeat: \"no-repeat\",\n                backgroundPosition: \"center\",\n                backgroundSize: \"contain\",\n\n                boxSizing: \"border-box\",\n                padding, // gives breathing room\n                backgroundOrigin: \"content-box\", // <— key!\n                ...style,\n            }}\n        />\n    );\n};\n","import React, { useRef, useEffect, useState } from 'react';\n\nconst FitText: React.FC<{\n    text: string;\n    transformOrigin: string;\n    padding?: string;\n}> = ({\n    text,\n    transformOrigin,\n    padding,\n}) => {\n        const containerRef = useRef<HTMLDivElement>(null); // Ref for the text container\n        const parentRef = useRef<HTMLDivElement>(null); // Ref for the outer container\n        const [scale, setScale] = useState(1);\n\n        useEffect(() => {\n            const container = containerRef.current;\n            const parent = parentRef.current;\n            if (!container || !parent) return;\n\n            const resizeText = () => {\n                const parentWidth = parent.offsetWidth;\n                const parentHeight = parent.offsetHeight;\n\n                // Temporarily reset scaling to get unscaled dimensions\n                const textWidth = container.offsetWidth;\n                const textHeight = container.offsetHeight;\n\n                const widthScale = parentWidth / textWidth;\n                const heightScale = parentHeight / textHeight;\n\n                const newScale = Math.min(widthScale, heightScale);\n\n                // Set the scale state and apply it back\n                setScale(newScale);\n            };\n\n            const observer = new ResizeObserver(resizeText);\n            observer.observe(parent);\n\n            resizeText(); // Initial calculation\n\n            return () => {\n                observer.disconnect();\n            };\n        }, [text]);\n\n        return (\n            <div\n                ref={parentRef}\n                style={{\n                    display: 'flex',\n                    justifyContent: 'center',\n                    alignItems: 'center',\n                    overflow: 'hidden',\n                    width: '100%',\n                    height: '100%', // Ensure the parent container fills its space\n                }}\n            >\n                <div\n                    ref={containerRef}\n                    style={{\n                        transform: `scale(${scale})`,\n                        transformOrigin,\n                        whiteSpace: 'nowrap',\n                        padding,\n                        textAlign: 'center',\n                    }}\n                >\n                    {text}\n                </div>\n            </div>\n        );\n    };\n\nexport default FitText;\n","import { FC } from \"react\";\nimport { LogoBG } from \"../../Branded/elements/LogoBG\";\nimport FitText from \"../../FitText\";\n\ninterface Props {\n  loading: boolean;\n  value: number | null;\n  pair: string[];\n  logoBackground: string;\n}\n\nexport const CellContent: FC<Props> = ({\n  loading,\n  value,\n  pair,\n  logoBackground,\n}: {\n  loading: boolean;\n  value: number | null;\n  pair: string[];\n  logoBackground: string;\n}) => {\n  if (pair[0] === pair[1])\n    return (\n      <td\n        style={{\n          position: \"relative\",\n          textAlign: \"center\",\n          background: logoBackground,\n          padding: 0,\n          verticalAlign: \"middle\",\n          lineHeight: 0, // avoid baseline gap around img\n        }}\n      >\n        <div\n          style={{\n            position: \"absolute\",\n            inset: 0,\n            display: \"flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            width: \"100%\",\n            height: \"100%\",\n            // no padding, no overflow hidden here\n          }}\n        >\n          <LogoBG /> {/* it now pads itself and always fits */}\n        </div>\n      </td>\n    );\n  if (loading) return <td style={{ textAlign: \"center\" }}></td>;\n  if (value === null) return <td style={{ textAlign: \"center\" }}></td>;\n\n  const cellColor =\n    value < -0.4\n      ? \"#f05252\"\n      : value < 0\n        ? \"#f98080\"\n        : value < 0.4\n          ? \"#36e572\"\n          : \"#0e9f6e\";\n\n  return (\n    <td\n      style={{\n        textAlign: \"center\",\n        minWidth: \"0\",\n        maxWidth: \"100%\",\n        overflow: \"hidden\",\n        background: cellColor,\n      }}\n    >\n      <FitText\n        text={value.toFixed(2) + \"%\"}\n        transformOrigin=\"center\"\n        padding=\"0 0.375rem\"\n      />\n    </td>\n  );\n};\n","\"use client\";\nimport { FC, useEffect, useRef, useState } from \"react\";\nimport { TbSwitchHorizontal } from \"react-icons/tb\";\nimport { Image } from \"../utils/Image\";\nimport { HiArrowRight } from \"react-icons/hi2\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport { convertCurrency } from \"../../functions/convertCurrency\";\nimport dictionaries from \"../../dictionaries\";\nimport { Dictionary } from \"../../types/Dictionary\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\nimport { FancyLoader } from \"../FancyLoader\";\n\ninterface RawCurrencyConverterProps {\n  styles: WidgetStyle;\n  currencies: string[];\n  isColumn: boolean;\n}\n\ninterface CurrencyConverterProps {\n  styles: WidgetStyle;\n  currencies: string[];\n  size?: \"full\" | \"screen\";\n}\n\nexport const RawCurrencyConverter: FC<RawCurrencyConverterProps> = ({\n  currencies,\n  styles,\n  isColumn,\n}) => {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n\n  const [from, setFrom] = useState<string>(currencies[0]);\n  const [to, setTo] = useState<string>(currencies[1]);\n  const [fromVal, setFromVal] = useState<number>(1);\n  const [results, setResults] = useState<{\n    price: number;\n    result: number;\n  } | null>(null);\n  const [status, setStatus] = useState<\"ready\" | \"loading\" | \"error\">(\"ready\");\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase().replace(/[-_]/g, \"\"); // lowercase and remove bars, underscores, and spaces\n        const translation: Dictionary =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  useEffect(() => {\n    const fetchData = async () => {\n      setStatus(\"loading\");\n      const newCVal = await convertCurrency(from, to, fromVal);\n      if (!newCVal) {\n        setStatus(\"error\");\n        return;\n      }\n      setResults(newCVal);\n      setStatus(\"ready\");\n    };\n\n    fetchData();\n  }, [from, to, fromVal]);\n\n  const handleSwitch = () => {\n    setFrom(to);\n    setTo(from);\n  };\n\n  if (!translations) {\n    return <></>;\n  }\n\n  const t = translations.currencyConverter;\n\n  return (\n    <>\n      <div\n        style={{\n          width: \"100%\",\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          gap: \"1rem\",\n        }}\n      >\n        <div\n          style={{\n            width: \"100%\",\n            display: \"flex\",\n            flexDirection: isColumn ? \"column\" : \"row\",\n            alignItems: isColumn ? \"center\" : \"flex-end\",\n            gap: \"1rem\",\n          }}\n        >\n          <div\n            style={{\n              display: \"flex\",\n              flexGrow: 1,\n              flexDirection: isColumn ? \"row\" : \"column\",\n              gap: \"0.25rem\",\n              alignItems: isColumn ? \"center\" : \"flex-start\",\n              justifyContent: isColumn ? \"space-between\" : \"flex-start\",\n            }}\n          >\n            <Branded.Label>{t.from}</Branded.Label>\n            <Branded.CurrencyDropdown\n              label={t.from}\n              currencies={currencies}\n              selected={from}\n              onSelect={setFrom}\n            />\n          </div>\n\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              justifyContent: \"flex-end\",\n              width: isColumn ? \"100%\" : \"fit-content\",\n              height: \"100%\",\n            }}\n          >\n            <button\n              style={{\n                width: \"38.33px\",\n                height: \"38.33px\",\n                display: \"flex\",\n                alignItems: \"center\",\n                justifyContent: \"center\",\n                padding: \"0.5rem\",\n                borderRadius: \"9999px\",\n                transform: isColumn ? \"rotate(90deg)\" : \"none\",\n                color: styles.button_text_color || styles.base_text_color,\n                background: styles.button_background || styles.base_background,\n                border: styles.button_border || styles.base_border,\n                cursor: \"pointer\",\n              }}\n              onClick={handleSwitch}\n            >\n              <TbSwitchHorizontal />\n            </button>\n          </div>\n\n          <div\n            style={{\n              display: \"flex\",\n              flexGrow: 1,\n              flexDirection: isColumn ? \"row\" : \"column\",\n              gap: \"0.25rem\",\n              alignItems: isColumn ? \"center\" : \"flex-start\",\n              justifyContent: isColumn ? \"space-between\" : \"flex-start\",\n            }}\n          >\n            <Branded.Label>{t.to}</Branded.Label>\n            <Branded.CurrencyDropdown\n              label={t.to}\n              currencies={currencies}\n              selected={to}\n              onSelect={setTo}\n            />\n          </div>\n        </div>\n\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            justifyContent: \"flex-end\",\n            gap: \"0.25rem\",\n          }}\n        >\n          <Branded.Label>{t.amount}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={fromVal}\n            onChange={(e) => setFromVal(parseFloat(e.target.value))}\n          />\n        </div>\n      </div>\n\n      <Branded.ResultsContainer>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            alignItems: \"center\",\n            padding: \"0.5rem\",\n            gap: \"0.75rem\",\n          }}\n        >\n          <div\n            style={{\n              display: \"flex\",\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              gap: \"1rem\",\n              color: styles.results_text_color || styles.base_text_color,\n              fontSize:\n                styles.results_secondary_font_size || styles.base_font_size,\n            }}\n          >\n            <Image\n              src={`/images/currencies/${from}.svg`}\n              alt={from}\n              width={30}\n              height={30}\n              style={\n                styles.currency_logos_rounded\n                  ? {\n                      borderRadius: \"9999px\",\n                      overflow: \"hidden\",\n                    }\n                  : undefined\n              }\n            />\n            <HiArrowRight />\n            <Image\n              src={`/images/currencies/${to}.svg`}\n              alt={to}\n              width={30}\n              height={30}\n              style={\n                styles.currency_logos_rounded\n                  ? {\n                      borderRadius: \"9999px\",\n                      overflow: \"hidden\",\n                    }\n                  : undefined\n              }\n            />\n          </div>\n          {status === \"loading\" ? (\n            <FancyLoader />\n          ) : (\n            <>\n              <span\n                style={{\n                  color: styles.results_text_color || styles.base_text_color,\n                  fontSize: styles.results_font_size || styles.base_font_size,\n                }}\n              >\n                {results?.result}\n              </span>\n              <span\n                style={{\n                  color: styles.results_text_color || styles.base_text_color,\n                  fontSize:\n                    styles.results_secondary_font_size || styles.base_font_size,\n                  lineHeight:\n                    styles.results_secondary_font_size || styles.base_font_size,\n                }}\n              >\n                {`1 ${from} = ${results?.price + to}`}\n              </span>\n            </>\n          )}\n        </div>\n      </Branded.ResultsContainer>\n    </>\n  );\n};\n\nexport function CurrencyConverter({\n  currencies,\n  styles,\n  size = \"screen\",\n}: CurrencyConverterProps): JSX.Element {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [isColumn, setIsColumn] = useState<boolean>(false);\n\n  useEffect(() => {\n    const handleResize = (entries: ResizeObserverEntry[]) => {\n      if (entries[0].contentRect.width < 400) {\n        setIsColumn(true);\n      } else {\n        setIsColumn(false);\n      }\n    };\n\n    const observer = new ResizeObserver(handleResize);\n\n    if (containerRef.current) {\n      observer.observe(containerRef.current);\n    }\n\n    // Cleanup observer on unmount\n    return () => {\n      if (containerRef.current) {\n        observer.unobserve(containerRef.current);\n      }\n    };\n  }, [styles.lang, styles.font_family]);\n\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }} ref={containerRef}>\n        <Branded.WidgetContainer widgetName=\"currencyConverter\" size={size}>\n          <RawCurrencyConverter\n            currencies={currencies}\n            styles={styles}\n            isColumn={isColumn}\n          />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","import { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function convertCurrency(\n\tfrom: string,\n\tto: string,\n\tvalue: number\n): Promise<{\n\tprice: number,\n\tresult: number\n} | null> {\n\tconst url = `${WIDGET_API_BASE}/api/widgets/convert-currency`;\n\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify({ from, to, value }),\n\t\t});\n\t\tconst jsonData = await response.json();\n\n\t\tif (!response.ok || !jsonData?.price || !jsonData?.value) {\n\t\t\tconsole.error('API Error:', jsonData?.error || 'No data');\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tprice: jsonData.price,\n\t\t\tresult: jsonData.value\n\t\t};\n\t} catch (error) {\n\t\tconsole.error('Fetch error:', error);\n\t\treturn null;\n\t}\n}\n\n","\"use client\";\nimport { FC, useEffect, useState } from \"react\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport dictionaries from \"../../dictionaries\";\nimport { Dictionary, FibonacciDictionary } from \"../../types/Dictionary\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\n\ninterface RawFibonacciProps {\n  styles: WidgetStyle;\n}\n\ninterface FibonacciProps extends RawFibonacciProps {\n  size?: \"full\" | \"screen\";\n}\n\nconst retracementKeys = [0, 23.6, 38.2, 50, 61.8, 76.4, 100, 138.2];\nconst extensionKeys = [261.8, 200, 161.8, 138.2, 100, 61.8, 50, 23.6];\n\nexport const RawFibonacci: FC<RawFibonacciProps> = ({ styles }) => {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [trend, setTrend] = useState<\"uptrend\" | \"downtrend\">(\"uptrend\");\n  const [highB, setHighB] = useState<number>(1);\n  const [lowA, setLowA] = useState<number>(1);\n  const [retracementsTableItems, setRetracementsTableItems] = useState<\n    { [key: string]: number }[]\n  >([]);\n  const [extensionsTableItems, setExtensionsTableItems] = useState<\n    { [key: string]: number }[]\n  >([]);\n  const [mounted, setMounted] = useState(false); // client-only render flag\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  useEffect(() => {\n    setMounted(true);\n    calculateResults();\n  }, [trend, highB, lowA]);\n\n  function calculateResults() {\n    const newRetracementsTableItems = retracementKeys.map((key) => ({\n      [`${key}%`]:\n        trend === \"uptrend\"\n          ? highB - (highB - lowA) * (key / 100)\n          : lowA + (highB - lowA) * (key / 100),\n    }));\n    const newExtensionsTableItems = extensionKeys.map((key) => ({\n      [`${key}%`]:\n        trend === \"uptrend\"\n          ? highB + (highB - lowA) * (key / 100)\n          : lowA - (highB - lowA) * (key / 100),\n    }));\n    setRetracementsTableItems(newRetracementsTableItems);\n    setExtensionsTableItems(newExtensionsTableItems);\n  }\n\n  if (!mounted) return null; // Avoid rendering on the server\n\n  if (!translations) {\n    return null;\n  }\n\n  const t: FibonacciDictionary = translations.fibonacci;\n\n  return (\n    <>\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          minHeight: \"2.25rem\", // 36px\n        }}\n      >\n        <Branded.ButtonGroup\n          items={[\n            { label: t.uptrend, onClick: () => setTrend(\"uptrend\") },\n            {\n              label: t.downtrend,\n              onClick: () => setTrend(\"downtrend\"),\n            },\n          ]}\n          selected={t[trend]}\n        />\n      </div>\n\n      <div\n        style={{\n          display: \"flex\",\n          flexWrap: \"wrap\",\n          width: \"fit-content\",\n          maxWidth: \"100%\",\n          gap: \"1rem\",\n          justifyContent: \"center\",\n        }}\n      >\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\",\n          }}\n        >\n          <Branded.Label>{t.high}</Branded.Label>\n          <Branded.TextInput\n            min={lowA}\n            type=\"number\"\n            value={highB}\n            onChange={(e) => setHighB(Number(e.target.value))}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\",\n          }}\n        >\n          <Branded.Label>{t.low}</Branded.Label>\n          <Branded.TextInput\n            max={highB}\n            type=\"number\"\n            value={lowA}\n            onChange={(e) => setLowA(Number(e.target.value))}\n          />\n        </div>\n      </div>\n\n      <div\n        style={{\n          display: \"flex\",\n          flexWrap: \"wrap\",\n          width: \"100%\",\n          gap: \"1rem\",\n          justifyContent: \"center\",\n          alignItems: \"center\",\n          textWrap: \"nowrap\",\n          fontSize: \"1.25rem\", // 20px\n          borderRadius: \"0.5rem\", // 8px\n        }}\n      >\n        <div\n          style={{\n            display: \"flex\",\n            flexGrow: 1,\n            minWidth: \"fit-content\",\n          }}\n        >\n          <Branded.Table>\n            <Branded.Table.Head>\n              <Branded.Table.HeadCell>{t.retracements}</Branded.Table.HeadCell>\n              <Branded.Table.HeadCell>{t.values}</Branded.Table.HeadCell>\n            </Branded.Table.Head>\n            <Branded.Table.Body>\n              {retracementsTableItems.map((item, index) => (\n                <Branded.Table.Row key={index}>\n                  <Branded.Table.Cell>\n                    {Object.keys(item)[0]}\n                  </Branded.Table.Cell>\n                  <Branded.Table.Cell>\n                    {Object.values(item)[0].toFixed(3)}\n                  </Branded.Table.Cell>\n                </Branded.Table.Row>\n              ))}\n            </Branded.Table.Body>\n          </Branded.Table>\n        </div>\n\n        <div\n          style={{\n            display: \"flex\",\n            flexGrow: 1,\n            minWidth: \"fit-content\",\n          }}\n        >\n          <Branded.Table>\n            <Branded.Table.Head>\n              <Branded.Table.HeadCell>{t.extensions}</Branded.Table.HeadCell>\n              <Branded.Table.HeadCell>{t.values}</Branded.Table.HeadCell>\n            </Branded.Table.Head>\n            <Branded.Table.Body>\n              {extensionsTableItems.map((item, index) => (\n                <Branded.Table.Row key={index}>\n                  <Branded.Table.Cell>\n                    {Object.keys(item)[0]}\n                  </Branded.Table.Cell>\n                  <Branded.Table.Cell>\n                    {Object.values(item)[0].toFixed(3)}\n                  </Branded.Table.Cell>\n                </Branded.Table.Row>\n              ))}\n            </Branded.Table.Body>\n          </Branded.Table>\n        </div>\n      </div>\n    </>\n  );\n};\n\nexport function Fibonacci({ styles, size = \"screen\" }: FibonacciProps) {\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }}>\n        <Branded.WidgetContainer widgetName=\"fibonacci\" size={size}>\n          <RawFibonacci styles={styles} />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","\"use client\";\nimport { useEffect, useState } from \"react\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport { AccountType } from \"../../types/AccountType\";\nimport { calculateMargin } from \"../../functions/calculateMargin\";\nimport dictionaries from \"../../dictionaries\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\nimport { FancyLoader } from \"../FancyLoader\";\n\ninterface RawMarginCalculatorProps {\n  styles: WidgetStyle;\n  currencies: string[];\n  accountTypes: AccountType[];\n}\n\ninterface MarginCalculatorProps {\n  styles: WidgetStyle;\n  currencies: string[];\n  accountTypes: AccountType[];\n  size?: \"full\" | \"screen\";\n}\n\nconst leverageOptions = [\n  1, 2, 3, 5, 10, 15, 20, 25, 30, 50, 66, 100, 200, 300, 400, 500, 888, 1000,\n  2000,\n];\ntype Leverage =\n  | 1\n  | 2\n  | 3\n  | 5\n  | 10\n  | 15\n  | 20\n  | 25\n  | 30\n  | 50\n  | 66\n  | 100\n  | 200\n  | 300\n  | 400\n  | 500\n  | 888\n  | 1000;\n\nexport function RawMarginCalculator({\n  styles,\n  currencies,\n  accountTypes,\n}: RawMarginCalculatorProps) {\n  const [translations, setTranslations] = useState<{\n    [key: string]: any;\n  } | null>(null);\n  const [base, setBase] = useState<string>(currencies[0]);\n  const [pair, setPair] = useState<string[]>([currencies[0], currencies[1]]);\n  const [accountType, setAccountType] = useState<AccountType>(accountTypes[0]);\n  const [lotSize, setLotSize] = useState<number>(0);\n  const [leverage, setLeverage] = useState<Leverage>(1);\n  const [results, setResults] = useState<{\n    price: number;\n    baseMargin: number;\n    convertedMargin: number;\n  } | null>(null);\n  const [loading, setLoading] = useState(false);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  const fetchData = async () => {\n    setLoading(true);\n\n    try {\n      const newCResults = await calculateMargin(\n        base,\n        pair,\n        accountType,\n        lotSize,\n        leverage\n      );\n      if (!newCResults) {\n        throw new Error(\"Failed to fetch data\");\n      }\n      setResults(newCResults);\n    } catch (e) {\n      console.error(e);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  useEffect(() => {\n    fetchData();\n  }, [base, pair, accountType, lotSize, leverage]);\n  if (!translations) {\n    return null;\n  }\n\n  const t = translations.marginCalculator;\n  return (\n    <>\n      <div\n        style={{\n          width: \"100%\",\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          gap: \"1rem\",\n          padding: \"1rem\",\n        }}\n      >\n        <div\n          style={{\n            width: \"100%\",\n            display: \"flex\",\n            flexWrap: \"wrap\",\n            gap: \"1rem\",\n            alignItems: \"flex-end\",\n          }}\n        >\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              flexGrow: 1,\n              gap: \"0.25rem\",\n            }}\n          >\n            <Branded.Label>{t.accountCurrency}</Branded.Label>\n            <Branded.CurrencyDropdown\n              label={t.accountCurrency}\n              currencies={currencies}\n              onSelect={setBase}\n              selected={base}\n            />\n          </div>\n\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              flexGrow: 1,\n              gap: \"0.25rem\",\n            }}\n          >\n            <Branded.Label>{t.currencyPair}</Branded.Label>\n            <Branded.PairDropdown currencies={currencies} onSelect={setPair} />\n          </div>\n        </div>\n\n        <div\n          style={{\n            width: \"100%\",\n            display: \"flex\",\n            flexWrap: \"wrap\",\n            gap: \"1rem\",\n            alignItems: \"flex-end\",\n          }}\n        >\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              flexGrow: 1,\n              gap: \"0.25rem\",\n            }}\n          >\n            <Branded.Label>{t.accountType}</Branded.Label>\n            <Branded.Dropdown\n              label={accountType.label}\n              items={accountTypes.map((type) => ({\n                content: type.label,\n                // onClick: () => setAccountType(type),\n                value: type.value,\n              }))}\n              onSelect={(value) =>\n                setAccountType(\n                  accountTypes.find((type) => type.value === value)!\n                )\n              }\n              selected={accountType.value}\n            />\n          </div>\n\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              flexGrow: 1,\n              gap: \"0.25rem\",\n            }}\n          >\n            <Branded.Label>{t.lotSize}</Branded.Label>\n            <Branded.TextInput\n              type=\"number\"\n              value={lotSize}\n              onChange={(e) => setLotSize(parseFloat(e.target.value))}\n            />\n          </div>\n\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              flexGrow: 1,\n              gap: \"0.25rem\",\n            }}\n          >\n            <Branded.Label>{t.leverage}</Branded.Label>\n            <Branded.Dropdown\n              label={leverage.toString()}\n              items={leverageOptions.map((lev) => ({\n                content: lev,\n                // onClick: () => setLeverage(lev as Leverage),\n                value: lev,\n              }))}\n              onSelect={(value) => setLeverage(value as Leverage)}\n              selected={leverage}\n            />\n          </div>\n        </div>\n      </div>\n\n      {loading ? (\n        <FancyLoader />\n      ) : (\n        <Branded.ResultsContainer>\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {`${t.price} (${pair.join(\"/\")})`}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {results?.price.toFixed(2)}\n            </span>\n          </div>\n\n          <hr\n            style={{\n              borderColor:\n                styles.results_separator_color || styles.base_text_color,\n              width: \"100%\",\n            }}\n          />\n\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {`${t.requiredMargin} (${pair[0]})`}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {results?.baseMargin?.toFixed(2)}\n            </span>\n          </div>\n\n          <hr\n            style={{\n              borderColor:\n                styles.results_separator_color || styles.base_text_color,\n              width: \"100%\",\n            }}\n          />\n\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {`${t.requiredMargin} (${pair[1]})`}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {results?.convertedMargin?.toFixed(2)}\n            </span>\n          </div>\n        </Branded.ResultsContainer>\n      )}\n    </>\n  );\n}\n\nexport function MarginCalculator({\n  styles,\n  currencies,\n  accountTypes,\n  size = \"screen\",\n}: MarginCalculatorProps) {\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }}>\n        <Branded.WidgetContainer widgetName=\"marginCalculator\" size={size}>\n          <RawMarginCalculator\n            styles={styles}\n            currencies={currencies}\n            accountTypes={accountTypes}\n          />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","import { AccountType } from \"../types/AccountType\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\ntype MarginResponseData = {\n  price: number,\n  baseMargin: number,\n  convertedMargin: number,\n};\n\nexport async function calculateMargin(\n  base: string,\n  pair: string[],\n  accountType: AccountType,\n  lotSize: number,\n  leverage: number\n): Promise<MarginResponseData | null> {\n  try {\n    const response = await fetch(`${WIDGET_API_BASE}/api/widgets/calculate-margin`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ base, pair, accountType, lotSize, leverage }),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      console.error('Error fetching margin calculation data:', error);\n      return null;\n    }\n\n    const data = await response.json();\n\n    return data.data as MarginResponseData;\n  } catch (error) {\n    console.error('Fetch error:', error);\n    return null;\n  }\n}\n","\"use client\";\nimport { useEffect, useRef, useState } from \"react\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport dictionaries from \"../../dictionaries\";\nimport { Dictionary, PivotsDictionary } from \"../../types/Dictionary\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\n\ntype Indicator = \"classic\" | \"woodie\" | \"camarilla\" | \"demark\";\n\nfunction makeFormulas(h: number, l: number, o: number, c: number) {\n  const result: Record<Indicator, any> = {\n    classic: {\n      pp: function () {\n        return (h + l + c) / 3;\n      },\n      r1: function () {\n        return 2 * result.classic.pp() - l;\n      },\n      s1: function () {\n        return 2 * result.classic.pp() - h;\n      },\n      r2: function () {\n        return result.classic.pp() + h - l;\n      },\n      s2: function () {\n        return result.classic.pp() - h + l;\n      },\n      r3: function () {\n        return h + 2 * (result.classic.pp() - l);\n      },\n      s3: function () {\n        return l - 2 * (h - result.classic.pp());\n      },\n    },\n    woodie: {\n      pp: function () {\n        return (h + l + 2 * c) / 4;\n      },\n      r1: function () {\n        return 2 * result.woodie.pp() - l;\n      },\n      r2: function () {\n        return result.woodie.pp() + h - l;\n      },\n      s1: function () {\n        return 2 * result.woodie.pp() - h;\n      },\n      s2: function () {\n        return result.woodie.pp() - h + l;\n      },\n    },\n    camarilla: {\n      r4: function () {\n        return c + (h - l) * (1.1 / 2);\n      },\n      r3: function () {\n        return c + (h - l) * (1.1 / 4);\n      },\n      r2: function () {\n        return c + (h - l) * (1.1 / 6);\n      },\n      r1: function () {\n        return c + (h - l) * (1.1 / 12);\n      },\n      s1: function () {\n        return c - (h - l) * (1.1 / 12);\n      },\n      s2: function () {\n        return c - (h - l) * (1.1 / 6);\n      },\n      s3: function () {\n        return c - (h - l) * (1.1 / 4);\n      },\n      s4: function () {\n        return c - (h - l) * (1.1 / 2);\n      },\n    },\n    demark: {\n      x: function () {\n        if (c < o) {\n          return h + 2 * l + c;\n        } else if (c > o) {\n          return 2 * h + l + c;\n        } else {\n          return h + l + 2 * c;\n        }\n      },\n      r1: function () {\n        return result.demark.x() / 2 - l;\n      },\n      pp: function () {\n        return result.demark.x() / 4;\n      },\n      s1: function () {\n        return result.demark.x() / 2 - h;\n      },\n    },\n  };\n  return result;\n}\n\nconst getFormula = (\n  formulas: Record<Indicator, { [key: string]: () => number }>,\n  index: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8,\n  type: Indicator\n) => {\n  const map = {\n    0: \"r4\",\n    1: \"r3\",\n    2: \"r2\",\n    3: \"r1\",\n    4: \"pp\",\n    5: \"s1\",\n    6: \"s2\",\n    7: \"s3\",\n    8: \"s4\",\n  };\n  const base = () => null;\n  return formulas[type][map[index]] || base;\n};\n\ninterface RawPivotProps {\n  styles: WidgetStyle;\n  isSmall: boolean;\n}\n\ninterface PivotProps {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nexport function RawPivots({ styles, isSmall }: RawPivotProps) {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [indicator, setIndicator] = useState<\n    \"classic\" | \"woodie\" | \"camarilla\" | \"demark\"\n  >(\"classic\");\n\n  const [high, setHigh] = useState<number>(1);\n  const [low, setLow] = useState<number>(0);\n  const [open, setOpen] = useState<number>(1);\n  const [close, setClose] = useState<number>(0);\n\n  // const [formulas, setFormulas] = useState<Record<Indicator, { [key: string]: () => number }> | null>(null);\n  const [tableItems, setTableItems] = useState<\n    { [key: string]: string }[] | null\n  >(null);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  useEffect(() => {\n    if (translations) {\n      const t = translations.pivots;\n      calculatePivots(t);\n    }\n  }, [translations, high, low, open, close, indicator]);\n\n  function calculatePivots(t: PivotsDictionary) {\n    try {\n      // setFormulas(makeFormulas(high, low, open, close));\n      const formulas = makeFormulas(high, low, open, close);\n      const newTableItems: { [key: string]: string }[] = [\n        {\n          [t[\"res-4\"]]: getFormula(formulas, 0, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"res-3\"]]: getFormula(formulas, 1, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"res-2\"]]: getFormula(formulas, 2, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"res-1\"]]: getFormula(formulas, 3, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"pivot\"]]: getFormula(formulas, 4, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"sup-1\"]]: getFormula(formulas, 5, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"sup-2\"]]: getFormula(formulas, 6, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"sup-3\"]]: getFormula(formulas, 7, indicator)()?.toFixed(2) || \"-\",\n        },\n        {\n          [t[\"sup-4\"]]: getFormula(formulas, 8, indicator)()?.toFixed(2) || \"-\",\n        },\n      ];\n      setTableItems(newTableItems);\n    } catch (error) {\n      console.error(error);\n    }\n  }\n  if (!translations) {\n    return null;\n  }\n\n  const t = translations.pivots;\n  return (\n    <>\n      {isSmall ? (\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            width: \"100%\",\n            alignItems: \"center\",\n            gap: \"0.5rem\",\n            minHeight: \"4rem\", // 64px\n          }}\n        >\n          <Branded.ButtonGroup\n            items={[\n              {\n                label: t.classic,\n                onClick: () => setIndicator(\"classic\"),\n              },\n              {\n                label: t.woodie,\n                onClick: () => setIndicator(\"woodie\"),\n              },\n            ]}\n            selected={t[indicator]}\n          />\n          <Branded.ButtonGroup\n            items={[\n              {\n                label: t.camarilla,\n                onClick: () => setIndicator(\"camarilla\"),\n              },\n              {\n                label: t.demark,\n                onClick: () => setIndicator(\"demark\"),\n              },\n            ]}\n            selected={t[indicator]}\n          />\n        </div>\n      ) : (\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            alignItems: \"center\",\n            minHeight: \"2.25rem\", // 36px\n          }}\n        >\n          <Branded.ButtonGroup\n            items={[\n              {\n                label: t.classic,\n                onClick: () => setIndicator(\"classic\"),\n              },\n              {\n                label: t.woodie,\n                onClick: () => setIndicator(\"woodie\"),\n              },\n              {\n                label: t.camarilla,\n                onClick: () => setIndicator(\"camarilla\"),\n              },\n              {\n                label: t.demark,\n                onClick: () => setIndicator(\"demark\"),\n              },\n            ]}\n            selected={t[indicator]}\n          />\n        </div>\n      )}\n\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          gap: \"1rem\",\n        }}\n      >\n        <div\n          style={{\n            width: \"100%\",\n            height: \"fit-content\",\n            display: \"flex\",\n            flexWrap: \"wrap\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            gap: \"1rem\",\n          }}\n        >\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <Branded.Label>{t.high}</Branded.Label>\n            <Branded.TextInput\n              type=\"number\"\n              value={high}\n              onChange={(e) => setHigh(Number(e.target.value))}\n            />\n          </div>\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <Branded.Label>{t.low}</Branded.Label>\n            <Branded.TextInput\n              type=\"number\"\n              value={low}\n              onChange={(e) => setLow(Number(e.target.value))}\n            />\n          </div>\n        </div>\n        <div\n          style={{\n            width: \"100%\",\n            height: \"fit-content\",\n            display: \"flex\",\n            flexWrap: \"wrap\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            gap: \"1rem\",\n          }}\n        >\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <Branded.Label>{t.open}</Branded.Label>\n            <Branded.TextInput\n              type=\"number\"\n              value={open}\n              onChange={(e) => setOpen(Number(e.target.value))}\n            />\n          </div>\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              gap: \"0.5rem\",\n            }}\n          >\n            <Branded.Label>{t.close}</Branded.Label>\n            <Branded.TextInput\n              type=\"number\"\n              value={close}\n              onChange={(e) => setClose(Number(e.target.value))}\n            />\n          </div>\n        </div>\n\n        {tableItems && (\n          <Branded.Table>\n            <Branded.Table.Body>\n              {tableItems.map((item, index) => (\n                <Branded.Table.Row key={index}>\n                  <Branded.Table.Cell headLike>\n                    {Object.keys(item)[0]}\n                  </Branded.Table.Cell>\n                  <Branded.Table.Cell>\n                    {Object.values(item)[0]}\n                  </Branded.Table.Cell>\n                </Branded.Table.Row>\n              ))}\n            </Branded.Table.Body>\n          </Branded.Table>\n        )}\n      </div>\n    </>\n  );\n}\n\nexport function Pivots({ styles, size = \"screen\" }: PivotProps) {\n  const [isSmall, setIsSmall] = useState<boolean>(false);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const handleResize = (entries: ResizeObserverEntry[]) => {\n      if (!entries.length) return;\n      if (entries[0].contentRect.width < 400) {\n        setIsSmall(true);\n      } else {\n        setIsSmall(false);\n      }\n    };\n\n    const observer = new ResizeObserver(handleResize);\n\n    if (containerRef.current) {\n      observer.observe(containerRef.current);\n    } else {\n      console.warn(\"containerRef.current is null, observer not attached.\");\n    }\n\n    return () => {\n      if (containerRef.current) {\n        observer.unobserve(containerRef.current);\n      }\n    };\n  }, [containerRef.current]);\n\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }} ref={containerRef}>\n        <Branded.WidgetContainer widgetName=\"pivots\" size={size}>\n          <RawPivots styles={styles} isSmall={isSmall} />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","\"use client\";\nimport { useEffect, useState } from \"react\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport dictionaries from \"../../dictionaries\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\n\ntype Result = {\n  maxLoss: number;\n  maxProfit: number;\n};\n\ninterface RawStopLossTakeProfitProps {\n  styles: WidgetStyle;\n}\n\ninterface StopLossTakeProfitProps {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nexport function RawStopLossTakeProfit({ styles }: RawStopLossTakeProfitProps) {\n  const [translations, setTranslations] = useState<{\n    [key: string]: any;\n  } | null>(null);\n  const [buySell, setBuySell] = useState<\"buy\" | \"sell\">(\"buy\");\n\n  const [openPrice, setOpenPrice] = useState<number>(1);\n  const [perPip, setPerPip] = useState<number>(1);\n  const [lots, setLots] = useState<number>(1);\n  const [stop, setStop] = useState<number>(1);\n  const [limit, setLimit] = useState<number>(1);\n\n  const [result, setResult] = useState<Result | null>(null);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  function calculateResult() {\n    const normalizedStop = stop * 10000;\n    const normalizedLimit = limit * 10000;\n    const normalizedOpenPrice = openPrice * 10000;\n\n    const maxLoss =\n      (buySell === \"buy\"\n        ? normalizedStop - normalizedOpenPrice\n        : normalizedOpenPrice - normalizedStop) *\n      perPip *\n      lots;\n    const maxProfit =\n      (buySell === \"buy\"\n        ? normalizedLimit - normalizedOpenPrice\n        : normalizedOpenPrice - normalizedLimit) *\n      perPip *\n      lots;\n\n    setResult({ maxLoss, maxProfit });\n  }\n\n  useEffect(() => {\n    calculateResult();\n  }, [buySell, stop, limit, openPrice, perPip, lots]);\n\n  if (!translations) {\n    return null;\n  }\n\n  const t = translations.stopLossTakeProfit;\n  return (\n    <>\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          minHeight: \"2.25rem\", // 36px\n        }}\n      >\n        <Branded.ButtonGroup\n          items={[\n            { label: t.buy, onClick: () => setBuySell(\"buy\") },\n            { label: t.sell, onClick: () => setBuySell(\"sell\") },\n          ]}\n          selected={buySell === \"buy\" ? t.buy : t.sell}\n        />\n      </div>\n\n      <div\n        style={{\n          display: \"flex\",\n          flexWrap: \"wrap\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          gap: \"1rem\", // 16px\n        }}\n      >\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.open}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={openPrice}\n            onChange={(e) => setOpenPrice(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.value}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={perPip}\n            onChange={(e) => setPerPip(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.lots}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={lots}\n            onChange={(e) => setLots(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.stop}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={stop}\n            onChange={(e) => setStop(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.Limit}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={limit}\n            onChange={(e) => setLimit(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n      </div>\n\n      {result && (\n        <Branded.ResultsContainer>\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\", // 8px\n              gap: \"0.5rem\", // 8px\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {t.maxLoss}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {result.maxLoss.toFixed(2)}\n            </span>\n          </div>\n          <hr\n            style={{\n              borderColor:\n                styles.results_separator_color || styles.base_text_color,\n              width: \"100%\",\n            }}\n          />\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\", // 8px\n              gap: \"0.5rem\", // 8px\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {t.maxProfit}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {result.maxProfit.toFixed(2)}\n            </span>\n          </div>\n        </Branded.ResultsContainer>\n      )}\n    </>\n  );\n}\n\nexport function StopLossTakeProfit({\n  styles,\n  size = \"screen\",\n}: StopLossTakeProfitProps) {\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }}>\n        <Branded.WidgetContainer widgetName=\"stopLossTakeProfit\" size={size}>\n          <RawStopLossTakeProfit styles={styles} />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","\"use client\";\nimport { useEffect, useState } from \"react\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport dictionaries from \"../../dictionaries\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\n\ntype Result = {\n  stopLossAt: number;\n  takeProfitAt: number;\n  stopLossPips: number;\n  takeProfitPips: number;\n};\n\ninterface RawStopLossTakeProfitLevelsProps {\n  styles: WidgetStyle;\n}\n\ninterface StopLossTakeProfitLevelsProps {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nexport function RawStopLossTakeProfitLevels({\n  styles,\n}: RawStopLossTakeProfitLevelsProps) {\n  const [translations, setTranslations] = useState<{\n    [key: string]: any;\n  } | null>(null);\n  const [buySell, setBuySell] = useState<\"buy\" | \"sell\">(\"buy\");\n  const [toRisk, setToRisk] = useState<number>(1);\n  const [toGain, setToGain] = useState<number>(1);\n  const [openPrice, setOpenPrice] = useState<number>(1);\n  const [perPip, setPerPip] = useState<number>(1);\n  const [lots, setLots] = useState<number>(1);\n  const [result, setResult] = useState<Result | null>(null);\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  useEffect(() => {\n    calculateResult();\n  }, [buySell, toRisk, toGain, openPrice, perPip, lots]);\n\n  function calculateResult() {\n    const normalizedOpenPrice = openPrice * 10000;\n\n    const pipsToRisk = toRisk / (perPip * lots);\n    const stopLossAt =\n      (buySell === \"buy\"\n        ? normalizedOpenPrice - pipsToRisk\n        : normalizedOpenPrice + pipsToRisk) / 10000;\n    const pipsToProfit = toGain / (perPip * lots);\n    const takeProfitAt =\n      (buySell === \"buy\"\n        ? normalizedOpenPrice + pipsToProfit\n        : normalizedOpenPrice - pipsToProfit) / 10000;\n    const stopLossPips = Math.round(pipsToRisk ? pipsToRisk : 0);\n    const takeProfitPips = Math.round(pipsToProfit ? pipsToProfit : 0);\n\n    setResult({ stopLossAt, takeProfitAt, stopLossPips, takeProfitPips });\n  }\n  if (!translations) {\n    return null;\n  }\n\n  const t = translations.stopLossTakeProfitLevels;\n  return (\n    <>\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          minHeight: \"2.25rem\", // 36px\n        }}\n      >\n        <Branded.ButtonGroup\n          items={[\n            { label: t.buy, onClick: () => setBuySell(\"buy\") },\n            { label: t.sell, onClick: () => setBuySell(\"sell\") },\n          ]}\n          selected={buySell === \"buy\" ? t.buy : t.sell}\n        />\n      </div>\n\n      <div\n        style={{\n          display: \"flex\",\n          flexWrap: \"wrap\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          gap: \"1rem\", // 16px\n        }}\n      >\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.open}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={openPrice}\n            onChange={(e) => setOpenPrice(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.value}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={perPip}\n            onChange={(e) => setPerPip(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.lots}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={lots}\n            onChange={(e) => setLots(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.risk}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={toRisk}\n            onChange={(e) => setToRisk(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            gap: \"0.5rem\", // 8px\n          }}\n        >\n          <Branded.Label>{t.gain}</Branded.Label>\n          <Branded.TextInput\n            type=\"number\"\n            value={toGain}\n            onChange={(e) => setToGain(parseFloat(e.target.value))}\n            min={0.01}\n          />\n        </div>\n      </div>\n      {result && (\n        <Branded.ResultsContainer>\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\", // 8px\n              gap: \"0.5rem\", // 8px\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {t.stopLoss}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {result.stopLossAt.toFixed(2)}\n            </span>\n          </div>\n          <hr\n            style={{\n              borderColor:\n                styles.results_separator_color || styles.base_text_color,\n              width: \"100%\",\n            }}\n          />\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\", // 8px\n              gap: \"0.5rem\", // 8px\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {t.takeProfit}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {result.takeProfitAt.toFixed(2)}\n            </span>\n          </div>\n          <hr\n            style={{\n              borderColor:\n                styles.results_separator_color || styles.base_text_color,\n              width: \"100%\",\n            }}\n          />\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\", // 8px\n              gap: \"0.5rem\", // 8px\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {t.stopLossPips}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {result.stopLossPips.toFixed(2)}\n            </span>\n          </div>\n          <hr\n            style={{\n              borderColor:\n                styles.results_separator_color || styles.base_text_color,\n              width: \"100%\",\n            }}\n          />\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              alignItems: \"center\",\n              padding: \"0.5rem\", // 8px\n              gap: \"0.5rem\", // 8px\n            }}\n          >\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize:\n                  styles.results_secondary_font_size || styles.base_font_size,\n                lineHeight:\n                  styles.results_secondary_font_size || styles.base_font_size,\n              }}\n            >\n              {t.takeProfitPips}\n            </span>\n            <span\n              style={{\n                color: styles.results_text_color || styles.base_text_color,\n                fontSize: styles.results_font_size || styles.base_font_size,\n                lineHeight: styles.results_font_size || styles.base_font_size,\n              }}\n            >\n              {result.takeProfitPips.toFixed(2)}\n            </span>\n          </div>\n        </Branded.ResultsContainer>\n      )}\n    </>\n  );\n}\n\nexport function StopLossTakeProfitLevels({\n  styles,\n  size = \"screen\",\n}: StopLossTakeProfitLevelsProps) {\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }}>\n        <Branded.WidgetContainer\n          widgetName=\"stopLossTakeProfitLevels\"\n          size={size}\n        >\n          <RawStopLossTakeProfitLevels styles={styles} />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport Branded from \"../Branded\";\nimport { WidgetStyle } from \"../../types/WidgetStyle\";\nimport dictionaries from \"../../dictionaries\";\nimport { Dictionary } from \"../../types/Dictionary\";\nimport { formatLangFilename } from \"../../utils/formatLangFilename\";\nimport { FancyLoader } from \"../FancyLoader\";\nimport { fetchGlossaryDefinitions } from \"../../functions/fetchGlossaryDefinitions\";\nimport { GlossaryDefinition } from \"../../types/glossary\";\nimport { ButtonGroup } from \"../Branded/elements/ButtonGroup\";\nimport { adjustColorContrast } from \"../../utils/colors\";\nimport { firstLetterNonLatin } from \"../../functions/firstLetterNonLatin\";\n\ninterface RawProps {\n  styles: WidgetStyle;\n  containerWidth: number;\n}\n\ninterface Props {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nconst LETTER_BUTTON_WIDTH = 42;\nconst NON_LATIN_LANGS = new Set([\n  \"AR\",\n  \"CN\",\n  \"HE\",\n  \"HI\",\n  \"IR\",\n  \"JP\",\n  \"KR\",\n  \"MN\",\n  \"RU\",\n  \"TH\",\n]);\n\nexport function RawGlossary({ styles, containerWidth }: RawProps): JSX.Element {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [status, setStatus] = useState<\"ready\" | \"loading\" | \"error\">(\"ready\");\n\n  const [definitions, setDefinitions] = useState<GlossaryDefinition[] | null>(\n    null\n  );\n  const [activeLetter, setActiveLetter] = useState<string>(\"\");\n  const [letterRows, setLetterRows] = useState<number>(1);\n  const [searchPhrase, setSearchPhrase] = useState<string>(\"\");\n\n  useEffect(() => {\n    const fetchTranslations = async () => {\n      try {\n        const selectedLang = styles.lang.toLowerCase();\n        const translation: Dictionary =\n          dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"]; // Default to 'en'\n        setTranslations(translation);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    fetchTranslations();\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({\n          google: { families: [styles.font_family] },\n        });\n      });\n    }\n  }, [styles.lang, styles.font_family]);\n\n  const ready = !!(translations && definitions);\n\n  useEffect(() => {\n    if (!ready) return;\n\n    const apply = () => {\n      let newLetterRows = 1;\n      for (let rows = 1; rows <= 6; rows++) {\n        newLetterRows = rows;\n        const totalButtonWidth =\n          LETTER_BUTTON_WIDTH * (Math.ceil(letters.length / rows) + 2);\n        if (containerWidth >= totalButtonWidth) {\n          break;\n        }\n      }\n      setLetterRows(newLetterRows);\n    };\n\n    apply();\n  }, [ready, containerWidth]);\n\n  useEffect(() => {\n    const fetchData = async () => {\n      setStatus(\"loading\");\n      const result = await fetchGlossaryDefinitions(styles.lang);\n      if (!result) {\n        setStatus(\"error\");\n        return;\n      }\n      setDefinitions(result);\n      setStatus(\"ready\");\n    };\n\n    fetchData();\n  }, [styles.lang]);\n\n  // locale helpers\n  const collator = useMemo(\n    () =>\n      new Intl.Collator(definitions ? definitions[0].lang : \"en\", {\n        sensitivity: \"variant\",\n        numeric: true,\n      }),\n    [definitions]\n  );\n  const segmenter = useMemo(\n    () =>\n      new Intl.Segmenter(definitions ? definitions[0].lang : \"en\", {\n        granularity: \"grapheme\",\n      }),\n    [definitions]\n  );\n  const nonLatin = useMemo(\n    () => (definitions ? NON_LATIN_LANGS.has(definitions[0].lang) : false),\n    [definitions]\n  );\n\n  // helper to get the first letter (locale-aware)\n  const firstLetter = (s: string): string => {\n    if (!s) return \"\";\n    const it = segmenter.segment(s.normalize(\"NFC\"))[Symbol.iterator]();\n    const first = it.next().value?.segment ?? \"\";\n    return first.toLocaleUpperCase(styles.lang.toLowerCase());\n  };\n\n  // helper to normalize strings (locale-aware)\n  const normalize = (s: string) =>\n    s\n      ?.normalize(\"NFKD\")\n      .replace(/\\p{Diacritic}/gu, \"\")\n      .toLocaleLowerCase(styles.lang.toLowerCase()) || \"\";\n\n  // derive letter list dynamically\n  const letters = useMemo(() => {\n    const set = new Set<string>();\n    if (!definitions) return [];\n    if (definitions.length === 0) return [];\n    if (nonLatin) {\n      for (const definition of definitions) {\n        const fl = firstLetterNonLatin(definition.title, definitions[0].lang);\n        if (fl) set.add(fl);\n      }\n    } else {\n      for (const definition of definitions)\n        set.add(firstLetter(definition.title));\n    }\n    return Array.from(set).sort(collator.compare);\n  }, [definitions, collator]);\n\n  useEffect(() => {\n    if (!definitions || letters.length === 0) return;\n\n    // if nothing selected (or current selection no longer exists), pick the first one\n    if (!activeLetter || !letters.includes(activeLetter)) {\n      setActiveLetter(letters[0]);\n    }\n  }, [definitions, letters]);\n\n  // filtered list\n  const visible = useMemo(() => {\n    if (!definitions) return [];\n\n    const q = searchPhrase.trim();\n    const base = activeLetter\n      ? definitions.filter((d) =>\n          nonLatin\n            ? firstLetterNonLatin(d.title, definitions[0].lang) === activeLetter\n            : firstLetter(d.title) === activeLetter\n        )\n      : definitions;\n\n    if (!q) return base;\n\n    const nq = normalize(q);\n    return base.filter((d) => normalize(d.title).includes(nq));\n  }, [definitions, activeLetter, searchPhrase]);\n\n  if (!ready) {\n    return <></>;\n  }\n\n  const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const val = e.target.value;\n    if (val.length === 1) {\n      setActiveLetter(val.toLocaleUpperCase(styles.lang.toLowerCase()));\n    }\n    setSearchPhrase(val);\n  };\n\n  const t = translations.glossary;\n\n  const defTitleStyle: React.CSSProperties = {\n    color: styles.glossary_titles_color || styles.main_text_color,\n    fontWeight: \"bold\",\n  };\n  const defTextStyle: React.CSSProperties = {\n    color:\n      styles.glossary_defs_color ||\n      adjustColorContrast(styles.main_text_color, 20),\n    marginLeft: \"0.5rem\",\n  };\n  const definitionsContainerStyle: React.CSSProperties = {\n    width: \"100%\",\n  };\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        display: \"flex\",\n        flexDirection: \"column\",\n        alignItems: \"center\",\n        gap: \"1rem\",\n      }}\n      dir={\n        definitions[0]?.lang === \"AR\" || definitions[0]?.lang === \"HE\"\n          ? \"rtl\"\n          : \"ltr\"\n      }\n    >\n      {/* Letter row */}\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          gap: \"0.5rem\",\n          width: \"100%\",\n        }}\n      >\n        {Array.from({ length: letterRows }).map((_, rowIndex) => {\n          const start = Math.floor((letters.length / letterRows) * rowIndex);\n          const end = Math.floor(\n            (letters.length / letterRows) * (rowIndex + 1)\n          );\n          const rowLetters = letters.slice(start, end);\n          return (\n            <ButtonGroup\n              key={rowIndex}\n              items={rowLetters.map((L) => ({\n                label: L,\n                onClick: () => setActiveLetter(L),\n              }))}\n              selected={activeLetter || undefined}\n            />\n          );\n        })}\n      </div>\n\n      {/* Search */}\n      <div style={{ width: containerWidth < 400 ? \"100%\" : \"auto\" }}>\n        <Branded.TextInput\n          onChange={handleSearchChange}\n          value={searchPhrase}\n          placeholder={t.searchPlaceholder}\n        />\n      </div>\n\n      {/* Items */}\n      <div style={definitionsContainerStyle}>\n        {status === \"loading\" ? (\n          <FancyLoader />\n        ) : status === \"error\" ? (\n          <div>{\"Error loading definitions.\"}</div>\n        ) : visible && visible.length === 0 ? (\n          <div>{t.noResults}</div>\n        ) : (\n          visible && (\n            <div\n              style={{\n                display: \"flex\",\n                flexDirection: \"column\",\n                gap: \"0.5rem\",\n              }}\n            >\n              {visible.map((item, i) => (\n                <div\n                  key={i}\n                  style={{\n                    display: \"flex\",\n                    flexDirection: \"column\",\n                  }}\n                >\n                  <span style={defTitleStyle}>{item.title}</span>\n                  <span style={defTextStyle}>{item.definition}</span>\n                </div>\n              ))}\n            </div>\n          )\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport function Glossary({ styles, size = \"screen\" }: Props): JSX.Element {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [containerWidth, setContainerWidth] = useState(0);\n\n  useEffect(() => {\n    const el = containerRef.current;\n    if (!el) return;\n\n    const ro = new ResizeObserver((entries) => {\n      const w = entries[0].contentRect.width;\n      setContainerWidth(w);\n    });\n\n    ro.observe(el);\n    setContainerWidth(el.getBoundingClientRect().width);\n\n    // Usually you don't need the window listener when using RO\n    return () => ro.disconnect();\n  }, [containerRef.current]);\n\n  return (\n    <Branded style={styles}>\n      <div style={{ width: \"100%\", height: \"100%\" }} ref={containerRef}>\n        <Branded.WidgetContainer widgetName=\"glossary\" size={size}>\n          <RawGlossary styles={styles} containerWidth={containerWidth} />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","import { GlossaryDefinition } from \"../types/glossary\";\nimport { WIDGET_API_BASE } from \"../utils/widgetApiBase\";\n\nexport async function fetchGlossaryDefinitions(lang: string): Promise<GlossaryDefinition[] | null> {\n    const url = `${WIDGET_API_BASE}/api/widgets/glossary`;\n\n    try {\n        const response = await fetch(url, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ lang }),\n        });\n        const definitions: GlossaryDefinition[] | { error: string } = await response.json();\n\n        if (!response.ok || ('error' in definitions)) {\n            if ('error' in definitions) {\n                throw new Error('API Error: ' + definitions.error);\n            }\n            throw new Error('API Error: No data');\n        }\n\n        return definitions;\n    } catch (error) {\n        console.error('Fetch error:', error);\n        return null;\n    }\n}\n\n","/**\n * Returns the first character in `text` that belongs to the script of `langOrScript`.\n * `langOrScript` can be a BCP-47 language tag (e.g. \"en\", \"he-IL\", \"sr\") or a script\n * (ISO 15924 short or long, e.g. \"Latn\", \"Latin\", \"Hebr\", \"Hebrew\").\n * If none found, returns null.\n */\nexport function firstLetterNonLatin(text: string, langOrScript: string): string | null {\n    if (!text) return null;\n\n    // Try to interpret input as a script first (ISO 15924 code or name)\n    const looksLikeScript = /^[A-Za-z]{4}$/.test(langOrScript) || /^[A-Za-z]{3,}$/.test(langOrScript);\n\n    // Resolve to a script code (ISO 15924, e.g. Latn, Hebr, Cyrl, Jpan, Kore, Hans, Hant)\n    let script: string | null = null;\n\n    if (looksLikeScript) {\n        script = canonicalizeScript(langOrScript);\n    } else {\n        try {\n            // Use likely subtags to infer script from language tag\n            // e.g. \"en\" -> Latn, \"he\" -> Hebr, \"sr\" -> Cyrl, \"zh\" -> Hans, \"ja\" -> Jpan, \"ko\" -> Kore\n            script = new (Intl as any).Locale(langOrScript).maximize().script ?? null;\n        } catch {\n            script = null;\n        }\n    }\n\n    if (!script) return null; // unknown / unresolvable input\n\n    // Handle meta-scripts that don't directly match characters under \\p{Script=...}\n    // - Jpan: Hiragana + Katakana + Han\n    // - Kore: Hangul + Han\n    // - Hans/Hant: both are Han variants; use Han\n    // Everything else can be used as-is (short codes like Latn, Hebr, etc. are valid).\n    let regex: RegExp;\n    switch (script) {\n        case \"Jpan\":\n            regex = /[\\p{Script=Hira}\\p{Script=Kana}\\p{Script=Han}]/u;\n            break;\n        case \"Kore\":\n            regex = /[\\p{Script=Hang}\\p{Script=Han}]/u;\n            break;\n        case \"Hans\":\n        case \"Hant\":\n            regex = /\\p{Script=Han}/u;\n            break;\n        default:\n            // Use the short ISO 15924 code directly; JS accepts aliases (e.g., Latn/Hebr/Cyrl)\n            regex = new RegExp(`\\\\p{Script=${script}}`, \"u\");\n    }\n\n    for (const ch of text) {\n        if (regex.test(ch)) return ch;\n    }\n    return null;\n}\n\nfunction canonicalizeScript(input: string): string | null {\n    // Normalize to TitleCase 4-letter ISO 15924 if possible (e.g., \"latin\"->\"Latin\" or \"Latn\")\n    const s = input.trim();\n    if (!s) return null;\n\n    // If it's 4 letters, TitleCase it (e.g., latn -> Latn)\n    if (/^[A-Za-z]{4}$/.test(s)) {\n        return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();\n    }\n\n    // If it's a long name (e.g., \"Latin\", \"Hebrew\", \"Cyrillic\"), accept as-is;\n    // JS regex supports aliases, but we’ll return TitleCased to be safe.\n    return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport dictionaries from \"../../../dictionaries\";\nimport { fetchNewsArticles } from \"./functions/fetchNewsArticles\";\nimport { Dictionary } from \"../../../types/Dictionary\";\nimport { NewsArticle } from \"../../../types/news\";\nimport { WidgetComboType, WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { formatLangFilename } from \"../../../utils/formatLangFilename\";\nimport Branded from \"../../Branded\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport { Article } from \"./parts/Article\";\nimport { ArticlePreview } from \"./parts/ArticlePreview\";\nimport { VirtualList } from \"../../Branded/elements/VirtualList\";\nimport { PaginationControls } from \"./parts/PaginationControls\";\nimport { generateRandomColor } from \"../../../utils/colors\";\n\nexport const CATEGORY_MAP = {\n  forex: { label: \"Forex\", color: \"#4caf50\" },\n  stock: { label: \"Stocks\", color: \"#2196f3\" },\n  crypto: { label: \"Crypto\", color: \"#9c27b0\" },\n  cmd: { label: \"Commodities\", color: \"#ff9800\" },\n  worldec: { label: \"World Economy\", color: \"#3f51b5\" },\n  regec: { label: \"Regional Economy\", color: \"#f44336\" },\n};\n\n// Simple function to generate a random color in hex format\n\nexport interface NewsStyle {\n  fontFamily: string;\n  mainTextColor: string;\n}\n\nexport interface RawNewsProps {\n  lang: string;\n  style: NewsStyle;\n  containerWidth: number;\n  setReady: (ready: boolean) => void;\n  inCombo?: WidgetComboType;\n  imageBorderRadius?: string;\n  scrollMode?: \"virtual\" | \"pagination\";\n}\n\ninterface Props {\n  styles: WidgetStyle;\n  inCombo?: WidgetComboType;\n  size?: \"full\" | \"screen\";\n}\n\nconst LIMIT = 20;\nconst VIRTUAL_FETCH_SIZE = 5; // how many items to fetch in virtual mode\nconst ESTIMATED_ITEM_HEIGHT = 100;\n\nexport function RawNews({\n  lang,\n  style,\n  containerWidth,\n  setReady,\n  inCombo,\n  imageBorderRadius,\n  scrollMode = \"virtual\",\n}: RawNewsProps): JSX.Element {\n  const [translations, setTranslations] = useState<Dictionary | null>(null);\n  const [status, setStatus] = useState<\"ready\" | \"loading\" | \"error\">(\n    \"loading\",\n  );\n\n  const [items, setItems] = useState<NewsArticle[]>([]);\n  const [selectedArticle, setSelectedArticle] = useState<NewsArticle | null>(\n    null,\n  );\n\n  // request sequencing (cancel stale async resolves)\n  const reqSeqRef = useRef(0);\n\n  // hasMore / fetching: keep BOTH state (for UI) and ref (for synchronous guards)\n  const [hasMore, setHasMore] = useState(true);\n  const [isFetchingMore, setIsFetchingMore] = useState(false);\n  const hasMoreRef = useRef(true);\n  const isFetchingMoreRef = useRef(false);\n\n  // For pagination mode\n  const pageListRef = useRef<HTMLDivElement>(null);\n  const [page, setPage] = useState(0);\n  const [pageSize, setPageSize] = useState(1);\n\n  const nextStartRef = useRef(0);\n  const tagColorRef = useRef<Record<string, string>>({});\n  const inFlightRef = useRef(false); // extra guard against rapid duplicate calls\n\n  // Load translations + font\n  useEffect(() => {\n    const selectedLang = lang.toLowerCase();\n    const translation: Dictionary =\n      dictionaries[formatLangFilename(selectedLang)] || dictionaries[\"en\"];\n\n    setTranslations(translation);\n\n    if (typeof window !== \"undefined\") {\n      import(\"webfontloader\").then((WebFont) => {\n        WebFont.load({ google: { families: [style.fontFamily] } });\n      });\n    }\n  }, [lang, style.fontFamily]);\n\n  // Ready when we have translations and at least something loaded (or finished loading)\n  useEffect(() => {\n    setReady(!!translations && (items.length > 0 || status === \"ready\"));\n  }, [translations, items.length, status, setReady]);\n\n  const getArticleKey = useCallback((a: NewsArticle | undefined, i: number) => {\n    // Prefer stable ids if you have them\n    const anyA = a as any;\n    const id = anyA?.id ?? anyA?.news_id ?? anyA?.slug;\n    if (id != null) return String(id);\n    return `${anyA?.headline ?? \"news\"}:${i}`;\n  }, []);\n\n  const loadMore = useCallback(\n    async (seq?: number) => {\n      const mySeq = seq ?? reqSeqRef.current;\n\n      // IMPORTANT: use refs (sync) for guards, not state (async)\n      if (inFlightRef.current) return;\n      if (isFetchingMoreRef.current || !hasMoreRef.current) return;\n\n      // hard stop: never exceed LIMIT\n      const remaining = LIMIT - nextStartRef.current; // based on where we are, not stale items.length\n      if (remaining <= 0) {\n        hasMoreRef.current = false;\n        setHasMore(false);\n        return;\n      }\n\n      const fetchSize =\n        scrollMode === \"virtual\"\n          ? Math.min(VIRTUAL_FETCH_SIZE, remaining)\n          : remaining; // pagination: fetch all remaining in one go\n\n      inFlightRef.current = true;\n      isFetchingMoreRef.current = true;\n      setIsFetchingMore(true);\n\n      const start = nextStartRef.current;\n      const result = await fetchNewsArticles(lang, start, fetchSize, \"all\");\n\n      // ignore stale responses\n      if (mySeq !== reqSeqRef.current) {\n        inFlightRef.current = false;\n        isFetchingMoreRef.current = false;\n        setIsFetchingMore(false);\n        return;\n      }\n\n      if (!result) {\n        setStatus(\"error\");\n        inFlightRef.current = false;\n        isFetchingMoreRef.current = false;\n        setIsFetchingMore(false);\n        return;\n      }\n\n      for (const a of result) {\n        const tag = a?.tag;\n        if (!tag) continue;\n        if (!tagColorRef.current[tag])\n          tagColorRef.current[tag] = generateRandomColor();\n      }\n\n      // advance cursor based on server response\n      nextStartRef.current = start + result.length;\n\n      // Update items and compute hasMore from the *current* merged list (no stale closure)\n      setItems((prev) => {\n        const merged = [...prev, ...result].slice(0, LIMIT);\n\n        const reachedLimit = merged.length >= LIMIT;\n        const gotLessThanRequested = result.length < fetchSize;\n        const nextHasMore = !(reachedLimit || gotLessThanRequested);\n\n        hasMoreRef.current = nextHasMore;\n        setHasMore(nextHasMore);\n\n        return merged;\n      });\n\n      setStatus(\"ready\");\n      inFlightRef.current = false;\n      isFetchingMoreRef.current = false;\n      setIsFetchingMore(false);\n    },\n    [lang, scrollMode],\n  );\n\n  // pagination pageSize calculation\n  useEffect(() => {\n    if (scrollMode !== \"pagination\") return;\n\n    const el = pageListRef.current;\n    if (!el) return;\n\n    const compute = () => {\n      const h = el.getBoundingClientRect().height;\n\n      // how many full previews fit\n      const nextPageSize = Math.max(1, Math.floor(h / ESTIMATED_ITEM_HEIGHT));\n\n      setPageSize((prev) => (prev === nextPageSize ? prev : nextPageSize));\n\n      // keep page in range if pageSize changed\n      setPage((prevPage) => {\n        const totalPages = Math.max(1, Math.ceil(items.length / nextPageSize));\n        return Math.min(prevPage, totalPages - 1);\n      });\n    };\n\n    const ro = new ResizeObserver(() => compute());\n    ro.observe(el);\n    compute();\n\n    return () => ro.disconnect();\n  }, [scrollMode, items.length]);\n\n  // Reset + initial fetch on language OR scrollMode change\n  useEffect(() => {\n    reqSeqRef.current += 1;\n    const seq = reqSeqRef.current;\n\n    setItems([]);\n    setSelectedArticle(null);\n    setPage(0);\n\n    nextStartRef.current = 0;\n    tagColorRef.current = {};\n\n    // reset refs FIRST (so loadMore won't get blocked by stale guards)\n    hasMoreRef.current = true;\n    isFetchingMoreRef.current = false;\n    inFlightRef.current = false;\n\n    setHasMore(true);\n    setIsFetchingMore(false);\n    setStatus(\"loading\");\n\n    loadMore(seq);\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [lang, scrollMode]);\n\n  if (status === \"error\") {\n    return (\n      <div style={{ color: style.mainTextColor || \"#000\" }}>\n        Error loading news articles.\n      </div>\n    );\n  }\n\n  const listHidden = !!selectedArticle;\n\n  const pageStart = page * pageSize;\n  const pageEnd = pageStart + pageSize;\n  const pageItems = items.slice(pageStart, pageEnd);\n\n  // last page if we know there's no more AND we don't have items beyond this page\n  const isLastPage = !hasMore && items.length <= pageEnd;\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        height: \"100%\", // important so list can scroll within\n        display: \"flex\",\n        flexDirection: \"column\",\n        alignItems: \"center\",\n        gap: \"1rem\",\n        minHeight: 0, // IMPORTANT in flex layouts to allow inner scroll\n      }}\n    >\n      {/* ARTICLE DETAIL VIEW */}\n      <div\n        style={{\n          display: selectedArticle ? \"block\" : \"none\",\n          width: \"100%\",\n          maxWidth: \"600px\",\n          padding: \"1.5rem 0\",\n        }}\n      >\n        <Article\n          article={selectedArticle}\n          showLabels={true}\n          containerWidth={containerWidth}\n          closeArticle={() => setSelectedArticle(null)}\n          allArticles={items}\n          onSelectArticle={(a) => {\n            setSelectedArticle({ ...a });\n            if (typeof window !== \"undefined\") window.scrollTo({ top: 0 });\n          }}\n        />\n      </div>\n\n      {/* LIST VIEW (kept mounted to preserve scrollTop) */}\n      <div\n        style={{\n          display: listHidden ? \"none\" : \"flex\",\n          width: \"100%\",\n          height: \"100%\",\n          minHeight: 0, // IMPORTANT\n          flexDirection: \"column\",\n        }}\n      >\n        {status === \"loading\" && items.length === 0 ? (\n          <FancyLoader />\n        ) : scrollMode === \"virtual\" ? (\n          <VirtualList\n            items={items}\n            getKey={(a, i) => getArticleKey(a, i)}\n            estimatedItemHeight={320}\n            overscan={3}\n            onEndReached={() => {\n              if (hasMore && items.length < LIMIT) loadMore();\n            }}\n            footer={\n              isFetchingMore ? (\n                <div style={{ padding: \"1rem 0\" }}>\n                  <FancyLoader />\n                </div>\n              ) : null\n            }\n            renderItem={(article) => {\n              if (!article) return null;\n              return (\n                <div style={{ paddingBottom: \"1rem\" }}>\n                  <ArticlePreview\n                    article={article}\n                    tagColor={tagColorRef.current[article.tag || \"\"] || \"#666\"}\n                    showSubheadline={!!inCombo}\n                    showLabel={!inCombo}\n                    containerWidth={containerWidth}\n                    onClick={() => setSelectedArticle({ ...article })}\n                    imageBorderRadius={imageBorderRadius}\n                  />\n                </div>\n              );\n            }}\n          />\n        ) : (\n          <>\n            <div\n              ref={pageListRef}\n              style={{\n                width: \"100%\",\n                maxWidth: \"600px\",\n                height: \"100%\",\n                minHeight: 0,\n                overflow: \"hidden\", // (optional) usually nicer than scrolling in pagination mode\n              }}\n            >\n              {pageItems.map((article, index) => (\n                <div\n                  key={getArticleKey(article, pageStart + index)}\n                  style={{ paddingBottom: \"1rem\" }}\n                >\n                  <ArticlePreview\n                    article={article}\n                    tagColor={tagColorRef.current[article.tag || \"\"] || \"#666\"}\n                    showSubheadline={!!inCombo}\n                    showLabel={!inCombo}\n                    containerWidth={containerWidth}\n                    onClick={() => setSelectedArticle({ ...article })}\n                    imageBorderRadius={imageBorderRadius}\n                  />\n                </div>\n              ))}\n\n              {isFetchingMore ? (\n                <div style={{ padding: \"1rem 0\" }}>\n                  <FancyLoader />\n                </div>\n              ) : null}\n            </div>\n\n            <PaginationControls\n              page={page}\n              setPage={setPage}\n              isLastPage={isLastPage}\n              setSelectedArticle={setSelectedArticle}\n            />\n          </>\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport function News({ styles, size = \"screen\" }: Props): JSX.Element {\n  const [ready, setReady] = useState<boolean>(false);\n  const [containerWidth, setContainerWidth] = useState<number>(0);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  // responsive watcher\n  useEffect(() => {\n    if (!ready) return;\n    const el = containerRef.current;\n    if (!el) return;\n\n    const apply = (w: number) => setContainerWidth(w);\n\n    const ro = new ResizeObserver((entries) => {\n      const w = entries[0].contentRect.width;\n      apply(w);\n    });\n\n    ro.observe(el);\n    apply(el.getBoundingClientRect().width);\n\n    return () => ro.disconnect();\n  }, [ready]);\n\n  return (\n    <Branded style={styles}>\n      <div\n        ref={containerRef}\n        style={{\n          width: \"100%\",\n          height: \"100%\",\n          minHeight: 0, // IMPORTANT in flex layouts\n        }}\n      >\n        <Branded.WidgetContainer widgetName=\"news\" size={size}>\n          <RawNews\n            style={{\n              fontFamily: styles.font_family,\n              mainTextColor: styles.main_text_color,\n            }}\n            lang={styles.lang}\n            containerWidth={containerWidth}\n            setReady={setReady}\n            scrollMode={styles.news_scroll_mode ?? undefined}\n          />\n        </Branded.WidgetContainer>\n      </div>\n    </Branded>\n  );\n}\n","import { NewsArticle } from \"../../../../types/news\";\nimport { WIDGET_API_BASE } from \"../../../../utils/widgetApiBase\";\n\nconst NEWS_API_URL = `${WIDGET_API_BASE}/api/widgets/news`;\n\nexport async function fetchNewsArticles(lang: string, start: number, size: number, category: string | null, assetId?: number): Promise<NewsArticle[] | null> {\n    const url = NEWS_API_URL;\n\n    try {\n        const response = await fetch(url, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ lang, start, size, category, ...(assetId != null ? { assetId } : {}) }),\n        });\n        const articles: NewsArticle[] | { error: string } = await response.json();\n\n        if (!response.ok || ('error' in articles)) {\n            if ('error' in articles) {\n                throw new Error('API Error: ' + articles.error);\n            }\n            throw new Error('API Error: No data');\n        }\n\n        return articles;\n    } catch (error) {\n        console.error('Fetch error:', error);\n        return null;\n    }\n}\n\n","import { NewsArticle } from \"../../../../types/news\";\nimport { useBrandedColors } from \"../../../Branded\";\nimport { adjustColorContrast } from \"../../../../utils/colors\";\n\nconst MAX_RELATED = 3;\n\n// index.tsx re-wraps the selected article ({ ...a }), so reference equality\n// fails — identify articles by their stable fields instead.\nconst articleKey = (a: NewsArticle) => `${a.headline}|${a.dateCode}|${a.lang}`;\n\nfunction pickRelated(current: NewsArticle, all: NewsArticle[]): NewsArticle[] {\n  const seen = new Set([articleKey(current)]);\n  const unique = all.filter((a) => {\n    const key = articleKey(a);\n    if (seen.has(key)) return false;\n    seen.add(key);\n    return true;\n  });\n\n  const sameCategory = unique.filter((a) => a.itemCategory === current.itemCategory);\n  const rest = unique.filter((a) => a.itemCategory !== current.itemCategory);\n  return [...sameCategory, ...rest].slice(0, MAX_RELATED);\n}\n\nexport const RelatedArticles: React.FC<{\n  current: NewsArticle;\n  allArticles: NewsArticle[];\n  containerWidth: number;\n  onSelect: (article: NewsArticle) => void;\n}> = ({ current, allArticles, containerWidth, onSelect }) => {\n  const { style } = useBrandedColors();\n\n  const related = pickRelated(current, allArticles);\n  if (related.length === 0) return null;\n\n  const isNarrow = containerWidth < 640;\n\n  return (\n    <div\n      style={{\n        marginTop: \"2rem\",\n        paddingTop: \"1.5rem\",\n        borderTop: `1px solid ${adjustColorContrast(style.main_text_color, 70)}`,\n      }}\n    >\n      <h3\n        style={{\n          margin: \"0 0 1rem\",\n          fontSize: containerWidth < 450 ? \"1.1rem\" : \"1.35rem\",\n          fontWeight: \"bold\",\n          color: style.main_text_color,\n        }}\n      >\n        Related stories\n      </h3>\n\n      <div\n        style={{\n          display: \"grid\",\n          gridTemplateColumns: isNarrow ? \"1fr\" : \"repeat(3, 1fr)\",\n          gap: \"1rem\",\n        }}\n      >\n        {related.map((article, i) => (\n          <button\n            key={`${article.headline}:${i}`}\n            type=\"button\"\n            className=\"related-card\"\n            onClick={() => onSelect(article)}\n          >\n            <div\n              style={{\n                width: \"100%\",\n                aspectRatio: \"16 / 9\",\n                overflow: \"hidden\",\n                borderRadius: \"8px\",\n                backgroundColor: \"#ccc\",\n              }}\n            >\n              <img\n                src={article.imageUrl}\n                alt={article.headline}\n                style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n              />\n            </div>\n\n            <div\n              style={{\n                marginTop: \"0.5rem\",\n                fontWeight: \"bold\",\n                fontSize: \"0.95rem\",\n                lineHeight: 1.25,\n                color: style.main_text_color,\n              }}\n            >\n              {article.headline}\n            </div>\n\n            <div\n              style={{\n                marginTop: \"0.25rem\",\n                fontSize: \"0.8rem\",\n                lineHeight: 1.3,\n                color: adjustColorContrast(style.main_text_color, 35),\n                display: \"-webkit-box\",\n                WebkitLineClamp: 2,\n                WebkitBoxOrient: \"vertical\",\n                overflow: \"hidden\",\n              }}\n            >\n              {article.subheadline}\n            </div>\n          </button>\n        ))}\n      </div>\n\n      <style>{`\n        .related-card {\n          display: block;\n          width: 100%;\n          text-align: left;\n          background: transparent;\n          border: none;\n          padding: 0;\n          cursor: pointer;\n          transition: opacity 0.2s ease;\n        }\n        .related-card:hover { opacity: 0.85; }\n      `}</style>\n    </div>\n  );\n};\n","import { NewsArticle } from \"../../../../types/news\";\nimport { adjustColorContrast } from \"../../../../utils/colors\";\nimport { useBrandedColors } from \"../../../Branded\";\nimport { RelatedArticles } from \"./RelatedArticles\";\n\nexport const Article: React.FC<{\n  article: NewsArticle | null;\n  showLabels: boolean;\n  containerWidth: number;\n  closeArticle: () => void;\n  allArticles?: NewsArticle[];\n  onSelectArticle?: (article: NewsArticle) => void;\n}> = ({\n  article,\n  showLabels,\n  containerWidth,\n  closeArticle,\n  allArticles,\n  onSelectArticle,\n}) => {\n  const { style } = useBrandedColors();\n\n  if (!article) return null;\n\n  const articleWrapperStyle: React.CSSProperties = {\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: \"1rem\",\n    color: style.main_text_color || \"#000\",\n    lineHeight: 1.5,\n  };\n\n  const headerWrapperStyle: React.CSSProperties = {\n    width: \"100%\",\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: \"0.25rem\",\n  };\n\n  const headlineStyle: React.CSSProperties = {\n    margin: 0,\n    color: style.main_text_color,\n    fontWeight: \"bold\",\n    fontSize:\n      containerWidth < 450\n        ? \"1.5rem\"\n        : containerWidth < 800\n          ? \"2rem\"\n          : containerWidth < 1200\n            ? \"2.5rem\"\n            : \"3rem\",\n  };\n\n  const subheadlineStyle: React.CSSProperties = {\n    margin: 0,\n    color: style.glossary_defs_color || style.main_text_color,\n    fontSize:\n      containerWidth < 450\n        ? \"0.875rem\"\n        : containerWidth < 800\n          ? \"1rem\"\n          : containerWidth < 1200\n            ? \"1.125rem\"\n            : \"1.25rem\",\n    fontWeight: 600,\n    fontStyle: \"italic\",\n    opacity: 0.9,\n  };\n\n  const floatedImageStyle: React.CSSProperties = {\n    width: \"40%\",\n    height: \"auto\",\n    objectFit: \"cover\",\n    borderRadius: \"4px\",\n    float: \"left\",\n    marginRight: \"1rem\",\n    marginBottom: \"0.5rem\",\n  };\n\n  const contentStyle: React.CSSProperties = {\n    fontSize:\n      containerWidth < 450\n        ? \"1rem\"\n        : containerWidth < 800\n          ? \"1.125rem\"\n          : containerWidth < 1200\n            ? \"1.25rem\"\n            : \"1.5rem\",\n    fontWeight: 400,\n    overflow: \"hidden\", // ensures float layout doesn't overflow\n  };\n\n  return (\n    <>\n      <div style={articleWrapperStyle}>\n        <div style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n          <div style={headerWrapperStyle}>\n            <h2 style={headlineStyle}>{article.headline}</h2>\n            <h4 style={subheadlineStyle}>{article.subheadline}</h4>\n          </div>\n          <div>\n            <button className=\"close-button\" onClick={closeArticle}>\n              ✕\n            </button>\n          </div>\n        </div>\n\n        <div style={contentStyle}>\n          <img\n            src={article.imageUrl}\n            alt={article.headline}\n            style={floatedImageStyle}\n          />\n          {(() => {\n            const body = article.articleBody?.trim() || article.content;\n            const paragraphs = body\n              .split(/\\n\\s*\\n/)\n              .map((p) => p.trim())\n              .filter(Boolean);\n            return paragraphs.map((p, i) => (\n              <p key={i} style={{ margin: i === 0 ? 0 : \"1rem 0 0\" }}>\n                {p}\n              </p>\n            ));\n          })()}\n        </div>\n\n        {allArticles && onSelectArticle && (\n          <RelatedArticles\n            current={article}\n            allArticles={allArticles}\n            containerWidth={containerWidth}\n            onSelect={onSelectArticle}\n          />\n        )}\n      </div>\n      <style>{`\n                .close-button {\n                    background: transparent;\n                    border: none;\n                    cursor: pointer;\n                    font-size: 1.5rem;\n                    font-weight: bold;\n                    padding: 0.5rem;\n                }\n                .close-button:hover {\n                    color: ${adjustColorContrast(style.main_text_color || \"#000\", 20)};\n                }\n            `}</style>\n    </>\n  );\n};\n","import { useMemo } from \"react\";\nimport { NewsArticle } from \"../../../../types/news\";\nimport { useBrandedColors } from \"../../../Branded\";\nimport { adjustColorContrast } from \"../../../../utils/colors\";\nimport { buildDateStringFromFormat } from \"../../../../utils/datesAndTimes\";\nimport { BreakingBadge } from \"../../News2/parts/BreakingBadge\";\n\nconst TagLabel: React.FC<{ tag: string; color: string }> = ({ tag, color }) => {\n  return (\n    <div\n      style={{\n        width: \"fit-content\",\n        padding: \"0.125rem 0.5rem\",\n        borderRadius: \"12px\",\n        fontSize: \"0.75rem\",\n        marginTop: \"0.5rem\",\n        color: adjustColorContrast(color, 90),\n        backgroundColor: color,\n        lineHeight: 1.2,\n        maxWidth: \"100%\",\n        overflow: \"hidden\",\n        textOverflow: \"ellipsis\",\n        whiteSpace: \"nowrap\",\n      }}\n      title={tag}\n    >\n      {tag}\n    </div>\n  );\n};\n\nconst DateLabel: React.FC<{\n  dateCode: string;\n  color: string;\n  format?: string;\n}> = ({ dateCode, color, format = \"mm/dd/yyyy\" }) => {\n  const displayDate = dateCode.split(\"T\")[0].split(\" \")[0];\n  return (\n    <div\n      style={{\n        marginTop: \"0.5rem\",\n        fontSize: \"0.75rem\",\n        color: color,\n      }}\n    >\n      {buildDateStringFromFormat(displayDate, format)}\n    </div>\n  );\n};\n\nexport const ArticlePreview: React.FC<{\n  article: NewsArticle;\n  tagColor: string;\n  showSubheadline: boolean;\n  showLabel: boolean;\n  showDate?: boolean;\n  containerWidth: number;\n  imageBorderRadius?: string;\n  onClick: () => void;\n}> = ({\n  article,\n  tagColor,\n  showSubheadline,\n  showLabel,\n  showDate = true,\n  containerWidth,\n  imageBorderRadius,\n  onClick,\n}) => {\n  const { style } = useBrandedColors();\n\n  const isRounded = useMemo(() => {\n    const regex = /[^0-9]/g;\n    const mainRoundedNumberValue = style.main_rounded.replace(regex, \"\");\n    return !!Number(mainRoundedNumberValue);\n  }, [style.main_rounded]);\n\n  return (\n    <div className=\"article-preview-container\" onClick={onClick}>\n      <div\n        style={{\n          flex: \"0 0 auto\",\n          width: \"8rem\",\n          height: \"5rem\",\n          overflow: \"hidden\",\n          borderRadius: imageBorderRadius || (isRounded ? \"8px\" : \"0px\"),\n          backgroundColor: \"#ccc\",\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n        }}\n      >\n        <img\n          src={article.imageUrl}\n          alt={article.headline}\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            objectFit: \"cover\",\n          }}\n        />\n      </div>\n\n      <div\n        style={{\n          flex: 1,\n          minWidth: 0,\n        }}\n      >\n        <div\n          style={{\n            fontWeight: \"bold\",\n            color: style.main_text_color,\n            marginBottom: \"0.25rem\",\n            lineHeight: containerWidth < 450 ? 1.2 : 1.3,\n            fontSize:\n              containerWidth < 450\n                ? \"1rem\"\n                : containerWidth < 800\n                  ? \"1.25rem\"\n                  : containerWidth < 1200\n                    ? \"1.5rem\"\n                    : \"1.75rem\",\n          }}\n          title={article.headline}\n        >\n          {article.headline}\n        </div>\n\n        <div\n          style={{\n            display: showSubheadline ? \"block\" : \"none\",\n            width: \"100%\",\n            overflow: \"hidden\",\n            textOverflow: \"ellipsis\",\n            whiteSpace: \"nowrap\",\n            color: style.main_text_color,\n            lineHeight: containerWidth < 450 ? 1.2 : 1.3,\n            fontSize:\n              containerWidth < 450\n                ? \"0.75rem\"\n                : containerWidth < 800\n                  ? \"0.875rem\"\n                  : containerWidth < 1200\n                    ? \"1rem\"\n                    : \"1.125rem\",\n          }}\n          title={article.subheadline}\n        >\n          {article.subheadline}\n        </div>\n\n        {article.isBreaking && article.isLive && (\n          <BreakingBadge live expiresAt={article.breakingExpiresAt} />\n        )}\n        {showLabel && <TagLabel tag={article.tag} color={tagColor} />}\n\n        {showDate && (\n          <DateLabel\n            dateCode={article.dateCode}\n            color={adjustColorContrast(style.main_text_color, 35)}\n          />\n        )}\n      </div>\n\n      <style>\n        {`\n            .article-preview-container {\n               display: flex;\n               min-width: 0;\n               gap: 1rem;\n               border-radius: ${isRounded ? \"8px\" : \"0px\"};\n               transition: background-color 0.3s ease;\n            }\n            .article-preview-container:hover {\n               background-color: ${adjustColorContrast(\n                 style.main_background,\n                 25,\n               )};\n               cursor: pointer;\n            }\n         `}\n      </style>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nexport const BreakingBadge: React.FC<{ live?: boolean; expiresAt?: string | null }> = ({ live, expiresAt }) => {\n  const [visible, setVisible] = useState(Boolean(live));\n\n  useEffect(() => {\n    if (!live) {\n      setVisible(false);\n      return;\n    }\n\n    if (!expiresAt) {\n      setVisible(true);\n      return;\n    }\n\n    const remainingMs = new Date(expiresAt).getTime() - Date.now();\n    if (remainingMs <= 0) {\n      setVisible(false);\n      return;\n    }\n\n    setVisible(true);\n    const timeout = window.setTimeout(() => setVisible(false), remainingMs);\n    return () => window.clearTimeout(timeout);\n  }, [live, expiresAt]);\n\n  if (!visible) return null;\n\n  return (\n    <span\n      style={{\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        gap: \"5px\",\n        background: \"#DC2626\",\n        color: \"#fff\",\n        padding: \"4px 10px\",\n        borderRadius: \"6px\",\n        fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n        fontSize: \"10px\",\n        fontWeight: 700,\n        letterSpacing: \"0.08em\",\n        textTransform: \"uppercase\",\n        lineHeight: 1.2,\n        marginRight: \"6px\",\n      }}\n    >\n      {live && (\n        <>\n          <span\n            style={{\n              width: \"6px\",\n              height: \"6px\",\n              borderRadius: \"50%\",\n              background: \"#fff\",\n              animation: \"nf-breaking-pulse 1.4s ease-in-out infinite\",\n            }}\n          />\n          <style>{`@keyframes nf-breaking-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.35; transform: scale(0.7); } }`}</style>\n        </>\n      )}\n      Breaking News\n    </span>\n  );\n};\n","import {\n  CSSProperties,\n  ReactNode,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport Branded from \"..\";\n\ntype VirtualListProps<T> = {\n  items: T[];\n  renderItem: (item: T, index: number) => ReactNode;\n  getKey: (item: T, index: number) => string;\n\n  overscan?: number;\n  estimatedItemHeight?: number;\n\n  /** Called when the bottom sentinel is visible (in the scroll container) */\n  onEndReached?: () => void;\n\n  className?: string;\n  style?: CSSProperties;\n  footer?: ReactNode;\n};\n\nfunction clamp(n: number, a: number, b: number) {\n  return Math.max(a, Math.min(b, n));\n}\n\nfunction binarySearchFirstGreaterOrEqual(arr: number[], value: number) {\n  let lo = 0;\n  let hi = arr.length - 1;\n  let ans = arr.length;\n\n  while (lo <= hi) {\n    const mid = (lo + hi) >> 1;\n    if (arr[mid] >= value) {\n      ans = mid;\n      hi = mid - 1;\n    } else {\n      lo = mid + 1;\n    }\n  }\n  return ans;\n}\n\nexport function VirtualList<T>({\n  items,\n  renderItem,\n  getKey,\n  overscan = 6,\n  estimatedItemHeight = 240,\n  onEndReached,\n  className,\n  style,\n  footer,\n}: VirtualListProps<T>) {\n  const scrollRef = useRef<HTMLDivElement | null>(null);\n  const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n  const heightsRef = useRef<number[]>([]);\n  const offsetsRef = useRef<number[]>([]);\n  const totalHeightRef = useRef<number>(0);\n\n  const [viewportH, setViewportH] = useState(0);\n  const [scrollTop, setScrollTop] = useState(0);\n  const [range, setRange] = useState({ start: 0, end: 0 });\n\n  const recomputeFrom = useCallback(\n    (fromIndex: number) => {\n      const n = items.length;\n      if (n === 0) {\n        offsetsRef.current = [];\n        totalHeightRef.current = 0;\n        return;\n      }\n\n      const heights = heightsRef.current;\n      const offsets = offsetsRef.current;\n\n      if (heights.length < n) heights.length = n;\n      if (offsets.length < n) offsets.length = n;\n\n      const start = clamp(fromIndex, 0, n - 1);\n\n      if (start === 0) {\n        offsets[0] = 0;\n      } else if (offsets[start] == null) {\n        let j = start - 1;\n        while (j >= 0 && offsets[j] == null) j--;\n        if (j < 0) offsets[0] = 0;\n        else offsets[start] = offsets[j] + (heights[j] ?? estimatedItemHeight);\n      }\n\n      for (let i = start + 1; i < n; i++) {\n        offsets[i] = offsets[i - 1] + (heights[i - 1] ?? estimatedItemHeight);\n      }\n\n      totalHeightRef.current =\n        (offsets[n - 1] ?? 0) + (heights[n - 1] ?? estimatedItemHeight);\n    },\n    [items.length, estimatedItemHeight]\n  );\n\n  const computeRange = useCallback(() => {\n    const n = items.length;\n    if (n === 0) {\n      setRange({ start: 0, end: 0 });\n      return;\n    }\n\n    const offsets = offsetsRef.current;\n    if (offsets.length !== n) recomputeFrom(0);\n\n    const top = scrollTop;\n    const bottom = scrollTop + viewportH;\n\n    const first = clamp(\n      binarySearchFirstGreaterOrEqual(offsets, top) - 1,\n      0,\n      n - 1\n    );\n\n    const endCandidate = binarySearchFirstGreaterOrEqual(offsets, bottom);\n    const last = clamp(endCandidate + 1, 0, n - 1);\n\n    const start = clamp(first - overscan, 0, n - 1);\n    const end = clamp(last + overscan, 0, n - 1);\n\n    setRange({ start, end });\n  }, [items.length, scrollTop, viewportH, overscan, recomputeFrom]);\n\n  // viewport height\n  useLayoutEffect(() => {\n    const el = scrollRef.current;\n    if (!el) return;\n\n    const update = () => setViewportH(el.clientHeight);\n    update();\n\n    const ro = new ResizeObserver(update);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, []);\n\n  // scrollTop\n  useEffect(() => {\n    const el = scrollRef.current;\n    if (!el) return;\n\n    let raf = 0;\n    const onScroll = () => {\n      if (raf) return;\n      raf = requestAnimationFrame(() => {\n        raf = 0;\n        setScrollTop(el.scrollTop);\n      });\n    };\n\n    el.addEventListener(\"scroll\", onScroll, { passive: true });\n    return () => {\n      el.removeEventListener(\"scroll\", onScroll);\n      if (raf) cancelAnimationFrame(raf);\n    };\n  }, []);\n\n  // recompute offsets on append/reset\n  useEffect(() => {\n    if (items.length === 0) {\n      heightsRef.current = [];\n      offsetsRef.current = [];\n      totalHeightRef.current = 0;\n      setRange({ start: 0, end: 0 });\n      return;\n    }\n    recomputeFrom(0);\n    computeRange();\n  }, [items.length, recomputeFrom, computeRange]);\n\n  // recompute visible window\n  useEffect(() => {\n    computeRange();\n  }, [scrollTop, viewportH, computeRange]);\n\n  // ✅ Bottom sentinel observer (deterministic “load more”)\n  useEffect(() => {\n    if (!onEndReached) return;\n\n    const root = scrollRef.current;\n    const target = sentinelRef.current;\n    if (!root || !target) return;\n\n    let wasIntersecting = false;\n\n    const io = new IntersectionObserver(\n      (entries) => {\n        const e = entries[0];\n        const nowIntersecting = !!e?.isIntersecting;\n\n        // edge-trigger: only fire when it becomes visible\n        if (nowIntersecting && !wasIntersecting) onEndReached();\n\n        wasIntersecting = nowIntersecting;\n      },\n      {\n        root,\n        // preload before reaching the bottom\n        rootMargin: \"800px 0px 800px 0px\",\n        threshold: 0,\n      }\n    );\n\n    io.observe(target);\n    return () => io.disconnect();\n  }, [onEndReached, items.length]);\n\n  const onMeasured = useCallback(\n    (index: number, height: number) => {\n      const prev = heightsRef.current[index];\n      if (prev === height) return;\n\n      heightsRef.current[index] = height;\n      recomputeFrom(index);\n      computeRange();\n    },\n    [recomputeFrom, computeRange]\n  );\n\n  const visibleItems = useMemo(() => {\n    const n = items.length;\n    if (n === 0) return [];\n\n    const safeEnd = Math.min(range.end, n - 1);\n    const safeStart = Math.min(range.start, safeEnd);\n\n    const res: Array<{ item: T; index: number }> = [];\n    for (let i = safeStart; i <= safeEnd; i++) {\n      const item = items[i];\n      if (item == null) continue;\n      res.push({ item, index: i });\n    }\n    return res;\n  }, [items, range.start, range.end]);\n\n  const totalH = totalHeightRef.current;\n\n  return (\n    <Branded.ScrollContainer\n      ref={scrollRef}\n      className={className}\n      style={{\n        flex: 1, // ✅ fill available height\n        minHeight: 0, // ✅ allow scrolling inside flex parents\n        height: \"100%\",\n        overflowY: \"auto\",\n        position: \"relative\",\n        width: \"100%\",\n        ...style,\n      }}\n    >\n      <div style={{ height: totalH, position: \"relative\", width: \"100%\" }}>\n        {visibleItems.map(({ item, index }) => {\n          const top = offsetsRef.current[index] ?? index * estimatedItemHeight;\n          return (\n            <MeasuredRow\n              key={getKey(item, index)}\n              index={index}\n              top={top}\n              onMeasured={onMeasured}\n            >\n              {renderItem(item, index)}\n            </MeasuredRow>\n          );\n        })}\n\n        {/* Sentinel lives at the very bottom of the content */}\n        <div\n          ref={sentinelRef}\n          style={{\n            position: \"absolute\",\n            top: totalH,\n            left: 0,\n            right: 0,\n            height: 1,\n          }}\n        />\n      </div>\n\n      {footer}\n    </Branded.ScrollContainer>\n  );\n}\n\nfunction MeasuredRow({\n  index,\n  top,\n  onMeasured,\n  children,\n}: {\n  index: number;\n  top: number;\n  onMeasured: (index: number, height: number) => void;\n  children: ReactNode;\n}) {\n  const ref = useRef<HTMLDivElement | null>(null);\n\n  useLayoutEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n\n    const report = () => {\n      const h = el.getBoundingClientRect().height;\n      if (h > 0) onMeasured(index, Math.ceil(h));\n    };\n\n    report();\n\n    const ro = new ResizeObserver(report);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [index, onMeasured]);\n\n  return (\n    <div\n      ref={ref}\n      style={{ position: \"absolute\", top, left: 0, right: 0, width: \"100%\" }}\n    >\n      {children}\n    </div>\n  );\n}\n","import { NewsArticle } from \"../../../../types/news\";\nimport { adjustColorContrast } from \"../../../../utils/colors\";\nimport { useBrandedColors } from \"../../../Branded\";\n\ninterface Props {\n  page: number;\n  setPage: (page: number | ((prev: number) => number)) => void;\n  isLastPage: boolean;\n  setSelectedArticle: (article: NewsArticle | null) => void;\n}\n\nexport const PaginationControls = ({\n  page,\n  setPage,\n  isLastPage,\n  setSelectedArticle,\n}: Props) => {\n  const { style } = useBrandedColors();\n\n  const btnStyle: React.CSSProperties = {\n    backgroundColor: style.main_background || \"#000\",\n    border: `1px solid ${adjustColorContrast(style.main_background || \"#000\", 40)}`,\n    color: style.main_text_color || \"#fff\",\n    padding: \"0.5rem 1rem\",\n    borderRadius: \"6px\",\n    fontSize: \"0.9rem\",\n    cursor: \"pointer\",\n    minWidth: \"4rem\",\n    opacity: 1,\n  };\n\n  const btnDisabledStyle: React.CSSProperties = {\n    ...btnStyle,\n    cursor: \"default\",\n    opacity: 0.4,\n  };\n\n  const textStyle: React.CSSProperties = {\n    color: style.main_text_color || \"#fff\",\n    fontSize: \"0.8rem\",\n    lineHeight: 1,\n    whiteSpace: \"nowrap\",\n  };\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        justifyContent: \"center\",\n        width: \"100%\",\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"space-between\",\n          width: \"100%\",\n          maxWidth: \"600px\",\n          marginTop: \"1rem\",\n          gap: \"1rem\",\n        }}\n      >\n        <button\n          style={page === 0 ? btnDisabledStyle : btnStyle}\n          disabled={page === 0}\n          onClick={() => {\n            if (page > 0) {\n              setSelectedArticle(null);\n              setPage((p) => p - 1);\n            }\n          }}\n        >\n          ◀ Prev\n        </button>\n\n        <div style={textStyle}>Page {page + 1}</div>\n\n        <button\n          style={isLastPage ? btnDisabledStyle : btnStyle}\n          disabled={isLastPage}\n          onClick={() => {\n            if (!isLastPage) {\n              setSelectedArticle(null);\n              setPage((p) => p + 1);\n            }\n          }}\n        >\n          Next ▶\n        </button>\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport Branded from \"../../Branded\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { RawNews2 } from \"./RawNews2\";\nimport { CATEGORY_DEFAULT_COLORS, LAYOUT_MODES, LayoutMode } from \"./constants\";\nimport {\n  pickReadable,\n  alpha,\n  relativeLuminance,\n  clampBorderRadius,\n  isLight,\n} from \"./utils/contrast\";\n\ninterface Props {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n  dev?: boolean;\n}\n\nconst SANS_STACK =\n  \"Inter, -apple-system, BlinkMacSystemFont, Segoe UI, system-ui, sans-serif\";\nconst LUMINANCE_COLLISION = 0.15;\n\nfunction resolveBool(v: boolean | null | undefined, def: boolean): boolean {\n  return v === null || v === undefined ? def : v;\n}\n\nfunction resolveStr(v: string | null | undefined, def: string): string {\n  return v && v.length > 0 ? v : def;\n}\n\nfunction resolveLayoutMode(v: string | null | undefined): LayoutMode {\n  return (LAYOUT_MODES as readonly string[]).includes(v ?? \"\")\n    ? (v as LayoutMode)\n    : \"featured\";\n}\n\nfunction resolveChartTheme(\n  v: \"light\" | \"dark\" | \"auto\" | null | undefined,\n  bg: string,\n): \"light\" | \"dark\" {\n  if (v === \"light\" || v === \"dark\") return v;\n  return isLight(bg) ? \"light\" : \"dark\";\n}\n\nfunction readableOn(bg: string, candidate: string): string {\n  const delta = Math.abs(\n    relativeLuminance(candidate) - relativeLuminance(bg),\n  );\n  return delta < LUMINANCE_COLLISION ? pickReadable(bg) : candidate;\n}\n\nexport function News2({ styles, size, dev }: Props): JSX.Element {\n  const layoutMode = resolveLayoutMode(styles.news_v2_layout_mode);\n  const showShare = resolveBool(styles.news_v2_share_buttons, true);\n  const showReadingTime = resolveBool(styles.news_v2_show_reading_time, true);\n  const showDate = resolveBool(styles.news_v2_show_date, true);\n  const showCategories = resolveBool(styles.news_v2_show_categories, true);\n  const featuredShowChart = resolveBool(\n    styles.news_v2_featured_show_chart,\n    true,\n  );\n\n  const categoryColors = {\n    forex: resolveStr(\n      styles.news_v2_category_color_forex,\n      CATEGORY_DEFAULT_COLORS.forex,\n    ),\n    stock: resolveStr(\n      styles.news_v2_category_color_stock,\n      CATEGORY_DEFAULT_COLORS.stock,\n    ),\n    crypto: resolveStr(\n      styles.news_v2_category_color_crypto,\n      CATEGORY_DEFAULT_COLORS.crypto,\n    ),\n    cmd: resolveStr(\n      styles.news_v2_category_color_cmd,\n      CATEGORY_DEFAULT_COLORS.cmd,\n    ),\n    worldec: resolveStr(\n      styles.news_v2_category_color_worldec,\n      CATEGORY_DEFAULT_COLORS.worldec,\n    ),\n    regec: resolveStr(\n      styles.news_v2_category_color_regec,\n      CATEGORY_DEFAULT_COLORS.regec,\n    ),\n    latam: CATEGORY_DEFAULT_COLORS.latam,\n  };\n\n  const cardBackground = resolveStr(\n    styles.news_v2_card_background,\n    styles.base_background || \"#ffffff\",\n  );\n  const widgetBackground = resolveStr(\n    styles.main_background,\n    styles.base_background || \"#ffffff\",\n  );\n  const readableOnCard = pickReadable(cardBackground);\n\n  const headlineCandidate = resolveStr(\n    styles.news_v2_headline_color,\n    styles.main_text_color || readableOnCard,\n  );\n  const excerptCandidate = resolveStr(\n    styles.news_v2_excerpt_color,\n    styles.main_text_color || readableOnCard,\n  );\n  const metaCandidate = styles.news_v2_meta_color;\n\n  const styleTokens = {\n    cardBackground,\n    widgetBackground,\n    cardBorder: resolveStr(\n      styles.news_v2_card_border,\n      styles.base_border || \"1px solid rgba(15,23,42,0.08)\",\n    ),\n    cardShadow: resolveStr(\n      styles.news_v2_card_shadow,\n      styles.base_shadow ||\n        \"0 1px 2px rgba(15,23,42,0.06), 0 1px 3px rgba(15,23,42,0.10)\",\n    ),\n    cardRounded: clampBorderRadius(\n      resolveStr(styles.news_v2_card_rounded, styles.base_rounded || \"12px\"),\n      20,\n    ),\n    headlineColor: readableOn(cardBackground, headlineCandidate),\n    headlineFontSize: resolveStr(\n      styles.news_v2_headline_font_size,\n      \"clamp(1.0625rem, 1.2vw + 0.7rem, 1.3125rem)\",\n    ),\n    excerptColor: readableOn(cardBackground, excerptCandidate),\n    metaColor:\n      metaCandidate && metaCandidate.length > 0\n        ? readableOn(cardBackground, metaCandidate)\n        : alpha(readableOnCard, 0.65),\n    tabBackground: resolveStr(styles.news_v2_tab_background, \"#f3f4f6\"),\n    tabActiveBackground: resolveStr(\n      styles.news_v2_tab_active_background,\n      \"#7c3aed\",\n    ),\n    tabTextColor: resolveStr(styles.news_v2_tab_text_color, readableOnCard),\n    tabActiveTextColor: resolveStr(\n      styles.news_v2_tab_active_text_color,\n      readableOnCard,\n    ),\n    fontFamily: resolveStr(\n      styles.news_v2_font_family,\n      styles.font_family || SANS_STACK,\n    ),\n    uiFontFamily: SANS_STACK,\n    chartTheme: resolveChartTheme(styles.news_v2_chart_theme, cardBackground),\n  };\n\n  useEffect(() => {\n    loadGoogleFont(styles.news_v2_font_family ?? styles.font_family);\n  }, [styles.news_v2_font_family, styles.font_family]);\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"news\" size={size}>\n        <RawNews2\n          lang={styles.lang}\n          brandName={styles.brand_name}\n          layoutMode={layoutMode}\n          showShare={showShare}\n          showReadingTime={showReadingTime}\n          showDate={showDate}\n          showCategories={showCategories}\n          featuredShowChart={featuredShowChart}\n          categoryColors={categoryColors}\n          styleTokens={styleTokens}\n          dev={dev}\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n\nexport { RawNews2 } from \"./RawNews2\";\n","export function loadGoogleFont(family: string | undefined, weights: readonly number[] = []): void {\n  if (typeof window === \"undefined\" || !family) return;\n  const head = family.split(\",\")[0].trim().replace(/['\"]/g, \"\");\n  if (!head) return;\n  import(\"webfontloader\").then((WebFont) => {\n    WebFont.load({ google: { families: [weights.length ? `${head}:${weights.join(\",\")}` : head] } });\n  });\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { NewsArticle } from \"../../../types/news\";\nimport { fetchNewsArticles } from \"../News/functions/fetchNewsArticles\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport {\n  CATEGORY_LABELS,\n  LayoutMode,\n  NewsCategory,\n  NewsCategoryKey,\n  ARTICLES_PER_PAGE,\n} from \"./constants\";\nimport { HeaderBar } from \"./parts/HeaderBar\";\nimport { ArticleCard } from \"./parts/ArticleCard\";\nimport { FeaturedHero } from \"./parts/FeaturedHero\";\nimport { ArticleDetail } from \"./parts/ArticleDetail\";\nimport {\n  StyleTokens,\n  pickCardTokens,\n  pickHeroTokens,\n  pickHeaderTokens,\n  pickDetailTokens,\n  EmptyState,\n  LoadMoreButton,\n} from \"./parts/RawNews2Helpers\";\nimport { alpha } from \"./utils/contrast\";\n\ntype Props = {\n  lang: string;\n  brandName: string;\n  layoutMode: LayoutMode;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  showCategories: boolean;\n  featuredShowChart: boolean;\n  categoryColors: Record<NewsCategoryKey, string>;\n  styleTokens: StyleTokens;\n  dev?: boolean;\n};\n\nconst FALLBACK_CATEGORY_COLOR = \"#6B7280\";\n\nexport function RawNews2(props: Props) {\n  const {\n    lang,\n    brandName,\n    layoutMode,\n    showShare,\n    showReadingTime,\n    showDate,\n    showCategories,\n    featuredShowChart,\n    categoryColors,\n    styleTokens,\n    dev,\n  } = props;\n\n  const [category, setCategory] = useState<NewsCategory>(\"all\");\n  const [searchQuery, setSearchQuery] = useState(\"\");\n  const [articles, setArticles] = useState<NewsArticle[]>([]);\n  const [offset, setOffset] = useState(0);\n  const [loading, setLoading] = useState(true);\n  const [loadingMore, setLoadingMore] = useState(false);\n  const [hasMore, setHasMore] = useState(true);\n  const [selected, setSelected] = useState<NewsArticle | null>(null);\n  const reqSeqRef = useRef(0);\n\n  useEffect(() => {\n    reqSeqRef.current += 1;\n    const mySeq = reqSeqRef.current;\n\n    setLoading(true);\n    setArticles([]);\n    setOffset(0);\n    setHasMore(true);\n\n    (async () => {\n      const result = await fetchNewsArticles(lang, 0, ARTICLES_PER_PAGE, category);\n      if (mySeq !== reqSeqRef.current) return;\n\n      const batch = result ?? [];\n      setArticles(batch);\n      setHasMore(batch.length >= ARTICLES_PER_PAGE);\n      setOffset(ARTICLES_PER_PAGE);\n      setLoading(false);\n    })();\n  }, [category, lang]);\n\n  const loadMore = async () => {\n    if (loadingMore || !hasMore) return;\n    setLoadingMore(true);\n    const result = await fetchNewsArticles(lang, offset, ARTICLES_PER_PAGE, category);\n    const batch = result ?? [];\n    setArticles((prev) => [...prev, ...batch]);\n    setOffset((prev) => prev + ARTICLES_PER_PAGE);\n    setHasMore(batch.length >= ARTICLES_PER_PAGE);\n    setLoadingMore(false);\n  };\n\n  const isSearching = searchQuery.trim().length > 0;\n\n  const filtered = useMemo(() => {\n    const q = searchQuery.trim().toLowerCase();\n    if (!q) return articles;\n    return articles.filter((a) => a.headline.toLowerCase().includes(q));\n  }, [articles, searchQuery]);\n\n  const featured = useMemo(() => {\n    if (layoutMode !== \"featured\" || isSearching || !articles.length) return null;\n    return articles[0];\n  }, [articles, layoutMode, isSearching]);\n\n  const gridArticles = featured\n    ? filtered.filter((a) => a !== featured)\n    : filtered;\n\n  const colorFor = (cat: string): string =>\n    (categoryColors as Record<string, string>)[cat] ?? FALLBACK_CATEGORY_COLOR;\n\n  const labelFor = (article: NewsArticle): string =>\n    (CATEGORY_LABELS as Record<string, string>)[article.itemCategory] ??\n    article.tag;\n\n  const containerStyle: React.CSSProperties = {\n    width: \"100%\",\n    maxWidth: 1280,\n    margin: \"0 auto\",\n    padding: 16,\n    overflowX: \"hidden\",\n    boxSizing: \"border-box\",\n    minWidth: 0,\n    containerType: \"inline-size\",\n    fontFamily: styleTokens.fontFamily,\n  };\n\n  if (loading && articles.length === 0) {\n    return (\n      <div style={containerStyle}>\n        <div\n          style={{\n            display: \"flex\",\n            justifyContent: \"center\",\n            paddingTop: 80,\n            paddingBottom: 80,\n          }}\n        >\n          <FancyLoader />\n        </div>\n      </div>\n    );\n  }\n\n  if (selected) {\n    return (\n      <div style={containerStyle}>\n        <ArticleDetail\n          article={selected}\n          onClose={() => setSelected(null)}\n          showShare={showShare}\n          showReadingTime={showReadingTime}\n          showDate={showDate}\n          categoryColor={colorFor(selected.itemCategory)}\n          categoryLabel={labelFor(selected)}\n          articles={articles}\n          lang={lang}\n          onSelect={setSelected}\n          styleTokens={pickDetailTokens(styleTokens)}\n        />\n      </div>\n    );\n  }\n\n  const dividerColor = alpha(styleTokens.headlineColor, 0.1);\n  const showEmpty = isSearching && filtered.length === 0;\n\n  return (\n    <div style={containerStyle}>\n      <HeaderBar\n        active={category}\n        onCategoryChange={setCategory}\n        searchQuery={searchQuery}\n        onSearchChange={setSearchQuery}\n        brandName={brandName}\n        showCategories={showCategories}\n        styleTokens={pickHeaderTokens(styleTokens)}\n      />\n\n      {featured && (\n        <div style={{ marginTop: 24 }}>\n          <FeaturedHero\n            article={featured}\n            showChart={featuredShowChart}\n            onClick={setSelected}\n            showShare={showShare}\n            showReadingTime={showReadingTime}\n            showDate={showDate}\n            categoryColor={colorFor(featured.itemCategory)}\n            categoryLabel={labelFor(featured)}\n            styleTokens={pickHeroTokens(styleTokens)}\n            dev={dev}\n          />\n        </div>\n      )}\n\n      {featured && gridArticles.length > 0 && (\n        <hr\n          style={{\n            height: 1,\n            background: dividerColor,\n            border: 0,\n            margin: \"32px 0\",\n          }}\n        />\n      )}\n\n      {showEmpty ? (\n        <EmptyState\n          color={styleTokens.headlineColor}\n          font={styleTokens.fontFamily}\n        />\n      ) : (\n        <div\n          style={{\n            display: \"grid\",\n            gridTemplateColumns: \"repeat(auto-fill, minmax(min(220px, 100%), 1fr))\",\n            gap: 20,\n            marginTop: featured ? 0 : 24,\n          }}\n        >\n          {gridArticles.map((article, i) => (\n            <ArticleCard\n              key={`${article.dateCode}-${article.headline}-${i}`}\n              article={article}\n              onClick={setSelected}\n              showReadingTime={showReadingTime}\n              showDate={showDate}\n              showShare={showShare}\n              categoryColor={colorFor(article.itemCategory)}\n              categoryLabel={labelFor(article)}\n              styleTokens={pickCardTokens(styleTokens)}\n            />\n          ))}\n        </div>\n      )}\n\n      {!isSearching && hasMore && (\n        <LoadMoreButton\n          loading={loadingMore}\n          onClick={loadMore}\n          styleTokens={styleTokens}\n        />\n      )}\n    </div>\n  );\n}\n","export const NEWS_VERSIONS = [\"v1\", \"v2\", \"v3\"] as const;\nexport type NewsVersion = (typeof NEWS_VERSIONS)[number];\n\nexport const LAYOUT_MODES = [\"featured\", \"grid\"] as const;\nexport type LayoutMode = (typeof LAYOUT_MODES)[number];\n\nexport const NEWS_CATEGORIES = [\n  \"all\",\n  \"forex\",\n  \"stock\",\n  \"crypto\",\n  \"cmd\",\n  \"worldec\",\n  \"regec\",\n] as const;\nexport type NewsCategory = (typeof NEWS_CATEGORIES)[number];\n\n// Categories only some languages get (latam = ES / ES-MX). They never join\n// NEWS_CATEGORIES — that list drives the tab strip for every language, and an\n// empty tab in the other 21 langs is worse than no tab.\nexport const PRIVATE_NEWS_CATEGORIES = [\"latam\"] as const;\nexport type NewsCategoryKey =\n  | Exclude<NewsCategory, \"all\">\n  | (typeof PRIVATE_NEWS_CATEGORIES)[number];\n\nexport const CATEGORY_LABELS: Record<NewsCategoryKey, string> = {\n  forex: \"Forex\",\n  stock: \"Stocks\",\n  crypto: \"Crypto\",\n  cmd: \"Commodities\",\n  worldec: \"World Economy\",\n  regec: \"Regional Economy\",\n  latam: \"Latin America\",\n} as const;\n\nexport const CATEGORY_DEFAULT_COLORS: Record<NewsCategoryKey, string> = {\n  forex: \"#3B82F6\",\n  stock: \"#10B981\",\n  crypto: \"#F59E0B\",\n  cmd: \"#EF4444\",\n  worldec: \"#8B5CF6\",\n  regec: \"#06B6D4\",\n  latam: \"#F472B6\",\n} as const;\n\n// TradingView symbols, used only by the technical-analysis gauge. null = the\n// category has no TradingView equivalent, so the gauge is skipped (the price\n// chart itself comes from our own candles, see NFAssetChart).\nexport const CATEGORY_CHART_SYMBOL: Record<NewsCategoryKey, string | null> = {\n  forex: \"FX:EURUSD\",\n  stock: \"NASDAQ:QQQ\",\n  crypto: \"BITSTAMP:BTCUSD\",\n  cmd: \"AMEX:USO\",\n  worldec: \"AMEX:SPY\",\n  regec: null,\n  latam: null,\n} as const;\n\nexport const DEFAULT_BATCH_SIZE = 20;\nexport const ARTICLES_PER_PAGE = 12;\n\nexport const RECOMMENDED_FONTS = [\n  { value: \"Playfair Display\", label: \"Playfair Display\", kind: \"serif\" },\n  { value: \"Merriweather\", label: \"Merriweather\", kind: \"serif\" },\n  { value: \"Lora\", label: \"Lora\", kind: \"serif\" },\n  { value: \"Source Serif Pro\", label: \"Source Serif Pro\", kind: \"serif\" },\n  { value: \"Crimson Pro\", label: \"Crimson Pro\", kind: \"serif\" },\n  { value: \"Inter\", label: \"Inter\", kind: \"sans\" },\n  { value: \"DM Sans\", label: \"DM Sans\", kind: \"sans\" },\n  { value: \"Manrope\", label: \"Manrope\", kind: \"sans\" },\n  { value: \"Space Grotesk\", label: \"Space Grotesk\", kind: \"sans\" },\n  { value: \"IBM Plex Sans\", label: \"IBM Plex Sans\", kind: \"sans\" },\n] as const;\n\nexport type RecommendedFont = (typeof RECOMMENDED_FONTS)[number];\n","export type Rgb = { r: number; g: number; b: number };\n\nconst DARK_DEFAULT = '#0F172A';\nconst LIGHT_DEFAULT = '#F8FAFC';\nconst LIGHT_THRESHOLD = 0.55;\n\nexport function hexToRgb(hex: string): Rgb | null {\n  if (typeof hex !== 'string') return null;\n  const value = hex.trim().toLowerCase();\n  const match = /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/.exec(value);\n  if (!match) return null;\n  const body = match[1];\n  const expanded =\n    body.length === 3 || body.length === 4\n      ? body\n          .split('')\n          .map((c) => c + c)\n          .join('')\n      : body;\n  const r = parseInt(expanded.slice(0, 2), 16);\n  const g = parseInt(expanded.slice(2, 4), 16);\n  const b = parseInt(expanded.slice(4, 6), 16);\n  return { r, g, b };\n}\n\nfunction channelToLinear(channel: number): number {\n  const c = channel / 255;\n  return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nexport function relativeLuminance(hex: string): number {\n  const rgb = hexToRgb(hex);\n  if (!rgb) return 0.5;\n  const r = channelToLinear(rgb.r);\n  const g = channelToLinear(rgb.g);\n  const b = channelToLinear(rgb.b);\n  return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\nexport function pickReadable(\n  background: string,\n  darkText: string = DARK_DEFAULT,\n  lightText: string = LIGHT_DEFAULT,\n): string {\n  return relativeLuminance(background) > LIGHT_THRESHOLD ? darkText : lightText;\n}\n\nfunction clampOpacity(opacity: number): number {\n  if (Number.isNaN(opacity)) return 0;\n  if (opacity < 0) return 0;\n  if (opacity > 1) return 1;\n  return opacity;\n}\n\nexport function alpha(hex: string, opacity: number): string {\n  const o = clampOpacity(opacity);\n  const rgb = hexToRgb(hex);\n  if (!rgb) return `rgba(0, 0, 0, ${o})`;\n  return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${o})`;\n}\n\nexport function isLight(hex: string): boolean {\n  return relativeLuminance(hex) > LIGHT_THRESHOLD;\n}\n\nfunction toHexComponent(value: number): string {\n  const clamped = Math.max(0, Math.min(255, Math.round(value)));\n  return clamped.toString(16).padStart(2, '0');\n}\n\nexport function mix(hex: string, mixWith: string, weight: number): string {\n  const base = hexToRgb(hex);\n  const other = hexToRgb(mixWith);\n  if (!base || !other) return hex;\n  const w = Number.isNaN(weight) ? 0 : Math.max(0, Math.min(1, weight));\n  const r = base.r * (1 - w) + other.r * w;\n  const g = base.g * (1 - w) + other.g * w;\n  const b = base.b * (1 - w) + other.b * w;\n  return `#${toHexComponent(r)}${toHexComponent(g)}${toHexComponent(b)}`.toUpperCase();\n}\n\nexport function clampBorderRadius(value: string | null | undefined, maxPx: number = 20): string {\n  if (!value) return '12px';\n  const raw = value.trim();\n  const match = /^(\\d+(?:\\.\\d+)?)\\s*(px|rem|em|%)?$/i.exec(raw);\n  if (!match) return raw;\n  const num = parseFloat(match[1]);\n  if (Number.isNaN(num)) return raw;\n  const unit = (match[2] ?? 'px').toLowerCase();\n  if (unit === '%') return `${maxPx}px`;\n  const px = unit === 'rem' || unit === 'em' ? num * 16 : num;\n  if (px > maxPx) return `${maxPx}px`;\n  return raw;\n}\n","\"use client\";\n\nimport { CATEGORY_LABELS, NEWS_CATEGORIES, NewsCategory } from \"../constants\";\nimport { alpha } from \"../utils/contrast\";\n\ninterface StyleTokens {\n  tabBackground: string;\n  tabActiveBackground: string;\n  tabTextColor: string;\n  tabActiveTextColor: string;\n  fontFamily: string;\n}\n\ninterface Props {\n  active: NewsCategory;\n  onChange: (next: NewsCategory) => void;\n  styleTokens: StyleTokens;\n}\n\nconst SANS_STACK =\n  \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif\";\n\nconst STYLE_ID = \"news2-tabs-underline\";\n\nconst ensureStyle = () => {\n  if (typeof document === \"undefined\") return;\n  if (document.getElementById(STYLE_ID)) return;\n  const el = document.createElement(\"style\");\n  el.id = STYLE_ID;\n  el.textContent =\n    \".news2-tabs::-webkit-scrollbar{display:none}\" +\n    \".news2-tabs{scrollbar-width:none;-ms-overflow-style:none}\" +\n    \".news2-tab:focus-visible{outline:2px solid currentColor;outline-offset:-2px}\";\n  document.head.appendChild(el);\n};\n\nconst getLabel = (category: NewsCategory) =>\n  category === \"all\" ? \"All\" : CATEGORY_LABELS[category];\n\nexport const CategoryTabs = ({ active, onChange, styleTokens }: Props) => {\n  ensureStyle();\n\n  const fontFamily = styleTokens.fontFamily || SANS_STACK;\n  const baseColor = styleTokens.tabTextColor;\n\n  const containerStyle: React.CSSProperties = {\n    display: \"flex\",\n    gap: 4,\n    overflowX: \"auto\",\n    borderBottom: `1px solid ${alpha(baseColor, 0.1)}`,\n    fontFamily,\n    color: baseColor,\n  };\n\n  const tabStyle = (isActive: boolean): React.CSSProperties => ({\n    position: \"relative\",\n    background: \"transparent\",\n    border: \"none\",\n    borderBottom: isActive ? \"2px solid currentColor\" : \"2px solid transparent\",\n    marginBottom: -1,\n    padding: \"10px 14px\",\n    fontFamily,\n    fontSize: 11,\n    fontWeight: isActive ? 700 : 600,\n    letterSpacing: \"0.08em\",\n    textTransform: \"uppercase\",\n    color: \"inherit\",\n    opacity: isActive ? 1 : 0.55,\n    cursor: \"pointer\",\n    whiteSpace: \"nowrap\",\n    transition: \"opacity 160ms ease-out\",\n  });\n\n  const handleHover = (\n    e: React.MouseEvent<HTMLButtonElement>,\n    isActive: boolean,\n    entering: boolean,\n  ) => {\n    if (isActive) return;\n    e.currentTarget.style.opacity = entering ? \"0.85\" : \"0.55\";\n  };\n\n  return (\n    <div\n      className=\"news2-tabs\"\n      role=\"tablist\"\n      aria-label=\"Article categories\"\n      style={containerStyle}\n    >\n      {NEWS_CATEGORIES.map((category) => {\n        const isActive = category === active;\n        return (\n          <button\n            key={category}\n            type=\"button\"\n            role=\"tab\"\n            aria-selected={isActive}\n            tabIndex={isActive ? 0 : -1}\n            className=\"news2-tab\"\n            style={tabStyle(isActive)}\n            onClick={() => onChange(category)}\n            onMouseEnter={(e) => handleHover(e, isActive, true)}\n            onMouseLeave={(e) => handleHover(e, isActive, false)}\n          >\n            {getLabel(category)}\n          </button>\n        );\n      })}\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useBrandedColors } from \"../../../Branded\";\nimport { CategoryTabs } from \"./CategoryTabs\";\nimport { NewsCategory } from \"../constants\";\nimport { alpha } from \"../utils/contrast\";\nimport { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\n\ninterface StyleTokens {\n  headlineColor: string;\n  metaColor: string;\n  cardBackground: string;\n  tabTextColor: string;\n  tabActiveTextColor: string;\n  fontFamily: string;\n  uiFontFamily?: string;\n}\n\ninterface Props {\n  active: NewsCategory;\n  onCategoryChange: (next: NewsCategory) => void;\n  searchQuery: string;\n  onSearchChange: (q: string) => void;\n  brandName: string;\n  showCategories: boolean;\n  styleTokens: StyleTokens;\n}\n\nconst SANS_STACK =\n  \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif\";\n\nexport const HeaderBar = ({\n  active,\n  onCategoryChange,\n  searchQuery,\n  onSearchChange,\n  brandName,\n  showCategories,\n  styleTokens,\n}: Props) => {\n  const { logoSrc } = useBrandedColors();\n  const font = styleTokens.uiFontFamily ?? styleTokens.fontFamily ?? SANS_STACK;\n  const text = styleTokens.headlineColor;\n\n  const containerStyle: React.CSSProperties = {\n    display: \"flex\",\n    alignItems: \"center\",\n    flexWrap: \"wrap\",\n    gap: 32,\n    padding: \"16px 24px\",\n    borderBottom: `1px solid ${alpha(text, 0.1)}`,\n    fontFamily: font,\n    color: text,\n  };\n\n  const searchWrapStyle: React.CSSProperties = {\n    display: \"flex\",\n    alignItems: \"center\",\n    gap: 8,\n    background: alpha(text, 0.05),\n    border: `1px solid ${alpha(text, 0.1)}`,\n    borderRadius: 999,\n    padding: \"8px 14px\",\n    maxWidth: 280,\n    flexShrink: 0,\n  };\n\n  const inputStyle: React.CSSProperties = {\n    background: \"transparent\",\n    border: \"none\",\n    outline: \"none\",\n    fontSize: 13,\n    color: \"inherit\",\n    width: 200,\n    fontFamily: font,\n  };\n\n  const tabTokens = {\n    tabBackground: \"transparent\",\n    tabActiveBackground: \"transparent\",\n    tabTextColor: styleTokens.tabTextColor,\n    tabActiveTextColor: styleTokens.tabActiveTextColor,\n    fontFamily: font,\n  };\n\n  return (\n    <div style={containerStyle}>\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: 12,\n          minWidth: 0,\n          flexShrink: 0,\n        }}\n      >\n        {logoSrc ? (\n          <img\n            src={logoSrc}\n            alt={brandName}\n            style={{\n              height: 28,\n              maxHeight: 32,\n              width: \"auto\",\n              display: \"block\",\n            }}\n          />\n        ) : (\n          <span\n            style={{\n              fontFamily: font,\n              fontWeight: 700,\n              fontSize: 15,\n              maxWidth: 160,\n              overflow: \"hidden\",\n              textOverflow: \"ellipsis\",\n              whiteSpace: \"nowrap\",\n            }}\n          >\n            {brandName}\n          </span>\n        )}\n      </div>\n\n      {showCategories && (\n        <div style={{ flex: \"1 1 auto\", minWidth: 0, display: \"flex\" }}>\n          <CategoryTabs\n            active={active}\n            onChange={onCategoryChange}\n            styleTokens={tabTokens}\n          />\n        </div>\n      )}\n\n      <label style={searchWrapStyle}>\n        <HiOutlineMagnifyingGlass\n          size={16}\n          style={{ opacity: 0.5, flexShrink: 0 }}\n        />\n        <input\n          type=\"text\"\n          value={searchQuery}\n          onChange={(e) => onSearchChange(e.target.value)}\n          placeholder=\"Search headlines\"\n          aria-label=\"Search headlines\"\n          style={inputStyle}\n        />\n      </label>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useId, useState } from \"react\";\nimport { HiOutlineClock } from \"react-icons/hi2\";\nimport { NewsArticle } from \"../../../../types/news\";\nimport { estimateReadingTime } from \"../utils/readingTime\";\nimport { pickReadable, alpha, relativeLuminance } from \"../utils/contrast\";\nimport { getNewsDisplayDate } from \"../utils/formatDate\";\nimport { BreakingBadge } from \"./BreakingBadge\";\n\ntype StyleTokens = {\n  cardBackground: string;\n  cardBorder: string;\n  cardShadow: string;\n  cardRounded: string;\n  headlineColor: string;\n  headlineFontSize: string;\n  excerptColor: string;\n  metaColor: string;\n  fontFamily: string;\n};\n\ntype ArticleCardProps = {\n  article: NewsArticle;\n  onClick: (article: NewsArticle) => void;\n  showReadingTime: boolean;\n  showDate: boolean;\n  showShare: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: StyleTokens;\n};\n\nconst SANS_STACK =\n  'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif';\nconst EASE_OUT = \"cubic-bezier(0.22, 1, 0.36, 1)\";\n\nconst SHADOW_REST = (text: string) =>\n  `0 1px 2px ${alpha(text, 0.04)}, 0 2px 6px ${alpha(text, 0.06)}`;\nconst SHADOW_HOVER = (text: string) => `0 4px 8px ${alpha(text, 0.1)}`;\n\nfunction formatShortDate(dateCode: string | null | undefined): string {\n  const date = getNewsDisplayDate(dateCode);\n  if (!date) return \"\";\n  try {\n    return new Intl.DateTimeFormat(\"en-US\", { month: \"short\", day: \"numeric\" })\n      .format(date)\n      .toUpperCase();\n  } catch {\n    return \"\";\n  }\n}\n\nfunction resolveHeadlineColor(bg: string, desired: string): string {\n  const delta = Math.abs(relativeLuminance(bg) - relativeLuminance(desired));\n  return delta < 0.08 ? pickReadable(bg) : desired;\n}\n\nconst CardImage: React.FC<{\n  src: string;\n  alt: string;\n  hovered: boolean;\n}> = ({ src, alt, hovered }) => (\n  <div\n    style={{\n      width: \"100%\",\n      aspectRatio: \"16 / 10\",\n      overflow: \"hidden\",\n      backgroundColor: \"#e5e7eb\",\n    }}\n  >\n    <img\n      src={src}\n      alt={alt}\n      loading=\"lazy\"\n      decoding=\"async\"\n      style={{\n        width: \"100%\",\n        height: \"100%\",\n        objectFit: \"cover\",\n        display: \"block\",\n        transform: hovered ? \"scale(1.04)\" : \"scale(1)\",\n        transition: `transform 500ms ${EASE_OUT}`,\n      }}\n    />\n  </div>\n);\n\nconst CategoryPill: React.FC<{\n  color: string;\n  label: string;\n}> = ({ color, label }) => (\n  <span\n    style={{\n      display: \"inline-block\",\n      background: alpha(color, 0.12),\n      color,\n      border: `1px solid ${alpha(color, 0.25)}`,\n      padding: \"4px 10px\",\n      borderRadius: \"6px\",\n      fontFamily: SANS_STACK,\n      fontSize: \"10px\",\n      fontWeight: 700,\n      letterSpacing: \"0.08em\",\n      textTransform: \"uppercase\",\n      lineHeight: 1.2,\n    }}\n  >\n    {label}\n  </span>\n);\n\nconst CardMeta: React.FC<{\n  article: NewsArticle;\n  showDate: boolean;\n  showReadingTime: boolean;\n  showShare: boolean;\n  metaColor: string;\n}> = ({ article, showDate, showReadingTime, showShare, metaColor }) => {\n  const dateString = showDate ? formatShortDate(article.dateCode) : \"\";\n  const readingTime = showReadingTime\n    ? `${estimateReadingTime(article.articleBody ?? article.content ?? \"\")} MIN READ`\n    : \"\";\n  const parts = [dateString, readingTime].filter(Boolean);\n  return (\n    <div\n      style={{\n        marginTop: \"14px\",\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"space-between\",\n        gap: \"8px\",\n        color: metaColor,\n        fontSize: \"11px\",\n        fontWeight: 600,\n        letterSpacing: \"0.06em\",\n        textTransform: \"uppercase\",\n        fontFamily: SANS_STACK,\n        lineHeight: 1,\n        opacity: 0.6,\n      }}\n    >\n      {parts.length > 0 && (\n        <span\n          style={{\n            display: \"inline-flex\",\n            alignItems: \"center\",\n            gap: \"6px\",\n          }}\n        >\n          <HiOutlineClock size={12} aria-hidden=\"true\" />\n          <span>{parts.join(\" · \")}</span>\n        </span>\n      )}\n    </div>\n  );\n};\n\nexport const ArticleCard: React.FC<ArticleCardProps> = ({\n  article,\n  onClick,\n  showReadingTime,\n  showDate,\n  showShare,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n}) => {\n  const [hovered, setHovered] = useState(false);\n  const headlineId = useId();\n  const readableOnBg = pickReadable(styleTokens.cardBackground);\n  const headlineColor = resolveHeadlineColor(\n    styleTokens.cardBackground,\n    styleTokens.headlineColor,\n  );\n\n  return (\n    <article\n      role=\"article\"\n      aria-labelledby={headlineId}\n      onClick={() => onClick(article)}\n      onMouseEnter={() => setHovered(true)}\n      onMouseLeave={() => setHovered(false)}\n      style={{\n        background: styleTokens.cardBackground,\n        border: `1px solid ${alpha(readableOnBg, 0.1)}`,\n        borderRadius: styleTokens.cardRounded,\n        boxShadow: hovered\n          ? SHADOW_HOVER(readableOnBg)\n          : SHADOW_REST(readableOnBg),\n        overflow: \"hidden\",\n        cursor: \"pointer\",\n        transition: `box-shadow 200ms ${EASE_OUT}`,\n        fontFamily: styleTokens.fontFamily || SANS_STACK,\n        display: \"flex\",\n        flexDirection: \"column\",\n      }}\n    >\n      <CardImage\n        src={article.imageUrl}\n        alt={article.headline}\n        hovered={hovered}\n      />\n      <div style={{ padding: \"16px\" }}>\n        {article.isBreaking && article.isLive && (\n          <BreakingBadge live expiresAt={article.breakingExpiresAt} />\n        )}\n        <CategoryPill color={categoryColor} label={categoryLabel} />\n        <h3\n          id={headlineId}\n          style={{\n            color: headlineColor,\n            fontSize: \"clamp(1rem, 1.4vw, 1.125rem)\",\n            fontWeight: 700,\n            lineHeight: 1.25,\n            letterSpacing: \"-0.01em\",\n            marginTop: \"12px\",\n            marginBottom: 0,\n            display: \"-webkit-box\",\n            WebkitLineClamp: 3,\n            WebkitBoxOrient: \"vertical\",\n            overflow: \"hidden\",\n            textDecoration: hovered ? \"underline\" : \"none\",\n            textUnderlineOffset: \"4px\",\n            textDecorationThickness: \"1px\",\n          }}\n        >\n          {article.headline}\n        </h3>\n        <p\n          style={{\n            color: styleTokens.excerptColor,\n            fontSize: \"14px\",\n            lineHeight: 1.5,\n            marginTop: \"6px\",\n            marginBottom: 0,\n            opacity: 0.7,\n            fontFamily: SANS_STACK,\n            display: \"-webkit-box\",\n            WebkitLineClamp: 2,\n            WebkitBoxOrient: \"vertical\",\n            overflow: \"hidden\",\n          }}\n        >\n          {article.subheadline}\n        </p>\n        <CardMeta\n          article={article}\n          showDate={showDate}\n          showReadingTime={showReadingTime}\n          showShare={showShare}\n          metaColor={styleTokens.metaColor}\n        />\n      </div>\n    </article>\n  );\n};\n","const WORDS_PER_MINUTE = 200;\n\nexport const estimateReadingTime = (text: string | null | undefined): number => {\n  if (!text) return 1;\n\n  const words = text.trim().split(/\\s+/).filter(Boolean);\n  if (words.length === 0) return 1;\n\n  return Math.max(1, Math.ceil(words.length / WORDS_PER_MINUTE));\n};\n\nexport const formatReadingTime = (\n  minutes: number,\n  template = \"{minutes} min read\",\n): string => {\n  return template.replace(\"{minutes}\", String(minutes));\n};\n","export function getNewsDisplayDate(\n  dateCode: string | null | undefined,\n): Date | null {\n  if (!dateCode || typeof dateCode !== \"string\") return null;\n\n  const trimmed = dateCode.trim();\n  if (!trimmed) return null;\n\n  const date = new Date(trimmed);\n  if (Number.isNaN(date.getTime())) return null;\n\n  return date;\n}\n\nexport function formatNewsDate(\n  dateCode: string | null | undefined,\n  locale: string = \"en-US\",\n): string {\n  const date = getNewsDisplayDate(dateCode);\n  if (!date) return \"\";\n  const localeKey = locale.trim().replace(/_/g, \"-\").toLowerCase();\n  const localeAliases: Record<string, string> = {\n    cn: \"zh-CN\",\n    esmx: \"es-MX\",\n    fair: \"fa-IR\",\n    ir: \"fa-IR\",\n    jajp: \"ja-JP\",\n    jp: \"ja-JP\",\n    km: \"km-KH\",\n    kokr: \"ko-KR\",\n    kr: \"ko-KR\",\n    msmy: \"ms-MY\",\n    my: \"ms-MY\",\n    pt: \"pt-BR\",\n    ptbr: \"pt-BR\",\n    vivn: \"vi-VN\",\n    vn: \"vi-VN\",\n    zhcn: \"zh-CN\",\n  };\n  const normalizedLocale =\n    localeAliases[localeKey] ??\n    (/^ja(?:-|$)/.test(localeKey) ? \"ja-JP\" : locale);\n\n  try {\n    return new Intl.DateTimeFormat(normalizedLocale, {\n      month: \"short\",\n      day: \"numeric\",\n      year: \"numeric\",\n    }).format(date);\n  } catch {\n    return \"\";\n  }\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { HiArrowRight } from \"react-icons/hi2\";\nimport { NewsArticle } from \"../../../../types/news\";\nimport { CATEGORY_CHART_SYMBOL } from \"../constants\";\nimport { alpha, pickReadable } from \"../utils/contrast\";\nimport { formatNewsDate } from \"../utils/formatDate\";\nimport { estimateReadingTime, formatReadingTime } from \"../utils/readingTime\";\nimport { NFAssetChart, hasCategoryChart } from \"./NFAssetChart\";\nimport type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport { TechnicalAnalysisWidget } from \"./TechnicalAnalysisWidget\";\n\ntype StyleTokens = {\n  cardBackground: string;\n  cardBorder: string;\n  cardShadow: string;\n  cardRounded: string;\n  headlineColor: string;\n  excerptColor: string;\n  metaColor: string;\n  fontFamily: string;\n  chartTheme?: \"light\" | \"dark\";\n};\n\ntype FeaturedHeroProps = {\n  article: NewsArticle;\n  showChart: boolean;\n  onClick: (article: NewsArticle) => void;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: StyleTokens;\n  dev?: boolean;\n};\n\nconst SANS =\n  'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif';\nconst ELEVATION =\n  \"0 4px 6px rgba(15,23,42,0.05), 0 10px 15px rgba(15,23,42,0.08)\";\nconst HERO_STYLE = `\n.nv2-fh-wrap{width:100%;min-width:0;max-width:100%}\n.nv2-fh-grid{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,2fr);gap:24px;align-items:stretch;margin-bottom:32px;width:100%;min-width:0;max-width:100%}\n.nv2-fh-grid--single{grid-template-columns:minmax(0,1fr)}\n.nv2-fh-card{display:flex;flex-direction:column;overflow:hidden;cursor:pointer;min-width:0;width:100%;max-width:100%}\n.nv2-fh-media{width:100%;max-width:100%;aspect-ratio:16/10;object-fit:cover;display:block}\n@container (max-width:760px){.nv2-fh-grid{grid-template-columns:minmax(0,1fr)}}\n@media(max-width:760px){.nv2-fh-grid{grid-template-columns:minmax(0,1fr)}}\n`;\n\ntype Heights = { chart: number; ta: number };\nconst DESKTOP_HEIGHTS: Heights = { chart: 300, ta: 450 };\nconst TABLET_HEIGHTS: Heights = { chart: 280, ta: 420 };\nconst MOBILE_HEIGHTS: Heights = { chart: 240, ta: 400 };\n\nconst CategoryRow: React.FC<{ color: string; label: string }> = ({\n  color,\n  label,\n}) => (\n  <span\n    style={{\n      fontSize: 11,\n      fontWeight: 700,\n      letterSpacing: \"0.08em\",\n      textTransform: \"uppercase\",\n      color,\n      fontFamily: SANS,\n    }}\n  >\n    {label}\n  </span>\n);\n\nconst FeaturedMeta: React.FC<{\n  article: NewsArticle;\n  showDate: boolean;\n  showReadingTime: boolean;\n  text: string;\n}> = ({ article, showDate, showReadingTime, text }) => {\n  const reading = estimateReadingTime(\n    article.articleBody ?? article.content ?? \"\",\n  );\n  const parts: string[] = [];\n  if (showDate) parts.push(formatNewsDate(article.dateCode).toUpperCase());\n  if (showReadingTime) parts.push(formatReadingTime(reading).toUpperCase());\n  if (parts.length === 0) return null;\n\n  return (\n    <span\n      style={{\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        gap: 8,\n        fontSize: 11,\n        fontWeight: 600,\n        letterSpacing: \"0.08em\",\n        color: alpha(text, 0.6),\n        fontFamily: SANS,\n      }}\n    >\n      <svg\n        aria-hidden=\"true\"\n        width=\"11\"\n        height=\"11\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      >\n        <circle cx=\"12\" cy=\"12\" r=\"9\" />\n        <polyline points=\"12 7 12 12 15 14\" />\n      </svg>\n      {parts.map((p, i) => (\n        <span key={p}>\n          {i > 0 && (\n            <span aria-hidden=\"true\" style={{ margin: \"0 6px\", opacity: 0.6 }}>\n              ·\n            </span>\n          )}\n          {p}\n        </span>\n      ))}\n    </span>\n  );\n};\n\nconst ReadArticleCTA: React.FC<{ categoryColor: string }> = ({\n  categoryColor,\n}) => {\n  const [hover, setHover] = useState(false);\n  const fg = pickReadable(categoryColor, \"#0F172A\", \"#FFFFFF\");\n  return (\n    <span\n      onMouseEnter={() => setHover(true)}\n      onMouseLeave={() => setHover(false)}\n      style={{\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        gap: 6,\n        padding: \"8px 16px\",\n        borderRadius: 999,\n        background: categoryColor,\n        border: \"none\",\n        color: fg,\n        fontSize: 13,\n        fontWeight: 600,\n        fontFamily: SANS,\n        cursor: \"pointer\",\n        filter: hover ? \"brightness(1.05)\" : \"none\",\n        transition: \"filter 180ms ease\",\n      }}\n    >\n      Read article\n      <HiArrowRight size={13} aria-hidden=\"true\" />\n    </span>\n  );\n};\n\nconst useResponsiveHeights = (): Heights => {\n  const [heights, setHeights] = useState<Heights>(DESKTOP_HEIGHTS);\n\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n    const mobile = window.matchMedia(\"(max-width: 639px)\");\n    const tablet = window.matchMedia(\n      \"(min-width: 640px) and (max-width: 1023px)\",\n    );\n\n    const update = () => {\n      if (mobile.matches) setHeights(MOBILE_HEIGHTS);\n      else if (tablet.matches) setHeights(TABLET_HEIGHTS);\n      else setHeights(DESKTOP_HEIGHTS);\n    };\n\n    update();\n    mobile.addEventListener(\"change\", update);\n    tablet.addEventListener(\"change\", update);\n    return () => {\n      mobile.removeEventListener(\"change\", update);\n      tablet.removeEventListener(\"change\", update);\n    };\n  }, []);\n\n  return heights;\n};\n\nconst ChartCard: React.FC<{\n  symbol: string | null;\n  itemCategory: string;\n  assets?: StockAsset[];\n  cardBackground: string;\n  cardRounded: string;\n  chartTheme: \"light\" | \"dark\";\n  fontFamily?: string;\n  headlineColor?: string;\n  dev?: boolean;\n}> = ({ symbol, itemCategory, assets, cardBackground, cardRounded, chartTheme, fontFamily, headlineColor, dev }) => {\n  const text = pickReadable(cardBackground);\n  const heights = useResponsiveHeights();\n\n  return (\n    <div\n      style={{\n        background: cardBackground,\n        border: `1px solid ${alpha(text, 0.1)}`,\n        borderRadius: cardRounded,\n        boxShadow: ELEVATION,\n        padding: 20,\n        display: \"flex\",\n        flexDirection: \"column\",\n        minWidth: 0,\n        minHeight: 320,\n        overflow: \"visible\",\n        color: text,\n      }}\n    >\n      <NFAssetChart\n        itemCategory={itemCategory}\n        assets={assets}\n        height={heights.chart}\n        background={cardBackground}\n        chartTheme={chartTheme}\n        fontFamily={fontFamily}\n        headlineColor={headlineColor}\n        dev={dev}\n      />\n      {symbol && (\n        <>\n          <div style={{ height: 12 }} />\n          <TechnicalAnalysisWidget\n            symbol={symbol}\n            height={heights.ta}\n            colorTheme={chartTheme}\n            maskColor={cardBackground}\n          />\n        </>\n      )}\n    </div>\n  );\n};\n\nexport const FeaturedHero: React.FC<FeaturedHeroProps> = ({\n  article,\n  showChart,\n  onClick,\n  showReadingTime,\n  showDate,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  dev,\n}) => {\n  const withChart = showChart && hasCategoryChart(article.itemCategory, article.assets);\n  const taSymbol =\n    (CATEGORY_CHART_SYMBOL as Record<string, string | null>)[article.itemCategory] ?? null;\n  const headlineFont = styleTokens.fontFamily || SANS;\n  const text = pickReadable(styleTokens.cardBackground);\n  const headlineColor = styleTokens.headlineColor || text;\n\n  return (\n    <article\n      aria-labelledby=\"nv2-hero-headline\"\n      className=\"nv2-fh-wrap\"\n      style={{ fontFamily: styleTokens.fontFamily }}\n    >\n      <style>{HERO_STYLE}</style>\n      <div className={`nv2-fh-grid${withChart ? \"\" : \" nv2-fh-grid--single\"}`}>\n        <div\n          className=\"nv2-fh-card\"\n          onClick={() => onClick(article)}\n          style={{\n            background: styleTokens.cardBackground,\n            border: `1px solid ${alpha(text, 0.1)}`,\n            borderRadius: styleTokens.cardRounded,\n            boxShadow: ELEVATION,\n          }}\n        >\n          <img\n            className=\"nv2-fh-media\"\n            src={article.imageUrl}\n            alt={article.headline}\n            loading=\"lazy\"\n            decoding=\"async\"\n          />\n          <div\n            style={{\n              padding: \"24px\",\n              paddingBottom: 20,\n              display: \"flex\",\n              flexDirection: \"column\",\n            }}\n          >\n            <CategoryRow color={categoryColor} label={categoryLabel} />\n            <h2\n              id=\"nv2-hero-headline\"\n              style={{\n                fontFamily: headlineFont,\n                fontSize: \"clamp(1.6rem, 3vw, 2.25rem)\",\n                color: headlineColor,\n                fontWeight: 700,\n                lineHeight: 1.15,\n                letterSpacing: \"-0.01em\",\n                margin: 0,\n                marginTop: 12,\n              }}\n            >\n              {article.headline}\n            </h2>\n            {article.subheadline && (\n              <p\n                style={{\n                  fontFamily: SANS,\n                  color: alpha(text, 0.7),\n                  fontSize: 15,\n                  fontWeight: 400,\n                  lineHeight: 1.5,\n                  margin: 0,\n                  marginTop: 8,\n                  display: \"-webkit-box\",\n                  WebkitLineClamp: 2,\n                  WebkitBoxOrient: \"vertical\",\n                  overflow: \"hidden\",\n                }}\n              >\n                {article.subheadline}\n              </p>\n            )}\n            <div\n              style={{\n                display: \"flex\",\n                alignItems: \"center\",\n                gap: 12,\n                marginTop: 20,\n              }}\n            >\n              <FeaturedMeta\n                article={article}\n                showDate={showDate}\n                showReadingTime={showReadingTime}\n                text={text}\n              />\n              <span style={{ marginLeft: \"auto\" }}>\n                <ReadArticleCTA categoryColor={categoryColor} />\n              </span>\n            </div>\n          </div>\n        </div>\n        {withChart && (\n          <ChartCard\n            symbol={taSymbol}\n            itemCategory={article.itemCategory}\n            assets={article.assets}\n            cardBackground={styleTokens.cardBackground}\n            cardRounded={styleTokens.cardRounded}\n            chartTheme={styleTokens.chartTheme ?? \"light\"}\n            fontFamily={styleTokens.fontFamily}\n            headlineColor={styleTokens.headlineColor}\n            dev={dev}\n          />\n        )}\n      </div>\n    </article>\n  );\n};\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { AreaChart } from \"../AreaChart\";\nimport { fetchCandles } from \"../fetchCandles\";\nimport { fetchMacro } from \"../fetchMacro\";\nimport { Candle, STOCK_TIMEFRAMES, StockTimeframe } from \"../types\";\nimport { formatHoverLabel } from \"./format\";\nimport { AssetHeader } from \"./parts/AssetHeader\";\nimport { AssetTabs } from \"./parts/AssetTabs\";\nimport { PriceBlock } from \"./parts/PriceBlock\";\nimport { DEFAULT_ASSETS, SAMPLE_CANDLES } from \"./sample\";\nimport { resolveChartTheme } from \"./theme\";\nimport { StockAsset } from \"./types\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\nimport { TimeframeTabs } from \"../../TimeframeTabs\";\n\nconst SANS_STACK = \"system-ui, -apple-system, sans-serif\";\n\nconst MINUTE_MS = 60_000;\n\nconst MACRO_MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] as const;\n\n// The tabs describe the total visible range. All three ranges use 15-minute\n// candles, which is the finest interval exposed by the candles endpoint.\nconst CANDLE_WINDOWS: Record<\n  StockTimeframe,\n  { durationMs: number; limit: number }\n> = {\n  \"15m\": { durationMs: 15 * MINUTE_MS, limit: 2 },\n  \"1h\": { durationMs: 60 * MINUTE_MS, limit: 5 },\n  \"1d\": { durationMs: 24 * 60 * MINUTE_MS, limit: 97 },\n};\n\nfunction selectCandlesForWindow(\n  candles: Candle[],\n  timeframe: StockTimeframe,\n): Candle[] {\n  if (candles.length < 2) return candles;\n\n  const ordered = [...candles].sort((a, b) => a.timestamp - b.timestamp);\n  const latestTimestamp = ordered[ordered.length - 1].timestamp;\n  const cutoff = latestTimestamp - CANDLE_WINDOWS[timeframe].durationMs;\n  return ordered.filter((candle) => candle.timestamp >= cutoff);\n}\n\ntype Props = {\n  styles: WidgetStyle;\n  dev?: boolean;\n  assets?: StockAsset[];\n  height?: number;\n  fullWidth?: boolean;\n  onAssetChange?: (symbol: string) => void;\n};\n\nexport const StockWidget: React.FC<Props> = ({\n  styles,\n  dev = false,\n  assets = DEFAULT_ASSETS,\n  height = 260,\n  fullWidth = false,\n  onAssetChange,\n}) => {\n  const theme = useMemo(() => resolveChartTheme(styles), [styles]);\n  const translations = useMemo(\n    () => getDictionarySection(styles.lang, \"stockWidget\"),\n    [styles.lang],\n  );\n  const fontFamily =\n    styles.news_v2_font_family || styles.font_family || SANS_STACK;\n\n  useEffect(() => {\n    loadGoogleFont(\n      styles.news_v2_font_family || styles.font_family || undefined,\n    );\n  }, [styles.news_v2_font_family, styles.font_family]);\n\n  const [symbol, setSymbol] = useState(assets[0]?.symbol ?? \"\");\n  const [timeframe, setTimeframe] = useState<StockTimeframe>(\"1d\");\n  const [candles, setCandles] = useState<Candle[]>(dev ? SAMPLE_CANDLES : []);\n  const [hover, setHover] = useState<Candle | null>(null);\n  const [observationEnd, setObservationEnd] = useState<string | null>(null);\n\n  // Read before the fetch effect so a macro tab never asks the candles endpoint.\n  const activeAsset = assets.find((a) => a.symbol === symbol) ?? assets[0];\n  const macroSeries = activeAsset?.macroSeries;\n\n  useEffect(() => {\n    setHover(null);\n    if (dev) {\n      setCandles(selectCandlesForWindow(SAMPLE_CANDLES, timeframe));\n      return;\n    }\n    let cancelled = false;\n    if (macroSeries) {\n      // A macro series is its own window - the 15m/1h/1d slicing does not apply.\n      fetchMacro(macroSeries).then((res) => {\n        if (cancelled) return;\n        setCandles(res.candles);\n        setObservationEnd(res.observationEnd);\n      });\n      return () => {\n        cancelled = true;\n      };\n    }\n    setObservationEnd(null);\n    fetchCandles(symbol, \"15m\", {\n      limit: CANDLE_WINDOWS[timeframe].limit,\n    }).then((next) => {\n      if (!cancelled) setCandles(selectCandlesForWindow(next, timeframe));\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [symbol, timeframe, dev, macroSeries]);\n\n  const asset = activeAsset;\n  const localizedAsset = useMemo(() => {\n    if (!asset) return asset;\n    const key =\n      asset.symbol === \"WTI/USD\"\n        ? \"crudeOil\"\n        : asset.symbol === \"XAU/USD\"\n          ? \"gold\"\n          : asset.symbol === \"XAG/USD\"\n            ? \"silver\"\n            : null;\n    return key ? { ...asset, name: translations.assets[key] } : asset;\n  }, [asset, translations]);\n\n  const { price, change, changePct } = useMemo(() => {\n    const first = candles[0]?.close ?? 0;\n    const point = hover ?? candles[candles.length - 1];\n    const close = point?.close ?? 0;\n    const diff = close - first;\n    return {\n      price: close,\n      change: diff,\n      changePct: first ? (diff / first) * 100 : 0,\n    };\n  }, [candles, hover]);\n\n  const asOf = (iso: string | null): string | null => {\n    if (!iso) return null;\n    const [y, m] = iso.slice(0, 10).split(\"-\");\n    return `as of ${MACRO_MONTHS[Number(m) - 1]} ${y}`;\n  };\n\n  // Several macro series print 2-3 months in arrears (Case-Shiller, UMich,\n  // consumer credit), so a chart with no date reads as broken beside a story.\n  const label = macroSeries\n    ? (asOf(hover ? new Date(hover.timestamp).toISOString() : observationEnd) ?? \"\")\n    : hover\n      ? formatHoverLabel(hover.timestamp, timeframe)\n      : translations.periods[timeframe];\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        maxWidth: fullWidth ? \"100%\" : 440,\n        alignSelf: fullWidth ? \"stretch\" : \"flex-start\",\n        padding: 20,\n        background: theme.background,\n        borderRadius: 18,\n        boxSizing: \"border-box\",\n        fontFamily,\n      }}\n    >\n      <AssetTabs\n        assets={assets}\n        active={symbol}\n        onSelect={(s) => {\n          setSymbol(s);\n          onAssetChange?.(s);\n        }}\n        theme={theme}\n      />\n      <AssetHeader asset={localizedAsset} theme={theme} />\n      <PriceBlock\n        price={price}\n        currency={localizedAsset?.currency ?? \"USD\"}\n        change={change}\n        changePct={changePct}\n        label={label}\n        theme={theme}\n        macro={Boolean(macroSeries)}\n      />\n      {macroSeries ? null : (\n        <TimeframeTabs\n          timeframes={STOCK_TIMEFRAMES}\n          value={timeframe}\n          onChange={(tf) => setTimeframe(tf as StockTimeframe)}\n          theme={theme}\n        />\n      )}\n      <AreaChart\n        candles={candles}\n        theme={theme}\n        height={height}\n        onHoverChange={setHover}\n      />\n    </div>\n  );\n};\n","\"use client\";\n\nimport { scaleLinear } from \"d3-scale\";\nimport { area as d3area, curveMonotoneX, line as d3line } from \"d3-shape\";\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Candle, ChartTheme } from \"./types\";\n\nconst PAD = { top: 14, right: 54, bottom: 22, left: 6 } as const;\nconst PRICE_TICKS = 5;\nconst MIN_LABEL_GAP = 40;\nconst DAY_MS = 86400000;\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] as const;\n\ntype Props = {\n  candles: Candle[];\n  theme: ChartTheme;\n  height?: number;\n  onHoverChange?: (candle: Candle | null) => void;\n};\n\nfunction priceFormatter(ticks: number[]): (v: number) => string {\n  const step = Math.abs((ticks[1] ?? ticks[0]) - ticks[0]) || 1;\n  const decimals = step >= 1 ? 2 : step >= 0.1 ? 2 : step >= 0.01 ? 3 : 4;\n  return (v) => v.toFixed(decimals);\n}\n\nexport const AreaChart: React.FC<Props> = ({ candles, theme, height = 240, onHoverChange }) => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [width, setWidth] = useState(0);\n  const [hoverIndex, setHoverIndex] = useState<number | null>(null);\n  const gradientId = useId();\n\n  useLayoutEffect(() => {\n    const el = containerRef.current;\n    if (!el) return;\n    const ro = new ResizeObserver((entries) => setWidth(entries[0].contentRect.width));\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, []);\n\n  useEffect(() => setHoverIndex(null), [candles]);\n\n  const geom = useMemo(() => {\n    if (!width || candles.length < 2) return null;\n\n    const n = candles.length;\n    const closes = candles.map((c) => c.close);\n    const lo = Math.min(...closes);\n    const hi = Math.max(...closes);\n    const padY = (hi - lo) * 0.08 || hi * 0.02;\n\n    const x = scaleLinear().domain([0, n - 1]).range([PAD.left, width - PAD.right]);\n    const y = scaleLinear().domain([lo - padY, hi + padY]).range([height - PAD.bottom, PAD.top]);\n\n    const linePath = d3line<Candle>().x((_, i) => x(i)).y((c) => y(c.close)).curve(curveMonotoneX)(candles) ?? \"\";\n    const areaPath = d3area<Candle>().x((_, i) => x(i)).y0(height - PAD.bottom).y1((c) => y(c.close)).curve(curveMonotoneX)(candles) ?? \"\";\n\n    const color = candles[n - 1].close >= candles[0].close ? theme.up : theme.down;\n\n    const ticks = y.ticks(PRICE_TICKS);\n    const fmt = priceFormatter(ticks);\n    const priceTicks = ticks.map((t) => ({ y: y(t), label: fmt(t) }));\n\n    const spanMs = candles[n - 1].timestamp - candles[0].timestamp;\n    // A macro series runs 15 years, where a month bucket puts the same month name\n    // on every tick (\"Aug Aug Aug\"). Price charts top out at a 1-day span, so the\n    // year branch is unreachable for them.\n    const unit: \"year\" | \"month\" | \"day\" | \"hour\" =\n      spanMs > 730 * DAY_MS\n        ? \"year\"\n        : spanMs > 90 * DAY_MS\n          ? \"month\"\n          : spanMs > 2 * DAY_MS\n            ? \"day\"\n            : \"hour\";\n    const labelGap = unit === \"day\" ? 54 : MIN_LABEL_GAP;\n\n    const bucketOf = (ts: number): number => {\n      const d = new Date(ts);\n      if (unit === \"year\") return d.getUTCFullYear();\n      if (unit === \"month\") return d.getUTCFullYear() * 12 + d.getUTCMonth();\n      if (unit === \"day\") return Math.floor(ts / DAY_MS);\n      return Math.floor(ts / 3_600_000);\n    };\n    const labelOf = (ts: number): string => {\n      const d = new Date(ts);\n      if (unit === \"year\") return String(d.getUTCFullYear());\n      if (unit === \"month\") return MONTHS[d.getUTCMonth()];\n      if (unit === \"day\") return `${MONTHS[d.getUTCMonth()]} ${d.getUTCDate()}`;\n      return `${String(d.getUTCHours()).padStart(2, \"0\")}:00`;\n    };\n\n    const rawTicks: { x: number; label: string }[] = [];\n    let prevBucket = NaN;\n    candles.forEach((c, i) => {\n      const b = bucketOf(c.timestamp);\n      if (b !== prevBucket) {\n        rawTicks.push({ x: x(i), label: labelOf(c.timestamp) });\n        prevBucket = b;\n      }\n    });\n\n    const timeTicks: { x: number; label: string }[] = [];\n    let lastLabelX = -Infinity;\n    for (const t of rawTicks) {\n      if (t.x - lastLabelX >= labelGap) {\n        timeTicks.push(t);\n        lastLabelX = t.x;\n      }\n    }\n\n    return { x, y, linePath, areaPath, color, priceTicks, timeTicks, n };\n  }, [width, candles, height, theme]);\n\n  const hover = geom && hoverIndex != null ? candles[hoverIndex] : null;\n\n  return (\n    <div\n      ref={containerRef}\n      style={{ position: \"relative\", width: \"100%\", height, background: theme.background }}\n      onPointerMove={(e) => {\n        if (!geom) return;\n        const rect = containerRef.current?.getBoundingClientRect();\n        if (!rect) return;\n        const raw = Math.round(geom.x.invert(e.clientX - rect.left));\n        const idx = Math.max(0, Math.min(geom.n - 1, raw));\n        setHoverIndex(idx);\n        onHoverChange?.(candles[idx]);\n      }}\n      onPointerLeave={() => {\n        setHoverIndex(null);\n        onHoverChange?.(null);\n      }}\n    >\n      {geom && (\n        <svg width={width} height={height} style={{ display: \"block\" }}>\n          <defs>\n            <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop offset=\"0%\" stopColor={geom.color} stopOpacity={0.22} />\n              <stop offset=\"100%\" stopColor={geom.color} stopOpacity={0} />\n            </linearGradient>\n          </defs>\n\n          <path d={geom.areaPath} fill={`url(#${gradientId})`} />\n          <path d={geom.linePath} fill=\"none\" stroke={geom.color} strokeWidth={2} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n\n          {geom.priceTicks.map((t, i) => (\n            <text key={`p${i}`} x={width - 6} y={t.y + 4} fill={theme.text} fontSize={11} textAnchor=\"end\">\n              {t.label}\n            </text>\n          ))}\n\n          {geom.timeTicks.map((t, i) => (\n            <text key={`t${i}`} x={t.x} y={height - 6} fill={theme.text} fontSize={11} textAnchor={t.x < 20 ? \"start\" : \"middle\"}>\n              {t.label}\n            </text>\n          ))}\n\n          {hover && (\n            <g>\n              <line x1={geom.x(hoverIndex!)} y1={PAD.top} x2={geom.x(hoverIndex!)} y2={height - PAD.bottom} stroke={theme.grid} strokeWidth={1} />\n              <circle cx={geom.x(hoverIndex!)} cy={geom.y(hover.close)} r={3.5} fill={geom.color} stroke={theme.background} strokeWidth={2} />\n            </g>\n          )}\n        </svg>\n      )}\n    </div>\n  );\n};\n","import { Candle, StockTimeframe } from \"./types\";\nimport { WIDGET_API_BASE } from \"../../utils/widgetApiBase\";\n\nexport async function fetchCandles(\n  symbol: string,\n  timeframe: StockTimeframe,\n  opts: { limit?: number } = {},\n): Promise<Candle[]> {\n  try {\n    const params = new URLSearchParams({ symbol, timeframe });\n    if (opts.limit != null) params.set(\"limit\", String(opts.limit));\n    const res = await fetch(`${WIDGET_API_BASE}/api/widgets/candles?${params.toString()}`);\n    if (!res.ok) return [];\n    const data = (await res.json()) as { candles?: Candle[] };\n    return data.candles ?? [];\n  } catch {\n    return [];\n  }\n}\n","import { Candle } from \"./types\";\nimport { WIDGET_API_BASE } from \"../../utils/widgetApiBase\";\n\nexport type MacroResponse = { candles: Candle[]; observationEnd: string | null };\n\nexport async function fetchMacro(series: string): Promise<MacroResponse> {\n  try {\n    const res = await fetch(`${WIDGET_API_BASE}/api/widgets/macro?series=${encodeURIComponent(series)}`);\n    if (!res.ok) return { candles: [], observationEnd: null };\n    const data = (await res.json()) as Partial<MacroResponse>;\n    return { candles: data.candles ?? [], observationEnd: data.observationEnd ?? null };\n  } catch {\n    return { candles: [], observationEnd: null };\n  }\n}\n","// epoch milliseconds; o/h/l/c are prices, volume optional (null for forex).\nexport type Candle = {\n  timestamp: number;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n  volume?: number;\n};\n\nexport const CHART_TYPES = [\"candle\", \"area\"] as const;\nexport type ChartType = (typeof CHART_TYPES)[number];\n\nexport const STOCK_TIMEFRAMES = [\"15m\", \"1h\", \"1d\"] as const;\nexport type StockTimeframe = (typeof STOCK_TIMEFRAMES)[number];\nexport type AssetOverviewTimeframe = \"1D\" | \"5D\" | \"1M\" | \"6M\" | \"YTD\" | \"1Y\" | \"5Y\";\n\nexport type ChartTheme = {\n  up: string;\n  down: string;\n  background: string;\n  grid: string;\n  text: string;\n  strong: string;\n};\n","import { StockTimeframe } from \"../types\";\n\nconst MONTHS_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"] as const;\n\nexport function decimalsFor(price: number): number {\n  const abs = Math.abs(price);\n  return abs >= 10 ? 2 : abs >= 1 ? 4 : 5;\n}\n\nexport function formatHoverLabel(timestamp: number, timeframe: StockTimeframe): string {\n  const d = new Date(timestamp);\n  const day = d.getUTCDate();\n  const mon = MONTHS_SHORT[d.getUTCMonth()];\n  if (timeframe === \"1d\") return `${day} ${mon} ${d.getUTCFullYear()}`;\n  const hh = String(d.getUTCHours()).padStart(2, \"0\");\n  const mm = String(d.getUTCMinutes()).padStart(2, \"0\");\n  return `${day} ${mon}, ${hh}:${mm}`;\n}\n","import { ChartTheme } from \"../../types\";\nimport { StockAsset } from \"../types\";\n\ntype Props = { asset: StockAsset; theme: ChartTheme };\n\nexport const AssetHeader: React.FC<Props> = ({ asset, theme }) => (\n  <div style={{ display: \"flex\", alignItems: \"center\", gap: 12, marginTop: 12 }}>\n    <div\n      style={{\n        width: 40,\n        height: 40,\n        borderRadius: \"50%\",\n        background: \"#1c1c1e\",\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n        color: \"#fff\",\n        fontWeight: 700,\n        fontSize: 12,\n        letterSpacing: 0.3,\n      }}\n    >\n      {(asset.tabLabel ?? asset.symbol).slice(0, 3)}\n    </div>\n    <div style={{ fontSize: 22, fontWeight: 700, color: theme.strong }}>{asset.name}</div>\n  </div>\n);\n","import { ChartTheme } from \"../../types\";\nimport { StockAsset } from \"../types\";\n\ntype Props = {\n  assets: StockAsset[];\n  active: string;\n  onSelect: (symbol: string) => void;\n  theme: ChartTheme;\n};\n\nexport const AssetTabs: React.FC<Props> = ({ assets, active, onSelect, theme }) => (\n  <div style={{ display: \"flex\", gap: 6 }}>\n    {assets.map((a) => {\n      const on = a.symbol === active;\n      return (\n        <button\n          key={a.symbol}\n          onClick={() => onSelect(a.symbol)}\n          style={{\n            padding: \"6px 14px\",\n            borderRadius: 8,\n            border: \"none\",\n            cursor: \"pointer\",\n            background: on ? \"#1c1c1e\" : \"transparent\",\n            color: on ? \"#fff\" : theme.text,\n            fontSize: 15,\n            fontWeight: 600,\n          }}\n        >\n          {a.tabLabel ?? a.symbol}\n        </button>\n      );\n    })}\n  </div>\n);\n","import { ChartTheme } from \"../../types\";\nimport { decimalsFor } from \"../format\";\n\ntype Props = {\n  price: number;\n  currency: string;\n  change: number;\n  changePct: number;\n  label: string;\n  theme: ChartTheme;\n  /** A macro print has no currency, no intraday change and no daily badge. */\n  macro?: boolean;\n};\n\nexport const PriceBlock: React.FC<Props> = ({ price, currency, change, changePct, label, theme, macro }) => {\n  const d = decimalsFor(price);\n  const down = change < 0;\n  const color = down ? theme.down : theme.up;\n  const sign = down ? \"\" : \"+\";\n\n  return (\n    <div style={{ marginTop: 12 }}>\n      <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8 }}>\n        <span style={{ fontSize: 40, fontWeight: 700, color: theme.strong, lineHeight: 1 }}>{price.toFixed(d)}</span>\n        {macro ? null : (\n          <span style={{ display: \"flex\", flexDirection: \"column\", lineHeight: 1.15 }}>\n            <span style={{ color: \"#ff9f0a\", fontSize: 11, fontWeight: 700 }}>D</span>\n            <span style={{ color: theme.text, fontSize: 13 }}>{currency}</span>\n          </span>\n        )}\n      </div>\n      <div style={{ marginTop: 6, fontSize: 16, fontWeight: 600, color: macro ? theme.text : color }}>\n        {macro ? null : (\n          <>\n            {sign}\n            {change.toFixed(d)} {sign}\n            {changePct.toFixed(2)}%{\" \"}\n          </>\n        )}\n        <span style={{ color: theme.text, fontWeight: 500 }}>{label}</span>\n      </div>\n    </div>\n  );\n};\n","import { Candle } from \"../types\";\nimport { StockAsset } from \"./types\";\n\nexport const DEFAULT_ASSETS: StockAsset[] = [\n  { symbol: \"WTI/USD\", name: \"Crude Oil (WTI)\", tabLabel: \"OIL\", currency: \"USD\" },\n  { symbol: \"XAU/USD\", name: \"Gold\", tabLabel: \"GOLD\", currency: \"USD\" },\n  { symbol: \"XAG/USD\", name: \"Silver\", tabLabel: \"SILVER\", currency: \"USD\" },\n];\n\nexport const SAMPLE_CANDLES: Candle[] = (() => {\n  const out: Candle[] = [];\n  const interval = 15 * 60_000;\n  const start = Date.now() - 24 * 60 * 60_000;\n  let price = 68;\n  for (let i = 0; i <= 96; i++) {\n    const open = price;\n    const close = +(open + Math.sin(i / 5) * 1.3 + Math.cos(i / 11) * 0.9).toFixed(2);\n    const high = +(Math.max(open, close) + Math.abs(Math.sin(i)) * 0.7).toFixed(2);\n    const low = +(Math.min(open, close) - Math.abs(Math.cos(i)) * 0.7).toFixed(2);\n    out.push({ timestamp: start + i * interval, open, high, low, close });\n    price = close;\n  }\n  return out;\n})();\n","import { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { ChartTheme } from \"../types\";\n\nfunction withAlpha(color: string, alpha: number): string | null {\n  const m = color.trim().match(/^#([0-9a-f]{6})$/i);\n  if (!m) return null;\n  const n = parseInt(m[1], 16);\n  return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;\n}\n\nexport function resolveChartTheme(styles: WidgetStyle): ChartTheme {\n  const background = styles.main_background || \"#000000\";\n  const strong = styles.main_text_color || \"#ffffff\";\n  return {\n    up: \"#32d74b\",\n    down: \"#ff453a\",\n    background,\n    grid: withAlpha(strong, 0.14) ?? \"#2c2c2e\",\n    text: withAlpha(strong, 0.5) ?? \"#8e8e93\",\n    strong: styles.news_v2_headline_color || strong,\n  };\n}\n","import dictionaries from \"../dictionaries\";\nimport { Dictionary } from \"../types/Dictionary\";\nimport { formatLangFilename } from \"./formatLangFilename\";\n\nexport function getDictionarySection<K extends keyof Dictionary>(\n  lang: string | null | undefined,\n  section: K,\n): Dictionary[K] {\n  const selected = dictionaries[formatLangFilename(lang || \"en\")] ?? dictionaries.en;\n  return (selected[section] ?? dictionaries.en[section]) as Dictionary[K];\n}\n","import {\n  AssetOverviewTimeframe,\n  ChartTheme,\n  StockTimeframe,\n} from \"./charts/types\";\n\nexport type Timeframe = AssetOverviewTimeframe | StockTimeframe;\n\nexport function TimeframeTabs({\n  timeframes,\n  value,\n  onChange,\n  theme,\n}: {\n  timeframes: Readonly<Timeframe[]>;\n  value: Timeframe;\n  onChange: (tf: Timeframe) => void;\n  theme: ChartTheme;\n}) {\n  return (\n    <div\n      style={{ display: \"flex\", gap: 2, flexWrap: \"wrap\", marginBottom: 12 }}\n    >\n      {timeframes.map((tf) => {\n        const active = tf === value;\n        return (\n          <button\n            key={tf}\n            onClick={() => onChange(tf)}\n            style={{\n              padding: \"6px 16px\",\n              borderRadius: 8,\n              border: \"none\",\n              cursor: \"pointer\",\n              background: active ? \"#1c1c1e\" : \"transparent\",\n              color: active ? \"#fff\" : theme.text,\n              fontSize: 14,\n              fontWeight: 600,\n            }}\n          >\n            {tf}\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport { StockWidget } from \"../../../charts/StockWidget\";\nimport { StockAsset } from \"../../../charts/StockWidget/types\";\n\ntype Props = {\n  itemCategory: string;\n  assets?: StockAsset[];\n  height: number;\n  background: string;\n  chartTheme: \"light\" | \"dark\";\n  fontFamily?: string;\n  headlineColor?: string;\n  dev?: boolean;\n  fullWidth?: boolean;\n  lang?: string;\n};\n\nconst CATEGORY_ASSETS: Record<string, StockAsset[] | undefined> = {\n  forex: [\n    { symbol: \"EUR/USD\", name: \"EUR / USD\", tabLabel: \"EUR/USD\", currency: \"USD\" },\n    { symbol: \"GBP/USD\", name: \"GBP / USD\", tabLabel: \"GBP/USD\", currency: \"USD\" },\n    { symbol: \"USD/JPY\", name: \"USD / JPY\", tabLabel: \"USD/JPY\", currency: \"JPY\" },\n  ],\n  stock: [\n    { symbol: \"AAPL\", name: \"Apple Inc.\", tabLabel: \"AAPL\", currency: \"USD\" },\n    { symbol: \"NVDA\", name: \"NVIDIA\", tabLabel: \"NVDA\", currency: \"USD\" },\n    { symbol: \"TSLA\", name: \"Tesla\", tabLabel: \"TSLA\", currency: \"USD\" },\n  ],\n  crypto: [\n    { symbol: \"BTC/USD\", name: \"Bitcoin\", tabLabel: \"BTC\", currency: \"USD\" },\n    { symbol: \"ETH/USD\", name: \"Ethereum\", tabLabel: \"ETH\", currency: \"USD\" },\n    { symbol: \"XRP/USD\", name: \"XRP\", tabLabel: \"XRP\", currency: \"USD\" },\n  ],\n  cmd: [\n    { symbol: \"WTI/USD\", name: \"Crude Oil\", tabLabel: \"OIL\", currency: \"USD\" },\n    { symbol: \"XAU/USD\", name: \"Gold\", tabLabel: \"GOLD\", currency: \"USD\" },\n    { symbol: \"XAG/USD\", name: \"Silver\", tabLabel: \"SILVER\", currency: \"USD\" },\n  ],\n  worldec: [\n    { symbol: \"NASDAQ100\", name: \"NASDAQ 100\", tabLabel: \"NDX\" },\n    { symbol: \"DJX\", name: \"Dow Jones\", tabLabel: \"DJI\" },\n  ],\n  regec: [\n    { symbol: \"DAX\", name: \"DAX\", tabLabel: \"DAX\" },\n    { symbol: \"CAC40\", name: \"CAC 40\", tabLabel: \"CAC\" },\n    { symbol: \"Nikkei225\", name: \"Nikkei 225\", tabLabel: \"NIKKEI\" },\n  ],\n  latam: [\n    { symbol: \"USD/MXN\", name: \"USD / MXN\", tabLabel: \"USD/MXN\", currency: \"MXN\" },\n    { symbol: \"USD/COP\", name: \"USD / COP\", tabLabel: \"USD/COP\", currency: \"COP\" },\n    { symbol: \"USD/CLP\", name: \"USD / CLP\", tabLabel: \"USD/CLP\", currency: \"CLP\" },\n  ],\n};\n\n// Single source of truth for \"does this category get a chart\" — the hero grid\n// needs to know before it lays out, and the chart itself decides from the same map.\nexport const hasCategoryChart = (itemCategory: string, override?: StockAsset[]): boolean =>\n  (override?.length || CATEGORY_ASSETS[itemCategory]?.length || 0) > 0;\n\nexport const resolveCategoryAssets = (itemCategory: string, override?: StockAsset[]): StockAsset[] =>\n  (override?.length ? override : CATEGORY_ASSETS[itemCategory]) ?? [];\n\nexport const NFAssetChart: React.FC<Props> = ({ itemCategory, assets: override, height, background, chartTheme, fontFamily, headlineColor, dev, fullWidth, lang }) => {\n  const assets = override?.length ? override : CATEGORY_ASSETS[itemCategory];\n  if (!assets || assets.length === 0) return null;\n\n  const styles = {\n    main_background: background,\n    main_text_color: chartTheme === \"dark\" ? \"#ffffff\" : \"#111111\",\n    font_family: fontFamily,\n    news_v2_headline_color: headlineColor,\n    lang,\n  } as WidgetStyle;\n\n  return <StockWidget styles={styles} assets={assets} dev={dev} height={height} fullWidth={fullWidth} />;\n};\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nexport const TechnicalAnalysisWidget: React.FC<{\n  symbol: string;\n  height: number;\n  naturalHeight?: number;\n  colorTheme?: \"light\" | \"dark\";\n  maskColor?: string;\n}> = ({ symbol, height, naturalHeight, colorTheme = \"dark\", maskColor }) => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  // WHY: TradingView clips its gauge+summary below a minimum height; render at the\n  // natural height where it fits, then scale the whole widget down to the target.\n  const renderH = naturalHeight && naturalHeight > height ? naturalHeight : height;\n  const scale = renderH === height ? 1 : height / renderH;\n\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) return;\n\n    container.textContent = \"\";\n\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"tradingview-widget-container__widget\";\n    container.appendChild(wrapper);\n\n    const script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src =\n      \"https://s3.tradingview.com/external-embedding/embed-widget-technical-analysis.js\";\n    script.async = true;\n    const config = JSON.stringify({\n      interval: \"1D\",\n      width: \"100%\",\n      isTransparent: true,\n      height: renderH,\n      symbol,\n      showIntervalTabs: true,\n      displayMode: \"single\",\n      locale: \"en\",\n      colorTheme,\n    });\n    script.appendChild(document.createTextNode(config));\n    container.appendChild(script);\n\n    return () => {\n      if (containerRef.current) {\n        while (containerRef.current.firstChild) {\n          containerRef.current.removeChild(containerRef.current.firstChild);\n        }\n      }\n    };\n  }, [symbol, renderH, colorTheme]);\n\n  return (\n    <div\n      style={{\n        position: \"relative\",\n        width: \"100%\",\n        height: `${height}px`,\n        minWidth: 0,\n        overflow: \"hidden\",\n      }}\n    >\n      <div\n        className=\"nv2-ta-wrap\"\n        style={{\n          position: \"relative\",\n          width: scale === 1 ? \"100%\" : `${100 / scale}%`,\n          height: `${renderH}px`,\n          transform: scale === 1 ? undefined : `scale(${scale})`,\n          transformOrigin: \"top left\",\n        }}\n      >\n        <style>{`\n          .nv2-ta-wrap iframe { width: 100% !important; max-width: 100% !important; min-width: 0 !important; }\n          .nv2-ta-wrap .tradingview-widget-container__widget { width: 100% !important; max-width: 100% !important; }\n        `}</style>\n        <div\n          ref={containerRef}\n          style={{ width: \"100%\", height: \"100%\", overflow: \"hidden\" }}\n        />\n        <div\n          aria-hidden=\"true\"\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            height: 48,\n            pointerEvents: \"auto\",\n            zIndex: 2,\n          }}\n        />\n        <div\n          aria-hidden=\"true\"\n          style={{\n            position: \"absolute\",\n            bottom: 0,\n            right: 0,\n            width: 50,\n            height: 44,\n            background: maskColor ?? \"transparent\",\n            pointerEvents: \"auto\",\n            zIndex: 1000,\n          }}\n        />\n      </div>\n    </div>\n  );\n};\n","import React, { useEffect, useRef } from \"react\";\nimport { NewsArticle } from \"../../../../types/news\";\nimport { ReadingProgressBar } from \"./ReadingProgressBar\";\nimport { ArticleStickyHeader } from \"./ArticleStickyHeader\";\nimport { ArticleHero } from \"./ArticleHero\";\nimport { ArticleBody } from \"./ArticleBody\";\nimport { RelatedNews } from \"../../News3/parts/RelatedNews\";\nimport { pickReadable } from \"../utils/contrast\";\nimport { SERIF, getParagraphs } from \"./articleConstants\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype StyleTokens = {\n  cardBackground: string;\n  headlineColor: string;\n  excerptColor: string;\n  metaColor: string;\n  fontFamily: string;\n};\n\ntype ArticleDetailProps = {\n  article: NewsArticle;\n  onClose: () => void;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: StyleTokens;\n  articles?: NewsArticle[];\n  lang?: string;\n  onSelect?: (article: NewsArticle) => void;\n  translations?: NewsDictionary;\n  bodyContent?: React.ReactNode;\n};\n\nexport const ArticleDetail: React.FC<ArticleDetailProps> = ({\n  article,\n  onClose,\n  showShare,\n  showReadingTime,\n  showDate,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  articles = [],\n  lang = \"en\",\n  onSelect,\n  translations,\n  bodyContent,\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const { cardBackground, fontFamily } = styleTokens;\n  const paragraphs = getParagraphs(article);\n\n  useEffect(() => {\n    if (containerRef.current) {\n      containerRef.current.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    }\n    if (typeof window !== \"undefined\") {\n      window.scrollTo({ top: 0, behavior: \"smooth\" });\n      document.documentElement.scrollTop = 0;\n      document.body.scrollTop = 0;\n    }\n  }, [article?.headline, article?.dateCode]);\n\n  return (\n    <div ref={containerRef} style={{ background: cardBackground }}>\n      <ReadingProgressBar color={categoryColor} />\n      <ArticleStickyHeader\n        onClose={onClose}\n        headline={article.headline}\n        showShare={showShare}\n        background={cardBackground}\n        textColor={pickReadable(cardBackground)}\n        fontFamily={fontFamily}\n        backLabel={translations?.back}\n      />\n      <ArticleHero\n        article={article}\n        onClose={onClose}\n        categoryColor={categoryColor}\n        categoryLabel={categoryLabel}\n        cardBackground={cardBackground}\n        showDate={showDate}\n        showReadingTime={showReadingTime}\n        showShare={showShare}\n        lang={lang}\n        backLabel={translations?.back}\n        readingTimeTemplate={translations?.readingTime}\n      />\n      {bodyContent ?? (\n        <ArticleBody\n          paragraphs={paragraphs}\n          itemCategory={article.itemCategory}\n          assets={article.assets}\n          cardBackground={cardBackground}\n          bodyFont={fontFamily || SERIF}\n        />\n      )}\n      <RelatedNews\n        currentArticle={article}\n        articles={articles}\n        lang={lang}\n        onSelect={onSelect}\n        categoryColor={categoryColor}\n        categoryLabel={categoryLabel}\n        styleTokens={styleTokens}\n        title={translations?.relatedNews}\n      />\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\ntype ReadingProgressBarProps = {\n  color: string;\n};\n\nconst computeProgress = (): number => {\n  const el = document.documentElement;\n  const scrollable = el.scrollHeight - el.clientHeight;\n  if (scrollable <= 0) return 0;\n  const ratio = (el.scrollTop / scrollable) * 100;\n  return Math.min(100, Math.max(0, ratio));\n};\n\nexport const ReadingProgressBar: React.FC<ReadingProgressBarProps> = ({ color }) => {\n  const [progress, setProgress] = useState(0);\n\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n\n    let frame = 0;\n    const onScroll = () => {\n      cancelAnimationFrame(frame);\n      frame = requestAnimationFrame(() => setProgress(computeProgress()));\n    };\n\n    onScroll();\n    window.addEventListener(\"scroll\", onScroll, { passive: true });\n    return () => {\n      cancelAnimationFrame(frame);\n      window.removeEventListener(\"scroll\", onScroll);\n    };\n  }, []);\n\n  const barStyle: React.CSSProperties = {\n    position: \"fixed\",\n    top: 0,\n    left: 0,\n    height: 3,\n    width: `${progress}%`,\n    background: color,\n    zIndex: 9999,\n    transition: \"width 80ms linear\",\n  };\n\n  return <div style={barStyle} />;\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { HiOutlineArrowLeft } from \"react-icons/hi2\";\nimport { ShareButtons } from \"./ShareButtons\";\nimport { alpha } from \"../utils/contrast\";\n\ntype ArticleStickyHeaderProps = {\n  onClose: () => void;\n  headline: string;\n  showShare: boolean;\n  background: string;\n  textColor: string;\n  fontFamily: string;\n  revealAfter?: number;\n  backLabel?: string;\n};\n\nconst useScrolledPast = (threshold: number): boolean => {\n  const [visible, setVisible] = useState(false);\n\n  useEffect(() => {\n    let frame = 0;\n    const onScroll = () => {\n      if (frame) return;\n      frame = window.requestAnimationFrame(() => {\n        setVisible(window.scrollY > threshold);\n        frame = 0;\n      });\n    };\n    window.addEventListener(\"scroll\", onScroll, { passive: true });\n    onScroll();\n    return () => {\n      window.removeEventListener(\"scroll\", onScroll);\n      if (frame) window.cancelAnimationFrame(frame);\n    };\n  }, [threshold]);\n\n  return visible;\n};\n\nexport const ArticleStickyHeader = ({\n  onClose,\n  headline,\n  showShare,\n  background,\n  textColor,\n  fontFamily,\n  revealAfter,\n  backLabel = \"Back\",\n}: ArticleStickyHeaderProps) => {\n  const visible = useScrolledPast(revealAfter ?? 320);\n\n  const barStyle: React.CSSProperties = {\n    position: \"sticky\",\n    top: 0,\n    zIndex: 50,\n    background,\n    borderBottom: `1px solid ${alpha(textColor, 0.1)}`,\n    padding: \"12px 16px\",\n    display: visible ? \"flex\" : \"none\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    gap: 12,\n    transition: \"opacity 200ms ease, transform 200ms ease\",\n    opacity: visible ? 1 : 0,\n    transform: visible ? \"translateY(0)\" : \"translateY(-100%)\",\n    pointerEvents: visible ? \"auto\" : \"none\",\n  };\n\n  const backButtonStyle: React.CSSProperties = {\n    background: \"transparent\",\n    border: \"none\",\n    padding: 0,\n    display: \"inline-flex\",\n    alignItems: \"center\",\n    gap: 6,\n    color: textColor,\n    fontFamily,\n    fontSize: 14,\n    fontWeight: 600,\n    cursor: \"pointer\",\n    flexShrink: 0,\n  };\n\n  const headlineStyle: React.CSSProperties = {\n    flex: 1,\n    minWidth: 0,\n    margin: 0,\n    overflow: \"hidden\",\n    textOverflow: \"ellipsis\",\n    whiteSpace: \"nowrap\",\n    fontFamily,\n    fontWeight: 600,\n    fontSize: 14,\n    color: textColor,\n  };\n\n  return (\n    <div style={barStyle}>\n      <button type=\"button\" style={backButtonStyle} onClick={onClose}>\n        <HiOutlineArrowLeft size={16} />\n        <span>{backLabel}</span>\n      </button>\n      <p style={headlineStyle}>{headline}</p>\n      {showShare && <ShareButtons headline={headline} />}\n    </div>\n  );\n};\n","\"use client\";\n\nimport { FaXTwitter, FaWhatsapp, FaLinkedinIn } from \"react-icons/fa6\";\n\ninterface Props {\n  headline: string;\n  url?: string;\n}\n\nconst BTN_SIZE = 36;\n\nconst buttonStyle = (bg: string): React.CSSProperties => ({\n  width: BTN_SIZE,\n  height: BTN_SIZE,\n  borderRadius: \"50%\",\n  backgroundColor: bg,\n  color: \"#fff\",\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  border: \"none\",\n  cursor: \"pointer\",\n  padding: 0,\n});\n\nexport const ShareButtons = ({ headline, url }: Props) => {\n  const open = (href: string) => (e: React.MouseEvent) => {\n    e.stopPropagation();\n    const target = url ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n    const encodedText = encodeURIComponent(headline);\n    const encodedUrl = encodeURIComponent(target);\n    const final = href\n      .replace(\"{TEXT}\", encodedText)\n      .replace(\"{URL}\", encodedUrl)\n      .replace(\"{TEXT_URL}\", encodeURIComponent(`${headline} ${target}`));\n    window.open(final, \"_blank\", \"noopener,noreferrer\");\n  };\n\n  return (\n    <div\n      style={{ display: \"flex\", gap: \"0.5rem\", alignItems: \"center\" }}\n      onClick={(e) => e.stopPropagation()}\n    >\n      <button\n        style={buttonStyle(\"#000\")}\n        onClick={open(\"https://twitter.com/intent/tweet?text={TEXT}&url={URL}\")}\n        aria-label=\"Share on X\"\n      >\n        <FaXTwitter size={16} />\n      </button>\n      <button\n        style={buttonStyle(\"#25D366\")}\n        onClick={open(\"https://wa.me/?text={TEXT_URL}\")}\n        aria-label=\"Share on WhatsApp\"\n      >\n        <FaWhatsapp size={18} />\n      </button>\n      <button\n        style={buttonStyle(\"#0A66C2\")}\n        onClick={open(\"https://www.linkedin.com/sharing/share-offsite/?url={URL}\")}\n        aria-label=\"Share on LinkedIn\"\n      >\n        <FaLinkedinIn size={16} />\n      </button>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../types/news\";\nimport { ShareButtons } from \"./ShareButtons\";\nimport { estimateReadingTime, formatReadingTime } from \"../utils/readingTime\";\nimport { formatNewsDate } from \"../utils/formatDate\";\nimport { pickReadable, alpha } from \"../utils/contrast\";\nimport { HiOutlineArrowLeft, HiOutlineClock } from \"react-icons/hi2\";\nimport { SERIF } from \"./articleConstants\";\n\nconst GRADIENT =\n  \"linear-gradient(180deg, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.35) 45%, rgba(0,0,0,0.85) 100%)\";\n\ntype Tones = { textColor: string; subColor: string; metaColor: string };\n\ntype HeroProps = {\n  article: NewsArticle;\n  onClose: () => void;\n  categoryColor: string;\n  categoryLabel: string;\n  cardBackground: string;\n  showDate: boolean;\n  showReadingTime: boolean;\n  showShare: boolean;\n  lang?: string;\n  backLabel?: string;\n  readingTimeTemplate?: string;\n};\n\nconst FloatingBackButton = ({\n  onClose,\n  textColor,\n  label,\n}: {\n  onClose: () => void;\n  textColor?: string;\n  label?: string;\n}) => (\n  <button\n    type=\"button\"\n    onClick={onClose}\n    style={{\n      position: \"absolute\",\n      top: 20,\n      left: 20,\n      zIndex: 10,\n      background: textColor ? alpha(textColor, 0.08) : \"rgba(0,0,0,0.45)\",\n      border: `1px solid ${textColor ? alpha(textColor, 0.15) : \"rgba(255,255,255,0.2)\"}`,\n      borderRadius: 999,\n      padding: \"8px 16px\",\n      display: \"inline-flex\",\n      alignItems: \"center\",\n      gap: 6,\n      color: textColor || \"#fff\",\n      fontSize: 14,\n      fontWeight: 600,\n      cursor: \"pointer\",\n      pointerEvents: \"auto\",\n      boxShadow: \"0 2px 8px rgba(0,0,0,0.15)\",\n    }}\n  >\n    <HiOutlineArrowLeft size={16} />\n    <span>{label ?? \"Back\"}</span>\n  </button>\n);\n\nconst MetaRow = ({\n  article,\n  showDate,\n  showReadingTime,\n  showShare,\n  color,\n  lang = \"en-US\",\n  readingTimeTemplate,\n}: HeroProps & { color: string }) => {\n  const minutes = estimateReadingTime(article.articleBody || article.content);\n  const itemStyle: React.CSSProperties = {\n    display: \"inline-flex\",\n    alignItems: \"center\",\n    gap: 4,\n    textTransform: \"uppercase\",\n    letterSpacing: 0.8,\n    fontSize: 11,\n    color,\n  };\n\n  return (\n    <div style={{ marginTop: 16, display: \"flex\", alignItems: \"center\", gap: 16, flexWrap: \"wrap\" }}>\n      {showDate && <span style={itemStyle}>{formatNewsDate(article.dateCode, lang)}</span>}\n      {showReadingTime && (\n        <span style={itemStyle}>\n          <HiOutlineClock size={13} />\n          {formatReadingTime(minutes, readingTimeTemplate)}\n        </span>\n      )}\n      {showShare && <ShareButtons headline={article.headline} />}\n    </div>\n  );\n};\n\nconst HeroContent = (props: HeroProps & Tones) => {\n  const { article, textColor, subColor, metaColor } = props;\n  return (\n    <div\n      style={{\n        position: \"relative\",\n        zIndex: 2,\n        padding: \"clamp(60px, 6vw, 80px) clamp(20px, 5vw, 48px) clamp(20px, 5vw, 48px)\",\n        maxWidth: 900,\n      }}\n    >\n      <h1\n        style={{\n          margin: 0,\n          fontFamily: SERIF,\n          fontSize: \"clamp(2rem, 5vw, 3.5rem)\",\n          fontWeight: 800,\n          lineHeight: 1.1,\n          color: textColor,\n        }}\n      >\n        {article.headline}\n      </h1>\n      {article.subheadline && (\n        <p\n          style={{\n            margin: \"12px 0 0\",\n            fontFamily: SERIF,\n            fontStyle: \"italic\",\n            fontSize: 20,\n            lineHeight: 1.45,\n            color: subColor,\n            display: \"-webkit-box\",\n            WebkitLineClamp: 3,\n            WebkitBoxOrient: \"vertical\",\n            overflow: \"hidden\",\n          }}\n        >\n          {article.subheadline}\n        </p>\n      )}\n      <MetaRow {...props} color={metaColor} />\n    </div>\n  );\n};\n\nexport const ArticleHero = (props: HeroProps) => {\n  const { article, onClose, cardBackground } = props;\n\n  if (!article.imageUrl) {\n    const darkText = pickReadable(cardBackground);\n    return (\n      <header style={{ position: \"relative\", background: cardBackground }}>\n        <HeroContent\n          {...props}\n          textColor={darkText}\n          subColor={alpha(darkText, 0.85)}\n          metaColor={alpha(darkText, 0.75)}\n        />\n        <FloatingBackButton onClose={onClose} textColor={darkText} label={props.backLabel} />\n      </header>\n    );\n  }\n\n  return (\n    <header\n      style={{\n        position: \"relative\",\n        width: \"100%\",\n        minHeight: \"clamp(320px, 56vh, 560px)\",\n        overflow: \"hidden\",\n        display: \"flex\",\n        alignItems: \"flex-end\",\n      }}\n    >\n      <img\n        src={article.imageUrl}\n        alt={article.headline}\n        style={{ position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n      />\n      <div style={{ position: \"absolute\", inset: 0, background: GRADIENT }} />\n      <HeroContent\n        {...props}\n        textColor=\"#fff\"\n        subColor=\"rgba(255,255,255,0.9)\"\n        metaColor=\"rgba(255,255,255,0.85)\"\n      />\n      <FloatingBackButton onClose={onClose} label={props.backLabel} />\n    </header>\n  );\n};\n","import { NewsArticle } from \"../../../../types/news\";\n\nexport const SERIF = '\"Newsreader\", \"Charter\", \"Iowan Old Style\", Georgia, serif';\n\nexport const getParagraphs = (article: NewsArticle): string[] => {\n  const body = article.articleBody?.trim() ? article.articleBody : article.content;\n  return body\n    .split(/\\n\\s*\\n/)\n    .map((p) => p.trim())\n    .filter(Boolean);\n};\n\nexport const splitFirstChar = (text: string): [string, string] => {\n  if (!text) return [\"\", \"\"];\n  return [text.slice(0, 1), text.slice(1)];\n};\n","\"use client\";\n\nimport { NFAssetChart } from \"./NFAssetChart\";\nimport type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport { pickReadable, isLight } from \"../utils/contrast\";\nimport { SERIF, splitFirstChar } from \"./articleConstants\";\n\ntype ParagraphProps = {\n  text: string;\n  dropCap: boolean;\n  bodyFont: string;\n  bodyColor: string;\n  capColor: string;\n};\n\nconst Paragraph = ({ text, dropCap, bodyFont, bodyColor, capColor }: ParagraphProps) => {\n  const style: React.CSSProperties = {\n    margin: \"0 0 24px\",\n    fontFamily: bodyFont,\n    fontSize: 19,\n    lineHeight: 1.8,\n    color: bodyColor,\n  };\n\n  if (!dropCap) return <p style={style}>{text}</p>;\n\n  const [first, rest] = splitFirstChar(text);\n  return (\n    <p style={style}>\n      <span\n        style={{\n          float: \"left\",\n          fontFamily: SERIF,\n          fontSize: \"3.2em\",\n          lineHeight: 0.8,\n          fontWeight: 700,\n          color: capColor,\n          marginRight: 8,\n          marginTop: 4,\n        }}\n      >\n        {first}\n      </span>\n      {rest}\n    </p>\n  );\n};\n\nconst InlineChart = ({\n  itemCategory,\n  assets,\n  cardBackground,\n  bodyFont,\n}: {\n  itemCategory: string;\n  assets?: StockAsset[];\n  cardBackground: string;\n  bodyFont: string;\n}) => (\n  <figure style={{ margin: \"32px 0\" }}>\n    <NFAssetChart\n      itemCategory={itemCategory}\n      assets={assets}\n      height={240}\n      background={cardBackground}\n      chartTheme={isLight(cardBackground) ? \"light\" : \"dark\"}\n      fontFamily={bodyFont}\n      fullWidth\n    />\n  </figure>\n);\n\ntype ArticleBodyProps = {\n  paragraphs: string[];\n  itemCategory: string;\n  assets?: StockAsset[];\n  cardBackground: string;\n  bodyFont: string;\n};\n\nexport const ArticleBody = ({ paragraphs, itemCategory, assets, cardBackground, bodyFont }: ArticleBodyProps) => {\n  const bodyColor = pickReadable(cardBackground);\n  const chartIndex = paragraphs.length >= 2 ? 1 : paragraphs.length - 1;\n\n  return (\n    <div style={{ maxWidth: 680, margin: \"0 auto\", padding: \"40px 24px 64px\" }}>\n      {paragraphs.map((text, i) => (\n        <div key={i}>\n          <Paragraph\n            text={text}\n            dropCap={i === 0}\n            bodyFont={bodyFont}\n            bodyColor={bodyColor}\n            capColor={bodyColor}\n          />\n          {i === chartIndex && (\n            <InlineChart itemCategory={itemCategory} assets={assets} cardBackground={cardBackground} bodyFont={bodyFont} />\n          )}\n        </div>\n      ))}\n    </div>\n  );\n};\n","\"use client\";\n\nimport React, { useEffect, useState, useMemo } from \"react\";\nimport { NewsArticle } from \"../../../../types/news\";\nimport { alpha, pickReadable } from \"../../News2/utils/contrast\";\nimport { fetchNewsArticles } from \"../../News/functions/fetchNewsArticles\";\nimport { formatNewsDate } from \"../../News2/utils/formatDate\";\n\ntype StyleTokens = {\n  cardBackground?: string;\n  headlineColor?: string;\n  excerptColor?: string;\n  metaColor?: string;\n  fontFamily?: string;\n};\n\ninterface RelatedNewsProps {\n  currentArticle: NewsArticle;\n  articles?: NewsArticle[];\n  lang?: string;\n  onSelect?: (article: NewsArticle) => void;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: StyleTokens;\n  title?: string;\n}\n\nexport const RelatedNews: React.FC<RelatedNewsProps> = ({\n  currentArticle,\n  articles = [],\n  lang = \"en\",\n  onSelect,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  title = \"Related News\",\n}) => {\n  const [fetchedArticles, setFetchedArticles] = useState<NewsArticle[]>([]);\n  const [loading, setLoading] = useState(false);\n\n  // Filter local articles first\n  const localMatches = useMemo(() => {\n    return articles.filter(\n      (a) =>\n        a.headline !== currentArticle.headline &&\n        a.dateCode !== currentArticle.dateCode &&\n        (a.itemCategory === currentArticle.itemCategory || a.tag === currentArticle.tag)\n    );\n  }, [articles, currentArticle]);\n\n  // If localMatches has fewer than 3, fetch from API for current category\n  useEffect(() => {\n    let isMounted = true;\n    setFetchedArticles([]);\n    if (localMatches.length < 3 && currentArticle.itemCategory) {\n      setLoading(true);\n      fetchNewsArticles(lang, 0, 10, currentArticle.itemCategory).then((res) => {\n        if (!isMounted) return;\n        if (res && res.length > 0) {\n          setFetchedArticles(res);\n        }\n        setLoading(false);\n      });\n    } else {\n      setLoading(false);\n    }\n    return () => {\n      isMounted = false;\n    };\n  }, [localMatches.length, currentArticle.itemCategory, currentArticle.headline, lang]);\n\n  // Combined candidates\n  const relatedList = useMemo(() => {\n    const combined = [...localMatches];\n    for (const fa of fetchedArticles) {\n      if (\n        fa.headline !== currentArticle.headline &&\n        fa.dateCode !== currentArticle.dateCode &&\n        !combined.some((item) => item.headline === fa.headline)\n      ) {\n        combined.push(fa);\n      }\n    }\n    return combined.slice(0, 3);\n  }, [localMatches, fetchedArticles, currentArticle]);\n\n  if (!loading && relatedList.length === 0) {\n    return null;\n  }\n\n  const textColor =\n    styleTokens.headlineColor ||\n    pickReadable(styleTokens.cardBackground || \"#FFFFFF\");\n  const excerptColor = styleTokens.excerptColor || alpha(textColor, 0.7);\n  const metaColor = styleTokens.metaColor || alpha(textColor, 0.5);\n  const fontFamily = styleTokens.fontFamily || \"sans-serif\";\n\n  return (\n    <div\n      style={{\n        marginTop: 40,\n        paddingTop: 24,\n        borderTop: `1px solid ${alpha(textColor, 0.12)}`,\n        fontFamily,\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: 8,\n          marginBottom: 20,\n        }}\n      >\n        <span\n          style={{\n            width: 4,\n            height: 18,\n            backgroundColor: categoryColor,\n            borderRadius: 2,\n            display: \"inline-block\",\n          }}\n        />\n        <h3\n          style={{\n            margin: 0,\n            fontSize: 18,\n            fontWeight: 700,\n            color: textColor,\n            letterSpacing: \"-0.01em\",\n          }}\n        >\n          {title}\n        </h3>\n      </div>\n\n      <div className=\"nv3-related-grid\">\n        <style>{`\n          .nv3-related-grid {\n            display: grid;\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n            gap: 16px;\n            width: 100%;\n          }\n          @media (max-width: 768px) {\n            .nv3-related-grid {\n              grid-template-columns: 1fr;\n            }\n          }\n        `}</style>\n\n        {relatedList.map((item, idx) => (\n          <div\n            key={`${item.dateCode}-${item.headline}-${idx}`}\n            onClick={() => {\n              if (onSelect) {\n                onSelect(item);\n              }\n              if (typeof window !== \"undefined\") {\n                window.scrollTo({ top: 0, behavior: \"smooth\" });\n                document.documentElement.scrollTop = 0;\n                document.body.scrollTop = 0;\n              }\n            }}\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              borderRadius: 10,\n              padding: 12,\n              backgroundColor: alpha(textColor, 0.03),\n              border: `1px solid ${alpha(textColor, 0.08)}`,\n              cursor: \"pointer\",\n              transition: \"transform 0.15s ease, background-color 0.15s ease\",\n            }}\n            onMouseEnter={(e) => {\n              e.currentTarget.style.backgroundColor = alpha(textColor, 0.06);\n              e.currentTarget.style.transform = \"translateY(-2px)\";\n            }}\n            onMouseLeave={(e) => {\n              e.currentTarget.style.backgroundColor = alpha(textColor, 0.03);\n              e.currentTarget.style.transform = \"translateY(0)\";\n            }}\n          >\n            {item.imageUrl && (\n              <div\n                style={{\n                  width: \"100%\",\n                  height: 120,\n                  borderRadius: 6,\n                  overflow: \"hidden\",\n                  marginBottom: 10,\n                  backgroundColor: alpha(textColor, 0.05),\n                }}\n              >\n                <img\n                  src={item.imageUrl}\n                  alt={item.headline}\n                  style={{\n                    width: \"100%\",\n                    height: \"100%\",\n                    objectFit: \"cover\",\n                  }}\n                  onError={(e) => {\n                    (e.currentTarget as HTMLElement).style.display = \"none\";\n                  }}\n                />\n              </div>\n            )}\n\n            <div\n              style={{\n                display: \"flex\",\n                alignItems: \"center\",\n                gap: 6,\n                marginBottom: 6,\n              }}\n            >\n              <span\n                style={{\n                  fontSize: 10,\n                  fontWeight: 700,\n                  textTransform: \"uppercase\",\n                  color: categoryColor,\n                  letterSpacing: \"0.05em\",\n                }}\n              >\n                {categoryLabel || item.itemCategory || item.tag}\n              </span>\n              {item.dateCode && (\n                <>\n                  <span style={{ fontSize: 10, color: metaColor }}>•</span>\n                  <span style={{ fontSize: 11, color: metaColor }}>\n                    {formatNewsDate(item.dateCode, lang)}\n                  </span>\n                </>\n              )}\n            </div>\n\n            <h4\n              style={{\n                margin: \"0 0 6px 0\",\n                fontSize: 14,\n                fontWeight: 600,\n                lineHeight: 1.35,\n                color: textColor,\n                display: \"-webkit-box\",\n                WebkitLineClamp: 2,\n                WebkitBoxOrient: \"vertical\",\n                overflow: \"hidden\",\n              }}\n            >\n              {item.headline}\n            </h4>\n\n            {item.subheadline && (\n              <p\n                style={{\n                  margin: 0,\n                  fontSize: 12,\n                  lineHeight: 1.4,\n                  color: excerptColor,\n                  display: \"-webkit-box\",\n                  WebkitLineClamp: 2,\n                  WebkitBoxOrient: \"vertical\",\n                  overflow: \"hidden\",\n                }}\n              >\n                {item.subheadline}\n              </p>\n            )}\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nexport type StyleTokens = {\n  cardBackground: string;\n  cardBorder: string;\n  cardShadow: string;\n  cardRounded: string;\n  headlineColor: string;\n  headlineFontSize: string;\n  excerptColor: string;\n  metaColor: string;\n  tabBackground: string;\n  tabActiveBackground: string;\n  tabTextColor: string;\n  tabActiveTextColor: string;\n  fontFamily: string;\n  uiFontFamily?: string;\n  chartTheme?: \"light\" | \"dark\";\n};\n\nexport function pickCardTokens(s: StyleTokens) {\n  return {\n    cardBackground: s.cardBackground,\n    cardBorder: s.cardBorder,\n    cardShadow: s.cardShadow,\n    cardRounded: s.cardRounded,\n    headlineColor: s.headlineColor,\n    headlineFontSize: s.headlineFontSize,\n    excerptColor: s.excerptColor,\n    metaColor: s.metaColor,\n    fontFamily: s.fontFamily,\n  };\n}\n\nexport function pickHeroTokens(s: StyleTokens) {\n  return {\n    cardBackground: s.cardBackground,\n    cardBorder: s.cardBorder,\n    cardShadow: s.cardShadow,\n    cardRounded: s.cardRounded,\n    headlineColor: s.headlineColor,\n    excerptColor: s.excerptColor,\n    metaColor: s.metaColor,\n    fontFamily: s.fontFamily,\n    chartTheme: s.chartTheme,\n  };\n}\n\nexport function pickHeaderTokens(s: StyleTokens) {\n  return {\n    headlineColor: s.headlineColor,\n    metaColor: s.metaColor,\n    cardBackground: s.cardBackground,\n    tabTextColor: s.tabTextColor,\n    tabActiveTextColor: s.tabActiveTextColor,\n    fontFamily: s.fontFamily,\n    uiFontFamily: s.uiFontFamily,\n  };\n}\n\nexport function pickDetailTokens(s: StyleTokens) {\n  return {\n    cardBackground: s.cardBackground,\n    headlineColor: s.headlineColor,\n    excerptColor: s.excerptColor,\n    metaColor: s.metaColor,\n    fontFamily: s.fontFamily,\n  };\n}\n\nexport function EmptyState({ color, font }: { color: string; font: string }) {\n  return (\n    <div\n      style={{\n        textAlign: \"center\",\n        padding: \"64px 16px\",\n        opacity: 0.6,\n        color,\n        fontFamily: font,\n        fontSize: 15,\n      }}\n    >\n      No articles match your search.\n    </div>\n  );\n}\n\ntype LoadMoreTokens = Pick<\n  StyleTokens,\n  \"cardBorder\" | \"cardBackground\" | \"headlineColor\" | \"fontFamily\"\n>;\n\nexport function LoadMoreButton({\n  loading,\n  onClick,\n  styleTokens,\n}: {\n  loading: boolean;\n  onClick: () => void;\n  styleTokens: LoadMoreTokens;\n}) {\n  return (\n    <div style={{ display: \"flex\", justifyContent: \"center\", marginTop: 32 }}>\n      <button\n        type=\"button\"\n        onClick={onClick}\n        disabled={loading}\n        style={{\n          padding: \"10px 24px\",\n          borderRadius: 9999,\n          border: styleTokens.cardBorder,\n          background: styleTokens.cardBackground,\n          color: styleTokens.headlineColor,\n          fontFamily: styleTokens.fontFamily,\n          fontWeight: 600,\n          fontSize: 14,\n          cursor: loading ? \"default\" : \"pointer\",\n          opacity: loading ? 0.6 : 1,\n        }}\n      >\n        {loading ? \"Loading...\" : \"Load more\"}\n      </button>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport Branded from \"../../Branded\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { RawNews3 } from \"./RawNews3\";\nimport { CATEGORY_DEFAULT_COLORS } from \"../News2/constants\";\nimport {\n  pickReadable,\n  alpha,\n  clampBorderRadius,\n  isLight,\n  mix,\n} from \"../News2/utils/contrast\";\n\ninterface Props {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n  dev?: boolean;\n}\n\nconst SANS_STACK =\n  \"Inter, -apple-system, BlinkMacSystemFont, Segoe UI, system-ui, sans-serif\";\nconst HEADLINE_SERIF = '\"Playfair Display\", Georgia, \"Times New Roman\", serif';\n\n// WHY: style_payload persists booleans as 1/0, so the incoming value is often a\n// number. Returning it as-is leaked a literal 0 into JSX like {flag && <X/>}, which\n// React renders as the character \"0\".\nfunction resolveBool(v: boolean | number | null | undefined, def: boolean): boolean {\n  return v === null || v === undefined ? def : Boolean(v);\n}\n\nfunction resolveStr(v: string | null | undefined, def: string): string {\n  return v && v.length > 0 ? v : def;\n}\n\nfunction resolveChartTheme(\n  v: \"light\" | \"dark\" | \"auto\" | null | undefined,\n  bg: string,\n): \"light\" | \"dark\" {\n  if (v === \"light\" || v === \"dark\") return v;\n  return isLight(bg) ? \"light\" : \"dark\";\n}\n\nexport function News3({ styles, size, dev }: Props): JSX.Element {\n  const showShare = resolveBool(styles.news_v2_share_buttons, true);\n  const showReadingTime = resolveBool(styles.news_v2_show_reading_time, true);\n  const showDate = resolveBool(styles.news_v2_show_date, true);\n  const showCategories = resolveBool(styles.news_v2_show_categories, true);\n  const featuredShowChart = resolveBool(styles.news_v2_featured_show_chart, true);\n\n  const categoryColors = {\n    forex: resolveStr(styles.news_v2_category_color_forex, CATEGORY_DEFAULT_COLORS.forex),\n    stock: resolveStr(styles.news_v2_category_color_stock, CATEGORY_DEFAULT_COLORS.stock),\n    crypto: resolveStr(styles.news_v2_category_color_crypto, CATEGORY_DEFAULT_COLORS.crypto),\n    cmd: resolveStr(styles.news_v2_category_color_cmd, CATEGORY_DEFAULT_COLORS.cmd),\n    worldec: resolveStr(styles.news_v2_category_color_worldec, CATEGORY_DEFAULT_COLORS.worldec),\n    regec: resolveStr(styles.news_v2_category_color_regec, CATEGORY_DEFAULT_COLORS.regec),\n    latam: CATEGORY_DEFAULT_COLORS.latam,\n  };\n\n  const pageBackground = resolveStr(\n    styles.main_background,\n    styles.base_background || \"#0B1120\",\n  );\n  // WHY: cards read as a subtle elevation of the page, not an unrelated brand color\n  const elevatedCard = isLight(pageBackground)\n    ? mix(pageBackground, \"#000000\", 0.05)\n    : mix(pageBackground, \"#FFFFFF\", 0.06);\n  const cardBackground = resolveStr(styles.news_v2_card_background, elevatedCard);\n  const onPage = pickReadable(pageBackground);\n  const onCard = pickReadable(cardBackground);\n\n  const styleTokens = {\n    pageBackground,\n    cardBackground,\n    cardBorder: resolveStr(styles.news_v2_card_border, `1px solid ${alpha(onCard, 0.1)}`),\n    cardRounded: clampBorderRadius(\n      resolveStr(styles.news_v2_card_rounded, styles.base_rounded || \"14px\"),\n      20,\n    ),\n    headlineColor: resolveStr(styles.news_v2_headline_color, onPage),\n    headlineFont: resolveStr(styles.news_v2_font_family, HEADLINE_SERIF),\n    excerptColor: resolveStr(styles.news_v2_excerpt_color, alpha(onPage, 0.7)),\n    metaColor: resolveStr(styles.news_v2_meta_color, alpha(onPage, 0.55)),\n    accentColor: resolveStr(styles.news_v2_tab_active_background, \"#7C3AED\"),\n    fontFamily: resolveStr(styles.news_v2_font_family, styles.font_family || SANS_STACK),\n    uiFontFamily: SANS_STACK,\n    chartTheme: resolveChartTheme(styles.news_v2_chart_theme, cardBackground),\n    promoEnabled: resolveBool(styles.news_v3_promo_enabled, false),\n    promoMediaUrl: resolveStr(styles.news_v3_promo_media_url, \"\"),\n    promoCtaUrl: resolveStr(styles.news_v3_promo_cta_url, \"\"),\n  };\n\n  useEffect(() => {\n    loadGoogleFont(styles.news_v2_font_family ?? \"Playfair Display\");\n  }, [styles.news_v2_font_family]);\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"news\" size={size} hideCta>\n        <RawNews3\n          lang={styles.lang}\n          brandName={styles.brand_name}\n          showShare={showShare}\n          showReadingTime={showReadingTime}\n          showDate={showDate}\n          showCategories={showCategories}\n          featuredShowChart={featuredShowChart}\n          categoryColors={categoryColors}\n          styleTokens={styleTokens}\n          dev={dev}\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { NewsArticle } from \"../../../types/news\";\nimport { fetchNewsArticles } from \"../News/functions/fetchNewsArticles\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport {\n  CATEGORY_LABELS,\n  NewsCategory,\n  ARTICLES_PER_PAGE,\n} from \"../News2/constants\";\nimport { ArticleDetail } from \"../News2/parts/ArticleDetail\";\nimport { News3Tokens } from \"./tokens\";\nimport { DashboardHeader } from \"./parts/DashboardHeader\";\nimport { HeroFeature } from \"./parts/HeroFeature\";\nimport { StoryList } from \"./parts/StoryList\";\nimport { FeaturedAside } from \"./parts/FeaturedAside\";\nimport { NewsAside } from \"./parts/NewsAside\";\nimport { pickReadable } from \"../News2/utils/contrast\";\nimport type { NewsCategoryKey } from \"../News2/constants\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\n\ntype Props = {\n  lang: string;\n  brandName: string;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  showCategories: boolean;\n  featuredShowChart: boolean;\n  categoryColors: Record<NewsCategoryKey, string>;\n  styleTokens: News3Tokens;\n  dev?: boolean;\n};\n\nconst FALLBACK_CATEGORY_COLOR = \"#6B7280\";\nconst INITIAL_VISIBLE = 5;\n\nexport function RawNews3(props: Props) {\n  const {\n    lang,\n    brandName,\n    showShare,\n    showReadingTime,\n    showDate,\n    showCategories,\n    featuredShowChart,\n    categoryColors,\n    styleTokens,\n    dev,\n  } = props;\n\n  const [category, setCategory] = useState<NewsCategory>(\"all\");\n  const [searchQuery, setSearchQuery] = useState(\"\");\n  const [articles, setArticles] = useState<NewsArticle[]>([]);\n  const [offset, setOffset] = useState(0);\n  const [loading, setLoading] = useState(true);\n  const [loadingMore, setLoadingMore] = useState(false);\n  const [hasMore, setHasMore] = useState(true);\n  const [visibleCount, setVisibleCount] = useState(INITIAL_VISIBLE);\n  const [selected, setSelected] = useState<NewsArticle | null>(null);\n  const reqSeqRef = useRef(0);\n  const t = useMemo(() => getDictionarySection(lang, \"news\"), [lang]);\n\n  useEffect(() => {\n    reqSeqRef.current += 1;\n    const mySeq = reqSeqRef.current;\n    setLoading(true);\n    setArticles([]);\n    setOffset(0);\n    setHasMore(true);\n    setVisibleCount(INITIAL_VISIBLE);\n\n    (async () => {\n      const result = await fetchNewsArticles(lang, 0, ARTICLES_PER_PAGE, category);\n      if (mySeq !== reqSeqRef.current) return;\n      const batch = result ?? [];\n      setArticles(batch);\n      setHasMore(batch.length >= ARTICLES_PER_PAGE);\n      setOffset(ARTICLES_PER_PAGE);\n      setLoading(false);\n    })();\n  }, [category, lang]);\n\n  const loadMore = async () => {\n    if (loadingMore || !hasMore) return;\n    setLoadingMore(true);\n    const result = await fetchNewsArticles(lang, offset, ARTICLES_PER_PAGE, category);\n    const batch = result ?? [];\n    setArticles((prev) => [...prev, ...batch]);\n    setOffset((prev) => prev + ARTICLES_PER_PAGE);\n    setHasMore(batch.length >= ARTICLES_PER_PAGE);\n    setLoadingMore(false);\n  };\n\n  const isSearching = searchQuery.trim().length > 0;\n\n  const filtered = useMemo(() => {\n    const q = searchQuery.trim().toLowerCase();\n    if (!q) return articles;\n    return articles.filter((a) => a.headline.toLowerCase().includes(q));\n  }, [articles, searchQuery]);\n\n  const featured = useMemo(() => {\n    if (isSearching || !articles.length) return null;\n    return articles[0];\n  }, [articles, isSearching]);\n\n  const listArticles = featured ? filtered.filter((a) => a !== featured) : filtered;\n  const displayedList = listArticles.slice(0, visibleCount);\n  const canShowMore = visibleCount < listArticles.length || hasMore;\n\n  const handleShowMore = async () => {\n    if (visibleCount >= listArticles.length && hasMore) await loadMore();\n    setVisibleCount((v) => v + INITIAL_VISIBLE);\n  };\n\n  const colorFor = (cat: string): string =>\n    (categoryColors as Record<string, string>)[cat] ?? FALLBACK_CATEGORY_COLOR;\n\n  const labelFor = (article: NewsArticle): string =>\n    (t.categories as Record<string, string>)[article.itemCategory] ??\n    (CATEGORY_LABELS as Record<string, string>)[article.itemCategory] ??\n    article.tag;\n\n  const onTopic = (cat: NewsCategory) => {\n    setSearchQuery(\"\");\n    setCategory(cat);\n  };\n\n  const pageStyle: React.CSSProperties = {\n    width: \"100%\",\n    background: styleTokens.pageBackground,\n    color: pickReadable(styleTokens.pageBackground),\n    fontFamily: styleTokens.fontFamily,\n    containerType: \"inline-size\",\n    minWidth: 0,\n    boxSizing: \"border-box\",\n  };\n\n  const innerStyle: React.CSSProperties = {\n    width: \"100%\",\n    maxWidth: 1280,\n    margin: \"0 auto\",\n    padding: 20,\n    boxSizing: \"border-box\",\n    minWidth: 0,\n  };\n\n  if (loading && articles.length === 0) {\n    return (\n      <div style={pageStyle}>\n        <div style={{ display: \"flex\", justifyContent: \"center\", padding: \"120px 0\" }}>\n          <FancyLoader />\n        </div>\n      </div>\n    );\n  }\n\n  if (selected) {\n    return (\n      <div style={pageStyle}>\n        <div style={innerStyle}>\n          <ArticleDetail\n            article={selected}\n            onClose={() => setSelected(null)}\n            showShare={showShare}\n            showReadingTime={showReadingTime}\n            showDate={showDate}\n            categoryColor={colorFor(selected.itemCategory)}\n            categoryLabel={labelFor(selected)}\n            articles={articles}\n            lang={lang}\n            translations={t}\n            onSelect={setSelected}\n            styleTokens={{\n              cardBackground: styleTokens.cardBackground,\n              headlineColor: styleTokens.headlineColor,\n              excerptColor: styleTokens.excerptColor,\n              metaColor: styleTokens.metaColor,\n              fontFamily: styleTokens.fontFamily,\n            }}\n          />\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div style={pageStyle}>\n      <DashboardHeader\n        active={category}\n        onCategoryChange={setCategory}\n        searchQuery={searchQuery}\n        onSearchChange={setSearchQuery}\n        brandName={brandName}\n        showCategories={showCategories}\n        styleTokens={styleTokens}\n        translations={t}\n      />\n\n      <div style={innerStyle}>\n        <div className=\"nv3-grid\">\n          <style>{`\n            .nv3-grid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);gap:28px;align-items:stretch;width:100%;min-width:0}\n            @container (max-width:880px){.nv3-grid{grid-template-columns:minmax(0,1fr)}}\n            @media(max-width:880px){.nv3-grid{grid-template-columns:minmax(0,1fr)}}\n          `}</style>\n\n          <div style={{ minWidth: 0 }}>\n            {featured && (\n              <HeroFeature\n                article={featured}\n                onClick={setSelected}\n                showShare={showShare}\n                showReadingTime={showReadingTime}\n                showDate={showDate}\n                categoryColor={colorFor(featured.itemCategory)}\n                categoryLabel={labelFor(featured)}\n                styleTokens={styleTokens}\n                translations={t}\n                lang={lang}\n              />\n            )}\n          </div>\n\n          <FeaturedAside\n            featured={featured}\n            show={featuredShowChart}\n            styleTokens={styleTokens}\n            dev={dev}\n            lang={lang}\n          />\n        </div>\n\n        <div className=\"nv3-news-grid\">\n          <style>{`\n            .nv3-news-grid{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:28px;align-items:start;width:100%;min-width:0;margin-top:8px}\n            @container (max-width:880px){.nv3-news-grid{grid-template-columns:minmax(0,1fr)}}\n            @media(max-width:880px){.nv3-news-grid{grid-template-columns:minmax(0,1fr)}}\n          `}</style>\n\n          <StoryList\n            articles={displayedList}\n            onSelect={setSelected}\n            showDate={showDate}\n            showReadingTime={showReadingTime}\n            showShare={showShare}\n            colorFor={colorFor}\n            labelFor={labelFor}\n            styleTokens={styleTokens}\n            hasMore={canShowMore && !isSearching}\n            loadingMore={loadingMore}\n            onLoadMore={handleShowMore}\n            isSearching={isSearching}\n            translations={t}\n            lang={lang}\n          />\n\n          <NewsAside onTopic={onTopic} styleTokens={styleTokens} dev={dev} lang={lang} translations={t} />\n        </div>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\nimport { NewsTabs } from \"./NewsTabs\";\nimport { NewsCategory } from \"../../News2/constants\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport { News3Tokens } from \"../tokens\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface Props {\n  active: NewsCategory;\n  onCategoryChange: (next: NewsCategory) => void;\n  searchQuery: string;\n  onSearchChange: (q: string) => void;\n  brandName?: string;\n  showCategories: boolean;\n  styleTokens: News3Tokens;\n  translations: NewsDictionary;\n}\n\nexport const DashboardHeader: React.FC<Props> = ({\n  active,\n  onCategoryChange,\n  searchQuery,\n  onSearchChange,\n  showCategories,\n  styleTokens,\n  translations,\n}) => {\n  const font = styleTokens.uiFontFamily;\n  const text = styleTokens.headlineColor;\n\n  return (\n    <div\n      className=\"nf-dash-header\"\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        flexWrap: \"wrap\",\n        gap: 28,\n        width: \"100%\",\n        maxWidth: 1280,\n        margin: \"0 auto\",\n        padding: \"18px 20px\",\n        boxSizing: \"border-box\",\n        borderBottom: `1px solid ${alpha(text, 0.1)}`,\n        fontFamily: font,\n        color: text,\n      }}\n    >\n      <style>{`@media (max-width: 640px) {\n        .nf-dash-header { padding: 12px 14px !important; gap: 12px !important; }\n        .nf-dash-tabs { flex: 1 1 100% !important; justify-content: flex-start !important; overflow-x: auto; }\n        .nf-dash-search { max-width: none !important; flex: 1 1 100% !important; }\n      }`}</style>\n\n      {showCategories && (\n        <div className=\"nf-dash-tabs\" style={{ flex: \"1 1 auto\", minWidth: 0, display: \"flex\", justifyContent: \"flex-start\" }}>\n          <NewsTabs\n            active={active}\n            onChange={onCategoryChange}\n            textColor={styleTokens.metaColor}\n            activeColor={styleTokens.headlineColor}\n            accentColor={styleTokens.accentColor}\n            fontFamily={font}\n            translations={translations}\n          />\n        </div>\n      )}\n\n      <label\n        className=\"nf-dash-search\"\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: 8,\n          background: alpha(text, 0.05),\n          border: `1px solid ${alpha(text, 0.1)}`,\n          borderRadius: 999,\n          padding: \"8px 14px\",\n          maxWidth: 300,\n          flexShrink: 0,\n          marginLeft: showCategories ? undefined : \"auto\",\n        }}\n      >\n        <HiOutlineMagnifyingGlass size={16} style={{ opacity: 0.5, flexShrink: 0 }} />\n        <input\n          type=\"text\"\n          value={searchQuery}\n          onChange={(e) => onSearchChange(e.target.value)}\n          placeholder={translations.searchPlaceholder}\n          aria-label={translations.searchLabel}\n          style={{\n            background: \"transparent\",\n            border: \"none\",\n            outline: \"none\",\n            fontSize: 13,\n            color: \"inherit\",\n            width: 210,\n            fontFamily: font,\n          }}\n        />\n        <kbd\n          aria-hidden=\"true\"\n          style={{\n            flexShrink: 0,\n            minWidth: 18,\n            height: 18,\n            padding: \"0 5px\",\n            borderRadius: 4,\n            border: `1px solid ${alpha(text, 0.2)}`,\n            color: alpha(text, 0.5),\n            fontSize: 11,\n            fontFamily: font,\n            display: \"inline-flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n          }}\n        >\n          /\n        </kbd>\n      </label>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { CATEGORY_LABELS, NEWS_CATEGORIES, NewsCategory } from \"../../News2/constants\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface Props {\n  active: NewsCategory;\n  onChange: (next: NewsCategory) => void;\n  textColor: string;\n  activeColor: string;\n  accentColor: string;\n  fontFamily: string;\n  translations: NewsDictionary;\n}\n\nexport const NewsTabs: React.FC<Props> = ({\n  active,\n  onChange,\n  textColor,\n  activeColor,\n  accentColor,\n  fontFamily,\n  translations,\n}) => (\n  <div\n    className=\"nv3-tabs\"\n    role=\"tablist\"\n    aria-label={translations.articleCategoriesLabel}\n    style={{ display: \"flex\", gap: 30, overflowX: \"auto\", fontFamily }}\n  >\n    <style>{`.nv3-tabs::-webkit-scrollbar{display:none}.nv3-tabs{scrollbar-width:none;-ms-overflow-style:none}`}</style>\n    {NEWS_CATEGORIES.map((c) => {\n      const isActive = c === active;\n      return (\n        <button\n          key={c}\n          type=\"button\"\n          role=\"tab\"\n          aria-selected={isActive}\n          onClick={() => onChange(c)}\n          style={{\n            background: \"transparent\",\n            border: \"none\",\n            padding: \"6px 0\",\n            fontFamily,\n            fontSize: 14.5,\n            fontWeight: isActive ? 600 : 500,\n            color: isActive ? activeColor : textColor,\n            borderBottom: `2px solid ${isActive ? accentColor : \"transparent\"}`,\n            cursor: \"pointer\",\n            whiteSpace: \"nowrap\",\n            transition: \"color 160ms ease-out\",\n          }}\n        >\n          {translations.categories[c] ?? (c === \"all\" ? \"All\" : CATEGORY_LABELS[c])}\n        </button>\n      );\n    })}\n  </div>\n);\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { FiShare2 } from \"react-icons/fi\";\nimport { FaXTwitter, FaWhatsapp, FaFacebookF } from \"react-icons/fa6\";\n\ninterface Props {\n  headline: string;\n  url?: string;\n  iconColor: string;\n  borderColor: string;\n  size?: number;\n  shareLabel?: string;\n}\n\ntype Share = { label: string; href: string; Icon: React.ComponentType<{ size?: number }>; bg: string };\n\nconst shareTargets = (headline: string, url: string): Share[] => {\n  const u = encodeURIComponent(url);\n  const t = encodeURIComponent(headline);\n  return [\n    { label: \"Facebook\", href: `https://www.facebook.com/sharer/sharer.php?u=${u}`, Icon: FaFacebookF, bg: \"#1877F2\" },\n    { label: \"WhatsApp\", href: `https://wa.me/?text=${t}%20${u}`, Icon: FaWhatsapp, bg: \"#25D366\" },\n    { label: \"X\", href: `https://twitter.com/intent/tweet?text=${t}&url=${u}`, Icon: FaXTwitter, bg: \"#000000\" },\n  ];\n};\n\nconst circle = (iconColor: string, borderColor: string, size: number): React.CSSProperties => ({\n  width: size,\n  height: size,\n  borderRadius: \"50%\",\n  border: `1px solid ${borderColor}`,\n  background: \"transparent\",\n  color: iconColor,\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  cursor: \"pointer\",\n  flexShrink: 0,\n});\n\nexport const ArticleActions: React.FC<Props> = ({\n  headline,\n  url,\n  iconColor,\n  borderColor,\n  size = 40,\n  shareLabel = \"Share\",\n}) => {\n  const [menu, setMenu] = useState(false);\n  const link = url ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n\n  return (\n    <span\n      style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8, position: \"relative\" }}\n      onClick={(e) => e.stopPropagation()}\n    >\n      <button\n        type=\"button\"\n        aria-label={shareLabel}\n        onClick={() => setMenu((m) => !m)}\n        style={circle(iconColor, borderColor, size)}\n      >\n        <FiShare2 size={size * 0.42} />\n      </button>\n\n      {menu && (\n        <span\n          style={{\n            position: \"absolute\",\n            bottom: size + 8,\n            right: 0,\n            display: \"flex\",\n            gap: 8,\n            padding: 8,\n            borderRadius: 12,\n            background: \"rgba(17,24,39,0.96)\",\n            border: \"1px solid rgba(255,255,255,0.12)\",\n            boxShadow: \"0 8px 24px rgba(0,0,0,0.4)\",\n            zIndex: 20,\n          }}\n        >\n          {shareTargets(headline, link).map((s) => (\n            <a\n              key={s.label}\n              href={s.href}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              aria-label={s.label}\n              onClick={() => setMenu(false)}\n              style={{\n                width: 34,\n                height: 34,\n                borderRadius: \"50%\",\n                background: s.bg,\n                color: \"#fff\",\n                display: \"inline-flex\",\n                alignItems: \"center\",\n                justifyContent: \"center\",\n              }}\n            >\n              <s.Icon size={15} />\n            </a>\n          ))}\n        </span>\n      )}\n    </span>\n  );\n};\n","\"use client\";\n\nimport { alpha, mix } from \"../../News2/utils/contrast\";\n\ninterface Props {\n  color: string;\n  label: string;\n}\n\nexport const CategoryPill: React.FC<Props> = ({ color, label }) => (\n  <span\n    style={{\n      display: \"inline-block\",\n      padding: \"3px 9px\",\n      borderRadius: 6,\n      background: alpha(color, 0.18),\n      border: `1px solid ${alpha(color, 0.35)}`,\n      color: mix(color, \"#FFFFFF\", 0.35),\n      fontSize: 11,\n      fontWeight: 700,\n      letterSpacing: \"0.07em\",\n      textTransform: \"uppercase\",\n    }}\n  >\n    {label}\n  </span>\n);\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../types/news\";\nimport { formatNewsDate } from \"../../News2/utils/formatDate\";\nimport { estimateReadingTime, formatReadingTime } from \"../../News2/utils/readingTime\";\nimport { News3Tokens } from \"../tokens\";\nimport { ArticleActions } from \"./ArticleActions\";\nimport { CategoryPill } from \"./CategoryPill\";\nimport { BreakingBadge } from \"../../News2/parts/BreakingBadge\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface Props {\n  article: NewsArticle;\n  onClick: (a: NewsArticle) => void;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: News3Tokens;\n  translations: NewsDictionary;\n  lang: string;\n}\n\nconst META_COLOR = \"rgba(255,255,255,0.55)\";\n\nexport const HeroFeature: React.FC<Props> = ({\n  article,\n  onClick,\n  showShare,\n  showReadingTime,\n  showDate,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  translations,\n  lang,\n}) => {\n  const meta: string[] = [];\n  if (showDate) meta.push(formatNewsDate(article.dateCode, lang));\n  if (showReadingTime) {\n    const minutes = estimateReadingTime(article.articleBody ?? article.content);\n    meta.push(formatReadingTime(minutes, translations.readingTime));\n  }\n\n  return (\n    <div\n      onClick={() => onClick(article)}\n      style={{\n        position: \"relative\",\n        borderRadius: 18,\n        border: styleTokens.cardBorder,\n        overflow: \"hidden\",\n        cursor: \"pointer\",\n        height: \"100%\",\n        minHeight: 380,\n        width: \"100%\",\n      }}\n    >\n      <img\n        src={article.imageUrl}\n        alt={article.headline}\n        loading=\"lazy\"\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          width: \"100%\",\n          height: \"100%\",\n          objectFit: \"cover\",\n          borderRadius: 18,\n          zIndex: 0,\n        }}\n      />\n      <div\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          borderRadius: 18,\n          zIndex: 1,\n          background:\n            \"linear-gradient(to top, rgba(10,12,16,0.97) 0%, rgba(10,12,16,0.9) 22%, rgba(10,12,16,0.55) 42%, rgba(10,12,16,0) 62%)\",\n        }}\n      />\n      <div style={{ position: \"absolute\", left: 0, right: 0, bottom: 0, padding: 28, zIndex: 2 }}>\n        {article.isBreaking && article.isLive && (\n          <BreakingBadge live expiresAt={article.breakingExpiresAt} />\n        )}\n        <CategoryPill color={categoryColor} label={categoryLabel} />\n        <h2\n          style={{\n            fontFamily: styleTokens.headlineFont,\n            fontSize: \"clamp(1.75rem, 2.6vw, 2.5rem)\",\n            fontWeight: 700,\n            lineHeight: 1.12,\n            letterSpacing: \"-0.01em\",\n            color: \"#fff\",\n            margin: \"14px 0 0\",\n          }}\n        >\n          {article.headline}\n        </h2>\n        {article.subheadline && (\n          <p\n            style={{\n              fontFamily: styleTokens.uiFontFamily,\n              color: \"rgba(255,255,255,0.72)\",\n              fontSize: 15,\n              lineHeight: 1.5,\n              margin: \"12px 0 0\",\n              maxWidth: 560,\n              display: \"-webkit-box\",\n              WebkitLineClamp: 2,\n              WebkitBoxOrient: \"vertical\",\n              overflow: \"hidden\",\n            }}\n          >\n            {article.subheadline}\n          </p>\n        )}\n        <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, marginTop: 18 }}>\n          {meta.length > 0 && (\n            <span style={{ color: META_COLOR, fontSize: 13, fontFamily: styleTokens.uiFontFamily }}>\n              {meta.map((m, i) => (\n                <span key={m}>\n                  {i > 0 && <span style={{ margin: \"0 7px\", opacity: 0.6 }}>·</span>}\n                  {m}\n                </span>\n              ))}\n            </span>\n          )}\n          {showShare && (\n            <span style={{ marginLeft: \"auto\" }}>\n              <ArticleActions\n                headline={article.headline}\n                iconColor=\"rgba(255,255,255,0.7)\"\n                borderColor=\"rgba(255,255,255,0.25)\"\n                shareLabel={translations.share}\n              />\n            </span>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../types/news\";\nimport { formatNewsDate } from \"../../News2/utils/formatDate\";\nimport { estimateReadingTime, formatReadingTime } from \"../../News2/utils/readingTime\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport { News3Tokens } from \"../tokens\";\nimport { ArticleActions } from \"./ArticleActions\";\nimport { CategoryPill } from \"./CategoryPill\";\nimport { BreakingBadge } from \"../../News2/parts/BreakingBadge\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype Variant = \"lead\" | \"compact\";\n\ninterface Props {\n  article: NewsArticle;\n  onClick: (a: NewsArticle) => void;\n  showDate: boolean;\n  showReadingTime: boolean;\n  showShare: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: News3Tokens;\n  divider: boolean;\n  variant: Variant;\n  translations: NewsDictionary;\n  lang: string;\n}\n\nconst SIZES = {\n  lead: { thumb: 280, headline: \"1.4rem\", excerptClamp: 2, pad: \"22px 0\", gap: 20 },\n  compact: { thumb: 160, headline: \"1.05rem\", excerptClamp: 1, pad: \"18px 0\", gap: 16 },\n} as const;\n\nexport const StoryRow: React.FC<Props> = ({\n  article,\n  onClick,\n  showDate,\n  showReadingTime,\n  showShare,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  divider,\n  variant,\n  translations,\n  lang,\n}) => {\n  const s = SIZES[variant];\n  const meta: string[] = [];\n  if (showDate) meta.push(formatNewsDate(article.dateCode, lang));\n  if (showReadingTime) {\n    const minutes = estimateReadingTime(article.articleBody ?? article.content);\n    meta.push(formatReadingTime(minutes, translations.readingTime));\n  }\n\n  return (\n    <div\n      onClick={() => onClick(article)}\n      style={{\n        display: \"flex\",\n        gap: s.gap,\n        padding: s.pad,\n        borderBottom: divider ? `1px solid ${alpha(styleTokens.headlineColor, 0.12)}` : \"none\",\n        cursor: \"pointer\",\n        alignItems: \"flex-start\",\n      }}\n    >\n      <div\n        style={{\n          flexShrink: 0,\n          width: s.thumb,\n          maxWidth: variant === \"lead\" ? \"44%\" : \"38%\",\n          aspectRatio: \"16 / 10\",\n          borderRadius: 12,\n          overflow: \"hidden\",\n        }}\n      >\n        <img\n          src={article.imageUrl}\n          alt={article.headline}\n          loading=\"lazy\"\n          style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\", display: \"block\" }}\n        />\n      </div>\n\n      <div style={{ minWidth: 0, flex: 1 }}>\n        {article.isBreaking && article.isLive && (\n          <BreakingBadge live expiresAt={article.breakingExpiresAt} />\n        )}\n        <CategoryPill color={categoryColor} label={categoryLabel} />\n        <h3\n          style={{\n            fontFamily: styleTokens.headlineFont,\n            fontSize: s.headline,\n            fontWeight: 700,\n            lineHeight: 1.25,\n            letterSpacing: \"-0.01em\",\n            color: styleTokens.headlineColor,\n            margin: \"8px 0 0\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 2,\n            WebkitBoxOrient: \"vertical\",\n            overflow: \"hidden\",\n          }}\n        >\n          {article.headline}\n        </h3>\n        {article.subheadline && (\n          <p\n            style={{\n              fontFamily: styleTokens.uiFontFamily,\n              color: styleTokens.excerptColor,\n              fontSize: variant === \"lead\" ? 14 : 13,\n              lineHeight: 1.5,\n              margin: \"6px 0 0\",\n              display: \"-webkit-box\",\n              WebkitLineClamp: s.excerptClamp,\n              WebkitBoxOrient: \"vertical\",\n              overflow: \"hidden\",\n            }}\n          >\n            {article.subheadline}\n          </p>\n        )}\n        <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, marginTop: 10 }}>\n          {meta.length > 0 && (\n            <span\n              style={{ color: styleTokens.metaColor, fontSize: 12, fontFamily: styleTokens.uiFontFamily }}\n            >\n              {meta.map((m, i) => (\n                <span key={m}>\n                  {i > 0 && <span style={{ margin: \"0 7px\", opacity: 0.6 }}>·</span>}\n                  {m}\n                </span>\n              ))}\n            </span>\n          )}\n          {showShare && (\n            <span style={{ marginLeft: \"auto\" }}>\n              <ArticleActions\n                headline={article.headline}\n                iconColor={styleTokens.metaColor}\n                borderColor={alpha(styleTokens.headlineColor, 0.2)}\n                size={34}\n                shareLabel={translations.share}\n              />\n            </span>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../types/news\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport { News3Tokens } from \"../tokens\";\nimport { StoryRow } from \"./StoryRow\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface Props {\n  articles: NewsArticle[];\n  onSelect: (a: NewsArticle) => void;\n  showDate: boolean;\n  showReadingTime: boolean;\n  showShare: boolean;\n  colorFor: (cat: string) => string;\n  labelFor: (a: NewsArticle) => string;\n  styleTokens: News3Tokens;\n  hasMore: boolean;\n  loadingMore: boolean;\n  onLoadMore: () => void;\n  isSearching: boolean;\n  translations: NewsDictionary;\n  lang: string;\n}\n\nexport const StoryList: React.FC<Props> = ({\n  articles,\n  onSelect,\n  showDate,\n  showReadingTime,\n  showShare,\n  colorFor,\n  labelFor,\n  styleTokens,\n  hasMore,\n  loadingMore,\n  onLoadMore,\n  isSearching,\n  translations,\n  lang,\n}) => {\n  return (\n    <div style={{ marginTop: 8 }}>\n      <div\n        style={{\n          borderBottom: `1px solid ${alpha(styleTokens.headlineColor, 0.14)}`,\n          fontFamily: styleTokens.uiFontFamily,\n        }}\n      >\n        <span\n          style={{\n            display: \"inline-block\",\n            padding: \"0 0 12px\",\n            fontSize: 14,\n            fontWeight: 600,\n            color: styleTokens.headlineColor,\n            borderBottom: `3px solid ${styleTokens.accentColor}`,\n            marginBottom: -1,\n          }}\n        >\n          {translations.latestNews}\n        </span>\n      </div>\n\n      {isSearching && articles.length === 0 ? (\n        <div style={{ textAlign: \"center\", padding: \"48px 0\", color: styleTokens.metaColor, fontSize: 14 }}>\n          {translations.noSearchResults}\n        </div>\n      ) : (\n        articles.map((a, i) => (\n          <StoryRow\n            key={`${a.dateCode}-${a.headline}-${i}`}\n            article={a}\n            onClick={onSelect}\n            showDate={showDate}\n            showReadingTime={showReadingTime}\n            showShare={showShare}\n            categoryColor={colorFor(a.itemCategory)}\n            categoryLabel={labelFor(a)}\n            styleTokens={styleTokens}\n            divider={i < articles.length - 1}\n            variant={i === 0 ? \"lead\" : \"compact\"}\n            translations={translations}\n            lang={lang}\n          />\n        ))\n      )}\n\n      {hasMore && (\n        <div style={{ display: \"flex\", justifyContent: \"center\", marginTop: 24 }}>\n          <button\n            type=\"button\"\n            onClick={onLoadMore}\n            disabled={loadingMore}\n            style={{\n              padding: \"10px 24px\",\n              borderRadius: 999,\n              border: `1px solid ${alpha(styleTokens.headlineColor, 0.15)}`,\n              background: \"transparent\",\n              color: styleTokens.headlineColor,\n              fontFamily: styleTokens.uiFontFamily,\n              fontWeight: 600,\n              fontSize: 14,\n              cursor: loadingMore ? \"default\" : \"pointer\",\n              opacity: loadingMore ? 0.6 : 1,\n            }}\n          >\n            {loadingMore ? translations.loading : translations.loadMore}\n          </button>\n        </div>\n      )}\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../types/news\";\nimport { NFAssetChart } from \"../../News2/parts/NFAssetChart\";\nimport { News3Tokens } from \"../tokens\";\n\ninterface Props {\n  featured: NewsArticle | null;\n  show: boolean;\n  styleTokens: News3Tokens;\n  dev?: boolean;\n  lang: string;\n}\n\nexport const FeaturedAside: React.FC<Props> = ({ featured, show, styleTokens, dev, lang }) => {\n  if (!show || !featured) return null;\n\n  return (\n    <NFAssetChart\n      itemCategory={featured.itemCategory}\n      assets={featured.assets}\n      height={240}\n      background={styleTokens.cardBackground}\n      chartTheme={styleTokens.chartTheme}\n      fontFamily={styleTokens.fontFamily}\n      headlineColor={styleTokens.headlineColor}\n      dev={dev}\n      lang={lang}\n    />\n  );\n};\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { fetchMovers } from \"./fetchMovers\";\nimport { MoverRow } from \"./parts/MoverRow\";\nimport { MoversTabs } from \"./parts/MoversTabs\";\nimport { SAMPLE_MOVERS } from \"./sample\";\nimport { resolveMoversTheme } from \"./theme\";\nimport { Mover, MoversList } from \"./types\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\n\nconst ROW_HEIGHT = 57;\n\ntype Props = {\n  styles: WidgetStyle;\n  dev?: boolean;\n  title?: string;\n  visibleRows?: number;\n  onMoverClick?: (mover: Mover) => void;\n  fullWidth?: boolean;\n};\n\nexport const TopMovers: React.FC<Props> = ({\n  styles,\n  dev = false,\n  title = \"Market Movers\",\n  visibleRows = 5,\n  onMoverClick,\n  fullWidth = false,\n}) => {\n  const theme = useMemo(() => resolveMoversTheme(styles), [styles]);\n  const translations = useMemo(\n    () => getDictionarySection(styles.lang, \"topMovers\"),\n    [styles.lang],\n  );\n  const [list, setList] = useState<MoversList>(\"active\");\n  const [movers, setMovers] = useState<Mover[]>(\n    dev ? SAMPLE_MOVERS.active : [],\n  );\n  const [loading, setLoading] = useState(false);\n\n  useEffect(() => {\n    if (dev) {\n      setMovers(SAMPLE_MOVERS[list]);\n      return;\n    }\n    let cancelled = false;\n    setLoading(true);\n    fetchMovers(list).then((next) => {\n      if (!cancelled) {\n        setMovers(next);\n        setLoading(false);\n      }\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [list, dev]);\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        maxWidth: fullWidth ? \"100%\" : 380,\n        alignSelf: fullWidth ? \"stretch\" : \"flex-start\",\n        padding: 16,\n        background: theme.background,\n        borderRadius: fullWidth ? 0 : 16,\n        boxSizing: \"border-box\",\n        fontFamily: \"system-ui, -apple-system, sans-serif\",\n      }}\n    >\n      <div\n        style={{\n          color: theme.strong,\n          fontWeight: 700,\n          fontSize: 17,\n          marginBottom: 12,\n        }}\n      >\n        {title ?? translations.title}\n      </div>\n      <MoversTabs\n        value={list}\n        onChange={setList}\n        theme={theme}\n        translations={translations}\n      />\n      <div\n        style={{\n          marginTop: 8,\n          opacity: loading ? 0.45 : 1,\n          transition: \"opacity .15s\",\n          maxHeight: visibleRows * ROW_HEIGHT,\n          overflowY: \"auto\",\n          scrollbarWidth: \"thin\",\n          scrollbarColor: `${theme.divider} transparent`,\n        }}\n      >\n        {movers.map((m, i) => (\n          <MoverRow\n            key={`${m.ticker}-${i}`}\n            mover={m}\n            theme={theme}\n            last={i === movers.length - 1}\n            onClick={onMoverClick}\n          />\n        ))}\n        {movers.length === 0 && (\n          <div\n            style={{\n              color: theme.text,\n              fontSize: 13,\n              padding: \"24px 0\",\n              textAlign: \"center\",\n            }}\n          >\n            {translations.noData}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n","import { Mover, MoversList } from \"./types\";\nimport { WIDGET_API_BASE } from \"../../../utils/widgetApiBase\";\n\nexport async function fetchMovers(list: MoversList): Promise<Mover[]> {\n  try {\n    const res = await fetch(`${WIDGET_API_BASE}/api/widgets/movers?list=${list}`);\n    if (!res.ok) return [];\n    const data = (await res.json()) as { movers?: Mover[] };\n    return data.movers ?? [];\n  } catch {\n    return [];\n  }\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { MoversTheme } from \"../types\";\n\ntype Props = { ticker: string; logo: string | null; theme: MoversTheme };\n\nexport const MoverLogo: React.FC<Props> = ({ ticker, logo, theme }) => {\n  const [failed, setFailed] = useState(false);\n\n  const base = {\n    width: 34,\n    height: 34,\n    borderRadius: \"50%\",\n    background: \"#1c1c1e\",\n    flexShrink: 0,\n  } as const;\n\n  if (logo && !failed) {\n    return (\n      <img\n        src={logo}\n        alt={ticker}\n        onError={() => setFailed(true)}\n        style={{ ...base, objectFit: \"contain\", padding: 4, boxSizing: \"border-box\" }}\n      />\n    );\n  }\n\n  return (\n    <div style={{ ...base, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: theme.strong, fontWeight: 700, fontSize: 11 }}>\n      {ticker.slice(0, 3)}\n    </div>\n  );\n};\n","import { Mover, MoversTheme } from \"../types\";\nimport { MoverLogo } from \"./MoverLogo\";\n\ntype Props = {\n  mover: Mover;\n  theme: MoversTheme;\n  last: boolean;\n  onClick?: (mover: Mover) => void;\n};\n\nfunction formatPrice(v: number): string {\n  return v >= 1000 ? v.toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) : v.toFixed(2);\n}\n\nexport const MoverRow: React.FC<Props> = ({\n  mover,\n  theme,\n  last,\n  onClick,\n}) => {\n  const down = mover.changePct < 0;\n  const color = down ? theme.down : theme.up;\n  const sign = down ? \"\" : \"+\";\n\n  const content = (\n    <>\n      <MoverLogo ticker={mover.ticker} logo={mover.logo} theme={theme} />\n      <div style={{ flex: 1, minWidth: 0 }}>\n        <div style={{ color: theme.strong, fontWeight: 700, fontSize: 15 }}>{mover.ticker}</div>\n        <div style={{ color: theme.text, fontSize: 12, whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" }}>\n          {mover.name}\n        </div>\n      </div>\n      <div style={{ textAlign: \"right\", whiteSpace: \"nowrap\" }}>\n        <div style={{ color: theme.strong, fontWeight: 600, fontSize: 15 }}>{formatPrice(mover.price)}</div>\n        <div style={{ color, fontSize: 12, fontWeight: 600 }}>\n          {sign}\n          {mover.changeAbs.toFixed(2)} {sign}\n          {mover.changePct.toFixed(2)}%\n        </div>\n      </div>\n    </>\n  );\n\n  const rowStyle: React.CSSProperties = {\n    width: \"100%\",\n    display: \"flex\",\n    alignItems: \"center\",\n    gap: 12,\n    padding: \"10px 0\",\n    border: \"none\",\n    borderBottom: last ? \"none\" : `1px solid ${theme.divider}`,\n    background: \"transparent\",\n    color: \"inherit\",\n    font: \"inherit\",\n    textAlign: \"left\",\n    boxSizing: \"border-box\",\n  };\n\n  if (!onClick) return <div style={rowStyle}>{content}</div>;\n\n  return (\n    <button\n      type=\"button\"\n      onClick={() => onClick(mover)}\n      aria-label={`Open details for ${mover.name}`}\n      style={{ ...rowStyle, cursor: \"pointer\" }}\n    >\n      {content}\n    </button>\n  );\n};\n","export type Mover = {\n  ticker: string;\n  name: string;\n  price: number;\n  changeAbs: number;\n  changePct: number;\n  logo: string | null;\n};\n\nexport const MOVERS_LISTS = [\"active\", \"gainers\", \"losers\"] as const;\nexport type MoversList = (typeof MOVERS_LISTS)[number];\n\nexport type MoversTheme = {\n  background: string;\n  text: string;\n  strong: string;\n  up: string;\n  down: string;\n  divider: string;\n};\n","import { MOVERS_LISTS, MoversList, MoversTheme } from \"../types\";\nimport { TopMoversDictionary } from \"../../../../types/Dictionary\";\nimport { isLightColor } from \"../../../../utils/colors\";\n\ntype Props = {\n  value: MoversList;\n  onChange: (list: MoversList) => void;\n  theme: MoversTheme;\n  translations: TopMoversDictionary;\n};\n\nexport const MoversTabs: React.FC<Props> = ({ value, onChange, theme, translations }) => {\n  const activeBg = \"#1c1c1e\";\n  const isBgLight = isLightColor(activeBg);\n  const activeTextColor = isBgLight\n    ? (isLightColor(theme.strong) ? \"#000000\" : theme.strong)\n    : \"#ffffff\";\n\n  return (\n    <div style={{ display: \"flex\", gap: 6 }}>\n      {MOVERS_LISTS.map((l) => {\n        const on = l === value;\n        return (\n          <button\n            key={l}\n            onClick={() => onChange(l)}\n            style={{\n              padding: \"6px 14px\",\n              borderRadius: 8,\n              border: \"none\",\n              cursor: \"pointer\",\n              background: on ? activeBg : \"transparent\",\n              color: on ? activeTextColor : theme.text,\n              fontSize: 14,\n              fontWeight: 600,\n            }}\n          >\n            {translations[l]}\n          </button>\n        );\n      })}\n    </div>\n  );\n};\n\n","import { Mover, MoversList } from \"./types\";\n\nconst LOGO = \"https://api-v4.fcsapi.com/assets/logos/stock\";\n\nexport const SAMPLE_MOVERS: Record<MoversList, Mover[]> = {\n  active: [\n    { ticker: \"NVDA\", name: \"NVIDIA Corporation\", price: 204.65, changeAbs: -2.76, changePct: -1.33, logo: `${LOGO}/nv/nvidia.svg` },\n    { ticker: \"INTC\", name: \"Intel Corporation\", price: 121.1, changeAbs: 4.05, changePct: 3.46, logo: `${LOGO}/in/intel.svg` },\n    { ticker: \"AAPL\", name: \"Apple Inc.\", price: 295.95, changeAbs: -3.29, changePct: -1.1, logo: `${LOGO}/ap/apple.svg` },\n    { ticker: \"TSLA\", name: \"Tesla, Inc.\", price: 396.38, changeAbs: -8.28, changePct: -2.05, logo: `${LOGO}/te/tesla.svg` },\n    { ticker: \"AMZN\", name: \"Amazon.com, Inc.\", price: 237.5, changeAbs: -8.5, changePct: -3.46, logo: `${LOGO}/am/amazon.svg` },\n    { ticker: \"NFLX\", name: \"Netflix, Inc.\", price: 76.96, changeAbs: -1.76, changePct: -2.24, logo: `${LOGO}/ne/netflix.svg` },\n  ],\n  gainers: [\n    { ticker: \"MRNA\", name: \"Moderna, Inc.\", price: 61.8, changeAbs: 6.4, changePct: 11.55, logo: `${LOGO}/mo/moderna.svg` },\n    { ticker: \"HOOD\", name: \"Robinhood Markets, Inc.\", price: 105.2, changeAbs: 8.49, changePct: 8.78, logo: `${LOGO}/ro/robinhood.svg` },\n    { ticker: \"AVGO\", name: \"Broadcom Inc.\", price: 392.9, changeAbs: 16.19, changePct: 4.3, logo: `${LOGO}/av/avgo.svg` },\n    { ticker: \"AMAT\", name: \"Applied Materials, Inc.\", price: 592.92, changeAbs: 24.69, changePct: 4.35, logo: `${LOGO}/ap/applied-materials.svg` },\n    { ticker: \"MRVL\", name: \"Marvell Technology, Inc.\", price: 289.54, changeAbs: 10.87, changePct: 3.9, logo: `${LOGO}/ma/marvell-tech.svg` },\n    { ticker: \"DELL\", name: \"Dell Technologies Inc.\", price: 419.32, changeAbs: 15.24, changePct: 3.77, logo: `${LOGO}/de/dell.svg` },\n  ],\n  losers: [\n    { ticker: \"CVNA\", name: \"Carvana Co.\", price: 62.86, changeAbs: -7.18, changePct: -10.25, logo: `${LOGO}/ca/carvana.svg` },\n    { ticker: \"APP\", name: \"Applovin Corporation\", price: 479.49, changeAbs: -35.71, changePct: -6.93, logo: `${LOGO}/ap/applovin.svg` },\n    { ticker: \"NDAQ\", name: \"Nasdaq, Inc.\", price: 83.29, changeAbs: -6.0, changePct: -6.72, logo: `${LOGO}/na/nasdaq.svg` },\n    { ticker: \"EL\", name: \"Estee Lauder Companies\", price: 82.46, changeAbs: -5.12, changePct: -5.85, logo: `${LOGO}/es/estee-lauder.svg` },\n    { ticker: \"NOW\", name: \"ServiceNow, Inc.\", price: 95.48, changeAbs: -5.85, changePct: -5.77, logo: `${LOGO}/se/servicenow.svg` },\n    { ticker: \"ACN\", name: \"Accenture plc\", price: 156.01, changeAbs: -9.51, changePct: -5.75, logo: `${LOGO}/ac/accenture.svg` },\n  ],\n};\n","import { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { MoversTheme } from \"./types\";\n\nfunction withAlpha(color: string, alpha: number): string | null {\n  const m = color.trim().match(/^#([0-9a-f]{6})$/i);\n  if (!m) return null;\n  const n = parseInt(m[1], 16);\n  return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;\n}\n\nexport function resolveMoversTheme(styles: WidgetStyle): MoversTheme {\n  const background = styles.main_background || \"#0d0d0f\";\n  const strong = styles.main_text_color || \"#ffffff\";\n  return {\n    background,\n    strong,\n    text: withAlpha(strong, 0.55) ?? \"#8e8e93\",\n    divider: withAlpha(strong, 0.12) ?? \"rgba(255, 255, 255, 0.08)\",\n    up: \"#34c759\",\n    down: \"#ff453a\",\n  };\n}\n","\"use client\";\n\nimport { NewsCategory } from \"../../News2/constants\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport { News3Tokens } from \"../tokens\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface Props {\n  onTopic: (cat: NewsCategory) => void;\n  styleTokens: News3Tokens;\n  translations: NewsDictionary;\n}\n\nconst TOPICS: NewsCategory[] = [\"all\", \"forex\", \"stock\", \"crypto\", \"cmd\", \"worldec\", \"regec\"];\n\nexport const PopularTopics: React.FC<Props> = ({ onTopic, styleTokens, translations }) => {\n  return (\n    <div\n      style={{\n        background: styleTokens.cardBackground,\n        border: styleTokens.cardBorder,\n        borderRadius: styleTokens.cardRounded,\n        padding: 18,\n        fontFamily: styleTokens.uiFontFamily,\n      }}\n    >\n      <div\n        style={{\n          color: styleTokens.headlineColor,\n          fontWeight: 700,\n          fontSize: 15,\n          marginBottom: 12,\n        }}\n      >\n        {translations.popularTopics}\n      </div>\n      <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n        {TOPICS.map((topic) => (\n          <button\n            key={topic}\n            type=\"button\"\n            onClick={() => onTopic(topic)}\n            style={{\n              padding: \"6px 12px\",\n              borderRadius: 999,\n              border: `1px solid ${alpha(styleTokens.headlineColor, 0.15)}`,\n              background: alpha(styleTokens.headlineColor, 0.04),\n              color: styleTokens.excerptColor,\n              fontSize: 13,\n              fontFamily: styleTokens.uiFontFamily,\n              cursor: \"pointer\",\n            }}\n          >\n            {translations.categories[topic]}\n          </button>\n        ))}\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport type Hls from \"hls.js\";\nimport { News3Tokens } from \"../tokens\";\n\ninterface Props {\n  mediaUrl?: string | null;\n  ctaUrl?: string | null;\n  styleTokens: News3Tokens;\n}\n\nconst VIDEO_EXTENSIONS = [\".mp4\", \".webm\", \".ogv\", \".ogg\", \".mov\", \".m4v\"] as const;\n\n// Streaming hosts whose URLs carry no file extension. Matched on hostname only —\n// substring-matching the whole URL made any link containing \"stream\"/\"video\"/\"play/\"\n// render as a video, which blanked ordinary images.\nconst HLS_HOSTS = [\"streamvault\"] as const;\n\n// WHY: query strings (\"…/promo.mp4?v=2\") break a naive endsWith, so compare the\n// path alone. Relative/malformed values fall back to the raw string.\nfunction urlParts(url: string): { path: string; host: string } {\n  try {\n    const parsed = new URL(url, \"https://placeholder.invalid\");\n    return { path: parsed.pathname.toLowerCase(), host: parsed.hostname.toLowerCase() };\n  } catch {\n    return { path: url, host: \"\" };\n  }\n}\n\nexport function isHlsUrl(url?: string | null): boolean {\n  if (!url) return false;\n  const clean = url.trim().toLowerCase();\n  if (clean.includes(\"application/x-mpegurl\") || clean.includes(\"vnd.apple.mpegurl\")) return true;\n  const { path, host } = urlParts(clean);\n  return path.endsWith(\".m3u8\") || HLS_HOSTS.some((h) => host.includes(h));\n}\n\nexport function isVideoUrl(url?: string | null): boolean {\n  if (!url) return false;\n  const clean = url.trim().toLowerCase();\n  if (clean.startsWith(\"data:video\")) return true;\n  if (isHlsUrl(clean)) return true;\n  const { path } = urlParts(clean);\n  return VIDEO_EXTENSIONS.some((ext) => path.endsWith(ext));\n}\n\nexport const NewsPromoBanner: React.FC<Props> = ({ mediaUrl, ctaUrl, styleTokens }) => {\n  const videoRef = useRef<HTMLVideoElement | null>(null);\n\n  const cleanMediaUrl = mediaUrl?.trim() || \"\";\n  const isVideo = isVideoUrl(cleanMediaUrl);\n  const isHls = isHlsUrl(cleanMediaUrl);\n\n  useEffect(() => {\n    const video = videoRef.current;\n    if (!video || !isVideo || !cleanMediaUrl) return;\n\n    let cancelled = false;\n    let instance: Hls | null = null;\n\n    // Safari plays HLS natively, so a plain src is the fallback for both\n    // progressive files and unsupported-hls.js environments.\n    const playDirect = () => {\n      video.src = cleanMediaUrl;\n      video.play().catch(() => {});\n    };\n\n    if (!isHls) {\n      playDirect();\n      return;\n    }\n\n    import(\"hls.js\")\n      .then(({ default: HlsCtor }) => {\n        if (cancelled) return;\n        if (!HlsCtor?.isSupported()) return playDirect();\n\n        instance = new HlsCtor({\n          autoStartLoad: true,\n          capLevelToPlayerSize: true,\n          enableWorker: true,\n        });\n        instance.loadSource(cleanMediaUrl);\n        instance.attachMedia(video);\n        instance.on(HlsCtor.Events.MANIFEST_PARSED, () => {\n          video.play().catch(() => {});\n        });\n        instance.on(HlsCtor.Events.ERROR, (_event, data) => {\n          if (!data?.fatal) return;\n          if (data.type === HlsCtor.ErrorTypes.NETWORK_ERROR) instance?.startLoad();\n          else if (data.type === HlsCtor.ErrorTypes.MEDIA_ERROR) instance?.recoverMediaError();\n          else instance?.destroy();\n        });\n      })\n      .catch(playDirect);\n\n    return () => {\n      cancelled = true;\n      instance?.destroy();\n    };\n  }, [cleanMediaUrl, isVideo, isHls]);\n\n  if (!cleanMediaUrl) return null;\n\n  const href = ctaUrl?.trim() || undefined;\n\n  const containerStyle: React.CSSProperties = {\n    position: \"relative\",\n    width: \"100%\",\n    maxWidth: \"352px\",\n    aspectRatio: \"1 / 1\",\n    borderRadius: styleTokens.cardRounded || \"14px\",\n    border: styleTokens.cardBorder,\n    backgroundColor: styleTokens.cardBackground,\n    overflow: \"hidden\",\n    display: \"block\",\n    boxSizing: \"border-box\",\n    cursor: href ? \"pointer\" : \"default\",\n  };\n\n  const linkStyle: React.CSSProperties = {\n    display: \"block\",\n    width: \"100%\",\n    height: \"100%\",\n    borderRadius: \"inherit\",\n    textDecoration: \"none\",\n  };\n\n  const mediaStyle: React.CSSProperties = {\n    width: \"100%\",\n    height: \"100%\",\n    objectFit: \"cover\",\n    display: \"block\",\n    borderRadius: \"inherit\",\n    pointerEvents: \"none\",\n  };\n\n  const media = isVideo ? (\n    <video ref={videoRef} autoPlay loop muted playsInline style={mediaStyle} />\n  ) : (\n    <img src={cleanMediaUrl} alt=\"Promotional Content\" loading=\"lazy\" style={mediaStyle} />\n  );\n\n  // WHY: the <a> renders whether or not there's a CTA (hrefless = inert). Swapping\n  // between <a>{media}</a> and a bare {media} changes the tree shape, which remounts\n  // the <video> — and the effect above sets .src imperatively, so the remounted\n  // element came back blank the moment a CTA link was typed.\n  return (\n    <div style={containerStyle} className=\"nf-v3-promo-banner\">\n      <a\n        href={href}\n        target={href ? \"_blank\" : undefined}\n        rel=\"noopener noreferrer\"\n        style={linkStyle}\n      >\n        {media}\n      </a>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport { NewsCategory } from \"../../News2/constants\";\nimport { TopMovers } from \"../../TopMovers\";\nimport { News3Tokens } from \"../tokens\";\nimport { PopularTopics } from \"./PopularTopics\";\nimport { NewsPromoBanner } from \"./NewsPromoBanner\";\nimport { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface Props {\n  onTopic: (cat: NewsCategory) => void;\n  styleTokens: News3Tokens;\n  dev?: boolean;\n  lang: string;\n  translations: NewsDictionary;\n}\n\nexport const NewsAside: React.FC<Props> = ({ onTopic, styleTokens, dev, lang, translations }) => (\n  <div\n    style={{\n      display: \"flex\",\n      flexDirection: \"column\",\n      gap: 28,\n      position: \"sticky\",\n      top: 16,\n      minWidth: 0,\n    }}\n  >\n    <TopMovers\n      styles={\n        {\n          main_background: styleTokens.cardBackground,\n          main_text_color: styleTokens.headlineColor,\n          lang,\n        } as WidgetStyle\n      }\n      dev={dev}\n    />\n    <PopularTopics onTopic={onTopic} styleTokens={styleTokens} translations={translations} />\n    {styleTokens.promoEnabled && (\n      <NewsPromoBanner\n        mediaUrl={styleTokens.promoMediaUrl}\n        ctaUrl={styleTokens.promoCtaUrl}\n        styleTokens={styleTokens}\n      />\n    )}\n  </div>\n);\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport Branded from \"../../Branded\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { News4Content } from \"./News4Content\";\nimport { resolveNews4Config } from \"./model/resolveNews4Config\";\n\ninterface Props {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n  dev?: boolean;\n}\n\nexport function News4({ styles, size, dev }: Props): JSX.Element {\n  const config = resolveNews4Config(styles);\n\n  useEffect(() => {\n    loadGoogleFont(styles.news_v2_font_family ?? \"Playfair Display\");\n  }, [styles.news_v2_font_family]);\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"news\" size={size} hideCta>\n        <News4Content\n          lang={styles.lang}\n          brandName={styles.brand_name}\n          {...config}\n          dev={dev}\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { StockAsset } from \"../../charts/StockWidget/types\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport type { NewsArticle } from \"../../../types/news\";\nimport {\n  CATEGORY_LABELS,\n  type NewsCategory,\n  type NewsCategoryKey,\n} from \"../News2/constants\";\nimport { pickReadable } from \"../News2/utils/contrast\";\nimport { DashboardHeader } from \"./components/navigation/DashboardHeader\";\nimport { useNews4Feed } from \"./hooks/useNews4Feed\";\nimport type { News4Tokens, News4View } from \"./model/types\";\nimport { ArticleView } from \"./views/ArticleView\";\nimport { LiveUpdatesView } from \"./views/LiveUpdatesView\";\nimport { MainView } from \"./views/MainView\";\nimport { StockDetailsView } from \"./views/StockDetailsView\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\nimport { LiveUpdatesProvider } from \"../../widgets/LiveUpdates/LiveUpdatesContext\";\n\ntype Props = {\n  lang: string;\n  brandName: string;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  showCategories: boolean;\n  featuredShowChart: boolean;\n  categoryColors: Record<NewsCategoryKey, string>;\n  styleTokens: News4Tokens;\n  dev?: boolean;\n};\n\nconst FALLBACK_CATEGORY_COLOR = \"#6B7280\";\nconst MAIN_VIEW: News4View = { type: \"main\" };\n\nexport function News4Content({\n  lang,\n  brandName,\n  showShare,\n  showReadingTime,\n  showDate,\n  showCategories,\n  featuredShowChart,\n  categoryColors,\n  styleTokens,\n  dev,\n}: Props) {\n  const [category, setCategory] = useState<NewsCategory>(\"all\");\n  const [searchQuery, setSearchQuery] = useState(\"\");\n  const [view, setView] = useState<News4View>(MAIN_VIEW);\n  const translations = useMemo(\n    () => getDictionarySection(lang, \"news\"),\n    [lang],\n  );\n\n  const feed = useNews4Feed({ lang, category, searchQuery });\n\n  const colorFor = (articleCategory: string): string =>\n    (categoryColors as Record<string, string>)[articleCategory] ??\n    FALLBACK_CATEGORY_COLOR;\n\n  const labelFor = (article: NewsArticle): string =>\n    (translations.categories as Record<string, string>)[article.itemCategory] ??\n    (CATEGORY_LABELS as Record<string, string>)[article.itemCategory] ??\n    article.tag;\n\n  const showMainView = () => setView(MAIN_VIEW);\n  const showArticle = (article: NewsArticle) =>\n    setView({ type: \"article\", article });\n  const showLiveUpdates = () => setView({ type: \"live-updates\" });\n  const showStockDetails = (asset: StockAsset) =>\n    setView({ type: \"stock-details\", asset });\n\n  const handleCategoryChange = (nextCategory: NewsCategory) => {\n    setCategory(nextCategory);\n    showMainView();\n  };\n\n  const handleSearchChange = (query: string) => {\n    setSearchQuery(query);\n    showMainView();\n  };\n\n  const pageStyle: CSSProperties = {\n    width: \"100%\",\n    minWidth: 0,\n    boxSizing: \"border-box\",\n    containerType: \"inline-size\",\n    background: styleTokens.pageBackground,\n    color: pickReadable(styleTokens.pageBackground),\n    fontFamily: styleTokens.fontFamily,\n  };\n\n  const content = (() => {\n    switch (view.type) {\n      case \"article\":\n        return (\n          <ArticleView\n            article={view.article}\n            articles={feed.articles}\n            lang={lang}\n            showShare={showShare}\n            showReadingTime={showReadingTime}\n            showDate={showDate}\n            categoryColor={colorFor(view.article.itemCategory)}\n            categoryLabel={labelFor(view.article)}\n            styleTokens={styleTokens}\n            onBack={showMainView}\n            onSelect={showArticle}\n            translations={translations}\n          />\n        );\n\n      case \"live-updates\":\n        return (\n          <LiveUpdatesView\n            lang={lang}\n            styleTokens={styleTokens}\n            onBack={showMainView}\n            onStockSelect={showStockDetails}\n            translations={translations}\n          />\n        );\n\n      case \"stock-details\":\n        return (\n          <StockDetailsView\n            asset={view.asset}\n            styleTokens={styleTokens}\n            onBack={showMainView}\n            dev={dev}\n            lang={lang}\n            translations={translations}\n          />\n        );\n\n      case \"main\":\n        if (feed.isLoading && feed.articles.length === 0) {\n          return (\n            <div\n              style={{\n                display: \"flex\",\n                justifyContent: \"center\",\n                padding: \"120px 0\",\n              }}\n            >\n              <FancyLoader />\n            </div>\n          );\n        }\n\n        return (\n          <MainView\n            lang={lang}\n            featuredArticle={feed.featuredArticle}\n            visibleArticles={feed.visibleArticles}\n            showShare={showShare}\n            showReadingTime={showReadingTime}\n            showDate={showDate}\n            featuredShowChart={featuredShowChart}\n            styleTokens={styleTokens}\n            canLoadMore={feed.canLoadMore}\n            isLoadingMore={feed.isLoadingMore}\n            isSearching={feed.isSearching}\n            colorFor={colorFor}\n            labelFor={labelFor}\n            onArticleSelect={showArticle}\n            onOpenLiveUpdates={showLiveUpdates}\n            onStockSelect={showStockDetails}\n            onLoadMore={() => void feed.showMore()}\n            dev={dev}\n            translations={translations}\n          />\n        );\n    }\n  })();\n\n  return (\n    <LiveUpdatesProvider lang={lang}>\n      <div style={pageStyle}>\n        <DashboardHeader\n          active={category}\n          onCategoryChange={handleCategoryChange}\n          searchQuery={searchQuery}\n          onSearchChange={handleSearchChange}\n          showCategories={showCategories}\n          styleTokens={styleTokens}\n          translations={translations}\n        />\n        {content}\n      </div>\n    </LiveUpdatesProvider>\n  );\n}\n","\"use client\";\n\nimport { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\nimport { useBrandedColors } from \"../../../../Branded\";\nimport { NewsTabs } from \"./NewsTabs\";\nimport { NewsCategory } from \"../../../News2/constants\";\nimport { alpha } from \"../../../News2/utils/contrast\";\nimport { News4Tokens } from \"../../model/types\";\nimport type { NewsDictionary } from \"../../../../../types/Dictionary\";\n\ninterface Props {\n  active: NewsCategory;\n  onCategoryChange: (next: NewsCategory) => void;\n  searchQuery: string;\n  onSearchChange: (q: string) => void;\n  showCategories: boolean;\n  styleTokens: News4Tokens;\n  translations: NewsDictionary;\n}\n\nexport const DashboardHeader: React.FC<Props> = ({\n  active,\n  onCategoryChange,\n  searchQuery,\n  onSearchChange,\n  showCategories,\n  styleTokens,\n  translations,\n}) => {\n  const font = styleTokens.uiFontFamily;\n  const text = styleTokens.headlineColor;\n\n  return (\n    <div\n      className=\"nf-dash-header\"\n      style={{\n        display: \"flex\",\n        alignItems: \"between\",\n        flexWrap: \"wrap\",\n        gap: 28,\n        width: \"100%\",\n        boxSizing: \"border-box\",\n        paddingBottom: 12,\n        marginBottom: 12,\n        borderBottom: `1px solid ${alpha(text, 0.1)}`,\n        fontFamily: font,\n        color: text,\n      }}\n    >\n      <style>{`@media (max-width: 640px) {\n        .nf-dash-header { padding: 12px 14px !important; gap: 12px !important; }\n        .nf-dash-tabs { flex: 1 1 100% !important; justify-content: flex-start !important; overflow-x: auto; }\n        .nf-dash-search { max-width: none !important; flex: 1 1 100% !important; }\n      }`}</style>\n      {showCategories && (\n        <div\n          className=\"nf-dash-tabs\"\n          style={{\n            flex: \"1 1 auto\",\n            minWidth: 0,\n            display: \"flex\",\n          }}\n        >\n          <NewsTabs\n            active={active}\n            onChange={onCategoryChange}\n            textColor={styleTokens.metaColor}\n            activeColor={styleTokens.headlineColor}\n            accentColor={styleTokens.accentColor}\n            fontFamily={font}\n            translations={translations}\n          />\n        </div>\n      )}\n\n      <label\n        className=\"nf-dash-search\"\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: 8,\n          background: alpha(text, 0.05),\n          border: `1px solid ${alpha(text, 0.1)}`,\n          borderRadius: 999,\n          padding: \"8px 14px\",\n          maxWidth: 300,\n          flexShrink: 0,\n        }}\n      >\n        <HiOutlineMagnifyingGlass\n          size={16}\n          style={{ opacity: 0.5, flexShrink: 0 }}\n        />\n        <input\n          type=\"text\"\n          value={searchQuery}\n          onChange={(e) => onSearchChange(e.target.value)}\n          placeholder={translations.searchPlaceholder}\n          aria-label={translations.searchLabel}\n          style={{\n            background: \"transparent\",\n            border: \"none\",\n            outline: \"none\",\n            fontSize: 13,\n            color: \"inherit\",\n            width: 210,\n            fontFamily: font,\n          }}\n        />\n        <kbd\n          aria-hidden=\"true\"\n          style={{\n            flexShrink: 0,\n            minWidth: 18,\n            height: 18,\n            padding: \"0 5px\",\n            borderRadius: 4,\n            border: `1px solid ${alpha(text, 0.2)}`,\n            color: alpha(text, 0.5),\n            fontSize: 11,\n            fontFamily: font,\n            display: \"inline-flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n          }}\n        >\n          /\n        </kbd>\n      </label>\n    </div>\n  );\n};\n","\"use client\";\n\nimport {\n  CATEGORY_LABELS,\n  NEWS_CATEGORIES,\n  NewsCategory,\n} from \"../../../News2/constants\";\nimport type { NewsDictionary } from \"../../../../../types/Dictionary\";\n\ninterface Props {\n  active: NewsCategory;\n  onChange: (next: NewsCategory) => void;\n  textColor: string;\n  activeColor: string;\n  accentColor: string;\n  fontFamily: string;\n  translations: NewsDictionary;\n}\n\nexport const NewsTabs: React.FC<Props> = ({\n  active,\n  onChange,\n  textColor,\n  activeColor,\n  accentColor,\n  fontFamily,\n  translations,\n}) => (\n  <div\n    className=\"nv4-tabs\"\n    role=\"tablist\"\n    aria-label={translations.articleCategoriesLabel}\n    style={{ display: \"flex\", gap: 30, overflowX: \"auto\", fontFamily }}\n  >\n    <style>{`.nv4-tabs::-webkit-scrollbar{display:none}.nv4-tabs{scrollbar-width:none;-ms-overflow-style:none}`}</style>\n    {NEWS_CATEGORIES.map((c) => {\n      const isActive = c === active;\n      return (\n        <button\n          key={c}\n          type=\"button\"\n          role=\"tab\"\n          aria-selected={isActive}\n          onClick={() => onChange(c)}\n          style={{\n            background: \"transparent\",\n            border: \"none\",\n            padding: \"6px 0\",\n            fontFamily,\n            fontSize: 14.5,\n            fontWeight: isActive ? 600 : 500,\n            color: isActive ? activeColor : textColor,\n            borderBottom: `2px solid ${isActive ? accentColor : \"transparent\"}`,\n            cursor: \"pointer\",\n            whiteSpace: \"nowrap\",\n            transition: \"color 160ms ease-out\",\n          }}\n        >\n          {translations.categories[c] ?? (c === \"all\" ? \"All\" : CATEGORY_LABELS[c])}\n        </button>\n      );\n    })}\n  </div>\n);\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { NewsArticle } from \"../../../../types/news\";\nimport { fetchNewsArticles } from \"../../News/functions/fetchNewsArticles\";\nimport {\n  ARTICLES_PER_PAGE,\n  type NewsCategory,\n} from \"../../News2/constants\";\n\nconst INITIAL_VISIBLE = 5;\n\ntype Params = {\n  lang: string;\n  category: NewsCategory;\n  searchQuery: string;\n};\n\nexport function useNews4Feed({ lang, category, searchQuery }: Params) {\n  const [articles, setArticles] = useState<NewsArticle[]>([]);\n  const [offset, setOffset] = useState(0);\n  const [visibleCount, setVisibleCount] = useState(INITIAL_VISIBLE);\n  const [isLoading, setIsLoading] = useState(true);\n  const [isLoadingMore, setIsLoadingMore] = useState(false);\n  const [hasMore, setHasMore] = useState(true);\n  const articleRequestRef = useRef(0);\n\n  useEffect(() => {\n    const request = ++articleRequestRef.current;\n    setIsLoading(true);\n    setArticles([]);\n    setOffset(0);\n    setHasMore(true);\n    setVisibleCount(INITIAL_VISIBLE);\n\n    void (async () => {\n      try {\n        const result = await fetchNewsArticles(\n          lang,\n          0,\n          ARTICLES_PER_PAGE,\n          category,\n        );\n        if (request !== articleRequestRef.current) return;\n\n        const batch = result ?? [];\n        setArticles(batch);\n        setOffset(batch.length);\n        setHasMore(batch.length >= ARTICLES_PER_PAGE);\n      } catch {\n        if (request === articleRequestRef.current) {\n          setArticles([]);\n          setHasMore(false);\n        }\n      } finally {\n        if (request === articleRequestRef.current) setIsLoading(false);\n      }\n    })();\n  }, [category, lang]);\n\n  const isSearching = searchQuery.trim().length > 0;\n\n  const filteredArticles = useMemo(() => {\n    const query = searchQuery.trim().toLowerCase();\n    if (!query) return articles;\n\n    return articles.filter((article) =>\n      article.headline.toLowerCase().includes(query),\n    );\n  }, [articles, searchQuery]);\n\n  const featuredArticle = useMemo(() => {\n    if (isSearching || articles.length === 0) return null;\n    return articles[0];\n  }, [articles, isSearching]);\n\n  const listArticles = featuredArticle\n    ? filteredArticles.filter((article) => article !== featuredArticle)\n    : filteredArticles;\n  const visibleArticles = listArticles.slice(0, visibleCount);\n  const canLoadMore = visibleCount < listArticles.length || hasMore;\n\n  const loadMore = async () => {\n    if (isLoadingMore || !hasMore) return;\n    setIsLoadingMore(true);\n\n    try {\n      const result = await fetchNewsArticles(\n        lang,\n        offset,\n        ARTICLES_PER_PAGE,\n        category,\n      );\n      const batch = result ?? [];\n      setArticles((current) => [...current, ...batch]);\n      setOffset((current) => current + batch.length);\n      setHasMore(batch.length >= ARTICLES_PER_PAGE);\n    } catch {\n      // Preserve the current list and allow another load attempt.\n    } finally {\n      setIsLoadingMore(false);\n    }\n  };\n\n  const showMore = async () => {\n    if (visibleCount >= listArticles.length && hasMore) await loadMore();\n    setVisibleCount((current) => current + INITIAL_VISIBLE);\n  };\n\n  return {\n    articles,\n    featuredArticle,\n    visibleArticles,\n    isLoading,\n    isLoadingMore,\n    isSearching,\n    canLoadMore: canLoadMore && !isSearching,\n    showMore,\n  };\n}\n","\"use client\";\n\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { StockWidget } from \"../../charts/StockWidget\";\nimport type { StockAsset } from \"../../charts/StockWidget/types\";\n\ninterface Props {\n  styles: WidgetStyle;\n  assets: StockAsset[];\n  height?: number;\n  dev?: boolean;\n  fullWidth?: boolean;\n}\n\nexport function AssetPreviewContent({\n  styles,\n  assets,\n  height,\n  dev,\n  fullWidth = false,\n}: Props): JSX.Element | null {\n  if (assets.length === 0) return null;\n\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        fontFamily: styles.font_family || \"system-ui, -apple-system, sans-serif\",\n        display: \"flex\",\n        flexDirection: \"column\",\n        boxSizing: \"border-box\",\n      }}\n    >\n      <StockWidget\n        styles={styles}\n        assets={assets}\n        dev={dev}\n        height={height}\n        fullWidth={fullWidth}\n      />\n    </div>\n  );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { alpha, pickReadable } from \"../../../News2/utils/contrast\";\n\ntype Props = {\n  takeaways: string[];\n  /** Text/label color — derived from the article's own body background. */\n  onArticleBackground: string;\n  bodyFont: string;\n  background: string;\n  rounded: string;\n  border: string;\n  bulletColor: string;\n  glow: boolean;\n};\n\n/**\n * Rendered at the top of the article body when the editor supplied bullets.\n * Every visual concern is a token from the editor (with sensible defaults in\n * `resolveNews4Config`) so a brand can theme it without touching the widget.\n *\n * Silent when empty: an empty section is worse than none, because it reads as\n * a broken feature rather than a missing feature.\n */\nexport function News4KeyTakeaways({\n  takeaways,\n  onArticleBackground,\n  bodyFont,\n  background,\n  rounded,\n  border,\n  bulletColor,\n  glow,\n}: Props) {\n  if (!takeaways.length) return null;\n\n  // Label + body colors read against the page body, not the takeaways card —\n  // otherwise a transparent takeaways background produces the wrong readable\n  // pair (it would pick against the token literal \"transparent\").\n  const textColor = pickReadable(onArticleBackground);\n  const labelColor = alpha(textColor, 0.65);\n  const bulletShadow = glow\n    ? `0 0 6px ${alpha(bulletColor, 0.9)}, 0 0 14px ${alpha(bulletColor, 0.55)}`\n    : \"none\";\n\n  return (\n    <aside\n      aria-label=\"Key takeaways\"\n      style={{\n        margin: \"0 0 32px\",\n        padding: \"20px 24px\",\n        borderRadius: Math.min(Math.max(0, parseInt(rounded)), 32),\n        border,\n        background,\n      }}\n    >\n      <div\n        style={{\n          fontFamily: bodyFont,\n          fontSize: 11,\n          fontWeight: 700,\n          letterSpacing: \"0.14em\",\n          textTransform: \"uppercase\",\n          color: labelColor,\n          marginBottom: 12,\n        }}\n      >\n        Key takeaways\n      </div>\n      <ul\n        style={{\n          listStyle: \"none\",\n          padding: 0,\n          margin: 0,\n          display: \"flex\",\n          flexDirection: \"column\",\n          gap: 10,\n        }}\n      >\n        {takeaways.map((text, i) => (\n          <li\n            key={i}\n            style={{\n              position: \"relative\",\n              paddingLeft: 22,\n              fontFamily: bodyFont,\n              fontSize: 16,\n              lineHeight: 1.55,\n              color: textColor,\n            }}\n          >\n            <span\n              aria-hidden\n              style={{\n                position: \"absolute\",\n                left: 0,\n                top: \"0.55em\",\n                width: 8,\n                height: 8,\n                borderRadius: \"50%\",\n                background: bulletColor,\n                boxShadow: bulletShadow,\n              }}\n            />\n            {text}\n          </li>\n        ))}\n      </ul>\n    </aside>\n  );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { resolveCategoryAssets } from \"../../../News2/parts/NFAssetChart\";\nimport { AssetPreviewContent } from \"../../../AssetPreview/AssetPreviewContent\";\nimport { pickReadable, isLight } from \"../../../News2/utils/contrast\";\nimport { SERIF } from \"../../../News2/parts/articleConstants\";\nimport type { NewsArticle } from \"../../../../../types/news\";\nimport type { WidgetStyle } from \"../../../../../types/WidgetStyle\";\nimport { News4KeyTakeaways } from \"./News4KeyTakeaways\";\n\ntype Block =\n  | { type: \"heading\"; text: string }\n  | { type: \"blockquote\"; text: string }\n  | { type: \"paragraph\"; text: string };\n\nfunction parseBlocks(md: string): Block[] {\n  return md\n    .split(/\\n\\s*\\n/)\n    .map((raw) => raw.trim())\n    .filter(Boolean)\n    .map((chunk): Block => {\n      if (chunk.startsWith(\"## \"))\n        return { type: \"heading\", text: chunk.slice(3).trim() };\n      if (/^>\\s*/m.test(chunk))\n        return {\n          type: \"blockquote\",\n          text: chunk.replace(/^>\\s*/gm, \"\").trim(),\n        };\n      return { type: \"paragraph\", text: chunk };\n    });\n}\n\nfunction renderInline(text: string): React.ReactNode {\n  const parts: React.ReactNode[] = [];\n  const re = /\\*\\*(.+?)\\*\\*|\\*(.+?)\\*/g;\n  let lastIndex = 0;\n  let key = 0;\n  let match: RegExpExecArray | null;\n  while ((match = re.exec(text)) !== null) {\n    if (match.index > lastIndex) parts.push(text.slice(lastIndex, match.index));\n    if (match[1] !== undefined)\n      parts.push(<strong key={key++}>{match[1]}</strong>);\n    else if (match[2] !== undefined)\n      parts.push(<em key={key++}>{match[2]}</em>);\n    lastIndex = re.lastIndex;\n  }\n  if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n  return <>{parts}</>;\n}\n\n// Extracts the first visible letter for the drop cap, preserving leading inline\n// markers so the rest of the text is still valid markdown.\nfunction splitDropCap(text: string): { cap: string; rest: string } {\n  const prefixMatch = /^(\\*\\*|__|[*_])*/.exec(text);\n  const prefix = prefixMatch ? prefixMatch[0] : \"\";\n  const afterPrefix = text.slice(prefix.length);\n  if (!afterPrefix) return { cap: \"\", rest: text };\n  return { cap: afterPrefix[0], rest: prefix + afterPrefix.slice(1) };\n}\n\ntype Props = {\n  article: NewsArticle;\n  cardBackground: string;\n  bodyFont: string;\n  keyTakeaways: {\n    background: string;\n    rounded: string;\n    border: string;\n    bulletColor: string;\n    glow: boolean;\n  };\n};\n\nexport function News4ArticleBody({\n  article,\n  cardBackground,\n  bodyFont,\n  keyTakeaways,\n}: Props) {\n  const raw =\n    article.articleBodyMd?.trim() ||\n    article.articleBody?.trim() ||\n    article.content;\n  const bodyColor = pickReadable(cardBackground);\n  const blocks = parseBlocks(raw);\n\n  const firstParaIndex = blocks.findIndex((b) => b.type === \"paragraph\");\n\n  const chartTheme = isLight(cardBackground) ? \"light\" : \"dark\";\n  const chartAssets = resolveCategoryAssets(\n    article.itemCategory,\n    article.assets,\n  );\n  const chartStyles = {\n    main_background: \"transparent\",\n    main_text_color: chartTheme === \"dark\" ? \"#ffffff\" : \"#111111\",\n    font_family: bodyFont,\n  } as WidgetStyle;\n\n  const takeaways = article.keyTakeaways ?? [];\n  const hasChart = chartAssets.length > 0;\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexWrap: \"wrap\",\n        alignItems: \"flex-start\",\n        gap: 32,\n        width: \"100%\",\n        margin: \"0 auto\",\n        padding: \"40px 24px 64px\",\n      }}\n    >\n      <div style={{ flex: \"1 1 480px\", minWidth: 0 }}>\n        <News4KeyTakeaways\n          takeaways={takeaways}\n          onArticleBackground={cardBackground}\n          bodyFont={bodyFont}\n          background={keyTakeaways.background}\n          rounded={keyTakeaways.rounded}\n          border={keyTakeaways.border}\n          bulletColor={keyTakeaways.bulletColor}\n          glow={keyTakeaways.glow}\n        />\n        {blocks.map((block, i) => {\n          if (block.type === \"heading\") {\n            return (\n              <h2\n                key={i}\n                style={{\n                  fontFamily: bodyFont,\n                  fontSize: 22,\n                  fontWeight: 700,\n                  lineHeight: 1.3,\n                  color: bodyColor,\n                  margin: \"36px 0 12px\",\n                }}\n              >\n                {block.text}\n              </h2>\n            );\n          }\n\n          if (block.type === \"blockquote\") {\n            return (\n              <blockquote\n                key={i}\n                style={{\n                  fontFamily: bodyFont,\n                  fontSize: 19,\n                  fontStyle: \"italic\",\n                  lineHeight: 1.7,\n                  color: bodyColor,\n                  borderLeft: `3px solid ${bodyColor}`,\n                  opacity: 0.8,\n                  margin: \"24px 0\",\n                  paddingLeft: 20,\n                }}\n              >\n                {renderInline(block.text)}\n              </blockquote>\n            );\n          }\n\n          const isFirst = i === firstParaIndex;\n          const pStyle: React.CSSProperties = {\n            fontFamily: bodyFont,\n            fontSize: 19,\n            lineHeight: 1.8,\n            color: bodyColor,\n            margin: \"0 0 24px\",\n          };\n\n          if (isFirst) {\n            const { cap, rest } = splitDropCap(block.text);\n            return (\n              <p key={i} style={pStyle}>\n                {cap && (\n                  <span\n                    style={{\n                      float: \"left\",\n                      fontFamily: SERIF,\n                      fontSize: \"3.2em\",\n                      lineHeight: 0.8,\n                      fontWeight: 700,\n                      color: bodyColor,\n                      marginRight: 8,\n                      marginTop: 4,\n                    }}\n                  >\n                    {cap}\n                  </span>\n                )}\n                {renderInline(rest)}\n              </p>\n            );\n          }\n\n          return (\n            <p key={i} style={pStyle}>\n              {renderInline(block.text)}\n            </p>\n          );\n        })}\n      </div>\n      {hasChart && (\n        <aside\n          style={{\n            flex: \"1 1 300px\",\n            position: \"sticky\",\n            top: 80,\n            alignSelf: \"flex-start\",\n          }}\n        >\n          <figure style={{ margin: 0 }}>\n            <div\n              style={{\n                background: \"rgba(119,119,119,0.2)\",\n                borderRadius: 16,\n                overflow: \"hidden\",\n              }}\n            >\n              <AssetPreviewContent\n                styles={chartStyles}\n                assets={chartAssets}\n                height={320}\n                fullWidth\n              />\n            </div>\n          </figure>\n        </aside>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { NewsArticle } from \"../../../../types/news\";\nimport { ArticleDetail } from \"../../News2/parts/ArticleDetail\";\nimport { News4ArticleBody } from \"../components/news/News4ArticleBody\";\nimport type { News4Tokens } from \"../model/types\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype Props = {\n  article: NewsArticle;\n  articles: NewsArticle[];\n  lang: string;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: News4Tokens;\n  onBack: () => void;\n  onSelect: (article: NewsArticle) => void;\n  translations: NewsDictionary;\n};\n\nexport function ArticleView({\n  article,\n  articles,\n  lang,\n  showShare,\n  showReadingTime,\n  showDate,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  onBack,\n  onSelect,\n  translations,\n}: Props) {\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        // maxWidth: 1280,\n        minWidth: 0,\n        margin: \"0 auto\",\n        padding: 20,\n        boxSizing: \"border-box\",\n      }}\n    >\n      <ArticleDetail\n        article={article}\n        onClose={onBack}\n        showShare={showShare}\n        showReadingTime={showReadingTime}\n        showDate={showDate}\n        categoryColor={categoryColor}\n        categoryLabel={categoryLabel}\n        articles={articles}\n        lang={lang}\n        translations={translations}\n        onSelect={onSelect}\n        styleTokens={{\n          cardBackground: styleTokens.cardBackground,\n          headlineColor: styleTokens.headlineColor,\n          excerptColor: styleTokens.excerptColor,\n          metaColor: styleTokens.metaColor,\n          fontFamily: styleTokens.fontFamily,\n        }}\n        bodyContent={\n          <News4ArticleBody\n            article={article}\n            cardBackground={styleTokens.cardBackground}\n            bodyFont={styleTokens.fontFamily || \"\"}\n            keyTakeaways={{\n              background: styleTokens.keyTakeawaysBackground,\n              rounded: styleTokens.keyTakeawaysRounded,\n              border: styleTokens.keyTakeawaysBorder,\n              bulletColor: styleTokens.keyTakeawaysBulletColor,\n              glow: styleTokens.keyTakeawaysGlow,\n            }}\n          />\n        }\n      />\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useId, useMemo } from \"react\";\nimport type { StockAsset } from \"../../charts/StockWidget/types\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport type { NewsDictionary } from \"../../../types/Dictionary\";\nimport { resolveMoversTheme } from \"../TopMovers/theme\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\nimport { useLiveUpdates } from \"./LiveUpdatesContext\";\nimport { FeedHeader } from \"./components/FeedHeader\";\nimport { FeedList } from \"./components/FeedList\";\nimport { UnseenBanner } from \"./components/UnseenBanner\";\nimport { LoadMoreButton } from \"./components/LoadMoreButton\";\nimport {\n  EmptyState,\n  ErrorState,\n  LoadingState,\n} from \"./components/EmptyStates\";\nimport { useInsertScrollAnchor } from \"./components/useInsertScrollAnchor\";\nimport {\n  LIVE_UPDATE_FRESH_COLOR,\n  LIVE_UPDATE_SEEN_COLOR,\n} from \"./components/liveUpdateUtils\";\n\ninterface Props {\n  styles: WidgetStyle;\n  onAssetSelect?: (asset: StockAsset) => void;\n  translations: NewsDictionary;\n}\n\nexport const LiveUpdatesContent: React.FC<Props> = ({\n  styles,\n  onAssetSelect,\n  translations,\n}) => {\n  const titleId = useId();\n  const theme = useMemo(() => resolveMoversTheme(styles), [styles]);\n  const ecoT = useMemo(\n    () => getDictionarySection(styles.lang, \"economicCalendar\"),\n    [styles.lang],\n  );\n  const feed = useLiveUpdates();\n  const { setContainerRef, unseenCount, scrollToTop } = useInsertScrollAnchor();\n\n  const dotFreshColor =\n    styles.live_updates_dot_fresh_color ?? LIVE_UPDATE_FRESH_COLOR;\n  const dotSeenColor =\n    styles.live_updates_dot_seen_color ?? LIVE_UPDATE_SEEN_COLOR;\n\n  const showLoading = feed.isLoading;\n  const showError =\n    !feed.isLoading && feed.loadError && feed.sortedFeedItems.length === 0;\n  const showEmpty =\n    !feed.isLoading && !feed.loadError && feed.sortedFeedItems.length === 0;\n  const showList = feed.sortedFeedItems.length > 0;\n  const showLoadMore =\n    !feed.isLoading && feed.sortedFeedItems.length > 0 && feed.hasMore;\n\n  return (\n    <section\n      aria-labelledby={titleId}\n      style={{\n        width: \"100%\",\n        minWidth: 0,\n        margin: \"0 auto\",\n        padding: \"18px 16px 0\",\n        boxSizing: \"border-box\",\n        color: theme.strong,\n        fontFamily: \"system-ui, -apple-system, sans-serif\",\n      }}\n    >\n      <style>{feedStyles}</style>\n\n      <UnseenBanner\n        count={unseenCount}\n        onClick={scrollToTop}\n        dotFreshColor={dotFreshColor}\n        theme={theme}\n        translations={translations}\n      />\n\n      <FeedHeader\n        theme={theme}\n        translations={translations}\n        titleId={titleId}\n      />\n\n      {showLoading && <LoadingState theme={theme} translations={translations} />}\n      {showError && (\n        <ErrorState\n          theme={theme}\n          translations={translations}\n          onRetry={() => void feed.retry()}\n        />\n      )}\n      {showEmpty && <EmptyState theme={theme} translations={translations} />}\n\n      {showList && (\n        <FeedList\n          items={feed.sortedFeedItems}\n          latestFeedKey={feed.latestFeedKey}\n          freshKeys={feed.freshKeys}\n          selectedTimeZone={feed.selectedTimeZone}\n          lang={styles.lang}\n          dotFreshColor={dotFreshColor}\n          dotSeenColor={dotSeenColor}\n          theme={theme}\n          styles={styles}\n          ecoT={ecoT}\n          translations={translations}\n          onAssetSelect={onAssetSelect}\n          containerRef={setContainerRef}\n        />\n      )}\n\n      {showLoadMore && (\n        <LoadMoreButton\n          onClick={() => void feed.loadEarlier()}\n          isLoading={feed.isLoadingMore}\n          dotFreshColor={dotFreshColor}\n          theme={theme}\n          translations={translations}\n        />\n      )}\n    </section>\n  );\n};\n\nconst feedStyles = `\n  .lu-feed-sort:hover,\n  .lu-feed-load:hover,\n  .lu-feed-new:hover {\n    opacity: 0.85;\n  }\n  .lu-feed-sort:focus-visible,\n  .lu-feed-load:focus-visible,\n  .lu-feed-new:focus-visible {\n    outline: 2px solid currentColor;\n    outline-offset: 3px;\n  }\n  @keyframes lu-new-in {\n    from { opacity: 0; transform: translate(-50%, -6px); }\n    to { opacity: 1; transform: translate(-50%, 0); }\n  }\n  .lu-feed-row {\n    display: grid;\n    grid-template-columns: 30px 58px minmax(0, 1fr);\n    min-width: 0;\n  }\n  @media (max-width: 520px) {\n    .lu-feed-row {\n      grid-template-columns: 26px minmax(0, 1fr);\n      column-gap: 8px;\n    }\n    .lu-feed-row > :nth-child(1) {\n      grid-row: 1 / span 2;\n      grid-column: 1;\n    }\n    .lu-feed-row > :nth-child(2) {\n      grid-row: 1;\n      grid-column: 2;\n      flex-direction: row !important;\n      align-items: center !important;\n      justify-content: flex-start !important;\n      gap: 8px !important;\n      padding-top: 0 !important;\n    }\n    .lu-feed-row-content {\n      grid-row: 2;\n      grid-column: 2;\n      padding-right: 8px !important;\n      margin-top: 4px;\n    }\n  }\n`;\n","\"use client\";\n\nimport {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport type { LiveUpdate } from \"../../../types/news\";\nimport type { EcoCal } from \"../../../types/EcoCal\";\nimport { fetchLiveUpdates } from \"../News4/api/fetchLiveUpdates\";\nimport { fetchEconomicCalendar } from \"../../../functions/fetchEconomicData\";\nimport {\n  liveUpdateDateValue,\n  liveUpdateKey,\n  mergeUniqueLiveUpdates,\n} from \"./components/liveUpdateUtils\";\nimport {\n  feedItemDateValue,\n  feedItemKey,\n  formatDateForApi,\n} from \"./components/eventUtils\";\nimport type {\n  LiveFeedItem,\n  LiveUpdateInsertHandler,\n  LiveUpdateSortOrder,\n  LiveUpdatesVersion,\n} from \"./types\";\n\nconst PAGE_SIZE = 10;\nconst REFRESH_INTERVAL_MS = 10_000;\nconst AUTO_INSERT_MIN_MS = 5_000;\nconst AUTO_INSERT_MAX_MS = 20_000;\n\nexport interface LiveUpdatesContextValue {\n  version: LiveUpdatesVersion;\n  latestItem: LiveUpdate | null;\n  previewUpdates: LiveUpdate[];\n  sortedFeedItems: LiveFeedItem[];\n  freshKeys: ReadonlySet<string>;\n  latestFeedKey: string | null;\n  loadEarlier: () => Promise<void>;\n  hasMore: boolean;\n  isLoading: boolean;\n  isLoadingMore: boolean;\n  loadError: boolean;\n  retry: () => void;\n  sortOrder: LiveUpdateSortOrder;\n  toggleSortOrder: () => void;\n  registerInsertHandler: (handler: LiveUpdateInsertHandler | null) => void;\n  selectedTimeZone: string;\n  setSelectedTimeZone: (zone: string) => void;\n}\n\nfunction getDefaultTimeZone(): string {\n  try {\n    return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n  } catch {\n    return \"UTC\";\n  }\n}\n\nconst LiveUpdatesContext = createContext<LiveUpdatesContextValue | null>(null);\n\nexport function useLiveUpdates(): LiveUpdatesContextValue {\n  const ctx = useContext(LiveUpdatesContext);\n  if (!ctx)\n    throw new Error(\"useLiveUpdates must be used inside LiveUpdatesProvider\");\n  return ctx;\n}\n\ninterface LiveUpdatesProviderProps {\n  lang: string;\n  version?: LiveUpdatesVersion;\n  children: React.ReactNode;\n}\n\nexport function LiveUpdatesProvider({\n  lang,\n  version = \"v1\",\n  children,\n}: LiveUpdatesProviderProps) {\n  const includesEvents = version === \"v2\";\n\n  const [newsItems, setNewsItems] = useState<LiveUpdate[]>([]);\n  const [events, setEvents] = useState<\n    EcoCal.EconomicEventWithTranslation[]\n  >([]);\n  const [freshKeys, setFreshKeys] = useState<ReadonlySet<string>>(new Set());\n  const [sortOrder, setSortOrder] = useState<LiveUpdateSortOrder>(\"newest\");\n  const [selectedTimeZone, setSelectedTimeZone] = useState<string>(() =>\n    typeof window !== \"undefined\" ? getDefaultTimeZone() : \"UTC\",\n  );\n\n  useEffect(() => {\n    setSelectedTimeZone((current) => {\n      const detected = getDefaultTimeZone();\n      return current === \"UTC\" && detected !== \"UTC\" ? detected : current;\n    });\n  }, []);\n\n  const [nextOffset, setNextOffset] = useState(0);\n  const [hasMore, setHasMore] = useState(true);\n  const [isLoading, setIsLoading] = useState(true);\n  const [isLoadingMore, setIsLoadingMore] = useState(false);\n  const [loadError, setLoadError] = useState(false);\n\n  const mountedRef = useRef(true);\n  const generationRef = useRef(0);\n  const knownNewsKeysRef = useRef(new Set<string>());\n  const knownEventIdsRef = useRef(new Set<number>());\n  const pendingRef = useRef<LiveUpdate[]>([]);\n  const insertTimerRef = useRef<number | null>(null);\n  const insertHandlerRef = useRef<LiveUpdateInsertHandler | null>(null);\n  const oldestBoundaryRef = useRef<number>(Date.now());\n\n  const cancelInsertTimer = useCallback(() => {\n    if (insertTimerRef.current !== null) {\n      window.clearTimeout(insertTimerRef.current);\n      insertTimerRef.current = null;\n    }\n  }, []);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n      cancelInsertTimer();\n    };\n  }, [cancelInsertTimer]);\n\n  const fetchEventsInRange = useCallback(\n    async (fromMs: number, toMs: number) => {\n      if (!includesEvents) return [];\n      const cappedTo = Math.min(toMs, Date.now());\n      if (fromMs >= cappedTo) return [];\n      const fetched = await fetchEconomicCalendar(\n        lang,\n        formatDateForApi(new Date(fromMs)),\n        formatDateForApi(new Date(cappedTo)),\n      );\n      return fetched ?? [];\n    },\n    [lang, includesEvents],\n  );\n\n  const insertOne = useCallback((update: LiveUpdate) => {\n    const key = `news:${liveUpdateKey(update)}`;\n    const commit = insertHandlerRef.current?.();\n    flushSync(() => {\n      setNewsItems((current) => mergeUniqueLiveUpdates(current, [update]));\n      setFreshKeys(new Set([key]));\n    });\n    commit?.();\n  }, []);\n\n  const scheduleNextInsert = useCallback(() => {\n    if (insertTimerRef.current !== null) return;\n    if (pendingRef.current.length === 0) return;\n\n    const delay =\n      AUTO_INSERT_MIN_MS +\n      Math.random() * (AUTO_INSERT_MAX_MS - AUTO_INSERT_MIN_MS);\n\n    insertTimerRef.current = window.setTimeout(() => {\n      insertTimerRef.current = null;\n      if (!mountedRef.current) return;\n      const next = pendingRef.current.shift();\n      if (next) insertOne(next);\n      scheduleNextInsert();\n    }, delay);\n  }, [insertOne]);\n\n  const loadInitial = useCallback(async () => {\n    const generation = ++generationRef.current;\n    cancelInsertTimer();\n    setIsLoading(true);\n    setLoadError(false);\n    setNewsItems([]);\n    setEvents([]);\n    setFreshKeys(new Set());\n    setNextOffset(0);\n    setHasMore(true);\n    knownNewsKeysRef.current = new Set();\n    knownEventIdsRef.current = new Set();\n    pendingRef.current = [];\n    oldestBoundaryRef.current = Date.now();\n\n    try {\n      const news = await fetchLiveUpdates(lang, 0, PAGE_SIZE);\n      if (!mountedRef.current || generation !== generationRef.current) return;\n\n      const previousBoundary = oldestBoundaryRef.current;\n      const oldestNewsTime =\n        news.length > 0\n          ? Math.min(...news.map((u) => liveUpdateDateValue(u.dateTime)))\n          : previousBoundary;\n\n      const eventsInRange = await fetchEventsInRange(\n        oldestNewsTime,\n        previousBoundary,\n      );\n      if (!mountedRef.current || generation !== generationRef.current) return;\n\n      news.forEach((u) => knownNewsKeysRef.current.add(liveUpdateKey(u)));\n      eventsInRange.forEach((event) => knownEventIdsRef.current.add(event.id));\n\n      flushSync(() => {\n        setNewsItems(news);\n        setNextOffset(news.length);\n        setHasMore(news.length >= PAGE_SIZE);\n        setEvents(eventsInRange);\n      });\n\n      oldestBoundaryRef.current = oldestNewsTime;\n    } catch {\n      if (mountedRef.current && generation === generationRef.current) {\n        setLoadError(true);\n      }\n    } finally {\n      if (mountedRef.current && generation === generationRef.current) {\n        setIsLoading(false);\n      }\n    }\n  }, [lang, cancelInsertTimer, fetchEventsInRange]);\n\n  useEffect(() => {\n    void loadInitial();\n  }, [loadInitial]);\n\n  const checkForNewUpdates = useCallback(async () => {\n    const generation = generationRef.current;\n\n    try {\n      const latest = await fetchLiveUpdates(lang, 0, PAGE_SIZE);\n      if (!mountedRef.current || generation !== generationRef.current) return;\n\n      const unseen = latest.filter(\n        (u) => !knownNewsKeysRef.current.has(liveUpdateKey(u)),\n      );\n      if (unseen.length === 0) return;\n\n      unseen.forEach((u) => knownNewsKeysRef.current.add(liveUpdateKey(u)));\n      const sorted = [...unseen].sort(\n        (a, b) =>\n          liveUpdateDateValue(a.dateTime) - liveUpdateDateValue(b.dateTime),\n      );\n      pendingRef.current = [...pendingRef.current, ...sorted];\n      setNextOffset((offset) => offset + unseen.length);\n      scheduleNextInsert();\n    } catch {\n      // Polling failures should not clear the visible feed.\n    }\n  }, [lang, scheduleNextInsert]);\n\n  useEffect(() => {\n    const interval = window.setInterval(() => {\n      void checkForNewUpdates();\n    }, REFRESH_INTERVAL_MS);\n    return () => window.clearInterval(interval);\n  }, [checkForNewUpdates]);\n\n  const loadEarlier = useCallback(async () => {\n    if (isLoadingMore || !hasMore) return;\n    const generation = generationRef.current;\n    setIsLoadingMore(true);\n\n    try {\n      const previousBoundary = oldestBoundaryRef.current;\n      const news = await fetchLiveUpdates(lang, nextOffset, PAGE_SIZE);\n      if (!mountedRef.current || generation !== generationRef.current) return;\n\n      const oldestNewsTime =\n        news.length > 0\n          ? Math.min(...news.map((u) => liveUpdateDateValue(u.dateTime)))\n          : previousBoundary;\n\n      const eventsInRange = await fetchEventsInRange(\n        oldestNewsTime,\n        previousBoundary,\n      );\n      if (!mountedRef.current || generation !== generationRef.current) return;\n\n      news.forEach((u) => knownNewsKeysRef.current.add(liveUpdateKey(u)));\n      const fresh = eventsInRange.filter(\n        (event) => !knownEventIdsRef.current.has(event.id),\n      );\n      fresh.forEach((event) => knownEventIdsRef.current.add(event.id));\n\n      flushSync(() => {\n        setNewsItems((current) => mergeUniqueLiveUpdates(current, news));\n        setNextOffset((offset) => offset + news.length);\n        setHasMore(news.length >= PAGE_SIZE);\n        if (fresh.length > 0) {\n          setEvents((current) => [...current, ...fresh]);\n        }\n      });\n\n      oldestBoundaryRef.current = oldestNewsTime;\n    } catch {\n      // Preserve the existing feed and allow another load attempt.\n    } finally {\n      if (mountedRef.current) setIsLoadingMore(false);\n    }\n  }, [lang, nextOffset, isLoadingMore, hasMore, fetchEventsInRange]);\n\n  const latestItem = useMemo(() => {\n    if (newsItems.length === 0) return null;\n    return newsItems.reduce((latest, u) =>\n      liveUpdateDateValue(u.dateTime) > liveUpdateDateValue(latest.dateTime)\n        ? u\n        : latest,\n    );\n  }, [newsItems]);\n\n  const previewUpdates = useMemo(\n    () =>\n      [...newsItems]\n        .sort(\n          (a, b) =>\n            liveUpdateDateValue(b.dateTime) - liveUpdateDateValue(a.dateTime),\n        )\n        .slice(0, 3),\n    [newsItems],\n  );\n\n  const sortedFeedItems = useMemo(() => {\n    const items: LiveFeedItem[] = [\n      ...newsItems.map<LiveFeedItem>((news) => ({ kind: \"news\", news })),\n      ...events.map<LiveFeedItem>((event) => ({ kind: \"event\", event })),\n    ];\n    items.sort((a, b) => {\n      const diff = feedItemDateValue(b) - feedItemDateValue(a);\n      return sortOrder === \"newest\" ? diff : -diff;\n    });\n    return items;\n  }, [newsItems, events, sortOrder]);\n\n  const latestFeedKey = useMemo(() => {\n    if (!latestItem) return null;\n    return feedItemKey({ kind: \"news\", news: latestItem });\n  }, [latestItem]);\n\n  const registerInsertHandler = useCallback(\n    (handler: LiveUpdateInsertHandler | null) => {\n      insertHandlerRef.current = handler;\n    },\n    [],\n  );\n\n  const toggleSortOrder = useCallback(() => {\n    setSortOrder((current) => (current === \"newest\" ? \"oldest\" : \"newest\"));\n  }, []);\n\n  const value: LiveUpdatesContextValue = {\n    version,\n    latestItem,\n    previewUpdates,\n    sortedFeedItems,\n    freshKeys,\n    latestFeedKey,\n    loadEarlier,\n    hasMore,\n    isLoading,\n    isLoadingMore,\n    loadError,\n    retry: loadInitial,\n    sortOrder,\n    toggleSortOrder,\n    registerInsertHandler,\n    selectedTimeZone,\n    setSelectedTimeZone,\n  };\n\n  return (\n    <LiveUpdatesContext.Provider value={value}>\n      {children}\n    </LiveUpdatesContext.Provider>\n  );\n}\n\nexport type { LiveUpdateSortOrder } from \"./types\";\n","import type { LiveUpdate } from \"../../../../types/news\";\nimport { WIDGET_API_BASE } from \"../../../../utils/widgetApiBase\";\n\nexport async function fetchLiveUpdates(\n    lang: string,\n    offset: number,\n    limit: number,\n): Promise<LiveUpdate[]> {\n    const url = `${WIDGET_API_BASE}/api/widgets/news/live-updates`;\n\n    try {\n        const response = await fetch(url, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({ lang, offset, limit }),\n        });\n        const updates: LiveUpdate[] | { error: string } = await response.json();\n        if ('error' in updates) {\n            throw new Error(updates.error);\n        }\n        return updates;\n    } catch (error) {\n        console.error('Error fetching live updates:', error);\n        throw error;\n    }\n}\n","import type { LiveUpdate } from \"../../../../types/news\";\n\nexport const LIVE_UPDATE_FRESH_COLOR = \"#00ff2f\";\nexport const LIVE_UPDATE_SEEN_COLOR = \"#009617\";\n\nconst CATEGORY_COLORS = [\n  \"#ff6b35\",\n  \"#9acb45\",\n  \"#4d9cff\",\n  \"#23c9c9\",\n  \"#a979ff\",\n] as const;\n\nexport function liveUpdateKey(update: LiveUpdate): string {\n  return `${update.dateTime}|${update.assetSymbol}|${update.headline}`;\n}\n\nfunction parseLiveUpdateDate(dateTime: string): Date {\n  const hasTimezone = /(Z|[+-]\\d{2}:?\\d{2})$/.test(dateTime);\n  const iso = hasTimezone ? dateTime : `${dateTime.replace(\" \", \"T\")}Z`;\n  return new Date(iso);\n}\n\nexport function liveUpdateDateValue(dateTime: string): number {\n  const value = parseLiveUpdateDate(dateTime).getTime();\n  return Number.isNaN(value) ? 0 : value;\n}\n\nexport function formatLiveUpdateTime(\n  dateTime: string,\n  timeZone?: string,\n): string {\n  const date = parseLiveUpdateDate(dateTime);\n  if (Number.isNaN(date.getTime())) return dateTime;\n\n  return new Intl.DateTimeFormat(\"en-US\", {\n    timeZone,\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n    hour12: false,\n  }).format(date);\n}\n\nexport function liveUpdateDateKey(\n  dateTime: string,\n  timeZone?: string,\n): string {\n  const date = parseLiveUpdateDate(dateTime);\n  if (Number.isNaN(date.getTime())) return dateTime;\n\n  const parts = new Intl.DateTimeFormat(\"en-CA\", {\n    timeZone,\n    year: \"numeric\",\n    month: \"2-digit\",\n    day: \"2-digit\",\n  }).formatToParts(date);\n\n  const year = parts.find((p) => p.type === \"year\")?.value ?? \"\";\n  const month = parts.find((p) => p.type === \"month\")?.value ?? \"\";\n  const day = parts.find((p) => p.type === \"day\")?.value ?? \"\";\n  return `${year}-${month}-${day}`;\n}\n\nexport function formatLiveUpdateDate(\n  dateTime: string,\n  timeZone?: string,\n  locale?: string,\n): string {\n  const date = parseLiveUpdateDate(dateTime);\n  if (Number.isNaN(date.getTime())) return dateTime;\n\n  return new Intl.DateTimeFormat(locale || undefined, {\n    timeZone,\n    weekday: \"long\",\n    day: \"numeric\",\n    month: \"long\",\n    year: \"numeric\",\n  }).format(date);\n}\n\nexport function liveUpdateCategoryColor(category: string): string {\n  const hash = [...category].reduce(\n    (total, character) => total + character.charCodeAt(0),\n    0,\n  );\n  return CATEGORY_COLORS[hash % CATEGORY_COLORS.length];\n}\n\nexport function mergeUniqueLiveUpdates(\n  current: LiveUpdate[],\n  incoming: LiveUpdate[],\n): LiveUpdate[] {\n  const seen = new Set<string>();\n\n  return [...incoming, ...current].filter((update) => {\n    const key = liveUpdateKey(update);\n    if (seen.has(key)) return false;\n    seen.add(key);\n    return true;\n  });\n}\n","import type { EcoCal } from \"../../../../types/EcoCal\";\nimport type { LiveFeedItem } from \"../types\";\nimport { liveUpdateDateValue, liveUpdateKey } from \"./liveUpdateUtils\";\n\nexport function parseEventDate(raw: Date | string): Date {\n  if (raw instanceof Date) return raw;\n  const hasTimezone = /(Z|[+-]\\d{2}:?\\d{2})$/.test(raw);\n  const iso = hasTimezone ? raw : `${raw.replace(\" \", \"T\")}Z`;\n  return new Date(iso);\n}\n\nexport function eventDateValue(\n  event: EcoCal.EconomicEventWithTranslation,\n): number {\n  const value = parseEventDate(event.event_datetime).getTime();\n  return Number.isNaN(value) ? 0 : value;\n}\n\nexport function eventDateIso(\n  event: EcoCal.EconomicEventWithTranslation,\n): string {\n  const date = parseEventDate(event.event_datetime);\n  return Number.isNaN(date.getTime())\n    ? String(event.event_datetime)\n    : date.toISOString();\n}\n\nexport function feedItemDateValue(item: LiveFeedItem): number {\n  if (item.kind === \"news\") return liveUpdateDateValue(item.news.dateTime);\n  return eventDateValue(item.event);\n}\n\nexport function feedItemIso(item: LiveFeedItem): string {\n  return item.kind === \"news\" ? item.news.dateTime : eventDateIso(item.event);\n}\n\nexport function feedItemKey(item: LiveFeedItem): string {\n  if (item.kind === \"news\") return `news:${liveUpdateKey(item.news)}`;\n  return `event:${item.event.id}`;\n}\n\nfunction pad(n: number): string {\n  return n.toString().padStart(2, \"0\");\n}\n\nexport function formatDateForApi(date: Date): string {\n  return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(\n    date.getUTCDate(),\n  )} ${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(\n    date.getUTCSeconds(),\n  )}`;\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FiChevronDown } from \"react-icons/fi\";\nimport Branded from \"../../../Branded\";\nimport {\n  fallbackTimeZones,\n  formatTimeInZone,\n  formatZoneLabel,\n} from \"../../../../utils/datesAndTimes\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\nimport { useLiveUpdates } from \"../LiveUpdatesContext\";\n\nconst allTimeZones = Intl.supportedValuesOf?.(\"timeZone\") || fallbackTimeZones;\n\ninterface Props {\n  theme: MoversTheme;\n  translations: NewsDictionary;\n  titleId: string;\n}\n\nexport const FeedHeader: React.FC<Props> = ({\n  theme,\n  translations,\n  titleId,\n}) => {\n  const { sortOrder, toggleSortOrder, selectedTimeZone, setSelectedTimeZone } =\n    useLiveUpdates();\n\n  const [now, setNow] = useState(() => new Date());\n\n  useEffect(() => {\n    const interval = window.setInterval(() => setNow(new Date()), 60_000);\n    return () => window.clearInterval(interval);\n  }, []);\n\n  const timeZoneOptions = useMemo(\n    () =>\n      allTimeZones.map((zone) => ({\n        value: zone,\n        label: formatZoneLabel(zone, now),\n        content: (\n          <div\n            style={{\n              display: \"flex\",\n              justifyContent: \"space-between\",\n              width: \"100%\",\n            }}\n          >\n            <span>{formatZoneLabel(zone, now)}</span>\n            <span style={{ opacity: 0.6 }}>{formatTimeInZone(zone, now)}</span>\n          </div>\n        ),\n      })),\n    [now],\n  );\n\n  return (\n    <header\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"space-between\",\n        gap: 16,\n        marginBottom: 6,\n      }}\n    >\n      <div style={{ minWidth: 180 }}>\n        <Branded.Dropdown\n          label={formatZoneLabel(selectedTimeZone, now)}\n          items={timeZoneOptions}\n          onSelect={(value) => setSelectedTimeZone(value as string)}\n          selected={selectedTimeZone}\n          searchable\n        />\n      </div>\n    </header>\n  );\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\nimport type { Dictionary } from \"../../../../types/Dictionary\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\nimport { LiveUpdateRow } from \"./LiveUpdateRow\";\nimport { CalendarEventRow } from \"./CalendarEventRow\";\nimport { formatLiveUpdateDate, liveUpdateDateKey } from \"./liveUpdateUtils\";\nimport { feedItemIso, feedItemKey } from \"./eventUtils\";\nimport type { LiveFeedItem } from \"../types\";\n\ninterface Props {\n  items: LiveFeedItem[];\n  latestFeedKey: string | null;\n  freshKeys: ReadonlySet<string>;\n  selectedTimeZone: string;\n  lang: string;\n  dotFreshColor: string;\n  dotSeenColor: string;\n  theme: MoversTheme;\n  styles: WidgetStyle;\n  ecoT: Dictionary[\"economicCalendar\"];\n  translations: NewsDictionary;\n  onAssetSelect?: (asset: StockAsset) => void;\n  containerRef: (el: HTMLDivElement | null) => void;\n}\n\nexport const FeedList: React.FC<Props> = ({\n  items,\n  latestFeedKey,\n  freshKeys,\n  selectedTimeZone,\n  lang,\n  dotFreshColor,\n  dotSeenColor,\n  theme,\n  styles,\n  ecoT,\n  translations,\n  onAssetSelect,\n  containerRef,\n}) => {\n  const groups = useMemo(() => {\n    const out: { key: string; label: string; items: LiveFeedItem[] }[] = [];\n    for (const item of items) {\n      const iso = feedItemIso(item);\n      const key = liveUpdateDateKey(iso, selectedTimeZone);\n      const last = out[out.length - 1];\n      if (!last || last.key !== key) {\n        out.push({\n          key,\n          label: formatLiveUpdateDate(iso, selectedTimeZone, lang),\n          items: [item],\n        });\n      } else {\n        last.items.push(item);\n      }\n    }\n    return out;\n  }, [items, selectedTimeZone, lang]);\n\n  return (\n    <div ref={containerRef} style={{ position: \"relative\" }}>\n      <span\n        aria-hidden=\"true\"\n        style={{\n          position: \"absolute\",\n          top: 0,\n          bottom: 0,\n          left: 13,\n          width: 1,\n          background: theme.divider,\n        }}\n      />\n\n      {groups.map((group) => (\n        <div key={group.key} style={{ position: \"relative\" }}>\n          <div\n            className=\"lu-feed-date\"\n            style={{\n              position: \"sticky\",\n              top: 0,\n              zIndex: 5,\n              padding: \"10px 0 8px\",\n              background: theme.background,\n              color: theme.strong,\n              fontSize: 12,\n              fontWeight: 700,\n              letterSpacing: 0.4,\n              textTransform: \"uppercase\",\n            }}\n          >\n            {group.label}\n          </div>\n\n          {group.items.map((item) => {\n            const key = feedItemKey(item);\n            if (item.kind === \"news\") {\n              return (\n                <LiveUpdateRow\n                  key={key}\n                  update={item.news}\n                  isLatest={key === latestFeedKey}\n                  isFresh={freshKeys.has(key)}\n                  dotFreshColor={dotFreshColor}\n                  dotSeenColor={dotSeenColor}\n                  theme={theme}\n                  onAssetSelect={onAssetSelect}\n                  translations={translations}\n                  selectedTimeZone={selectedTimeZone}\n                />\n              );\n            }\n            return (\n              <CalendarEventRow\n                key={key}\n                event={item.event}\n                isFresh={freshKeys.has(key)}\n                dotFreshColor={dotFreshColor}\n                dotSeenColor={dotSeenColor}\n                theme={theme}\n                styles={styles}\n                ecoT={ecoT}\n                selectedTimeZone={selectedTimeZone}\n              />\n            );\n          })}\n        </div>\n      ))}\n    </div>\n  );\n};\n","import type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport type { LiveUpdate } from \"../../../../types/news\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport {\n  formatLiveUpdateTime,\n  LIVE_UPDATE_FRESH_COLOR,\n  LIVE_UPDATE_SEEN_COLOR,\n  liveUpdateCategoryColor,\n  liveUpdateKey,\n} from \"./liveUpdateUtils\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype Props = {\n  update: LiveUpdate;\n  isLatest: boolean;\n  isFresh: boolean;\n  dotFreshColor?: string;\n  dotSeenColor?: string;\n  theme: MoversTheme;\n  onAssetSelect?: (asset: StockAsset) => void;\n  translations: NewsDictionary;\n  selectedTimeZone: string;\n};\n\nexport function LiveUpdateRow({\n  update,\n  isLatest,\n  isFresh,\n  dotFreshColor = LIVE_UPDATE_FRESH_COLOR,\n  dotSeenColor = LIVE_UPDATE_SEEN_COLOR,\n  theme,\n  onAssetSelect,\n  translations,\n  selectedTimeZone,\n}: Props) {\n  const color = liveUpdateCategoryColor(update.category);\n  const canOpenAsset = Boolean(onAssetSelect && update.assetSymbol);\n  const dotColor = isLatest || isFresh ? dotFreshColor : dotSeenColor;\n\n  const openAsset = () => {\n    if (!onAssetSelect || !update.assetSymbol) return;\n    onAssetSelect({\n      symbol: update.assetSymbol,\n      name: update.assetName || update.assetSymbol,\n      currency: \"USD\",\n    });\n  };\n\n  return (\n    <article\n      className=\"lu-feed-row\"\n      data-lu-key={liveUpdateKey(update)}\n      style={{\n        position: \"relative\",\n        padding: \"14px 0 16px\",\n        borderBottom: `1px solid ${alpha(theme.strong, 0.06)}`,\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          justifyContent: \"center\",\n          paddingTop: 9,\n        }}\n      >\n        <span\n          aria-hidden=\"true\"\n          style={{\n            position: \"relative\",\n            zIndex: 1,\n            width: 10,\n            height: 10,\n            borderRadius: \"50%\",\n            background: dotColor,\n            boxShadow: isLatest\n              ? `0 0 0 4px ${alpha(dotColor, 0.1)}, 0 0 6px ${alpha(dotColor, 0.4)}`\n              : \"none\",\n            transition: \"background 400ms ease, box-shadow 400ms ease\",\n          }}\n        />\n      </div>\n\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n        }}\n      >\n        {isLatest && (\n          <span\n            style={{\n              padding: \"3px 7px\",\n              border: `1px solid ${alpha(dotFreshColor, 0.5)}`,\n              borderRadius: 5,\n              background: alpha(dotFreshColor, 0.12),\n              color: dotFreshColor,\n              fontSize: 9,\n              fontWeight: 700,\n              lineHeight: 1.2,\n            }}\n          >\n            {translations.liveUpdates.latest}\n          </span>\n        )}\n\n        <time\n          dateTime={update.dateTime}\n          style={{\n            paddingTop: 3,\n            color: theme.text,\n            fontSize: 16,\n            fontWeight: 500,\n            lineHeight: 1.4,\n            fontVariantNumeric: \"tabular-nums\",\n          }}\n        >\n          {formatLiveUpdateTime(update.dateTime, selectedTimeZone)}\n        </time>\n      </div>\n\n      <div\n        className=\"lu-feed-row-content\"\n        style={{ minWidth: 0, paddingRight: 18 }}\n      >\n        {/* <div\n          style={{\n            display: \"flex\",\n            alignItems: \"center\",\n            flexWrap: \"wrap\",\n            gap: 8,\n            marginBottom: 6,\n          }}\n        >\n          <span\n            style={{\n              padding: \"3px 7px\",\n              border: `1px solid ${alpha(color, 0.65)}`,\n              borderRadius: 5,\n              background: alpha(color, 0.08),\n              color,\n              fontSize: 10,\n              fontWeight: 700,\n              lineHeight: 1.2,\n              textTransform: \"uppercase\",\n            }}\n          >\n            {update.category}\n          </span>\n        </div> */}\n\n        <div\n          style={{\n            display: \"flex\",\n            alignItems: \"center\",\n            flexWrap: \"wrap\",\n            gap: 8,\n          }}\n        >\n          <button\n            type=\"button\"\n            onClick={openAsset}\n            disabled={!canOpenAsset}\n            style={{\n              minWidth: 0,\n              padding: 0,\n              border: 0,\n              background: \"transparent\",\n              color: theme.strong,\n              font: \"inherit\",\n              fontSize: 16,\n              fontWeight: 650,\n              lineHeight: 1.4,\n              textAlign: \"left\",\n              cursor: canOpenAsset ? \"pointer\" : \"default\",\n            }}\n          >\n            {update.headline}\n          </button>\n        </div>\n\n        <p\n          style={{\n            margin: \"6px 0 0\",\n            color: theme.text,\n            fontSize: 13,\n            lineHeight: 1.65,\n          }}\n        >\n          {update.content}\n        </p>\n      </div>\n    </article>\n  );\n}\n","import type { EcoCal } from \"../../../../types/EcoCal\";\nimport type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport type { Dictionary } from \"../../../../types/Dictionary\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport { createUnit } from \"../../../../utils/createUnit\";\nimport { formatNumberToShort } from \"../../../../utils/numbers\";\nimport { ImpactBadge } from \"../../EconomicCalendar/parts/ImpactBadge\";\nimport {\n  formatLiveUpdateTime,\n  LIVE_UPDATE_FRESH_COLOR,\n  LIVE_UPDATE_SEEN_COLOR,\n} from \"./liveUpdateUtils\";\nimport { eventDateIso } from \"./eventUtils\";\n\ntype Props = {\n  event: EcoCal.EconomicEventWithTranslation;\n  isFresh: boolean;\n  dotFreshColor?: string;\n  dotSeenColor?: string;\n  theme: MoversTheme;\n  styles: WidgetStyle;\n  ecoT: Dictionary[\"economicCalendar\"];\n  selectedTimeZone: string;\n};\n\nexport function CalendarEventRow({\n  event,\n  isFresh,\n  dotFreshColor = LIVE_UPDATE_FRESH_COLOR,\n  dotSeenColor = LIVE_UPDATE_SEEN_COLOR,\n  theme,\n  styles,\n  ecoT,\n  selectedTimeZone,\n}: Props) {\n  const dotColor = isFresh ? dotFreshColor : dotSeenColor;\n  const title = event.translated_name || event.report_name;\n  const description = event.short_definition || event.definition || \"\";\n\n  const unit = createUnit(event.unit);\n  const actual = event.actual ? formatNumberToShort(event.actual) + unit : \"-\";\n  const forecast = event.consensus\n    ? formatNumberToShort(event.consensus) + unit\n    : \"-\";\n  const previous = event.previous\n    ? formatNumberToShort(event.previous) + unit\n    : \"-\";\n\n  const dateTimeIso = eventDateIso(event);\n  const displayTime = formatLiveUpdateTime(dateTimeIso, selectedTimeZone);\n\n  return (\n    <article\n      className=\"lu-feed-row\"\n      data-lu-key={`event:${event.id}`}\n      style={{\n        position: \"relative\",\n        padding: \"14px 0 16px\",\n        borderBottom: `1px solid ${alpha(theme.strong, 0.06)}`,\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          justifyContent: \"center\",\n          paddingTop: 9,\n        }}\n      >\n        <span\n          aria-hidden=\"true\"\n          style={{\n            position: \"relative\",\n            zIndex: 1,\n            width: 10,\n            height: 10,\n            borderRadius: \"50%\",\n            background: dotColor,\n            transition: \"background 400ms ease\",\n          }}\n        />\n      </div>\n\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n        }}\n      >\n        <time\n          dateTime={dateTimeIso}\n          style={{\n            paddingTop: 3,\n            color: theme.text,\n            fontSize: 16,\n            fontWeight: 500,\n            lineHeight: 1.4,\n            fontVariantNumeric: \"tabular-nums\",\n          }}\n        >\n          {displayTime}\n        </time>\n      </div>\n\n      <div\n        className=\"lu-feed-row-content\"\n        style={{ minWidth: 0, paddingRight: 18 }}\n      >\n        <div\n          style={{\n            display: \"flex\",\n            alignItems: \"center\",\n            gap: 10,\n            flexWrap: \"wrap\",\n          }}\n        >\n          <img\n            src={`https://flagcdn.com/w40/${event.iso_country_code.toLowerCase()}.png`}\n            alt={`${event.iso_country_code} flag`}\n            style={{\n              width: 22,\n              height: 15,\n              borderRadius: 3,\n              objectFit: \"cover\",\n            }}\n          />\n          <span\n            style={{\n              minWidth: 0,\n              color: theme.strong,\n              fontSize: 16,\n              fontWeight: 650,\n              lineHeight: 1.4,\n            }}\n          >\n            {title}\n          </span>\n          <ImpactBadge\n            impact={event.impact_description}\n            styles={styles}\n            t={ecoT}\n          />\n        </div>\n\n        {description && (\n          <p\n            style={{\n              margin: \"6px 0 0\",\n              color: theme.text,\n              fontSize: 13,\n              lineHeight: 1.65,\n            }}\n          >\n            {description}\n          </p>\n        )}\n\n        <div\n          style={{\n            marginTop: 10,\n            display: \"grid\",\n            gridTemplateColumns: \"repeat(3, minmax(0, 1fr))\",\n            gap: 8,\n            maxWidth: 480,\n          }}\n        >\n          <DataCell label={ecoT.actual} value={actual} theme={theme} />\n          <DataCell label={ecoT.forecast} value={forecast} theme={theme} />\n          <DataCell label={ecoT.previous} value={previous} theme={theme} />\n        </div>\n      </div>\n    </article>\n  );\n}\n\nfunction DataCell({\n  label,\n  value,\n  theme,\n}: {\n  label: string;\n  value: string;\n  theme: MoversTheme;\n}) {\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexDirection: \"column\",\n        gap: 2,\n        padding: \"6px 10px\",\n        border: `1px solid ${alpha(theme.strong, 0.08)}`,\n        borderRadius: 6,\n      }}\n    >\n      <span\n        style={{\n          color: theme.text,\n          fontSize: 10,\n          fontWeight: 700,\n          letterSpacing: 0.4,\n          textTransform: \"uppercase\",\n          opacity: 0.75,\n        }}\n      >\n        {label}\n      </span>\n      <span\n        style={{\n          color: theme.strong,\n          fontSize: 14,\n          fontWeight: 600,\n          fontVariantNumeric: \"tabular-nums\",\n        }}\n      >\n        {value}\n      </span>\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\n\ninterface Props {\n  count: number;\n  onClick: () => void;\n  dotFreshColor: string;\n  theme: MoversTheme;\n  translations: NewsDictionary;\n}\n\nexport const UnseenBanner: React.FC<Props> = ({\n  count,\n  onClick,\n  dotFreshColor,\n  theme,\n  translations,\n}) => {\n  if (count === 0) return null;\n\n  const label = (\n    count === 1\n      ? translations.liveUpdates.newUpdate\n      : translations.liveUpdates.newUpdates\n  ).replace(\"{count}\", String(count));\n\n  return (\n    <div\n      style={{\n        position: \"sticky\",\n        top: 8,\n        zIndex: 20,\n        height: 0,\n        pointerEvents: \"none\",\n      }}\n    >\n      <button\n        className=\"lu-feed-new\"\n        type=\"button\"\n        onClick={onClick}\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: \"50%\",\n          transform: \"translateX(-50%)\",\n          pointerEvents: \"auto\",\n          padding: \"8px 16px\",\n          border: `1px solid ${dotFreshColor}`,\n          borderRadius: 999,\n          background: theme.background,\n          color: dotFreshColor,\n          font: \"inherit\",\n          fontSize: 12,\n          fontWeight: 700,\n          cursor: \"pointer\",\n          boxShadow: `0 6px 18px ${theme.background}, 0 0 0 4px ${dotFreshColor}1a`,\n          animation: \"lu-new-in 220ms ease both\",\n          whiteSpace: \"nowrap\",\n        }}\n      >\n        ↑ {label}\n      </button>\n    </div>\n  );\n};\n","\"use client\";\n\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\n\ninterface Props {\n  onClick: () => void;\n  isLoading: boolean;\n  dotFreshColor: string;\n  theme: MoversTheme;\n  translations: NewsDictionary;\n}\n\nexport const LoadMoreButton: React.FC<Props> = ({\n  onClick,\n  isLoading,\n  dotFreshColor,\n  theme,\n  translations,\n}) => (\n  <div style={{ display: \"flex\", justifyContent: \"center\" }}>\n    <button\n      className=\"lu-feed-load\"\n      type=\"button\"\n      onClick={onClick}\n      disabled={isLoading}\n      style={{\n        width: \"100%\",\n        maxWidth: 210,\n        marginTop: -1,\n        padding: \"8px 18px\",\n        border: `1px solid ${dotFreshColor}`,\n        borderRadius: 5,\n        background: theme.background,\n        color: theme.strong,\n        font: \"inherit\",\n        fontSize: 13,\n        fontWeight: 500,\n        cursor: isLoading ? \"wait\" : \"pointer\",\n        opacity: isLoading ? 0.65 : 1,\n      }}\n    >\n      {isLoading\n        ? translations.liveUpdates.loadingEarlier\n        : translations.liveUpdates.loadEarlier}\n    </button>\n  </div>\n);\n","\"use client\";\n\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\nimport type { MoversTheme } from \"../../TopMovers/types\";\n\nconst baseStyle = {\n  padding: \"70px 0\",\n  fontSize: 13,\n  textAlign: \"center\" as const,\n};\n\nexport const LoadingState: React.FC<{\n  theme: MoversTheme;\n  translations: NewsDictionary;\n}> = ({ theme, translations }) => (\n  <div\n    role=\"status\"\n    style={{ ...baseStyle, padding: \"80px 0\", color: theme.text }}\n  >\n    {translations.liveUpdates.loading}\n  </div>\n);\n\nexport const EmptyState: React.FC<{\n  theme: MoversTheme;\n  translations: NewsDictionary;\n}> = ({ theme, translations }) => (\n  <div style={{ ...baseStyle, color: theme.text }}>\n    {translations.liveUpdates.empty}\n  </div>\n);\n\nexport const ErrorState: React.FC<{\n  theme: MoversTheme;\n  translations: NewsDictionary;\n  onRetry: () => void;\n}> = ({ theme, translations, onRetry }) => (\n  <div style={{ ...baseStyle, color: theme.text }}>\n    <div>{translations.liveUpdates.loadError}</div>\n    <button\n      type=\"button\"\n      onClick={onRetry}\n      style={{\n        marginTop: 12,\n        padding: \"7px 16px\",\n        border: `1px solid ${theme.divider}`,\n        borderRadius: 7,\n        background: \"transparent\",\n        color: theme.strong,\n        font: \"inherit\",\n        cursor: \"pointer\",\n      }}\n    >\n      {translations.liveUpdates.tryAgain}\n    </button>\n  </div>\n);\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport { useLiveUpdates } from \"../LiveUpdatesContext\";\n\nfunction findScrollableAncestor(el: HTMLElement | null): HTMLElement | null {\n  let node = el?.parentElement ?? null;\n  while (node) {\n    const style = window.getComputedStyle(node);\n    if (\n      /(auto|scroll|overlay)/.test(style.overflowY) &&\n      node.scrollHeight > node.clientHeight\n    ) {\n      return node;\n    }\n    node = node.parentElement;\n  }\n  return null;\n}\n\n/**\n * Wires up the animated list container so that inserting a new item off-screen\n * preserves the reader's scroll position and surfaces a \"N new updates\" pill.\n */\nexport function useInsertScrollAnchor() {\n  const { registerInsertHandler } = useLiveUpdates();\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const [unseenCount, setUnseenCount] = useState(0);\n\n  const [animationParent] = useAutoAnimate<HTMLDivElement>({\n    duration: 380,\n    easing: \"cubic-bezier(0.2, 0.7, 0.2, 1)\",\n  });\n\n  const setContainerRef = useCallback(\n    (el: HTMLDivElement | null) => {\n      containerRef.current = el;\n      animationParent(el);\n    },\n    [animationParent],\n  );\n\n  useEffect(() => {\n    registerInsertHandler(() => {\n      const container = containerRef.current;\n      if (!container) return () => {};\n\n      const scrollable = findScrollableAncestor(container);\n      const scrollTop = scrollable\n        ? scrollable.scrollTop\n        : window.scrollY || document.documentElement.scrollTop;\n\n      let anchor: { el: HTMLElement; top: number } | null = null;\n      const rows = container.querySelectorAll<HTMLElement>(\".lu-feed-row\");\n      for (const row of Array.from(rows)) {\n        const rect = row.getBoundingClientRect();\n        if (rect.bottom > 0) {\n          anchor = { el: row, top: rect.top };\n          break;\n        }\n      }\n\n      return () => {\n        if (!anchor || scrollTop <= 0) return;\n        const delta = anchor.el.getBoundingClientRect().top - anchor.top;\n        if (delta <= 0) return;\n        if (scrollable) {\n          scrollable.scrollTop += delta;\n        } else {\n          window.scrollBy(0, delta);\n        }\n        setUnseenCount((c) => c + 1);\n      };\n    });\n    return () => registerInsertHandler(null);\n  }, [registerInsertHandler]);\n\n  useEffect(() => {\n    if (unseenCount === 0) return;\n    const container = containerRef.current;\n    if (!container) return;\n    const scrollable = findScrollableAncestor(container);\n    const target: Window | HTMLElement = scrollable ?? window;\n\n    const onScroll = () => {\n      if (container.getBoundingClientRect().top >= 0) setUnseenCount(0);\n    };\n\n    target.addEventListener(\"scroll\", onScroll, { passive: true });\n    return () => target.removeEventListener(\"scroll\", onScroll);\n  }, [unseenCount]);\n\n  const scrollToTop = useCallback(() => {\n    const container = containerRef.current;\n    if (!container) return;\n    const scrollable = findScrollableAncestor(container);\n    const rect = container.getBoundingClientRect();\n    if (scrollable) {\n      const scrollableTop = scrollable.getBoundingClientRect().top;\n      scrollable.scrollTo({\n        top: scrollable.scrollTop + (rect.top - scrollableTop) - 12,\n        behavior: \"smooth\",\n      });\n    } else {\n      window.scrollTo({\n        top: window.scrollY + rect.top - 12,\n        behavior: \"smooth\",\n      });\n    }\n    setUnseenCount(0);\n  }, []);\n\n  return { setContainerRef, unseenCount, scrollToTop };\n}\n","import { FiArrowLeft } from \"react-icons/fi\";\nimport { alpha } from \"../../../News2/utils/contrast\";\nimport type { News4Tokens } from \"../../model/types\";\n\ntype Props = {\n  label: string;\n  onClick: () => void;\n  styleTokens: News4Tokens;\n};\n\nexport function ViewBackButton({\n  label,\n  onClick,\n  styleTokens,\n}: Props) {\n  return (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      style={{\n        display: \"inline-flex\",\n        alignItems: \"center\",\n        gap: 8,\n        marginBottom: 18,\n        padding: \"8px 12px\",\n        border: `1px solid ${alpha(styleTokens.headlineColor, 0.14)}`,\n        borderRadius: 999,\n        background: \"transparent\",\n        color: styleTokens.metaColor,\n        fontFamily: styleTokens.uiFontFamily,\n        fontSize: 13,\n        fontWeight: 600,\n        cursor: \"pointer\",\n      }}\n    >\n      <FiArrowLeft aria-hidden=\"true\" size={15} />\n      <span>{label}</span>\n    </button>\n  );\n}\n","import type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport type { News4Tokens } from \"./types\";\n\nexport function toEmbeddedWidgetStyle(\n  tokens: News4Tokens,\n  surface: \"page\" | \"card\" = \"card\",\n  lang?: string,\n): WidgetStyle {\n  return {\n    main_background:\n      surface === \"page\" ? tokens.pageBackground : tokens.cardBackground,\n    main_text_color: tokens.headlineColor,\n    font_family: tokens.fontFamily,\n    news_v2_chart_theme: tokens.chartTheme,\n    live_updates_dot_fresh_color: tokens.liveUpdatesDotFreshColor,\n    live_updates_dot_seen_color: tokens.liveUpdatesDotSeenColor,\n    lang,\n  } as WidgetStyle;\n}\n","\"use client\";\n\nimport type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport { LiveUpdatesContent } from \"../../LiveUpdates/LiveUpdatesContent\";\nimport { ViewBackButton } from \"../components/navigation/ViewBackButton\";\nimport { toEmbeddedWidgetStyle } from \"../model/toEmbeddedWidgetStyle\";\nimport type { News4Tokens } from \"../model/types\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype Props = {\n  lang: string;\n  styleTokens: News4Tokens;\n  onBack: () => void;\n  onStockSelect: (asset: StockAsset) => void;\n  translations: NewsDictionary;\n};\n\nexport function LiveUpdatesView({\n  lang,\n  styleTokens,\n  onBack,\n  onStockSelect,\n  translations,\n}: Props) {\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        maxWidth: 1280,\n        minWidth: 0,\n        margin: \"0 auto\",\n        padding: 20,\n        boxSizing: \"border-box\",\n      }}\n    >\n      <ViewBackButton\n        onClick={onBack}\n        styleTokens={styleTokens}\n        label={translations.liveUpdates.backToNews}\n      />\n      <LiveUpdatesContent\n        styles={toEmbeddedWidgetStyle(styleTokens, \"page\", lang)}\n        onAssetSelect={onStockSelect}\n        translations={translations}\n      />\n    </div>\n  );\n}\n","\"use client\";\n\nimport { FiArrowRight } from \"react-icons/fi\";\nimport { useLiveUpdates } from \"../LiveUpdatesContext\";\nimport { formatLiveUpdateTime, liveUpdateKey, LIVE_UPDATE_FRESH_COLOR } from \"./liveUpdateUtils\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\ninterface LiveUpdatesBannerProps {\n  onOpenClick: () => void;\n  translations: NewsDictionary;\n  dotFreshColor?: string;\n  cardRounded?: string;\n}\n\nexport const LiveUpdatesBanner: React.FC<LiveUpdatesBannerProps> = ({\n  onOpenClick,\n  translations,\n  dotFreshColor = LIVE_UPDATE_FRESH_COLOR,\n  cardRounded = \"9px\",\n}) => {\n  const { latestItem, selectedTimeZone } = useLiveUpdates();\n\n  if (!latestItem) return null;\n\n  return (\n    <section\n      className=\"lu-banner\"\n      aria-label={translations.liveUpdates.latestAriaLabel}\n      style={{\n        width: \"100%\",\n        minWidth: 0,\n        minHeight: 48,\n        boxSizing: \"border-box\",\n        display: \"grid\",\n        gridTemplateColumns: \"auto minmax(0, 1fr) auto\",\n        alignItems: \"stretch\",\n        overflow: \"hidden\",\n        border: `1px solid ${dotFreshColor}99`,\n        borderRadius: cardRounded,\n        background: `${dotFreshColor}12`,\n        boxShadow: `inset 0 0 18px ${dotFreshColor}0a, 0 0 12px ${dotFreshColor}14`,\n        color: \"#f5f7fb\",\n        fontFamily: \"system-ui, -apple-system, sans-serif\",\n      }}\n    >\n      <style>{`\n        @keyframes lu-banner-in {\n          from { opacity: 0; transform: translateY(5px); }\n          to { opacity: 1; transform: translateY(0); }\n        }\n        .lu-banner-status,\n        .lu-banner-content,\n        .lu-banner-open {\n          display: flex;\n          align-items: center;\n          min-width: 0;\n        }\n        .lu-banner-content {\n          gap: 28px;\n          animation: lu-banner-in 350ms ease both;\n        }\n        .lu-banner-open:hover {\n          opacity: 0.78;\n        }\n        .lu-banner-open:focus-visible {\n          outline: 2px solid currentColor;\n          outline-offset: -3px;\n        }\n        @media (max-width: 680px) {\n          .lu-banner {\n            grid-template-columns: auto minmax(0, 1fr) 42px !important;\n          }\n          .lu-banner-open {\n            justify-content: center;\n            padding: 0 !important;\n          }\n          .lu-banner-open-label {\n            display: none;\n          }\n        }\n        @media (max-width: 430px) {\n          .lu-banner-time {\n            display: none !important;\n          }\n        }\n      `}</style>\n\n      <div\n        className=\"lu-banner-status\"\n        style={{\n          gap: 10,\n          padding: \"0 18px\",\n          color: dotFreshColor,\n          fontSize: 13,\n          fontWeight: 700,\n          flexShrink: 0,\n        }}\n      >\n        <span\n          aria-hidden=\"true\"\n          style={{\n            width: 8,\n            height: 8,\n            flexShrink: 0,\n            borderRadius: \"50%\",\n            background: dotFreshColor,\n            boxShadow: `0 0 9px ${dotFreshColor}bf`,\n          }}\n        />\n        <span>{translations.liveUpdates.live}</span>\n      </div>\n\n      <div\n        key={liveUpdateKey(latestItem)}\n        className=\"lu-banner-content\"\n        style={{ overflow: \"hidden\" }}\n      >\n        <time\n          className=\"lu-banner-time\"\n          dateTime={latestItem.dateTime}\n          style={{\n            flexShrink: 0,\n            paddingRight: 0,\n            color: \"#8f95a3\",\n            fontSize: 13,\n            fontWeight: 600,\n            fontVariantNumeric: \"tabular-nums\",\n          }}\n        >\n          {formatLiveUpdateTime(latestItem.dateTime, selectedTimeZone)}\n        </time>\n\n        <div\n          title={latestItem.headline}\n          style={{\n            minWidth: 0,\n            overflow: \"hidden\",\n            color: \"#c7cad2\",\n            fontSize: 13,\n            fontWeight: 600,\n            textOverflow: \"ellipsis\",\n            whiteSpace: \"nowrap\",\n          }}\n        >\n          {latestItem.headline}\n        </div>\n      </div>\n\n      <button\n        className=\"lu-banner-open\"\n        type=\"button\"\n        onClick={onOpenClick}\n        style={{\n          gap: 8,\n          padding: \"0 20px\",\n          border: 0,\n          background: \"transparent\",\n          color: dotFreshColor,\n          font: \"inherit\",\n          fontSize: 13,\n          fontWeight: 700,\n          whiteSpace: \"nowrap\",\n          cursor: \"pointer\",\n        }}\n      >\n        <span className=\"lu-banner-open-label\">\n          {translations.liveUpdates.openFeed}\n        </span>\n        <FiArrowRight aria-hidden=\"true\" size={16} />\n      </button>\n    </section>\n  );\n};\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ComponentType, CSSProperties } from \"react\";\nimport { FiShare2 } from \"react-icons/fi\";\nimport { FaXTwitter, FaWhatsapp, FaFacebookF } from \"react-icons/fa6\";\n\ninterface Props {\n  headline: string;\n  url?: string;\n  iconColor: string;\n  borderColor: string;\n  size?: number;\n  shareLabel: string;\n}\n\ntype Share = { label: string; href: string; Icon: ComponentType<{ size?: number }>; bg: string };\n\nconst shareTargets = (headline: string, url: string): Share[] => {\n  const u = encodeURIComponent(url);\n  const t = encodeURIComponent(headline);\n  return [\n    { label: \"Facebook\", href: `https://www.facebook.com/sharer/sharer.php?u=${u}`, Icon: FaFacebookF, bg: \"#1877F2\" },\n    { label: \"WhatsApp\", href: `https://wa.me/?text=${t}%20${u}`, Icon: FaWhatsapp, bg: \"#25D366\" },\n    { label: \"X\", href: `https://twitter.com/intent/tweet?text=${t}&url=${u}`, Icon: FaXTwitter, bg: \"#000000\" },\n  ];\n};\n\nconst circle = (iconColor: string, borderColor: string, size: number): CSSProperties => ({\n  width: size,\n  height: size,\n  borderRadius: \"50%\",\n  border: `1px solid ${borderColor}`,\n  background: \"transparent\",\n  color: iconColor,\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  cursor: \"pointer\",\n  flexShrink: 0,\n});\n\nexport const ArticleActions: React.FC<Props> = ({\n  headline,\n  url,\n  iconColor,\n  borderColor,\n  size = 40,\n  shareLabel,\n}) => {\n  const [menu, setMenu] = useState(false);\n  const link = url ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n\n  return (\n    <span\n      style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8, position: \"relative\" }}\n      onClick={(e) => e.stopPropagation()}\n    >\n      <button\n        type=\"button\"\n        aria-label={shareLabel}\n        onClick={() => setMenu((m) => !m)}\n        style={circle(iconColor, borderColor, size)}\n      >\n        <FiShare2 size={size * 0.42} />\n      </button>\n\n      {menu && (\n        <span\n          style={{\n            position: \"absolute\",\n            bottom: size + 8,\n            right: 0,\n            display: \"flex\",\n            gap: 8,\n            padding: 8,\n            borderRadius: 12,\n            background: \"rgba(17,24,39,0.96)\",\n            border: \"1px solid rgba(255,255,255,0.12)\",\n            boxShadow: \"0 8px 24px rgba(0,0,0,0.4)\",\n            zIndex: 20,\n          }}\n        >\n          {shareTargets(headline, link).map((s) => (\n            <a\n              key={s.label}\n              href={s.href}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              aria-label={s.label}\n              onClick={() => setMenu(false)}\n              style={{\n                width: 34,\n                height: 34,\n                borderRadius: \"50%\",\n                background: s.bg,\n                color: \"#fff\",\n                display: \"inline-flex\",\n                alignItems: \"center\",\n                justifyContent: \"center\",\n              }}\n            >\n              <s.Icon size={15} />\n            </a>\n          ))}\n        </span>\n      )}\n    </span>\n  );\n};\n","\"use client\";\n\nimport { alpha, mix } from \"../../../News2/utils/contrast\";\n\ninterface Props {\n  color: string;\n  label: string;\n}\n\nexport const CategoryPill: React.FC<Props> = ({ color, label }) => (\n  <span\n    style={{\n      display: \"inline-block\",\n      padding: \"3px 9px\",\n      borderRadius: 6,\n      background: alpha(color, 0.18),\n      border: `1px solid ${alpha(color, 0.35)}`,\n      color: mix(color, \"#FFFFFF\", 0.35),\n      fontSize: 11,\n      fontWeight: 700,\n      letterSpacing: \"0.07em\",\n      textTransform: \"uppercase\",\n    }}\n  >\n    {label}\n  </span>\n);\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../../types/news\";\nimport { formatNewsDate } from \"../../../News2/utils/formatDate\";\nimport {\n  estimateReadingTime,\n  formatReadingTime,\n} from \"../../../News2/utils/readingTime\";\nimport { News4Tokens } from \"../../model/types\";\nimport { ArticleActions } from \"../common/ArticleActions\";\nimport { CategoryPill } from \"../common/CategoryPill\";\nimport type { NewsDictionary } from \"../../../../../types/Dictionary\";\n\ninterface Props {\n  article: NewsArticle;\n  onClick: (a: NewsArticle) => void;\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: News4Tokens;\n  lang: string;\n  translations: NewsDictionary;\n}\n\nconst META_COLOR = \"rgba(255,255,255,0.55)\";\n\nexport const HeroFeature: React.FC<Props> = ({\n  article,\n  onClick,\n  showShare,\n  showReadingTime,\n  showDate,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  lang,\n  translations,\n}) => {\n  const meta: string[] = [];\n  if (showDate) meta.push(formatNewsDate(article.dateCode, lang));\n  if (showReadingTime) {\n    const minutes = estimateReadingTime(article.articleBody ?? article.content);\n    meta.push(\n      formatReadingTime(minutes, translations.readingTime),\n    );\n  }\n\n  return (\n    <div\n      onClick={() => onClick(article)}\n      style={{\n        position: \"relative\",\n        borderRadius: styleTokens.cardRounded,\n        border: styleTokens.cardBorder,\n        overflow: \"hidden\",\n        cursor: \"pointer\",\n        height: \"100%\",\n        minHeight: 380,\n        width: \"100%\",\n      }}\n    >\n      <img\n        src={article.imageUrl}\n        alt={article.headline}\n        loading=\"lazy\"\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          width: \"100%\",\n          height: \"100%\",\n          objectFit: \"cover\",\n          borderRadius: styleTokens.cardRounded,\n          zIndex: 0,\n        }}\n      />\n      <div\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          borderRadius: styleTokens.cardRounded,\n          zIndex: 1,\n          background:\n            \"linear-gradient(to top, rgba(10,12,16,0.97) 0%, rgba(10,12,16,0.9) 22%, rgba(10,12,16,0.55) 42%, rgba(10,12,16,0) 62%)\",\n        }}\n      />\n      <div\n        style={{\n          position: \"absolute\",\n          left: 0,\n          right: 0,\n          bottom: 0,\n          padding: 28,\n          zIndex: 2,\n        }}\n      >\n        <CategoryPill color={categoryColor} label={categoryLabel} />\n        <h2\n          style={{\n            fontFamily: styleTokens.headlineFont,\n            fontSize: \"clamp(1.75rem, 2.6vw, 2.5rem)\",\n            fontWeight: 700,\n            lineHeight: 1.12,\n            letterSpacing: \"-0.01em\",\n            color: \"#fff\",\n            margin: \"14px 0 0\",\n          }}\n        >\n          {article.headline}\n        </h2>\n        {article.subheadline && (\n          <p\n            style={{\n              fontFamily: styleTokens.uiFontFamily,\n              color: \"rgba(255,255,255,0.72)\",\n              fontSize: 15,\n              lineHeight: 1.5,\n              margin: \"12px 0 0\",\n              maxWidth: 560,\n              display: \"-webkit-box\",\n              WebkitLineClamp: 2,\n              WebkitBoxOrient: \"vertical\",\n              overflow: \"hidden\",\n            }}\n          >\n            {article.subheadline}\n          </p>\n        )}\n        <div\n          style={{\n            display: \"flex\",\n            alignItems: \"center\",\n            gap: 10,\n            marginTop: 18,\n          }}\n        >\n          {meta.length > 0 && (\n            <span\n              style={{\n                color: META_COLOR,\n                fontSize: 13,\n                fontFamily: styleTokens.uiFontFamily,\n              }}\n            >\n              {meta.map((m, i) => (\n                <span key={m}>\n                  {i > 0 && (\n                    <span style={{ margin: \"0 7px\", opacity: 0.6 }}>·</span>\n                  )}\n                  {m}\n                </span>\n              ))}\n            </span>\n          )}\n          {showShare && (\n            <span style={{ marginLeft: \"auto\" }}>\n              <ArticleActions\n                headline={article.headline}\n                iconColor=\"rgba(255,255,255,0.7)\"\n                borderColor=\"rgba(255,255,255,0.25)\"\n                shareLabel={translations.share}\n              />\n            </span>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../../types/news\";\nimport { formatNewsDate } from \"../../../News2/utils/formatDate\";\nimport {\n  estimateReadingTime,\n  formatReadingTime,\n} from \"../../../News2/utils/readingTime\";\nimport { alpha } from \"../../../News2/utils/contrast\";\nimport { News4Tokens } from \"../../model/types\";\nimport { ArticleActions } from \"../common/ArticleActions\";\nimport { CategoryPill } from \"../common/CategoryPill\";\nimport type { NewsDictionary } from \"../../../../../types/Dictionary\";\n\ntype Variant = \"lead\" | \"compact\";\n\ninterface Props {\n  article: NewsArticle;\n  onClick: (a: NewsArticle) => void;\n  showDate: boolean;\n  showReadingTime: boolean;\n  showShare: boolean;\n  categoryColor: string;\n  categoryLabel: string;\n  styleTokens: News4Tokens;\n  divider: boolean;\n  variant: Variant;\n  lang: string;\n  translations: NewsDictionary;\n}\n\nconst SIZES = {\n  lead: {\n    thumb: 280,\n    headline: \"1.4rem\",\n    excerptClamp: 2,\n    pad: \"22px 0\",\n    gap: 20,\n  },\n  compact: {\n    thumb: 160,\n    headline: \"1.05rem\",\n    excerptClamp: 1,\n    pad: \"18px 0\",\n    gap: 16,\n  },\n} as const;\n\nexport const StoryRow: React.FC<Props> = ({\n  article,\n  onClick,\n  showDate,\n  showReadingTime,\n  showShare,\n  categoryColor,\n  categoryLabel,\n  styleTokens,\n  divider,\n  variant,\n  lang,\n  translations,\n}) => {\n  const s = SIZES[variant];\n  const meta: string[] = [];\n  if (showDate) meta.push(formatNewsDate(article.dateCode, lang));\n  if (showReadingTime) {\n    const minutes = estimateReadingTime(article.articleBody ?? article.content);\n    meta.push(\n      formatReadingTime(minutes, translations.readingTime),\n    );\n  }\n\n  return (\n    <div\n      onClick={() => onClick(article)}\n      style={{\n        display: \"flex\",\n        gap: s.gap,\n        padding: s.pad,\n        borderBottom: divider\n          ? `1px solid ${alpha(styleTokens.headlineColor, 0.12)}`\n          : \"none\",\n        cursor: \"pointer\",\n        alignItems: \"flex-start\",\n      }}\n    >\n      <div\n        style={{\n          flexShrink: 0,\n          width: s.thumb,\n          maxWidth: variant === \"lead\" ? \"44%\" : \"38%\",\n          aspectRatio: \"16 / 10\",\n          borderRadius: styleTokens.cardRounded,\n          overflow: \"hidden\",\n        }}\n      >\n        <img\n          src={article.imageUrl}\n          alt={article.headline}\n          loading=\"lazy\"\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            objectFit: \"cover\",\n            display: \"block\",\n          }}\n        />\n      </div>\n\n      <div style={{ minWidth: 0, flex: 1 }}>\n        <CategoryPill color={categoryColor} label={categoryLabel} />\n        <h3\n          style={{\n            fontFamily: styleTokens.headlineFont,\n            fontSize: s.headline,\n            fontWeight: 700,\n            lineHeight: 1.25,\n            letterSpacing: \"-0.01em\",\n            color: styleTokens.headlineColor,\n            margin: \"8px 0 0\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 2,\n            WebkitBoxOrient: \"vertical\",\n            overflow: \"hidden\",\n          }}\n        >\n          {article.headline}\n        </h3>\n        {article.subheadline && (\n          <p\n            style={{\n              fontFamily: styleTokens.uiFontFamily,\n              color: styleTokens.excerptColor,\n              fontSize: variant === \"lead\" ? 14 : 13,\n              lineHeight: 1.5,\n              margin: \"6px 0 0\",\n              display: \"-webkit-box\",\n              WebkitLineClamp: s.excerptClamp,\n              WebkitBoxOrient: \"vertical\",\n              overflow: \"hidden\",\n            }}\n          >\n            {article.subheadline}\n          </p>\n        )}\n        <div\n          style={{\n            display: \"flex\",\n            alignItems: \"center\",\n            gap: 10,\n            marginTop: 10,\n          }}\n        >\n          {meta.length > 0 && (\n            <span\n              style={{\n                color: styleTokens.metaColor,\n                fontSize: 12,\n                fontFamily: styleTokens.uiFontFamily,\n              }}\n            >\n              {meta.map((m, i) => (\n                <span key={m}>\n                  {i > 0 && (\n                    <span style={{ margin: \"0 7px\", opacity: 0.6 }}>·</span>\n                  )}\n                  {m}\n                </span>\n              ))}\n            </span>\n          )}\n          {showShare && (\n            <span style={{ marginLeft: \"auto\" }}>\n              <ArticleActions\n                headline={article.headline}\n                iconColor={styleTokens.metaColor}\n                borderColor={alpha(styleTokens.headlineColor, 0.2)}\n                size={34}\n                shareLabel={translations.share}\n              />\n            </span>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../../types/news\";\nimport { alpha } from \"../../../News2/utils/contrast\";\nimport { News4Tokens } from \"../../model/types\";\nimport { StoryRow } from \"./StoryRow\";\nimport type { NewsDictionary } from \"../../../../../types/Dictionary\";\n\ninterface Props {\n  articles: NewsArticle[];\n  onSelect: (a: NewsArticle) => void;\n  showDate: boolean;\n  showReadingTime: boolean;\n  showShare: boolean;\n  colorFor: (cat: string) => string;\n  labelFor: (a: NewsArticle) => string;\n  styleTokens: News4Tokens;\n  hasMore: boolean;\n  loadingMore: boolean;\n  onLoadMore: () => void;\n  isSearching: boolean;\n  lang: string;\n  translations: NewsDictionary;\n}\n\nexport const StoryList: React.FC<Props> = ({\n  articles,\n  onSelect,\n  showDate,\n  showReadingTime,\n  showShare,\n  colorFor,\n  labelFor,\n  styleTokens,\n  hasMore,\n  loadingMore,\n  onLoadMore,\n  isSearching,\n  lang,\n  translations,\n}) => {\n  return (\n    <div>\n      <div\n        style={{\n          borderBottom: `1px solid ${alpha(styleTokens.headlineColor, 0.14)}`,\n          fontFamily: styleTokens.uiFontFamily,\n        }}\n      >\n        <span\n          style={{\n            display: \"inline-block\",\n            padding: \"0 0 12px\",\n            fontSize: 14,\n            fontWeight: 600,\n            color: styleTokens.headlineColor,\n            borderBottom: `3px solid ${styleTokens.accentColor}`,\n            marginBottom: -1,\n          }}\n        >\n          {translations.latestNews}\n        </span>\n      </div>\n\n      {isSearching && articles.length === 0 ? (\n        <div\n          style={{\n            textAlign: \"center\",\n            padding: \"48px 0\",\n            color: styleTokens.metaColor,\n            fontSize: 14,\n          }}\n        >\n          {translations.noSearchResults}\n        </div>\n      ) : (\n        articles.map((a, i) => (\n          <StoryRow\n            key={`${a.dateCode}-${a.headline}-${i}`}\n            article={a}\n            onClick={onSelect}\n            showDate={showDate}\n            showReadingTime={showReadingTime}\n            showShare={showShare}\n            categoryColor={colorFor(a.itemCategory)}\n            categoryLabel={labelFor(a)}\n            styleTokens={styleTokens}\n            divider={i < articles.length - 1}\n            variant={i === 0 ? \"lead\" : \"compact\"}\n            lang={lang}\n            translations={translations}\n          />\n        ))\n      )}\n\n      {hasMore && (\n        <div\n          style={{ display: \"flex\", justifyContent: \"center\", marginTop: 24 }}\n        >\n          <button\n            type=\"button\"\n            onClick={onLoadMore}\n            disabled={loadingMore}\n            style={{\n              padding: \"10px 24px\",\n              borderRadius: 999,\n              border: `1px solid ${alpha(styleTokens.headlineColor, 0.15)}`,\n              background: \"transparent\",\n              color: styleTokens.headlineColor,\n              fontFamily: styleTokens.uiFontFamily,\n              fontWeight: 600,\n              fontSize: 14,\n              cursor: loadingMore ? \"default\" : \"pointer\",\n              opacity: loadingMore ? 0.6 : 1,\n            }}\n          >\n            {loadingMore ? translations.loading : translations.loadMore}\n          </button>\n        </div>\n      )}\n    </div>\n  );\n};\n","\"use client\";\n\nimport { NewsArticle } from \"../../../../../types/news\";\nimport {\n  hasCategoryChart,\n  resolveCategoryAssets,\n} from \"../../../News2/parts/NFAssetChart\";\nimport { AssetPreviewContent } from \"../../../AssetPreview/AssetPreviewContent\";\nimport { News4Tokens } from \"../../model/types\";\nimport type { WidgetStyle } from \"../../../../../types/WidgetStyle\";\n\ninterface Props {\n  featured: NewsArticle | null;\n  show: boolean;\n  styleTokens: News4Tokens;\n  dev?: boolean;\n  lang: string;\n}\n\nexport const FeaturedAside: React.FC<Props> = ({\n  featured,\n  show,\n  styleTokens,\n  dev,\n  lang,\n}) => {\n  if (!show || !featured || !hasCategoryChart(featured.itemCategory, featured.assets)) {\n    return null;\n  }\n\n  const assets = resolveCategoryAssets(featured.itemCategory, featured.assets);\n\n  const styles = {\n    main_background: \"transparent\",\n    main_text_color: styleTokens.chartTheme === \"dark\" ? \"#ffffff\" : \"#111111\",\n    font_family: styleTokens.fontFamily,\n    news_v2_headline_color: styleTokens.headlineColor,\n    lang,\n  } as WidgetStyle;\n\n  return (\n    <div style={{ background: \"rgba(119,119,119,0.2)\", borderRadius: styleTokens.cardRounded, overflow: \"hidden\" }}>\n      <AssetPreviewContent\n        styles={styles}\n        assets={assets}\n        height={240}\n        dev={dev}\n        fullWidth\n      />\n    </div>\n  );\n};\n","\"use client\";\n\nimport { useId, useMemo } from \"react\";\nimport { useAutoAnimate } from \"@formkit/auto-animate/react\";\nimport type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport { alpha } from \"../../News2/utils/contrast\";\nimport { resolveMoversTheme } from \"../../TopMovers/theme\";\nimport { useLiveUpdates } from \"../LiveUpdatesContext\";\nimport {\n  formatLiveUpdateTime,\n  liveUpdateKey,\n  LIVE_UPDATE_FRESH_COLOR,\n  LIVE_UPDATE_SEEN_COLOR,\n} from \"./liveUpdateUtils\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\nexport interface LiveUpdatesPreviewProps {\n  onOpenClick: () => void;\n  styles: WidgetStyle;\n  translations: NewsDictionary;\n  cardRounded?: string;\n}\n\nexport const LiveUpdatesPreview: React.FC<LiveUpdatesPreviewProps> = ({\n  onOpenClick,\n  styles,\n  translations,\n  cardRounded = \"16px\",\n}) => {\n  const titleId = useId();\n  const theme = useMemo(() => resolveMoversTheme(styles), [styles]);\n  const { previewUpdates, freshKeys, latestFeedKey, selectedTimeZone } =\n    useLiveUpdates();\n  const dotFreshColor =\n    styles.live_updates_dot_fresh_color ?? LIVE_UPDATE_FRESH_COLOR;\n  const dotSeenColor =\n    styles.live_updates_dot_seen_color ?? LIVE_UPDATE_SEEN_COLOR;\n  const [animationParent] = useAutoAnimate<HTMLDivElement>({\n    duration: 380,\n    easing: \"cubic-bezier(0.2, 0.7, 0.2, 1)\",\n  });\n\n  return (\n    <section\n      aria-labelledby={titleId}\n      style={{\n        width: \"100%\",\n        minWidth: 0,\n        boxSizing: \"border-box\",\n        padding: 20,\n        overflow: \"hidden\",\n        borderRadius: cardRounded,\n        background: theme.background,\n        color: theme.strong,\n        fontFamily: \"system-ui, -apple-system, sans-serif\",\n      }}\n    >\n      <style>{`\n        @keyframes lu-preview-in {\n          from { opacity: 0; transform: translateY(4px); }\n          to { opacity: 1; transform: translateY(0); }\n        }\n        .lu-preview-row {\n          display: grid;\n          grid-template-columns: 20px 62px minmax(0, 1fr);\n          align-items: center;\n          min-height: 72px;\n          animation: lu-preview-in 280ms ease both;\n        }\n        .lu-preview-action:hover {\n          opacity: 0.78;\n        }\n        .lu-preview-action:focus-visible {\n          outline: 2px solid currentColor;\n          outline-offset: 4px;\n          border-radius: 2px;\n        }\n        @media (max-width: 380px) {\n          .lu-preview-row {\n            grid-template-columns: 20px 54px minmax(0, 1fr);\n          }\n        }\n      `}</style>\n\n      <h2\n        id={titleId}\n        style={{\n          margin: 0,\n          color: theme.strong,\n          fontSize: 18,\n          fontWeight: 700,\n          lineHeight: 1.3,\n          letterSpacing: \"-0.015em\",\n        }}\n      >\n        {translations.liveUpdates.title}\n      </h2>\n\n      <div\n        ref={animationParent}\n        style={{\n          position: \"relative\",\n          marginTop: 13,\n          marginBottom: 17,\n          padding: \"1px 0\",\n        }}\n      >\n        {previewUpdates.length > 0 && (\n          <span\n            aria-hidden=\"true\"\n            style={{\n              position: \"absolute\",\n              top: 9,\n              bottom: 9,\n              left: 7,\n              width: 1,\n              background: theme.divider,\n            }}\n          />\n        )}\n\n        {previewUpdates.map((update) => {\n          const key = liveUpdateKey(update);\n          const isLatest = key === latestFeedKey;\n          const isFresh = freshKeys.has(key);\n          const dotColor = isLatest || isFresh ? dotFreshColor : dotSeenColor;\n          return (\n            <article className=\"lu-preview-row\" key={key}>\n              <span\n                aria-hidden=\"true\"\n                style={{\n                  position: \"relative\",\n                  zIndex: 1,\n                  width: 10,\n                  height: 10,\n                  borderRadius: \"50%\",\n                  background: dotColor,\n                  boxShadow: isLatest\n                    ? `0 0 0 4px ${alpha(dotColor, 0.1)}, 0 0 6px ${alpha(dotColor, 0.4)}`\n                    : \"none\",\n                }}\n              />\n              <time\n                dateTime={update.dateTime}\n                style={{\n                  color: theme.text,\n                  fontSize: 14,\n                  fontWeight: 500,\n                  lineHeight: 1.4,\n                  fontVariantNumeric: \"tabular-nums\",\n                }}\n              >\n                {formatLiveUpdateTime(update.dateTime, selectedTimeZone)}\n              </time>\n              <div\n                title={update.headline}\n                style={{\n                  minWidth: 0,\n                  overflow: \"hidden\",\n                  color: theme.strong,\n                  fontSize: 14,\n                  fontWeight: 600,\n                  lineHeight: 1.45,\n                  textOverflow: \"ellipsis\",\n                  whiteSpace: \"nowrap\",\n                }}\n              >\n                {update.headline}\n              </div>\n            </article>\n          );\n        })}\n      </div>\n\n      <button\n        className=\"lu-preview-action\"\n        type=\"button\"\n        onClick={onOpenClick}\n        style={{\n          display: \"inline-flex\",\n          alignItems: \"center\",\n          gap: 7,\n          padding: 0,\n          border: 0,\n          background: \"transparent\",\n          color: dotFreshColor,\n          font: \"inherit\",\n          fontSize: 14,\n          fontWeight: 700,\n          lineHeight: 1.4,\n          cursor: \"pointer\",\n          transition: \"color 150ms ease\",\n        }}\n      >\n        <span>{translations.liveUpdates.viewAll}</span>\n        <span aria-hidden=\"true\" style={{ fontSize: 20, lineHeight: 1 }}>\n          →\n        </span>\n      </button>\n    </section>\n  );\n};\n","\"use client\";\n\nimport type { StockAsset } from \"../../../../charts/StockWidget/types\";\nimport { TopMovers } from \"../../../TopMovers\";\nimport { LiveUpdatesPreview } from \"../../../LiveUpdates/components/LiveUpdatesPreview\";\nimport { toEmbeddedWidgetStyle } from \"../../model/toEmbeddedWidgetStyle\";\nimport { News4Tokens } from \"../../model/types\";\nimport type { NewsDictionary } from \"../../../../../types/Dictionary\";\n\ninterface Props {\n  styleTokens: News4Tokens;\n  onOpenLiveUpdates: () => void;\n  onStockSelect: (asset: StockAsset) => void;\n  dev?: boolean;\n  lang: string;\n  translations: NewsDictionary;\n}\n\nexport const NewsAside: React.FC<Props> = ({\n  styleTokens,\n  onOpenLiveUpdates,\n  onStockSelect,\n  dev,\n  lang,\n  translations,\n}) => (\n  <div\n    style={{\n      display: \"flex\",\n      flexDirection: \"column\",\n      gap: 28,\n      position: \"sticky\",\n      top: 16,\n      minWidth: 0,\n    }}\n  >\n    <div style={{ background: \"rgba(119,119,119,0.2)\", borderRadius: styleTokens.cardRounded, overflow: \"hidden\" }}>\n      <TopMovers\n        styles={{ ...toEmbeddedWidgetStyle(styleTokens, \"card\", lang), main_background: \"transparent\" } as any}\n        dev={dev}\n        fullWidth\n        onMoverClick={(mover) =>\n          onStockSelect({\n            symbol: mover.ticker,\n            name: mover.name,\n            currency: \"USD\",\n          })\n        }\n      />\n    </div>\n\n    <div style={{ background: \"rgba(119,119,119,0.2)\", borderRadius: styleTokens.cardRounded, overflow: \"hidden\" }}>\n      <LiveUpdatesPreview\n        onOpenClick={onOpenLiveUpdates}\n        styles={{ ...toEmbeddedWidgetStyle(styleTokens, \"card\", lang), main_background: \"transparent\" } as any}\n        translations={translations}\n        cardRounded=\"0px\"\n      />\n    </div>\n  </div>\n);\n","\"use client\";\n\nimport type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport type { NewsArticle } from \"../../../../types/news\";\nimport { LiveUpdatesBanner } from \"../../LiveUpdates/components/LiveUpdatesBanner\";\nimport { HeroFeature } from \"../components/news/HeroFeature\";\nimport { StoryList } from \"../components/news/StoryList\";\nimport { FeaturedAside } from \"../components/sidebar/FeaturedAside\";\nimport { NewsAside } from \"../components/sidebar/NewsAside\";\nimport type { News4Tokens } from \"../model/types\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype Props = {\n  lang: string;\n  featuredArticle: NewsArticle | null;\n  visibleArticles: NewsArticle[];\n  showShare: boolean;\n  showReadingTime: boolean;\n  showDate: boolean;\n  featuredShowChart: boolean;\n  styleTokens: News4Tokens;\n  canLoadMore: boolean;\n  isLoadingMore: boolean;\n  isSearching: boolean;\n  colorFor: (category: string) => string;\n  labelFor: (article: NewsArticle) => string;\n  onArticleSelect: (article: NewsArticle) => void;\n  onOpenLiveUpdates: () => void;\n  onStockSelect: (asset: StockAsset) => void;\n  onLoadMore: () => void;\n  dev?: boolean;\n  translations: NewsDictionary;\n};\n\nexport function MainView({\n  lang,\n  featuredArticle,\n  visibleArticles,\n  showShare,\n  showReadingTime,\n  showDate,\n  featuredShowChart,\n  styleTokens,\n  canLoadMore,\n  isLoadingMore,\n  isSearching,\n  colorFor,\n  labelFor,\n  onArticleSelect,\n  onOpenLiveUpdates,\n  onStockSelect,\n  onLoadMore,\n  dev,\n  translations,\n}: Props) {\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        minWidth: 0,\n        boxSizing: \"border-box\",\n        display: \"flex\",\n        flexDirection: \"column\",\n        gap: 28,\n      }}\n    >\n      <LiveUpdatesBanner\n        onOpenClick={onOpenLiveUpdates}\n        translations={translations}\n        dotFreshColor={styleTokens.liveUpdatesDotFreshColor}\n        cardRounded={styleTokens.cardRounded}\n      />\n\n      <div\n        style={{\n          width: \"100%\",\n          minWidth: 0,\n          margin: \"0 auto\",\n          boxSizing: \"border-box\",\n          display: \"flex\",\n          flexDirection: \"column\",\n          gap: 28,\n        }}\n      >\n        <div className=\"news4-featured-grid\">\n          <style>{`\n            .news4-featured-grid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);gap:28px;align-items:stretch;width:100%;min-width:0}\n            .news4-content-grid{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:28px;align-items:start;width:100%;min-width:0;margin-top:28px}\n            @container (max-width:880px){\n              .news4-featured-grid,.news4-content-grid{grid-template-columns:minmax(0,1fr)}\n            }\n            @media(max-width:880px){\n              .news4-featured-grid,.news4-content-grid{grid-template-columns:minmax(0,1fr)}\n            }\n          `}</style>\n\n          <div style={{ minWidth: 0 }}>\n            {featuredArticle && (\n              <HeroFeature\n                article={featuredArticle}\n                onClick={onArticleSelect}\n                showShare={showShare}\n                showReadingTime={showReadingTime}\n                showDate={showDate}\n                categoryColor={colorFor(featuredArticle.itemCategory)}\n                categoryLabel={labelFor(featuredArticle)}\n                styleTokens={styleTokens}\n                lang={lang}\n                translations={translations}\n              />\n            )}\n          </div>\n\n          <FeaturedAside\n            featured={featuredArticle}\n            show={featuredShowChart}\n            styleTokens={styleTokens}\n            dev={dev}\n            lang={lang}\n          />\n        </div>\n\n        <div className=\"news4-content-grid\">\n          <StoryList\n            articles={visibleArticles}\n            onSelect={onArticleSelect}\n            showDate={showDate}\n            showReadingTime={showReadingTime}\n            showShare={showShare}\n            colorFor={colorFor}\n            labelFor={labelFor}\n            styleTokens={styleTokens}\n            hasMore={canLoadMore}\n            loadingMore={isLoadingMore}\n            onLoadMore={onLoadMore}\n            isSearching={isSearching}\n            lang={lang}\n            translations={translations}\n          />\n\n          <NewsAside\n            styleTokens={styleTokens}\n            onOpenLiveUpdates={onOpenLiveUpdates}\n            onStockSelect={onStockSelect}\n            dev={dev}\n            lang={lang}\n            translations={translations}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { StockWidget } from \"../../../charts/StockWidget\";\nimport type { StockAsset } from \"../../../charts/StockWidget/types\";\nimport { ViewBackButton } from \"../components/navigation/ViewBackButton\";\nimport { toEmbeddedWidgetStyle } from \"../model/toEmbeddedWidgetStyle\";\nimport type { News4Tokens } from \"../model/types\";\nimport type { NewsDictionary } from \"../../../../types/Dictionary\";\n\ntype Props = {\n  asset: StockAsset;\n  styleTokens: News4Tokens;\n  onBack: () => void;\n  dev?: boolean;\n  lang: string;\n  translations: NewsDictionary;\n};\n\nexport function StockDetailsView({\n  asset,\n  styleTokens,\n  onBack,\n  dev,\n  lang,\n  translations,\n}: Props) {\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        maxWidth: 960,\n        minWidth: 0,\n        margin: \"0 auto\",\n        padding: 20,\n        boxSizing: \"border-box\",\n      }}\n    >\n      <ViewBackButton\n        onClick={onBack}\n        styleTokens={styleTokens}\n        label={translations.liveUpdates.backToNews}\n      />\n      <StockWidget\n        styles={toEmbeddedWidgetStyle(styleTokens, \"card\", lang)}\n        assets={[asset]}\n        height={420}\n        fullWidth\n        dev={dev}\n      />\n    </div>\n  );\n}\n","import type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport { CATEGORY_DEFAULT_COLORS } from \"../../News2/constants\";\nimport {\n  alpha,\n  clampBorderRadius,\n  isLight,\n  mix,\n  pickReadable,\n} from \"../../News2/utils/contrast\";\nimport type { News4Tokens } from \"./types\";\n\nconst DEFAULT_PAGE_BACKGROUND = \"#0B1120\";\nconst DEFAULT_ACCENT_COLOR = \"#e8eaf3\";\nconst DEFAULT_DOT_FRESH_COLOR = \"#ff453a\";\nconst DEFAULT_DOT_SEEN_COLOR = \"#6b7280\";\n// Emerald 500 — chosen for a readable green against both light and dark\n// cards without being neon; the glow (when enabled) does the \"highlight\" work.\nconst DEFAULT_TAKEAWAY_BULLET = \"#10B981\";\nconst SANS_STACK =\n  \"Inter, -apple-system, BlinkMacSystemFont, Segoe UI, system-ui, sans-serif\";\nconst HEADLINE_SERIF = '\"Playfair Display\", Georgia, \"Times New Roman\", serif';\n\nfunction resolveBoolean(\n  value: boolean | null | undefined,\n  fallback: boolean,\n): boolean {\n  return value ?? fallback;\n}\n\nfunction resolveString(\n  value: string | null | undefined,\n  fallback: string,\n): string {\n  return value?.trim() ? value : fallback;\n}\n\nfunction resolveChartTheme(\n  value: \"light\" | \"dark\" | \"auto\" | null | undefined,\n  background: string,\n): \"light\" | \"dark\" {\n  if (value === \"light\" || value === \"dark\") return value;\n  return isLight(background) ? \"light\" : \"dark\";\n}\n\nexport function resolveNews4Config(styles: WidgetStyle) {\n  const pageBackground = resolveString(\n    styles.main_background,\n    styles.base_background || DEFAULT_PAGE_BACKGROUND,\n  );\n  const elevatedCard = isLight(pageBackground)\n    ? mix(pageBackground, \"#000000\", 0.05)\n    : mix(pageBackground, \"#FFFFFF\", 0.06);\n  const cardBackground = resolveString(\n    styles.news_v2_card_background,\n    elevatedCard,\n  );\n  const onPage = pickReadable(pageBackground);\n  const onCard = pickReadable(cardBackground);\n\n  const styleTokens: News4Tokens = {\n    pageBackground,\n    cardBackground,\n    cardBorder: resolveString(\n      styles.news_v2_card_border,\n      `1px solid ${alpha(onCard, 0.1)}`,\n    ),\n    cardRounded: clampBorderRadius(\n      resolveString(\n        styles.news_v2_card_rounded,\n        styles.base_rounded || \"14px\",\n      ),\n      20,\n    ),\n    headlineColor: resolveString(styles.news_v2_headline_color, onPage),\n    headlineFont: resolveString(styles.news_v2_font_family, HEADLINE_SERIF),\n    excerptColor: resolveString(\n      styles.news_v2_excerpt_color,\n      alpha(onPage, 0.7),\n    ),\n    metaColor: resolveString(\n      styles.news_v2_meta_color,\n      alpha(onPage, 0.55),\n    ),\n    accentColor: resolveString(\n      styles.news_v2_tab_active_background,\n      styles.main_text_color || DEFAULT_ACCENT_COLOR,\n    ),\n    fontFamily: resolveString(\n      styles.news_v2_font_family,\n      styles.font_family || SANS_STACK,\n    ),\n    uiFontFamily: SANS_STACK,\n    chartTheme: resolveChartTheme(\n      styles.news_v2_chart_theme,\n      cardBackground,\n    ),\n    liveUpdatesDotFreshColor: resolveString(\n      styles.live_updates_dot_fresh_color,\n      DEFAULT_DOT_FRESH_COLOR,\n    ),\n    liveUpdatesDotSeenColor: resolveString(\n      styles.live_updates_dot_seen_color,\n      DEFAULT_DOT_SEEN_COLOR,\n    ),\n    keyTakeawaysBackground: resolveString(\n      styles.news_v4_key_takeaways_background,\n      cardBackground,\n    ),\n    keyTakeawaysRounded: resolveString(\n      styles.news_v4_key_takeaways_rounded,\n      resolveString(styles.news_v2_card_rounded, styles.base_rounded || \"16px\"),\n    ),\n    keyTakeawaysBorder: resolveString(\n      styles.news_v4_key_takeaways_border,\n      resolveString(styles.news_v2_card_border, `1px solid ${alpha(onCard, 0.14)}`),\n    ),\n    keyTakeawaysBulletColor: resolveString(\n      styles.news_v4_key_takeaways_bullet_color,\n      DEFAULT_TAKEAWAY_BULLET,\n    ),\n    // A boolean override needs `??` not `resolveBoolean`-with-a-truthy-fallback:\n    // an explicit `false` in the DB must survive as `false`.\n    keyTakeawaysGlow: resolveBoolean(styles.news_v4_key_takeaways_glow, true),\n  };\n\n  return {\n    showShare: resolveBoolean(styles.news_v2_share_buttons, true),\n    showReadingTime: resolveBoolean(styles.news_v2_show_reading_time, true),\n    showDate: resolveBoolean(styles.news_v2_show_date, true),\n    showCategories: resolveBoolean(styles.news_v2_show_categories, true),\n    featuredShowChart: resolveBoolean(\n      styles.news_v2_featured_show_chart,\n      true,\n    ),\n    categoryColors: {\n      forex: resolveString(\n        styles.news_v2_category_color_forex,\n        CATEGORY_DEFAULT_COLORS.forex,\n      ),\n      stock: resolveString(\n        styles.news_v2_category_color_stock,\n        CATEGORY_DEFAULT_COLORS.stock,\n      ),\n      crypto: resolveString(\n        styles.news_v2_category_color_crypto,\n        CATEGORY_DEFAULT_COLORS.crypto,\n      ),\n      cmd: resolveString(\n        styles.news_v2_category_color_cmd,\n        CATEGORY_DEFAULT_COLORS.cmd,\n      ),\n      worldec: resolveString(\n        styles.news_v2_category_color_worldec,\n        CATEGORY_DEFAULT_COLORS.worldec,\n      ),\n      regec: resolveString(\n        styles.news_v2_category_color_regec,\n        CATEGORY_DEFAULT_COLORS.regec,\n      ),\n      latam: CATEGORY_DEFAULT_COLORS.latam,\n    },\n    styleTokens,\n  };\n}\n","\"use client\";\n\nimport type { StockAsset } from \"../../charts/StockWidget/types\";\nimport Branded from \"../../Branded\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\nimport { LiveUpdatesContent } from \"./LiveUpdatesContent\";\nimport { LiveUpdatesProvider } from \"./LiveUpdatesContext\";\n\ninterface Props {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n  onAssetSelect?: (asset: StockAsset) => void;\n}\n\nexport function LiveUpdates({ styles, size, onAssetSelect }: Props) {\n  const translations = getDictionarySection(styles.lang, \"news\");\n  const version = styles.live_updates_version ?? \"v1\";\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"liveUpdates\" size={size} hideCta>\n        <LiveUpdatesProvider lang={styles.lang} version={version}>\n          <LiveUpdatesContent\n            styles={styles}\n            onAssetSelect={onAssetSelect}\n            translations={translations}\n          />\n        </LiveUpdatesProvider>\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport Branded from \"../../Branded\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { RawVideoExplainer } from \"./RawVideoExplainer\";\nimport { resolveTokens } from \"./tokens\";\n\ninterface Props {\n  styles: WidgetStyle;\n  size?: \"full\" | \"screen\";\n}\n\nexport function VideoExplainer({ styles, size }: Props): JSX.Element {\n  const tokens = resolveTokens(styles);\n\n  useEffect(() => {\n    loadGoogleFont(\"Poppins\");\n    if (styles.font_family) loadGoogleFont(styles.font_family);\n  }, [styles.font_family]);\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"videoExplainer\" size={size}>\n        <RawVideoExplainer\n          tokens={tokens}\n          brandName={styles.brand_name}\n          lang={styles.lang}\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n","import { FC, useCallback, useEffect, useRef, useState } from \"react\";\nimport { fetchDigest } from \"./api/fetchDigest\";\nimport { useVideoCurrentTime } from \"./hooks/useVideoCurrentTime\";\nimport { ContextPanel } from \"./parts/ContextPanel\";\nimport { DigestHeader } from \"./parts/DigestHeader\";\nimport { HowToReadPanel } from \"./parts/HowToReadPanel\";\nimport { PlayerPanel } from \"./parts/PlayerPanel\";\nimport { SegmentRail } from \"./parts/SegmentRail\";\nimport { StockTicker } from \"./parts/StockTicker\";\nimport { TabStrip, TabItem } from \"./parts/TabStrip\";\nimport { TermPopover, PopoverState } from \"./parts/TermPopover\";\nimport { TermsPanel } from \"./parts/TermsPanel\";\nimport { TranscriptPanel } from \"./parts/TranscriptPanel\";\nimport { Digest, ExplainerTokens } from \"./types\";\nimport { buildEventScenarios } from \"./utils/buildEventScenarios\";\nimport { buildTechReadings } from \"./utils/buildTechReading\";\nimport { findActiveSegment } from \"./utils/findActiveSegment\";\n\nconst TAB_IDS = [\"transcript\", \"terms\", \"how-to-read\", \"context\"] as const;\ntype TabId = (typeof TAB_IDS)[number];\n\ninterface Props {\n  tokens: ExplainerTokens;\n  brandName: string;\n  lang: string;\n}\n\nconst RESPONSIVE_CSS = `@media (max-width: 960px) {\n  .nf-ex-top { grid-template-columns: 1fr !important; }\n  .nf-ex-rail { border-left: 0 !important; max-height: none !important; overflow-y: visible !important; }\n}`;\n\nexport const RawVideoExplainer: FC<Props> = ({ tokens, brandName, lang }) => {\n  const [digest, setDigest] = useState<Digest | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [tab, setTab] = useState<TabId>(\"transcript\");\n  const [manualSegment, setManualSegment] = useState(\"\");\n  const [popover, setPopover] = useState<PopoverState | null>(null);\n  const hideTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const playerColRef = useRef<HTMLDivElement>(null);\n  const [railMaxHeight, setRailMaxHeight] = useState<number | undefined>(undefined);\n\n  const cancelHide = useCallback(() => {\n    if (hideTimer.current !== null) {\n      clearTimeout(hideTimer.current);\n      hideTimer.current = null;\n    }\n  }, []);\n\n  const showPopover = useCallback((state: PopoverState) => {\n    cancelHide();\n    setPopover(state);\n  }, [cancelHide]);\n\n  const scheduleHide = useCallback(() => {\n    cancelHide();\n    hideTimer.current = setTimeout(() => {\n      hideTimer.current = null;\n      setPopover(null);\n    }, 140);\n  }, [cancelHide]);\n\n  useEffect(() => cancelHide, [cancelHide]);\n  const { currentTime, duration } = useVideoCurrentTime(digest?.channelKey ?? null);\n\n  // Grid rows always size to the tallest cell, so a short video column would\n  // otherwise leave dead space equal to the rail's own (often much taller)\n  // content. Cap the rail to the video column's real height and let it\n  // scroll internally instead. Only measured/applied at the two-column\n  // breakpoint (960px) — RESPONSIVE_CSS forces this back to `none` on mobile.\n  useEffect(() => {\n    const el = playerColRef.current;\n    if (!el) return;\n    const ro = new ResizeObserver(([entry]) => {\n      if (window.innerWidth > 960) setRailMaxHeight(entry.contentRect.height);\n    });\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [digest]);\n\n  useEffect(() => {\n    let cancelled = false;\n    setLoading(true);\n    fetchDigest(brandName, lang).then((result) => {\n      if (cancelled) return;\n      setDigest(result);\n      setLoading(false);\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [brandName, lang]);\n\n  if (loading) return <p style={{ padding: 26, color: tokens.inkSoft }}>Loading…</p>;\n  if (!digest) {\n    return (\n      <p style={{ padding: 26, color: tokens.inkSoft }}>\n        No episode available yet.\n      </p>\n    );\n  }\n\n  const techReadings = buildTechReadings(digest.segments, digest.levels, digest.numbers);\n  const scenarios = buildEventScenarios(digest.upcoming);\n\n  const tabs: TabItem[] = [\n    { id: \"transcript\", label: \"What was said\", count: digest.segments.length },\n    { id: \"terms\", label: \"Key terms\", count: digest.terms.length },\n    { id: \"how-to-read\", label: \"How to read it\", count: scenarios.length + techReadings.length },\n    { id: \"context\", label: \"Context & data\" },\n  ];\n\n  // Once the video is actually playing, its own clock drives the highlight —\n  // manualSegment only matters before the first timeupdate (e.g. a click\n  // that hasn't seeked yet) or when this edition has no timeline at all.\n  const activeSegment = findActiveSegment(digest.segments, currentTime) || manualSegment;\n\n  return (\n    <div\n      style={{\n        background: tokens.cardBackground,\n        border: tokens.border,\n        borderRadius: 20,\n        overflow: \"hidden\",\n        // WHY: parent is a flex column with overflowY:auto — without this,\n        // overflow:hidden above lets the browser shrink us below our content\n        // height (min-height:auto → 0) instead of letting the parent scroll.\n        flexShrink: 0,\n        width: \"100%\",\n        // Without a cap the 16:9 player grows with the viewport and dwarfs\n        // everything else on a wide embed.\n        maxWidth: tokens.maxWidth,\n        margin: \"0 auto\",\n        fontFamily: tokens.fontFamily,\n        color: tokens.ink,\n      }}\n    >\n      <style>{RESPONSIVE_CSS}</style>\n\n      <DigestHeader\n        tokens={tokens}\n        headline={digest.headline}\n        subHeadline={digest.subHeadline}\n      />\n\n      <StockTicker tokens={tokens} numbers={digest.numbers} />\n\n      <div\n        className=\"nf-ex-top\"\n        style={{ display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) 340px\", alignItems: \"start\" }}\n      >\n        <div ref={playerColRef} style={{ padding: \"22px 26px 26px\", minWidth: 0 }}>\n          <PlayerPanel\n            tokens={tokens}\n            channelKey={digest.channelKey}\n            segments={digest.segments}\n            currentTime={currentTime}\n            duration={duration}\n          />\n        </div>\n\n        <div\n          className=\"nf-ex-rail\"\n          style={{\n            position: \"relative\",\n            background: tokens.railBackground,\n            borderLeft: tokens.softBorder,\n            maxHeight: railMaxHeight,\n            overflowY: railMaxHeight ? \"auto\" : undefined,\n          }}\n        >\n          <div\n            className=\"nf-ex-rail-scroll\"\n            style={{\n              overflowY: \"visible\",\n              padding: \"22px 20px 26px\",\n            }}\n          >\n            <SegmentRail\n              tokens={tokens}\n              segments={digest.segments}\n              activeId={activeSegment}\n              channelKey={digest.channelKey}\n              duration={duration}\n              currentTime={currentTime}\n              onSelect={(id) => {\n                setManualSegment(id);\n                setTab(\"transcript\");\n              }}\n            />\n          </div>\n        </div>\n      </div>\n\n      <TabStrip\n        tokens={tokens}\n        tabs={tabs}\n        activeId={tab}\n        onSelect={(id) => setTab(id as TabId)}\n      />\n\n      <div className=\"nf-ex-panel\" style={{ padding: 26 }}>\n        {tab === \"transcript\" && (\n          <TranscriptPanel\n            tokens={tokens}\n            segments={digest.segments}\n            terms={digest.terms}\n            numbers={digest.numbers}\n            activeId={activeSegment}\n            channelKey={digest.channelKey}\n            onShowPopover={showPopover}\n            onHidePopover={scheduleHide}\n          />\n        )}\n        {tab === \"terms\" && <TermsPanel tokens={tokens} terms={digest.terms} />}\n        {tab === \"how-to-read\" && <HowToReadPanel tokens={tokens} readings={techReadings} scenarios={scenarios} />}\n        {tab === \"context\" && (\n          <ContextPanel\n            tokens={tokens}\n            context={digest.context}\n            upcoming={digest.upcoming}\n            levels={digest.levels}\n          />\n        )}\n      </div>\n\n      <TermPopover\n        tokens={tokens}\n        state={popover}\n        onMouseEnter={cancelHide}\n        onMouseLeave={scheduleHide}\n      />\n    </div>\n  );\n};\n","import { Digest } from \"../types\";\n\nconst URL = \"https://widget.newsfactory.tv/api/widgets/digest\";\n// const URL = 'http://localhost:3001/api/widgets/digest';\n\nexport async function fetchDigest(\n  brand: string,\n  lang: string,\n): Promise<Digest | null> {\n  try {\n    const response = await fetch(URL, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ brand, lang }),\n    });\n    const digest: unknown = await response.json();\n\n    if (!response.ok || !digest || typeof digest !== \"object\") return null;\n    if (\"error\" in digest) throw new Error(String(digest.error));\n\n    return digest as Digest;\n  } catch (error) {\n    console.error(\"fetchDigest error:\", error);\n    return null;\n  }\n}\n","import { useEffect, useState } from \"react\";\nimport { getPlayer, PlayerLike } from \"../utils/players\";\n\nconst POLL_MS = 300;\n\n// HlsPlayer registers itself after hls.js loads, so there's nothing to attach\n// to on first render — poll briefly until it exists.\nexport function useVideoCurrentTime(channelKey: string | null): {\n  currentTime: number;\n  duration: number;\n} {\n  const [currentTime, setCurrentTime] = useState(0);\n  const [duration, setDuration] = useState(0);\n\n  useEffect(() => {\n    setCurrentTime(0);\n    setDuration(0);\n    if (!channelKey) return;\n\n    let player: PlayerLike | undefined;\n    const onTimeUpdate = () => {\n      if (!player) return;\n      setCurrentTime(player.currentTime());\n      const d = player.duration();\n      if (Number.isFinite(d)) setDuration(d);\n    };\n\n    const poll = window.setInterval(() => {\n      player = getPlayer(channelKey);\n      if (!player || typeof player.on !== \"function\") return;\n      window.clearInterval(poll);\n      player.on(\"timeupdate\", onTimeUpdate);\n      player.on(\"durationchange\", onTimeUpdate);\n      onTimeUpdate();\n    }, POLL_MS);\n\n    return () => {\n      window.clearInterval(poll);\n      player?.off(\"timeupdate\", onTimeUpdate);\n      player?.off(\"durationchange\", onTimeUpdate);\n    };\n  }, [channelKey]);\n\n  return { currentTime, duration };\n}\n","export type PlayerLike = {\n  currentTime(seconds?: number): number;\n  duration(): number;\n  on(event: string, handler: () => void): void;\n  off(event: string, handler: () => void): void;\n  play(): Promise<void> | void;\n};\n\nconst ownPlayers = new Map<string, PlayerLike>();\n\nexport function registerPlayer(key: string, player: PlayerLike): () => void {\n  ownPlayers.set(key, player);\n  return () => {\n    if (ownPlayers.get(key) === player) ownPlayers.delete(key);\n  };\n}\n\nexport function getPlayer(key: string): PlayerLike | undefined {\n  return ownPlayers.get(key);\n}\n\nexport function elementPlayer(video: HTMLVideoElement): PlayerLike {\n  return {\n    currentTime: (seconds) => {\n      if (seconds !== undefined) video.currentTime = seconds;\n      return video.currentTime;\n    },\n    duration: () => video.duration,\n    on: (event, handler) => video.addEventListener(event, handler),\n    off: (event, handler) => video.removeEventListener(event, handler),\n    play: () => video.play(),\n  };\n}\n","import { FC, ReactNode } from \"react\";\nimport { ExplainerTokens } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  title: string;\n  children: ReactNode;\n}\n\nexport const Card: FC<Props> = ({ tokens, title, children }) => (\n  <div\n    style={{\n      border: tokens.border,\n      borderRadius: 12,\n      padding: 16,\n      background: tokens.cardBackground,\n    }}\n  >\n    <h4\n      style={{\n        margin: \"0 0 10px\",\n        fontSize: 11.5 * tokens.scale,\n        letterSpacing: \"0.09em\",\n        textTransform: \"uppercase\",\n        color: tokens.inkSoft,\n        fontWeight: 700,\n      }}\n    >\n      {title}\n    </h4>\n    {children}\n  </div>\n);\n\ninterface RowProps {\n  tokens: ExplainerTokens;\n  label: ReactNode;\n  value: ReactNode;\n  valueColor?: string;\n}\n\nexport const CardRow: FC<RowProps> = ({ tokens, label, value, valueColor }) => (\n  <div\n    style={{\n      display: \"flex\",\n      justifyContent: \"space-between\",\n      gap: 10,\n      padding: \"7px 0\",\n      borderBottom: tokens.softBorder,\n      fontSize: 13.5 * tokens.scale,\n    }}\n  >\n    <span style={{ color: tokens.inkMuted }}>{label}</span>\n    <span\n      style={{\n        fontWeight: 700,\n        fontVariantNumeric: \"tabular-nums\",\n        color: valueColor ?? tokens.ink,\n        whiteSpace: \"nowrap\",\n      }}\n    >\n      {value}\n    </span>\n  </div>\n);\n","import { FC } from \"react\";\nimport { Card, CardRow } from \"./Card\";\nimport {\n  DigestEvent,\n  DigestLevels,\n  DigestStory,\n  ExplainerTokens,\n} from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  context: DigestStory[];\n  upcoming: DigestEvent[];\n  levels: DigestLevels[];\n}\n\nfunction shortDate(value: string): string {\n  const date = new Date(value.replace(\" \", \"T\") + (value.endsWith(\"Z\") ? \"\" : \"Z\"));\n  if (Number.isNaN(date.getTime())) return value;\n  return date.toLocaleDateString(\"en-GB\", {\n    day: \"2-digit\",\n    month: \"short\",\n    timeZone: \"UTC\",\n  });\n}\n\nfunction eventTime(value: string): string {\n  const date = new Date(value);\n  if (Number.isNaN(date.getTime())) return \"\";\n  return date.toLocaleTimeString(\"en-GB\", {\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n    timeZone: \"UTC\",\n  });\n}\n\nexport const ContextPanel: FC<Props> = ({ tokens, context, upcoming, levels }) => (\n  <div>\n    <style>{`\n      @media (max-width: 1100px) {\n        .nf-ex-context-grid { grid-template-columns: 1fr !important; }\n        .nf-ex-context-aside { position: static !important; }\n      }\n    `}</style>\n    <p style={{ margin: \"0 0 20px\", color: tokens.inkMuted, fontSize: 14 * tokens.scale, maxWidth: \"70ch\" }}>\n      Where today sits in the run of stories we have already covered, and what is\n      coming next.\n    </p>\n    <div\n      className=\"nf-ex-context-grid\"\n      style={{\n        display: \"grid\",\n        gridTemplateColumns: \"minmax(0, 1fr) minmax(0, 320px)\",\n        gap: 26,\n        alignItems: \"start\",\n      }}\n    >\n      <div style={{ position: \"relative\", paddingLeft: 22 }}>\n        <span\n          style={{\n            position: \"absolute\",\n            left: 5,\n            top: 6,\n            bottom: 6,\n            width: 2,\n            background: tokens.accentSoft,\n          }}\n        />\n        {context.map((story, index) => (\n          <div key={story.editionDateCode} style={{ position: \"relative\", paddingBottom: 20 }}>\n            <span\n              style={{\n                position: \"absolute\",\n                left: -21,\n                top: 6,\n                width: 10,\n                height: 10,\n                borderRadius: 99,\n                background: index === 0 ? tokens.accent : tokens.cardBackground,\n                border: `2px solid ${index === 0 ? tokens.accent : tokens.inkSoft}`,\n              }}\n            />\n            <span\n              style={{\n                fontSize: 11.5 * tokens.scale,\n                fontWeight: 700,\n                letterSpacing: \"0.06em\",\n                textTransform: \"uppercase\",\n                color: tokens.inkSoft,\n              }}\n            >\n              {shortDate(story.editionDateCode)}\n            </span>\n            <b\n              style={{\n                display: \"block\",\n                fontFamily: tokens.headingFamily,\n                fontSize: 14.5 * tokens.scale,\n                margin: \"3px 0\",\n                color: tokens.ink,\n              }}\n            >\n              {story.headline}\n            </b>\n            <span style={{ fontSize: 13 * tokens.scale, color: tokens.inkMuted, lineHeight: 1.55 }}>\n              {story.subHeadline}\n            </span>\n          </div>\n        ))}\n      </div>\n\n      <aside className=\"nf-ex-context-aside\" style={{ display: \"grid\", gap: 14, position: \"sticky\", top: 20 }}>\n        {upcoming.length > 0 && (\n          <Card tokens={tokens} title=\"What to watch next\">\n            {upcoming.map((event) => (\n              <CardRow\n                key={`${event.title}-${event.dateUtc}`}\n                tokens={tokens}\n                label={\n                  <span>\n                    {event.title}\n                    <small style={{ display: \"block\", color: tokens.inkSoft, fontSize: 12 * tokens.scale }}>\n                      {event.countryCode} · {shortDate(event.dateUtc)} {eventTime(event.dateUtc)} UTC\n                    </small>\n                  </span>\n                }\n                value={event.consensus !== \"---\" ? event.consensus : event.previous}\n              />\n            ))}\n          </Card>\n        )}\n        {levels.length > 0 && (\n          <Card tokens={tokens} title=\"Levels to keep on screen\">\n            {levels.map((level) => (\n              <CardRow\n                key={level.symbol}\n                tokens={tokens}\n                label={\n                  <span>\n                    {level.symbol}\n                    <small style={{ display: \"block\", color: tokens.inkSoft, fontSize: 12 * tokens.scale }}>\n                      support {level.s1} / {level.s2}\n                    </small>\n                  </span>\n                }\n                value={`${level.r1} / ${level.r2}`}\n              />\n            ))}\n          </Card>\n        )}\n      </aside>\n    </div>\n  </div>\n);\n","import { FC } from \"react\";\nimport { ExplainerTokens } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  headline: string;\n  subHeadline: string;\n}\n\nexport const DigestHeader: FC<Props> = ({\n  tokens,\n  headline,\n  subHeadline,\n}) => (\n  <div\n    style={{\n      padding: \"22px 26px 18px\",\n      borderBottom: tokens.softBorder,\n    }}\n  >\n    <h1\n      style={{\n        margin: \"0 0 4px\",\n        fontFamily: tokens.headingFamily,\n        fontSize: 26 * tokens.scale,\n        fontWeight: 700,\n        lineHeight: 1.2,\n        letterSpacing: \"-0.02em\",\n        color: tokens.ink,\n      }}\n    >\n      {headline}\n    </h1>\n    <p style={{ margin: 0, color: tokens.inkSoft, fontSize: 14 * tokens.scale }}>\n      {subHeadline}\n    </p>\n  </div>\n);\n","import { FC } from \"react\";\nimport { Direction, EventScenario, ScenarioRow } from \"../utils/buildEventScenarios\";\nimport { ExplainerTokens } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  scenario: EventScenario;\n}\n\nconst COLUMNS: ReadonlyArray<{ key: keyof Pick<ScenarioRow, \"rateCutOdds\" | \"dollar\" | \"gold\" | \"equities\">; label: string }> = [\n  { key: \"rateCutOdds\", label: \"Rate-cut odds\" },\n  { key: \"dollar\", label: \"Dollar\" },\n  { key: \"gold\", label: \"Gold\" },\n  { key: \"equities\", label: \"Equities\" },\n];\n\nfunction formatWhen(dateUtc: string): string {\n  const date = new Date(dateUtc);\n  if (Number.isNaN(date.getTime())) return \"\";\n  return `${date.toLocaleTimeString(\"en-GB\", {\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n    timeZone: \"UTC\",\n  })} GMT`;\n}\n\nconst Pill: FC<{ tokens: ExplainerTokens; label: string; dir: Direction }> = ({\n  tokens,\n  label,\n  dir,\n}) => {\n  const color = dir === \"up\" ? tokens.up : dir === \"down\" ? tokens.down : tokens.inkSoft;\n  return (\n    <span\n      style={{\n        display: \"inline-block\",\n        padding: \"2px 8px\",\n        borderRadius: 6,\n        fontSize: 11.5 * tokens.scale,\n        fontWeight: 700,\n        color,\n        background: dir === \"flat\" ? \"transparent\" : `${color}1a`,\n        whiteSpace: \"nowrap\",\n      }}\n    >\n      {label}\n    </span>\n  );\n};\n\nexport const ScenarioTable: FC<Props> = ({ tokens, scenario }) => (\n  <div>\n    <style>{`\n      .nf-ex-matrix-wrap { overflow-x: auto; }\n      .nf-ex-matrix { width: 100%; border-collapse: collapse; min-width: 640px; }\n      .nf-ex-scenario-cards { display: none; }\n      @media (max-width: 720px) {\n        .nf-ex-matrix-wrap { display: none !important; }\n        .nf-ex-scenario-cards { display: grid !important; gap: 10px; }\n      }\n    `}</style>\n\n    <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8, flexWrap: \"wrap\", marginBottom: 4 }}>\n      <h4\n        style={{\n          margin: 0,\n          fontFamily: tokens.headingFamily,\n          fontSize: 15 * tokens.scale,\n          fontWeight: 700,\n          color: tokens.ink,\n        }}\n      >\n        {scenario.countryCode} · {scenario.title}\n      </h4>\n      <span style={{ fontSize: 11.5 * tokens.scale, fontWeight: 700, color: tokens.accent }}>\n        {formatWhen(scenario.dateUtc)}\n      </span>\n    </div>\n    <p style={{ margin: \"0 0 12px\", fontSize: 13 * tokens.scale, color: tokens.inkSoft }}>\n      Previous {scenario.previous} · Forecast {scenario.consensus}\n      {scenario.inverted && \" · a higher reading here means a weaker economy\"}\n    </p>\n\n    <div className=\"nf-ex-matrix-wrap\">\n      <table className=\"nf-ex-matrix\">\n        <thead>\n          <tr>\n            {[\"If the print is…\", ...COLUMNS.map((c) => c.label), \"What to say on air\"].map((h) => (\n              <th\n                key={h}\n                style={{\n                  textAlign: \"left\",\n                  padding: \"10px 12px\",\n                  fontSize: 10.5 * tokens.scale,\n                  fontWeight: 700,\n                  letterSpacing: \"0.08em\",\n                  textTransform: \"uppercase\",\n                  color: tokens.inkSoft,\n                  background: tokens.railBackground,\n                  borderBottom: tokens.border,\n                  whiteSpace: \"nowrap\",\n                }}\n              >\n                {h}\n              </th>\n            ))}\n          </tr>\n        </thead>\n        <tbody>\n          {scenario.rows.map((row) => (\n            <tr key={row.outcome}>\n              <td\n                style={{\n                  padding: \"11px 12px\",\n                  fontSize: 13 * tokens.scale,\n                  fontWeight: 600,\n                  color: tokens.ink,\n                  borderBottom: tokens.softBorder,\n                  whiteSpace: \"nowrap\",\n                }}\n              >\n                {row.outcome}\n              </td>\n              {COLUMNS.map((c) => (\n                <td key={c.key} style={{ padding: \"11px 12px\", borderBottom: tokens.softBorder }}>\n                  <Pill tokens={tokens} label={row[c.key].label} dir={row[c.key].dir} />\n                </td>\n              ))}\n              <td\n                style={{\n                  padding: \"11px 12px\",\n                  fontSize: 13 * tokens.scale,\n                  color: tokens.inkMuted,\n                  borderBottom: tokens.softBorder,\n                }}\n              >\n                {row.onAir}\n              </td>\n            </tr>\n          ))}\n        </tbody>\n      </table>\n    </div>\n\n    <div className=\"nf-ex-scenario-cards\">\n      {scenario.rows.map((row) => (\n        <div\n          key={row.outcome}\n          style={{\n            border: tokens.border,\n            borderRadius: 12,\n            padding: \"12px 14px\",\n            background: tokens.railBackground,\n          }}\n        >\n          <b\n            style={{\n              display: \"block\",\n              marginBottom: 10,\n              fontFamily: tokens.headingFamily,\n              fontSize: 13.5 * tokens.scale,\n              color: tokens.ink,\n            }}\n          >\n            {row.outcome}\n          </b>\n          <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px 16px\", marginBottom: 10 }}>\n            {COLUMNS.map((c) => (\n              <div key={c.key} style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n                <span\n                  style={{\n                    fontSize: 10.5 * tokens.scale,\n                    fontWeight: 700,\n                    letterSpacing: \"0.06em\",\n                    textTransform: \"uppercase\",\n                    color: tokens.inkSoft,\n                  }}\n                >\n                  {c.label}\n                </span>\n                <Pill tokens={tokens} label={row[c.key].label} dir={row[c.key].dir} />\n              </div>\n            ))}\n          </div>\n          <p style={{ margin: 0, fontSize: 13 * tokens.scale, color: tokens.inkMuted, lineHeight: 1.55 }}>\n            {row.onAir}\n          </p>\n        </div>\n      ))}\n    </div>\n\n    <div\n      style={{\n        marginTop: 16,\n        border: tokens.border,\n        borderLeft: `3px solid ${tokens.accent}`,\n        borderRadius: \"0 12px 12px 0\",\n        padding: \"14px 16px\",\n        background: tokens.railBackground,\n      }}\n    >\n      <b\n        style={{\n          display: \"block\",\n          marginBottom: 4,\n          fontFamily: tokens.headingFamily,\n          fontSize: 13.5 * tokens.scale,\n          color: tokens.ink,\n        }}\n      >\n        The trap most viewers fall into\n      </b>\n      <span style={{ fontSize: 13 * tokens.scale, color: tokens.inkMuted, lineHeight: 1.6 }}>\n        {scenario.trap}\n      </span>\n    </div>\n  </div>\n);\n","import { FC } from \"react\";\nimport { ScenarioTable } from \"./ScenarioTable\";\nimport { TechReading } from \"../utils/buildTechReading\";\nimport { EventScenario } from \"../utils/buildEventScenarios\";\nimport { ExplainerTokens } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  readings: TechReading[];\n  scenarios: EventScenario[];\n}\n\nconst SectionHeading: FC<{ tokens: ExplainerTokens; children: string }> = ({ tokens, children }) => (\n  <h3\n    style={{\n      margin: \"0 0 12px\",\n      fontSize: 11.5 * tokens.scale,\n      fontWeight: 700,\n      letterSpacing: \"0.1em\",\n      textTransform: \"uppercase\",\n      color: tokens.inkSoft,\n    }}\n  >\n    {children}\n  </h3>\n);\n\nconst SIGNAL_LABEL: Record<TechReading[\"signal\"], string> = {\n  bullish: \"Bullish\",\n  bearish: \"Bearish\",\n  neutral: \"Neutral\",\n};\n\nexport const HowToReadPanel: FC<Props> = ({ tokens, readings, scenarios }) => {\n  if (readings.length === 0 && scenarios.length === 0) {\n    return (\n      <p style={{ margin: 0, color: tokens.inkSoft, fontSize: 14 * tokens.scale }}>\n        Nothing to read for this episode yet.\n      </p>\n    );\n  }\n\n  return (\n    <div>\n      <p style={{ margin: \"0 0 20px\", color: tokens.inkMuted, fontSize: 14 * tokens.scale, maxWidth: \"70ch\" }}>\n        How to read what is coming and what is on the charts — worked out from the\n        numbers in this episode, not written by hand.\n      </p>\n\n      {scenarios.length > 0 && (\n        <div style={{ marginBottom: 30 }}>\n          <SectionHeading tokens={tokens}>Next release — how to read the print</SectionHeading>\n          <div style={{ display: \"grid\", gap: 26 }}>\n            {scenarios.map((scenario) => (\n              <ScenarioTable key={`${scenario.countryCode}-${scenario.title}`} tokens={tokens} scenario={scenario} />\n            ))}\n          </div>\n        </div>\n      )}\n\n      {readings.length > 0 && <SectionHeading tokens={tokens}>Charts in this episode</SectionHeading>}\n      <div style={{ display: \"grid\", gap: 12 }}>\n        {readings.map((reading) => {\n          const neutral = reading.signal === \"neutral\";\n          const color = reading.signal === \"bullish\" ? tokens.up : reading.signal === \"bearish\" ? tokens.down : tokens.inkSoft;\n          return (\n            <div\n              key={reading.segmentId}\n              style={{\n                border: tokens.border,\n                borderRadius: 12,\n                padding: 16,\n                background: tokens.cardBackground,\n              }}\n            >\n              <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, marginBottom: 8 }}>\n                <h4 style={{ margin: 0, fontSize: 15 * tokens.scale, fontWeight: 700, fontFamily: tokens.headingFamily, color: tokens.ink }}>\n                  {reading.symbol}\n                </h4>\n                <span\n                  style={{\n                    fontSize: 10.5 * tokens.scale,\n                    fontWeight: 700,\n                    letterSpacing: \"0.06em\",\n                    textTransform: \"uppercase\",\n                    color,\n                    background: neutral ? \"transparent\" : `${color}1a`,\n                    borderRadius: 6,\n                    padding: \"2px 7px\",\n                  }}\n                >\n                  {SIGNAL_LABEL[reading.signal]}\n                </span>\n              </div>\n              <p style={{ margin: 0, fontSize: 13.5 * tokens.scale, color: tokens.inkMuted, lineHeight: 1.6 }}>\n                {reading.text}\n              </p>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n};\n","import { FC, useEffect, useRef } from \"react\";\nimport type Hls from \"hls.js\";\nimport { elementPlayer, registerPlayer } from \"../utils/players\";\n\nconst PLAY_BASE = \"https://api.streamvault.one/v1/play\";\n\nexport const HlsPlayer: FC<{ videoId: string }> = ({ videoId }) => {\n  const ref = useRef<HTMLVideoElement>(null);\n\n  useEffect(() => {\n    const video = ref.current;\n    if (!video) return;\n\n    const unregister = registerPlayer(videoId, elementPlayer(video));\n    const src = `${PLAY_BASE}/${videoId}/master.m3u8`;\n    let instance: Hls | null = null;\n    let cancelled = false;\n\n    const playNative = () => {\n      video.src = src;\n    };\n\n    if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n      playNative();\n    } else {\n      import(\"hls.js\")\n        .then(({ default: HlsCtor }) => {\n          if (cancelled) return;\n          if (!HlsCtor.isSupported()) return playNative();\n          instance = new HlsCtor({ capLevelToPlayerSize: true });\n          instance.loadSource(src);\n          instance.attachMedia(video);\n        })\n        .catch(playNative);\n    }\n\n    return () => {\n      cancelled = true;\n      instance?.destroy();\n      unregister();\n    };\n  }, [videoId]);\n\n  return (\n    <video\n      ref={ref}\n      controls\n      playsInline\n      poster={`${PLAY_BASE}/${videoId}/poster.jpg`}\n      style={{ position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", background: \"#000\" }}\n    />\n  );\n};\n","import { getPlayer } from \"./players\";\n\nexport function seekVideo(channelKey: string | null, seconds: number): void {\n  const player = getPlayer(channelKey ?? \"\");\n  player?.currentTime(seconds);\n  // Safari's native HLS can get stuck mid-seek if play() is called separately,\n  // later, by hand - seeking and playing in the same click sidesteps that.\n  void player?.play()?.catch?.(() => {});\n}\n\nexport function formatTimestamp(seconds: number): string {\n  const m = Math.floor(seconds / 60);\n  const s = Math.floor(seconds % 60);\n  return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n","import { FC } from \"react\";\nimport { HlsPlayer } from \"./HlsPlayer\";\nimport { formatTimestamp, seekVideo } from \"../utils/seekVideo\";\nimport { DigestSegment, ExplainerTokens } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  channelKey: string | null;\n  segments: DigestSegment[];\n  currentTime: number;\n  duration: number;\n}\n\nexport const PlayerPanel: FC<Props> = ({\n  tokens,\n  channelKey,\n  segments,\n  currentTime,\n  duration,\n}) => {\n  const marks = segments.filter((s) => s.startSec !== undefined && duration > 0);\n\n  return (\n    <div>\n      <div\n        style={{\n          position: \"relative\",\n          width: \"100%\",\n          aspectRatio: \"16 / 9\",\n          borderRadius: tokens.rounded,\n          overflow: \"hidden\",\n          background: \"#0b1a2b\",\n          border: tokens.border,\n        }}\n      >\n        {channelKey ? (\n          <HlsPlayer videoId={channelKey} />\n        ) : (\n          <div\n            style={{\n              position: \"absolute\",\n              inset: 0,\n              display: \"flex\",\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              color: \"#9dc4e6\",\n              fontSize: 13 * tokens.scale,\n              textAlign: \"center\",\n              padding: 20,\n            }}\n          >\n            Today&apos;s episode is not published yet.\n          </div>\n        )}\n      </div>\n\n      {duration > 0 && (\n        <div style={{ marginTop: 16 }}>\n          <div\n            style={{\n              position: \"relative\",\n              height: 6,\n              borderRadius: 99,\n              background: tokens.accentSoft,\n            }}\n          >\n            <div\n              style={{\n                position: \"absolute\",\n                inset: \"0 auto 0 0\",\n                width: `${Math.min(100, (currentTime / duration) * 100)}%`,\n                background: tokens.accent,\n                borderRadius: 99,\n                transition: \"width 260ms linear\",\n              }}\n            />\n            {marks.map((segment) => (\n              <button\n                key={segment.id}\n                type=\"button\"\n                onClick={() => seekVideo(channelKey, segment.startSec as number)}\n                title={segment.label}\n                style={{\n                  position: \"absolute\",\n                  top: -4,\n                  left: `${((segment.startSec as number) / duration) * 100}%`,\n                  width: 2,\n                  height: 14,\n                  padding: 0,\n                  border: 0,\n                  cursor: \"pointer\",\n                  background: \"#fff\",\n                  boxShadow: `0 0 0 1px ${tokens.accent}`,\n                }}\n              />\n            ))}\n            <div\n              style={{\n                position: \"absolute\",\n                top: \"50%\",\n                left: `${Math.min(100, (currentTime / duration) * 100)}%`,\n                transition: \"left 260ms linear\",\n                width: 14,\n                height: 14,\n                borderRadius: 99,\n                background: \"#fff\",\n                border: `2px solid ${tokens.accent}`,\n                transform: \"translate(-50%, -50%)\",\n                pointerEvents: \"none\",\n              }}\n            />\n          </div>\n          <div\n            style={{\n              display: \"flex\",\n              justifyContent: \"space-between\",\n              gap: 12,\n              marginTop: 7,\n              fontSize: 11.5 * tokens.scale,\n              color: tokens.inkSoft,\n              fontVariantNumeric: \"tabular-nums\",\n            }}\n          >\n            <span>{formatTimestamp(currentTime)}</span>\n            <span style={{ textAlign: \"center\" }}>\n              Chapter markers sync the panels below to the video\n            </span>\n            <span>{formatTimestamp(duration)}</span>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n","import { FC, useEffect, useRef } from \"react\";\nimport { DigestSegment, ExplainerTokens, SegmentKind } from \"../types\";\nimport { findActiveSegment, segmentEnd } from \"../utils/findActiveSegment\";\nimport { formatTimestamp, seekVideo } from \"../utils/seekVideo\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  segments: DigestSegment[];\n  activeId: string;\n  channelKey: string | null;\n  currentTime: number;\n  duration: number;\n  onSelect: (id: string) => void;\n}\n\nconst KIND_LABEL: Record<SegmentKind, string> = {\n  news: \"Story\",\n  tech: \"Chart\",\n  econ: \"Calendar\",\n};\n\nexport const SegmentRail: FC<Props> = ({\n  tokens,\n  segments,\n  activeId,\n  channelKey,\n  currentTime,\n  duration,\n  onSelect,\n}) => {\n  const playingId = findActiveSegment(segments, currentTime);\n  const activeRef = useRef<HTMLButtonElement>(null);\n\n  // Follow the video: keep whatever is playing visible inside the rail's own\n  // scroller. `nearest` so it never scrolls the host page around the widget.\n  useEffect(() => {\n    activeRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n  }, [activeId]);\n\n  return (\n    <div>\n      <h3\n        style={{\n          fontSize: 11.5 * tokens.scale,\n          fontWeight: 700,\n          letterSpacing: \"0.1em\",\n          textTransform: \"uppercase\",\n          color: tokens.inkSoft,\n          margin: \"0 0 12px\",\n        }}\n      >\n        In this episode\n      </h3>\n      {segments.map((segment) => {\n        const active = segment.id === activeId;\n        const isPlaying = segment.id === playingId && segment.startSec !== undefined;\n        const end = isPlaying ? segmentEnd(segments, segment.id, duration) : 0;\n        const span = end - (segment.startSec ?? 0);\n        const progress = isPlaying && span > 0\n          ? Math.min(100, ((currentTime - (segment.startSec as number)) / span) * 100)\n          : 0;\n\n        return (\n          <button\n            key={segment.id}\n            ref={active ? activeRef : undefined}\n            type=\"button\"\n            onClick={() => {\n              onSelect(segment.id);\n              if (segment.startSec !== undefined) seekVideo(channelKey, segment.startSec);\n            }}\n            title={segment.startSec !== undefined ? \"Jump to this point in the video\" : undefined}\n            style={{\n              position: \"relative\",\n              overflow: \"hidden\",\n              display: \"flex\",\n              gap: 11,\n              width: \"100%\",\n              textAlign: \"left\",\n              padding: 10,\n              borderRadius: 11,\n              cursor: \"pointer\",\n              font: \"inherit\",\n              background: active ? tokens.cardBackground : \"transparent\",\n              border: `1px solid ${active ? tokens.accent : \"transparent\"}`,\n              boxShadow: active ? `0 0 0 3px ${tokens.accentSoft}` : \"none\",\n              transition:\n                \"background 240ms ease, border-color 240ms ease, box-shadow 240ms ease\",\n            }}\n          >\n            {isPlaying && (\n              <span\n                style={{\n                  position: \"absolute\",\n                  left: 0,\n                  bottom: 0,\n                  height: 2,\n                  width: `${progress}%`,\n                  background: tokens.accent,\n                  transition: \"width 260ms linear\",\n                }}\n              />\n            )}\n            <span\n              style={{\n                display: \"flex\",\n                alignItems: \"center\",\n                alignSelf: \"flex-start\",\n                gap: 5,\n                flex: \"0 0 58px\",\n                fontSize: 10.5 * tokens.scale,\n                fontWeight: 700,\n                letterSpacing: \"0.06em\",\n                textTransform: \"uppercase\",\n                color: active ? tokens.accent : tokens.inkSoft,\n                paddingTop: 3,\n                transition: \"color 240ms ease\",\n              }}\n            >\n              <span\n                aria-hidden\n                style={{\n                  display: \"inline-flex\",\n                  opacity: active ? 1 : 0,\n                  width: active ? \"auto\" : 0,\n                  overflow: \"hidden\",\n                  transition: \"opacity 240ms ease\",\n                }}\n              >\n                <svg width=\"1.75em\" height=\"1.75em\" viewBox=\"0 0 20 20\">\n                  <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"currentColor\" />\n                  <path\n                    d=\"M8.2 6.6 13.6 10l-5.4 3.4z\"\n                    fill=\"#fff\"\n                    stroke=\"#fff\"\n                    strokeWidth={1.4}\n                    strokeLinejoin=\"round\"\n                  />\n                </svg>\n              </span>\n              {segment.startSec !== undefined\n                ? formatTimestamp(segment.startSec)\n                : KIND_LABEL[segment.kind]}\n            </span>\n            <span style={{ fontSize: 13 * tokens.scale, fontWeight: 600, lineHeight: 1.35, color: tokens.ink }}>\n              {segment.label}\n              {segment.sub && (\n                <small\n                  style={{\n                    display: \"block\",\n                    fontWeight: 400,\n                    color: tokens.inkSoft,\n                    fontSize: 12 * tokens.scale,\n                    marginTop: 3,\n                    lineHeight: 1.4,\n                  }}\n                >\n                  {segment.sub}\n                </small>\n              )}\n            </span>\n          </button>\n        );\n      })}\n    </div>\n  );\n};\n","import { DigestSegment } from \"../types\";\n\n// A seek to 32.123 lands at 32.122999 in Chrome (verified 2026-09-15), which would name the previous segment.\nconst BOUNDARY_TOLERANCE_SEC = 0.05;\n\nexport function findActiveSegment(\n  segments: DigestSegment[],\n  currentTime: number,\n): string {\n  let active = \"\";\n  for (const segment of segments) {\n    if (segment.startSec === undefined || segment.startSec > currentTime + BOUNDARY_TOLERANCE_SEC) continue;\n    active = segment.id;\n  }\n  return active;\n}\n\n// Where the current segment ends — the next timed segment's start, or the\n// video's own duration for the last one. Drives the progress fill.\nexport function segmentEnd(\n  segments: DigestSegment[],\n  activeId: string,\n  duration: number,\n): number {\n  const timed = segments.filter((s) => s.startSec !== undefined);\n  const index = timed.findIndex((s) => s.id === activeId);\n  if (index === -1) return duration;\n  return timed[index + 1]?.startSec ?? duration;\n}\n","import { FC, Fragment } from \"react\";\nimport { DigestNumber, ExplainerTokens, TICKER_GROUPS } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  numbers: DigestNumber[];\n}\n\nconst MAX_ITEMS = 5;\nconst ASSET_ICON_BASE = \"https://app.newsfactory.tv/api/asset-icon\";\n\nfunction iconUrl(n: DigestNumber): string {\n  if (n.group === \"forex\") {\n    return `${ASSET_ICON_BASE}/currency/${encodeURIComponent(n.symbol.split(\"/\")[0])}`;\n  }\n  // Indices have no dedicated icon type; the endpoint falls back to a\n  // generated letter chip for any ticker it doesn't recognize, same as a\n  // stock symbol it can't resolve — safe to route both through \"stock\".\n  return `${ASSET_ICON_BASE}/stock/${encodeURIComponent(n.symbol)}`;\n}\n\n// Round-robins across forex/index/stock so a handful of items still shows a\n// mix, rather than exhausting one group (forex usually has the most rows)\n// before ever reaching a stock.\nfunction pickTickerNumbers(numbers: DigestNumber[]): DigestNumber[] {\n  const byGroup = TICKER_GROUPS.map((group) => numbers.filter((n) => n.group === group));\n  const picked: DigestNumber[] = [];\n  for (let i = 0; picked.length < MAX_ITEMS; i++) {\n    const before = picked.length;\n    for (const group of byGroup) {\n      if (picked.length >= MAX_ITEMS) break;\n      if (group[i]) picked.push(group[i]);\n    }\n    if (picked.length === before) break;\n  }\n  return picked;\n}\n\nfunction parseChange(change: string): number {\n  const value = parseFloat(change);\n  return Number.isFinite(value) ? value : 0;\n}\n\nconst TickerItem: FC<{ tokens: ExplainerTokens; n: DigestNumber }> = ({ tokens, n }) => {\n  const value = parseChange(n.change);\n  const color = value > 0 ? tokens.up : value < 0 ? tokens.down : tokens.inkSoft;\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: 8,\n        flexShrink: 0,\n      }}\n    >\n      <img\n        src={iconUrl(n)}\n        alt=\"\"\n        width={22}\n        height={22}\n        style={{ borderRadius: 99, flexShrink: 0 }}\n      />\n      <span style={{ fontSize: 13 * tokens.scale, fontWeight: 700, color: tokens.ink, whiteSpace: \"nowrap\" }}>\n        {n.symbol}\n      </span>\n      <span\n        style={{\n          fontSize: 13 * tokens.scale,\n          fontWeight: 600,\n          color: tokens.inkSoft,\n          fontVariantNumeric: \"tabular-nums\",\n          whiteSpace: \"nowrap\",\n        }}\n      >\n        {n.value}\n      </span>\n      <span\n        style={{\n          fontSize: 12.5 * tokens.scale,\n          fontWeight: 700,\n          color,\n          fontVariantNumeric: \"tabular-nums\",\n          whiteSpace: \"nowrap\",\n        }}\n      >\n        {value > 0 ? \"+\" : \"\"}\n        {n.change}\n      </span>\n    </div>\n  );\n};\n\nexport const StockTicker: FC<Props> = ({ tokens, numbers }) => {\n  const items = pickTickerNumbers(numbers);\n  if (items.length === 0) return null;\n\n  return (\n    <div style={{ position: \"relative\" }}>\n      <style>{`\n        .nf-ex-ticker { scrollbar-width: none; }\n        .nf-ex-ticker::-webkit-scrollbar { display: none; }\n        @media (max-width: 860px) {\n          .nf-ex-ticker-cell { flex: 0 0 auto !important; justify-content: flex-start !important; }\n        }\n        @media (max-width: 640px) {\n          .nf-ex-ticker { flex-wrap: wrap !important; overflow-x: visible !important; row-gap: 10px !important; }\n          .nf-ex-ticker-fade, .nf-ex-ticker-divider { display: none !important; }\n        }\n      `}</style>\n      <div\n        className=\"nf-ex-ticker\"\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          padding: \"14px 26px\",\n          borderBottom: tokens.softBorder,\n          background: tokens.railBackground,\n          overflowX: \"auto\",\n        }}\n      >\n        {items.map((n, i) => (\n          <Fragment key={`${n.group}-${n.symbol}`}>\n            {i > 0 && (\n              <span\n                aria-hidden\n                className=\"nf-ex-ticker-divider\"\n                style={{ alignSelf: \"stretch\", borderLeft: tokens.softBorder, flexShrink: 0 }}\n              />\n            )}\n            <span\n              className=\"nf-ex-ticker-cell\"\n              style={{\n                display: \"flex\",\n                justifyContent: \"center\",\n                flex: \"1 1 0\",\n                minWidth: 0,\n                padding: \"0 14px\",\n              }}\n            >\n              <TickerItem tokens={tokens} n={n} />\n            </span>\n          </Fragment>\n        ))}\n      </div>\n      <div\n        className=\"nf-ex-ticker-fade\"\n        style={{\n          position: \"absolute\",\n          top: 0,\n          bottom: 0,\n          right: 0,\n          width: 28,\n          pointerEvents: \"none\",\n          background: `linear-gradient(to right, transparent, ${tokens.railBackground})`,\n        }}\n      />\n    </div>\n  );\n};\n","export const SEGMENT_KINDS = [\"news\", \"tech\", \"econ\"] as const;\nexport type SegmentKind = (typeof SEGMENT_KINDS)[number];\n\nexport const TICKER_GROUPS = [\"forex\", \"index\", \"stock\"] as const;\nexport type TickerGroup = (typeof TICKER_GROUPS)[number];\n\nexport const TERM_SOURCES = [\"glossary\", \"event\"] as const;\nexport type TermSource = (typeof TERM_SOURCES)[number];\n\nexport const TERM_CATEGORIES = [\n  \"inflation\",\n  \"rates\",\n  \"central-banks\",\n  \"growth\",\n  \"jobs\",\n  \"fx\",\n  \"commodities\",\n  \"markets\",\n  \"technicals\",\n] as const;\nexport type TermCategory = (typeof TERM_CATEGORIES)[number];\n\nexport interface DigestSegment {\n  id: string;\n  kind: SegmentKind;\n  label: string;\n  sub: string;\n  script: string;\n  // Seconds into the video where this segment starts — absent when\n  // no timeline was staged for this edition (older edition, or upload failed).\n  startSec?: number;\n}\n\nexport interface DigestNumber {\n  symbol: string;\n  value: string;\n  change: string;\n  group: TickerGroup;\n}\n\nexport interface DigestLevels {\n  symbol: string;\n  s1: number;\n  s2: number;\n  r1: number;\n  r2: number;\n  indicatorLine: string;\n}\n\nexport interface DigestTerm {\n  title: string;\n  definition: string;\n  source: TermSource;\n  abbr?: string;\n  category?: TermCategory;\n  readItAs?: string;\n}\n\nexport interface DigestEvent {\n  title: string;\n  definition: string;\n  dateUtc: string;\n  previous: string;\n  consensus: string;\n  countryCode: string;\n}\n\nexport interface DigestStory {\n  editionDateCode: string;\n  headline: string;\n  subHeadline: string;\n}\n\nexport interface Digest {\n  brand: string;\n  lang: string;\n  editionDateCode: string;\n  headline: string;\n  subHeadline: string;\n  channelKey: string | null;\n  provider?: \"streamvault\";\n  segments: DigestSegment[];\n  numbers: DigestNumber[];\n  levels: DigestLevels[];\n  terms: DigestTerm[];\n  upcoming: DigestEvent[];\n  context: DigestStory[];\n}\n\nexport interface ExplainerTokens {\n  pageBackground: string;\n  cardBackground: string;\n  railBackground: string;\n  tabBackground: string;\n  border: string;\n  softBorder: string;\n  ink: string;\n  inkMuted: string;\n  inkSoft: string;\n  accent: string;\n  accentSoft: string;\n  up: string;\n  down: string;\n  rounded: string;\n  fontFamily: string;\n  headingFamily: string;\n  maxWidth: number;\n  scale: number;\n}\n","import { FC } from \"react\";\nimport { ExplainerTokens } from \"../types\";\n\nexport interface TabItem {\n  id: string;\n  label: string;\n  count?: number;\n}\n\ninterface Props {\n  tokens: ExplainerTokens;\n  tabs: TabItem[];\n  activeId: string;\n  onSelect: (id: string) => void;\n}\n\nexport const TabStrip: FC<Props> = ({ tokens, tabs, activeId, onSelect }) => (\n  <div style={{ position: \"relative\" }}>\n    <style>{`\n      .nf-ex-tabstrip { scrollbar-width: none; }\n      .nf-ex-tabstrip::-webkit-scrollbar { display: none; }\n      @media (max-width: 640px) {\n        .nf-ex-tabstrip { flex-wrap: wrap !important; overflow-x: visible !important; }\n        .nf-ex-tabstrip-fade { display: none !important; }\n      }\n    `}</style>\n    <div\n      className=\"nf-ex-tabstrip\"\n      role=\"tablist\"\n      style={{\n        display: \"flex\",\n        gap: 2,\n        padding: \"0 26px\",\n        borderTop: tokens.softBorder,\n        borderBottom: tokens.border,\n        background: tokens.tabBackground,\n        overflowX: \"auto\",\n      }}\n    >\n      {tabs.map((tab) => {\n        const active = tab.id === activeId;\n        return (\n          <button\n            key={tab.id}\n            type=\"button\"\n            role=\"tab\"\n            aria-selected={active}\n            onClick={() => onSelect(tab.id)}\n            style={{\n              appearance: \"none\",\n              background: \"none\",\n              border: 0,\n              borderBottom: `2px solid ${active ? tokens.accent : \"transparent\"}`,\n              padding: \"15px 14px\",\n              fontFamily: tokens.headingFamily,\n              fontSize: 13.5 * tokens.scale,\n              fontWeight: 600,\n              color: active ? tokens.accent : tokens.inkSoft,\n              cursor: \"pointer\",\n              whiteSpace: \"nowrap\",\n              flexShrink: 0,\n            }}\n          >\n            {tab.label}\n            {typeof tab.count === \"number\" && (\n              <span\n                style={{\n                  display: \"inline-block\",\n                  marginLeft: 6,\n                  background: tokens.accentSoft,\n                  borderRadius: 99,\n                  padding: \"1px 6px\",\n                  fontSize: 11 * tokens.scale,\n                  color: tokens.inkSoft,\n                  fontWeight: 600,\n                }}\n              >\n                {tab.count}\n              </span>\n            )}\n          </button>\n        );\n      })}\n    </div>\n    {/* Signals there's more to swipe to — a hard truncation mid-word reads as\n        broken, this reads as \"keep going\". Harmless when nothing overflows. */}\n    <div\n      className=\"nf-ex-tabstrip-fade\"\n      style={{\n        position: \"absolute\",\n        top: 0,\n        bottom: 0,\n        right: 0,\n        width: 28,\n        pointerEvents: \"none\",\n        background: `linear-gradient(to right, transparent, ${tokens.tabBackground})`,\n      }}\n    />\n  </div>\n);\n","import { FC, useLayoutEffect, useRef, useState } from \"react\";\nimport { autoUpdate, computePosition, flip, hide, offset, shift } from \"@floating-ui/dom\";\nimport { DigestTerm, ExplainerTokens } from \"../types\";\n\nexport interface PopoverState {\n  term: DigestTerm;\n  anchor: HTMLElement;\n}\n\ninterface Props {\n  tokens: ExplainerTokens;\n  state: PopoverState | null;\n  onMouseEnter?: () => void;\n  onMouseLeave?: () => void;\n}\n\nexport const TermPopover: FC<Props> = ({ tokens, state, onMouseEnter, onMouseLeave }) => {\n  const ref = useRef<HTMLDivElement>(null);\n  const [pos, setPos] = useState({ x: 0, y: 0, visible: false });\n\n  useLayoutEffect(() => {\n    if (!state || !ref.current) {\n      setPos((p) => ({ ...p, visible: false }));\n      return;\n    }\n    const floating = ref.current;\n    return autoUpdate(state.anchor, floating, () => {\n      computePosition(state.anchor, floating, {\n        placement: \"bottom-start\",\n        strategy: \"fixed\",\n        middleware: [offset(10), flip(), shift({ padding: 8 }), hide()],\n      }).then(({ x, y, middlewareData }) => {\n        setPos({ x, y, visible: !middlewareData.hide?.referenceHidden });\n      });\n    });\n  }, [state]);\n\n  useLayoutEffect(() => {\n    if (!state) return;\n    const onPointerDown = (e: PointerEvent) => {\n      const target = e.target as Node;\n      if (ref.current?.contains(target) || state.anchor.contains(target)) return;\n      onMouseLeave?.();\n    };\n    document.addEventListener(\"pointerdown\", onPointerDown);\n    return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n  }, [state, onMouseLeave]);\n\n  return (\n    <div\n      ref={ref}\n      onMouseEnter={onMouseEnter}\n      onMouseLeave={onMouseLeave}\n      style={{\n        position: \"fixed\",\n        left: pos.x,\n        top: pos.y,\n        visibility: state && pos.visible ? \"visible\" : \"hidden\",\n        pointerEvents: state && pos.visible ? \"auto\" : \"none\",\n        zIndex: 60,\n        maxWidth: 330,\n        background: \"#0e1116\",\n        color: \"#fff\",\n        borderRadius: 12,\n        padding: \"14px 16px\",\n        fontSize: 13 * tokens.scale,\n        lineHeight: 1.55,\n        boxShadow: \"0 18px 44px rgba(10,15,25,.3)\",\n        userSelect: \"text\",\n      }}\n    >\n      {state && (\n        <>\n          <em\n            style={{\n              display: \"block\",\n              fontStyle: \"normal\",\n              color: \"#8fc0ee\",\n              fontSize: 11.5 * tokens.scale,\n              fontWeight: 600,\n              letterSpacing: \"0.06em\",\n              textTransform: \"uppercase\",\n              marginBottom: 8,\n            }}\n          >\n            {state.term.source === \"event\" ? \"In today's calendar\" : \"Glossary\"}\n          </em>\n          <b\n            style={{\n              display: \"block\",\n              fontFamily: tokens.headingFamily,\n              fontSize: 14 * tokens.scale,\n              marginBottom: 5,\n            }}\n          >\n            {state.term.title}\n          </b>\n          {state.term.definition}\n        </>\n      )}\n    </div>\n  );\n};\n","import { FC } from \"react\";\nimport { alpha, isLight, mix } from \"../../News2/utils/contrast\";\nimport { DigestTerm, ExplainerTokens, TermCategory } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  terms: DigestTerm[];\n}\n\n// Colour and icon both carry the category rather than decorating the card, so\n// they stay informative at this dose. One mark per category, not per term — a\n// bespoke glyph for all 38 terms would mostly be arbitrary.\nconst CATEGORY: Record<TermCategory, { label: string; hue: string; path: string }> = {\n  inflation: { label: \"inflation\", hue: \"#b8730a\", path: \"M3 17l6-6 4 4 8-8M17 7h4v4\" },\n  rates: { label: \"rates\", hue: \"#3d5a99\", path: \"M19 5L5 19M7.5 8a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM16.5 19a1.5 1.5 0 100-3 1.5 1.5 0 000 3z\" },\n  \"central-banks\": { label: \"central banks\", hue: \"#1268b3\", path: \"M3 21h18M4 10h16M12 3L3 8h18l-9-5zM6 10v11M10 10v11M14 10v11M18 10v11\" },\n  growth: { label: \"growth\", hue: \"#0f8a6a\", path: \"M4 20V10M10 20V4M16 20v-7M22 20H2\" },\n  jobs: { label: \"jobs\", hue: \"#7b52c9\", path: \"M3 8h18v12H3zM9 8V5a2 2 0 012-2h2a2 2 0 012 2v3M3 13h18\" },\n  fx: { label: \"currencies\", hue: \"#0e7c86\", path: \"M4 8h13l-3-3M20 16H7l3 3\" },\n  commodities: { label: \"commodities\", hue: \"#a35b2a\", path: \"M12 3s5 5.5 5 9a5 5 0 01-10 0c0-3.5 5-9 5-9z\" },\n  markets: { label: \"markets\", hue: \"#4a5568\", path: \"M7 4v16M7 8h4v6H7zM17 4v16M14 10h4v7h-4z\" },\n  technicals: { label: \"technicals\", hue: \"#2f6f8f\", path: \"M3 15a9 9 0 0118 0M12 15l4-4\" },\n};\n\nconst FALLBACK = { label: \"glossary\", hue: \"\", path: \"M5 4h11l3 3v13H5zM9 9h6M9 13h6\" };\n\nfunction categoryOf(term: DigestTerm, tokens: ExplainerTokens) {\n  const base = term.category\n    ? CATEGORY[term.category]\n    : { ...FALLBACK, label: term.source === \"event\" ? \"today's calendar\" : FALLBACK.label };\n  const hue = base.hue || tokens.accent;\n  // A mid-tone hue picked for white goes muddy on a dark card, so lift it.\n  return {\n    label: base.label,\n    path: base.path,\n    hue: isLight(tokens.cardBackground) ? hue : mix(hue, \"#ffffff\", 0.45),\n  };\n}\n\nconst CategoryMark: FC<{ hue: string; path: string; size: number }> = ({ hue, path, size }) => (\n  <span\n    aria-hidden\n    style={{\n      display: \"inline-flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      flexShrink: 0,\n      width: size,\n      height: size,\n      borderRadius: size * 0.28,\n      background: alpha(hue, 0.12),\n      color: hue,\n    }}\n  >\n    <svg\n      width={size * 0.56}\n      height={size * 0.56}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      strokeWidth={1.7}\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path d={path} />\n    </svg>\n  </span>\n);\n\nconst Entry: FC<{ tokens: ExplainerTokens; term: DigestTerm; rule: string }> = ({\n  tokens,\n  term,\n  rule,\n}) => {\n  const { label, hue, path } = categoryOf(term, tokens);\n  const mark = 38 * tokens.scale;\n  return (\n    <div style={{ paddingTop: 22, paddingBottom: 22 }}>\n      <div style={{ display: \"flex\", gap: 14 }}>\n        <CategoryMark hue={hue} path={path} size={mark} />\n        <div style={{ flex: 1, minWidth: 0 }}>\n          <div\n            style={{\n              display: \"flex\",\n              alignItems: \"baseline\",\n              justifyContent: \"space-between\",\n              gap: 14,\n            }}\n          >\n            <span\n              style={{\n                fontFamily: tokens.headingFamily,\n                fontSize: 25 * tokens.scale,\n                fontWeight: 500,\n                letterSpacing: \"-0.015em\",\n                lineHeight: 1.15,\n                color: tokens.ink,\n              }}\n            >\n              {term.title}\n            </span>\n            <span\n              style={{\n                flexShrink: 0,\n                fontSize: 11 * tokens.scale,\n                fontWeight: 600,\n                letterSpacing: \"0.09em\",\n                textTransform: \"uppercase\",\n                color: hue,\n                whiteSpace: \"nowrap\",\n              }}\n            >\n              {label}\n            </span>\n          </div>\n\n          {term.abbr && (\n            <div\n              style={{\n                marginTop: 3,\n                fontSize: 14 * tokens.scale,\n                color: alpha(tokens.ink, 0.5),\n              }}\n            >\n              {term.abbr}\n            </div>\n          )}\n        </div>\n      </div>\n\n      <p\n        style={{\n          margin: \"16px 0 0\",\n          fontSize: 14 * tokens.scale,\n          lineHeight: 1.62,\n          color: tokens.inkMuted,\n        }}\n      >\n        {term.definition}\n      </p>\n\n      {term.readItAs && (\n        <div style={{ marginTop: 20, borderTop: `1px solid ${rule}`, paddingTop: 14 }}>\n          <div\n            style={{\n              fontSize: 10.5 * tokens.scale,\n              fontWeight: 600,\n              letterSpacing: \"0.11em\",\n              textTransform: \"uppercase\",\n              color: alpha(tokens.ink, 0.55),\n              marginBottom: 8,\n            }}\n          >\n            Why it matters\n          </div>\n          <p\n            style={{\n              margin: 0,\n              paddingLeft: 14,\n              borderLeft: `2px solid ${hue}`,\n              fontSize: 14 * tokens.scale,\n              lineHeight: 1.6,\n              color: tokens.inkMuted,\n            }}\n          >\n            {term.readItAs}\n          </p>\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport const TermsPanel: FC<Props> = ({ tokens, terms }) => {\n  const rule = alpha(tokens.ink, 0.13);\n\n  return (\n    <div>\n      <style>{`\n        @media (max-width: 820px) {\n          .nf-ex-terms { grid-template-columns: 1fr !important; }\n          .nf-ex-terms > * { border-left: 0 !important; padding-left: 0 !important; }\n        }\n      `}</style>\n\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"baseline\",\n          justifyContent: \"space-between\",\n          gap: 20,\n          flexWrap: \"wrap\",\n          paddingBottom: 16,\n        }}\n      >\n        <div>\n          <h3\n            style={{\n              margin: 0,\n              fontFamily: tokens.headingFamily,\n              fontSize: 24 * tokens.scale,\n              fontWeight: 500,\n              letterSpacing: \"-0.02em\",\n              color: tokens.ink,\n            }}\n          >\n            Key terms\n          </h3>\n          <p style={{ margin: \"4px 0 0\", fontSize: 14 * tokens.scale, color: tokens.inkSoft }}>\n            A quick-reference glossary of today&apos;s most important financial and market terms.\n          </p>\n        </div>\n        <div style={{ textAlign: \"right\", fontSize: 11.5 * tokens.scale, color: tokens.inkSoft }}>\n          <div style={{ letterSpacing: \"0.08em\", textTransform: \"uppercase\" }}>Terms</div>\n          <div style={{ fontVariantNumeric: \"tabular-nums\" }}>{terms.length}</div>\n        </div>\n      </div>\n\n      <div\n        className=\"nf-ex-terms\"\n        style={{\n          display: \"grid\",\n          gridTemplateColumns: \"repeat(2, minmax(0, 1fr))\",\n          borderTop: `1px solid ${rule}`,\n        }}\n      >\n        {terms.map((term, i) => (\n          <div\n            key={term.title}\n            style={{\n              borderBottom: `1px solid ${rule}`,\n              borderLeft: i % 2 === 1 ? `1px solid ${rule}` : undefined,\n              paddingLeft: i % 2 === 1 ? 34 : 0,\n              paddingRight: i % 2 === 0 ? 34 : 0,\n            }}\n          >\n            <Entry tokens={tokens} term={term} rule={rule} />\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n};\n","import { FC } from \"react\";\nimport { DigestNumber, ExplainerTokens } from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  title: string;\n  numbers: DigestNumber[];\n}\n\nfunction parseChange(change: string): number {\n  const value = parseFloat(change);\n  return Number.isFinite(value) ? value : 0;\n}\n\nexport const CompactNumberTable: FC<Props> = ({ tokens, title, numbers }) => {\n  if (numbers.length === 0) return null;\n\n  return (\n    <div\n      style={{\n        border: tokens.border,\n        borderRadius: 12,\n        padding: 16,\n        background: tokens.cardBackground,\n      }}\n    >\n      <h4\n        style={{\n          margin: \"0 0 10px\",\n          fontSize: 11.5 * tokens.scale,\n          letterSpacing: \"0.09em\",\n          textTransform: \"uppercase\",\n          color: tokens.inkSoft,\n          fontWeight: 700,\n        }}\n      >\n        {title}\n      </h4>\n      {numbers.map((n, i) => {\n        const value = parseChange(n.change);\n        const color = value > 0 ? tokens.up : value < 0 ? tokens.down : tokens.ink;\n        return (\n          <div\n            key={`${n.group}-${n.symbol}`}\n            style={{\n              display: \"flex\",\n              justifyContent: \"space-between\",\n              gap: 10,\n              padding: \"7px 0\",\n              borderBottom: i === numbers.length - 1 ? 0 : tokens.softBorder,\n              fontSize: 13.5 * tokens.scale,\n            }}\n          >\n            <span style={{ color: tokens.inkMuted }}>{n.symbol}</span>\n            <span\n              style={{\n                display: \"inline-flex\",\n                gap: 8,\n                fontWeight: 700,\n                color,\n                fontVariantNumeric: \"tabular-nums\",\n                whiteSpace: \"nowrap\",\n              }}\n            >\n              <span>{n.value}</span>\n              <span>\n                {value > 0 ? \"+\" : \"\"}\n                {n.change}\n              </span>\n            </span>\n          </div>\n        );\n      })}\n    </div>\n  );\n};\n","import { ReactNode } from \"react\";\nimport { DigestTerm } from \"../types\";\n\nconst escape = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\nexport function buildTermRegex(terms: DigestTerm[]): RegExp | null {\n  const titles = terms\n    .map((t) => t.title)\n    .filter((t) => t.length >= 3)\n    .sort((a, b) => b.length - a.length)\n    .map(escape);\n  if (titles.length === 0) return null;\n  return new RegExp(`\\\\b(${titles.join(\"|\")})\\\\b`, \"gi\");\n}\n\nexport function highlightTerms(\n  text: string,\n  regex: RegExp | null,\n  renderTerm: (match: string, key: string) => ReactNode,\n): ReactNode[] {\n  if (!regex) return [text];\n\n  // A capturing group makes split() keep the matches, at every odd index.\n  return text\n    .split(regex)\n    .map((part, i) => (i % 2 === 1 ? renderTerm(part, `${i}-${part}`) : part));\n}\n","import { FC, MouseEvent } from \"react\";\nimport { CompactNumberTable } from \"./CompactNumberTable\";\nimport { PopoverState } from \"./TermPopover\";\nimport { buildTermRegex, highlightTerms } from \"../utils/highlightTerms\";\nimport { formatTimestamp, seekVideo } from \"../utils/seekVideo\";\nimport {\n  DigestNumber,\n  DigestSegment,\n  DigestTerm,\n  ExplainerTokens,\n} from \"../types\";\n\ninterface Props {\n  tokens: ExplainerTokens;\n  segments: DigestSegment[];\n  terms: DigestTerm[];\n  numbers: DigestNumber[];\n  activeId: string;\n  channelKey: string | null;\n  onShowPopover: (state: PopoverState) => void;\n  onHidePopover: () => void;\n}\n\nexport const TranscriptPanel: FC<Props> = ({\n  tokens,\n  segments,\n  terms,\n  numbers,\n  activeId,\n  channelKey,\n  onShowPopover,\n  onHidePopover,\n}) => {\n  const regex = buildTermRegex(terms);\n  const byTitle = new Map(terms.map((t) => [t.title.toLowerCase(), t]));\n\n  const openPopover = (match: string) => (event: MouseEvent<HTMLSpanElement>) => {\n    const term = byTitle.get(match.toLowerCase());\n    if (!term) return;\n    onShowPopover({ term, anchor: event.currentTarget });\n  };\n\n  return (\n    <div>\n      <style>{`\n        @media (max-width: 1100px) {\n          .nf-ex-transcript-grid { grid-template-columns: 1fr !important; }\n          .nf-ex-transcript-aside { position: static !important; }\n        }\n      `}</style>\n      <p style={{ margin: \"0 0 20px\", color: tokens.inkMuted, fontSize: 14 * tokens.scale, maxWidth: \"70ch\" }}>\n        The full script of today&apos;s episode. Every jargon word is underlined —\n        hover or tap it for a one-line definition without leaving the page.\n      </p>\n      <div\n        className=\"nf-ex-transcript-grid\"\n        style={{\n          display: \"grid\",\n          gridTemplateColumns: \"minmax(0, 1fr) 300px\",\n          gap: 26,\n          alignItems: \"start\",\n        }}\n      >\n      <div>\n        {segments.map((segment) => {\n          const active = segment.id === activeId;\n          return (\n            <div\n              key={segment.id}\n              style={{\n                display: \"flex\",\n                gap: 14,\n                padding: \"12px 12px 12px 10px\",\n                borderRadius: 10,\n                background: active ? tokens.accentSoft : \"transparent\",\n                transition: \"background 240ms ease\",\n              }}\n            >\n              {segment.startSec !== undefined ? (\n                <button\n                  type=\"button\"\n                  onClick={() => seekVideo(channelKey, segment.startSec as number)}\n                  title=\"Jump to this point in the video\"\n                  style={{\n                    appearance: \"none\",\n                    border: 0,\n                    background: \"none\",\n                    padding: 0,\n                    textAlign: \"left\",\n                    cursor: \"pointer\",\n                    flex: \"0 0 42px\",\n                    fontSize: 12 * tokens.scale,\n                    fontWeight: 700,\n                    color: tokens.accent,\n                    fontVariantNumeric: \"tabular-nums\",\n                    paddingTop: 2,\n                  }}\n                >\n                  {formatTimestamp(segment.startSec)}\n                </button>\n              ) : (\n                <span style={{ flex: \"0 0 42px\" }} />\n              )}\n              <div style={{ minWidth: 0 }}>\n                <span\n                  style={{\n                    display: \"block\",\n                    fontSize: 10.5 * tokens.scale,\n                    fontWeight: 700,\n                    letterSpacing: \"0.09em\",\n                    textTransform: \"uppercase\",\n                    color: tokens.inkSoft,\n                    marginBottom: 4,\n                  }}\n                >\n                  {segment.label}\n                </span>\n                <p\n                  style={{\n                    margin: 0,\n                    fontSize: 15 * tokens.scale,\n                    lineHeight: 1.65,\n                    color: tokens.ink,\n                  }}\n                >\n                  {highlightTerms(segment.script, regex, (match, key) => (\n                    <span\n                      key={key}\n                      onMouseEnter={openPopover(match)}\n                      onMouseLeave={onHidePopover}\n                      onClick={openPopover(match)}\n                      style={{\n                        borderBottom: `1.5px dotted ${tokens.accent}`,\n                        color: tokens.accent,\n                        fontWeight: 600,\n                        cursor: \"help\",\n                      }}\n                    >\n                      {match}\n                    </span>\n                  ))}\n                </p>\n              </div>\n            </div>\n          );\n        })}\n      </div>\n\n        <aside\n          className=\"nf-ex-transcript-aside\"\n          style={{ display: \"grid\", gap: 14, position: \"sticky\", top: 20 }}\n        >\n          <CompactNumberTable\n            tokens={tokens}\n            title=\"Market Snapshot\"\n            numbers={numbers.filter((n) => n.group === \"forex\")}\n          />\n          <CompactNumberTable\n            tokens={tokens}\n            title=\"Key Indices\"\n            numbers={numbers.filter((n) => n.group === \"index\")}\n          />\n        </aside>\n      </div>\n    </div>\n  );\n};\n","import { DigestEvent } from \"../types\";\n\nexport const EVENT_FAMILIES = [\n  \"inflation\",\n  \"growth\",\n  \"jobs\",\n  \"rates\",\n  \"housing\",\n] as const;\nexport type EventFamily = (typeof EVENT_FAMILIES)[number];\n\nexport type Direction = \"up\" | \"down\" | \"flat\";\n\nexport interface ScenarioRow {\n  outcome: string;\n  rateCutOdds: { label: string; dir: Direction };\n  dollar: { label: string; dir: Direction };\n  gold: { label: string; dir: Direction };\n  equities: { label: string; dir: Direction };\n  onAir: string;\n}\n\nexport interface EventScenario {\n  title: string;\n  countryCode: string;\n  dateUtc: string;\n  previous: string;\n  consensus: string;\n  family: EventFamily;\n  // True where a HIGHER print means a WEAKER economy (unemployment, claims),\n  // so the \"hotter\" row has to describe the weak outcome instead.\n  inverted: boolean;\n  rows: ScenarioRow[];\n  trap: string;\n}\n\nconst MATCHERS: ReadonlyArray<{ family: EventFamily; re: RegExp }> = [\n  { family: \"rates\", re: /rate decision|interest rate|fomc|monetary policy|refi rate/i },\n  { family: \"inflation\", re: /consumer price|inflation|\\bcpi\\b|\\bpce\\b|\\bhicp\\b|producer price|\\bppi\\b/i },\n  { family: \"jobs\", re: /payroll|unemploy|jobless|employment|job advertis|labou?r/i },\n  { family: \"housing\", re: /housing|building permit|home sales|construction/i },\n  { family: \"growth\", re: /\\bpmi\\b|gross domestic|\\bgdp\\b|retail sales|industrial production|factory|manufacturing|business activity|confidence|sentiment/i },\n];\n\nconst INVERTED = /unemploy|jobless/i;\n\nconst up = (label: string) => ({ label, dir: \"up\" as const });\nconst down = (label: string) => ({ label, dir: \"down\" as const });\nconst flat = (label: string) => ({ label, dir: \"flat\" as const });\n\n// Textbook macro reaction functions. Deliberately per-family: a hot inflation\n// print and a strong growth print move rate-cut odds the same way but move\n// equities in opposite directions, which is the whole point of the panel.\nconst STRONG: Record<EventFamily, Omit<ScenarioRow, \"outcome\">> = {\n  inflation: {\n    rateCutOdds: down(\"Fall\"),\n    dollar: up(\"Up\"),\n    gold: down(\"Down\"),\n    equities: down(\"Down\"),\n    onAir: \"“Higher for longer” — cuts get pushed further out.\",\n  },\n  growth: {\n    rateCutOdds: down(\"Fall\"),\n    dollar: up(\"Up\"),\n    gold: down(\"Down\"),\n    equities: up(\"Up\"),\n    onAir: \"Growth is holding up — here good news really is good news.\",\n  },\n  jobs: {\n    rateCutOdds: down(\"Fall\"),\n    dollar: up(\"Up\"),\n    gold: down(\"Down\"),\n    equities: down(\"Down\"),\n    onAir: \"A tight labour market keeps the central bank patient.\",\n  },\n  rates: {\n    rateCutOdds: down(\"Fall\"),\n    dollar: up(\"Up\"),\n    gold: down(\"Down\"),\n    equities: down(\"Down\"),\n    onAir: \"Hawkish read — the guidance matters more than the decision itself.\",\n  },\n  housing: {\n    rateCutOdds: down(\"Fall\"),\n    dollar: up(\"Up\"),\n    gold: down(\"Down\"),\n    equities: up(\"Up\"),\n    onAir: \"Housing is coping with current rates better than expected.\",\n  },\n};\n\nconst WEAK: Record<EventFamily, Omit<ScenarioRow, \"outcome\">> = {\n  inflation: {\n    rateCutOdds: up(\"Rise\"),\n    dollar: down(\"Down\"),\n    gold: up(\"Up\"),\n    equities: up(\"Up\"),\n    onAir: \"Disinflation back on track; risk assets get bid.\",\n  },\n  growth: {\n    rateCutOdds: up(\"Rise\"),\n    dollar: down(\"Down\"),\n    gold: up(\"Up\"),\n    equities: down(\"Down\"),\n    onAir: \"Slowdown fears take over — cuts get priced, but so does earnings risk.\",\n  },\n  jobs: {\n    rateCutOdds: up(\"Rise\"),\n    dollar: down(\"Down\"),\n    gold: up(\"Up\"),\n    equities: down(\"Down\"),\n    onAir: \"Cooling labour market brings cuts forward, and recession talk with it.\",\n  },\n  rates: {\n    rateCutOdds: up(\"Rise\"),\n    dollar: down(\"Down\"),\n    gold: up(\"Up\"),\n    equities: up(\"Up\"),\n    onAir: \"Dovish read — the path from here is what moves the market.\",\n  },\n  housing: {\n    rateCutOdds: up(\"Rise\"),\n    dollar: down(\"Down\"),\n    gold: up(\"Up\"),\n    equities: down(\"Down\"),\n    onAir: \"Rate pain is showing up in housing first, as it usually does.\",\n  },\n};\n\nconst INLINE: Omit<ScenarioRow, \"outcome\"> = {\n  rateCutOdds: flat(\"Unchanged\"),\n  dollar: flat(\"Flat\"),\n  gold: flat(\"Flat\"),\n  equities: flat(\"Flat\"),\n  onAir: \"Already priced in — attention moves straight to the next release.\",\n};\n\nconst TRAPS: Record<EventFamily, string> = {\n  inflation:\n    \"Good economic news is not automatically good market news. A strong inflation print can weaken stocks, because it delays the rate cuts those stocks were counting on.\",\n  growth:\n    \"Growth data cuts both ways: a strong print supports earnings but pushes rate cuts further out. Which one wins depends on what the market is worried about that week.\",\n  jobs:\n    \"A strong jobs number is good for the economy and usually bad for bonds — more hiring means less urgency to cut.\",\n  rates:\n    \"The decision itself is almost always priced in beforehand. The move comes from the guidance, not the number.\",\n  housing:\n    \"Housing is the most rate-sensitive part of the economy, so it tells you how much the last set of hikes has actually bitten.\",\n};\n\nexport function classifyEvent(title: string): EventFamily | null {\n  return MATCHERS.find((m) => m.re.test(title))?.family ?? null;\n}\n\nfunction buildRows(family: EventFamily, inverted: boolean): ScenarioRow[] {\n  const strong = inverted ? WEAK[family] : STRONG[family];\n  const weak = inverted ? STRONG[family] : WEAK[family];\n  return [\n    { outcome: \"Higher than forecast\", ...strong },\n    { outcome: \"In line with forecast\", ...INLINE },\n    { outcome: \"Lower than forecast\", ...weak },\n  ];\n}\n\nconst hasValue = (v: string) => !!v && v.trim() !== \"\" && !/^-+$/.test(v.trim());\n\nexport function buildEventScenarios(events: DigestEvent[], limit = 2): EventScenario[] {\n  const scenarios: EventScenario[] = [];\n\n  for (const event of events) {\n    if (scenarios.length >= limit) break;\n    const family = classifyEvent(event.title);\n    // Without a consensus there is no \"versus forecast\", so the whole table\n    // would be describing a comparison the viewer cannot make.\n    if (!family || !hasValue(event.consensus)) continue;\n    const inverted = INVERTED.test(event.title);\n    scenarios.push({\n      title: event.title,\n      countryCode: event.countryCode,\n      dateUtc: event.dateUtc,\n      previous: event.previous,\n      consensus: event.consensus,\n      family,\n      inverted,\n      rows: buildRows(family, inverted),\n      trap: TRAPS[family],\n    });\n  }\n\n  return scenarios;\n}\n","import { DigestLevels, DigestNumber, DigestSegment } from \"../types\";\n\nexport interface TechReading {\n  segmentId: string;\n  symbol: string;\n  signal: \"bullish\" | \"bearish\" | \"neutral\";\n  text: string;\n}\n\n// Vicki's own narration phrasing — deterministic, no AI: it always says\n// positive/negative/overbought/oversold, never anything looser.\nfunction classifySignal(indicatorLine: string): TechReading[\"signal\"] {\n  const lower = indicatorLine.toLowerCase();\n  if (/positive|bullish|overbought/.test(lower)) return \"bullish\";\n  if (/negative|bearish|oversold/.test(lower)) return \"bearish\";\n  return \"neutral\";\n}\n\nconst SIGNAL_TEXT: Record<TechReading[\"signal\"], string> = {\n  bullish: \"the indicator is reading bullish — buyers have the upper hand for now\",\n  bearish: \"the indicator is reading bearish — sellers have the upper hand for now\",\n  neutral: \"the indicator is reading neutral — no clear momentum either way\",\n};\n\nfunction findPrice(symbol: string, numbers: DigestNumber[]): number | null {\n  const match = numbers.find((n) => n.symbol === symbol);\n  const value = match ? parseFloat(match.value) : NaN;\n  return Number.isFinite(value) ? value : null;\n}\n\nfunction buildText(symbol: string, price: number, levels: DigestLevels, signal: TechReading[\"signal\"]): string {\n  if (price >= levels.r1) {\n    return `${symbol} is trading above its resistance at ${levels.r1}, and ${SIGNAL_TEXT[signal]}. Next level to watch is ${levels.r2}.`;\n  }\n  if (price <= levels.s1) {\n    return `${symbol} is trading below its support at ${levels.s1}, and ${SIGNAL_TEXT[signal]}. Next level to watch is ${levels.s2}.`;\n  }\n  return `${symbol} is trading between support (${levels.s1}) and resistance (${levels.r1}), and ${SIGNAL_TEXT[signal]}. A close above ${levels.r1} opens the way toward ${levels.r2}; a close below ${levels.s1} opens the way toward ${levels.s2}.`;\n}\n\nexport function buildTechReadings(\n  segments: DigestSegment[],\n  levels: DigestLevels[],\n  numbers: DigestNumber[],\n): TechReading[] {\n  const readings: TechReading[] = [];\n\n  for (const segment of segments) {\n    if (segment.kind !== \"tech\") continue;\n    const symbol = segment.label;\n    const segmentLevels = levels.find((l) => l.symbol === symbol);\n    const price = findPrice(symbol, numbers);\n    if (!segmentLevels || price === null) continue;\n\n    const signal = classifySignal(segmentLevels.indicatorLine);\n    readings.push({\n      segmentId: segment.id,\n      symbol,\n      signal,\n      text: buildText(symbol, price, segmentLevels, signal),\n    });\n  }\n\n  return readings;\n}\n","import { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport {\n  alpha,\n  clampBorderRadius,\n  isLight,\n  mix,\n  pickReadable,\n} from \"../News2/utils/contrast\";\nimport { ExplainerTokens } from \"./types\";\n\nconst SANS =\n  \"Inter, -apple-system, BlinkMacSystemFont, Segoe UI, system-ui, sans-serif\";\nconst HEADING = \"Poppins, Inter, sans-serif\";\n\n// Every size in this widget is authored against this baseline, so the brand's\n// own font size becomes a scale factor rather than 40+ hardcoded overrides.\nconst BASE_FONT_PX = 14;\n\nconst str = (v: string | null | undefined, d: string) =>\n  v && v.length > 0 ? v : d;\n\nconst DEFAULT_MAX_WIDTH = 1180;\nconst DEFAULT_UP = \"#129d5c\";\nconst DEFAULT_DOWN = \"#e0393e\";\nconst DEFAULT_ACCENT = \"#1268b3\";\n\nexport function resolveTokens(styles: WidgetStyle): ExplainerTokens {\n  const pageBackground = str(\n    styles.main_background,\n    styles.base_background || \"#f6f8fb\",\n  );\n  const light = isLight(pageBackground);\n  const ink = str(styles.video_explainer_text_color, pickReadable(pageBackground));\n  const cardBackground = str(\n    styles.video_explainer_card_background,\n    light\n      ? mix(pageBackground, \"#ffffff\", 0.75)\n      : mix(pageBackground, \"#ffffff\", 0.06),\n  );\n  const accent = str(\n    styles.video_explainer_accent,\n    str(styles.cta_button_background, DEFAULT_ACCENT),\n  );\n  const borderColor = styles.video_explainer_border_color;\n  const bodyFont = str(styles.video_explainer_body_font, str(styles.font_family, SANS));\n  const headingFont = styles.video_explainer_heading_font ?? styles.font_family;\n  const maxWidth = parseFloat(str(styles.video_explainer_max_width, \"\"));\n\n  return {\n    pageBackground,\n    cardBackground,\n    railBackground: str(\n      styles.video_explainer_rail_background,\n      light\n        ? mix(cardBackground, ink, 0.02)\n        : mix(cardBackground, \"#ffffff\", 0.03),\n    ),\n    tabBackground: str(styles.video_explainer_tab_background, cardBackground),\n    border: `1px solid ${borderColor || alpha(ink, 0.12)}`,\n    softBorder: `1px solid ${borderColor || alpha(ink, 0.07)}`,\n    ink,\n    inkMuted: str(styles.video_explainer_muted_text_color, alpha(ink, 0.72)),\n    inkSoft: str(styles.video_explainer_muted_text_color, alpha(ink, 0.52)),\n    accent,\n    accentSoft: str(styles.video_explainer_accent_soft, alpha(accent, 0.12)),\n    up: str(styles.video_explainer_up_color, DEFAULT_UP),\n    down: str(styles.video_explainer_down_color, DEFAULT_DOWN),\n    rounded: clampBorderRadius(\n      str(styles.video_explainer_rounded, str(styles.base_rounded, \"14px\")),\n      20,\n    ),\n    fontFamily: bodyFont,\n    headingFamily: headingFont ? `${headingFont}, ${HEADING}` : HEADING,\n    maxWidth: Number.isFinite(maxWidth) && maxWidth > 0 ? maxWidth : DEFAULT_MAX_WIDTH,\n    scale:\n      (parseFloat(str(styles.main_font_size, `${BASE_FONT_PX}px`)) ||\n        BASE_FONT_PX) / BASE_FONT_PX,\n  };\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport Branded, { useBrandedColors } from \"../../Branded\";\nimport { VideoEmbed } from \"./VideoEmbed\";\nimport { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport { fetchLatestVideo, LatestVideo } from \"./api\";\nimport { formatLangFilename } from \"../../../utils/formatLangFilename\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\n\nconst RTL_LANGS = [\"ar\", \"he\", \"ir\"];\n\ntype Props = { styles: WidgetStyle; dev?: boolean; size?: \"full\" | \"compact\" };\n\n// Unlike every other widget, this one isn't wrapped in Branded.WidgetContainer\n// (its card has its own bespoke layout), so it never got that container's\n// free height-reporting to the parent frame. Without it, an embedding page\n// can only guess a static iframe height, which drifts as soon as the title\n// wraps to a different number of lines or the video/no-video fallback swaps.\nconst NF_RESIZE_SOURCE = \"nf-widget\";\n\nconst FALLBACK = {\n  background: \"#241b34\",\n  gradientTo: \"#3f2437\",\n  text: \"#ffffff\",\n  muted: \"rgba(255,255,255,0.72)\",\n  accent: \"#ff6a2b\",\n  rounded: \"24px\",\n  // Fills whatever container the embedding page gives it by default — each\n  // client controls the width via their own layout. video_news_max_width\n  // stays available for a brand that wants a specific cap instead.\n  maxWidth: \"100%\",\n  font: \"Manrope\",\n} as const;\n\nfunction ArrowIcon(): JSX.Element {\n  return <svg aria-hidden=\"true\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\"><path d=\"M3 7.5h8M8 4l3.5 3.5L8 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>;\n}\n\nfunction ShareIcon(): JSX.Element {\n  return <svg aria-hidden=\"true\" width=\"17\" height=\"17\" viewBox=\"0 0 18 18\" fill=\"none\"><circle cx=\"13.5\" cy=\"3.5\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" /><circle cx=\"4.5\" cy=\"9\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" /><circle cx=\"13.5\" cy=\"14.5\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" /><path d=\"m6.3 8 5.3-3.2M6.3 10l5.3 3.2\" stroke=\"currentColor\" strokeWidth=\"1.4\" /></svg>;\n}\n\nfunction XLogo(): JSX.Element {\n  return <svg aria-hidden=\"true\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M18.9 2H22l-7.6 8.6L23 22h-6.9l-5.4-6.6L4.5 22H1.4l8.1-9.2L1 2h7l4.9 6.1L18.9 2Zm-1.2 18.2h1.9L6.4 3.7H4.4l13.3 16.5Z\" /></svg>;\n}\nfunction FacebookLogo(): JSX.Element {\n  return <svg aria-hidden=\"true\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M22 12a10 10 0 1 0-11.6 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.4v7A10 10 0 0 0 22 12Z\" /></svg>;\n}\nfunction WhatsAppLogo(): JSX.Element {\n  return <svg aria-hidden=\"true\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2a10 10 0 0 0-8.6 15.1L2 22l5-1.3A10 10 0 1 0 12 2Zm5.6 14.2c-.2.7-1.4 1.3-2 1.4-.5.1-1.2.1-1.9-.1-.4-.1-1-.3-1.7-.6-3-1.3-5-4.3-5.1-4.5-.1-.2-1.2-1.6-1.2-3.1s.8-2.2 1.1-2.5c.3-.3.6-.4.8-.4h.6c.2 0 .4 0 .6.5.2.5.7 1.8.8 1.9.1.1.1.3 0 .5-.1.2-.1.3-.3.5l-.4.5c-.1.2-.3.4-.1.7.2.3.9 1.5 1.9 2.4 1.3 1.2 2.4 1.5 2.7 1.7.3.2.5.1.7-.1l.6-.7c.2-.3.4-.2.7-.1.3.1 1.6.8 1.9.9.3.1.5.2.6.3.1.2.1.9-.1 1.6Z\" /></svg>;\n}\nfunction LinkedInLogo(): JSX.Element {\n  return <svg aria-hidden=\"true\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6.9 8.4H3.3V21h3.6V8.4ZM5.1 3.1A2.1 2.1 0 1 0 5.1 7.3 2.1 2.1 0 0 0 5.1 3.1ZM21 21v-7c0-3.4-1.8-5-4.3-5-2 0-2.9 1.1-3.4 1.9v-1.5H9.7c0 .1 0 4.4 0 12.6h3.6v-7c0-.4 0-.7.1-1 .3-.7.9-1.4 1.9-1.4 1.4 0 1.9 1 1.9 2.5V21H21Z\" /></svg>;\n}\n\nconst SHARE_TARGETS = [\n  { name: \"X\", Icon: XLogo, color: \"#000000\", buildUrl: (url: string, title: string) => `https://twitter.com/intent/tweet?url=${encodeURIComponent(url)}&text=${encodeURIComponent(title)}` },\n  { name: \"Facebook\", Icon: FacebookLogo, color: \"#1877F2\", buildUrl: (url: string) => `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}` },\n  { name: \"WhatsApp\", Icon: WhatsAppLogo, color: \"#25D366\", buildUrl: (url: string, title: string) => `https://wa.me/?text=${encodeURIComponent(`${title} ${url}`)}` },\n  { name: \"LinkedIn\", Icon: LinkedInLogo, color: \"#0A66C2\", buildUrl: (url: string) => `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}` },\n] as const;\n\nfunction VideoNewsContent({ styles, dev }: Props): JSX.Element {\n  const { logoSrc } = useBrandedColors();\n  const [video, setVideo] = useState<LatestVideo | null>(null);\n  const [parentPageUrl, setParentPageUrl] = useState<string | undefined>(undefined);\n  const [fullExplainerUrl, setFullExplainerUrl] = useState<string | undefined>(undefined);\n  const [sharePanelOpen, setSharePanelOpen] = useState(false);\n  const [copied, setCopied] = useState(false);\n  const shareRef = useRef<HTMLDivElement>(null);\n  const wrapRef = useRef<HTMLDivElement>(null);\n  const t = getDictionarySection(styles.lang, \"videoNews\");\n  const rtl = RTL_LANGS.includes(formatLangFilename(styles.lang || \"en\"));\n  const version = styles.video_news_version === \"v2\" ? \"v2\" : \"v1\";\n  const headingFont = styles.video_news_heading_font || FALLBACK.font;\n  const bodyFont = styles.video_news_body_font || FALLBACK.font;\n\n  useEffect(() => {\n    loadGoogleFont(headingFont, [700, 800]);\n    loadGoogleFont(bodyFont, [400, 500, 600, 700]);\n  }, [headingFont, bodyFont]);\n\n  // Only for sharing: the page embedding the iframe, not the iframe's own URL.\n  // The CTA never guesses a page on the client's site — a guessed path 404s.\n  useEffect(() => {\n    if (document.referrer) setParentPageUrl(document.referrer);\n    // Served as the teaser view of the video-explainer iframe, the same URL\n    // without ?view=teaser is the full explainer — a page that always exists.\n    const url = new URL(window.location.href);\n    if (url.searchParams.get(\"view\") === \"teaser\") {\n      url.searchParams.delete(\"view\");\n      setFullExplainerUrl(url.toString());\n    }\n  }, []);\n\n  useEffect(() => {\n    let active = true;\n    void fetchLatestVideo(styles.brand_name, styles.lang, dev).then((result) => {\n      if (active) setVideo(result);\n    });\n    return () => {\n      active = false;\n    };\n  }, [styles.brand_name, styles.lang, dev]);\n\n  useEffect(() => {\n    if (!sharePanelOpen) return;\n    const onClick = (e: MouseEvent): void => {\n      if (shareRef.current && !shareRef.current.contains(e.target as Node)) setSharePanelOpen(false);\n    };\n    document.addEventListener(\"click\", onClick);\n    return () => document.removeEventListener(\"click\", onClick);\n  }, [sharePanelOpen]);\n\n  useEffect(() => {\n    const el = wrapRef.current;\n    if (!el || typeof window === \"undefined\" || window.parent === window) return;\n    const report = (): void => {\n      window.parent.postMessage({ source: NF_RESIZE_SOURCE, height: el.scrollHeight }, \"*\");\n    };\n    const ro = new ResizeObserver(report);\n    ro.observe(el);\n    report();\n    return () => ro.disconnect();\n    // video/version can flip the wrapped element from unmounted (v1, no\n    // video yet) to mounted — re-run so the observer attaches once the ref\n    // is real, per the WidgetContainer gotcha: an empty-deps effect on a\n    // conditionally-rendered ref only ever sees it null.\n  }, [video, version]);\n\n  const design = useMemo(() => {\n    const background = styles.video_news_background_color || FALLBACK.background;\n    const gradientTo = styles.video_news_gradient_to || FALLBACK.gradientTo;\n    const gradient = styles.video_news_background_mode === \"solid\"\n      ? background\n      : `linear-gradient(${styles.video_news_gradient_angle || \"135deg\"}, ${background}, ${gradientTo})`;\n    return {\n      background: gradient,\n      text: styles.video_news_text_color || FALLBACK.text,\n      muted: styles.video_news_muted_text_color || FALLBACK.muted,\n      accent: styles.video_news_accent_color || FALLBACK.accent,\n      rounded: styles.video_news_rounded || FALLBACK.rounded,\n      maxWidth: styles.video_news_max_width || FALLBACK.maxWidth,\n    };\n  }, [styles]);\n\n  if (version === \"v1\") {\n    return <div ref={wrapRef}>{video && <VideoEmbed video={video} />}</div>;\n  }\n\n  const ctaUrl = styles.video_news_cta_url || fullExplainerUrl;\n  // Our own explainer page always opens in a new tab so the visitor keeps the client's site.\n  const ctaTarget = styles.video_news_cta_new_tab || !styles.video_news_cta_url ? \"_blank\" : \"_top\";\n  const logo = styles.video_news_logo_url || logoSrc;\n  const genericTitle = styles.video_news_title || t.title;\n  const title = styles.video_news_use_clickbait ? video?.clickbait || genericTitle : genericTitle;\n  const description = styles.video_news_description || video?.subHeadline || t.description;\n  const longTitle = title.length > 48;\n  const shareUrl = styles.video_news_cta_url || parentPageUrl || ctaUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n\n  // Always the same branded popover — navigator.share() support and its\n  // permission requirements vary enough across browsers (with or without\n  // \"web-share\" granted on the embedding iframe) that mixing it in gave an\n  // inconsistent experience: sometimes the OS sheet, sometimes this.\n  const share = (): void => setSharePanelOpen((open) => !open);\n\n  const copyLink = async (): Promise<void> => {\n    try {\n      await navigator.clipboard.writeText(shareUrl);\n      setCopied(true);\n      setTimeout(() => setCopied(false), 1500);\n    } catch {\n      // clipboard unavailable — no-op\n    }\n  };\n\n  return (\n    <div\n      ref={wrapRef}\n      style={{\n        background: design.background,\n        boxSizing: \"border-box\",\n        margin: \"0 auto\",\n        maxWidth: design.maxWidth,\n        // vertical spacing must be padding, not margin: `scrollHeight` (used\n        // to report our height to the embedding page) excludes an element's\n        // own margin, so a margin here silently clips the card and leaves a\n        // blank strip the height of the missing margin.\n        padding: \"clamp(12px, 2vw, 28px) clamp(12px, 2vw, 24px)\",\n        width: \"100%\",\n      }}\n    >\n      <section\n        className=\"nf-video-news-v2\"\n        dir={rtl ? \"rtl\" : undefined}\n        style={{\n          background: styles.video_news_background_mode === \"solid\"\n            ? design.background\n            : `radial-gradient(circle at 0% 0%, color-mix(in srgb, ${design.accent} 16%, transparent), transparent 34%), ${design.background}`,\n          borderRadius: design.rounded,\n          boxSizing: \"border-box\",\n          color: design.text,\n          display: \"grid\",\n          gap: \"clamp(24px, 3vw, 40px)\",\n          gridTemplateColumns: \"minmax(280px, 0.9fr) minmax(0, 1.1fr)\",\n          overflow: \"hidden\",\n          padding: \"clamp(20px, 2.4vw, 32px)\",\n        }}\n      >\n        <style>{`\n          .nf-video-news-v2 iframe, .nf-video-news-v2 video { display: block; width: 100% !important; height: 100% !important; }\n          @media (max-width: 760px) {\n            .nf-video-news-v2 { grid-template-columns: 1fr !important; }\n            .nf-video-news-copy { padding-top: 0 !important; text-align: center; }\n            .nf-video-news-logo, .nf-video-news-copy h2, .nf-video-news-copy p { margin-left: auto !important; margin-right: auto !important; }\n            .nf-video-news-cta-row { justify-content: center !important; }\n            .nf-video-news-media { justify-self: center !important; width: 100% !important; }\n          }\n          .nf-share-panel { animation: nf-share-in 0.15s ease-out; transform-origin: bottom left; }\n          @keyframes nf-share-in {\n            from { opacity: 0; transform: scale(0.92) translateY(4px); }\n            to { opacity: 1; transform: scale(1) translateY(0); }\n          }\n          .nf-share-icon:hover { transform: scale(1.12); }\n        `}</style>\n        <div className=\"nf-video-news-copy\" style={{ alignSelf: \"start\", fontFamily: bodyFont, paddingTop: 4 }}>\n          {styles.video_news_show_logo !== false && logo && (\n            <img className=\"nf-video-news-logo\" src={logo} alt={styles.brand_name} style={{ display: \"block\", height: 24, marginBottom: 24, maxWidth: 112, objectFit: \"contain\", objectPosition: \"left center\" }} />\n          )}\n          <p style={{ color: design.accent, fontSize: 13, fontWeight: 800, letterSpacing: \"0.14em\", margin: 0, textTransform: \"uppercase\" }}>\n            {styles.video_news_eyebrow || t.eyebrow}\n          </p>\n          <h2 style={{ fontFamily: headingFont, fontSize: longTitle ? \"clamp(32px, 3.4vw, 48px)\" : \"clamp(38px, 4vw, 56px)\", fontWeight: 800, letterSpacing: \"-0.045em\", lineHeight: 1.05, margin: \"16px 0 14px\", maxWidth: 430, textWrap: \"balance\" }}>\n            {title}\n          </h2>\n          <p style={{ color: design.muted, fontSize: 17, lineHeight: 1.55, margin: \"0 0 26px\", maxWidth: 410 }}>\n            {description}\n          </p>\n          <div className=\"nf-video-news-cta-row\" style={{ alignItems: \"center\", display: \"flex\", flexWrap: \"wrap\", gap: 18 }}>\n            {ctaUrl && <a href={ctaUrl} target={ctaTarget} rel={ctaTarget === \"_blank\" ? \"noreferrer\" : undefined} style={{ alignItems: \"center\", border: `1px solid ${design.accent}`, borderRadius: 999, color: design.accent, cursor: \"pointer\", display: \"inline-flex\", fontSize: 15, fontWeight: 700, gap: 8, padding: \"13px 22px\", textDecoration: \"none\" }}>\n              {styles.video_news_cta_label || t.cta}<span style={{ display: \"inline-flex\", transform: rtl ? \"scaleX(-1)\" : undefined }}><ArrowIcon /></span>\n            </a>}\n            {styles.video_news_show_share !== false && (\n              <div ref={shareRef} style={{ position: \"relative\" }}>\n                <button type=\"button\" onClick={share} style={{ alignItems: \"center\", background: \"transparent\", border: 0, color: design.muted, cursor: \"pointer\", display: \"inline-flex\", font: \"inherit\", fontSize: 15, gap: 7, padding: 8 }}>\n                  <ShareIcon /> {styles.video_news_share_label || t.share}\n                </button>\n                {sharePanelOpen && (\n                  <div className=\"nf-share-panel\" style={{ alignItems: \"center\", background: \"#fff\", borderRadius: 14, boxShadow: \"0 20px 45px rgba(0,0,0,0.22)\", display: \"flex\", gap: 10, left: 0, padding: 12, bottom: \"calc(100% + 10px)\", position: \"absolute\", zIndex: 20 }}>\n                    {SHARE_TARGETS.map((target) => (\n                      <a key={target.name} href={target.buildUrl(shareUrl, title)} target=\"_blank\" rel=\"noreferrer\" title={t.shareOn.replace(\"{name}\", target.name)} className=\"nf-share-icon\" style={{ alignItems: \"center\", background: target.color, borderRadius: \"50%\", color: \"#fff\", display: \"flex\", height: 34, justifyContent: \"center\", textDecoration: \"none\", transition: \"transform 0.12s ease\", width: 34 }}>\n                        <target.Icon />\n                      </a>\n                    ))}\n                    <button type=\"button\" onClick={() => void copyLink()} style={{ background: \"transparent\", border: `1px solid ${design.accent}`, borderRadius: 999, color: design.accent, cursor: \"pointer\", fontSize: 12, fontWeight: 700, padding: \"8px 12px\", whiteSpace: \"nowrap\" }}>\n                      {copied ? t.copied : t.copyLink}\n                    </button>\n                  </div>\n                )}\n              </div>\n            )}\n          </div>\n        </div>\n        <div className=\"nf-video-news-media\" style={{ alignSelf: \"center\", justifySelf: \"end\", aspectRatio: \"16 / 9\", height: \"clamp(200px, 24vw, 380px)\", width: \"auto\", maxWidth: \"100%\", border: \"1px solid rgba(255,255,255,0.12)\", borderRadius: 18, overflow: \"hidden\", position: \"relative\" }}>\n          {video ? <VideoEmbed video={video} /> : <p style={{ color: design.muted }}>{t.noVideo}</p>}\n        </div>\n      </section>\n    </div>\n  );\n}\n\nexport function VideoNews({ styles, dev, size }: Props): JSX.Element {\n  return <Branded style={styles}><VideoNewsContent styles={styles} dev={dev} size={size} /></Branded>;\n}\n","import { HlsPlayer } from \"../VideoExplainer/parts/HlsPlayer\";\nimport type { LatestVideo } from \"./api\";\n\nexport function VideoEmbed({ video }: { video: LatestVideo }) {\n  return (\n    <div style={{ position: \"relative\", width: \"100%\", aspectRatio: \"16 / 9\" }}>\n      <HlsPlayer videoId={video.channelKey} />\n    </div>\n  );\n}\n","export type VideoProvider = \"streamvault\";\n\nexport type LatestVideo = {\n  channelKey: string;\n  provider: VideoProvider;\n  title: string;\n  clickbait: string;\n  subHeadline: string;\n};\n\nexport async function fetchLatestVideo(\n  brand: string,\n  lang: string,\n  dev = false,\n): Promise<LatestVideo | null> {\n  const local = typeof window !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(window.location.hostname);\n  const url = `${dev || local ? \"http://localhost:3001\" : \"https://widget.newsfactory.tv\"}/api/widgets/video-news`;\n  try {\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ brand, lang }),\n    });\n    const data: unknown = await response.json();\n    if (!response.ok || typeof data !== \"object\" || data === null) return null;\n    if (!(\"channelKey\" in data) || typeof data.channelKey !== \"string\") return null;\n    return {\n      channelKey: data.channelKey,\n      provider: \"streamvault\",\n      title: \"title\" in data && typeof data.title === \"string\" ? data.title : \"\",\n      clickbait: \"clickbait\" in data && typeof data.clickbait === \"string\" ? data.clickbait : \"\",\n      subHeadline: \"subHeadline\" in data && typeof data.subHeadline === \"string\" ? data.subHeadline : \"\",\n    };\n  } catch {\n    return null;\n  }\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport Branded from \"../../Branded\";\nimport { FancyLoader } from \"../../FancyLoader\";\nimport dictionaries from \"../../../dictionaries\";\nimport type { AnalystRecommendationsDictionary } from \"../../../types/Dictionary\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport { fetchAnalystRecommendation } from \"./fetchAnalystRecommendation\";\nimport { resolveAnalystRecommendationTheme } from \"./theme\";\nimport type { AnalystRecommendationData } from \"./types\";\nimport {\n  COMPACT_LABEL_SCALE_THRESHOLD,\n  COMPACT_LABEL_WIDTH_THRESHOLD,\n} from \"./constants\";\nimport { StateMessage } from \"./parts/StateMessage\";\nimport { HorizontalContent } from \"./parts/HorizontalContent\";\nimport { VerticalContent } from \"./parts/VerticalContent\";\n\nexport type AnalystRecommendationsMode = \"vertical\" | \"horizontal\";\n\nexport type RawAnalystRecommendationsProps = {\n  styles: WidgetStyle;\n  assetId: number;\n  showAsset: boolean;\n  mode?: AnalystRecommendationsMode;\n};\n\nexport type AnalystRecommendationsProps = Omit<\n  RawAnalystRecommendationsProps,\n  \"showAsset\"\n> & {\n  showAsset?: boolean;\n  size?: \"full\" | \"screen\";\n};\n\ntype LoadState =\n  | { status: \"loading\" }\n  | { status: \"ready\"; data: AnalystRecommendationData }\n  | { status: \"empty\" }\n  | { status: \"error\" };\n\nexport function RawAnalystRecommendations({\n  styles,\n  assetId,\n  showAsset,\n  mode: modeProp,\n}: RawAnalystRecommendationsProps) {\n  const mode: AnalystRecommendationsMode =\n    modeProp ?? styles.analyst_recommendations_mode ?? \"vertical\";\n  const frameRef = useRef<HTMLElement | null>(null);\n  const translations = useMemo(() => {\n    const lang = styles.lang?.toLowerCase() || \"en\";\n    return (dictionaries[lang] || dictionaries.en)\n      .analystRecommendations as AnalystRecommendationsDictionary;\n  }, [styles.lang]);\n  const theme = useMemo(\n    () => resolveAnalystRecommendationTheme(styles),\n    [styles],\n  );\n  const [state, setState] = useState<LoadState>({ status: \"loading\" });\n  const [containerSize, setContainerSize] = useState({\n    width: 480,\n    height: 420,\n  });\n\n  const widthScale = containerSize.width / (mode === \"horizontal\" ? 296 : 480);\n  const heightScale =\n    containerSize.height /\n    (mode === \"horizontal\" ? 160 : showAsset ? 420 : 390);\n  const scale =\n    mode === \"horizontal\"\n      ? Math.min(1.25, Math.max(0.4, widthScale))\n      : Math.min(1.25, Math.max(0.24, Math.min(widthScale, heightScale)));\n  const showMeterLabels =\n    scale >= COMPACT_LABEL_SCALE_THRESHOLD &&\n    containerSize.width >= COMPACT_LABEL_WIDTH_THRESHOLD;\n  const scaled = (value: number, minimum = 0) =>\n    `${Math.max(minimum, value * scale)}px`;\n\n  useEffect(() => {\n    const element = frameRef.current;\n    if (!element || typeof ResizeObserver === \"undefined\") return;\n    const updateSize = (width: number, height: number) => {\n      if (width <= 0 || height <= 0) return;\n      setContainerSize((current) =>\n        Math.abs(current.width - width) < 0.5 &&\n        Math.abs(current.height - height) < 0.5\n          ? current\n          : { width, height },\n      );\n    };\n    const bounds = element.getBoundingClientRect();\n    updateSize(bounds.width, bounds.height);\n    const observer = new ResizeObserver(([entry]) =>\n      updateSize(entry.contentRect.width, entry.contentRect.height),\n    );\n    observer.observe(element);\n    return () => observer.disconnect();\n  }, [state.status]);\n\n  useEffect(() => {\n    loadGoogleFont(styles.font_family || undefined);\n  }, [styles.font_family]);\n\n  useEffect(() => {\n    if (!Number.isInteger(assetId) || assetId <= 0) {\n      setState({ status: \"empty\" });\n      return;\n    }\n    const controller = new AbortController();\n    setState({ status: \"loading\" });\n    fetchAnalystRecommendation(assetId, controller.signal)\n      .then((data) =>\n        setState(data ? { status: \"ready\", data } : { status: \"empty\" }),\n      )\n      .catch((error) => {\n        if ((error as Error).name !== \"AbortError\") {\n          console.error(\"Failed to load analyst recommendations:\", error);\n          setState({ status: \"error\" });\n        }\n      });\n    return () => controller.abort();\n  }, [assetId]);\n\n  const frameStyle: React.CSSProperties = {\n    width: \"100%\",\n    height: \"100%\",\n    minWidth: 0,\n    boxSizing: \"border-box\",\n    color: theme.text,\n    fontFamily: styles.font_family || \"system-ui, -apple-system, sans-serif\",\n    overflow: \"hidden\",\n  };\n\n  if (state.status === \"loading\") {\n    return (\n      <div ref={frameRef as React.RefObject<HTMLDivElement>} style={frameStyle}>\n        <StateMessage theme={theme}>\n          <FancyLoader />\n        </StateMessage>\n      </div>\n    );\n  }\n  if (state.status !== \"ready\") {\n    return (\n      <div ref={frameRef as React.RefObject<HTMLDivElement>} style={frameStyle}>\n        <StateMessage theme={theme}>\n          {state.status === \"empty\"\n            ? translations.noData\n            : translations.loadError}\n        </StateMessage>\n      </div>\n    );\n  }\n\n  const { data } = state;\n  const direction = [\"ar\", \"he\", \"ir\"].includes(styles.lang?.toLowerCase())\n    ? \"rtl\"\n    : \"ltr\";\n  const titleStyle: React.CSSProperties = {\n    margin: mode === \"horizontal\" ? `0 0 ${scaled(10)}` : \"0\",\n    color: theme.secondaryText,\n    fontSize: scaled(Number.parseFloat(styles.main_font_size || \"14\") || 14, 8),\n    fontWeight: styles.font_weight_heading || \"600\",\n    textAlign: \"start\",\n  };\n\n  return (\n    <section ref={frameRef} style={frameStyle} dir={direction}>\n      {mode === \"horizontal\" ? (\n        <HorizontalContent\n          data={data}\n          theme={theme}\n          translations={translations}\n          scale={scale}\n          scaled={scaled}\n          styles={styles}\n        />\n      ) : (\n        <VerticalContent\n          data={data}\n          theme={theme}\n          translations={translations}\n          scale={scale}\n          scaled={scaled}\n          showMeterLabels={showMeterLabels}\n          showAsset={showAsset}\n          styles={styles}\n        />\n      )}\n    </section>\n  );\n}\n\nexport function AnalystRecommendations({\n  styles,\n  assetId,\n  showAsset,\n  mode,\n  size = \"screen\",\n}: AnalystRecommendationsProps) {\n  const configuredShowAsset = styles.analyst_recommendations_show_asset;\n  const resolvedShowAsset =\n    showAsset ??\n    (configuredShowAsset === null || configuredShowAsset === undefined\n      ? true\n      : Boolean(configuredShowAsset));\n  const resolvedMode: AnalystRecommendationsMode =\n    mode ?? styles.analyst_recommendations_mode ?? \"vertical\";\n  const styleWithCta: WidgetStyle = {\n    ...styles,\n    cta_button_position: {\n      ...(styles.cta_button_position || {}),\n      analystRecommendations:\n        styles.cta_button_position?.analystRecommendations || \"topRight\",\n    } as WidgetStyle[\"cta_button_position\"],\n  };\n\n  return (\n    <Branded style={styleWithCta}>\n      <Branded.WidgetContainer widgetName=\"analystRecommendations\" size={size}>\n        <RawAnalystRecommendations\n          styles={styleWithCta}\n          assetId={assetId}\n          showAsset={resolvedShowAsset}\n          mode={resolvedMode}\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n","import { AnalystRecommendationData } from \"./types\";\nimport { WIDGET_API_BASE } from \"../../../utils/widgetApiBase\";\n\nexport async function fetchAnalystRecommendation(\n  assetId: number,\n  signal?: AbortSignal,\n): Promise<AnalystRecommendationData | null> {\n  const response = await fetch(\n    `${WIDGET_API_BASE}/api/widgets/analyst-recommendations/${assetId}`,\n    { cache: \"no-store\", signal },\n  );\n\n  if (response.status === 404) return null;\n  if (!response.ok) {\n    throw new Error(`Analyst recommendations request failed (${response.status})`);\n  }\n\n  const body = (await response.json()) as {\n    recommendation?: AnalystRecommendationData;\n  };\n  if (!body.recommendation) {\n    throw new Error(\"Analyst recommendations response is missing data\");\n  }\n  return body.recommendation;\n}\n","import { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { AnalystRecommendationTheme } from \"./types\";\n\nfunction withAlpha(color: string, alpha: number): string {\n  const m = color.match(/^#([0-9a-f]{6})$/i);\n  if (m) {\n    const n = parseInt(m[1], 16);\n    return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${alpha})`;\n  }\n  return color;\n}\n\nexport function resolveAnalystRecommendationTheme(\n  styles: WidgetStyle,\n): AnalystRecommendationTheme {\n  const baseText =\n    styles.analyst_recommendations_text_color ||\n    styles.results_text_color ||\n    styles.main_text_color ||\n    \"#111827\";\n  const secondaryText =\n    styles.analyst_recommendations_secondary_text_color ||\n    styles.main_text_color ||\n    \"#6b7280\";\n  const strongSellBar =\n    styles.analyst_recommendations_strong_sell_bar_color ||\n    styles.analyst_recommendations_sell_color ||\n    \"#ef4444\";\n  const moderateSellBar =\n    styles.analyst_recommendations_moderate_sell_bar_color ||\n    styles.analyst_recommendations_sell_color ||\n    \"#f87171\";\n  const holdBar =\n    styles.analyst_recommendations_hold_bar_color ||\n    styles.analyst_recommendations_neutral_color ||\n    \"#9ca3af\";\n  const moderateBuyBar =\n    styles.analyst_recommendations_moderate_buy_bar_color ||\n    styles.analyst_recommendations_buy_color ||\n    \"#60a5fa\";\n  const strongBuyBar =\n    styles.analyst_recommendations_strong_buy_bar_color ||\n    styles.analyst_recommendations_buy_color ||\n    \"#1689e8\";\n\n  return {\n    text: baseText,\n    secondaryText,\n    padding: styles.analyst_recommendations_padding || \"20px\",\n    buy: strongBuyBar,\n    neutral: holdBar,\n    sell: strongSellBar,\n    options: {\n      strong_sell: {\n        bar: strongSellBar,\n        text:\n          styles.analyst_recommendations_strong_sell_text_color ||\n          strongSellBar,\n      },\n      moderate_sell: {\n        bar: moderateSellBar,\n        text:\n          styles.analyst_recommendations_moderate_sell_text_color ||\n          moderateSellBar,\n      },\n      hold: {\n        bar: holdBar,\n        text:\n          styles.analyst_recommendations_hold_text_color || holdBar,\n      },\n      moderate_buy: {\n        bar: moderateBuyBar,\n        text:\n          styles.analyst_recommendations_moderate_buy_text_color ||\n          moderateBuyBar,\n      },\n      strong_buy: {\n        bar: strongBuyBar,\n        text:\n          styles.analyst_recommendations_strong_buy_text_color || strongBuyBar,\n      },\n    },\n    track: styles.analyst_recommendations_track_color || withAlpha(baseText, 0.15),\n    needle:\n      styles.analyst_recommendations_needle_color ||\n      baseText,\n  };\n}\n","import type { AnalystConsensusLabel } from \"./types\";\nimport type { AnalystRecommendationsDictionary } from \"../../../types/Dictionary\";\n\nexport const LABEL_KEY: Record<AnalystConsensusLabel, keyof AnalystRecommendationsDictionary> = {\n  strong_buy: \"strongBuy\",\n  moderate_buy: \"moderateBuy\",\n  hold: \"hold\",\n  moderate_sell: \"moderateSell\",\n  strong_sell: \"strongSell\",\n  unknown: \"hold\",\n};\n\nexport const COMPACT_LABEL_SCALE_THRESHOLD = 0.62;\nexport const COMPACT_LABEL_WIDTH_THRESHOLD = 320;\n","import type { AnalystRecommendationTheme } from \"../types\";\n\ntype Props = {\n  children: React.ReactNode;\n  theme: AnalystRecommendationTheme;\n};\n\nexport function StateMessage({ children, theme }: Props) {\n  return (\n    <div\n      style={{\n        width: \"100%\",\n        padding: \"32px 16px\",\n        color: theme.secondaryText,\n        textAlign: \"center\",\n        boxSizing: \"border-box\",\n      }}\n    >\n      {children}\n    </div>\n  );\n}\n","const LOCALE_MAP: Record<string, string> = {\n  ar: \"ar\",\n  cn: \"zh-CN\",\n  cs: \"cs-CZ\",\n  cz: \"cs-CZ\",\n  esmx: \"es-MX\",\n  he: \"he-IL\",\n  ir: \"fa-IR\",\n  jp: \"ja-JP\",\n  km: \"km-KH\",\n  kr: \"ko-KR\",\n  my: \"ms-MY\",\n  ptbr: \"pt-BR\",\n  vn: \"vi-VN\",\n};\n\nexport function formatTarget(\n  value: number | null,\n  currency: string | null,\n  lang: string,\n): string {\n  if (value === null || !Number.isFinite(value)) return \"—\";\n  const normalized = lang.toLowerCase().replace(/_/g, \"-\");\n  const locale = LOCALE_MAP[normalized] || normalized || \"en\";\n  try {\n    return new Intl.NumberFormat(locale, {\n      ...(currency ? { style: \"currency\", currency } : {}),\n      maximumFractionDigits: 2,\n    }).format(value);\n  } catch {\n    return `${value.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${\n      currency ? ` ${currency}` : \"\"\n    }`;\n  }\n}\n","import { useEffect, useId, useState } from \"react\";\nimport { resolveRecommendationScore, scoreToGaugeAngle } from \"../score\";\nimport type {\n  AnalystRecommendationData,\n  AnalystRecommendationTheme,\n} from \"../types\";\nimport type { AnalystRecommendationsDictionary } from \"../../../../types/Dictionary\";\nimport { LABEL_KEY } from \"../constants\";\n\nfunction polarPoint(angle: number, radius: number) {\n  const radians = (angle * Math.PI) / 180;\n  return {\n    x: 180 + radius * Math.cos(radians),\n    y: 150 - radius * Math.sin(radians),\n  };\n}\n\nfunction arcPath(startAngle: number, endAngle: number, radius: number) {\n  const start = polarPoint(startAngle, radius);\n  const end = polarPoint(endAngle, radius);\n  return `M ${start.x} ${start.y} A ${radius} ${radius} 0 0 1 ${end.x} ${end.y}`;\n}\n\nconst SWEEP_DURATION = 1200;\n\nfunction easeOutCubic(t: number) {\n  return 1 - Math.pow(1 - t, 3);\n}\n\nfunction useNeedleSweep(targetAngle: number) {\n  const [progress, setProgress] = useState(0);\n  useEffect(() => {\n    if (typeof window === \"undefined\") {\n      setProgress(1);\n      return;\n    }\n    const reducedMotion = window.matchMedia?.(\n      \"(prefers-reduced-motion: reduce)\",\n    ).matches;\n    if (reducedMotion) {\n      setProgress(1);\n      return;\n    }\n    let raf = 0;\n    const start = performance.now();\n    const tick = (now: number) => {\n      const t = Math.min(1, (now - start) / SWEEP_DURATION);\n      setProgress(easeOutCubic(t));\n      if (t < 1) raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [targetAngle]);\n  return 180 + (targetAngle - 180) * progress;\n}\n\nfunction useNeedleWobble() {\n  const [wobble, setWobble] = useState(0);\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n    const reducedMotion = window.matchMedia?.(\n      \"(prefers-reduced-motion: reduce)\",\n    ).matches;\n    if (reducedMotion) return;\n    let raf = 0;\n    const start = performance.now();\n    const tick = (now: number) => {\n      const t = (now - start) / 1500;\n      const value =\n        Math.sin(t * 0.7) * 1.6 +\n        Math.sin(t * 2.9 + 1.3) * 1.1 +\n        Math.sin(t * 4.3 + 2.1) * 0.55;\n      setWobble(value);\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, []);\n  return wobble;\n}\n\ntype Props = {\n  data: AnalystRecommendationData;\n  theme: AnalystRecommendationTheme;\n  translations: AnalystRecommendationsDictionary;\n  showLabels: boolean;\n};\n\nexport function Gauge({ data, theme, translations, showLabels }: Props) {\n  const gradientId = `analyst-recommendation-gradient-${useId().replace(/:/g, \"\")}`;\n  const score = resolveRecommendationScore(\n    data.recommendationScore,\n    data.counts,\n    data.consensusLabel,\n  );\n  const needleAngle = scoreToGaugeAngle(score);\n  const sweptAngle = useNeedleSweep(needleAngle);\n  const wobble = useNeedleWobble();\n  const displayAngle = sweptAngle + wobble;\n  const needleTip = polarPoint(displayAngle, 72);\n  const needleRadians = (displayAngle * Math.PI) / 180;\n  const needlePerpendicular = {\n    x: Math.sin(needleRadians),\n    y: Math.cos(needleRadians),\n  };\n  const needleBaseHalfWidth = 2.75;\n  const activeLabel =\n    data.consensusLabel === \"unknown\" ? \"hold\" : data.consensusLabel;\n\n  const segments = [\n    {\n      key: \"strong_sell\",\n      colors: theme.options.strong_sell,\n      label: translations.strongSell,\n    },\n    {\n      key: \"moderate_sell\",\n      colors: theme.options.moderate_sell,\n      label: translations.moderateSell,\n    },\n    { key: \"hold\", colors: theme.options.hold, label: translations.hold },\n    {\n      key: \"moderate_buy\",\n      colors: theme.options.moderate_buy,\n      label: translations.moderateBuy,\n    },\n    {\n      key: \"strong_buy\",\n      colors: theme.options.strong_buy,\n      label: translations.strongBuy,\n    },\n  ];\n\n  return (\n    <svg\n      viewBox={showLabels ? \"0 0 360 160\" : \"42 34 276 124\"}\n      width=\"100%\"\n      role=\"img\"\n      aria-label={`${translations.title}: ${translations[LABEL_KEY[data.consensusLabel]]}`}\n      style={{ display: \"block\", overflow: \"visible\" }}\n    >\n      <defs>\n        <linearGradient\n          id={gradientId}\n          gradientUnits=\"userSpaceOnUse\"\n          x1=\"74\"\n          y1=\"150\"\n          x2=\"286\"\n          y2=\"150\"\n        >\n          <stop offset=\"0%\" stopColor={theme.options.strong_sell.bar} />\n          <stop offset=\"25%\" stopColor={theme.options.moderate_sell.bar} />\n          <stop offset=\"50%\" stopColor={theme.options.hold.bar} />\n          <stop offset=\"75%\" stopColor={theme.options.moderate_buy.bar} />\n          <stop offset=\"100%\" stopColor={theme.options.strong_buy.bar} />\n        </linearGradient>\n      </defs>\n      <path\n        d={arcPath(180, 0, 106)}\n        fill=\"none\"\n        stroke={theme.track}\n        strokeWidth=\"8\"\n        strokeLinecap=\"butt\"\n      />\n      <path\n        d={arcPath(180, displayAngle, 106)}\n        fill=\"none\"\n        stroke={`url(#${gradientId})`}\n        strokeWidth=\"8\"\n        strokeLinecap=\"butt\"\n      />\n      {segments.map((segment, index) => {\n        const labelPoint = polarPoint(162 - index * 36, 139);\n        return (\n          <g key={segment.label}>\n            {showLabels && (\n              <text\n                x={labelPoint.x}\n                y={labelPoint.y}\n                textAnchor=\"middle\"\n                dominantBaseline=\"middle\"\n                fill={\n                  segment.key === activeLabel\n                    ? segment.colors.text\n                    : theme.secondaryText\n                }\n                fontSize=\"9.5\"\n                fontWeight=\"600\"\n              >\n                {segment.label}\n              </text>\n            )}\n          </g>\n        );\n      })}\n      <polygon\n        points={`${180 + needlePerpendicular.x * needleBaseHalfWidth},${150 + needlePerpendicular.y * needleBaseHalfWidth} ${needleTip.x},${needleTip.y} ${180 - needlePerpendicular.x * needleBaseHalfWidth},${150 - needlePerpendicular.y * needleBaseHalfWidth}`}\n        fill={theme.needle}\n      />\n      <circle cx=\"180\" cy=\"150\" r=\"5.5\" fill={theme.needle} />\n    </svg>\n  );\n}\n","import {\n  AnalystConsensusLabel,\n  AnalystRecommendationCounts,\n} from \"./types\";\n\nconst LABEL_SCORE: Record<AnalystConsensusLabel, number> = {\n  strong_buy: 1,\n  moderate_buy: 2,\n  hold: 3,\n  moderate_sell: 4,\n  strong_sell: 5,\n  unknown: 3,\n};\n\nexport function resolveRecommendationScore(\n  score: number | null,\n  counts: AnalystRecommendationCounts,\n  label: AnalystConsensusLabel,\n): number {\n  if (typeof score === \"number\" && Number.isFinite(score)) {\n    return Math.min(5, Math.max(1, score));\n  }\n\n  if (counts.total > 0) {\n    const weighted =\n      counts.strongBuy +\n      counts.buy * 2 +\n      counts.hold * 3 +\n      counts.sell * 4 +\n      counts.strongSell * 5;\n    return Math.min(5, Math.max(1, weighted / counts.total));\n  }\n\n  return LABEL_SCORE[label];\n}\n\nexport function scoreToGaugeAngle(score: number): number {\n  return 18 + (Math.min(5, Math.max(1, score)) - 1) * 36;\n}\n","import type {\n  AnalystRecommendationData,\n  AnalystRecommendationTheme,\n} from \"../types\";\nimport type { AnalystRecommendationsDictionary } from \"../../../../types/Dictionary\";\nimport type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport { LABEL_KEY } from \"../constants\";\nimport { formatTarget } from \"../formatTarget\";\nimport { Gauge } from \"./Gauge\";\n\ntype Props = {\n  data: AnalystRecommendationData;\n  theme: AnalystRecommendationTheme;\n  translations: AnalystRecommendationsDictionary;\n  scale: number;\n  scaled: (v: number, min?: number) => string;\n  styles: WidgetStyle;\n};\n\nexport function HorizontalContent({\n  data,\n  theme,\n  translations,\n  scale,\n  scaled,\n  styles,\n}: Props) {\n  const resultLabel = translations[LABEL_KEY[data.consensusLabel]];\n  const resultTheme =\n    theme.options[\n      data.consensusLabel === \"unknown\" ? \"hold\" : data.consensusLabel\n    ];\n  const counts = [\n    {\n      count: data.counts.groupedSell,\n      label: translations.sell,\n      color: theme.options.strong_sell.text,\n    },\n    {\n      count: data.counts.hold,\n      label: translations.hold,\n      color: theme.options.hold.text,\n    },\n    {\n      count: data.counts.groupedBuy,\n      label: translations.buy,\n      color: theme.options.strong_buy.text,\n    },\n  ];\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"space-between\",\n        gap: scaled(16),\n        width: \"100%\",\n        minWidth: 0,\n        height: \"100%\",\n      }}\n    >\n      <div style={{ flex: \"0 0 auto\", width: scaled(110, 80) }}>\n        <Gauge\n          data={data}\n          theme={theme}\n          translations={translations}\n          showLabels={false}\n        />\n      </div>\n\n      <div\n        style={{\n          // flex: \"0 0 auto\",\n          display: \"flex\",\n          flexDirection: \"column\",\n          padding: scaled(8, 4),\n          gap: scaled(6),\n        }}\n      >\n        {counts.map(({ count, label, color }) => (\n          <div\n            key={label}\n            style={{\n              display: \"grid\",\n              gridTemplateColumns: \"1fr 1fr\",\n              gap: scaled(4),\n            }}\n          >\n            <span\n              style={{\n                fontSize: scaled(20, 11),\n                fontWeight: 700,\n                color,\n                lineHeight: 1,\n                textAlign: \"end\",\n              }}\n            >\n              {count}\n            </span>\n            <span\n              style={{ fontSize: scaled(12, 9), color: theme.secondaryText }}\n            >\n              {label}\n            </span>\n          </div>\n        ))}\n      </div>\n\n      <div style={{ width: \"fit-content\", minWidth: 0 }}>\n        <div\n          style={{\n            fontSize: scaled(15, 10),\n            fontWeight: 700,\n            color: resultTheme.text,\n            textTransform: \"uppercase\",\n            lineHeight: 1.2,\n          }}\n        >\n          {resultLabel}\n        </div>\n        <div\n          style={{\n            marginTop: scaled(8),\n            fontSize: scaled(11, 8),\n            color: theme.secondaryText,\n          }}\n        >\n          {translations.averageTarget}\n        </div>\n        <div\n          style={{\n            fontSize: scaled(15, 10),\n            fontWeight: 700,\n            color: theme.text,\n          }}\n        >\n          {formatTarget(\n            data.targetMeanPrice,\n            data.currency,\n            styles.lang || \"en\",\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import type { AnalystRecommendationData, AnalystRecommendationTheme } from \"../types\";\nimport type { AnalystRecommendationsDictionary } from \"../../../../types/Dictionary\";\nimport type { WidgetStyle } from \"../../../../types/WidgetStyle\";\nimport { LABEL_KEY } from \"../constants\";\nimport { formatTarget } from \"../formatTarget\";\nimport { Gauge } from \"./Gauge\";\n\ntype Props = {\n  data: AnalystRecommendationData;\n  theme: AnalystRecommendationTheme;\n  translations: AnalystRecommendationsDictionary;\n  scale: number;\n  scaled: (v: number, min?: number) => string;\n  showMeterLabels: boolean;\n  showAsset: boolean;\n  styles: WidgetStyle;\n};\n\nexport function VerticalContent({\n  data,\n  theme,\n  translations,\n  scale,\n  scaled,\n  showMeterLabels,\n  showAsset,\n  styles,\n}: Props) {\n  const resultLabel = translations[LABEL_KEY[data.consensusLabel]];\n  const resultTheme = theme.options[data.consensusLabel === \"unknown\" ? \"hold\" : data.consensusLabel];\n\n  return (\n    <div style={{ width: \"100%\", maxWidth: `${480 * scale}px`, margin: `${scaled(8)} auto 0` }}>\n      {showAsset && (\n        <div\n          style={{\n            marginBottom: scaled(4),\n            color: theme.text,\n            fontSize: scaled(18, 9),\n            fontWeight: styles.font_weight_heading || \"700\",\n            textAlign: \"center\",\n          }}\n        >\n          {data.asset.name}\n          <span style={{ marginInlineStart: scaled(8), color: theme.secondaryText, fontSize: scaled(13, 8), fontWeight: styles.font_weight_body || \"400\" }}>\n            {data.asset.symbol}\n          </span>\n        </div>\n      )}\n\n      <div style={{ width: \"100%\", maxWidth: `${420 * scale}px`, margin: \"auto\" }}>\n        <Gauge data={data} theme={theme} translations={translations} showLabels={showMeterLabels} />\n      </div>\n\n      <div\n        style={{\n          marginTop: scaled(2),\n          color: resultTheme.text,\n          fontSize: scaled(22, 10),\n          fontWeight: styles.font_weight_heading || \"700\",\n          lineHeight: 1.1,\n          textAlign: \"center\",\n          textTransform: \"uppercase\",\n        }}\n      >\n        {resultLabel}\n      </div>\n\n      <div\n        style={{\n          display: \"grid\",\n          gridTemplateColumns: \"repeat(3, minmax(0, 1fr))\",\n          gap: scaled(8),\n          width: \"100%\",\n          maxWidth: `${300 * scale}px`,\n          margin: `${scaled(14)} auto 0`,\n          textAlign: \"center\",\n        }}\n      >\n        {[\n          [data.counts.groupedSell, translations.sell, theme.options.strong_sell.text],\n          [data.counts.hold,        translations.hold, theme.options.hold.text],\n          [data.counts.groupedBuy,  translations.buy,  theme.options.strong_buy.text],\n        ].map(([count, label, color]) => (\n          <div key={String(label)}>\n            <div style={{ color: String(color), fontSize: scaled(22, 9), fontWeight: 700 }}>{count}</div>\n            <div style={{ color: theme.secondaryText, fontSize: scaled(13, 8) }}>{label}</div>\n          </div>\n        ))}\n      </div>\n\n      <div\n        style={{\n          marginTop: scaled(18),\n          paddingTop: scaled(14),\n          borderTop: `1px solid ${theme.track}`,\n          color: theme.secondaryText,\n          fontSize: scaled(13, 8),\n          textAlign: \"center\",\n        }}\n      >\n        {translations.averageTarget}:{\" \"}\n        <strong style={{ color: theme.text }}>\n          {formatTarget(data.targetMeanPrice, data.currency, styles.lang || \"en\")}\n        </strong>\n      </div>\n    </div>\n  );\n}\n","import {\n  CSSProperties,\n  FC,\n  ReactNode,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport {\n  CtaPosition,\n  WidgetComboKey,\n  WidgetKey,\n  WidgetStyle,\n} from \"../../../types/WidgetStyle\";\nimport { RawNews, RawNewsProps } from \"../News\";\nimport { RawSignals, RawSignalsProps } from \"../Signals\";\nimport { fetchLatestVideo, type LatestVideo } from \"../VideoNews/api\";\nimport { VideoEmbed } from \"../VideoNews/VideoEmbed\";\nimport { WidgetCombo } from \"../../../types/combos\";\nimport ComboBranding from \"./ComboBranding\";\nimport Branded from \"../../Branded\";\n\nconst COLUMN_GAP = \"1rem\"; // 16px\n\ninterface Props {\n  widget: WidgetCombo;\n  size?: \"full\" | \"screen\";\n}\n\nexport const SignalsNewsDyntube: FC<Props> = ({ widget, size }) => {\n  const [ready, setReady] = useState<boolean>(false);\n  const [containerWidth, setContainerWidth] = useState<number>(0);\n  const [video, setVideo] = useState<LatestVideo | null>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    void fetchLatestVideo(widget.brand_name, widget.lang_code).then(setVideo);\n  }, [widget.brand_name, widget.lang_code]);\n\n  // responsive watcher\n  useEffect(() => {\n    if (!containerRef.current) {\n      return;\n    }\n\n    const updateWidths = () => {\n      if (!containerRef.current) return;\n\n      setContainerWidth(containerRef.current.offsetWidth);\n    };\n\n    const ro = new ResizeObserver(() => {\n      updateWidths();\n    });\n\n    ro.observe(containerRef.current);\n\n    // initial measurement\n    updateWidths();\n\n    return () => ro.disconnect();\n  }, []);\n\n  const signalsContainerWidth =\n    containerWidth < 980 ? containerWidth - 100 : (containerWidth * 3) / 5;\n  const newsContainerWidth =\n    containerWidth < 980\n      ? containerWidth - 100\n      : containerWidth - signalsContainerWidth;\n\n  const mainStyle = widget.payload.style?.wrapper || {};\n\n  const defaultCtaPositions: Record<WidgetKey | WidgetComboKey, CtaPosition> = {\n    currencyConverter: \"bottomRight\",\n    fibonacci: \"bottomRight\",\n    heatmap: \"bottomRight\",\n    marginCalculator: \"bottomRight\",\n    pivots: \"bottomRight\",\n    stopLossTakeProfit: \"bottomRight\",\n    stopLossTakeProfitLevels: \"bottomRight\",\n    signals: \"topRight\",\n    economicCalendar: \"topRight\",\n    glossary: \"top\",\n    news: \"top\",\n    topMovers: \"topRight\",\n    priceChart: \"topRight\",\n    analystRecommendations: \"topRight\",\n    signalsNewsDyntube: \"topRight\",\n    assetOverview: \"topRight\",\n    assetPreview: \"topRight\",\n    liveUpdates: \"topRight\",\n    videoExplainer: \"top\",\n  };\n  const innerStyle: WidgetStyle = {\n    brand_id: widget.brand_id,\n    brand_name: widget.brand_name,\n    lang: widget.lang_code,\n    style_name: widget.name,\n    user_id: 1,\n\n    font_family: mainStyle.fontFamily || \"inter\",\n    font_weight_body: \"normal\",\n    font_weight_heading: \"normal\",\n    currency_logos_rounded: false,\n    main_background: mainStyle.backgroundColor || \"#000000\",\n    main_rounded: mainStyle.borderRadius || \"0px\",\n    main_border: `${mainStyle.borderWidth || \"1px\"} ${mainStyle.borderStyle || \"solid\"} ${mainStyle.borderColor || \"#000000\"}`,\n    main_shadow:\n      mainStyle.boxShadow || \"0 0 0 0 #777777, 0 0 0 0 #777777 inset\",\n    main_text_color: mainStyle.color || \"#000000\",\n    main_font_size: mainStyle.fontSize || \"14px\",\n    cta_button_position: defaultCtaPositions,\n    cta_button_label: \"Start Trading Now!\",\n    cta_button_link: \"/\",\n    cta_button_roundness: null,\n    cta_button_background: null,\n    cta_button_text: null,\n\n    base_background: \"#ffffff\",\n    base_rounded: \"0px\",\n    base_border: \"1px solid #000000\",\n    base_shadow: \"0 0 0 0 #777777, 0 0 0 0 #777777 inset\",\n    base_text_color: \"#000000\",\n    base_font_size: \"14px\",\n    results_background: null,\n    results_rounded: null,\n    results_border: null,\n    results_shadow: null,\n    results_text_color: null,\n    results_font_size: null,\n    button_background: null,\n    button_border: null,\n    button_font_size: null,\n    button_text_color: null,\n    button_rounded: null,\n    button_shadow: null,\n    date_background: null,\n    date_text: null,\n    date_border: null,\n    date_font_size: null,\n    date_roundness: null,\n    date_selected_background: null,\n    date_selected_text: null,\n    date_shadow: null,\n    dropdown_background: null,\n    dropdown_border: null,\n    dropdown_text_color: null,\n    dropdown_font_size: null,\n    dropdown_rounded: null,\n    dropdown_shadow: null,\n    econ_coming_soon_color: null,\n    econ_impact_high_bg: null,\n    econ_impact_high_txt: null,\n    econ_impact_med_bg: null,\n    econ_impact_med_txt: null,\n    econ_impact_low_bg: null,\n    econ_impact_low_txt: null,\n    glossary_defs_color: null,\n    glossary_titles_color: null,\n    heatmap_custom_logo: null,\n    heatmap_logo_background: null,\n    input_background: null,\n    input_border: null,\n    input_text_color: null,\n    input_font_size: null,\n    input_rounded: null,\n    input_shadow: null,\n    results_secondary_font_size: null,\n    results_separator_color: null,\n    signals_chart_on_bottom: null,\n    signals_column_mode: null,\n    signals_hclo_color: null,\n    signals_single_asset: null,\n    signals_sup_res_background: null,\n    table_body_background: null,\n    table_body_font_size: null,\n    table_body_text_color: null,\n    table_border: null,\n    table_column_separator: null,\n    table_head_background: null,\n    table_head_font_size: null,\n    table_head_text_color: null,\n    table_rounded: null,\n    table_row_separator: null,\n    table_shadow: null,\n    table_striped: null,\n    news_scroll_mode: null,\n  };\n\n  const signalsProps: RawSignalsProps = {\n    lang: widget.lang_code,\n    assets: widget.payload.assets,\n    styles: widget.payload.style.signals,\n    isSmall: signalsContainerWidth < 650,\n    inCombo: \"signals-news-dyntube\",\n  };\n\n  const newsProps: RawNewsProps = {\n    lang: widget.lang_code,\n    style: {\n      fontFamily: innerStyle.font_family,\n      mainTextColor: innerStyle.main_text_color,\n    },\n    containerWidth: newsContainerWidth,\n    setReady,\n    inCombo: \"signals-news-dyntube\",\n    imageBorderRadius: widget.payload.style.news.imageBorderRadius,\n    scrollMode: widget.payload.style.news.scrollMode,\n  };\n\n  const isColumn = containerWidth < 980;\n\n  const wrapperStyle: React.CSSProperties = {\n    width: \"100%\",\n    height: \"100%\",\n    display: \"flex\",\n    flexDirection: isColumn ? \"column\" : \"row\",\n    minWidth: 0,\n    gap: COLUMN_GAP,\n  };\n\n  const columnBase: React.CSSProperties = {\n    display: \"flex\",\n    flexDirection: \"column\",\n    minWidth: 0,\n    boxSizing: \"border-box\",\n  };\n\n  const videoStyle: React.CSSProperties = {\n    width: \"100%\",\n    borderRadius: widget.payload.style?.video?.borderRadius || \"0px\",\n    overflow: \"hidden\",\n    maxWidth: \"512px\",\n  };\n\n  const items = useMemo(\n    () => [\n      {\n        title: \"Daily Financial News\",\n        component: (\n          <div\n            style={{\n              display: \"flex\",\n              justifyContent: \"center\",\n              alignItems: \"center\",\n              width: \"100%\",\n            }}\n          >\n            <div style={videoStyle}>\n              {video && <VideoEmbed video={video} />}\n            </div>\n          </div>\n        ),\n      },\n      {\n        title: \"Technical Analysis\",\n        component: <RawSignals {...signalsProps} />,\n      },\n      {\n        title: \"News Feed\",\n        component: (\n          <div\n            style={{\n              display: \"flex\",\n              justifyContent: \"center\",\n              alignItems: \"center\",\n              width: \"100%\",\n              height: isColumn ? \"512px\" : \"100%\",\n            }}\n          >\n            <RawNews {...newsProps} />\n          </div>\n        ),\n      },\n    ],\n    [signalsProps, newsProps, videoStyle, video],\n  );\n\n  return (\n    <ComboBranding data={widget}>\n      <div style={{ width: \"100%\", height: \"100%\" }} ref={containerRef}>\n        <ComboBranding.WidgetContainer size={size}>\n          <Branded style={innerStyle}>\n            <div style={wrapperStyle}>\n              {isColumn ? (\n                <ScrollColumn\n                  baseColor={\n                    widget.payload.style?.wrapper?.backgroundColor || \"#ffffff\"\n                  }\n                  titleStyle={{\n                    fontSize: \"2rem\",\n                    color: innerStyle.main_text_color,\n                    fontWeight: innerStyle.font_weight_heading,\n                  }}\n                  baseStyle={columnBase}\n                  items={items}\n                />\n              ) : (\n                <>\n                  <ScrollColumn\n                    baseColor={\n                      widget.payload.style?.wrapper?.color || \"#777777\"\n                    }\n                    titleStyle={{\n                      fontSize: \"2rem\",\n                      color: innerStyle.main_text_color,\n                      fontWeight: innerStyle.font_weight_heading,\n                    }}\n                    baseStyle={columnBase}\n                    items={items.slice(0, 2)}\n                  />\n                  {items[2] && (\n                    <div style={{ ...columnBase, width: \"100%\" }}>\n                      <h1\n                        style={{\n                          margin: 0,\n                          marginTop: \"0.5rem\",\n                          fontSize: \"2rem\",\n                          color: innerStyle.main_text_color,\n                          fontWeight: innerStyle.font_weight_heading,\n                        }}\n                      >\n                        {items[2].title}\n                      </h1>\n                      {items[2].component}\n                    </div>\n                  )}\n                </>\n              )}\n            </div>\n          </Branded>\n        </ComboBranding.WidgetContainer>\n      </div>\n    </ComboBranding>\n  );\n};\n\nconst ScrollColumn: FC<{\n  baseColor: string;\n  titleStyle: React.CSSProperties;\n  baseStyle: CSSProperties;\n  items: {\n    title: string;\n    component: ReactNode;\n  }[];\n}> = ({ baseColor, titleStyle, baseStyle, items }) => {\n  const headerStyle: React.CSSProperties = {\n    fontSize: \"2rem\",\n    margin: 0,\n    marginTop: \"0.5rem\",\n    ...titleStyle,\n  };\n\n  return (\n    <ComboBranding.ScrollContainer baseColor={baseColor} style={baseStyle}>\n      {items.map((item, idx) => (\n        <div key={idx} style={{ marginBottom: \"1rem\" }}>\n          <h1 style={headerStyle}>{item.title}</h1>\n          {item.component}\n        </div>\n      ))}\n    </ComboBranding.ScrollContainer>\n  );\n};\n","import React, { createContext, useContext } from \"react\";\nimport { WidgetContainer } from \"./elements/WidgetContainer\";\nimport { Button } from \"./elements/Button\";\nimport { ScrollContainer } from \"./elements/ScrollContainer\";\nimport { WidgetCombo, WidgetComboStyle } from \"../../../../types/combos\";\n\ninterface ComboBrandingContextType {\n  style: WidgetComboStyle;\n  brandId: number;\n}\n\nconst ComboBrandingContext = createContext<\n  ComboBrandingContextType | undefined\n>(undefined);\nexport const useComboBranding = () => {\n  const context = useContext(ComboBrandingContext);\n  if (!context) {\n    throw new Error(\n      \"useComboBranding must be used within a ComboBranding component\",\n    );\n  }\n  return context; // now includes logoSrc\n};\n\nconst brandedElements = {\n  WidgetContainer,\n  ScrollContainer,\n  Button,\n};\n\ntype ComboBrandingProps = {\n  data: WidgetCombo;\n  children: React.ReactNode;\n};\n\nconst ComboBranding = Object.assign(\n  ({ data, children }: ComboBrandingProps) => {\n    return (\n      <ComboBrandingContext.Provider\n        value={{ style: data.payload.style, brandId: data.brand_id }}\n      >\n        {children}\n      </ComboBrandingContext.Provider>\n    );\n  },\n  brandedElements,\n);\n\nexport default ComboBranding;\n","import { forwardRef } from \"react\";\nimport { useComboBranding } from \"..\";\nimport { CtaPosition } from \"../../../../..\";\nimport { CtaButton, CtaButtonStyle } from \"./CtaButton\";\n\ntype WidgetContainerProps = {\n  children: React.ReactNode;\n  size?: \"full\" | \"screen\";\n};\n\nconst WidgetContainer = forwardRef<HTMLDivElement, WidgetContainerProps>(\n  ({ children, size = \"screen\" }, ref) => {\n    const { style, brandId } = useComboBranding();\n\n    const ctaButtonStyle: CtaButtonStyle = {\n      background: style.cta.background,\n      borderWidth: style.cta.borderWidth,\n      borderRadius: style.cta.borderRadius,\n      color: style.cta.color,\n      fontSize: style.cta.fontSize,\n      boxShadow: style.cta.boxShadow,\n      borderStyle: style.cta.borderStyle,\n      borderColor: style.cta.borderColor,\n    };\n\n    return (\n      <div\n        style={{\n          position: \"relative\",\n          padding: \"1rem\",\n          width: size === \"full\" ? \"100%\" : \"100vw\",\n          height: size === \"full\" ? \"100%\" : \"100vh\",\n          boxSizing: \"border-box\",\n        }}\n      >\n        <div\n          style={{\n            position: \"relative\",\n            display: \"flex\",\n            flexDirection: \"column\",\n            width: \"100%\",\n            gap: \"1rem\",\n            alignItems: \"center\",\n            overflowY: \"auto\",\n            height: \"calc(100% - 2rem)\",\n            padding: \"1rem\",\n            paddingTop: style.cta.position === \"top\" ? \"3.5rem\" : \"1rem\",\n            paddingBottom: style.cta.position === \"bottom\" ? \"3.5rem\" : \"1rem\",\n            fontFamily: style.wrapper.fontFamily,\n            background: style.wrapper.backgroundColor,\n            boxShadow: style.wrapper.boxShadow,\n            borderRadius: style.wrapper.borderRadius,\n            border: style.wrapper.borderWidth,\n          }}\n          ref={ref}\n        >\n          {style.cta.position !== \"none\" && (\n            <CtaButton\n              brandId={brandId}\n              style={ctaButtonStyle}\n              position={style.cta.position as CtaPosition}\n              label={style.cta.label || \"Start Trading Now!\"}\n              link={style.cta.link || \"/\"}\n            />\n          )}\n          {children}\n        </div>\n      </div>\n    );\n  },\n);\n\nexport { WidgetContainer };\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { CtaPosition } from \"../../../../../types/WidgetStyle\";\nimport { Link } from \"../../../../utils/Link\";\nimport { Logo } from \"./Logo\";\n\ntype Mode = \"mouse\" | \"touch\";\ntype Side = \"left\" | \"right\" | null;\n\n/** Decide which side we’re docked to. Top/Bottom only affect vertical placement. */\nconst sideOf = (pos: CtaPosition): Side =>\n  pos === \"topLeft\" || pos === \"bottomLeft\"\n    ? \"left\"\n    : pos === \"topRight\" || pos === \"bottomRight\"\n      ? \"right\"\n      : null;\n\n/** Parse pixels from CSS length (px/rem). Ignore anything else (%/em/etc.) and return undefined. */\nconst parsePx = (v?: string | null): number | undefined => {\n  if (!v) return undefined;\n  if (v.endsWith(\"px\")) return parseFloat(v);\n  if (v.endsWith(\"rem\")) return parseFloat(v) * 16;\n  return undefined; // fixed lengths only\n};\n\n/** Round only the corners **opposite** the docked side; corners on the touching side are square (0). */\nconst roundedForSide = (side: Side, rPx: number): React.CSSProperties => {\n  const r = `${rPx}px`;\n  const z = \"0px\";\n  if (side === \"left\") {\n    return {\n      borderTopLeftRadius: z,\n      borderBottomLeftRadius: z,\n      borderTopRightRadius: r,\n      borderBottomRightRadius: r,\n    };\n  }\n  if (side === \"right\") {\n    return {\n      borderTopLeftRadius: r,\n      borderBottomLeftRadius: r,\n      borderTopRightRadius: z,\n      borderBottomRightRadius: z,\n    };\n  }\n  return { borderRadius: r };\n};\n\n/** Absolute anchor when docked to a side. Top/Bottom only decide vertical edge. */\nconst anchorStyle = (pos: CtaPosition, inset = 8): React.CSSProperties => {\n  switch (pos) {\n    case \"topLeft\":\n      return { position: \"absolute\", left: inset, top: inset };\n    case \"bottomLeft\":\n      return { position: \"absolute\", left: inset, bottom: inset };\n    case \"topRight\":\n      return { position: \"absolute\", right: inset, top: inset };\n    case \"bottomRight\":\n      return { position: \"absolute\", right: inset, bottom: inset };\n    case \"top\":\n      return {\n        position: \"absolute\",\n        left: \"50%\",\n        top: inset,\n        transform: \"translateX(-50%)\",\n      };\n    case \"bottom\":\n      return {\n        position: \"absolute\",\n        left: \"50%\",\n        bottom: inset,\n        transform: \"translateX(-50%)\",\n      };\n    default:\n      return {\n        width: \"100%\",\n        display: \"flex\",\n        justifyContent: \"center\",\n        padding: \"0.5rem\",\n      };\n  }\n};\n\n/** Input mode detection helpers */\nconst getInitialMode = (): Mode => {\n  if (typeof window === \"undefined\") return \"mouse\";\n  try {\n    return window.matchMedia(\"(hover: hover)\").matches ? \"mouse\" : \"touch\";\n  } catch {\n    return \"mouse\";\n  }\n};\n\nexport interface CtaButtonStyle {\n  borderStyle: string;\n  borderWidth: string;\n  borderColor: string;\n  borderRadius: string;\n  fontSize: string;\n  background: string;\n  color: string;\n  boxShadow: string;\n}\n\nexport const CtaButton: React.FC<{\n  brandId: number;\n  style: CtaButtonStyle;\n  position: CtaPosition;\n  label: string;\n  link: string;\n  insetPx?: number; // gap from container edges when docked. default 8\n  labelMaxWidth?: number; // optional cap for label expansion\n}> = ({\n  brandId,\n  style,\n  position,\n  label,\n  link,\n  insetPx = 8,\n  labelMaxWidth = 400,\n}) => {\n  // interaction state\n  const [revealed, setRevealed] = useState(false);\n  const [hovered, setHovered] = useState(false);\n  const wrapperRef = useRef<HTMLSpanElement>(null);\n\n  // mode detection (mouse vs touch)\n  const [mode, setMode] = useState<Mode>(getInitialMode);\n\n  // update on pointer usage\n  useEffect(() => {\n    const onPointerDown = (e: PointerEvent) => {\n      if (e.pointerType === \"mouse\") setMode(\"mouse\");\n      else if (e.pointerType === \"touch\") setMode(\"touch\");\n    };\n    window.addEventListener(\"pointerdown\", onPointerDown, { passive: true });\n    return () => window.removeEventListener(\"pointerdown\", onPointerDown);\n  }, []);\n\n  // update on media query changes (DevTools toggling device)\n  useEffect(() => {\n    if (typeof window === \"undefined\" || !(\"matchMedia\" in window)) return;\n    const mq = window.matchMedia(\"(hover: hover)\");\n    const update = () => setMode(mq.matches ? \"mouse\" : \"touch\");\n    update();\n    mq.addEventListener?.(\"change\", update);\n    return () => mq.removeEventListener?.(\"change\", update);\n  }, []);\n\n  // when we switch back to mouse, collapse + clear touch-only state\n  useEffect(() => {\n    if (mode === \"mouse\") {\n      setRevealed(false);\n      setHovered(false);\n    }\n  }, [mode]);\n\n  // handlers\n  const onMouseEnter = () => {\n    if (mode !== \"mouse\") return;\n    setRevealed(true);\n    setHovered(true);\n  };\n  const onMouseLeave = () => {\n    if (mode !== \"mouse\") return;\n    setHovered(false);\n    setRevealed(false);\n  };\n\n  // First tap reveals (blocks nav); second tap opens\n  const onClickCapture: React.MouseEventHandler = (e) => {\n    if (mode === \"touch\" && !revealed) {\n      e.preventDefault();\n      e.stopPropagation();\n      setRevealed(true);\n    }\n  };\n\n  // close on outside tap when revealed on touch\n  useEffect(() => {\n    if (!(mode === \"touch\" && revealed)) return;\n    const handleOutside = (e: PointerEvent) => {\n      const target = e.target as Node | null;\n      if (\n        wrapperRef.current &&\n        target &&\n        !wrapperRef.current.contains(target)\n      ) {\n        setRevealed(false);\n      }\n    };\n    document.addEventListener(\"pointerdown\", handleOutside);\n    return () => document.removeEventListener(\"pointerdown\", handleOutside);\n  }, [mode, revealed]);\n\n  // visuals\n  const effectivePosition: CtaPosition = position || \"topRight\";\n  const baseRadiusPx = parsePx(style.borderRadius) ?? 999;\n  const side = sideOf(effectivePosition);\n  const containerAlign: React.CSSProperties = anchorStyle(\n    effectivePosition,\n    insetPx,\n  );\n\n  // keep it docked: constant tiny inward offset, never changes on hover\n  const initialX = side === \"left\" ? \"-8px\" : side === \"right\" ? \"8px\" : \"0px\";\n\n  // ===== Icon size computed from button font (Safari-safe) =====\n  const fontPx = parsePx(style.fontSize) ?? 16;\n  const ICON_SCALE = 1.35; // tweak to taste (1.25..1.5)\n  const iconSizePx = Math.max(24, Math.round(fontPx * ICON_SCALE)); // floor so it's never tiny\n  // =============================================================\n\n  return (\n    // NOTE: parent container should be position: relative for corner docking to work\n    <div\n      style={{\n        ...containerAlign,\n        zIndex: 999,\n      }}\n    >\n      <span\n        ref={wrapperRef}\n        onMouseEnter={onMouseEnter}\n        onMouseLeave={onMouseLeave}\n        onClickCapture={onClickCapture}\n        style={{\n          display: \"inline-block\",\n          transform: `translateX(${initialX})`, // constant -> no side gap appears\n          transition: \"transform 400ms cubic-bezier(0.77, 0, 0.175, 1)\",\n          willChange: \"transform\",\n        }}\n      >\n        <Link\n          href={link || \"/\"}\n          target=\"_top\"\n          style={{\n            textAlign: \"center\",\n            padding: \"0.25rem\",\n            borderWidth: style.borderWidth,\n            borderStyle: style.borderStyle,\n            borderColor: style.borderColor,\n            background: style.background,\n            color: style.color,\n            boxShadow: style.boxShadow,\n            fontSize: style.fontSize,\n            lineHeight: 1, // <-- important so Safari doesn't collapse row height\n            cursor: \"pointer\",\n            opacity: hovered || revealed ? 1 : 0.7,\n            transition: \"opacity 200ms ease-in-out\",\n            display: \"flex\",\n            gap: 0, // keep stable; spacing comes from label margin\n            flexDirection:\n              sideOf(effectivePosition) === \"left\" ? \"row-reverse\" : \"row\",\n            alignItems: \"center\",\n            overflow: \"hidden\",\n            whiteSpace: \"nowrap\",\n            ...roundedForSide(side, baseRadiusPx),\n          }}\n        >\n          <div\n            style={{\n              flex: \"0 0 auto\",\n              display: \"flex\",\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              // width: 52,   // 👈 tweak this number\n              height: 20, // 👈 tweak this number\n              lineHeight: 0,\n            }}\n          >\n            <Logo brandId={brandId} />\n          </div>\n\n          {/* Label: max-width controls layout (slide), margin replaces gap to avoid snapping */}\n          <span\n            style={{\n              display: \"inline-block\",\n              maxWidth: revealed ? labelMaxWidth : 0,\n              opacity: revealed ? 1 : 0,\n              transform: revealed ? \"translateX(0)\" : \"translateX(6px)\",\n              marginInlineStart: revealed ? \"0.5rem\" : 0,\n              transition:\n                \"max-width 500ms cubic-bezier(0.77, 0, 0.175, 1), \" +\n                \"opacity 350ms ease-in-out, \" +\n                \"transform 500ms cubic-bezier(0.77, 0, 0.175, 1), \" +\n                \"margin-inline-start 500ms cubic-bezier(0.77, 0, 0.175, 1)\",\n              overflow: \"hidden\",\n              willChange: \"max-width, opacity, transform, margin-inline-start\",\n            }}\n          >\n            {label || \"Start Trading Now!\"}\n          </span>\n        </Link>\n      </span>\n    </div>\n  );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Image } from \"../../../../utils/Image\";\nimport { fetchLogoUrl } from \"../../../../../functions/fetchLogoUrl\";\n\nexport const Logo: React.FC<{ brandId: number }> = ({ brandId }) => {\n  const [logoSrc, setLogoSrc] = useState<string | null>(null);\n\n  useEffect(() => {\n    let alive = true;\n    (async () => {\n      ``;\n      try {\n        const url = await fetchLogoUrl(0, brandId, \"512\");\n        if (alive) setLogoSrc(url ?? null);\n      } catch {\n        if (alive) setLogoSrc(null);\n      }\n    })();\n    return () => {\n      alive = false;\n    };\n  }, [brandId]);\n\n  if (!logoSrc) return null;\n\n  return (\n    <Image\n      style={{\n        objectFit: \"contain\", // Ensures it fits in the cell\n        maxWidth: \"100%\", // Ensure it doesn't overflow\n        maxHeight: \"100%\", // Ensures it respects the cell height\n        width: \"auto\",\n        height: \"auto\",\n        display: \"block\",\n      }}\n      src={logoSrc}\n      alt=\"Diagonal\"\n    />\n  );\n};\n","import { forwardRef, useState } from \"react\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  hoverStyle?: React.CSSProperties;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n  const [isHovered, setIsHovered] = useState(false);\n\n  return (\n    <button\n      {...props}\n      onClick={props.onClick}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n      style={{\n        opacity: isHovered ? 0.75 : 1,\n        padding: \"0.5rem 1rem\",\n        cursor: \"pointer\",\n        transition: \"opacity 0.2s ease-in-out\",\n        ...props.style,\n        ...(isHovered ? props.hoverStyle : {}),\n      }}\n    >\n      {props.children}\n    </button>\n  );\n});\n\nButton.displayName = \"ComboBranding.Button\";\nexport { Button as Button };\n","import React, {\n  forwardRef,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { useComboBranding } from \"..\";\n\ntype ScrollContainerProps = {\n  baseColor: string;\n  style?: React.CSSProperties;\n  className?: string;\n  children: React.ReactNode;\n};\n\nfunction withAlpha(color: string, alpha: number) {\n  const c = (color || \"\").trim();\n\n  const m = c.match(\n    /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*([0-9.]+))?\\s*\\)$/i,\n  );\n  if (m) {\n    return `rgba(${m[1]}, ${m[2]}, ${m[3]}, ${alpha})`;\n  }\n\n  const hex = c.startsWith(\"#\") ? c.slice(1) : c;\n  if (hex.length === 3) {\n    const r = parseInt(hex[0] + hex[0], 16);\n    const g = parseInt(hex[1] + hex[1], 16);\n    const b = parseInt(hex[2] + hex[2], 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n  if (hex.length === 6) {\n    const r = parseInt(hex.slice(0, 2), 16);\n    const g = parseInt(hex.slice(2, 4), 16);\n    const b = parseInt(hex.slice(4, 6), 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n\n  return `rgba(255,255,255,${alpha})`;\n}\n\nconst ScrollContainer = forwardRef<HTMLDivElement, ScrollContainerProps>(\n  ({ baseColor, style: customStyle, className, children }, forwardedRef) => {\n    const { style } = useComboBranding();\n    const { height, ...restStyle } = customStyle ?? {};\n\n    const dir = (style as any)?.dir === \"rtl\" ? \"rtl\" : \"ltr\";\n    const isRTL = dir === \"rtl\";\n\n    const outerRef = useRef<HTMLDivElement>(null);\n    const viewportRef = useRef<HTMLDivElement>(null);\n    const trackRef = useRef<HTMLDivElement>(null);\n\n    // forward ref to the scroll viewport\n    useLayoutEffect(() => {\n      if (!forwardedRef) return;\n      const el = viewportRef.current;\n      if (!el) return;\n\n      if (typeof forwardedRef === \"function\") forwardedRef(el);\n      else forwardedRef.current = el;\n    }, [forwardedRef]);\n\n    const [hasOverflow, setHasOverflow] = useState(false);\n    const [thumb, setThumb] = useState({ top: 0, height: 24 });\n\n    const draggingRef = useRef(false);\n    const dragStartRef = useRef({ y: 0, scrollTop: 0, thumbTop: 0 });\n\n    const colors = useMemo(() => {\n      const base = baseColor;\n      return {\n        track: withAlpha(base, 0.1),\n        thumb: withAlpha(base, 0.35),\n        thumbHover: withAlpha(base, 0.55),\n        thumbActive: withAlpha(base, 0.75),\n      };\n    }, [baseColor]);\n\n    const recalc = () => {\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      const clientH = vp.clientHeight;\n      const scrollH = vp.scrollHeight;\n      const trackH = tr.clientHeight;\n\n      const overflow = scrollH > clientH + 1;\n      setHasOverflow(overflow);\n\n      if (!overflow) {\n        setThumb({ top: 0, height: 24 });\n        return;\n      }\n\n      const minThumb = 24;\n      const ratio = clientH / scrollH;\n      const thumbH = Math.max(minThumb, Math.floor(trackH * ratio));\n      const maxThumbTop = Math.max(0, trackH - thumbH);\n      const maxScrollTop = Math.max(1, scrollH - clientH);\n\n      const top = (vp.scrollTop / maxScrollTop) * maxThumbTop;\n      setThumb({ top, height: thumbH });\n    };\n\n    useLayoutEffect(() => {\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      let raf = 0;\n      const schedule = () => {\n        cancelAnimationFrame(raf);\n        raf = requestAnimationFrame(recalc);\n      };\n\n      schedule();\n\n      vp.addEventListener(\"scroll\", schedule, { passive: true });\n\n      const ro = new ResizeObserver(schedule);\n      ro.observe(vp);\n      ro.observe(tr);\n\n      return () => {\n        cancelAnimationFrame(raf);\n        vp.removeEventListener(\"scroll\", schedule);\n        ro.disconnect();\n      };\n    }, []);\n\n    const onTrackPointerDown = (e: React.PointerEvent) => {\n      if (!hasOverflow) return;\n      if ((e.target as HTMLElement)?.dataset?.role === \"thumb\") return;\n\n      const vp = viewportRef.current;\n      const tr = trackRef.current;\n      if (!vp || !tr) return;\n\n      const rect = tr.getBoundingClientRect();\n      const clickY = e.clientY - rect.top;\n\n      const maxThumbTop = tr.clientHeight - thumb.height;\n      const desiredThumbTop = Math.min(\n        maxThumbTop,\n        Math.max(0, clickY - thumb.height / 2),\n      );\n\n      const maxScrollTop = vp.scrollHeight - vp.clientHeight;\n      vp.scrollTop = (desiredThumbTop / maxThumbTop) * maxScrollTop;\n    };\n\n    const onThumbPointerDown = (e: React.PointerEvent) => {\n      if (!hasOverflow) return;\n\n      draggingRef.current = true;\n      (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n\n      dragStartRef.current = {\n        y: e.clientY,\n        scrollTop: viewportRef.current!.scrollTop,\n        thumbTop: thumb.top,\n      };\n    };\n\n    const onThumbPointerMove = (e: React.PointerEvent) => {\n      if (!draggingRef.current) return;\n\n      const vp = viewportRef.current!;\n      const tr = trackRef.current!;\n      const dy = e.clientY - dragStartRef.current.y;\n\n      const maxThumbTop = tr.clientHeight - thumb.height;\n      const maxScrollTop = vp.scrollHeight - vp.clientHeight;\n\n      const nextThumbTop = Math.min(\n        maxThumbTop,\n        Math.max(0, dragStartRef.current.thumbTop + dy),\n      );\n\n      vp.scrollTop = (nextThumbTop / maxThumbTop) * maxScrollTop;\n    };\n\n    const onThumbPointerUp = (e: React.PointerEvent) => {\n      draggingRef.current = false;\n      try {\n        (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n      } catch {}\n    };\n\n    return (\n      <div\n        ref={outerRef}\n        style={{\n          position: \"relative\",\n          width: \"100%\",\n          boxSizing: \"border-box\",\n\n          ...(height != null ? { height } : {}),\n          ...(restStyle.flex != null ? {} : { flex: \"1 1 auto\" }),\n          minHeight: 0,\n\n          ...restStyle,\n        }}\n        className={className}\n      >\n        <style>{`\n          .nfViewport {\n            overflow: auto;\n            scrollbar-width: none;\n          }\n          .nfViewport::-webkit-scrollbar {\n            width: 0;\n            height: 0;\n          }\n          .nfTrack {\n            position: absolute;\n            top: 0;\n            bottom: 0;\n            width: var(--sbw, 10px);\n            opacity: 0;\n            transition: opacity 160ms ease;\n          }\n          .nfScrollRoot:hover .nfTrack {\n            opacity: 1;\n          }\n          .nfThumb {\n            position: absolute;\n            left: 1px;\n            right: 1px;\n            border-radius: 999px;\n            cursor: pointer;\n            touch-action: none;\n          }\n          @media (hover: none) {\n            .nfTrack { opacity: 0.25; }\n            .nfScrollRoot { --sbw: 6px; }\n          }\n        `}</style>\n\n        <div\n          className=\"nfScrollRoot\"\n          dir={dir}\n          style={{\n            position: \"relative\",\n            display: \"flex\",\n            flexDirection: \"column\",\n            height: \"100%\",\n            minHeight: 0,\n          }}\n        >\n          <div\n            ref={viewportRef}\n            className=\"nfViewport\"\n            style={{\n              flex: \"1 1 auto\",\n              minHeight: 0,\n              paddingRight: isRTL ? undefined : `var(--sbw, 10px)`,\n              paddingLeft: isRTL ? `var(--sbw, 10px)` : undefined,\n            }}\n          >\n            {children}\n          </div>\n\n          <div\n            ref={trackRef}\n            className=\"nfTrack\"\n            onPointerDown={onTrackPointerDown}\n            style={{\n              display: hasOverflow ? \"block\" : \"none\",\n              background: colors.track,\n              borderRadius: 999,\n              right: isRTL ? undefined : 0,\n              left: isRTL ? 0 : undefined,\n            }}\n          >\n            <div\n              data-role=\"thumb\"\n              className=\"nfThumb\"\n              onPointerDown={onThumbPointerDown}\n              onPointerMove={onThumbPointerMove}\n              onPointerUp={onThumbPointerUp}\n              onPointerCancel={onThumbPointerUp}\n              style={{\n                top: thumb.top,\n                height: thumb.height,\n                background: colors.thumb,\n              }}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  },\n);\n\nexport { ScrollContainer };\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport Branded from \"../../Branded\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport { AssetOverviewContent } from \"./AssetOverviewContent\";\nimport type { AssetType } from \"./functions/fetchAssetInfo\";\n\ninterface Props {\n  styles: WidgetStyle;\n  assetId: number;\n  size?: \"full\" | \"screen\";\n}\n\n// Shared shell: loads the font and wraps the content in the branded container.\n// `assetTypeOverride` forces a variant's behaviour; leave it undefined to\n// auto-detect the asset class from the API.\nfunction OverviewShell({\n  styles,\n  assetId,\n  size,\n  assetTypeOverride,\n}: Props & { assetTypeOverride?: AssetType }): JSX.Element {\n  useEffect(() => {\n    loadGoogleFont(styles.font_family ?? \"Playfair Display\");\n  }, [styles.font_family]);\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"assetOverview\" size={size} hideCta>\n        <AssetOverviewContent\n          styles={styles}\n          assetId={assetId}\n          assetTypeOverride={assetTypeOverride}\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n\n/** Auto-detecting overview — picks the right variant from the asset's class. */\nexport function AssetOverview(props: Props): JSX.Element {\n  return <OverviewShell {...props} />;\n}\n\n/** Equity overview (analyst consensus + volume, company logo). */\nexport function StockOverview(props: Props): JSX.Element {\n  return <OverviewShell {...props} assetTypeOverride=\"stock\" />;\n}\n\n/** Forex-pair overview (no analyst, no volume, dual-currency badge). */\nexport function ForexOverview(props: Props): JSX.Element {\n  return <OverviewShell {...props} assetTypeOverride=\"forex\" />;\n}\n\n/** Crypto overview (no analyst, volume kept, coin logo). */\nexport function CryptoOverview(props: Props): JSX.Element {\n  return <OverviewShell {...props} assetTypeOverride=\"crypto\" />;\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { resolveChartTheme } from \"../../charts/StockWidget/theme\";\nimport type { AssetOverviewTimeframe, Candle } from \"../../charts/types\";\nimport { RawAnalystRecommendations } from \"../AnalystRecommendations\";\nimport { fetchNewsArticles } from \"../News/functions/fetchNewsArticles\";\nimport { getDictionarySection } from \"../../../utils/getDictionarySection\";\nimport { fetchAssetCandles } from \"./functions/fetchAssetCandles\";\nimport { fetchEarnings, type EarningRecord } from \"./fetchEarnings\";\nimport { fetchAssetInfo } from \"./functions/fetchAssetInfo\";\nimport type { AssetInfo, AssetType } from \"./functions/fetchAssetInfo\";\nimport { resolveAssetConfig } from \"./config\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport type { NewsArticle } from \"../../../types/news\";\nimport { makeFormatPrice, calcPerformance } from \"./parts/utils/format\";\nimport { AssetHeader } from \"./parts/header/AssetHeader\";\nimport { ChartPanel } from \"./parts/chart/ChartPanel\";\nimport { KeyStatisticsPanel } from \"./parts/stats/KeyStatisticsPanel\";\nimport { PerformancePanel } from \"./parts/performance/PerformancePanel\";\nimport { EarningsCard } from \"./parts/earnings/EarningsCard\";\nimport { RelatedNewsPanel } from \"./parts/news/RelatedNewsPanel\";\n\ntype Props = {\n  styles: WidgetStyle;\n  assetId: number;\n  // Force a variant's behaviour. When omitted, the asset class is auto-detected\n  // from the fetched info (this is what <AssetOverview> uses).\n  assetTypeOverride?: AssetType;\n};\n\nexport function AssetOverviewContent({\n  styles,\n  assetId,\n  assetTypeOverride,\n}: Props) {\n  const theme = useMemo(() => resolveChartTheme(styles), [styles]);\n  const t = useMemo(\n    () => getDictionarySection(styles.lang, \"assetOverview\"),\n    [styles.lang],\n  );\n  const fontFamily =\n    styles.font_family || \"system-ui, -apple-system, sans-serif\";\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [containerWidth, setContainerWidth] = useState(800);\n  const [assetInfo, setAssetInfo] = useState<AssetInfo | null>(null);\n  const [statsCandles, setStatsCandles] = useState<Candle[]>([]);\n  const [chartCandles, setChartCandles] = useState<Candle[]>([]);\n  const [timeframe, setTimeframe] = useState<AssetOverviewTimeframe>(\"1Y\");\n  const [hover, setHover] = useState<Candle | null>(null);\n  const [news, setNews] = useState<NewsArticle[]>([]);\n  const [earning, setEarning] = useState<EarningRecord | null>(null);\n\n  const config = useMemo(\n    () => resolveAssetConfig(assetTypeOverride ?? assetInfo?.assetType),\n    [assetTypeOverride, assetInfo?.assetType],\n  );\n  const formatPrice = useMemo(\n    () => makeFormatPrice(assetInfo?.decimals ?? null),\n    [assetInfo?.decimals],\n  );\n\n  useEffect(() => {\n    const el = containerRef.current;\n    if (!el || typeof ResizeObserver === \"undefined\") return;\n    const update = (w: number) => {\n      if (w > 0) setContainerWidth(w);\n    };\n    update(el.getBoundingClientRect().width);\n    const observer = new ResizeObserver(([entry]) =>\n      update(entry.contentRect.width),\n    );\n    observer.observe(el);\n    return () => observer.disconnect();\n  }, []);\n\n  useEffect(() => {\n    if (!Number.isInteger(assetId) || assetId <= 0) return;\n    setAssetInfo(null);\n    fetchAssetInfo(assetId).then((info) => {\n      if (info) setAssetInfo(info);\n    });\n  }, [assetId]);\n\n  useEffect(() => {\n    if (!assetInfo) return;\n    fetchAssetCandles(assetInfo.symbol, \"1Y\").then(setStatsCandles);\n  }, [assetInfo?.symbol]);\n\n  useEffect(() => {\n    if (!assetInfo) return;\n    if (timeframe === \"1Y\") {\n      setChartCandles(statsCandles);\n      return;\n    }\n    fetchAssetCandles(assetInfo.symbol, timeframe).then(setChartCandles);\n  }, [assetInfo?.symbol, timeframe, statsCandles]);\n\n  useEffect(() => {\n    if (!config.showEarnings) return;\n    setEarning(null);\n    fetchEarnings(assetId)\n      .then(setEarning)\n      .catch(() => setEarning(null));\n  }, [assetId, config.showEarnings]);\n\n  useEffect(() => {\n    fetchNewsArticles(styles.lang || \"en\", 0, 4, null, assetId).then(\n      (articles) => {\n        if (articles) setNews(articles.slice(0, 4));\n      },\n    );\n  }, [styles.lang, assetId]);\n\n  const lastCandle = statsCandles[statsCandles.length - 1];\n  const displayPrice = hover?.close ?? lastCandle?.close ?? 0;\n  const dailyChange = lastCandle ? lastCandle.close - lastCandle.open : 0;\n  const dailyChangePct = lastCandle?.open\n    ? (dailyChange / lastCandle.open) * 100\n    : 0;\n  const performance = useMemo(\n    () => calcPerformance(statsCandles),\n    [statsCandles],\n  );\n\n  const isWide = containerWidth >= 720;\n  const showAnalyst = config.showAnalyst && !!assetInfo;\n  const showVolume = config.showVolume && lastCandle?.volume != null;\n\n  const cardStyle: CSSProperties = {\n    background: theme.background,\n    borderRadius: 16,\n    border: `1px solid ${theme.grid}`,\n    padding: 20,\n    boxSizing: \"border-box\",\n  };\n\n  const sectionLabel: CSSProperties = {\n    fontSize: 12,\n    fontWeight: 600,\n    color: theme.text,\n    marginBottom: 16,\n    textTransform: \"uppercase\",\n    letterSpacing: \"0.06em\",\n  };\n\n  return (\n    <div\n      ref={containerRef}\n      style={{\n        width: \"100%\",\n        minWidth: 0,\n        fontFamily,\n        color: theme.strong,\n        display: \"flex\",\n        flexDirection: \"column\",\n        gap: 12,\n        boxSizing: \"border-box\",\n        padding: 16,\n      }}\n    >\n      {/* ── Header ── */}\n      <div style={cardStyle}>\n        <AssetHeader\n          assetInfo={assetInfo}\n          displayPrice={displayPrice}\n          dailyChange={dailyChange}\n          dailyChangePct={dailyChangePct}\n          lastCandle={lastCandle}\n          formatPrice={formatPrice}\n          t={t}\n          theme={theme}\n          config={config}\n        />\n      </div>\n\n      {/* ── Chart + Key Statistics ── */}\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: isWide ? \"row\" : \"column\",\n          gap: 12,\n          alignItems: \"stretch\",\n        }}\n      >\n        <div style={{ ...cardStyle, flex: \"3 1 0\", minWidth: 0 }}>\n          <ChartPanel\n            candles={chartCandles}\n            timeframe={timeframe}\n            onTimeframeChange={setTimeframe}\n            onHoverChange={setHover}\n            theme={theme}\n          />\n        </div>\n        <div style={{ ...cardStyle, flex: \"2 1 0\", minWidth: 0 }}>\n          <div style={sectionLabel}>{t.keyStatistics}</div>\n          <KeyStatisticsPanel\n            lastCandle={lastCandle}\n            showVolume={showVolume}\n            formatPrice={formatPrice}\n            t={t}\n            theme={theme}\n          />\n        </div>\n      </div>\n\n      {/* ── Performance + (Earnings) + (Analyst Consensus) + Related News ── */}\n      <div\n        style={{\n          display: \"flex\",\n          flexDirection: isWide ? \"row\" : \"column\",\n          flexWrap: \"wrap\",\n          gap: 12,\n          alignItems: isWide ? \"flex-start\" : \"stretch\",\n        }}\n      >\n        <div\n          style={{ ...cardStyle, flex: 1, minWidth: 300, height: \"stretch\" }}\n        >\n          <div style={sectionLabel}>{t.performance}</div>\n          <PerformancePanel performance={performance} t={t} theme={theme} />\n        </div>\n\n        {config.showEarnings && earning && (\n          <div\n            style={{ ...cardStyle, flex: 1, minWidth: 300, height: \"stretch\" }}\n          >\n            <div style={sectionLabel}>Next earnings</div>\n            <EarningsCard earning={earning} assetId={assetId} theme={theme} />\n          </div>\n        )}\n\n        {showAnalyst && (\n          <div\n            style={{ ...cardStyle, flex: 1, minWidth: 300, height: \"stretch\" }}\n          >\n            <div style={sectionLabel}>Analyst Consensus</div>\n            <RawAnalystRecommendations\n              styles={styles}\n              assetId={assetId}\n              showAsset={false}\n              mode=\"horizontal\"\n            />\n          </div>\n        )}\n\n        <div\n          style={{ ...cardStyle, flex: 1, minWidth: 300, height: \"stretch\" }}\n        >\n          <div style={sectionLabel}>\n            {assetInfo ? `Latest ${assetInfo.name} News` : t.relatedNews}\n          </div>\n          <RelatedNewsPanel news={news} t={t} theme={theme} />\n        </div>\n      </div>\n    </div>\n  );\n}\n","import { WIDGET_API_BASE } from \"../../../../utils/widgetApiBase\";\nimport type { AssetOverviewTimeframe, Candle } from \"../../../charts/types\";\n\n\n\nexport const ASSET_OVERVIEW_TIMEFRAMES: AssetOverviewTimeframe[] = [\n  \"1D\", \"5D\", \"1M\", \"6M\", \"YTD\", \"1Y\", \"5Y\",\n];\n\ntype FetchParams = { timeframe: \"15m\" | \"1h\" | \"1d\"; days: number };\n\n// Calendar-day windows keyed to each tab's meaning. The API filters by date\n// range, so stocks (market-hours only) and 24h markets (crypto/forex) return\n// the same visual span — just with fewer or more bars.\nconst TF_PARAMS: Record<AssetOverviewTimeframe, FetchParams> = {\n  \"1D\": { timeframe: \"15m\", days: 1 },\n  \"5D\": { timeframe: \"1h\", days: 5 },\n  \"1M\": { timeframe: \"1d\", days: 31 },\n  \"6M\": { timeframe: \"1d\", days: 183 },\n  \"YTD\": { timeframe: \"1d\", days: 366 },\n  \"1Y\": { timeframe: \"1d\", days: 365 },\n  \"5Y\": { timeframe: \"1d\", days: 1825 },\n};\n\n// Candles are keyed by the internal slashed symbol (e.g. BTC/USD, EUR/USD),\n// which is exactly what fetchAssetInfo returns — so this works unchanged for\n// stocks, forex and crypto.\nexport async function fetchAssetCandles(\n  symbol: string,\n  tf: AssetOverviewTimeframe,\n): Promise<Candle[]> {\n  const { timeframe, days } = TF_PARAMS[tf];\n  try {\n    const url = `${WIDGET_API_BASE}/api/widgets/candles?symbol=${encodeURIComponent(symbol)}&timeframe=${timeframe}&days=${days}`;\n    const res = await fetch(url);\n    if (!res.ok) return [];\n    const data = (await res.json()) as { candles?: Candle[] };\n    let candles = data.candles ?? [];\n    if (tf === \"YTD\") {\n      const currentYear = new Date().getFullYear();\n      candles = candles.filter((c) => new Date(c.timestamp).getFullYear() === currentYear);\n    }\n    return candles;\n  } catch {\n    return [];\n  }\n}\n","import { WIDGET_API_BASE } from \"../../../utils/widgetApiBase\";\n\nexport type EarningRecord = {\n  id: string;\n  earnings_date: string;\n  symbol: string;\n  eps_actual: number | null;\n  eps_estimated: number | null;\n  revenue_actual: number | null;\n  revenue_estimated: number | null;\n};\n\nexport async function fetchEarnings(assetId: number): Promise<EarningRecord | null> {\n  const url = `${WIDGET_API_BASE}/api/widgets/earnings/${assetId}`;\n  const response = await fetch(url);\n  if (!response.ok) return null;\n  const data = (await response.json()) as { earnings?: EarningRecord[]; error?: string };\n  return data.earnings?.[0] ?? null;\n}\n\nexport async function fetchAllEarnings(assetId: number): Promise<EarningRecord[]> {\n  const url = `${WIDGET_API_BASE}/api/widgets/earnings/${assetId}?all=true`;\n  const response = await fetch(url);\n  if (!response.ok) return [];\n  const data = (await response.json()) as { earnings?: EarningRecord[]; error?: string };\n  return data.earnings ?? [];\n}\n","import { WIDGET_API_BASE } from \"../../../../utils/widgetApiBase\";\n\n// The asset classes the overview widget knows how to render. Anything else\n// (index, unknown) is treated like a stock by the config resolver.\nexport type AssetType = \"stock\" | \"forex\" | \"crypto\" | \"commodity\" | \"index\";\n\nexport type AssetInfo = {\n  id: number;\n  symbol: string;\n  name: string;\n  logoUrl: string | null;\n  assetType: AssetType | null;\n  decimals: number | null;\n};\n\n// The endpoint is still called `stock-info` but now returns every asset class.\nexport async function fetchAssetInfo(assetId: number): Promise<AssetInfo | null> {\n  try {\n    const res = await fetch(`${WIDGET_API_BASE}/api/widgets/stock-info/${assetId}`);\n    if (!res.ok) return null;\n    const data = (await res.json()) as { info?: AssetInfo };\n    return data.info ?? null;\n  } catch {\n    return null;\n  }\n}\n","import type { AssetType } from \"./functions/fetchAssetInfo\";\n\n// What each asset class shows. The three differences that actually matter\n// between stocks and coins are: analyst coverage, volume, and how the logo is\n// drawn. Everything else (price, chart, day range, performance, news) is shared.\nexport type AssetOverviewConfig = {\n  // Analyst buy/hold/sell consensus only exists for equities & commodities\n  // (TradingView coverage). Forex pairs and crypto have none.\n  showAnalyst: boolean;\n  // Forex spot has no consolidated volume; it comes back null anyway, but we\n  // also hide the row entirely so the layout doesn't reserve space for it.\n  showVolume: boolean;\n  // A stock/coin has a single logo; a forex pair is two currencies.\n  logo: \"single\" | \"pair\";\n  // Earnings data only exists for individual stocks.\n  showEarnings: boolean;\n};\n\nconst STOCK_LIKE: AssetOverviewConfig = {\n  showAnalyst: true,\n  showVolume: true,\n  logo: \"single\",\n  showEarnings: false,\n};\n\nconst CONFIG: Record<AssetType, AssetOverviewConfig> = {\n  stock: { ...STOCK_LIKE, showEarnings: true },\n  commodity: STOCK_LIKE,\n  index: { showAnalyst: false, showVolume: true, logo: \"single\", showEarnings: false },\n  crypto: { showAnalyst: false, showVolume: true, logo: \"single\", showEarnings: false },\n  forex: { showAnalyst: false, showVolume: false, logo: \"pair\", showEarnings: false },\n};\n\n// Unknown/missing types fall back to stock behaviour so nothing disappears.\nexport function resolveAssetConfig(type: AssetType | null | undefined): AssetOverviewConfig {\n  return (type && CONFIG[type]) || STOCK_LIKE;\n}\n","import { decimalsFor } from \"../../../../charts/StockWidget/format\";\nimport type { Candle } from \"../../../../charts/types\";\n\nexport function makeFormatPrice(decimals: number | null) {\n  return (price: number): string =>\n    price.toFixed(decimals ?? decimalsFor(price));\n}\n\nexport function formatVolume(vol: number): string {\n  if (vol >= 1e12) return `${(vol / 1e12).toFixed(2)}T`;\n  if (vol >= 1e9) return `${(vol / 1e9).toFixed(2)}B`;\n  if (vol >= 1e6) return `${(vol / 1e6).toFixed(2)}M`;\n  if (vol >= 1e3) return `${(vol / 1e3).toFixed(2)}K`;\n  return vol.toFixed(0);\n}\n\nexport function formatPct(pct: number | null): string {\n  if (pct === null) return \"—\";\n  const sign = pct >= 0 ? \"+\" : \"\";\n  return `${sign}${pct.toFixed(2)}%`;\n}\n\nexport function calcPerformance(candles: Candle[]) {\n  if (candles.length === 0) {\n    return { week1: null, month1: null, month3: null, ytd: null };\n  }\n  const current = candles[candles.length - 1].close;\n  const pct = (ref: number) => (ref > 0 ? ((current - ref) / ref) * 100 : null);\n\n  const week1 = candles.length >= 6 ? pct(candles[candles.length - 6].close) : null;\n  const month1 = candles.length >= 23 ? pct(candles[candles.length - 23].close) : null;\n  const month3 = candles.length >= 66 ? pct(candles[candles.length - 66].close) : null;\n\n  const currentYear = new Date(candles[candles.length - 1].timestamp).getFullYear();\n  const ytdCandle = candles.find((c) => new Date(c.timestamp).getFullYear() === currentYear);\n  const ytd = ytdCandle ? pct(ytdCandle.close) : null;\n\n  return { week1, month1, month3, ytd };\n}\n","import { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { ChartTheme } from \"../../../../charts/types\";\nimport type { AssetInfo } from \"../../functions/fetchAssetInfo\";\nimport type { AssetOverviewConfig } from \"../../config\";\n\nconst SIZE = 48;\n\nfunction Chip({ text, theme }: { text: string; theme: ChartTheme }) {\n  return (\n    <div\n      style={{\n        width: SIZE,\n        height: SIZE,\n        borderRadius: \"50%\",\n        background: theme.grid,\n        flexShrink: 0,\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n        color: theme.strong,\n        fontWeight: 700,\n        fontSize: 13,\n      }}\n    >\n      {text.slice(0, 3)}\n    </div>\n  );\n}\n\n// Two overlapping currency badges for a forex pair (EUR/USD → EUR over USD).\n// There is no single logo for a pair, and logo_url is empty for forex anyway.\nfunction PairLogo({\n  info,\n  theme,\n}: {\n  info: AssetInfo | null;\n  theme: ChartTheme;\n}) {\n  const [base, quote] = (info?.symbol ?? \"—/—\").split(\"/\");\n  const badge: CSSProperties = {\n    width: 34,\n    height: 34,\n    borderRadius: \"50%\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    fontSize: 11,\n    fontWeight: 700,\n    border: `2px solid ${theme.background}`,\n    boxSizing: \"border-box\",\n  };\n  return (\n    <div\n      style={{ position: \"relative\", width: SIZE, height: SIZE, flexShrink: 0 }}\n    >\n      <div\n        style={{\n          ...badge,\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          background: theme.grid,\n          color: theme.strong,\n        }}\n      >\n        {(base ?? \"—\").slice(0, 3)}\n      </div>\n      <div\n        style={{\n          ...badge,\n          position: \"absolute\",\n          bottom: 0,\n          right: 0,\n          background: theme.strong,\n          color: theme.background,\n        }}\n      >\n        {(quote ?? \"—\").slice(0, 3)}\n      </div>\n    </div>\n  );\n}\n\n// Single logo (stock/crypto/commodity): the asset's logo image with a\n// text-chip fallback when the URL is missing or fails to load.\nfunction SingleLogo({\n  info,\n  theme,\n}: {\n  info: AssetInfo | null;\n  theme: ChartTheme;\n}) {\n  const [failed, setFailed] = useState(false);\n  if (info?.logoUrl && !failed) {\n    return (\n      <img\n        src={info.logoUrl}\n        alt={info.symbol}\n        onError={() => setFailed(true)}\n        style={{\n          width: SIZE,\n          height: SIZE,\n          borderRadius: \"50%\",\n          background: theme.grid,\n          flexShrink: 0,\n          objectFit: \"contain\",\n          padding: 6,\n          boxSizing: \"border-box\",\n        }}\n      />\n    );\n  }\n  return <Chip text={info?.symbol ?? \"—\"} theme={theme} />;\n}\n\nexport function AssetLogo({\n  info,\n  theme,\n  config,\n}: {\n  info: AssetInfo | null;\n  theme: ChartTheme;\n  config: AssetOverviewConfig;\n}) {\n  return config.logo === \"pair\" ? (\n    <PairLogo info={info} theme={theme} />\n  ) : (\n    <SingleLogo info={info} theme={theme} />\n  );\n}\n","import type { Candle, ChartTheme } from \"../../../../charts/types\";\nimport type { AssetInfo } from \"../../functions/fetchAssetInfo\";\nimport type { AssetOverviewConfig } from \"../../config\";\nimport type { AssetOverviewDictionary } from \"../../../../../types/Dictionary\";\nimport { AssetLogo } from \"./AssetLogo\";\n\ntype Props = {\n  assetInfo: AssetInfo | null;\n  displayPrice: number;\n  dailyChange: number;\n  dailyChangePct: number;\n  lastCandle: Candle | undefined;\n  formatPrice: (p: number) => string;\n  t: AssetOverviewDictionary;\n  theme: ChartTheme;\n  config: AssetOverviewConfig;\n};\n\nexport function AssetHeader({\n  assetInfo,\n  displayPrice,\n  dailyChange,\n  dailyChangePct,\n  lastCandle,\n  formatPrice,\n  t,\n  theme,\n  config,\n}: Props) {\n  const isDown = dailyChange < 0;\n  const changeColor = isDown ? theme.down : theme.up;\n\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexWrap: \"wrap\",\n        alignItems: \"center\",\n        justifyContent: \"space-between\",\n        gap: 16,\n      }}\n    >\n      <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n        <AssetLogo info={assetInfo} theme={theme} config={config} />\n        <div>\n          <div style={{ fontSize: 20, fontWeight: 700, color: theme.strong, lineHeight: 1.2 }}>\n            {assetInfo?.symbol ?? \"—\"}\n          </div>\n          <div style={{ fontSize: 14, color: theme.text }}>{assetInfo?.name ?? \"\"}</div>\n        </div>\n      </div>\n\n      <div style={{ textAlign: \"end\" }}>\n        <div style={{ fontSize: 34, fontWeight: 700, color: theme.strong, lineHeight: 1 }}>\n          {formatPrice(displayPrice)}\n        </div>\n        <div style={{ fontSize: 16, fontWeight: 600, color: changeColor, marginTop: 4 }}>\n          {isDown ? \"\" : \"+\"}\n          {formatPrice(dailyChange)}&nbsp;({isDown ? \"\" : \"+\"}\n          {dailyChangePct.toFixed(2)}%)\n        </div>\n        {lastCandle && (\n          <div style={{ fontSize: 13, color: theme.text, marginTop: 4 }}>\n            {t.open}: {formatPrice(lastCandle.open)}&nbsp;&nbsp;\n            {t.close}: {formatPrice(lastCandle.close)}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n","import { AreaChart } from \"../../../../charts/AreaChart\";\nimport { TimeframeTabs } from \"../../../../TimeframeTabs\";\nimport type { AssetOverviewTimeframe, Candle, ChartTheme } from \"../../../../charts/types\";\nimport { ASSET_OVERVIEW_TIMEFRAMES } from \"../../functions/fetchAssetCandles\";\n\ntype Props = {\n  candles: Candle[];\n  timeframe: AssetOverviewTimeframe;\n  onTimeframeChange: (tf: AssetOverviewTimeframe) => void;\n  onHoverChange: (c: Candle | null) => void;\n  theme: ChartTheme;\n};\n\nexport function ChartPanel({ candles, timeframe, onTimeframeChange, onHoverChange, theme }: Props) {\n  return (\n    <>\n      <TimeframeTabs\n        timeframes={ASSET_OVERVIEW_TIMEFRAMES}\n        value={timeframe}\n        onChange={(tf) => onTimeframeChange(tf as AssetOverviewTimeframe)}\n        theme={theme}\n      />\n      <AreaChart candles={candles} theme={theme} height={200} onHoverChange={onHoverChange} />\n    </>\n  );\n}\n","import type { Candle, ChartTheme } from \"../../../../charts/types\";\nimport type { AssetOverviewDictionary } from \"../../../../../types/Dictionary\";\nimport { formatVolume } from \"../utils/format\";\n\nfunction StatRow({ label, value, theme }: { label: string; value: string; theme: ChartTheme }) {\n  return (\n    <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n      <span style={{ fontSize: 13, color: theme.text }}>{label}</span>\n      <span style={{ fontSize: 14, fontWeight: 600, color: theme.strong }}>{value}</span>\n    </div>\n  );\n}\n\ntype Props = {\n  lastCandle: Candle | undefined;\n  showVolume: boolean;\n  formatPrice: (p: number) => string;\n  t: AssetOverviewDictionary;\n  theme: ChartTheme;\n};\n\nexport function KeyStatisticsPanel({ lastCandle, showVolume, formatPrice, t, theme }: Props) {\n  if (!lastCandle) {\n    return <div style={{ color: theme.text, fontSize: 13 }}>{t.noData}</div>;\n  }\n\n  return (\n    <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n      <StatRow label={t.open} value={formatPrice(lastCandle.open)} theme={theme} />\n      <StatRow label={t.close} value={formatPrice(lastCandle.close)} theme={theme} />\n      <StatRow\n        label={t.dayRange}\n        value={`${formatPrice(lastCandle.low)} – ${formatPrice(lastCandle.high)}`}\n        theme={theme}\n      />\n      {showVolume && (\n        <StatRow label={t.volume} value={formatVolume(lastCandle.volume as number)} theme={theme} />\n      )}\n    </div>\n  );\n}\n","import type { ChartTheme } from \"../../../../charts/types\";\nimport type { AssetOverviewDictionary } from \"../../../../../types/Dictionary\";\nimport { formatPct } from \"../utils/format\";\n\nconst BAR_CAP_PCT = 30;\n\nfunction PerfRow({ label, pct, theme }: { label: string; pct: number | null; theme: ChartTheme }) {\n  const color = pct === null ? theme.text : pct >= 0 ? theme.up : theme.down;\n  const barHalfWidth = pct !== null ? Math.min(Math.abs(pct) / BAR_CAP_PCT, 1) * 100 : 0;\n\n  return (\n    <div style={{ display: \"flex\", flexDirection: \"column\", gap: 5 }}>\n      <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n        <span style={{ fontSize: 13, color: theme.text }}>{label}</span>\n        <span style={{ fontSize: 14, fontWeight: 600, color }}>{formatPct(pct)}</span>\n      </div>\n      <div style={{ display: \"flex\", height: 4, gap: 0 }}>\n        <div\n          style={{\n            flex: 1,\n            background: theme.grid,\n            borderRadius: \"2px 0 0 2px\",\n            overflow: \"hidden\",\n            display: \"flex\",\n            justifyContent: \"flex-end\",\n          }}\n        >\n          {pct !== null && pct < 0 && (\n            <div style={{ width: `${barHalfWidth}%`, height: \"100%\", background: theme.down, borderRadius: \"2px 0 0 2px\" }} />\n          )}\n        </div>\n        <div style={{ width: 2, flexShrink: 0, background: theme.text, opacity: 0.4 }} />\n        <div style={{ flex: 1, background: theme.grid, borderRadius: \"0 2px 2px 0\", overflow: \"hidden\" }}>\n          {pct !== null && pct >= 0 && (\n            <div style={{ width: `${barHalfWidth}%`, height: \"100%\", background: theme.up, borderRadius: \"0 2px 2px 0\" }} />\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n\ntype Performance = { week1: number | null; month1: number | null; month3: number | null; ytd: number | null };\n\ntype Props = {\n  performance: Performance;\n  t: AssetOverviewDictionary;\n  theme: ChartTheme;\n};\n\nexport function PerformancePanel({ performance, t, theme }: Props) {\n  return (\n    <div style={{ display: \"flex\", flexDirection: \"column\", gap: 14 }}>\n      <PerfRow label={t.week1} pct={performance.week1} theme={theme} />\n      <PerfRow label={t.month1} pct={performance.month1} theme={theme} />\n      <PerfRow label={t.month3} pct={performance.month3} theme={theme} />\n      <PerfRow label={t.ytd} pct={performance.ytd} theme={theme} />\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ChartTheme } from \"../../../../charts/types\";\nimport { fetchAllEarnings, type EarningRecord } from \"../../fetchEarnings\";\nimport { formatVolume } from \"../utils/format\";\n\nfunction formatDate(dateStr: string, short = false): string {\n  const date = new Date(`${dateStr}T00:00:00`);\n  return date.toLocaleDateString(\"en-US\", short\n    ? { month: \"short\", year: \"2-digit\" }\n    : { month: \"short\", day: \"numeric\", year: \"numeric\" }\n  );\n}\n\nfunction fmt(val: number | null, decimals = 2): string {\n  return val !== null ? Number(val).toFixed(decimals) : \"—\";\n}\n\ntype Props = {\n  earning: EarningRecord;\n  assetId: number;\n  theme: ChartTheme;\n};\n\nexport function EarningsCard({ earning, assetId, theme }: Props) {\n  const [showHistory, setShowHistory] = useState(false);\n  const [allEarnings, setAllEarnings] = useState<EarningRecord[]>([]);\n  const [loadingAll, setLoadingAll] = useState(false);\n\n  const eps = earning.eps_estimated !== null ? Number(earning.eps_estimated) : null;\n  const revenue = earning.revenue_estimated !== null ? Number(earning.revenue_estimated) : null;\n\n  const hasNoFinancials =\n    earning.eps_actual === null &&\n    earning.eps_estimated === null &&\n    earning.revenue_actual === null &&\n    earning.revenue_estimated === null;\n  const earningsDate = new Date(`${earning.earnings_date}T00:00:00`);\n  const isFutureDate = earningsDate.getTime() > Date.now();\n  const isDateEstimateOnly = hasNoFinancials && isFutureDate;\n\n  const openHistory = () => {\n    setShowHistory(true);\n    if (allEarnings.length === 0) {\n      setLoadingAll(true);\n      fetchAllEarnings(assetId)\n        .then(setAllEarnings)\n        .catch(() => setAllEarnings([]))\n        .finally(() => setLoadingAll(false));\n    }\n  };\n\n  if (showHistory) {\n    return (\n      <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n        <button\n          onClick={() => setShowHistory(false)}\n          style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: theme.text, fontSize: 12, fontWeight: 600, padding: 0, textAlign: \"left\", display: \"flex\", alignItems: \"center\", gap: 4 }}\n        >\n          ← Next earnings\n        </button>\n\n        {loadingAll ? (\n          <div style={{ fontSize: 13, color: theme.text, padding: \"12px 0\" }}>Loading…</div>\n        ) : (\n          <div style={{ overflowY: \"auto\", maxHeight: 260 }}>\n            <table style={{ width: \"100%\", borderCollapse: \"collapse\", tableLayout: \"fixed\", fontSize: 12 }}>\n              <thead style={{ position: \"sticky\", top: 0, background: theme.background }}>\n                <tr style={{ borderBottom: `1px solid ${theme.grid}` }}>\n                  <th style={{ textAlign: \"left\",  fontWeight: 600, color: theme.text, padding: \"0 0 6px 0\", width: \"30%\" }}>Date</th>\n                  <th style={{ textAlign: \"right\", fontWeight: 600, color: theme.text, padding: \"0 0 6px 0\" }}>EPS Est.</th>\n                  <th style={{ textAlign: \"right\", fontWeight: 600, color: theme.text, padding: \"0 0 6px 0\" }}>EPS Act.</th>\n                  <th style={{ textAlign: \"right\", fontWeight: 600, color: theme.text, padding: \"0 0 6px 0\" }}>Revenue</th>\n                </tr>\n              </thead>\n              <tbody>\n                {allEarnings.map((e) => {\n                  const epsAct = e.eps_actual !== null ? Number(e.eps_actual) : null;\n                  const epsEst = e.eps_estimated !== null ? Number(e.eps_estimated) : null;\n                  const beat = epsAct !== null && epsEst !== null ? epsAct >= epsEst : null;\n                  const epsColor = beat === null ? theme.strong : beat ? theme.up : theme.down;\n\n                  return (\n                    <tr key={e.id} style={{ borderBottom: `1px solid ${theme.grid}` }}>\n                      <td style={{ padding: \"6px 0\", color: theme.text }}>{formatDate(e.earnings_date, true)}</td>\n                      <td style={{ padding: \"6px 0\", textAlign: \"right\", color: theme.text, fontVariantNumeric: \"tabular-nums\" }}>{fmt(epsEst)}</td>\n                      <td style={{ padding: \"6px 0\", textAlign: \"right\", fontWeight: 600, color: epsColor, fontVariantNumeric: \"tabular-nums\" }}>{fmt(epsAct)}</td>\n                      <td style={{ padding: \"6px 0\", textAlign: \"right\", color: theme.text, fontVariantNumeric: \"tabular-nums\" }}>\n                        {e.revenue_actual !== null ? formatVolume(Number(e.revenue_actual)) : \"—\"}\n                      </td>\n                    </tr>\n                  );\n                })}\n              </tbody>\n            </table>\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  if (isDateEstimateOnly) {\n    return (\n      <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n        <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"7px 0\", borderTop: `1px solid ${theme.grid}`, borderBottom: `1px solid ${theme.grid}` }}>\n          <span style={{ fontSize: 12, color: theme.text }}>Estimated Date</span>\n          <span style={{ fontSize: 13, fontWeight: 600, color: theme.strong, fontVariantNumeric: \"tabular-nums\" }}>\n            {formatDate(earning.earnings_date)}\n          </span>\n        </div>\n\n        <button\n          onClick={openHistory}\n          style={{ marginTop: 2, padding: \"8px 0\", background: \"none\", border: `1px solid ${theme.grid}`, borderRadius: 8, color: theme.text, fontSize: 12, fontWeight: 600, cursor: \"pointer\", width: \"100%\", textAlign: \"center\" }}\n        >\n          View earnings history\n        </button>\n      </div>\n    );\n  }\n\n  return (\n    <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n      <div style={{ fontSize: 13, fontWeight: 700, color: theme.strong }}>\n        {formatDate(earning.earnings_date)}\n      </div>\n\n      <table style={{ width: \"100%\", borderCollapse: \"collapse\", tableLayout: \"fixed\" }}>\n        <thead>\n          <tr>\n            <th style={{ textAlign: \"left\", fontSize: 11, fontWeight: 600, color: theme.text, paddingBottom: 6, width: \"55%\" }}>&nbsp;</th>\n            <th style={{ textAlign: \"right\", fontSize: 11, fontWeight: 600, color: theme.text, paddingBottom: 6 }}>Estimate</th>\n          </tr>\n        </thead>\n        <tbody>\n          {eps !== null && (\n            <tr style={{ borderTop: `1px solid ${theme.grid}` }}>\n              <td style={{ fontSize: 12, color: theme.text, padding: \"7px 0\" }}>EPS</td>\n              <td style={{ textAlign: \"right\", fontSize: 13, fontWeight: 600, color: theme.strong, padding: \"7px 0\", fontVariantNumeric: \"tabular-nums\" }}>\n                {eps.toFixed(2)}\n              </td>\n            </tr>\n          )}\n          {revenue !== null && (\n            <tr style={{ borderTop: `1px solid ${theme.grid}` }}>\n              <td style={{ fontSize: 12, color: theme.text, padding: \"7px 0\" }}>Revenue</td>\n              <td style={{ textAlign: \"right\", fontSize: 13, fontWeight: 600, color: theme.strong, padding: \"7px 0\", fontVariantNumeric: \"tabular-nums\" }}>\n                {formatVolume(revenue)}\n              </td>\n            </tr>\n          )}\n        </tbody>\n      </table>\n\n      <button\n        onClick={openHistory}\n        style={{ marginTop: 2, padding: \"8px 0\", background: \"none\", border: `1px solid ${theme.grid}`, borderRadius: 8, color: theme.text, fontSize: 12, fontWeight: 600, cursor: \"pointer\", width: \"100%\", textAlign: \"center\" }}\n      >\n        View earnings history\n      </button>\n    </div>\n  );\n}\n","import type { ChartTheme } from \"../../../../charts/types\";\nimport type { NewsArticle } from \"../../../../../types/news\";\nimport type { AssetOverviewDictionary } from \"../../../../../types/Dictionary\";\n\nfunction NewsRow({ article, theme }: { article: NewsArticle; theme: ChartTheme }) {\n  return (\n    <div style={{ display: \"flex\", gap: 10, alignItems: \"flex-start\" }}>\n      {article.imageUrl && (\n        <img\n          src={article.imageUrl}\n          alt=\"\"\n          style={{ width: 60, height: 44, objectFit: \"cover\", borderRadius: 6, flexShrink: 0 }}\n        />\n      )}\n      <div style={{ minWidth: 0 }}>\n        <div\n          style={{\n            fontSize: 13,\n            fontWeight: 600,\n            color: theme.strong,\n            overflow: \"hidden\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 2,\n            WebkitBoxOrient: \"vertical\",\n            lineHeight: 1.4,\n          }}\n        >\n          {article.headline}\n        </div>\n        <div style={{ fontSize: 11, color: theme.text, marginTop: 3 }}>\n          {article.dateCode?.slice(0, 10)}\n        </div>\n      </div>\n    </div>\n  );\n}\n\ntype Props = {\n  news: NewsArticle[];\n  t: AssetOverviewDictionary;\n  theme: ChartTheme;\n};\n\nexport function RelatedNewsPanel({ news, t, theme }: Props) {\n  if (news.length === 0) {\n    return <div style={{ color: theme.text, fontSize: 13 }}>{t.noData}</div>;\n  }\n\n  return (\n    <div style={{ display: \"flex\", flexDirection: \"column\", gap: 14 }}>\n      {news.map((article, i) => (\n        <NewsRow key={i} article={article} theme={theme} />\n      ))}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport Branded from \"../../Branded\";\nimport { loadGoogleFont } from \"../../../utils/loadGoogleFont\";\nimport type { WidgetStyle } from \"../../../types/WidgetStyle\";\nimport type { StockAsset } from \"../../charts/StockWidget/types\";\nimport { AssetPreviewContent } from \"./AssetPreviewContent\";\n\nexport { AssetPreviewContent } from \"./AssetPreviewContent\";\n\ninterface Props {\n  styles: WidgetStyle;\n  assets: StockAsset[];\n  size?: \"full\" | \"screen\";\n  dev?: boolean;\n}\n\nexport function AssetPreview({ styles, assets, size, dev }: Props): JSX.Element {\n  useEffect(() => {\n    loadGoogleFont(styles.font_family);\n  }, [styles.font_family]);\n\n  return (\n    <Branded style={styles}>\n      <Branded.WidgetContainer widgetName=\"assetPreview\" size={size} hideCta>\n        <AssetPreviewContent\n          styles={styles}\n          assets={assets}\n          dev={dev}\n          fullWidth\n        />\n      </Branded.WidgetContainer>\n    </Branded>\n  );\n}\n"],"mappings":";;;;;;;;;AAAA,SAAgB,iBAAAA,gBAAe,cAAAC,aAAY,aAAAC,YAAW,YAAAC,kBAAgB;;;ACAtE,SAAS,YAAY,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACAxD,SAAgB,WAAW,QAAQ,gBAAgB;;;AC0B3C;AAZD,IAAM,OAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,KAAK,QAAQ,WAAW,WAAW,wBAAwB;AAAA,MAC3D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACjBI,gBAAAC,YAAA;AAVG,IAAM,QAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;ACvBW,gBAAAC,YAAA;AALJ,IAAM,OAAiB,MAAM;AAChC,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AAErC,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACJ,OAAO;AAAA,QACH,WAAW;AAAA;AAAA,QACX,UAAU;AAAA;AAAA,QACV,WAAW;AAAA;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,MACb;AAAA,MACA,KAAK;AAAA,MACL,KAAI;AAAA;AAAA,EACR;AACJ;;;AH0LgB,SAyCQ,OAAAC,MAzCR;AArMhB,IAAM,SAAS,CAAC,QACZ,QAAQ,aAAa,QAAQ,eACvB,SACA,QAAQ,cAAc,QAAQ,gBAC1B,UACA;AAGd,IAAM,UAAU,CAAC,MAA0C;AACvD,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,SAAS,IAAI,EAAG,QAAO,WAAW,CAAC;AACzC,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO,WAAW,CAAC,IAAI;AAC9C,SAAO;AACX;AAGA,IAAM,iBAAiB,CAAC,MAAY,QAAqC;AACrE,QAAM,IAAI,GAAG,GAAG;AAChB,QAAM,IAAI;AACV,MAAI,SAAS,QAAQ;AACjB,WAAO;AAAA,MACH,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,yBAAyB;AAAA,IAC7B;AAAA,EACJ;AACA,MAAI,SAAS,SAAS;AAClB,WAAO;AAAA,MACH,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,yBAAyB;AAAA,IAC7B;AAAA,EACJ;AACA,SAAO,EAAE,cAAc,EAAE;AAC7B;AAGA,IAAM,cAAc,CAAC,KAAkB,QAAQ,MAA2B;AACtE,UAAQ,KAAK;AAAA,IACT,KAAK;AACD,aAAO,EAAE,UAAU,YAAY,MAAM,OAAO,KAAK,MAAM;AAAA,IAC3D,KAAK;AACD,aAAO,EAAE,UAAU,YAAY,MAAM,OAAO,QAAQ,MAAM;AAAA,IAC9D,KAAK;AACD,aAAO,EAAE,UAAU,YAAY,OAAO,OAAO,KAAK,MAAM;AAAA,IAC5D,KAAK;AACD,aAAO,EAAE,UAAU,YAAY,OAAO,OAAO,QAAQ,MAAM;AAAA,IAC/D,KAAK;AACD,aAAO;AAAA,QACH,UAAU;AAAA,QACV,MAAM;AAAA,QACN,KAAK;AAAA,QACL,WAAW;AAAA,MACf;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,UAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW;AAAA,MACf;AAAA,IACJ;AACI,aAAO;AAAA,QACH,OAAO;AAAA,QACP,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,SAAS;AAAA,MACb;AAAA,EACR;AACJ;AAGA,IAAM,iBAAiB,MAAY;AAC/B,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,MAAI;AACA,WAAO,OAAO,WAAW,gBAAgB,EAAE,UAAU,UAAU;AAAA,EACnE,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,YAMR,CAAC,EAAE,UAAU,OAAO,MAAM,UAAU,GAAG,gBAAgB,IAAI,MAAM;AAClE,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAGnC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,aAAa,OAAwB,IAAI;AAG/C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAe,cAAc;AAGrD,YAAU,MAAM;AACZ,UAAM,gBAAgB,CAAC,MAAoB;AACvC,UAAI,EAAE,gBAAgB,QAAS,SAAQ,OAAO;AAAA,eACrC,EAAE,gBAAgB,QAAS,SAAQ,OAAO;AAAA,IACvD;AACA,WAAO,iBAAiB,eAAe,eAAe,EAAE,SAAS,KAAK,CAAC;AACvE,WAAO,MAAM,OAAO,oBAAoB,eAAe,aAAa;AAAA,EACxE,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,eAAe,EAAE,gBAAgB,QAAS;AAChE,UAAM,KAAK,OAAO,WAAW,gBAAgB;AAC7C,UAAM,SAAS,MAAM,QAAQ,GAAG,UAAU,UAAU,OAAO;AAC3D,WAAO;AACP,OAAG,mBAAmB,UAAU,MAAM;AACtC,WAAO,MAAM,GAAG,sBAAsB,UAAU,MAAM;AAAA,EAC1D,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACZ,QAAI,SAAS,SAAS;AAClB,kBAAY,KAAK;AACjB,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAGT,QAAM,eAAe,MAAM;AACvB,QAAI,SAAS,QAAS;AACtB,gBAAY,IAAI;AAChB,eAAW,IAAI;AAAA,EACnB;AACA,QAAM,eAAe,MAAM;AACvB,QAAI,SAAS,QAAS;AACtB,eAAW,KAAK;AAChB,gBAAY,KAAK;AAAA,EACrB;AAGA,QAAM,iBAA0C,CAAC,MAAM;AACnD,QAAI,SAAS,WAAW,CAAC,UAAU;AAC/B,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,kBAAY,IAAI;AAAA,IACpB;AAAA,EACJ;AAGA,YAAU,MAAM;AACZ,QAAI,EAAE,SAAS,WAAW,UAAW;AACrC,UAAM,gBAAgB,CAAC,MAAoB;AACvC,YAAM,SAAS,EAAE;AACjB,UAAI,WAAW,WAAW,UAAU,CAAC,WAAW,QAAQ,SAAS,MAAM,GAAG;AACtE,oBAAY,KAAK;AAAA,MACrB;AAAA,IACJ;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,WAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,EAC1E,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,oBAAiC,YAAY;AACnD,QAAM,eAAe,QAAQ,MAAM,oBAAoB,KAAK;AAC5D,QAAM,OAAO,OAAO,iBAAiB;AACrC,QAAM,iBAAsC,YAAY,mBAAmB,OAAO;AAGlF,QAAM,WAAW,SAAS,SAAS,SAAS,SAAS,UAAU,QAAQ;AAGvE,QAAM,SAAS,QAAQ,MAAM,oBAAoB,MAAM,cAAc,KAAK;AAC1E,QAAM,aAAa;AACnB,QAAM,aAAa,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,UAAU,CAAC;AAG/D;AAAA;AAAA,IAEI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,UACH,GAAG;AAAA,UACH,QAAQ;AAAA,QACZ;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACH,SAAS;AAAA,cACT,WAAW,cAAc,QAAQ;AAAA;AAAA,cACjC,YAAY;AAAA,cACZ,YAAY;AAAA,YAChB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACG,MAAM,QAAQ;AAAA,gBACd,QAAO;AAAA,gBACP,OAAO;AAAA,kBACH,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,QAAQ,MAAM,iBAAiB,MAAM;AAAA,kBACrC,YACI,MAAM,yBACN,MAAM,qBACN,MAAM;AAAA,kBACV,OACI,MAAM,mBACN,MAAM,qBACN,MAAM;AAAA,kBACV,WAAW,MAAM,iBAAiB,MAAM;AAAA,kBACxC,UAAU,MAAM,oBAAoB,MAAM;AAAA,kBAC1C,YAAY;AAAA;AAAA,kBACZ,QAAQ;AAAA,kBACR,SAAS,WAAW,WAAW,IAAI;AAAA,kBACnC,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,KAAK;AAAA;AAAA,kBACL,eAAe,OAAO,iBAAiB,MAAM,SAAS,gBAAgB;AAAA,kBACtE,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,GAAG,eAAe,MAAM,YAAY;AAAA,gBACxC;AAAA,gBAEA;AAAA,kCAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,OAAO;AAAA,wBACH,MAAM;AAAA,wBACN,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA;AAAA,wBAEhB,QAAQ;AAAA;AAAA,wBACR,YAAY;AAAA,sBAChB;AAAA,sBAEA,0BAAAA,KAAC,QAAK;AAAA;AAAA,kBACV;AAAA,kBAGA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,OAAO;AAAA,wBACH,SAAS;AAAA,wBACT,UAAU,WAAW,gBAAgB;AAAA,wBACrC,SAAS,WAAW,IAAI;AAAA,wBACxB,WAAW,WAAW,kBAAkB;AAAA,wBACxC,mBAAmB,WAAW,WAAW;AAAA,wBACzC,YACI;AAAA,wBAIJ,UAAU;AAAA,wBACV,YAAY;AAAA,sBAChB;AAAA,sBAEC,mBAAS;AAAA;AAAA,kBACd;AAAA;AAAA;AAAA,YACJ;AAAA;AAAA,QACJ;AAAA;AAAA,IACJ;AAAA;AAER;;;AD/MQ,gBAAAC,MACA,QAAAC,aADA;AA9DR,IAAM,mBAAmB;AASzB,IAAM,aAAa;AAAA;AAAA;AAAA;AAKnB,IAAM,kBAAkB;AAAA,EACtB,CAAC,EAAE,UAAU,YAAY,OAAO,UAAU,UAAU,MAAM,GAAG,QAAQ;AACnE,UAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,UAAM,cAAc,MAAM,oBAAoB,UAAU;AACxD,UAAM,UAAU,CAAC,WAAW,gBAAgB;AAC5C,UAAM,SACJ,YAAY,gBAAgB,SAAS,eAAe;AACtD,UAAM,YAAY,WAAW,gBAAgB;AAS7C,UAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,KAAK;AAClD,UAAM,WAAWC,QAAuB,IAAI;AAC5C,UAAM,cAAc,CAAC,SAAsC;AACzD,eAAS,UAAU;AACnB,UAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,eAC9B,IAAK,CAAC,IAAsD,UAAU;AAAA,IACjF;AACA,IAAAC,WAAU,MAAM;AACd,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,OAAO,WAAW,eAAe,OAAO,WAAW,OAAQ;AACtE,oBAAc,IAAI;AAClB,YAAM,SAAS,MAAY;AACzB,eAAO,OAAO,YAAY,EAAE,QAAQ,kBAAkB,QAAQ,GAAG,eAAe,GAAG,GAAG,GAAG;AAAA,MAC3F;AACA,YAAM,KAAK,IAAI,eAAe,MAAM;AACpC,SAAG,QAAQ,EAAE;AACb,aAAO;AACP,aAAO,MAAM,GAAG,WAAW;AAAA,IAC7B,GAAG,CAAC,CAAC;AAEL,WACE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO,SAAS,UAAU,aAAa,SAAS;AAAA,UAChD,QAAQ,aAAa,SAAS,SAAS,SAAS,SAAS;AAAA,UACzD,WAAW;AAAA,QACb;AAAA,QAEA;AAAA,0BAAAD,KAAC,WAAO,sBAAW;AAAA,UACnB,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,WAAW,aAAa,YAAY;AAAA,gBACpC,QAAQ,aAAa,SAAS;AAAA,gBAC9B,SAAS;AAAA,gBACT,YAAY,SAAS,WAAW;AAAA,gBAChC,eAAe,YAAY,WAAW;AAAA,gBACtC,YAAY,MAAM;AAAA,gBAClB,YAAY,MAAM;AAAA,gBAClB,YAAY,MAAM;AAAA,gBAClB,WAAW,MAAM;AAAA,gBACjB,cAAc,MAAM;AAAA,gBACpB,QAAQ,MAAM;AAAA,gBACd,gBAAgB;AAAA,gBAChB,gBAAgB,GAAG,MAAM,eAAe;AAAA,cAC1C;AAAA,cACA,KAAK;AAAA,cAEJ;AAAA,2BACC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,UACE,eAAe,aAAa,QAAS;AAAA,oBAEvC,OAAO,MAAM,oBAAoB;AAAA,oBACjC,MAAM,MAAM,mBAAmB;AAAA;AAAA,gBACjC;AAAA,gBAED;AAAA;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;;;AK7G9B,YAAY,kBAAkB;AAC9B,SAAa,YAAAK,iBAAgB;;;ACDtB,SAAS,SAAS,KAAa;AAClC,QAAM,IAAI,QAAQ,MAAM,EAAE;AAC1B,MAAI,IAAI,WAAW,GAAG;AAClB,UAAM,IAAI,MAAM,EAAE,EAAE,IAAI,OAAK,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/C;AACA,QAAM,SAAS,SAAS,KAAK,EAAE;AAC/B,SAAO;AAAA,IACH,GAAI,UAAU,KAAM;AAAA,IACpB,GAAI,UAAU,IAAK;AAAA,IACnB,GAAG,SAAS;AAAA,EAChB;AACJ;AAEO,SAAS,SAAS,GAAW,GAAW,GAAW;AACtD,OAAK,KAAK,KAAK,KAAK,KAAK;AACzB,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AACrD,MAAI,IAAI,GAAG,IAAI,GAAG,KAAK,MAAM,OAAO;AAEpC,MAAI,QAAQ,KAAK;AACb,UAAM,IAAI,MAAM;AAChB,QAAI,IAAI,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM;AAC/C,YAAQ,KAAK;AAAA,MACT,KAAK;AAAG,aAAK,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI;AAAI;AAAA,MAC3C,KAAK;AAAG,aAAK,IAAI,KAAK,IAAI;AAAG;AAAA,MAC7B,KAAK;AAAG,aAAK,IAAI,KAAK,IAAI;AAAG;AAAA,IACjC;AACA,SAAK;AAAA,EACT;AACA,SAAO,EAAE,GAAG,GAAG,EAAE;AACrB;AAEO,SAAS,SAAS,GAAW,GAAW,GAAW;AACtD,WAAS,QAAQ,GAAW,GAAW,GAAW;AAC9C,QAAI,IAAI,EAAG,MAAK;AAChB,QAAI,IAAI,EAAG,MAAK;AAChB,QAAI,IAAI,IAAI,EAAG,QAAO,KAAK,IAAI,KAAK,IAAI;AACxC,QAAI,IAAI,IAAI,EAAG,QAAO;AACtB,QAAI,IAAI,IAAI,EAAG,QAAO,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK;AAClD,WAAO;AAAA,EACX;AAEA,MAAI,GAAG,GAAG;AACV,MAAI,MAAM,GAAG;AACT,QAAI,IAAI,IAAI;AAAA,EAChB,OAAO;AACH,UAAM,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAC9C,UAAM,IAAI,IAAI,IAAI;AAClB,QAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;AAC3B,QAAI,QAAQ,GAAG,GAAG,CAAC;AACnB,QAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;AAAA,EAC/B;AACA,SAAO,EAAE,GAAG,KAAK,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,MAAM,IAAI,GAAG,EAAE;AACpF;AAEO,SAAS,SAAS,GAAW,GAAW,GAAW;AACtD,SAAO,KAAM,KAAK,KAAO,KAAK,KAAO,KAAK,IAAK,GAAG,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3E;AAEO,SAAS,aAAa,GAAW,GAAW,GAAmB;AAClE,SAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AAC3C;AASO,SAAS,gBAAgB,GAAW,GAAW,GAAoB;AACtE,SAAO,aAAa,GAAG,GAAG,CAAC,IAAI;AACnC;AAOO,SAAS,aAAa,OAAwB;AAEjD,MAAI,GAAW,GAAW,GAAW,IAAwB;AAC7D,MAAI,MAAM,WAAW,GAAG,GAAG;AACvB,KAAC,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,KAAK;AAAA,EACjC,WAAW,MAAM,WAAW,KAAK,GAAG;AAChC,UAAM,QAAQ,MAAM,MAAM,0CAA0C;AACpE,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oBAAoB;AAChD,KAAC,GAAG,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM;AACxC,QAAI,MAAM,CAAC,EAAG,KAAI,WAAW,MAAM,CAAC,CAAC;AAAA,EACzC,OAAO;AACH,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AACA,SAAO,gBAAgB,GAAG,GAAG,CAAC;AAClC;AAUO,SAAS,oBAAoB,OAAe,UAAkB,IAAY;AAG7E,MAAI,GAAW,GAAW,GAAW,IAAwB;AAC7D,MAAI,MAAM,WAAW,GAAG,GAAG;AACvB,KAAC,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,KAAK;AAAA,EACjC,WAAW,MAAM,WAAW,KAAK,GAAG;AAChC,UAAM,QAAQ,MAAM,MAAM,0CAA0C;AACpE,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oBAAoB;AAChD,KAAC,GAAG,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM;AACxC,QAAI,MAAM,CAAC,EAAG,KAAI,WAAW,MAAM,CAAC,CAAC;AAAA,EACzC,OAAO;AACH,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAGA,MAAI,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,GAAG,GAAG,CAAC;AAClC,QAAMC,WAAU,gBAAgB,GAAG,GAAG,CAAC;AAEvC,MAAIA,UAAS;AACT,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,IAAI;AAAA,EAC3C,OAAO;AACH,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,IAAI;AAAA,EAC3C;AAEA,GAAC,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,GAAG,GAAG,CAAC;AAG/B,SAAO,MAAM,SAAY,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC9E;AASO,SAAS,sBAAsB,OAAe,UAAkB,IAAY;AAE/E,MAAI,GAAW,GAAW,GAAW,IAAwB;AAE7D,MAAI,MAAM,WAAW,GAAG,GAAG;AACvB,KAAC,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,KAAK;AAAA,EACjC,WAAW,MAAM,WAAW,KAAK,GAAG;AAChC,UAAM,QAAQ,MAAM,MAAM,0CAA0C;AACpE,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oBAAoB;AAChD,KAAC,GAAG,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM;AACxC,QAAI,MAAM,CAAC,EAAG,KAAI,WAAW,MAAM,CAAC,CAAC;AAAA,EACzC,OAAO;AACH,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAGA,MAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,IAAK,MAAM,UAAW,GAAG,CAAC;AACxD,MAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,IAAK,MAAM,UAAW,GAAG,CAAC;AACxD,MAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,IAAK,MAAM,UAAW,GAAG,CAAC;AAGxD,SAAO,MAAM,SAAY,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC9E;AAOO,IAAM,eAAe,CAAC,eAAuB;AAChD,QAAM,oBAAoB,aAAa,cAAc,SAAS;AAC9D,SAAO,oBACD,YACA;AACV;AAMO,SAAS,sBAA8B;AAC1C,QAAM,UAAU;AAChB,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAC3E,SAAO;AACX;;;ADrLA,SAAS,qBAAqB;AAC9B,SAAS,eAAe;;;AEKxB,IAAM,WAA6B;AAAA,EAC/B,cAAc;AAAA,EACd,UAAU;AAAA,EACV,eAAe,OAAO,WAAW,cAAc,OAAO,aAAa;AAAA,EACnE,gBAAgB,OAAO,WAAW,cAAc,OAAO,cAAc;AAAA,EACrE,KAAK;AAAA,EACL,UAAU;AACd;AAEA,IAAM,UAAU;AAQT,SAAS,6BACZ,MACA,MACkB;AAClB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,IAAI,QAAQ,KAAK,IAAI;AAC3B,MAAI,CAAC,EAAG,QAAO;AAEf,QAAM,MAAM,WAAW,EAAE,CAAC,CAAC;AAC3B,QAAM,QAAQ,EAAE,CAAC,KAAK,MAAM,YAAY;AAExC,MAAI,OAAO,MAAM,GAAG,EAAG,QAAO;AAE9B,QAAM,IAAI,KAAK,IAAI,GAAG,GAAG;AAEzB,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,EAAE,GAAG,UAAU,GAAG,KAAK;AAE3B,MAAI;AAEJ,UAAQ,MAAM;AAAA,IACV,KAAK;AAAA,IAAM,KAAK;AACZ,WAAK;AAAG;AAAA;AAAA,IAGZ,KAAK;AACD,WAAK,IAAI;AAAc;AAAA,IAC3B,KAAK;AACD,WAAK,IAAI;AAAU;AAAA,IAEvB,KAAK;AACD,WAAM,IAAI,MAAO;AAAe;AAAA,IACpC,KAAK;AACD,WAAM,IAAI,MAAO;AAAgB;AAAA,IACrC,KAAK;AACD,WAAM,IAAI,MAAO,KAAK,IAAI,eAAe,cAAc;AAAG;AAAA,IAC9D,KAAK;AACD,WAAM,IAAI,MAAO,KAAK,IAAI,eAAe,cAAc;AAAG;AAAA;AAAA,IAG9D,KAAK;AACD,WAAK,IAAI;AAAK;AAAA,IAClB,KAAK;AACD,WAAM,IAAI,OAAQ;AAAK;AAAA,IAC3B,KAAK;AACD,WAAM,IAAI,OAAQ;AAAK;AAAA,IAC3B,KAAK;AACD,WAAM,IAAI,KAAM;AAAK;AAAA,IACzB,KAAK;AACD,WAAM,IAAI,KAAK,KAAM;AAAK;AAAA;AAAA,IAG9B,KAAK;AACD,aAAO;AAAA;AAAA,IAGX,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACI,aAAO;AAAA,EACf;AAEA,MAAI,MAAM,QAAQ,CAAC,OAAO,SAAS,EAAE,EAAG,QAAO;AAE/C,SAAO,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC;AACpC;;;AFYgB,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AA3EhB,IAAM,WAA8B,CAAC,UAAU;AAC3C,QAAM,EAAE,OAAO,OAAO,UAAU,UAAU,WAAW,OAAO,aAAa,OAAO,kBAAkB,IAAI;AAEtG,QAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAiB,EAAE;AAEvD,MAAI,YAAY,CAAC,MAAM,QAAQ,QAAQ,GAAG;AACtC,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAGA,MAAI,YAAY;AACZ,eAAW,QAAQ,OAAO;AACtB,UAAI,CAAE,KAAwB,OAAO;AACjC,cAAM,IAAI,MAAM,0DAA0D;AAAA,MAC9E;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,YAAY,MAAM,oBAAoB,MAAM;AAElD,QAAMC,gBAAoC;AAAA,IACtC,YAAY,MAAM,uBAAuB,MAAM;AAAA,IAC/C,OAAO,MAAM,uBAAuB,MAAM;AAAA,IAC1C,WAAW,MAAM,mBAAmB,MAAM;AAAA,IAC1C,cAAc;AAAA,IACd,UAAU,MAAM,sBAAsB,MAAM;AAAA,IAC5C,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM,mBAAmB,MAAM;AAAA,IACvC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,EACX;AAEA,QAAMC,gBAAoC;AAAA,IACtC,YAAY,MAAM,uBAAuB,MAAM;AAAA,IAC/C,OAAO,MAAM,uBAAuB,MAAM;AAAA,IAC1C,QAAQ,MAAM,mBAAmB,MAAM;AAAA,IACvC,WAAW,MAAM,mBAAmB,MAAM;AAAA,IAC1C,UAAU,MAAM,sBAAsB,MAAM;AAAA,IAC5C,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc,6BAA6B,SAAS;AAAA,IACpD,UAAU;AAAA,IACV,QAAQ;AAAA,EACZ;AAEA,QAAM,gBAAqC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EAChB;AAEA,QAAM,aAAa,oBAAoB,MAAM,uBAAuB,MAAM,iBAAiB,EAAE;AAE7F,QAAM,gBAAgB,aACf,MAA2B;AAAA,IAAO,UACjC,KAAK,MAAM,YAAY,EAAE,SAAS,WAAW,YAAY,CAAC;AAAA,EAC9D,IACE;AAEN,SACI,gBAAAH,MAAc,mBAAb,EACG;AAAA,oBAAAD,KAAc,sBAAb,EAAqB,SAAO,MACzB,0BAAAC,MAAC,SAAI,OAAOE,eACP;AAAA;AAAA,MACD,gBAAAH,KAAC,iBAAc;AAAA,OACnB,GACJ;AAAA,IAEA,gBAAAA,KAAc,qBAAb,EACG,0BAAAC,MAAc,sBAAb,EAAqB,YAAY,GAAG,OAAOG,eACvC;AAAA,oBACG,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,YACH,UAAU;AAAA,YACV,KAAK;AAAA,YACL,YAAY,MAAM,uBAAuB,MAAM;AAAA,YAC/C,eAAe;AAAA,YACf,QAAQ;AAAA,UACZ;AAAA,UAEA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,aAAa,qBAAqB;AAAA,cAClC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,WAAW,CAAC,MAAM,EAAE,gBAAgB;AAAA,cACpC,OAAO;AAAA,gBACH,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,UAAU;AAAA,cACd;AAAA;AAAA,UACJ;AAAA;AAAA,MACJ;AAAA,MAGH,cAAc,IAAI,CAAC,MAAM,UAAU;AAChC,cAAM,aAAa,MAAM,QAAQ,QAAQ,IACnC,SAAS,SAAS,KAAK,KAAK,IAC5B,aAAa,KAAK;AAExB,cAAM,YAAY,iBAAiB;AAEnC,cAAM,YAAY;AAAA,UACd,GAAG;AAAA,UACH,iBAAiB,YAAY,aAAa;AAAA,QAC9C;AAEA,eACI,gBAAAC;AAAA,UAAc;AAAA,UAAb;AAAA,YAEG,UAAU,CAAC,MAAM;AACb,kBAAI,SAAU,GAAE,eAAe;AAC/B,uBAAS,KAAK,KAAK;AAAA,YACvB;AAAA,YACA,cAAc,MAAM,gBAAgB,KAAK;AAAA,YACzC,cAAc,MAAM,gBAAgB,IAAI;AAAA,YACxC,OAAO;AAAA,YAGH;AAAA,0BAAY,gBAAAD,KAAC,SAAI,OAAO;AAAA,gBACpB,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,cACpB,GACK,wBAAc,gBAAAA,KAAC,WAAQ,GAC5B;AAAA,cAGH,KAAK;AAAA;AAAA;AAAA,UArBD,KAAK;AAAA,QAsBd;AAAA,MAER,CAAC;AAAA,OACL,GACJ;AAAA,KACJ;AAER;AAEA,SAAS,cAAc;;;AG/LvB,YAAYK,mBAAkB;AAC9B,SAAa,YAAAC,iBAAgB;AAI7B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;AA8EA,mBACI,OAAAC,MADJ,QAAAC,aAAA;AA3ExB,IAAM,mBAAmB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACf,MAMM;AACF,QAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAwB,IAAI;AAEpE,QAAM,YAAY,MAAM,oBAAoB,MAAM;AAElD,QAAMC,gBAAoC;AAAA,IACtC,YAAY,MAAM,uBAAuB,MAAM;AAAA,IAC/C,OAAO,MAAM,uBAAuB,MAAM;AAAA,IAC1C,WAAW,MAAM,mBAAmB,MAAM;AAAA,IAC1C,cAAc;AAAA,IACd,UAAU,MAAM,sBAAsB,MAAM;AAAA,IAC5C,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM,mBAAmB,MAAM;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EAChB;AAEA,QAAMC,gBAAoC;AAAA,IACtC,YAAY,MAAM,uBAAuB,MAAM;AAAA,IAC/C,OAAO,MAAM,uBAAuB,MAAM;AAAA,IAC1C,QAAQ,MAAM,mBAAmB,MAAM;AAAA,IACvC,cAAc,6BAA6B,SAAS;AAAA,IACpD,UAAU,MAAM,sBAAsB,MAAM;AAAA,IAC5C,WAAW,MAAM,mBAAmB,MAAM;AAAA,IAC1C,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,EACf;AAEA,QAAM,gBAAqC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,EACZ;AAEA,QAAM,aAAa,oBAAoB,MAAM,uBAAuB,MAAM,iBAAiB,EAAE;AAE7F,MAAI,YAAY,CAAC,MAAM,QAAQ,QAAQ,GAAG;AACtC,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAClF;AAEA,SACI,gBAAAH,MAAc,oBAAb,EACG;AAAA,oBAAAD,KAAc,uBAAb,EAAqB,SAAO,MAAC,OAAO,EAAE,OAAO,OAAO,GACjD,0BAAAC,MAAC,SAAI,OAAOE,eACP;AAAA,YAAM,QAAQ,QAAQ,IACnB,QAEA,gBAAAF,MAAA,YACI;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,sBAAsB,QAAQ;AAAA,YACnC,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OACI,MAAM,yBACA,EAAE,cAAc,UAAU,UAAU,SAAS,IAC7C;AAAA;AAAA,QAEd;AAAA,QACC;AAAA,SACL;AAAA,MAEJ,gBAAAA,KAACK,gBAAA,EAAc;AAAA,OACnB,GACJ;AAAA,IAEA,gBAAAL,KAAc,sBAAb,EACG,0BAAAA,KAAc,uBAAb,EAAqB,YAAY,GAAG,OAAOI,eACvC,qBAAW,IAAI,CAAC,UAAU,UAAU;AACjC,YAAM,aACF,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,QAAQ;AAEzD,YAAM,YAAY,iBAAiB;AAEnC,YAAM,YAAY;AAAA,QACd,GAAG;AAAA,QACH,iBAAiB,YAAY,aAAa;AAAA,MAC9C;AAEA,aACI,gBAAAH;AAAA,QAAc;AAAA,QAAb;AAAA,UAEG,UAAU,CAAC,MAAM;AACb,gBAAI,SAAU,GAAE,eAAe;AAC/B,qBAAS,QAAQ;AAAA,UACrB;AAAA,UACA,cAAc,MAAM,gBAAgB,KAAK;AAAA,UACzC,cAAc,MAAM,gBAAgB,IAAI;AAAA,UACxC,OAAO;AAAA,UAEP;AAAA,4BAAAD,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,YAAY,UAAU,gBAAgB,SAAS,GACxG,wBAAc,gBAAAA,KAACM,UAAA,EAAQ,GAC5B;AAAA,YACA,gBAAAN;AAAA,cAAC;AAAA;AAAA,gBACG,KAAK,sBAAsB,QAAQ;AAAA,gBACnC,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,OACI,MAAM,yBACA,EAAE,cAAc,UAAU,UAAU,SAAS,IAC7C;AAAA;AAAA,YAEd;AAAA,YACC;AAAA;AAAA;AAAA,QAvBI;AAAA,MAwBT;AAAA,IAER,CAAC,GACL,GACJ;AAAA,KACJ;AAER;AAEA,iBAAiB,cAAc;;;ACvJ/B,YAAYO,mBAAkB;AAC9B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,iBAAAC,sBAAqB;AA4Cd,SAmBI,OAAAC,MAnBJ,QAAAC,aAAA;AAtChB,IAAM,eAAe,CAAC;AAAA,EAClB;AAAA,EACA;AACJ,MAGM;AACF,QAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAmB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;AACzE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AAEpE,QAAM,eAAe,CAAC,UAAkB,UAAkB;AACtD,UAAM,UAAU,CAAC,GAAG,IAAI;AACxB,YAAQ,KAAK,IAAI;AACjB,YAAQ,OAAO;AACf,aAAS,OAAO;AAAA,EACpB;AAEA,QAAM,aAAa,oBAAoB,MAAM,uBAAuB,MAAM,iBAAiB,EAAE;AAC7F,QAAM,YAAY,MAAM,oBAAoB,MAAM;AAElD,QAAMC,gBAAoC;AAAA,IACtC,YAAY,MAAM,uBAAuB,MAAM;AAAA,IAC/C,OAAO,MAAM,uBAAuB,MAAM;AAAA,IAC1C,QAAQ,MAAM,mBAAmB,MAAM;AAAA,IACvC,cAAc,6BAA6B,SAAS;AAAA,IACpD,UAAU,MAAM,sBAAsB,MAAM;AAAA,IAC5C,WAAW,MAAM,mBAAmB,MAAM;AAAA,IAC1C,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,EACf;AAEA,QAAM,iBAAiB,CAAC,UAAkB,UACtC,gBAAAF,MAAc,oBAAb,EACG;AAAA,oBAAAD,KAAc,uBAAb,EAAqB,SAAO,MACzB,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,UACH,YAAY,MAAM,uBAAuB,MAAM;AAAA,UAC/C,OAAO,MAAM,uBAAuB,MAAM;AAAA,UAC1C,WAAW,MAAM,mBAAmB,MAAM;AAAA,UAC1C,cAAc;AAAA,UACd,UAAU,MAAM,sBAAsB,MAAM;AAAA,UAC5C,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM,mBAAmB,MAAM;AAAA,UACvC,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,QACX;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACG,KAAK,sBAAsB,QAAQ;AAAA,cACnC,KAAK;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,OACI,MAAM,yBACA,EAAE,cAAc,UAAU,UAAU,SAAS,IAC7C;AAAA;AAAA,UAEd;AAAA,UACC;AAAA,UACD,gBAAAA,KAACI,gBAAA,EAAc;AAAA;AAAA;AAAA,IACnB,GACJ;AAAA,IAEA,gBAAAJ,KAAc,sBAAb,EACG,0BAAAA;AAAA,MAAc;AAAA,MAAb;AAAA,QACG,YAAY;AAAA,QACZ,OAAOG;AAAA,QAEN,qBAAW,IAAI,CAAC,UAAU,MAAM;AAC7B,gBAAM,YAAY,iBAAiB,IAAI,QAAQ,WAAW;AAC1D,iBACI,gBAAAF;AAAA,YAAc;AAAA,YAAb;AAAA,cAEG,UAAU,MAAM,aAAa,UAAU,KAAK;AAAA,cAC5C,cAAc,MAAM,gBAAgB,IAAI,QAAQ,WAAW,MAAM;AAAA,cACjE,cAAc,MAAM,gBAAgB,IAAI;AAAA,cACxC,OAAO;AAAA,gBACH,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,iBAAiB,YAAY,aAAa;AAAA,gBAC1C,YAAY;AAAA,cAChB;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACG,KAAK,sBAAsB,QAAQ;AAAA,oBACnC,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OACI,MAAM,yBACA,EAAE,cAAc,UAAU,UAAU,SAAS,IAC7C;AAAA;AAAA,gBAEd;AAAA,gBACC;AAAA;AAAA;AAAA,YAzBI;AAAA,UA0BT;AAAA,QAER,CAAC;AAAA;AAAA,IACL,GACJ;AAAA,KACJ;AAGJ,SACI,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,GACtC;AAAA,mBAAe,KAAK,CAAC,GAAG,CAAC;AAAA,IACzB,eAAe,KAAK,CAAC,GAAG,CAAC;AAAA,KAC9B;AAER;AAEA,aAAa,cAAc;;;AChHnB,gBAAAI,YAAA;AAlBR,IAAM,YAAY,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAOM;AACF,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACH,YAAY,MAAM,oBAAoB,MAAM;AAAA,QAC5C,QAAQ,MAAM,gBAAgB,MAAM;AAAA,QACpC,OAAO,MAAM,oBAAoB,MAAM;AAAA,QACvC,WAAW,MAAM,gBAAgB,MAAM;AAAA,QACvC,cAAc,MAAM,iBAAiB,MAAM;AAAA,QAC3C,UAAU,MAAM,mBAAmB,MAAM;AAAA,QACzC,YAAY,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,SAAS;AAAA,MACb;AAAA,MACA;AAAA;AAAA,EACJ;AAER;AAEA,UAAU,cAAc;;;AC1CxB,SAAa,YAAAC,iBAAgB;AA6BzB,gBAAAC,aAAA;AAjBJ,IAAM,SAIF,CAAC,UAAU;AACb,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK;AAEhD,QAAME,aAAiC;AAAA,IACrC,SAAS,YAAY,OAAO;AAAA,IAC5B,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,QAAMC,eAAc,EAAE,GAAGD,YAAW,GAAG,MAAM,aAAa;AAE1D,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,SAAS,MAAM;AAAA,MACf,cAAc,MAAM,aAAa,IAAI;AAAA,MACrC,cAAc,MAAM,aAAa,KAAK;AAAA,MACtC,OAAOE;AAAA,MAEN,gBAAM;AAAA;AAAA,EACT;AAEJ;AAEA,OAAO,cAAc;;;ACzCrB,SAAS,YAAAC,iBAAgB;AA4Cf,gBAAAC,aAAA;AAxCV,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AACF,MAGM;AACJ,QAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAwB,IAAI;AAEpE,QAAM,CAAC,cAAc,cAAc,YAAY,KAC7C,MAAM,iBAAiB,MAAM,aAC7B,MAAM,GAAG;AAEX,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY,MAAM,qBAAqB,MAAM;AAAA,QAC7C,QAAQ,MAAM,iBAAiB,MAAM;AAAA,QACrC,OAAO,MAAM,qBAAqB,MAAM;AAAA,QACxC,WAAW,MAAM,iBAAiB,MAAM;AAAA,QACxC,cAAc,MAAM,kBAAkB,MAAM;AAAA,QAC5C,UAAU,MAAM,oBAAoB,MAAM;AAAA,QAC1C,YAAY,MAAM;AAAA,MACpB;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,aAAa,UAAU,YAAY,MAAM,KAAK,MAAM,YAAY;AACtE,cAAM,iBAAiB,MAAM,qBAAqB,MAAM;AACxD,cAAM,qBAAqB,oBAAoB,gBAAgB,EAAE;AACjE,cAAM,aAAa,aAAa,qBAAqB;AAErD,cAAM,YAAY,iBAAiB;AAEnC,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,KAAK;AAAA,YACd,cAAc,MAAM,gBAAgB,KAAK;AAAA,YACzC,cAAc,MAAM,gBAAgB,IAAI;AAAA,YACxC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,SAAS;AAAA,cACT;AAAA,cACA,YACE,QAAQ,IACJ,GAAG,YAAY,IAAI,YAAY,IAAI,YAAY,KAC/C;AAAA,cACN,SAAS,YAAY,OAAO;AAAA,cAC5B,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,aAAa;AAAA,cACb,cAAc;AAAA,cACd,UAAU;AAAA,YACZ;AAAA,YAEC,eAAK;AAAA;AAAA,UAtBD;AAAA,QAuBP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAEA,YAAY,cAAc;;;AC/Df,gBAAAE,aAAA;AAVX,IAAM,QAAQ,CAAC;AAAA,EACX;AAAA,EACA,KAAK;AAAA,EACL,cAAc,CAAC;AACnB,MAIM;AACF,QAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,SAAO,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACH,GAAG;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU;AAAA,UACV,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM;AAAA,QACtB;AAAA,QAAG,GAAG;AAAA,MACV;AAAA,MACF;AAAA;AAAA,EAAS;AACf;AAEA,MAAM,cAAc;;;ACdhB,gBAAAC,aAAA;AAVJ,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA,cAAc,CAAC;AACjB,MAGM;AACJ,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,GAAG;AAAA,UACD,YAAY,MAAM,sBAAsB,MAAM;AAAA,UAC9C,QAAQ,MAAM,kBAAkB,MAAM;AAAA,UACtC,OAAO,MAAM,sBAAsB,MAAM;AAAA,UACzC,WAAW,MAAM,kBAAkB,MAAM;AAAA,UACzC,cAAc,MAAM,mBAAmB,MAAM;AAAA,UAC7C,UAAU,MAAM,qBAAqB,MAAM;AAAA,UAC3C,YAAY,MAAM;AAAA,UAClB,YAAY,MAAM,qBAAqB,MAAM;AAAA,UAC7C,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,iBAAiB,cAAc;;;AC1C/B,OAAOC,UAAS,eAAe,kBAAkB;AAuClC,SAWH,OAAAC,OAXG,QAAAC,aAAA;AAdf,IAAM,kBAAkB,cAAgD,MAAS;AAEjF,IAAM,qBAAqB,MAAM;AAC7B,QAAM,UAAU,WAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,uDAAuD;AAAA,EAC3E;AACA,SAAO;AACX;AAEA,IAAM,QAAQ,OAAO;AAAA,EACjB,CAAC,EAAE,SAAS,MAAqC;AAC7C,UAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,WAAO,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACf,QAAQ,MAAM,gBAAgB,MAAM;AAAA,MACpC,WAAW,MAAM,gBAAgB,MAAM;AAAA,MACvC,cAAc,MAAM,iBAAiB,MAAM;AAAA;AAAA,MAE3C,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IACf,GACI;AAAA,sBAAAD,MAAC,SAAI,OAAO;AAAA,QACR,UAAU;AAAA,QACV,WAAW,MAAM,gBAAgB,MAAM;AAAA,QACvC,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,gBAAAA,MAAC,WAAM,OAAO;AAAA,QACV,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAa;AAAA;AAAA,QACb,UAAU;AAAA,MACd,GAAI,UAAS;AAAA,OACjB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM,CAAC,EAAE,SAAS,MAAqC;AACnD,aAAO,gBAAAA,MAAC,WACJ,0BAAAA,MAAC,QACI,UACL,GACJ;AAAA,IACJ;AAAA,IAEA,UAAU,CAAC,EAAE,SAAS,MAAqC;AACvD,YAAM,EAAE,mBAAmB,IAAI,iBAAiB;AAEhD,aACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,YACH,GAAG;AAAA,YACH,UAAU;AAAA,YACV,KAAK;AAAA,YACL,WAAW;AAAA,YACX,YAAY,mBAAmB,cAAc;AAAA,YAC7C,QAAQ;AAAA;AAAA,UACZ;AAAA,UAEC;AAAA;AAAA,MACL;AAAA,IAER;AAAA,IAEA,MAAM,CAAC,EAAE,SAAS,MAAqC;AACnD,YAAM,OAAOE,OAAM,SAAS,QAAQ,QAAQ;AAC5C,aAAO,gBAAAF,MAAC,WACH,eAAK;AAAA,QAAI,CAAC,OAAO,UACdE,OAAM,aAAa,OAAkC;AAAA,UACjD;AAAA,UACA,WAAW,UAAU,KAAK,SAAS;AAAA,QACvC,CAAC;AAAA,MACL,GACJ;AAAA,IACJ;AAAA,IAEA,KAAK,CAAC;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,IACnB,MAKM;AACF,YAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,YAAM,YAAY,CAAC,CAAC,MAAM,iBAAiB,UAAU,UAAa,QAAQ,MAAM;AAEhF,YAAM,QAAQA,OAAM,SAAS,QAAQ,QAAQ;AAC7C,YAAM,cAAc,MAAM;AAAA,QAAI,CAAC,OAAO,cAClCA,OAAM,aAAa,OAAkC;AAAA,UACjD,WAAW,cAAc,MAAM,SAAS;AAAA,UACxC;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,YAAM,WAAgC;AAAA,QAClC,OAAO,MAAM,yBAAyB,MAAM;AAAA,QAC5C,cAAc,YAAY,iBAAkB,MAAM,uBAAuB,CAAC,YAAa,MAAM,sBAAsB;AAAA,QACnH,GAAG;AAAA,MACP;AAEA,aAAO,gBAAAF,MAAC,gBAAgB,UAAhB,EAAyB,OAAO,EAAE,SAAS,UAAU,GACzD,0BAAAA,MAAC,QAAG,OAAO,UACN,uBACL,GACJ;AAAA,IACJ;AAAA,IAEA,MAAM,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACd,MAQM;AACF,YAAM,EAAE,OAAO,mBAAmB,IAAI,iBAAiB;AACvD,YAAM,EAAE,QAAQ,IAAI,mBAAmB;AAEvC,YAAM,yBAAyB,MAAM,yBAAyB,MAAM;AACpE,YAAM,SAAS,SAAS,uBAAuB,MAAM,CAAC,GAAG,EAAE,IAAI,WAAW;AAC1E,YAAM,yBAAyB,SACzB,OAAO,SAAS,uBAAuB,MAAM,CAAC,GAAG,EAAE,IAAI,SAAU,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,IAC7F,OAAO,SAAS,uBAAuB,MAAM,CAAC,GAAG,EAAE,IAAI,SAAU,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAEnG,YAAM,aAAkC;AAAA,QACpC,GAAI,WAAW,qBAAqB;AAAA,UAChC,YAAY,UAAU,yBAAyB;AAAA,UAC/C,OAAO,MAAM,yBAAyB,MAAM;AAAA,UAC5C,SAAS;AAAA,UACT,aAAc,MAAM,0BAA0B,CAAC,YAAa,MAAM,yBAAyB;AAAA,UAC3F,UAAU,MAAM,wBAAwB,MAAM;AAAA,UAC9C,YAAY,MAAM;AAAA,UAClB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,cAAc;AAAA,QAClB;AAAA,QAEA,GAAG;AAAA,MACP;AAEA,aAAO,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACJ,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UAEC;AAAA;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,MAAM,cAAc;;;AClMpB,OAAOG,YAAW;AAClB,YAAY,aAAa;AAsFT,gBAAAC,OAgCI,QAAAC,aAhCJ;AAnET,IAAM,mBAAoD,CAAC,EAAE,OAAO,UAAU,SAAS,CAAC,EAAE,MAAM;AACnG,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,CAAC,OAAO,QAAQ,IAAIF,OAAM,SAAS,MAAM,SAAS,CAAC;AACzD,QAAM,CAAC,MAAM,OAAO,IAAIA,OAAM,SAAS,MAAM,YAAY,CAAC;AAC1D,QAAM,CAAC,cAAc,eAAe,IAAIA,OAAM,SAAwB,SAAS,IAAI;AACnF,QAAM,CAAC,MAAM,OAAO,IAAIA,OAAM,SAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAIA,OAAM,SAAwB,IAAI;AAEtE,EAAAA,OAAM,UAAU,MAAM;AAClB,QAAI,OAAO;AACP,sBAAgB,KAAK;AACrB,YAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,eAAS,OAAO,SAAS,CAAC;AAC1B,cAAQ,OAAO,YAAY,CAAC;AAAA,IAChC;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAEV,EAAAA,OAAM,UAAU,MAAM;AAClB,QAAI,QAAQ,cAAc;AACtB,YAAM,SAAS,IAAI,KAAK,YAAY;AACpC,eAAS,OAAO,SAAS,CAAC;AAC1B,cAAQ,OAAO,YAAY,CAAC;AAAA,IAChC;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa;AAAA,IACf;AAAA,IAAW;AAAA,IAAY;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAChD;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAa;AAAA,IAAW;AAAA,IAAY;AAAA,EAC1D;AAEA,QAAMG,eAAc,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ;AACzD,QAAM,WAAW,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO;AAEjD,QAAM,aAAa,CAAC,QAAgB;AAChC,QAAI,CAAC,aAAc,QAAO;AAC1B,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,aAAa,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,WAAO,MAAM,QAAQ,IAAI,MAAM,SAAS,MAAM;AAAA,EAClD;AAEA,QAAM,eAAe,CAAC,QAAgB;AAClC,UAAM,UAAU,GAAG,IAAI,IAAI,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC;AAC7F,oBAAgB,OAAO;AACvB,eAAW,OAAO;AAClB,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,gBAAgB,MAAM;AACxB,QAAI,UAAU,GAAG;AACb,eAAS,EAAE;AACX,cAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,IACxB,OAAO;AACH,eAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACJ;AAEA,QAAM,gBAAgB,MAAM;AACxB,QAAI,UAAU,IAAI;AACd,eAAS,CAAC;AACV,cAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,IACxB,OAAO;AACH,eAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACJ;AAEA,SACI,gBAAAD,MAAS,cAAR,EAAa,MAAY,cAAc,SACpC;AAAA,oBAAAD,MAAS,iBAAR,EAAgB,SAAO,MACpB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,UACH,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAY,OAAO,cAAc;AAAA,UACjC,OAAO,OAAO,aAAa;AAAA,UAC3B,QAAQ,OAAO,UAAU;AAAA,UACzB,cAAc,OAAO,uBAAuB;AAAA,UAC5C,UAAU,OAAO,YAAY;AAAA,UAC7B,YAAY,OAAO,cAAc;AAAA,UACjC,WAAW,OAAO;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,QACZ;AAAA,QAEC,0BAAgB;AAAA;AAAA,IACrB,GACJ;AAAA,IACA,gBAAAA,MAAS,gBAAR,EACG,0BAAAC;AAAA,MAAS;AAAA,MAAR;AAAA,QACG,OAAM;AAAA,QACN,YAAY;AAAA,QACZ,OAAO;AAAA,UACH,SAAS;AAAA,UACT,YAAY,OAAO,cAAc;AAAA,UACjC,OAAO,OAAO,aAAa;AAAA,UAC3B,QAAQ,OAAO,UAAU;AAAA,UACzB,cAAc,OAAO,uBAAuB;AAAA,UAC5C,WAAW,OAAO,UAAU;AAAA,UAC5B,QAAQ;AAAA,QACZ;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,gBACH,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,YAAY;AAAA,cAChB;AAAA,cAEA;AAAA,gCAAAD,MAAC,YAAO,SAAS,eAAe,OAAO,EAAE,QAAQ,UAAU,GAAG,eAAI;AAAA,gBAClE,gBAAAA,MAAC,SAAK,aAAG,WAAW,KAAK,CAAC,IAAI,IAAI,IAAG;AAAA,gBACrC,gBAAAA,MAAC,YAAO,SAAS,eAAe,OAAO,EAAE,QAAQ,UAAU,GAAG,eAAI;AAAA;AAAA;AAAA,UACtE;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,gBACH,SAAS;AAAA,gBACT,qBAAqB;AAAA,gBACrB,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,YAAY;AAAA,cAChB;AAAA,cAEC,WAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC,MAC7C,gBAAAA,MAAC,SAAa,eAAJ,CAAM,CACnB;AAAA;AAAA,UACL;AAAA,UAEA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,gBACH,SAAS;AAAA,gBACT,qBAAqB;AAAA,gBACrB,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,KAAK;AAAA,cACT;AAAA,cAEC;AAAA,sBAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,gBAAAD,MAAC,WAAS,KAAK,CAAC,EAAI,CAAE;AAAA,gBAE/D,MAAME,YAAW,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM;AACzC,wBAAM,MAAM,IAAI;AAChB,wBAAM,WAAW,WAAW,GAAG;AAC/B,wBAAM,UAAU,eAAe;AAE/B,yBACI,gBAAAF;AAAA,oBAAC;AAAA;AAAA,sBAEG,SAAS,MAAM,aAAa,GAAG;AAAA,sBAC/B,cAAc,MAAM,cAAc,GAAG;AAAA,sBACrC,cAAc,MAAM,cAAc,IAAI;AAAA,sBACtC,OAAO;AAAA,wBACH,YAAY,WACN,OAAO,sBAAsB,YAC7B,UACI,SACA;AAAA,wBACV,OAAO,WACD,OAAO,qBAAqB,UAC5B,OAAO,aAAa;AAAA,wBAC1B,cAAc;AAAA,wBACd,SAAS;AAAA,wBACT,QAAQ;AAAA,wBACR,QAAQ;AAAA,wBACR,YAAY;AAAA,sBAChB;AAAA,sBAEC;AAAA;AAAA,oBApBI;AAAA,kBAqBT;AAAA,gBAER,CAAC;AAAA;AAAA;AAAA,UACL;AAAA;AAAA;AAAA,IACJ,GACJ;AAAA,KACJ;AAER;;;AC/LA,SAAS,0BAA0B;AA0C3B,SAQI,OAAAG,OARJ,QAAAC,aAAA;AAtCR,IAAM,kBAAkB,CAAC;AAAA,EACrB;AAAA,EACA;AACJ,MAGM;AACF,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,QAAM,YAAY,MAAM,kBAAkB,MAAM;AAChD,QAAM,eAAgD;AAAA;AAAA,IAElD,YAAY,MAAM,mBAAmB,MAAM;AAAA,IAC3C,WAAW,MAAM,aAAa,MAAM;AAAA,IACpC,oBAAoB,MAAM,4BAA4B,MAAM;AAAA,IAC5D,mBAAmB,MAAM,sBAAsB,MAAM;AAAA,IACrD,QAAQ,MAAM,eAAe,MAAM;AAAA,IACnC,qBAAqB;AAAA,IACrB,qBAAqB,6BAA6B,SAAS;AAAA,IAC3D,UAAU,MAAM,kBAAkB,MAAM;AAAA,IACxC,QAAQ,MAAM,eAAe,MAAM;AAAA,EACvC;AAEA,QAAM,kBAAkB,CAAC,UAAkB;AACvC,eAAW;AAAA,MACP;AAAA,MACA,KAAK,MAAM;AAAA,IACf,CAAC;AAAA,EACL;AAEA,QAAM,gBAAgB,CAAC,QAAgB;AACnC,eAAW;AAAA,MACP,OAAO,MAAM;AAAA,MACb;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,QACH,SAAS;AAAA,QACT,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,KAAK;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,OAAO,SAAS;AAAA,YACvB,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,cACH,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,YACd;AAAA,YAEA,0BAAAA,MAAC,sBAAmB,MAAM,IAAI;AAAA;AAAA,QAClC;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,OAAO,OAAO;AAAA,YACrB,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACZ;AAAA;AAAA;AAAA,EACJ;AAER;AAEA,gBAAgB,cAAc;;;AC5E9B,SAAa,aAAAE,YAAW,YAAAC,iBAAgB;;;ACGjC,IAAM,kBACR,OAAO,YAAY,eAAe,QAAQ,IAAI,mCAC/C;;;ACHJ,eAAsB,aAAgC;AAClD,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACA,YAAQ,IAAI,4BAA4B,GAAG;AAC3C,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,CAAC,SAAS,IAAI;AACd,cAAQ,MAAM,uBAAuB,SAAS,MAAM,EAAE;AACtD,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IAC5D;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAQ,IAAI,sBAAsB,IAAI;AACtC,YAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,SAA+B,KAAK,QAAQ;AAAA,EACzE,SAAS,OAAO;AACZ,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO,CAAC;AAAA,EACZ;AACJ;;;AFOW,gBAAAC,aAAA;AAhBX,IAAM,eAAsC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA,WAAW;AACf,MAAM;AACF,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAmB,CAAC,IAAI,CAAC;AAEnD,EAAAC,WAAU,MAAM;AACZ,YAAQ,IAAI,uBAAuB;AACnC,UAAM,iBAAiB,YAAY;AAC/B,YAAM,eAAe,MAAM,WAAW;AACtC,eAAS,YAAY;AAAA,IACzB;AACA,mBAAe;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,SAAO,gBAAAF;AAAA,IAAC,gBAAQ;AAAA,IAAR;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,MAAM,IAAI,WAAS;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,MACb,EAAE;AAAA,MACF,UAAU,CAAC,UAAU,SAAS,KAAe;AAAA,MAC7C;AAAA,MACA,YAAU;AAAA;AAAA,EACd;AACJ;AAEA,aAAa,cAAc;;;AGvC3B,SAAgB,aAAAG,YAAW,SAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAgP5C,gBAAAC,OAaJ,QAAAC,aAbI;AAhNT,SAAS,KAAK;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAChB,GAAc;AACV,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,QAAM,eAAe;AAAA,IACjB,MAAM,MAAM,OAAO,OAAK,CAAC,EAAE,QAAQ;AAAA,IACnC,CAAC,KAAK;AAAA,EACV;AAEA,QAAM,YACF,YACA,oBACC,aAAa,SAAS,aAAa,CAAC,EAAE,KAAK;AAEhD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC;AAAA,IAC5C;AAAA,EACJ;AACA,QAAM,kBAAkB,YAAY;AAGpC,EAAAC,WAAU,MAAM;AACZ,QACI,mBACA,CAAC,MAAM,KAAK,OAAK,EAAE,OAAO,mBAAmB,CAAC,EAAE,QAAQ,GAC1D;AACE,YAAM,OAAO,aAAa,CAAC,GAAG;AAC9B,UAAI,YAAY,KAAM,qBAAoB,IAAI;AAC9C,iBAAW,QAAQ,EAAE;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,OAAO,cAAc,iBAAiB,UAAU,QAAQ,CAAC;AAG7D,QAAM,CAAC,YAAY,aAAa,IAAID,UAAiB,MAAM;AACvD,UAAM,MAAM,MAAM,UAAU,OAAK,EAAE,OAAO,eAAe;AACzD,WAAO,KAAK,IAAI,GAAG,GAAG;AAAA,EAC1B,CAAC;AAED,EAAAC,WAAU,MAAM;AACZ,UAAM,MAAM,MAAM,UAAU,OAAK,EAAE,OAAO,eAAe;AACzD,QAAI,OAAO,EAAG,eAAc,GAAG;AAAA,EACnC,GAAG,CAAC,OAAO,eAAe,CAAC;AAE3B,QAAM,UAAUC,QAAqC,CAAC,CAAC;AACvD,QAAM,oBAAoBA,QAA8B,IAAI;AAE5D,QAAM,WAAW,CAAC,OAA2B;AACzC,QAAI,CAAC,GAAI;AACT,QAAI,YAAY,KAAM,qBAAoB,EAAE;AAC5C,eAAW,EAAE;AAAA,EACjB;AAEA,QAAM,YAAY,CAAC,QAAgB;AAC/B,QAAI,CAAC,MAAM,OAAQ;AACnB,QAAI,IAAI;AACR,aAAS,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ;AAC5C,WAAK,IAAI,MAAM,MAAM,UAAU,MAAM;AACrC,UAAI,CAAC,MAAM,CAAC,EAAE,SAAU;AAAA,IAC5B;AACA,kBAAc,CAAC;AACf,YAAQ,QAAQ,CAAC,GAAG,MAAM;AAAA,EAC9B;AAEA,QAAM,aAAa,MAAM;AACrB,UAAM,IAAI,MAAM,UAAU,OAAK,CAAC,EAAE,QAAQ;AAC1C,QAAI,KAAK,GAAG;AACR,oBAAc,CAAC;AACf,cAAQ,QAAQ,CAAC,GAAG,MAAM;AAAA,IAC9B;AAAA,EACJ;AACA,QAAM,YAAY,MAAM;AACpB,aAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAI,CAAC,MAAM,CAAC,EAAE,UAAU;AACpB,sBAAc,CAAC;AACf,gBAAQ,QAAQ,CAAC,GAAG,MAAM;AAC1B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,mBAAwC;AAAA,IAC1C,SAAS;AAAA,IACT,eAAe;AAAA,IACf,OAAO;AAAA,EACX;AACA,QAAM,cAAmC;AAAA,IACrC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,cAAc;AAAA,IACd,UAAU;AAAA,IACV,WAAW;AAAA,EACf;AACA,QAAM,aAAkC;AAAA,IACpC,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,YAAY;AAAA,EAChB;AACA,QAAM,mBAAwC;AAAA,IAC1C,YAAY,oBAAoB,MAAM,iBAAiB,EAAE;AAAA,IACzD,YAAY;AAAA,EAChB;AACA,QAAM,qBAA0C;AAAA,IAC5C,SAAS;AAAA,IACT,QAAQ;AAAA,EACZ;AACA,QAAM,eAAoC;AAAA,IACtC,SAAS;AAAA,EACb;AACA,QAAM,mBAAwC;AAAA,IAC1C,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EAChB;AAGA,QAAM,YAAY,MAAM,UAAU,OAAK,EAAE,OAAO,eAAe;AAC/D,QAAM,YAAY,QAAQ,QAAQ,SAAS;AAC3C,QAAM,CAAC,eAAe,gBAAgB,IAAIF,UAA0C,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzG,EAAAC,WAAU,MAAM;AACZ,QAAI,CAAC,aAAa,CAAC,UAAU,eAAe;AACxC,uBAAiB,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;AACtC;AAAA,IACJ;AACA,UAAM,aAAa,UAAU,cAAc,sBAAsB;AACjE,UAAM,OAAO,UAAU,sBAAsB;AAC7C,qBAAiB;AAAA,MACb,MAAM,KAAK,OAAO,WAAW;AAAA,MAC7B,OAAO,KAAK;AAAA,IAChB,CAAC;AAAA,EACL,GAAG,CAAC,WAAW,OAAO,eAAe,CAAC;AAGtC,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK;AAEhD,QAAM,gBAAgB,MAAM;AACxB,UAAM,KAAK,kBAAkB;AAC7B,QAAI,CAAC,GAAI;AACT,UAAM,gBAAgB,GAAG,cAAc,GAAG;AAC1C,iBAAa,aAAa;AAAA,EAC9B;AAEA,EAAAC,WAAU,MAAM;AACZ,UAAM,KAAK,kBAAkB;AAC7B,QAAI,CAAC,GAAI;AAET,kBAAc;AAEd,UAAM,KAAK,IAAI,eAAe,MAAM;AAChC,oBAAc;AAAA,IAClB,CAAC;AAED,OAAG,QAAQ,EAAE;AACb,WAAO,iBAAiB,UAAU,aAAa;AAE/C,WAAO,MAAM;AACT,SAAG,WAAW;AACd,aAAO,oBAAoB,UAAU,aAAa;AAAA,IACtD;AAAA,EACJ,GAAG,CAAC,OAAO,eAAe,CAAC;AAG3B,QAAM,YAAYC,QAA8C,CAAC,CAAC;AAElE,EAAAD,WAAU,MAAM;AACZ,QAAI,CAAC,gBAAiB;AACtB,UAAM,OAAO,UAAU,QAAQ,eAAe;AAC9C,QAAI,CAAC,KAAM;AAEX,UAAM,IAAI,KAAK;AACf,QAAI,IAAI,GAAG;AACP,4BAAsB,CAAC;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,iBAAiB,OAAO,mBAAmB,CAAC;AAEhD,SACI,gBAAAF,MAAC,SAAI,OAAO,EAAE,GAAG,kBAAkB,GAAG,eAAe,GAEjD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,UACH,cAAc,YAAY,IAAI;AAAA,UAC9B,SAAS,YAAY,UAAU;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU;AAAA,QACd;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,MAAM,IAAI,QAAM;AAAA,cACnB,OAAO,EAAE;AAAA,cACT,OAAO,EAAE;AAAA,cACT,SAAS,EAAE;AAAA,YACf,EAAE;AAAA,YACF,OAAO,MAAM,KAAK,OAAK,EAAE,OAAO,eAAe,GAAG,SAAS;AAAA,YAC3D,UAAU,CAAC,UAAU,SAAS,MAAM,SAAS,CAAC;AAAA,YAC9C,UAAU,mBAAmB;AAAA;AAAA,QACjC;AAAA;AAAA,IACJ;AAAA,IAGA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,OAAO;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,QAAQ,YAAY,IAAI;AAAA,UACxB,SAAS,YAAY,IAAI;AAAA,UACzB,eAAe,YAAY,SAAS;AAAA,UACpC,cAAc,YAAY,WAAY,WAAW,gBAAgB,YAAY;AAAA,UAC7E,WAAW;AAAA,QACf;AAAA,QAEC;AAAA,gBAAM,IAAI,CAAC,GAAG,MAAM;AACjB,kBAAM,WAAW,EAAE,OAAO;AAC1B,kBAAM,OAAO,EAAE,GAAG,YAAY,GAAG,SAAS;AAC1C,kBAAM,UAAU,WACV,EAAE,GAAG,kBAAkB,GAAG,eAAe,IACzC,CAAC;AACP,kBAAM,YAAY,EAAE,WACd,EAAE,GAAG,oBAAoB,GAAG,iBAAiB,IAC7C,CAAC;AAEP,mBACI,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBAEG,KAAK,QAAO,QAAQ,QAAQ,CAAC,IAAI;AAAA,gBACjC,MAAK;AAAA,gBACL,iBAAe;AAAA,gBACf,iBAAe,SAAS,EAAE,EAAE;AAAA,gBAC5B,IAAI,OAAO,EAAE,EAAE;AAAA,gBACf,UAAU,MAAM,aAAa,IAAI;AAAA,gBACjC,UAAU,EAAE;AAAA,gBACZ,SAAS,MAAM,CAAC,EAAE,YAAY,SAAS,EAAE,EAAE;AAAA,gBAC3C,WAAW,CAAC,MAAM;AACd,sBAAI,EAAE,QAAQ,cAAc;AAAE,sBAAE,eAAe;AAAG,8BAAU,CAAC;AAAA,kBAAG,WACvD,EAAE,QAAQ,aAAa;AAAE,sBAAE,eAAe;AAAG,8BAAU,EAAE;AAAA,kBAAG,WAC5D,EAAE,QAAQ,QAAQ;AAAE,sBAAE,eAAe;AAAG,+BAAW;AAAA,kBAAG,WACtD,EAAE,QAAQ,OAAO;AAAE,sBAAE,eAAe;AAAG,8BAAU;AAAA,kBAAG,WACpD,EAAE,QAAQ,OAAO,EAAE,QAAQ,SAAS;AACzC,sBAAE,eAAe;AACjB,qBAAC,EAAE,YAAY,SAAS,EAAE,EAAE;AAAA,kBAChC;AAAA,gBACJ;AAAA,gBACA,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU;AAAA,gBAE1C,YAAE;AAAA;AAAA,cArBE,EAAE;AAAA,YAsBX;AAAA,UAER,CAAC;AAAA,UAED,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,eAAW;AAAA,cACX,OAAO;AAAA,gBACH,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,OAAO,cAAc;AAAA,gBACrB,WAAW,cAAc,cAAc,IAAI;AAAA,cAC/C;AAAA;AAAA,UACJ;AAAA;AAAA;AAAA,IACJ;AAAA,IAGC,MAAM,IAAI,OAAK;AACZ,YAAM,WAAW,EAAE,OAAO;AAC1B,aACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEG,MAAK;AAAA,UACL,IAAI,SAAS,EAAE,EAAE;AAAA,UACjB,mBAAiB,OAAO,EAAE,EAAE;AAAA,UAC5B,QAAQ,CAAC;AAAA,UACT,OAAO;AAAA,YACH,GAAG;AAAA,YACH,GAAG;AAAA,YACH,SAAS,WAAW,UAAU;AAAA,UAClC;AAAA,UACA,KAAK,QAAM;AAAE,sBAAU,QAAQ,EAAE,EAAE,IAAI;AAAA,UAAI;AAAA,UAE1C,YAAE;AAAA;AAAA,QAZE,EAAE;AAAA,MAaX;AAAA,IAER,CAAC;AAAA,KACL;AAER;;;ACjVA,eAAsB,aAClB,SACA,SACA,MACsB;AACtB,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,GAAG,eAAe,qBAAqB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,SAAS,SAAS,KAAK,CAAC;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,sBAAsB;AAAA,IAC1C;AAEA,UAAM,EAAE,QAAQ,IAAI,MAAM,SAAS,KAAK;AAExC,YAAQ,IAAI,qBAAqB,OAAO;AAExC,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,wBAAwB,KAAK;AAC3C,WAAO;AAAA,EACX;AACJ;;;AC7BA;AAAA,EACE,cAAAK;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AA0MC,gBAAAC,OAkCA,QAAAC,cAlCA;AAjMR,SAAS,UAAU,OAAeC,QAAe;AAC/C,QAAM,KAAK,SAAS,IAAI,KAAK;AAE7B,QAAM,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,GAAG;AACL,WAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAKA,MAAK;AAAA,EACjD;AAEA,QAAM,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI;AAC7C,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKA,MAAK;AAAA,EACxC;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKA,MAAK;AAAA,EACxC;AAEA,SAAO,oBAAoBA,MAAK;AAClC;AAEA,IAAM,kBAAkBC;AAAA,EACtB,CAAC,EAAE,OAAO,aAAa,WAAW,SAAS,GAAG,iBAAiB;AAC7D,UAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,eAAe,CAAC;AAEjD,UAAM,MAAO,OAAe,QAAQ,QAAQ,QAAQ;AACpD,UAAM,QAAQ,QAAQ;AAEtB,UAAM,WAAWC,QAAuB,IAAI;AAC5C,UAAM,cAAcA,QAAuB,IAAI;AAC/C,UAAM,WAAWA,QAAuB,IAAI;AAG5C,oBAAgB,MAAM;AACpB,UAAI,CAAC,aAAc;AACnB,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,GAAI;AAET,UAAI,OAAO,iBAAiB,WAAY,cAAa,EAAE;AAAA,UAClD,cAAa,UAAU;AAAA,IAC9B,GAAG,CAAC,YAAY,CAAC;AAEjB,UAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AACpD,UAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC;AAEzD,UAAM,cAAcD,QAAO,KAAK;AAChC,UAAM,eAAeA,QAAO,EAAE,GAAG,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC;AAE/D,UAAM,SAASE,SAAQ,MAAM;AAC3B,YAAM,OAAO,MAAM,mBAAmB;AACtC,aAAO;AAAA,QACL,OAAO,UAAU,MAAM,GAAG;AAAA,QAC1B,OAAO,UAAU,MAAM,IAAI;AAAA,QAC3B,YAAY,UAAU,MAAM,IAAI;AAAA,QAChC,aAAa,UAAU,MAAM,IAAI;AAAA,MACnC;AAAA,IACF,GAAG,CAAC,MAAM,eAAe,CAAC;AAE1B,UAAM,SAAS,MAAM;AACnB,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,YAAM,UAAU,GAAG;AACnB,YAAM,UAAU,GAAG;AACnB,YAAM,SAAS,GAAG;AAElB,YAAM,WAAW,UAAU,UAAU;AACrC,qBAAe,QAAQ;AAEvB,UAAI,CAAC,UAAU;AACb,iBAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC;AAC/B;AAAA,MACF;AAEA,YAAM,WAAW;AACjB,YAAM,QAAQ,UAAU;AACxB,YAAM,SAAS,KAAK,IAAI,UAAU,KAAK,MAAM,SAAS,KAAK,CAAC;AAC5D,YAAM,cAAc,KAAK,IAAI,GAAG,SAAS,MAAM;AAC/C,YAAM,eAAe,KAAK,IAAI,GAAG,UAAU,OAAO;AAElD,YAAM,MAAO,GAAG,YAAY,eAAgB;AAC5C,eAAS,EAAE,KAAK,QAAQ,OAAO,CAAC;AAAA,IAClC;AAEA,oBAAgB,MAAM;AACpB,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,UAAI,MAAM;AACV,YAAM,WAAW,MAAM;AACrB,6BAAqB,GAAG;AACxB,cAAM,sBAAsB,MAAM;AAAA,MACpC;AAEA,eAAS;AAET,SAAG,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAEzD,YAAM,KAAK,IAAI,eAAe,QAAQ;AACtC,SAAG,QAAQ,EAAE;AACb,SAAG,QAAQ,EAAE;AAEb,aAAO,MAAM;AACX,6BAAqB,GAAG;AACxB,WAAG,oBAAoB,UAAU,QAAQ;AACzC,WAAG,WAAW;AAAA,MAChB;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAa;AAClB,UAAK,EAAE,QAAwB,SAAS,SAAS,QAAS;AAE1D,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,SAAS,EAAE,UAAU,KAAK;AAEhC,YAAM,cAAc,GAAG,eAAe,MAAM;AAC5C,YAAM,kBAAkB,KAAK;AAAA,QAC3B;AAAA,QACA,KAAK,IAAI,GAAG,SAAS,MAAM,SAAS,CAAC;AAAA,MACvC;AAEA,YAAM,eAAe,GAAG,eAAe,GAAG;AAC1C,SAAG,YAAa,kBAAkB,cAAe;AAAA,IACnD;AAEA,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAa;AAElB,kBAAY,UAAU;AACtB,MAAC,EAAE,cAA8B,kBAAkB,EAAE,SAAS;AAE9D,mBAAa,UAAU;AAAA,QACrB,GAAG,EAAE;AAAA,QACL,WAAW,YAAY,QAAS;AAAA,QAChC,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAY,QAAS;AAE1B,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,EAAE,UAAU,aAAa,QAAQ;AAE5C,YAAM,cAAc,GAAG,eAAe,MAAM;AAC5C,YAAM,eAAe,GAAG,eAAe,GAAG;AAE1C,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,QACA,KAAK,IAAI,GAAG,aAAa,QAAQ,WAAW,EAAE;AAAA,MAChD;AAEA,SAAG,YAAa,eAAe,cAAe;AAAA,IAChD;AAEA,UAAM,mBAAmB,CAAC,MAA0B;AAClD,kBAAY,UAAU;AACtB,UAAI;AACF,QAAC,EAAE,cAA8B,sBAAsB,EAAE,SAAS;AAAA,MACpE,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,WACE,gBAAAL;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UAEX,GAAI,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAAA,UACnC,GAAI,UAAU,QAAQ,OAAO,CAAC,IAAI,EAAE,MAAM,WAAW;AAAA,UACrD,WAAW;AAAA,UAEX,GAAG;AAAA,QACL;AAAA,QACA;AAAA,QAEA;AAAA,0BAAAD,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAgCN;AAAA,UAEF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV;AAAA,cACA,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQ;AAAA,gBACR,WAAW;AAAA,cACb;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,cAAc,QAAQ,SAAY;AAAA,sBAClC,aAAa,QAAQ,qBAAqB;AAAA,oBAC5C;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,eAAe;AAAA,oBACf,OAAO;AAAA,sBACL,SAAS,cAAc,UAAU;AAAA,sBACjC,YAAY,OAAO;AAAA,sBACnB,cAAc;AAAA,sBACd,OAAO,QAAQ,SAAY;AAAA,sBAC3B,MAAM,QAAQ,IAAI;AAAA,oBACpB;AAAA,oBAEA,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,aAAU;AAAA,wBACV,WAAU;AAAA,wBACV,eAAe;AAAA,wBACf,eAAe;AAAA,wBACf,aAAa;AAAA,wBACb,iBAAiB;AAAA,wBACjB,OAAO;AAAA,0BACL,KAAK,MAAM;AAAA,0BACX,QAAQ,MAAM;AAAA,0BACd,YAAY,OAAO;AAAA,wBACrB;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;;;AxB5M1B,gBAAAO,aAAA;AArEJ,IAAM,iBAAiBC,eAA8C,MAAS;AAEvE,IAAM,mBAAmB,MAAM;AACpC,QAAM,UAAUC,YAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB;AAAA,EACtB;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;AAOA,IAAM,UAAU,OAAO,OAAO,CAAC,EAAE,OAAO,SAAS,MAAoB;AACnE,QAAMC,eAAkC;AAAA,IACtC,iBAAiB,MAAM,qBAAqB,MAAM;AAAA,IAClD,QAAQ,MAAM,iBAAiB,MAAM;AAAA,IACrC,OAAO,MAAM,qBAAqB,MAAM;AAAA,IACxC,WAAW,MAAM,iBAAiB,MAAM;AAAA,IACxC,cAAc,MAAM,kBAAkB,MAAM;AAAA,IAC5C,UAAU,MAAM,oBAAoB,MAAM;AAAA,IAC1C,YAAY,MAAM;AAAA,EACpB;AAEA,QAAM,qBAA0C;AAAA,IAC9C,YAAY,MAAM,yBAAyB,MAAM;AAAA,IACjD,OAAO,MAAM,yBAAyB,MAAM;AAAA,IAC5C,SAAS;AAAA,IACT,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM,wBAAwB,MAAM;AAAA,EAChD;AAEA,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAwB,IAAI;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACZ,KAAC,YAAY;AACX,UAAI;AACF,cAAM,MAAM,MAAM,aAAa,MAAM,MAAM,GAAG,MAAM,UAAU,KAAK;AACnE,YAAI,MAAO,YAAW,OAAO,IAAI;AAAA,MACnC,QAAQ;AACN,YAAI,MAAO,YAAW,IAAI;AAAA,MAC5B;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC;AAE7B,SACE,gBAAAL;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA,aAAAG;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ,GAAG,eAAe;AAElB,IAAO,kBAAQ;;;AyB3Gf,SAAS,aAAAG,YAAW,UAAAC,SAAQ,YAAAC,kBAAgB;;;ACA5C;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,MACT,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC7RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,gBAAgB;AAAA,IACd,UAAY;AAAA,MACV,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,cAAgB;AAAA,MAChB,gBAAkB;AAAA,MAClB,gBAAkB;AAAA,MAClB,gBAAkB;AAAA,IACpB;AAAA,IACA,YAAc;AAAA,MACZ,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,UAAY;AAAA,MACZ,WAAa;AAAA,MACb,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,MACT,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC/SA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,gBAAgB;AAAA,IACd,UAAY;AAAA,MACV,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,cAAgB;AAAA,MAChB,gBAAkB;AAAA,MAClB,gBAAkB;AAAA,MAClB,gBAAkB;AAAA,IACpB;AAAA,IACA,YAAc;AAAA,MACZ,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,UAAY;AAAA,MACZ,WAAa;AAAA,MACb,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC9SA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC7RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC3RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE,mBAAqB;AAAA,IACnB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,IAAM;AAAA,IACN,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,QAAU;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,WAAa;AAAA,IACb,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAU;AAAA,EACZ;AAAA,EACA,oBAAsB;AAAA,IACpB,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,QAAU;AAAA,EACZ;AAAA,EACA,0BAA4B;AAAA,IAC1B,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,OAAS;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,IACP,WAAa;AAAA,IACb,aAAe;AAAA,IACf,WAAa;AAAA,IACb,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,MACX,SAAW;AAAA,QACT,MAAQ;AAAA,QACR,MAAQ;AAAA,QACR,QAAU;AAAA,QACV,kBAAoB;AAAA,QACpB,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,OAAS;AAAA,QACT,qBAAuB;AAAA,MACzB;AAAA,MACA,iBAAmB;AAAA,QACjB,aAAe;AAAA,QACf,iBAAmB;AAAA,QACnB,WAAa;AAAA,QACb,SAAW;AAAA,QACX,OAAS;AAAA,MACX;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,QACR,QAAU;AAAA,QACV,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,YAAc;AAAA,QACd,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,aAAe;AAAA,QACf,eAAiB;AAAA,QACjB,iBAAmB;AAAA,QACnB,QAAU;AAAA,QACV,OAAS;AAAA,QACT,SAAW;AAAA,QACX,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,SAAW;AAAA,IACX,YAAc;AAAA,EAChB;AAAA,EACA,UAAY;AAAA,IACV,mBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,YAAc;AAAA,MACZ,KAAO;AAAA,MACP,OAAS;AAAA,MACT,OAAS;AAAA,MACT,QAAU;AAAA,MACV,KAAO;AAAA,MACP,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,IACrB,aAAe;AAAA,IACf,wBAA0B;AAAA,IAC1B,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,aAAe;AAAA,IACf,aAAe;AAAA,MACb,iBAAmB;AAAA,MACnB,MAAQ;AAAA,MACR,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,OAAS;AAAA,MACT,SAAW;AAAA,MACX,aAAe;AAAA,MACf,aAAe;AAAA,MACf,iBAAmB;AAAA,MACnB,iBAAmB;AAAA,MACnB,WAAa;AAAA,MACb,YAAc;AAAA,MACd,SAAW;AAAA,MACX,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,OAAS;AAAA,MACT,QAAU;AAAA,MACV,gBAAkB;AAAA,MAClB,aAAe;AAAA,MACf,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACT,SAAW;AAAA,IACX,OAAS;AAAA,IACT,aAAe;AAAA,IACf,KAAO;AAAA,IACP,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,SAAW;AAAA,EACf;AAAA,EACA,WAAa;AAAA,IACX,OAAS;AAAA,IACT,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,SAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,QAAU;AAAA,MACR,UAAY;AAAA,MACZ,MAAQ;AAAA,MACR,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,wBAA0B;AAAA,IACxB,OAAS;AAAA,IACT,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,eAAiB;AAAA,IACjB,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AAAA,EACA,eAAiB;AAAA,IACf,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,IACV,KAAO;AAAA,IACP,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,WAAa;AAAA,EACf;AACF;;;AC5RA;AAAA,EACE;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,EACV;AACF;;;ACrsPA,IAAM,eAAuC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI;AAAA,EACJ;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;AAAA,EACA;AAAA,EACA;AACJ;AAEA,IAAO,uBAAQ;;;ACpDf,eAAsB,sBAAsB,MAAc,OAAe,KAAoE;AAC3I,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACF,UAAM,gBAAgB,KAAK,QAAQ,MAAM,GAAG,EAAE,YAAY;AAC1D,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,eAAe,OAAO,IAAI,CAAC;AAAA,IAC1D,CAAC;AACD,UAAM,WAAW,MAAM,SAAS,KAAK;AAErC,QAAI,CAAC,SAAS,MAAM,CAAC,UAAU,MAAM;AACnC,cAAQ,MAAM,cAAc,UAAU,SAAS,SAAS;AACxD,aAAO;AAAA,IACT;AAEA,WAAO,SAAS;AAAA,EAClB,SAAS,OAAO;AACd,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACT;AACF;;;AC1BA,SAAS,sBAAsB;AA0FtB,gBAAAC,aAAA;AADF,IAAM,cAAwB,MAAM;AACzC,SAAO,gBAAAC,MAAC,kBAAe,MAAM,IAAI,QAAO,WAAU,WAAU,gBAAe;AAC7E;;;AC1FO,SAAS,kBACZ,QACA,kBACmB;AACnB,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAA+B,CAAC;AAEtC,QAAM,eAAe,CAAC,GAAG,MAAM,EAAE;AAAA,IAC7B,CAAC,GAAG,MACA,IAAI,KAAK,EAAE,cAAc,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,cAAc,EAAE,QAAQ;AAAA,EAClF;AAEA,MAAI,gBAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,UAAMC,aAAY,IAAI,KAAK,aAAa,CAAC,EAAE,cAAc;AACzD,QAAIA,aAAY,KAAK;AACjB,sBAAgB;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,YAAY,aAAa,IAAI,CAAC,OAAO,SAAS;AAAA,IAChD,GAAG;AAAA,IACH,iBAAiB,QAAQ;AAAA,IACzB,gBAAgB,QAAQ,gBAAgB;AAAA,EAC5C,EAAE;AAEF,aAAW,SAAS,WAAW;AAC3B,UAAM,UAAU,IAAI,KAAK,MAAM,cAAc;AAG7C,UAAM,eAAe,qBAAqB,SAAS,gBAAgB;AAEnE,QAAI,CAAC,QAAQ,YAAY,GAAG;AACxB,cAAQ,YAAY,IAAI,CAAC;AAAA,IAC7B;AACA,YAAQ,YAAY,EAAE,KAAK,KAAK;AAAA,EACpC;AAEA,SAAO;AACX;AAEA,SAAS,qBAAqB,SAAe,UAA0B;AACnE,QAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,IAC3C;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT,CAAC,EAAE,cAAc,OAAO;AAExB,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,MAAM,GAAG;AAC9C,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,OAAO,GAAG;AAC/C,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,GAAG;AAE7C,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB;;;ACxDA,IAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAE7C,SAAS,oBAAoB,SAAiB,MAAsB;AACvE,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AACxD,QAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3D,SAAO,GAAG,KAAK,eAAe,CAAC,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAC5F;AAEO,SAAS,qBAAqB,MAAY,UAA0B;AACvE,QAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,IAC3C;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT,CAAC,EAAE,cAAc,IAAI;AAErB,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,GAAG;AACnD,QAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG;AACrD,QAAM,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,GAAG;AAEjD,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAClC;AAMO,SAAS,kBAAkB,WAAW,OAA+B;AACxE,QAAM,QAAQ,qBAAqB,oBAAI,KAAK,GAAG,QAAQ;AACvD,SAAO,EAAE,OAAO,OAAO,KAAK,MAAM;AACtC;AASO,SAAS,sBACZ,OACA,UAC8B;AAC9B,QAAM,cAAc,CAAC,MAAYC,cAAqB;AAClD,UAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,MAC3C,UAAAA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,IACf,CAAC,EAAE,cAAc,IAAI;AAErB,UAAM,QAAQ,CAAC,SACX,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,KAAK;AAC1D,UAAM,OAAO,MAAM,MAAM;AACzB,UAAM,YAAY,KAAK;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,MAAM,OAAO,IAAI;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK,IAAI;AAAA,MAClB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,IAClB;AAEA,WAAO,YAAY,KAAK,QAAQ;AAAA,EACpC;AAEA,QAAMC,SAAQ,CAAC,SAAiB,MAAc,QAAgBD,cAAqB;AAC/E,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAC/C,UAAM,aAAa,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,MAAM,MAAM;AACrD,UAAM,aAAa,IAAI,KAAK,UAAU;AACtC,QAAI,UAAU,IAAI,KAAK,aAAa,YAAY,YAAYA,SAAQ,CAAC;AACrE,UAAM,kBAAkB,YAAY,SAASA,SAAQ;AACrD,cAAU,IAAI,KAAK,aAAa,eAAe;AAE/C,WAAO,GAAG,QAAQ,eAAe,CAAC,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC,IAAI,IAAI,QAAQ,YAAY,CAAC,CAAC,IAAI,IAAI,QAAQ,cAAc,CAAC,CAAC;AAAA,EACnK;AAGA,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,QAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;AAErD,QAAM,aAAa,GAAG,QAAQ,eAAe,CAAC,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC;AAE7G,SAAO;AAAA,IACH,OAAOC,OAAM,MAAM,OAAO,GAAG,GAAG,QAAQ;AAAA;AAAA,IACxC,KAAKA,OAAM,YAAY,GAAG,GAAG,QAAQ;AAAA;AAAA,EACzC;AACJ;AAEO,IAAM,oBAAoB;AAAA,EAC7B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACJ;AAQO,SAAS,gBAAgB,MAAc,MAAoB;AAC9D,QAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,IAC3C,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,EAClB,CAAC,EAAE,cAAc,IAAI;AAErB,QAAM,aAAa,MAAM,KAAK,OAAK,EAAE,SAAS,cAAc;AAC5D,QAAMC,UAAS,YAAY,MAAM,QAAQ,OAAO,KAAK,KAAK;AAC1D,QAAM,aAAa,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,MAAM,GAAG,KAAK;AAEhE,SAAO,GAAG,UAAU,KAAKA,OAAM;AACnC;AAQO,SAAS,iBAAiB,MAAc,MAAoB;AAC/D,MAAI;AACA,WAAO,IAAI,KAAK,eAAe,SAAS;AAAA,MACpC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ,CAAC,EAAE,OAAO,IAAI;AAAA,EAClB,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAaO,IAAM,4BAA4B,CAAC,QAAgB,WAA2B;AACjF,MAAI,YAMO;AAGX,MAAI,IAAI;AACR,QAAM,QAAe,CAAC;AACtB,SAAO,IAAI,OAAO,QAAQ;AACtB,UAAM,OAAO,OAAO,CAAC,EAAE,YAAY;AACnC,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAC9C,UAAI,SAAS;AACb,aAAO,IAAI,SAAS,OAAO,UAAU,OAAO,IAAI,MAAM,MAAM,MAAM;AAC9D;AAAA,MACJ;AACA,YAAM,KAAK,EAAE,MAAM,MAAM,OAAO,CAAC;AACjC,WAAK;AAAA,IACT,OAAO;AACH;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACpB,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACzC;AAGA,MAAI,MAAM,WAAW,GAAG;AACpB,gBAAY;AAAA,MACR,OAAO,MAAM,CAAC;AAAA,MACd,MAAM,OAAO,MAAM,CAAC,EAAE,MAAM;AAAA,MAC5B,OAAO,MAAM,CAAC;AAAA,MACd,MAAM,OAAO,MAAM,CAAC,EAAE,SAAS,IAAI,MAAM,CAAC,EAAE,MAAM;AAAA,MAClD,OAAO,MAAM,CAAC;AAAA,IAClB;AAAA,EACJ,WAAW,MAAM,WAAW,GAAG;AAC3B,gBAAY;AAAA,MACR,OAAO,MAAM,CAAC;AAAA,MACd,MAAM,OAAO,MAAM,CAAC,EAAE,MAAM;AAAA,MAC5B,OAAO,MAAM,CAAC;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,IACX;AAAA,EACJ,WAAW,MAAM,WAAW,GAAG;AAC3B,gBAAY;AAAA,MACR,OAAO,MAAM,CAAC;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,IACX;AAAA,EACJ,OAAO;AACH,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,OAAO,IAAI,KAAK,MAAM;AAC5B,QAAM,MAAM,KAAK,WAAW;AAC5B,QAAM,QAAQ,KAAK,YAAY,IAAI;AACnC,QAAM,OAAO,KAAK,eAAe;AAEjC,QAAM,YAAY,CAAC,SAAoD;AACnE,QAAIC,OAAM;AACV,QAAI,KAAK,SAAS,KAAK;AACnB,MAAAA,OAAM,KAAK,WAAW,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG,IAAI,OAAO,GAAG;AAAA,IACvE,WAAW,KAAK,SAAS,KAAK;AAC1B,MAAAA,OAAM,KAAK,WAAW,IAAI,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,IAAI,OAAO,KAAK;AAAA,IAC3E,WAAW,KAAK,SAAS,KAAK;AAC1B,MAAAA,OAAM,KAAK,WAAW,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE,MAAM,EAAE;AAAA,IAClE;AACA,WAAOA;AAAA,EACX;AAEA,QAAM,WAAW,UAAU,UAAU,KAAK;AAC1C,QAAM,WAAW,UAAU,QAAQ,UAAU,UAAU,KAAK,IAAI;AAChE,QAAM,WAAW,UAAU,QAAQ,UAAU,UAAU,KAAK,IAAI;AAEhE,SAAO,GAAG,QAAQ,GAAG,UAAU,QAAQ,EAAE,GAAG,QAAQ,GAAG,UAAU,QAAQ,EAAE,GAAG,QAAQ;AAC1F;;;ACrQO,IAAM,oBAAoB,CAC7B,KACA,GACA,WAAW,UACwC;AACnD,QAAM,QAAQ,qBAAqB,oBAAI,KAAK,GAAG,QAAQ;AACvD,QAAM,YAAY,oBAAoB,OAAO,EAAE;AAC/C,QAAM,WAAW,oBAAoB,OAAO,CAAC;AAE7C,UAAQ,KAAK;AAAA,IACT,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,WAAW,KAAK,UAAU;AAAA,MAC9C;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,OAAO,KAAK,MAAM;AAAA,MACtC;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,UAAU,KAAK,SAAS;AAAA,MAC5C;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO;AAAA,UACH,OAAO,oBAAoB,OAAO,EAAE;AAAA,UACpC,KAAK;AAAA,QACT;AAAA,MACJ;AAAA,IACJ;AACI,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,OAAO,KAAK,MAAM;AAAA,MACtC;AAAA,EACR;AACJ;;;ACiCM,SAOE,OAAAC,OAPF,QAAAC,cAAA;AApEN,IAAM,iBAAiB;AAAA,EACrB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB,EAAE,MAAM,MAAM,MAAM,KAAK;AAC3B;AAEA,IAAM,eAAe,KAAK,oBAAoB,UAAU,KAAK;AAkBtD,IAAM,0BAA4D,CAAC;AAAA,EACxE;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,MAAM;AACJ,QAAM,gBAAgB;AAAA,IACpB,EAAE,OAAO,UAAU,SAAS,EAAE,OAAO;AAAA,IACrC,EAAE,OAAO,QAAQ,SAAS,EAAE,KAAK;AAAA,IACjC,EAAE,OAAO,UAAU,SAAS,EAAE,OAAO;AAAA,IACrC,EAAE,OAAO,OAAO,SAAS,EAAE,IAAI;AAAA,EACjC;AAEA,QAAM,kBAAkB,aAAa,IAAI,CAAC,UAAU;AAAA,IAClD,OAAO;AAAA,IACP,OAAO,gBAAgB,MAAM,GAAG;AAAA;AAAA,IAChC,SACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT;AAAA,QAEA;AAAA,0BAAAD,MAAC,UAAM,0BAAgB,MAAM,GAAG,GAAE;AAAA,UAClC,gBAAAA,MAAC,UAAK,OAAO,EAAE,SAAS,IAAI,GAAI,2BAAiB,MAAM,GAAG,GAAE;AAAA;AAAA;AAAA,IAC9D;AAAA,EAEJ,EAAE;AAEF,QAAM,wBAAwB,CAAC,WAAiC;AAC9D,yBAAqB,kBAAkB,QAAQ,GAAG,gBAAgB,EAAE,KAAK;AAAA,EAC3E;AAEA,QAAM,sBAAsB,MAAc;AACxC,QAAI,CAAC,kBAAkB,SAAS,CAAC,kBAAkB,KAAK;AACtD,aAAO;AAAA,IACT;AAEA,UAAM,iBACJ,CAAC,aAAa,SAAS,YAAY,MAAM,EACzC;AAAA,MACA,CAAC,QACC,kBAAkB,KAAK,GAAG,gBAAgB,EAAE,MAAM,UAChD,kBAAkB,SACpB,kBAAkB,KAAK,GAAG,gBAAgB,EAAE,MAAM,QAChD,kBAAkB;AAAA,IACxB;AAEA,WAAO,iBACH,kBAAkB,gBAAgB,GAAG,gBAAgB,EAAE,QACvD,EAAE;AAAA,EACR;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,MACP;AAAA,MAGA;AAAA,wBAAAD,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,EAAE,GACzC,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OACE,cAAc,KAAK,CAAC,QAAQ,IAAI,UAAU,MAAM,GAAG,WACnD;AAAA,YAEF,OAAO;AAAA,YACP,UAAU,CAAC,UAAU;AACnB,wBAAU,KAAsB;AAAA,YAClC;AAAA,YACA,UAAU;AAAA;AAAA,QACZ,GACF;AAAA,QAGA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,EAAE,GACzC,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO,EAAE;AAAA,YACT,OAAO,eAAe,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO;AAAA,cAC7C,SACE,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,kBACP;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK,2BAA2B,IAAI;AAAA,wBACpC,KAAK,GAAG,IAAI;AAAA,wBACZ,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAA,MAAC,UAAM,gBAAK;AAAA;AAAA;AAAA,cACd;AAAA,cAEF,OAAO;AAAA,YACT,EAAE;AAAA,YACF,UAAU,CAAC,UAAU;AACnB,oBAAM,OAAO;AACb;AAAA,gBAAqB,CAAC,SACpB,KAAK,SAAS,IAAI,IACd,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,IAC7B,CAAC,GAAG,MAAM,IAAI;AAAA,cACpB;AAAA,YACF;AAAA,YACA,UAAU;AAAA,YACV,UAAQ;AAAA;AAAA,QACV,GACF;AAAA,QAGC,UACC,gBAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO,oBAAoB,KAAK;AAAA,YAChC,OACE,CAAC,aAAa,SAAS,YAAY,MAAM,EACzC,IAAI,CAAC,SAAS;AAAA,cACd,SAAS,kBAAkB,KAAK,GAAG,gBAAgB,EAAE;AAAA,cACrD,OAAO;AAAA,YACT,EAAE;AAAA,YACF,UAAU,CAAC,UACT,sBAAsB,KAA6B;AAAA,YAErD,UAAU,oBAAoB;AAAA;AAAA,QAChC,IAEA,gBAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OACE,CAAC,aAAa,SAAS,YAAY,MAAM,EACzC,IAAI,CAAC,SAAS;AAAA,cACd,OAAO,kBAAkB,KAAK,GAAG,gBAAgB,EAAE;AAAA,cACnD,SAAS,MAAM,sBAAsB,GAA2B;AAAA,YAClE,EAAE;AAAA,YACF,UACE,kBAAkB,SAAS,kBAAkB,MACzC,oBAAoB,IACpB;AAAA;AAAA,QAER;AAAA,QAIF,gBAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,qBAAqB,KAAK;AAAA;AAAA,QACjD;AAAA,QAGA,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,GAC3B,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO,gBAAgB,kBAAkB,GAAG;AAAA,YAC5C,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,oBAAoB,KAAe;AAAA,YACxD,UAAU;AAAA,YACV,YAAU;AAAA;AAAA,QACZ,GACF;AAAA,QAGA,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,GAC3B,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,UAAU;AAAA,YACV,UAAU,CAAC,SAAS,gBAAgB,IAAI;AAAA;AAAA,QAC1C,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC9OA,OAAOE,UAAS,mBAAAC,kBAAiB,UAAAC,eAAc;AA6Gf,gBAAAC,OAoIJ,QAAAC,cApII;AA1EzB,SAAS,aAA+B,EAAE,SAAS,QAAQ,WAAW,GAAa;AACtF,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,QAAM,eAAeC,QAAuB,IAAI;AAChD,QAAM,WAAWA,QAAgC,IAAI;AAGrD,EAAAC,iBAAgB,MAAM;AAClB,UAAM,KAAK,aAAa;AACxB,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,GAAI;AAET,QAAI,cAAc,CAAC,OAAO;AACtB,SAAG,MAAM,YAAY,aAAa,KAAK;AACvC;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,GAAG,MAAM,YAAY,aAAa,GAAG,MAAM,sBAAsB,EAAE,MAAM,IAAI;AAClG,WAAO;AACP,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,KAAK;AAChB,WAAO,MAAM,GAAG,WAAW;AAAA,EAC/B,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,qBAA0C;AAAA,IAC5C,YAAY,MAAM,yBAAyB,MAAM;AAAA,IACjD,OAAO,MAAM,yBAAyB,MAAM;AAAA,IAC5C,SAAS;AAAA,IACT,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM,wBAAwB,MAAM;AAAA,EAClD;AAGA,QAAM,SAAS,MAAM,yBAAyB,MAAM;AACpD,QAAM,WAAW,MAAM,gBAAgB,oBAAoB,QAAQ,EAAE,IAAI;AAEzE,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AAGrB,QAAM,mBAA+B,OAAO,IAAI,CAAC,MAAM;AACnD,QAAK,EAAU,MAAO,QAAO;AAC7B,UAAM,SAAS;AACf,WAAO;AAAA,MACH,OAAO,OAAO;AAAA,MACd,OAAO,OAAO,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE;AAAA,IACrF;AAAA,EACJ,CAAC;AAED,SACI,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO;AAAA,QACH,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ,MAAM,gBAAgB,MAAM;AAAA,QACpC,WAAW,MAAM,gBAAgB,MAAM;AAAA,QACvC,cAAc,MAAM,iBAAiB,MAAM;AAAA,MAC/C;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,YACH,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,OAAO;AAAA,UACX;AAAA,UAEC;AAAA,aAAC,cACE,gBAAAD,MAAC,WAAM,KAAK,UACR,0BAAAA,MAAC,QACI,kBAAQ,IAAI,CAAC,KAAK,OACf,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,OAAM;AAAA,gBACN,OAAO;AAAA,kBACH,OAAO,IAAI,SAAS;AAAA,kBACpB,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,YAAY,mBAAmB;AAAA,kBAC/B,OAAO,mBAAmB;AAAA,kBAC1B,GAAI,UAAU,KAAK,IAAI,EAAE,YAAY,OAAO,IAAI;AAAA,gBACpD;AAAA,gBAEC,cAAI;AAAA;AAAA,cAbA,OAAO,IAAI,OAAO,IAAI,MAAM;AAAA,YAcrC,CACH,GACL,GACJ;AAAA,YAGJ,gBAAAA,MAAC,WACI,2BAAiB,IAAI,CAAC,GAAG,OAAO;AAC7B,oBAAM,cACF,gBAAAA,MAAC,QAAG,WAAU,gBACV,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,OAAM;AAAA,kBACN,SAAS,QAAQ;AAAA,kBACjB,OAAO;AAAA,oBACH,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,QAAQ;AAAA,oBACR,YAAY,mBAAmB;AAAA,oBAC/B,OAAO,mBAAmB;AAAA,oBAC1B,YAAY;AAAA,oBACZ,WAAW,UAAU;AAAA,kBACzB;AAAA,kBAEA,0BAAAA,MAAC,UAAK,OAAO;AAAA,oBACT,SAAS;AAAA,oBACT,WAAW;AAAA,oBACX,OAAO;AAAA,oBACP,SAAS;AAAA,kBACb,GACK,YAAE,OACP;AAAA;AAAA,cACJ,KAtB8B,KAAK,EAAE,EAuBzC;AAGJ,oBAAM,WAA8B,CAAC;AACrC,kBAAI,sBAAsB;AAE1B,gBAAE,MAAM,QAAQ,CAAC,MAAM,OAAO;AAC1B,qBAAK,KAAK,QAAQ,CAAC,GAAG,OAAO;AACzB,sBAAI,EAAE,SAAS,WAAW;AACtB,6BAAS;AAAA,sBACL,gBAAAA,MAAC,QAAoD,eAAY,QAC7D,0BAAAA,MAAC,QAAG,SAAS,QAAQ,QAAQ,OAAO,EAAE,SAAS,EAAE,GAC7C,0BAAAA;AAAA,wBAAC;AAAA;AAAA,0BACG,OAAO;AAAA,4BACH,QAAQ,EAAE,aAAa;AAAA,4BACvB,QAAQ,GAAG,EAAE,WAAW,CAAC;AAAA,4BACzB,OAAO;AAAA,4BACP,YAAY,EAAE;AAAA;AAAA,0BAClB;AAAA;AAAA,sBACJ,GACJ,KAVK,OAAO,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAWlD;AAAA,oBACJ;AAEA;AAAA,kBACJ;AAEA,wBAAM,YAAY,CAAC,CAAC,MAAM,iBAAiB,sBAAsB,MAAM;AACvE,wBAAM,KAAK,YAAY,WAAW;AAClC,wBAAM,eAAe,sBAAsB,IAAI,SAAS;AAExD,sBAAI,EAAE,SAAS,WAAW;AACtB,6BAAS;AAAA,sBACL,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEG,WAAW,KAAK;AAAA,0BAChB,OAAO,KAAK;AAAA,0BAEZ,0BAAAA;AAAA,4BAAC;AAAA;AAAA,8BACG,SAAS,EAAE,YAAY,SAAS,CAAC,EAAE,UAAU,QAAQ,SAAS,EAAE;AAAA,8BAChE,OAAO;AAAA,gCACH,SAAS;AAAA,gCACT,YAAY;AAAA,gCACZ,OAAO,MAAM,yBAAyB,MAAM;AAAA,gCAC5C,WAAW;AAAA,8BACf;AAAA,8BAEC,YAAE;AAAA;AAAA,0BACP;AAAA;AAAA,wBAdK,OAAO,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;AAAA,sBAe/C;AAAA,oBACJ;AAAA,kBACJ,OAAO;AACH,6BAAS;AAAA,sBACL,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEG,WAAW,KAAK;AAAA,0BAChB,OAAO,KAAK;AAAA,0BAEX,kBAAQ,IAAI,CAAC,KAAK,OAAO;AACtB,kCAAM,MAAM,IAAI,OAAO,OAAQ,EAAE,KAAa,IAAI,GAAG,IAAI;AACzD,kCAAM,UAAU,IAAI,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI;AAC9C,mCACI,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCAEG,OAAO;AAAA,kCACH,SAAS;AAAA,kCACT,YAAY;AAAA,kCACZ,OAAO,MAAM,yBAAyB,MAAM;AAAA,kCAC5C,WAAW;AAAA,kCACX,GAAI,UAAU,KAAK,IAAI,EAAE,YAAY,OAAO,IAAI;AAAA,gCACpD;AAAA,gCAEC;AAAA;AAAA,8BATI,OAAO,IAAI,OAAO,IAAI,MAAM;AAAA,4BAUrC;AAAA,0BAER,CAAC;AAAA;AAAA,wBArBI,OAAO,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;AAAA,sBAsB/C;AAAA,oBACJ;AAAA,kBACJ;AAEA;AAAA,gBACJ,CAAC;AAAA,cACL,CAAC;AAED,qBACI,gBAAAC,OAACG,OAAM,UAAN,EACI;AAAA;AAAA,gBACA;AAAA,mBAFgB,EAGrB;AAAA,YAER,CAAC,GACL;AAAA;AAAA;AAAA,MACJ;AAAA;AAAA,EACJ;AAER;;;AC1PA,YAAYC,cAAa;AACzB,SAAS,2BAA2B;;;ACF7B,SAAS,oBAAoB,OAAuB;AACvD,QAAM,aAAa,MAAM,WAAW,GAAG;AACvC,QAAM,gBAAgB,aAAa,MAAM,MAAM,CAAC,IAAI;AACpD,QAAM,WAAW,OAAO,cAAc,QAAQ,MAAM,EAAE,CAAC;AACvD,MAAI,MAAM,QAAQ,GAAG;AACjB,WAAO;AAAA,EACX;AACA,MAAI,YAAY;AACZ,WAAO,IAAI,oBAAoB,aAAa,CAAC;AAAA,EACjD;AAEA,MAAI,YAAY,KAAK;AACjB,WAAO,IAAI,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,EACzC,WAAW,YAAY,KAAK;AACxB,WAAO,IAAI,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,EACzC,WAAW,YAAY,KAAK;AACxB,WAAO,IAAI,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,EACzC;AACA,SAAO,MAAM,SAAS;AAC1B;;;ACXW,SAMH,OAAAC,OANG,QAAAC,cAAA;AALJ,IAAM,kBAIR,CAAC,EAAE,OAAO,QAAQ,iBAAiB,MAAM;AAC1C,SAAO,gBAAAA,OAAC,SAAI,OAAO;AAAA,IACf,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,KAAK;AAAA,EACT,GACI;AAAA,oBAAAD,MAAC,UAAK,OAAO;AAAA,MACT,YAAY,MAAM,iBAAiB,SAAS;AAAA,MAC5C,OAAO,MAAM,iBAAkB,OAAO,0BAA0B,qBAAsB;AAAA,MACtF,UAAU;AAAA,IACd,GACK,cAAI,KAAK,MAAM,cAAc,EAAE,mBAAmB,SAAS;AAAA,MACxD,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,IACd,CAAC,KAAK,KACV;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,2BAA2B,MAAM,iBAAiB,YAAY,CAAC;AAAA,QACpE,KAAK,GAAG,MAAM,gBAAgB;AAAA,QAC9B,OAAO;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,WAAW;AAAA,QACf;AAAA;AAAA,IACJ;AAAA,KACJ;AACJ;;;ACVW,gBAAAE,aAAA;AAvBJ,IAAM,cAIR,CAAC,EAAE,QAAQ,QAAQ,EAAE,MAAM;AAC5B,QAAM,aAAa,WAAW,SACxB,EAAE,OACF,WAAW,WACP,EAAE,SACF,EAAE;AAEZ,QAAM,gBAAgB,WAAW,SAC1B,OAAO,uBAAuB,YAC/B,WAAW,WACN,OAAO,sBAAsB,YAC7B,OAAO,sBAAsB;AAExC,QAAM,kBAAkB,WAAW,SAC5B,OAAO,wBAAwB,YAChC,WAAW,WACN,OAAO,uBAAuB,YAC9B,OAAO,uBAAuB;AAEzC,SAAO,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACJ,OAAO;AAAA,QACH,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc,OAAO;AAAA,QACrB,YAAY;AAAA,QACZ,OAAO;AAAA,MACX;AAAA,MACA,OAAO,oBAAoB,UAAU;AAAA,MAEpC;AAAA;AAAA,EACL;AACJ;;;AC5CO,SAAS,WAAW,MAAyC;AAChE,MAAI,CAAC,KAAM,QAAO;AAClB,UAAQ,KAAK,YAAY,GAAG;AAAA,IACxB,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO,IAAI,IAAI;AAAA,EACvB;AACJ;;;AJ2EQ,gBAAAC,OAUI,QAAAC,cAVJ;AA/CD,SAAS,2BAA2B,QAYjC;AACR,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW;AAAA,IACf,EAAE,KAAK,kBAAkB,QAAQ,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,IACxE,EAAE,KAAK,mBAAmB,QAAQ,EAAE,MAAM;AAAA,IAC1C,EAAE,KAAK,sBAAsB,QAAQ,EAAE,OAAO;AAAA,IAC9C,EAAE,KAAK,UAAU,QAAQ,EAAE,OAAO;AAAA,IAClC,EAAE,KAAK,aAAa,QAAQ,EAAE,SAAS;AAAA,IACvC,EAAE,KAAK,YAAY,QAAQ,EAAE,SAAS;AAAA,EACxC;AAEA,QAAM,YAAY;AAAA,IAChB,EAAE,KAAK,kBAAkB,QAAQ,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,IACxE,EAAE,KAAK,mBAAmB,QAAQ,EAAE,MAAM;AAAA,IAC1C,EAAE,KAAK,sBAAsB,QAAQ,EAAE,OAAO;AAAA,EAChD;AAEA,QAAM,UAAU,UAAU,YAAY;AAEtC,QAAM,SAAS,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM;AACjE,UAAM,QAAqB,CAAC;AAE5B,aAAS,MAAM,GAAG,MAAM,OAAO,QAAQ,OAAO;AAC5C,YAAM,QAAQ,OAAO,GAAG;AAExB,YAAM,eACJ,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAGF,YAAM,WACJ,gBAAAC,OAAS,eAAR,EACC;AAAA,wBAAAD,MAAS,kBAAR,EACC,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,YAAY,MAAM,iBAAiB,SAAS;AAAA,cAC5C,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,OAAO,OAAO,yBAAyB;AAAA,oBACvC,UAAU;AAAA,kBACZ;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,WAAW;AAAA,oBACX,cAAc;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBAEC,gBAAM;AAAA;AAAA,cACT;AAAA;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAA,MAAS,iBAAR,EACC,0BAAAA;AAAA,UAAS;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,cAAc,OAAO;AAAA,cACrB,WAAW,OAAO;AAAA,cAClB,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY,OAAO;AAAA,cACnB,OAAO,OAAO;AAAA,cACd,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YAEC,gBAAM,cAAc;AAAA;AAAA,QACvB,GACF;AAAA,SACF;AAGF,YAAM,aACJ,gBAAAA,MAAC,eAAY,QAAQ,MAAM,oBAAoB,QAAgB,GAAM;AAGvE,YAAM,OAAO,WAAW,MAAM,IAAI;AAClC,YAAM,SAAS,MAAM,SACjB,oBAAoB,MAAM,MAAM,IAAI,OACpC;AACJ,YAAM,WAAW,MAAM,YACnB,oBAAoB,MAAM,SAAS,IAAI,OACvC;AACJ,YAAM,WAAW,MAAM,WACnB,oBAAoB,MAAM,QAAQ,IAAI,OACtC;AAEJ,UAAI,CAAC,SAAS;AAEZ,cAAM,iBAAiB;AAAA,UACrB,GAAG;AAAA,UACH,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB;AAAA,UACA,WAAW;AAAA,UACX;AAAA,QACF;AAEA,cAAM,OAAkB;AAAA,UACtB,KACE,MAAM,MACN,GAAG,MAAM,eAAe,IAAI,MAAM,cAAc,IAAI,GAAG;AAAA,UACzD,MAAM,CAAC,EAAE,MAAM,SAAS,MAAM,eAAe,CAAC;AAAA,UAC9C,GAAI,eAAe,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,QAC3C;AACA,cAAM,KAAK,IAAI;AAAA,MACjB,OAAO;AAEL,cAAM,aAAa;AAAA,UACjB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB;AAEA,cAAM,mBACJ,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,SAAS;AAAA,cACT,qBAAqB;AAAA,cACrB,KAAK;AAAA,cACL,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,KAAK;AAAA,oBACL,YAAY;AAAA,kBACd;AAAA,kBAEA;AAAA,oCAAAD,MAAC,YAAO,OAAO,EAAE,SAAS,IAAI,GAAG,gBAAE;AAAA,oBACnC,gBAAAA,MAAC,YAAQ,kBAAO;AAAA;AAAA;AAAA,cAClB;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,KAAK;AAAA,oBACL,YAAY;AAAA,kBACd;AAAA,kBAEA;AAAA,oCAAAD,MAAC,YAAO,OAAO,EAAE,SAAS,IAAI,GAAG,gBAAE;AAAA,oBACnC,gBAAAA,MAAC,YAAQ,oBAAS;AAAA;AAAA;AAAA,cACpB;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,KAAK;AAAA,oBACL,YAAY;AAAA,kBACd;AAAA,kBAEA;AAAA,oCAAAD,MAAC,YAAO,OAAO,EAAE,SAAS,IAAI,GAAG,gBAAE;AAAA,oBACnC,gBAAAA,MAAC,YAAQ,oBAAS;AAAA;AAAA;AAAA,cACpB;AAAA;AAAA;AAAA,QACF;AAGF,cAAM,OAAkB;AAAA,UACtB,KACE,MAAM,MACN,GAAG,MAAM,eAAe,IAAI,MAAM,cAAc,IAAI,GAAG;AAAA,UACzD,MAAM;AAAA,YACJ,EAAE,MAAM,SAAS,MAAM,WAAW;AAAA,YAClC,EAAE,MAAM,WAAW,SAAS,kBAAkB,SAAS,MAAM;AAAA,UAC/D;AAAA,UACA,GAAI,eAAe,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,QAC3C;AACA,cAAM,KAAK,IAAI;AAAA,MACjB;AAGA,UAAI,MAAM,mBAAmB,MAAM,OAAO,SAAS,GAAG;AACpD,cAAM,KAAK;AAAA,UACT,KAAK,WAAW,IAAI,IAAI,GAAG;AAAA,UAC3B,MAAM;AAAA,YACJ;AAAA,cACE,MAAM;AAAA,cACN,IAAI,OAAO,0BAA0B;AAAA,cACrC,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,MAAM,MAAM;AAAA,EAC9B,CAAC;AAED,SAAO,EAAE,SAAS,OAAO;AAC3B;;;AlC/G4B,qBAAAE,WAAA,OAAAC,OAcxB,QAAAC,cAdwB;AAxI5B,IAAM,qBAAqB,CAAC,SAAiB;AAC3C,MAAI,SAAS,QAAS,QAAO;AAC7B,SAAO;AACT;AAYO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,cAAc,eAAe,IAAIA;AAAA,IACtC,mBAAmB,OAAO,IAAI;AAAA,EAChC;AACA,QAAM,CAAC,KAAK,MAAM,IAAIA,WAAS,oBAAI,KAAK,CAAC;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAIA;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAmB,CAAC,CAAC;AACvE,QAAM,CAAC,mBAAmB,oBAAoB,IAC5CA,WAAiC,kBAAkB,CAAC;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,KAAK;AAE9D,QAAM,CAAC,WAAW,YAAY,IAAIA,WAEhC,IAAI;AACN,QAAM,CAAC,aAAa,cAAc,IAAIA,WAA8B,CAAC,CAAC;AACtE,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwC,OAAO;AAE3E,EAAAC,WAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM;AACjC,aAAO,oBAAI,KAAK,CAAC;AAAA,IACnB,GAAG,GAAK;AAER,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,EAAAA,WAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,cACJ,qBAAa,aAAa,YAAY,CAAC,KAAK,qBAAa,IAAI;AAC/D,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,WAAW,CAAC;AAErC,QAAM,YAAY,YAAY;AAC5B,cAAU,SAAS;AAEnB,QAAI;AACF,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAEA,UAAI,CAAC,QAAQ;AACX,uBAAe,CAAC,CAAC;AACjB,kBAAU,OAAO;AACjB;AAAA,MACF;AAEA,mBAAa,MAAM;AAEnB,UAAI,iBAAiB;AACrB,UAAI,WAAW,UAAU;AACvB,yBAAiB,eAAe;AAAA,UAC9B,CAAC,UACC,MAAM,mBAAmB,YAAY,MAAM,OAAO,YAAY;AAAA,QAClE;AAAA,MACF;AACA,UAAI,kBAAkB,SAAS,GAAG;AAChC,yBAAiB,eAAe;AAAA,UAAO,CAAC,UACtC,kBAAkB,SAAS,MAAM,iBAAiB,YAAY,CAAC;AAAA,QACjE;AAAA,MACF;AAEA,YAAM,UAAU,kBAAkB,gBAAgB,gBAAgB;AAClE,qBAAe,OAAO;AACtB,gBAAU,OAAO;AAAA,IACnB,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,qBAAe,CAAC,CAAC;AACjB,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,EAAAA,WAAU,MAAM;AACd,cAAU;AAAA,EACZ,GAAG,CAAC,mBAAmB,kBAAkB,YAAY,CAAC;AAEtD,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,QAAI,iBAAiB;AACrB,QAAI,WAAW,UAAU;AACvB,uBAAiB,eAAe;AAAA,QAC9B,CAAC,UACC,MAAM,mBAAmB,YAAY,MAAM,OAAO,YAAY;AAAA,MAClE;AAAA,IACF;AACA,QAAI,kBAAkB,SAAS,GAAG;AAChC,uBAAiB,eAAe;AAAA,QAAO,CAAC,UACtC,kBAAkB,SAAS,MAAM,iBAAiB,YAAY,CAAC;AAAA,MACjE;AAAA,IACF;AACA,UAAM,UAAU,kBAAkB,gBAAgB,gBAAgB;AAClE,mBAAe,OAAO;AAAA,EACxB,GAAG,CAAC,QAAQ,iBAAiB,CAAC;AAE9B,MAAI,CAAC,aAAc,QAAO,gBAAAH,MAAAD,WAAA,EAAE;AAE5B,QAAM,IAAI,aAAa;AAEvB,QAAM,EAAE,SAAS,OAAO,IAAI,2BAA2B;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,gBAAAE,OAAAF,WAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAEC,WAAW,YACV,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QAEA,0BAAAA,MAAC,eAAY;AAAA;AAAA,IACf,IACE,eAAe,OAAO,QAAQ,WAAW,EAAE,SAAS,IACtD,gBAAAA,MAAC,gBAAa,SAAkB,QAAgB,YAAY,SAAS,IAErE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO,aAAa,OAAO,eAAe,IAAI,UAAU;AAAA,QAC1D;AAAA,QAEC,YAAE;AAAA;AAAA,IACL;AAAA,KAEJ;AAEJ;AAEe,SAAR,iBAAkC;AAAA,EACvC;AAAA,EACA,OAAO;AACT,GAAuC;AACrC,QAAM,eAAeI,QAAuB,IAAI;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIF,WAAkB,KAAK;AAErD,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,aAAa,SAAS;AACzB,cAAQ,MAAM,6BAA6B;AAC3C;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,eAAS,SAAS,SAAS;AACzB,YAAI,MAAM,aAAa;AACrB,qBAAW,MAAM,YAAY,QAAQ,GAAG;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AAED,aAAS,QAAQ,aAAa,OAAO;AAErC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,SACE,gBAAAH,MAAC,mBAAQ,OAAO,QACd,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,MACA,KAAK;AAAA,MAEL,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,oBAAmB,MACrD,0BAAAA,MAAC,uBAAoB,QAAgB,SAAkB,GACzD;AAAA;AAAA,EACF,GACF;AAEJ;;;AuCpQA,SAAS,aAAa,aAAAK,YAAW,UAAAC,SAAQ,YAAAC,kBAAgB;;;ACEzD,eAAsB,iBAClB,WACA,MACA,UAC4B;AAC5B,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,GAAG,eAAe,mCAAmC;AAAA,MAC9E,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,WAAW,MAAM,SAAS,CAAC;AAAA,IACtD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,2BAA2B,MAAM,OAAO,EAAE;AAAA,IAC9D;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAM,aAAa,KAAK;AASxB,UAAM,kBAAkB;AAExB,UAAM,YAA2C,CAAC;AAElD,UAAM,QAAQ;AAAA,MACV,gBAAgB,IAAI,OAAO,WAAW;AAClC,cAAM,gBAAgB,MAAM,MAAM,GAAG,eAAe,yCAAyC;AAAA,UACzF,QAAQ;AAAA,UACR,SAAS;AAAA,YACL,gBAAgB;AAAA,UACpB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,WAAW,OAAO,WAAW,CAAC;AAAA,QACzD,CAAC;AACD,YAAI,CAAC,cAAc,IAAI;AACnB,oBAAU,OAAO,UAAU,IAAI;AAC/B;AAAA,QACJ;AACA,cAAM,YAAY,MAAM,cAAc,KAAK;AAC3C,kBAAU,OAAO,UAAU,IAAI,UAAU;AAAA,MAC7C,CAAC;AAAA,IACL;AAEA,UAAM,UAAwB,gBACzB;AAAA,MAAO,CAAC,WACL,OAAO,cACP,UAAU,OAAO,UAAU,MAAM;AAAA,IACrC,EACC,IAAI,CAAC,WAAW;AACb,aAAO;AAAA,QACH,MAAM,IAAI,KAAK,OAAO,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,QACzD,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,QACpB,IAAI,WAAW,OAAO,EAAE,EAAE,QAAQ,CAAC;AAAA,QACnC,IAAI,WAAW,OAAO,EAAE,EAAE,QAAQ,CAAC;AAAA,QACnC,IAAI,WAAW,OAAO,EAAE,EAAE,QAAQ,CAAC;AAAA,QACnC,IAAI,WAAW,OAAO,EAAE,EAAE,QAAQ,CAAC;AAAA,QACnC,OAAO,UAAU,OAAO,UAAU;AAAA,QAClC,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACd;AAAA,IACJ,CAAC;AACL,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACX;AACJ;;;ACnFA,SAAa,YAAAC,kBAAgB;;;ACA7B,SAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AAoGpC,gBAAAC,OAqBA,QAAAC,cArBA;AAlFL,IAAM,SAKR,CAAC,EAAE,QAAQ,OAAO,cAAc,EAAE,MAAM;AAC3C,QAAM,CAAC,iCAAiC,kCAAkC,IACxEC,WAAiB,CAAC;AACpB,QAAM,gCAAgCC,QAAuB,IAAI;AAEjE,EAAAC,WAAU,MAAM;AACd,UAAM,KAAK,8BAA8B;AACzC,QAAI,CAAC,GAAI;AAET,UAAM,eAAe,MAAM;AACzB,yCAAmC,GAAG,WAAW;AAAA,IACnD;AAEA,UAAM,KAAK,IAAI,eAAe,MAAM;AAClC,mBAAa;AAAA,IACf,CAAC;AAED,OAAG,QAAQ,EAAE;AAGb,iBAAa;AAEb,WAAO,MAAM;AACX,SAAG,WAAW;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,YACJ,OAAO,IAAI,OAAO,IACd,cACA,OAAO,IAAI,OAAO,IAChB,cACA;AAER,SACE,gBAAAJ;AAAA,IAAC,gBAAQ;AAAA,IAAR;AAAA,MACC,aAAa;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,cAAc,MAAM;AAAA,MACtB;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,SAAS;AAAA,YACT,eAAe,eAAe,WAAW;AAAA,YACzC,YAAY;AAAA,YACZ,KAAK;AAAA,UACP;AAAA,UAGA;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,SAAS;AAAA,kBACT,eAAe,eAAe,QAAQ;AAAA,kBACtC,YAAY;AAAA,kBACZ,gBAAgB;AAAA,gBAClB;AAAA,gBAEA;AAAA,kCAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,eAAe;AAAA,wBACf,YAAY;AAAA,sBACd;AAAA,sBAEA;AAAA,wCAAAD;AAAA,0BAAC,gBAAQ;AAAA,0BAAR;AAAA,4BACC,aAAa;AAAA,8BACX,UAAU;AAAA;AAAA,8BACV,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,OAAO,MAAM;AAAA,4BACf;AAAA,4BAEC,iBAAO;AAAA;AAAA,wBACV;AAAA,wBACA,gBAAAA;AAAA,0BAAC,gBAAQ;AAAA,0BAAR;AAAA,4BACC,aAAa;AAAA,8BACX,UAAU;AAAA;AAAA,8BACV,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,OAAO,MAAM;AAAA,8BACb,YAAY;AAAA;AAAA,4BACd;AAAA,4BAEC,iBAAO;AAAA;AAAA,wBACV;AAAA,wBACA,gBAAAC;AAAA,0BAAC,gBAAQ;AAAA,0BAAR;AAAA,4BACC,aAAa;AAAA,8BACX,SAAS;AAAA,8BACT,UAAU;AAAA;AAAA,8BACV,OAAO;AAAA,8BACP,UAAU;AAAA;AAAA,4BACZ;AAAA,4BACD;AAAA;AAAA,8BACK,OAAO;AAAA,8BAAE;AAAA,8BAAM,OAAO;AAAA,8BAAE;AAAA,8BAAM,OAAO;AAAA,8BAAE;AAAA,8BAAM,OAAO;AAAA;AAAA;AAAA,wBAC1D;AAAA,wBACA,gBAAAA;AAAA,0BAAC,gBAAQ;AAAA,0BAAR;AAAA,4BACC,aAAa;AAAA,8BACX,SAAS;AAAA,8BACT,WAAW;AAAA;AAAA,8BACX,UAAU;AAAA;AAAA,8BACV,OAAO;AAAA,8BACP,WAAW;AAAA;AAAA,8BACX,UAAU;AAAA;AAAA,8BACV,YAAY;AAAA;AAAA,8BACZ,OAAO,MAAM;AAAA,4BACf;AAAA,4BAEA;AAAA,8CAAAD,MAAC,YAAQ,iBAAO,UAAS;AAAA,8BACzB,gBAAAA,MAAC,QAAG;AAAA,8BACH,OAAO;AAAA;AAAA;AAAA,wBACV;AAAA;AAAA;AAAA,kBACF;AAAA,kBAGA,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,eACE,kCAAkC,MAAM,WAAW;AAAA,wBACrD,OAAO;AAAA,wBACP,UAAU;AAAA,wBACV,gBAAgB;AAAA,wBAChB,YAAY;AAAA,wBACZ,KAAK;AAAA,wBACL,SAAS;AAAA,sBACX;AAAA,sBAEA;AAAA,wCAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,OAAO;AAAA,8BACP,SAAS;AAAA,8BACT,YAAY,MAAM;AAAA,8BAClB,cAAc;AAAA;AAAA,8BACd,SAAS;AAAA,8BACT,eAAe;AAAA,8BACf,YAAY;AAAA,8BACZ,WAAW;AAAA,8BACX,MAAM;AAAA,8BACN,KAAK;AAAA,4BACP;AAAA,4BAEA;AAAA,8CAAAD;AAAA,gCAAC,gBAAQ;AAAA,gCAAR;AAAA,kCACC,aAAa;AAAA,oCACX,UAAU;AAAA;AAAA,oCACV,OAAO,MAAM;AAAA,oCACb,UAAU;AAAA;AAAA,kCACZ;AAAA,kCAEC,aAAG,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA;AAAA,8BAC9B;AAAA,8BACA,gBAAAA;AAAA,gCAAC,gBAAQ;AAAA,gCAAR;AAAA,kCACC,aAAa;AAAA,oCACX,UAAU;AAAA;AAAA,oCACV,OAAO,MAAM;AAAA,oCACb,UAAU;AAAA;AAAA,kCACZ;AAAA,kCAEC,aAAG,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA;AAAA,8BAC9B;AAAA;AAAA;AAAA,wBACF;AAAA,wBACA,gBAAAC;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,OAAO;AAAA,8BACP,SAAS;AAAA,8BACT,YAAY,MAAM;AAAA,8BAClB,cAAc;AAAA;AAAA,8BACd,SAAS;AAAA,8BACT,eAAe;AAAA,8BACf,YAAY;AAAA,8BACZ,WAAW;AAAA,8BACX,MAAM;AAAA,8BACN,KAAK;AAAA,4BACP;AAAA,4BAEA;AAAA,8CAAAD;AAAA,gCAAC,gBAAQ;AAAA,gCAAR;AAAA,kCACC,aAAa;AAAA,oCACX,UAAU;AAAA;AAAA,oCACV,OAAO,MAAM;AAAA,oCACb,UAAU;AAAA;AAAA,kCACZ;AAAA,kCAEC,aAAG,EAAE,UAAU,MAAM,OAAO,EAAE;AAAA;AAAA,8BACjC;AAAA,8BACA,gBAAAA;AAAA,gCAAC,gBAAQ;AAAA,gCAAR;AAAA,kCACC,aAAa;AAAA,oCACX,UAAU;AAAA;AAAA,oCACV,OAAO,MAAM;AAAA,oCACb,UAAU;AAAA;AAAA,kCACZ;AAAA,kCAEC,aAAG,EAAE,UAAU,MAAM,OAAO,EAAE;AAAA;AAAA,8BACjC;AAAA;AAAA;AAAA,wBACF;AAAA;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA,YAGA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,UAAU,eAAe,IAAI;AAAA,gBAC/B;AAAA,gBAEA,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,OAAO;AAAA,oBACZ,KAAK,OAAO,UAAU;AAAA,oBACtB,OAAO;AAAA,sBACL,QAAQ;AAAA,sBACR,WAAW;AAAA;AAAA,sBACX,gBAAgB,eAAe,WAAW;AAAA,oBAC5C;AAAA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ADrOI,SASa,OAAAK,OATb,QAAAC,cAAA;AAfG,IAAM,oBAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,eAAe,gBAAgB,IAAIC;AAAA,IACxC,cAAc,CAAC,EAAE;AAAA,EACnB;AAEA,QAAM,SACJ,cAAc,KAAK,CAACC,YAAWA,QAAO,WAAW,aAAa,KAC9D,cAAc,CAAC;AAEjB,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,wBAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,GAC3B,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO,gBAAAA,MAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAAI,yBAAc;AAAA,YAC3D,OAAO,cAAc,IAAI,CAACG,aAAY;AAAA,cACpC,SAASA,QAAO;AAAA,cAChB,OAAOA,QAAO;AAAA,YAChB,EAAE;AAAA,YACF,UAAU,CAAC,UAAU;AACnB,+BAAiB,KAAe;AAAA,YAClC;AAAA,YACA,UAAU;AAAA;AAAA,QACZ,GACF;AAAA,QAEA,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AE5BQ,gBAAAI,aAAA;AAjBD,IAAM,aAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,MACP;AAAA,MAEC,wBAAc,IAAI,CAAC,QAAQ,QAC1B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAJK;AAAA,MAKP,CACD;AAAA;AAAA,EACH;AAEJ;;;ACrCO,IAAM,mBAAmB,CAC5B,cACA,SACA,YACC;AACD,MAAI,QAAS,QAAO;AACpB,SAAO,CAAC,CAAC,gBAAgB;AAC7B;;;ACDO,IAAM,mBAAmB,CAC5B,UACA,YACoB;AACpB,MAAI,QAAS,QAAO;AAAA,IAChB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,EACf;AACA,SAAO;AAAA,IACH;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,EACf;AACJ;;;ANuIQ,SAqBoB,YAAAC,WArBpB,OAAAC,OAyBJ,QAAAC,cAzBI;AAjGD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAA8B,IAAI;AAE5E,QAAM,eAAe,iBAAiB,OAAO,YAAY,SAAS,OAAO;AAEzE,QAAM,aAAa,iBAAiB,OAAO,aAAa,OAAO;AAE/D,EAAAC,WAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,KAAK,YAAY;AACtC,cAAM,cACJ,qBAAa,YAAY,KAAK,qBAAa,IAAI;AACjD,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,UAAU,EAAE;AAAA,QAC1C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,UAAU,CAAC;AAC5B,EAAAA,WAAU,MAAM;AACd,UAAM,YAAY,YAAY;AAC5B,iBAAW,IAAI;AACf,UAAI;AACF,YAAI,gBAAgB,OAAO;AAC3B,YAAI,gBAAgB,OAAO;AAE3B,YAAI,WAAW,UAAU;AACvB,cAAI,WAAW,WAAW;AACxB,4BAAgB,CAAC,GAAG,aAAa,EAAE,KAAK,MAAM,MAAM,KAAK,OAAO,CAAC;AACjE,4BAAgB,CAAC,GAAG,aAAa,EAAE,KAAK,MAAM,MAAM,KAAK,OAAO,CAAC;AAAA,UACnE;AACA,gBAAM,qBAAqB,KAAK;AAAA,YAC9B,KAAK,OAAO,KAAK,WAAW,WAAW;AAAA,UACzC;AACA,gBAAM,qBAAqB,WAAW,WAAW;AACjD,0BAAgB,cAAc,MAAM,GAAG,kBAAkB;AACzD,0BAAgB,cAAc,MAAM,GAAG,kBAAkB;AAAA,QAC3D;AAEA,cAAM,kBACJ,OAAO,MAAM,SAAS,IAClB,MAAM,iBAAiB,SAAS,MAAM,aAAa,IACnD,CAAC;AACP,YAAI,CAAC,MAAM,QAAQ,eAAe,GAAG;AACnC,gBAAM,IAAI,MAAM,4BAA4B;AAAA,QAC9C;AAEA,cAAM,kBACJ,OAAO,MAAM,SAAS,IAClB,MAAM,iBAAiB,SAAS,MAAM,aAAa,IACnD,CAAC;AAEP,YAAI,CAAC,MAAM,QAAQ,eAAe,GAAG;AACnC,gBAAM,IAAI,MAAM,4BAA4B;AAAA,QAC9C;AAEA,yBAAiB,CAAC,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAAA,MAC3D,SAAS,GAAG;AACV,gBAAQ,MAAM,gCAAgC,CAAC;AAC/C,yBAAiB,CAAC,CAAC;AAAA,MACrB,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,cAAU;AAAA,EACZ,GAAG,CAAC,OAAO,OAAO,OAAO,KAAK,CAAC;AAE/B,MAAI,SAAS;AACX,WACE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO;AAAA;AAAA,QACT;AAAA,QAEA,0BAAAA,MAAC,eAAY;AAAA;AAAA,IACf;AAAA,EAEJ;AAEA,MAAI,CAAC,iBAAiB,cAAc,WAAW,GAAG;AAChD,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO;AAAA;AAAA,QACT;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,MAAI,CAAC,aAAc,QAAO,gBAAAA,MAAAD,WAAA,EAAE;AAC5B,QAAM,IAAI,aAAa;AAEvB,SACE,gBAAAE,OAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GACzB;AAAA,KAAC,iBACC,cAAc,WAAW,KACxB,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO;AAAA,QACT;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IAGH,CAAC,WACA,iBACA,cAAc,SAAS,MACtB,WAAW,WACV,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,aAAa;AAAA,UACX,YAAY,OAAO,OAAO;AAAA,UAC1B,aAAa,OAAO,OAAO;AAAA,UAC3B,aAAa,OAAO,OAAO;AAAA,UAC3B,aAAa,OAAO,OAAO;AAAA,UAC3B,cAAc,OAAO,OAAO;AAAA,UAC5B,WAAW,OAAO,OAAO;AAAA,UACzB,sBAAsB,OAAO,OAAO;AAAA,UACpC,gBAAgB,OAAO,OAAO;AAAA,UAC9B,mBAAmB,OAAO,OAAO;AAAA,UACjC,aAAa,OAAO,OAAO;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,UACX,YAAY,OAAO,OAAO;AAAA,UAC1B,aAAa,OAAO,OAAO;AAAA,UAC3B,aAAa,OAAO,OAAO;AAAA,UAC3B,aAAa,OAAO,OAAO;AAAA,UAC3B,cAAc,OAAO,OAAO;AAAA,UAC5B,WAAW,OAAO,OAAO;AAAA,UACzB,sBAAsB,OAAO,OAAO;AAAA,UACpC,gBAAgB,OAAO,OAAO;AAAA,UAC9B,mBAAmB,OAAO,OAAO;AAAA,UACjC,aAAa,OAAO,OAAO;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KAEN;AAEJ;AAEe,SAAR,QAAyB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAiB;AACf,QAAM,CAAC,SAAS,UAAU,IAAIE,WAAS,KAAK;AAC5C,QAAM,cAAcE,QAA8B,IAAI;AAEtD,QAAM,eAAe,YAAY,CAAC,SAAgC;AAChE,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ,WAAW;AAC/B,kBAAY,UAAU;AAAA,IACxB;AAEA,QAAI,MAAM;AACR,kBAAY,UAAU,IAAI,eAAe,CAAC,YAAY;AACpD,cAAM,QAAQ,QAAQ,CAAC,GAAG,YAAY;AACtC,YAAI,UAAU,QAAW;AACvB,qBAAW,QAAQ,GAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAED,kBAAY,QAAQ,QAAQ,IAAI;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,WAAS,eAAe,QAItB;AACA,UAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,CAAC,OAAO,OAAO,KAAK,IAAI;AAC9B,WAAO,EAAE,OAAO,OAAO,MAAM;AAAA,EAC/B;AAEA,QAAM,gBAA+B;AAAA,IACnC,QAAQ;AAAA,MACN,YAAY,OAAO,sBAAsB,OAAO;AAAA,MAChD,WAAW,OAAO,sBAAsB,OAAO;AAAA,MAC/C,aAAa;AAAA,QACX,OAAO,kBAAkB,OAAO,eAAe;AAAA,MACjD,EAAE;AAAA,MACF,aAAa;AAAA,QACX,OAAO,kBAAkB,OAAO,eAAe;AAAA,MACjD,EAAE;AAAA,MACF,aAAa;AAAA,QACX,OAAO,kBAAkB,OAAO,eAAe;AAAA,MACjD,EAAE;AAAA,MACF,cAAc,OAAO,mBAAmB,OAAO;AAAA,MAC/C,mBAAmB,OAAO,8BAA8B;AAAA;AAAA,MACxD,aAAa,aAAa,OAAO,8BAA8B,SAAS;AAAA;AAAA,MACxE,sBAAsB,OAAO,8BAA8B;AAAA;AAAA,MAC3D,gBAAgB;AAAA,QACd,OAAO,8BAA8B;AAAA,MACvC;AAAA;AAAA,IACF;AAAA,IACA,YAAY,OAAO,uBAAuB;AAAA,IAC1C,aAAa,OAAO,wBAAwB;AAAA,IAC5C,YAAY,OAAO;AAAA,EACrB;AAEA,SACE,gBAAAJ,MAAC,mBAAQ,OAAO,QACd,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO,EAAE,QAAQ,QAAQ,OAAO,QAAQ,WAAW,OAAO;AAAA,MAE1D,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,WAAU,MAC5C,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,OAAO;AAAA,UACb,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF,GACF;AAAA;AAAA,EACF,GACF;AAEJ;;;AO1UA,SAAS,aAAAK,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACErC,SAASC,mBACZ,QACA,kBAC4B;AAC5B,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAAwC,CAAC;AAE/C,QAAM,eAAe,CAAC,GAAG,MAAM,EAAE;AAAA,IAC7B,CAAC,GAAG,MACA,IAAI,KAAK,EAAE,cAAc,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,cAAc,EAAE,QAAQ;AAAA,EAClF;AAEA,MAAI,gBAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,UAAMC,aAAY,IAAI,KAAK,aAAa,CAAC,EAAE,cAAc;AACzD,QAAIA,aAAY,KAAK;AACjB,sBAAgB;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,YAAY,aAAa,IAAI,CAAC,OAAO,SAAS;AAAA,IAChD,GAAG;AAAA,IACH,iBAAiB,QAAQ;AAAA,IACzB,gBAAgB,QAAQ,gBAAgB;AAAA,EAC5C,EAAE;AAEF,aAAW,SAAS,WAAW;AAC3B,UAAM,UAAU,IAAI,KAAK,MAAM,cAAc;AAG7C,UAAM,eAAeC,sBAAqB,SAAS,gBAAgB;AAEnE,QAAI,CAAC,QAAQ,YAAY,GAAG;AACxB,cAAQ,YAAY,IAAI,CAAC;AAAA,IAC7B;AACA,YAAQ,YAAY,EAAE,KAAK,KAAK;AAAA,EACpC;AAEA,SAAO;AACX;AAEA,SAASA,sBAAqB,SAAe,UAA0B;AACnE,QAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,IAC3C;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT,CAAC,EAAE,cAAc,OAAO;AAExB,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,MAAM,GAAG;AAC9C,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,OAAO,GAAG;AAC/C,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,GAAG;AAE7C,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB;;;AC1DA,OAAOC,UAAuB,WAAAC,UAAiB,YAAAC,kBAAgB;;;ACOxD,IAAMC,qBAAoB,CAC7B,KACA,GACA,WAAW,UACwC;AACnD,QAAM,QAAQ,qBAAqB,oBAAI,KAAK,GAAG,QAAQ;AACvD,QAAM,WAAU,oBAAI,KAAK,GAAG,KAAK,YAAY,GAAE,UAAU;AACzD,QAAM,YAAY,oBAAoB,OAAO,EAAE;AAC/C,QAAM,WAAW,oBAAoB,OAAO,CAAC;AAE7C,UAAQ,KAAK;AAAA,IACT,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,WAAW,KAAK,UAAU;AAAA,MAC9C;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,OAAO,KAAK,MAAM;AAAA,MACtC;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,OAAO,UAAU,KAAK,SAAS;AAAA,MAC5C;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO;AAAA,UACH,OAAO,oBAAoB,OAAO,GAAG,UAAU,KAAK,EAAE;AAAA,UACtD,KAAK,oBAAoB,QAAQ,IAAI,WAAW,CAAC;AAAA,QACrD;AAAA,MACJ;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO;AAAA,UACH,OAAO,oBAAoB,OAAO,GAAG,UAAU,KAAK,KAAK,CAAC;AAAA,UAC1D,KAAK,oBAAoB,OAAO,GAAG,UAAU,KAAK,KAAK,CAAC;AAAA,QAC5D;AAAA,MACJ;AAAA,IACJ,KAAK;AACD,YAAM,uBAAuB,IAAI,WAAW,KAAK;AACjD,aAAO;AAAA,QACH,OAAO,EAAE;AAAA,QACT,OAAO;AAAA,UACH,OAAO,oBAAoB,OAAO,mBAAmB;AAAA,UACrD,KAAK,oBAAoB,OAAO,sBAAsB,CAAC;AAAA,QAC3D;AAAA,MACJ;AAAA,EACR;AACJ;;;AC3DA,YAAYC,mBAAkB;AAC9B,SAAa,YAAAC,kBAAgB;AAC7B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;AAuGR,SAEI,OAAAC,OAFJ,QAAAC,cAAA;AAxEhB,IAAMC,YAA8B,CAAC,UAAU;AAC3C,QAAM,EAAE,OAAO,OAAO,UAAU,UAAU,WAAW,OAAO,aAAa,OAAO,kBAAkB,IAAI;AAEtG,QAAM,CAAC,cAAc,eAAe,IAAIC,WAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAiB,EAAE;AAEvD,MAAI,YAAY,CAAC,MAAM,QAAQ,QAAQ,GAAG;AACtC,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAGA,MAAI,YAAY;AACZ,eAAW,QAAQ,OAAO;AACtB,UAAI,CAAE,KAAwB,OAAO;AACjC,cAAM,IAAI,MAAM,0DAA0D;AAAA,MAC9E;AAAA,IACJ;AAAA,EACJ;AAEA,QAAMC,gBAAoC;AAAA,IACtC,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EACZ;AAEA,QAAMC,gBAAoC;AAAA,IACtC,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACZ;AAEA,QAAM,gBAAqC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,EAChB;AAEA,QAAM,aAAa,oBAAoB,WAAW,EAAE;AAEpD,QAAM,gBAAgB,aACf,MAA2B;AAAA,IAAO,UACjC,KAAK,MAAM,YAAY,EAAE,SAAS,WAAW,YAAY,CAAC;AAAA,EAC9D,IACE;AAEN,SACI,gBAAAJ,OAAc,oBAAb,EACG;AAAA,oBAAAD,MAAc,uBAAb,EAAqB,SAAO,MACzB,0BAAAC,OAAC,SAAI,OAAOG,eACP;AAAA;AAAA,MACD,gBAAAJ,MAACM,gBAAA,EAAc;AAAA,OACnB,GACJ;AAAA,IAEA,gBAAAN,MAAc,sBAAb,EACG,0BAAAC,OAAc,uBAAb,EAAqB,YAAY,GAAG,OAAOI,eACvC;AAAA,oBACG,gBAAAL;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,YACH,UAAU;AAAA,YACV,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,QAAQ;AAAA,UACZ;AAAA,UAEA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,aAAa,qBAAqB;AAAA,cAClC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,WAAW,CAAC,MAAM,EAAE,gBAAgB;AAAA,cACpC,OAAO;AAAA,gBACH,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,UAAU;AAAA,cACd;AAAA;AAAA,UACJ;AAAA;AAAA,MACJ;AAAA,MAGH,cAAc,IAAI,CAAC,MAAM,UAAU;AAChC,cAAM,aAAa,MAAM,QAAQ,QAAQ,IACnC,SAAS,SAAS,KAAK,KAAK,IAC5B,aAAa,KAAK;AAExB,cAAM,YAAY,iBAAiB;AAEnC,cAAM,YAAY;AAAA,UACd,GAAG;AAAA,UACH,iBAAiB,YAAY,aAAa;AAAA,QAC9C;AAEA,eACI,gBAAAC;AAAA,UAAc;AAAA,UAAb;AAAA,YAEG,UAAU,CAAC,MAAM;AACb,kBAAI,SAAU,GAAE,eAAe;AAC/B,uBAAS,KAAK,KAAK;AAAA,YACvB;AAAA,YACA,cAAc,MAAM,gBAAgB,KAAK;AAAA,YACzC,cAAc,MAAM,gBAAgB,IAAI;AAAA,YACxC,OAAO;AAAA,YAGH;AAAA,0BAAY,gBAAAD,MAAC,SAAI,OAAO;AAAA,gBACpB,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,cACpB,GACK,wBAAc,gBAAAA,MAACO,UAAA,EAAQ,GAC5B;AAAA,cAGH,KAAK;AAAA;AAAA;AAAA,UArBD,KAAK;AAAA,QAsBd;AAAA,MAER,CAAC;AAAA,OACL,GACJ;AAAA,KACJ;AAER;;;ACxLA,SAAa,aAAAC,YAAW,YAAAC,kBAAgB;AA0B7B,gBAAAC,aAAA;AAhBX,IAAMC,gBAAsC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA,WAAW;AACf,MAAM;AACF,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAmB,CAAC,IAAI,CAAC;AAEnD,EAAAC,WAAU,MAAM;AACZ,YAAQ,IAAI,uBAAuB;AACnC,UAAM,iBAAiB,YAAY;AAC/B,YAAM,eAAe,MAAM,WAAW;AACtC,eAAS,YAAY;AAAA,IACzB;AACA,mBAAe;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,SAAO,gBAAAH;AAAA,IAACI;AAAA,IAAA;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,MAAM,IAAI,WAAS;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,SAAS;AAAA,MACb,EAAE;AAAA,MACF,UAAU,CAAC,UAAU,SAAS,KAAe;AAAA,MAC7C;AAAA,MACA,YAAU;AAAA;AAAA,EACd;AACJ;;;ACpCA,SAAS,WAAAC,UAAS,gBAAgB,eAAe,sBAAsB;;;ACDvE,SAAa,aAAAC,aAAW,YAAAC,kBAAgB;AA4FhC,SASI,OAAAC,OATJ,QAAAC,cAAA;AA3ED,IAAM,WAAsB,CAAC,UAAU;AAC1C,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,CAAC,OAAO,QAAQ,IAAIF,WAAS,MAAM,SAAS,CAAC;AACnD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,MAAM,YAAY,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAwB,MAAM,SAAS,IAAI;AACnF,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAwB,IAAI;AAEhE,EAAAD,YAAU,MAAM;AACZ,QAAI,MAAM,OAAO;AACb,sBAAgB,MAAM,KAAK;AAC3B,YAAM,SAAS,IAAI,KAAK,MAAM,KAAK;AACnC,eAAS,OAAO,SAAS,CAAC;AAC1B,cAAQ,OAAO,YAAY,CAAC;AAAA,IAChC;AAAA,EACJ,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,EAAAA,YAAU,MAAM;AACZ,QAAI,QAAQ,cAAc;AACtB,YAAM,SAAS,IAAI,KAAK,YAAY;AACpC,eAAS,OAAO,SAAS,CAAC;AAC1B,cAAQ,OAAO,YAAY,CAAC;AAAA,IAChC;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa;AAAA,IACf;AAAA,IAAW;AAAA,IAAY;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAChD;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAa;AAAA,IAAW;AAAA,IAAY;AAAA,EAC1D;AAEA,QAAMI,eAAc,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ;AACzD,QAAM,WAAW,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO;AAEjD,QAAM,aAAa,CAAC,QAAgB;AAChC,QAAI,CAAC,aAAc,QAAO;AAC1B,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,aAAa,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,WAAO,MAAM,QAAQ,IAAI,MAAM,SAAS,MAAM;AAAA,EAClD;AAEA,QAAM,eAAe,CAAC,QAAgB;AAClC,UAAM,UAAU,GAAG,IAAI,IAAI,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC;AAC7F,oBAAgB,OAAO;AACvB,UAAM,WAAW,OAAO;AACxB,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,gBAAgB,MAAM;AACxB,QAAI,UAAU,GAAG;AACb,eAAS,EAAE;AACX,cAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,IACxB,OAAO;AACH,eAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACJ;AAEA,QAAM,gBAAgB,MAAM;AACxB,QAAI,UAAU,IAAI;AACd,eAAS,CAAC;AACV,cAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,IACxB,OAAO;AACH,eAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACJ;AAEA,SAAO,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACJ,OAAO;AAAA,QACH,SAAS;AAAA,QACT,YAAY,MAAM,cAAc;AAAA,QAChC,OAAO,MAAM,aAAa;AAAA,QAC1B,QAAQ,MAAM;AAAA,QACd,cAAc,MAAM;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,QAAQ;AAAA,MACZ;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,cACH,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,cAAc;AAAA,cACd,YAAY;AAAA,YAChB;AAAA,YAEA;AAAA,8BAAAD,MAAC,YAAO,SAAS,eAAe,OAAO,EAAE,QAAQ,UAAU,GAAG,eAAI;AAAA,cAClE,gBAAAA,MAAC,SAAK,aAAG,WAAW,KAAK,CAAC,IAAI,IAAI,IAAG;AAAA,cACrC,gBAAAA,MAAC,YAAO,SAAS,eAAe,OAAO,EAAE,QAAQ,UAAU,GAAG,eAAI;AAAA;AAAA;AAAA,QACtE;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,cACH,SAAS;AAAA,cACT,qBAAqB;AAAA,cACrB,WAAW;AAAA,cACX,UAAU;AAAA,cACV,cAAc;AAAA,cACd,YAAY;AAAA,YAChB;AAAA,YAEC,WAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC,MAC7C,gBAAAA,MAAC,SAAa,eAAJ,CAAM,CACnB;AAAA;AAAA,QACL;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,cACH,SAAS;AAAA,cACT,qBAAqB;AAAA,cACrB,WAAW;AAAA,cACX,UAAU;AAAA,cACV,KAAK;AAAA,YACT;AAAA,YAEC;AAAA,oBAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,gBAAAD,MAAC,WAAS,KAAK,CAAC,EAAI,CAAE;AAAA,cAE/D,MAAME,YAAW,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM;AACzC,sBAAM,MAAM,IAAI;AAChB,sBAAM,WAAW,WAAW,GAAG;AAC/B,sBAAM,UAAU,eAAe;AAE/B,uBACI,gBAAAF;AAAA,kBAAC;AAAA;AAAA,oBAEG,SAAS,MAAM,aAAa,GAAG;AAAA,oBAC/B,cAAc,MAAM,cAAc,GAAG;AAAA,oBACrC,cAAc,MAAM,cAAc,IAAI;AAAA,oBACtC,OAAO;AAAA,sBACH,YAAY,WACN,MAAM,sBAAsB,YAC5B,UACI,SACA;AAAA,sBACV,OAAO,WACD,MAAM,qBAAqB,UAC3B,MAAM,aAAa;AAAA,sBACzB,cAAc;AAAA,sBACd,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,QAAQ;AAAA,sBACR,YAAY;AAAA,oBAChB;AAAA,oBAEC;AAAA;AAAA,kBApBI;AAAA,gBAqBT;AAAA,cAER,CAAC;AAAA;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AACJ;;;ADlKA,SAAS,aAAAG,aAAW,YAAAC,kBAAgB;AAwF5B,SACI,OAAAC,OADJ,QAAAC,cAAA;AAnFR,SAAS,iBAAiB,SAA0B;AAChD,QAAM,cAAc,4BAA4B,KAAK,OAAO;AAC5D,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AACxD,QAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;AAC1C,SAAO,KAAK,YAAY,MAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM;AAC9F;AAEA,SAAS,aAAa,SAAyB;AAC3C,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,QAAQ,MAAM,GAAG;AAC5C,SAAO,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI;AAClC;AAEA,SAAS,gBAAgB,SAAyB;AAC9C,QAAM,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,MAAM,GAAG;AAC5C,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAClC;AAEA,IAAMC,mBAAkB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACJ,MAIM;AACF,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAS,KAAK;AACtC,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAiC,KAAK;AAC1E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAiC;AAAA,IAC3E,OAAO,aAAa,MAAM,KAAK;AAAA,IAC/B,KAAK,aAAa,MAAM,GAAG;AAAA,EAC/B,CAAC;AACD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAA2C,EAAE,OAAO,OAAO,KAAK,MAAM,CAAC;AAC3G,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAkB,KAAK;AAErD,EAAAC,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,eAAe,MAAM;AACvB,iBAAW,OAAO,aAAa,GAAG;AAAA,IACtC;AACA,WAAO,iBAAiB,UAAU,YAAY;AAC9C,iBAAa;AACb,WAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,EAClE,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACZ,kBAAc,KAAK;AACnB,uBAAmB;AAAA,MACf,OAAO,aAAa,MAAM,KAAK;AAAA,MAC/B,KAAK,aAAa,MAAM,GAAG;AAAA,IAC/B,CAAC;AAAA,EACL,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,oBAAoB,CAAC,MAAc,SAA0B;AAC/D,QAAI,CAAC,iBAAiB,IAAI,GAAG;AACzB,oBAAc,WAAS,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE;AAAA,IACrD,OAAO;AACH,oBAAc,WAAS,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE;AAClD,YAAM,MAAM,gBAAgB,IAAI;AAChC,oBAAc,WAAS,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE;AAAA,IACpD;AACA,uBAAmB,WAAS,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE;AAAA,EAC1D;AAEA,QAAM,uBAAuB,CAAC,MAAc,SAA0B;AAClE,UAAM,WAAmC;AAAA,MACrC,OAAO,SAAS,UAAU,OAAO,WAAW;AAAA,MAC5C,KAAK,SAAS,QAAQ,OAAO,WAAW;AAAA,IAC5C;AACA,kBAAc,QAAQ;AAEtB,UAAM,gBAAwC;AAAA,MAC1C,OAAO,SAAS,UAAU,aAAa,IAAI,IAAI,gBAAgB;AAAA,MAC/D,KAAK,SAAS,QAAQ,aAAa,IAAI,IAAI,gBAAgB;AAAA,IAC/D;AACA,uBAAmB,aAAa;AAAA,EACpC;AAIA,SAAO,gBAAAH,OAACI,UAAA,EAAQ,MAAY,cAAc,SACtC;AAAA,oBAAAJ,OAAC,kBAAe,OAAO,cACnB;AAAA,sBAAAD,MAAC,UAAK,OAAO,EAAE,UAAU,SAAS,GAAI,YAAE,aAAY;AAAA,MACpD,gBAAAA,MAAC,SAAI,OAAO,IAAI,QAAQ,IAAI,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAC9D,0BAAAA,MAAC,UAAK,GAAE,yxGAAwxG,MAAK,WAAU,GACnzG;AAAA,OACJ;AAAA,IACA,gBAAAA,MAAC,iBACG,0BAAAA,MAAC,kBAAe,OAAO,qBAEf,oBACI,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,QAAQ,SAAS,OAAO,GACjF;AAAA,sBAAAD,MAAC,QAAG,OAAO,YAAa,YAAE,iBAAgB;AAAA,MAC1C,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,SAAS,GAClE;AAAA,wBAAAD,MAAC,WAAM,OAAO,YAAa,YAAE,WAAU;AAAA,QACvC,gBAAAA,MAAC,oBAAiB,OAAO,WAAW,OAAO,UAAU,CAAC,SAAS,qBAAqB,MAAM,OAAO,GAAG;AAAA,SACxG;AAAA,MACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,SAAS,GAClE;AAAA,wBAAAD,MAAC,WAAM,OAAO,YAAa,YAAE,SAAQ;AAAA,QACrC,gBAAAA,MAAC,oBAAiB,OAAO,WAAW,KAAK,UAAU,CAAC,SAAS,qBAAqB,MAAM,KAAK,GAAG;AAAA,SACpG;AAAA,OACJ,IAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,UAAU,OAAO,GAC3B;AAAA,sBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,QAAQ,SAAS,OAAO,GAC1E;AAAA,wBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,QAAQ,SAAS,OAAO,GACjF;AAAA,0BAAAD,MAAC,QAAG,OAAO,YAAa,YAAE,iBAAgB;AAAA,UAC1C,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,SAAS,GAClE;AAAA,4BAAAD,MAAC,WAAM,OAAO,YAAa,YAAE,WAAU;AAAA,YACvC,gBAAAA,MAAC,WAAM,OAAO,YAAY,OAAO,gBAAgB,OAAO,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,OAAO,OAAO,GAAG;AAAA,YACrH,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,OAAO,UAAU,WAAW,YAAY,WAAW,QAAQ,YAAY,SAAS,GAAG,kDAAoC;AAAA,aACjJ;AAAA,UACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,SAAS,GAClE;AAAA,4BAAAD,MAAC,WAAM,OAAO,YAAa,YAAE,SAAQ;AAAA,YACrC,gBAAAA,MAAC,WAAM,OAAO,YAAY,OAAO,gBAAgB,KAAK,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,OAAO,KAAK,GAAG;AAAA,YACjH,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,OAAO,UAAU,WAAW,YAAY,WAAW,MAAM,YAAY,SAAS,GAAG,kDAAoC;AAAA,aAC/I;AAAA,WACJ;AAAA,QACA,gBAAAA,MAAC,YAAS,OAAO,WAAW,OAAO,UAAU,CAAC,SAAS,qBAAqB,MAAM,OAAO,GAAG;AAAA,QAC5F,gBAAAA,MAAC,YAAS,OAAO,WAAW,KAAK,UAAU,CAAC,SAAS,qBAAqB,MAAM,KAAK,GAAG;AAAA,SAC5F;AAAA,MACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,YAAY,SAAS,oBAAoB,GACpF,0BAAAA,MAAC,YAAO,OAAO,kBAAkB,SAAS,MAAM;AAC5C,mBAAW,UAAU;AACrB,gBAAQ,KAAK;AAAA,MACjB,GACK,YAAE,OACP,GACJ;AAAA,OACJ,GAGZ,GACJ;AAAA,KACJ;AACJ;AAIA,IAAM,eAAoC;AAAA,EACtC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AACZ;AAEA,IAAM,sBAA2C;AAAA,EAC7C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AACZ;AAEA,IAAM,aAAkC;AAAA,EACpC,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAChB;AAEA,IAAM,aAAkC;AAAA,EACpC,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAChB;AAEA,IAAM,aAAkC;AAAA,EACpC,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAClB;AAEA,IAAM,mBAAwC;AAAA,EAC1C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AACZ;;;AEvMA,SAAoB,aAAAM,aAAW,WAAAC,UAAiB,YAAAC,kBAAgB;AAgQ5D,qBAAAC,WAWQ,OAAAC,OATJ,QAAAC,cAFJ;AAjPJ,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,WAAW,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAEjE,SAAS,KAAK,GAAW;AACvB,SAAO,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC;AAChC;AAEA,SAAS,aAAa,GAAW,KAAc,KAAc;AAC3D,MAAI,OAAO,IAAI,IAAK,QAAO;AAC3B,MAAI,OAAO,IAAI,IAAK,QAAO;AAC3B,SAAO;AACT;AAEA,SAAS,WAAW,GAAW;AAC7B,SAAO,sBAAsB,KAAK,CAAC;AACrC;AAEA,SAAS,UAAU,KAAa;AAE9B,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,SAAO,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC;AAC7B;AAEA,SAAS,UAAU,GAAS;AAC1B,QAAM,IAAI,EAAE,YAAY;AACxB,QAAM,IAAI,KAAK,EAAE,SAAS,IAAI,CAAC;AAC/B,QAAM,MAAM,KAAK,EAAE,QAAQ,CAAC;AAC5B,SAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG;AACzB;AAEA,SAAS,SAAS,KAAa;AAC7B,QAAM,IAAI,UAAU,GAAG;AAEvB,SAAO,EAAE,mBAAmB,SAAS,EAAE,KAAK,WAAW,OAAO,QAAQ,CAAC;AACzE;AAEA,SAAS,aAAa,GAAS;AAC7B,SAAO,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,CAAC;AAClD;AAEA,SAAS,UAAU,GAAS,OAAe;AACzC,SAAO,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,OAAO,CAAC;AAC1D;AAEA,SAAS,YAAY,GAAS;AAC5B,SAAO,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,GAAG,CAAC,EAAE,QAAQ;AAChE;AAGA,SAAS,wBAAwB,MAAY;AAC3C,QAAM,KAAK,KAAK,OAAO;AACvB,UAAQ,KAAK,KAAK;AACpB;AAEA,SAAS,QAAQ,KAAa,KAAc,KAAc;AACxD,MAAI,OAAO,MAAM,IAAK,QAAO;AAC7B,MAAI,OAAO,MAAM,IAAK,QAAO;AAC7B,SAAO;AACT;AAEO,IAAM,aAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIH,WAAS,KAAK;AAEtC,QAAM,YAAYD,SAAQ,MAAM;AAC9B,QAAI,CAAC,WAAW,KAAK,EAAG,QAAO,UAAU,oBAAI,KAAK,CAAC;AACnD,WAAO,aAAa,OAAO,KAAK,GAAG;AAAA,EACrC,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC;AAGpB,QAAM,CAAC,aAAa,cAAc,IAAIC;AAAA,IAAe,MACnD,aAAa,UAAU,SAAS,CAAC;AAAA,EACnC;AAEA,EAAAF,YAAU,MAAM;AAEd,mBAAe,aAAa,UAAU,SAAS,CAAC,CAAC;AAAA,EACnD,GAAG,CAAC,SAAS,CAAC;AAGd,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,SAAU,SAAQ,KAAK;AAAA,IACvC;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,IAAI,CAAC;AAGT,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,SAAS,KAAK,MAAM;AACjC,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,OAAOC,SAAQ,MAAM;AACzB,UAAM,QAAQ,aAAa,WAAW;AACtC,UAAMK,UAAS,wBAAwB,KAAK;AAC5C,UAAM,MAAM,YAAY,WAAW;AAGnC,UAAM,QAA2D,CAAC;AAClE,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,SAAS,IAAIA,UAAS;AAC5B,UAAI,SAAS,KAAK,SAAS,KAAK;AAC9B,cAAM,KAAK,EAAE,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,MACrC,OAAO;AACL,cAAM,IAAI,IAAI,KAAK,MAAM,YAAY,GAAG,MAAM,SAAS,GAAG,MAAM;AAChE,cAAM,KAAK,EAAE,KAAK,UAAU,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,eAAe,SAAS,SAAS,SAAS;AAEhD,QAAM,aAAa,MAAM,QAAQ,IAAI;AACrC,QAAM,cAAc,MAAM,QAAQ,KAAK;AAEvC,QAAM,OAAO,CAAC,QAAgB;AAC5B,QAAI,CAAC,QAAQ,KAAK,KAAK,GAAG,EAAG;AAC7B,aAAS,GAAG;AACZ,QAAI,cAAe,aAAY;AAAA,EACjC;AAGA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAEA,QAAM,eAAoC;AAAA,IACxC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,EACX;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA;AAAA,IAGV,WAAW;AAAA,EACb;AAEA,QAAM,cAAmC;AAAA,IACvC,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,EAChB;AAEA,QAAMC,cAAkC;AAAA,IACtC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,gBAAqC;AAAA,IACzC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,cAAmC;AAAA,IACvC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAEA,QAAM,aAAkC;AAAA,IACtC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAEA,QAAM,OAAO,CAAC,MAAwB,EAAE,gBAAgB;AAExD,SACE,gBAAAF,OAAAF,WAAA,EACE;AAAA,oBAAAE,OAAC,YAAO,MAAK,UAAS,SAAS,YAAY,OAAO,YAChD;AAAA,sBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,GAE3D;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,QAAO;AAAA,YACP,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,eAAY;AAAA,YAEZ,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,eAAc;AAAA;AAAA,YAChB;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAAI,wBAAa;AAAA,SAChE;AAAA,MAGA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,eAAY;AAAA,UAEZ,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAEC,QACC,gBAAAA,MAAC,SAAI,OAAO,cAAc,SAAS,aAAa,MAAK,gBACnD,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAK;AAAA,QACL,cAAW;AAAA,QAEX;AAAA,0BAAAA,OAAC,SAAI,OAAO,aACV;AAAA,4BAAAD,MAAC,SAAI,OAAOG,aAAY,yBAAW;AAAA,YACnC,gBAAAH;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAS;AAAA,gBACT,OAAO;AAAA,gBACR;AAAA;AAAA,YAED;AAAA,aACF;AAAA,UAEA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,EAAE,SAAS,IAAI,WAAW,QAAQ,MAAM,GAAG,WAAW,EAAE;AAAA,cAG/D;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,cAAc;AAAA,oBAChB;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,SAAS,MAAM,eAAe,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAAA,0BACrD,cAAW;AAAA,0BACZ;AAAA;AAAA,sBAED;AAAA,sBAEA,gBAAAC;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,UAAU;AAAA,0BAExD;AAAA,mCAAO,YAAY,SAAS,CAAC;AAAA,4BAAE;AAAA,4BAAE,YAAY,YAAY;AAAA;AAAA;AAAA,sBAC5D;AAAA,sBAEA,gBAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,SAAS,MAAM,eAAe,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAAA,0BACpD,cAAW;AAAA,0BACZ;AAAA;AAAA,sBAED;AAAA;AAAA;AAAA,gBACF;AAAA,gBAGA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,qBAAqB;AAAA,sBACrB,KAAK;AAAA,sBACL,cAAc;AAAA,oBAChB;AAAA,oBAEC,mBAAS,IAAI,CAAC,MACb,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,WAAW;AAAA,wBACb;AAAA,wBAEC;AAAA;AAAA,sBAPI;AAAA,oBAQP,CACD;AAAA;AAAA,gBACH;AAAA,gBAGA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,qBAAqB;AAAA,sBACrB,KAAK;AAAA,oBACP;AAAA,oBAEC,eAAK,IAAI,CAAC,MAAM,QAAQ;AACvB,0BAAI,CAAC,KAAK,IAAK,QAAO,gBAAAA,MAAC,WAAS,GAAK;AAErC,4BAAM,WAAW,KAAK,QAAQ;AAC9B,4BAAM,UAAU,QAAQ,KAAK,KAAK,KAAK,GAAG;AAE1C,4BAAM,QAA6B;AAAA,wBACjC,GAAG;AAAA,wBACH,QAAQ,WACJ,sBACA;AAAA,wBACJ,YAAY,WAAW,YAAY;AAAA,wBACnC,SAAS,UAAU,IAAI;AAAA,wBACvB,QAAQ,UAAU,YAAY;AAAA,sBAChC;AAEA,6BACE,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,MAAK;AAAA,0BACL;AAAA,0BACA,UAAU,CAAC;AAAA,0BACX,SAAS,MAAM,KAAK,KAAK,GAAI;AAAA,0BAC7B,gBAAc;AAAA,0BAEb,eAAK;AAAA;AAAA,wBAPD,KAAK;AAAA,sBAQZ;AAAA,oBAEJ,CAAC;AAAA;AAAA,gBACH;AAAA,gBAGA,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,WAAW,GAAG,GACpD;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,KAAK,UAAU,oBAAI,KAAK,CAAC,CAAC;AAAA,sBACzC,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,UAAU;AAAA,sBACZ;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA,kBAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KAEJ;AAEJ;;;ANjRQ,SAshB6B,YAAAI,WArhB3B,OAAAC,OADF,QAAAC,cAAA;AAjKR,IAAMC,gBAAe,KAAK,oBAAoB,UAAU,KAAK;AA2B7D,IAAM,uBAA+C;AAAA,EACnD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,aAAa,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO;AAc/D,IAAM,eAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,IAAI;AAC3C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAG3C,EAAAC,OAAM,UAAU,MAAM;AACpB,QAAI,MAAM;AACR,iBAAW,IAAI;AACf,4BAAsB,MAAM,WAAW,IAAI,CAAC;AAAA,IAC9C,OAAO;AACL,iBAAW,KAAK;AAChB,YAAM,IAAI,OAAO,WAAW,MAAM,WAAW,KAAK,GAAG,GAAG;AACxD,aAAO,MAAM,OAAO,aAAa,CAAC;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAGT,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,CAAC,MAAqB;AACpC,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAAA,IAClC;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,MAAM,OAAO,CAAC;AAGlB,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,SAAS,KAAK,MAAM;AACjC,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,UAA+B;AAAA,IACnC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS,UAAU,IAAI;AAAA,IACvB,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAEA,QAAM,QAA6B;AAAA,IACjC,OAAO;AAAA;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,WAAW;AAAA,IACX,WAAW,UAAU,oBAAoB;AAAA,IACzC,SAAS,UAAU,IAAI;AAAA,IACvB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AAEA,QAAM,SAA8B;AAAA,IAClC,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,EAChB;AAEA,QAAMC,cAAkC;AAAA,IACtC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,WAAgC;AAAA,IACpC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,OAAO,CAAC,MAAwB,EAAE,gBAAgB;AAExD,SACE,gBAAAL,MAAC,SAAI,OAAO,SAAS,SAAS,SAAS,MAAK,gBAC1C,0BAAAC,OAAC,SAAI,OAAO,OAAO,SAAS,MAAM,MAAK,UAAS,cAAW,QACzD;AAAA,oBAAAA,OAAC,SAAI,OAAO,QACV;AAAA,sBAAAD,MAAC,SAAI,OAAOK,aAAa,iBAAM;AAAA,MAC/B,gBAAAL;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,SAAS;AAAA,UACT,OAAO;AAAA,UACR;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IACC;AAAA,KACH,GACF;AAEJ;AAIO,IAAMM,2BAA4D,CAAC;AAAA,EACxE,gBAAAC;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,oBAAoB;AAAA,EACpB,mBAAmB;AACrB,MAAM;AACJ,QAAM,gBAAgB;AAAA,IACpB,EAAE,OAAO,UAAU,SAAS,EAAE,OAAO;AAAA,IACrC,EAAE,OAAO,QAAQ,SAAS,EAAE,KAAK;AAAA,IACjC,EAAE,OAAO,UAAU,SAAS,EAAE,OAAO;AAAA,IACrC,EAAE,OAAO,OAAO,SAAS,EAAE,IAAI;AAAA,EACjC;AAEA,QAAM,kBAAkBL,cAAa,IAAI,CAAC,UAAU;AAAA,IAClD,OAAO;AAAA,IACP,OAAO,gBAAgB,MAAM,GAAG;AAAA,IAChC,SACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT;AAAA,QAEA;AAAA,0BAAAD,MAAC,UAAM,0BAAgB,MAAM,GAAG,GAAE;AAAA,UAClC,gBAAAA,MAAC,UAAK,OAAO,EAAE,SAAS,IAAI,GAAI,2BAAiB,MAAM,GAAG,GAAE;AAAA;AAAA;AAAA,IAC9D;AAAA,EAEJ,EAAE;AAGF,MAAI,CAAC,SAAS;AACZ,UAAM,wBAAwB,CAAC,WAAiC;AAC9D,2BAAqBQ,mBAAkB,QAAQ,GAAG,gBAAgB,EAAE,KAAK;AAAA,IAC3E;AAEA,UAAM,sBAAsB,MAAc;AACxC,YAAM,iBACJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EACA;AAAA,QACA,CAAC,QACCA,mBAAkB,KAAK,GAAG,gBAAgB,EAAE,MAAM,UAChD,kBAAkB,SACpBA,mBAAkB,KAAK,GAAG,gBAAgB,EAAE,MAAM,QAChD,kBAAkB;AAAA,MACxB;AAEA,aAAO,iBACHA,mBAAkB,gBAAgB,GAAG,gBAAgB,EAAE,QACvD,EAAE;AAAA,IACR;AAEA,WACE,gBAAAP;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU;AAAA,UACV,gBAAgB;AAAA,UAChB,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,OAAO,GAE1D;AAAA,aAAC,oBAAoB,gBAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,IAAI,GAC7C,0BAAAA;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,OACE,cAAc,KAAK,CAAC,QAAQ,IAAI,UAAU,MAAM,GAAG,WACnD;AAAA,gBAEF,OAAO;AAAA,gBACP,UAAU,CAAC,UAAU,UAAU,KAAsB;AAAA,gBACrD,UAAU;AAAA;AAAA,YACZ,GACF;AAAA,YAGC,CAAC,qBAAqB,gBAAAT,MAAC,SAAI,OAAO,EAAE,OAAO,IAAI,GAC9C,0BAAAA;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,OAAO,EAAE;AAAA,gBACT,OAAOF,gBAAe,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO;AAAA,kBAC7C,SACE,gBAAAN;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,KAAK;AAAA,sBACP;AAAA,sBAEA;AAAA,wCAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,KAAK,2BAA2B,IAAI;AAAA,4BACpC,KAAK,GAAG,IAAI;AAAA,4BACZ,OAAO;AAAA,8BACL,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,cAAc;AAAA,8BACd,WAAW;AAAA,4BACb;AAAA;AAAA,wBACF;AAAA,wBACA,gBAAAA,MAAC,UAAM,gBAAK;AAAA;AAAA;AAAA,kBACd;AAAA,kBAEF,OAAO;AAAA,gBACT,EAAE;AAAA,gBACF,UAAU,CAAC,UAAU;AACnB,wBAAM,OAAO;AACb;AAAA,oBAAqB,CAAC,SACpB,KAAK,SAAS,IAAI,IACd,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,IAC7B,CAAC,GAAG,MAAM,IAAI;AAAA,kBACpB;AAAA,gBACF;AAAA,gBACA,UAAU;AAAA,gBACV,UAAQ;AAAA;AAAA,YACV,GACF;AAAA,YAGA,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,IAAI,GACvB,0BAAAA;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,OAAO,oBAAoB,KAAK;AAAA,gBAChC,OACE;AAAA,kBACE;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF,EACA,IAAI,CAAC,SAAS;AAAA,kBACd,SAASD,mBAAkB,KAAK,GAAG,gBAAgB,EAAE;AAAA,kBACrD,OAAO;AAAA,gBACT,EAAE;AAAA,gBACF,UAAU,CAAC,UACT,sBAAsB,KAA6B;AAAA,gBAErD,UAAU,oBAAoB;AAAA;AAAA,YAChC,GACF;AAAA,YAGA,gBAAAR,MAAC,SAAI,OAAO,EAAE,UAAU,KAAK,OAAO,eAAe,QAAQ,GAAG,GAC5D,0BAAAA;AAAA,cAACU;AAAA,cAAA;AAAA,gBACC,GAAG,EAAE,UAAU;AAAA,gBACf,OAAO;AAAA,gBACP,UAAU,CAAC,SAAS,qBAAqB,IAAI;AAAA;AAAA,YAC/C,GACF;AAAA,aACF;AAAA,UAEA,gBAAAT,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,OAAO,GAE3D;AAAA,4BAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,GAC3B,0BAAAA;AAAA,cAACS;AAAA,cAAA;AAAA,gBACC,OAAO,gBAAgB,kBAAkB,GAAG;AAAA,gBAC5C,OAAO;AAAA,gBACP,UAAU,CAAC,UAAU,oBAAoB,KAAe;AAAA,gBACxD,UAAU;AAAA,gBACV,YAAU;AAAA;AAAA,YACZ,GACF;AAAA,YAGA,gBAAAT,MAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAC1B,0BAAAA;AAAA,cAACW;AAAA,cAAA;AAAA,gBACC,UAAU;AAAA,gBACV,UAAU,CAAC,SAAS,gBAAgB,IAAI;AAAA;AAAA,YAC1C,GACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAGA,QAAM,CAAC,MAAM,OAAO,IAAIR,WAAS,KAAK;AAGtC,QAAM,CAAC,aAAa,cAAc,IAAIA,WAA4B,MAAM;AACtE,QAAI,WAAW,UAAU,WAAW,YAAY,WAAW;AACzD,aAAO;AACT,WAAO;AAAA,EACT,CAAC;AACD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA;AAAA,IAC1C,MAAM;AAAA,EACR;AACA,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAiB,MAAM,YAAY;AACrE,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAClC,MAAM;AAAA,EACR;AAEA,QAAM,aAAa,MAAM;AACvB;AAAA,MACE,WAAW,UAAU,WAAW,YAAY,WAAW,QACnD,SACA;AAAA,IACN;AACA,sBAAkB,iBAAiB;AACnC,iBAAa,YAAY;AACzB,kBAAc,iBAAiB;AAC/B,YAAQ,IAAI;AAAA,EACd;AAEA,QAAM,QAAQ,MAAM;AAClB,cAAU,eAAe,QAAQ;AACjC,yBAAqB,cAAc;AACnC,oBAAgB,SAAS;AACzB,yBAAqB,UAAU;AAC/B,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,WAAW,MAAM;AACrB,mBAAe,IAAI;AACnB,sBAAkB,CAAC,CAAC;AACpB,iBAAa,IAAI;AACjB,kBAAcK,mBAAkB,SAAS,GAAG,gBAAgB,EAAE,KAAK;AAAA,EACrE;AAEA,QAAM,aAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmBI,SAAQ,MAAM;AACrC,UAAM,QAAQ,WAAW,KAAK,CAAC,MAAM;AACnC,YAAM,IAAIJ,mBAAkB,GAAG,GAAG,gBAAgB,EAAE;AACpD,aAAO,EAAE,UAAU,WAAW,SAAS,EAAE,QAAQ,WAAW;AAAA,IAC9D,CAAC;AACD,WAAO,SAAS;AAAA,EAClB,GAAG,CAAC,WAAW,OAAO,WAAW,KAAK,kBAAkB,CAAC,CAAC;AAE1D,QAAM,gBAAgBI,SAAQ,MAAM;AAClC,UAAM,QAAQL,gBACX,IAAI,CAAC,MAAM,EAAE,KAAK,YAAY,CAAC,EAC/B,OAAO,CAAC,SAAS,qBAAqB,IAAI,CAAC;AAE9C,UAAM,aAAqC,CAAC;AAC5C,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,qBAAqB,IAAI;AACrC,UAAI,CAAC,WAAW,GAAG,EAAG,YAAW,GAAG,IAAI;AAAA,IAC1C;AAEA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,QAAQ,UAAU;AACzC,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,KAAK,eAAe,QAAQ,EAAE,CAAC,CAAC;AACtC,YAAM,KAAK,eAAe,QAAQ,EAAE,CAAC,CAAC;AACtC,UAAI,OAAO,MAAM,OAAO,GAAI,QAAO,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;AAC1D,UAAI,OAAO,GAAI,QAAO;AACtB,UAAI,OAAO,GAAI,QAAO;AACtB,aAAO,KAAK;AAAA,IACd,CAAC;AAED,WAAO,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,OAAO,EAAE,UAAU,KAAK,EAAE;AAAA,EAC/D,GAAG,CAACA,eAAc,CAAC;AAEnB,QAAM,iBAAiB,CAAC,QAA8B;AACpD,kBAAcC,mBAAkB,KAAK,GAAG,gBAAgB,EAAE,KAAK;AAAA,EACjE;AAEA,QAAM,iBAAiB,CAAC,YAAoB;AAC1C,UAAM,IAAI,oBAAI,KAAK,UAAU,WAAW;AACxC,WAAO,EAAE,mBAAmB,SAAS,EAAE,KAAK,WAAW,OAAO,QAAQ,CAAC;AAAA,EACzE;AAEA,QAAM,eAAe,CAAC,MAAuB,UAAkB;AAC7D,QAAI,CAAC,MAAO;AACZ,kBAAc,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE;AAAA,EACtD;AAEA,QAAM,YAAY,CAAC,EAAE,KAAK,MAA4B;AACpD,UAAM,QACJ,SAAS,QAAQ,YAAY,SAAS,WAAW,YAAY;AAC/D,WACE,gBAAAR;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,eAAe,CAAC,EAAE,SAAS,MAC/B,gBAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,WAAW,cAAc,GAAG,GAC5D,UACH;AAGF,QAAM,UAAU,MACd,gBAAAA,MAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,YAAY,WAAW,QAAQ,SAAS,GAAG;AAGtE,QAAM,gBAAqC;AAAA,IACzC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,QAAM,aAAkC;AAAA,IACtC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,QAAMa,QAAO,CAAC;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKE,gBAAAb;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,cAAc;AAAA,QACd,QAAQ,WAAW,sBAAsB;AAAA,QACzC,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MAEC;AAAA;AAAA,EACH;AAIF,QAAM,eACH,WAAW,WAAW,IAAI,MAC1B,kBAAkB,SAAS,IAAI,IAAI,MACnC,iBAAiB,OAAO,IAAI,MAC5B,MAAM;AACL,UAAM,QAAQQ,mBAAkB,SAAS,GAAG,gBAAgB,EAAE;AAC9D,WAAO,kBAAkB,UAAU,MAAM,SACvC,kBAAkB,QAAQ,MAAM,MAC9B,IACA;AAAA,EACN,GAAG;AAEL,QAAM,gBAAgB,MACpB,gBAAAP;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB,GACF;AAAA,QAAM;AAAA,QAEL,cAAc,KACb,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAGF,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,KAAK;AAAA,MACP;AAAA,MAGA;AAAA,wBAAAD,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC,0BAAAA;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,OAAO,gBAAgB,kBAAkB,GAAG;AAAA,YAC5C,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,oBAAoB,KAAe;AAAA,YACxD,UAAU;AAAA,YACV,YAAU;AAAA;AAAA,QACZ,GACF;AAAA,QAGA,gBAAAT,MAAC,iBAAc;AAAA,QAGf,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,SAAS,MAAM,QAAQ,KAAK;AAAA,YAC5B,OAAM;AAAA,YAEN,0BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,eAAe;AAAA,kBACf,MAAM;AAAA,kBACN,WAAW;AAAA,gBACb;AAAA,gBAEA;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,QAAQ,SAAS,GAAG;AAAA,sBAG/D,0BAAAC;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,QAAQ,SAAS,GAAG;AAAA,0BAG/D;AAAA,4CAAAD,MAAC,gBAAa,oBAAM;AAAA,4BACpB,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,GACrD,WAAC,OAAO,UAAU,MAAM,EAAmB,IAAI,CAAC,MAChD,gBAAAC;AAAA,8BAACY;AAAA,8BAAA;AAAA,gCAEC,UAAU,gBAAgB;AAAA,gCAC1B,SAAS,MACP,eAAe,CAAC,SAAU,SAAS,IAAI,OAAO,CAAE;AAAA,gCAGlD;AAAA,kDAAAb,MAAC,aAAU,MAAM,GAAG;AAAA,kCACnB;AAAA;AAAA;AAAA,8BAPI;AAAA,4BAQP,CACD,GACH;AAAA,4BAEA,gBAAAA,MAAC,WAAQ;AAAA,4BAER,CAAC,qBAAqB,gBAAAC,OAAAF,WAAA,EAEvB;AAAA,8CAAAC,MAAC,gBAAa,+BAAiB;AAAA,8BAC/B,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,GACvD;AAAA,gDAAAD;AAAA,kCAACa;AAAA,kCAAA;AAAA,oCACC,UAAU,eAAe,WAAW;AAAA,oCACpC,SAAS,MAAM,kBAAkB,CAAC,CAAC;AAAA,oCACpC;AAAA;AAAA,gCAED;AAAA,gCAEC,cAAc,IAAI,CAAC,EAAE,UAAU,KAAK,MAAM;AACzC,wCAAM,WAAW,eAAe,SAAS,IAAI;AAC7C,yCACE,gBAAAb;AAAA,oCAACa;AAAA,oCAAA;AAAA,sCAEC;AAAA,sCACA,SAAS,MACP;AAAA,wCAAkB,CAAC,SACjB,KAAK,SAAS,IAAI,IACd,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,IAC7B,CAAC,GAAG,MAAM,IAAI;AAAA,sCACpB;AAAA,sCAGD;AAAA;AAAA,oCAVI;AAAA,kCAWP;AAAA,gCAEJ,CAAC;AAAA,iCACH;AAAA,8BAEA,gBAAAb,MAAC,WAAQ;AAAA,+BACT;AAAA,4BAGA,gBAAAA,MAAC,gBAAa,yBAAW;AAAA,4BACzB,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,GAErD;AAAA,8BACE;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,4BACF,EACA,IAAI,CAAC,MACL,gBAAAA;AAAA,8BAACa;AAAA,8BAAA;AAAA,gCAEC,UAAU,qBAAqB;AAAA,gCAC/B,SAAS,MAAM,eAAe,CAAC;AAAA,gCAE9B,UAAAL,mBAAkB,GAAG,GAAG,gBAAgB,EAAE;AAAA;AAAA,8BAJtC;AAAA,4BAKP,CACD,GACH;AAAA,4BAEA,gBAAAR,MAAC,WAAQ;AAAA,4BAGT,gBAAAA,MAAC,gBAAa,sBAAQ;AAAA,4BACtB,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,GACtD,qBAAW,IAAI,CAAC,QACf,gBAAAA;AAAA,8BAACa;AAAA,8BAAA;AAAA,gCAEC,UAAU,cAAc;AAAA,gCACxB,SAAS,MAAM,aAAa,GAAG;AAAA,gCAE9B;AAAA;AAAA,8BAJI;AAAA,4BAKP,CACD,GACH;AAAA,4BAEA,gBAAAb,MAAC,WAAQ;AAAA,4BAGT,gBAAAA,MAAC,gBAAa,0BAAY;AAAA,4BAC1B,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,GACrC;AAAA,8CAAAA,OAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,gDAAAD;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO,EAAE,UAAU,IAAI,OAAO,WAAW,cAAc,EAAE;AAAA,oCAC1D;AAAA;AAAA,gCAED;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO,WAAW;AAAA,oCAClB,UAAU,CAAC,MAAM,aAAa,SAAS,CAAC;AAAA;AAAA,gCAC1C;AAAA,iCACF;AAAA,8BAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,gDAAAD;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO,EAAE,UAAU,IAAI,OAAO,WAAW,cAAc,EAAE;AAAA,oCAC1D;AAAA;AAAA,gCAED;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO,WAAW;AAAA,oCAClB,UAAU,CAAC,MAAM,aAAa,OAAO,CAAC;AAAA;AAAA,gCACxC;AAAA,iCACF;AAAA,+BACF;AAAA;AAAA;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,WAAW;AAAA,wBACX,SAAS;AAAA,wBACT,SAAS;AAAA,wBACT,gBAAgB;AAAA,wBAChB,YAAY;AAAA,wBACZ,YAAY;AAAA,sBACd;AAAA,sBAEA;AAAA,wCAAAD,MAAC,YAAO,MAAK,UAAS,SAAS,UAAU,OAAO,eAAe,uBAE/D;AAAA,wBAEA,gBAAAA,MAAC,YAAO,MAAK,UAAS,SAAS,OAAO,OAAO,YAAY,mBAEzD;AAAA;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AO30BA,YAAYc,cAAa;AACzB,SAAS,uBAAAC,4BAA2B;;;ACqCzB,gBAAAC,aAAA;AAnCJ,IAAMC,eAgBR,CAAC,EAAE,QAAQ,QAAQ,EAAE,MAAM;AAC5B,QAAM,aAAa,WAAW,SACxB,EAAE,OACF,WAAW,WACP,EAAE,SACF,EAAE;AAEZ,QAAM,gBAAgB,WAAW,SAC1B,OAAO,GAAG,QAAQ,YACnB,WAAW,WACN,OAAO,GAAG,UAAU,YACpB,OAAO,GAAG,OAAO;AAE5B,QAAM,kBAAkB,WAAW,SAC5B,OAAO,KAAK,QAAQ,YACrB,WAAW,WACN,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,OAAO;AAE9B,SAAO,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACJ,OAAO;AAAA,QACH,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc,OAAO;AAAA,QACrB,YAAY;AAAA,QACZ,OAAO;AAAA,MACX;AAAA,MACA,OAAO,oBAAoB,UAAU;AAAA,MAEpC;AAAA;AAAA,EACL;AACJ;;;ACvDA,SAAS,WAAAE,UAAS,YAAAC,kBAAgB;AAClC;AAAA,EACE,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAC;AAAA,OACK;;;ACNP,SAAgB,aAAAC,aAAW,UAAAC,gBAAc;AAwG/B,SACE,OAAAC,OADF,QAAAC,cAAA;AA7FH,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AACb,GAAgB;AACd,QAAM,WAAWF,SAA8B,IAAI;AAEnD,EAAAD,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,CAAC,MAAqB;AACpC,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,eAAe;AACjB,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,EAAAA,YAAU,MAAM;AACd,QAAI,QAAQ,SAAS,QAAS,UAAS,QAAQ,MAAM;AAAA,EACvD,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,gBAAgB,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAEjE,QAAM,UAA+B;AAAA,IACnC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY,aAAa,UAAU,qBAAqB;AAAA,IACxD,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAEA,QAAM,QAA6B;AAAA,IACjC,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAEA,QAAM,SAA8B;AAAA,IAClC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,OAA4B;AAAA,IAChC,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAEA,QAAM,WAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,CAAC,MAAwC;AAC9D,QAAI,aAAa,QAAS;AAC1B,QAAI,EAAE,WAAW,EAAE,cAAe,WAAU;AAAA,EAC9C;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,aAAa;AAAA,MACzB,OAAO;AAAA,MACP,SAAS;AAAA,MAET,0BAAAC,OAAC,SAAI,KAAK,UAAU,UAAU,IAAI,OAAO,OACrC;AAAA,kBAAS,YACT,gBAAAA,OAAC,SAAI,OAAO,QACV;AAAA,0BAAAD,MAAC,SAAK,iBAAM;AAAA,UACX,WACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS;AAAA,cACT,OAAO;AAAA,cACR;AAAA;AAAA,UAED;AAAA,WAEJ;AAAA,QAEF,gBAAAA,MAAC,SAAI,OAAO,MAAO,UAAS;AAAA,SAC9B;AAAA;AAAA,EACF;AAEJ;;;ADhG2C,SAoDnC,YAAAE,WApDmC,OAAAC,OAYvC,QAAAC,cAZuC;AAjBpC,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAS,KAAK;AAEtC,QAAM,QAAQC;AAAA,IACZ,OAAO,eAAe,CAAC,GAAG,OAAO,OAAO;AAAA,IACxC,CAAC,WAAW;AAAA,EACd;AACA,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,gBAAAH,MAAC,SAAI;AAE9C,MAAI,CAAC,eAAe,YAAY,WAAW,KAAK,gBAAgB,QAAQ;AACtE,WAAO,gBAAAA,MAAC,SAAI;AAAA,EACd;AAEA,MAAI,MAAM,UAAU,EAAG,QAAO,gBAAAA,MAAC,UAAM,gBAAM,KAAK,IAAI,GAAE;AAEtD,QAAM,YAAY,MAAM,MAAM,GAAG,CAAC;AAClC,QAAM,YAAY,MAAM,MAAM,CAAC;AAE/B,QAAM,UACJ,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD,MAAC,UAAM,cAAI,WAAW,KAAI;AAAA,QAC1B,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP,GACF;AAAA;AAAA;AAAA,EACF;AAGF,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MAEC;AAAA,kBAAU,IAAI,CAAC,SACd,gBAAAD,MAAC,UAAgB,OAAO,EAAE,aAAa,SAAS,GAC7C,aAAG,IAAI,OADC,IAEX,CACD;AAAA,QAEA,UACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,UAAK,SAAS,MAAM,QAAQ,IAAI,GAAI,mBAAQ;AAAA,UAC7C,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,SAAS,MAAM,QAAQ,KAAK;AAAA,cAC5B,OAAM;AAAA,cACN,OAAO;AAAA,cAEP,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,OAAO,GAC9D,gBAAM,KAAK,IAAI,GAClB;AAAA;AAAA,UACF;AAAA,WACF,IAEA,gBAAAC,OAACG,UAAA,EACC;AAAA,0BAAAJ,MAACK,iBAAA,EAAe,SAAO,MAAE,mBAAQ;AAAA,UACjC,gBAAAL,MAACM,gBAAA,EACC,0BAAAN,MAACO,iBAAA,EAAe,OAAO,EAAE,QAAQ,KAAM,QAAQ,SAAS,GACtD,0BAAAP;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,cAAc;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,cAEC,oBAAU,KAAK,IAAI;AAAA;AAAA,UACtB,GACF,GACF;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AF7EI,SACE,OAAAQ,OADF,QAAAC,cAAA;AA3BJ,IAAM,uBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAS,mBAAmB,YAAoB;AAC9C,QAAM,IAAI,oBAAI,KAAK,GAAG,UAAU,WAAW;AAC3C,QAAM,UAAU,EACb,mBAAmB,SAAS,EAAE,SAAS,OAAO,CAAC,EAC/C,YAAY;AACf,QAAM,QAAQ,EAAE,mBAAmB,SAAS,EAAE,OAAO,QAAQ,CAAC,EAAE,YAAY;AAC5E,QAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAE/C,SACE,gBAAAA,OAAC,OACC;AAAA,oBAAAD,MAAC,YAAQ,mBAAQ;AAAA,IAAS;AAAA,IAAE;AAAA,IAC5B,gBAAAA,MAAC,UAAK,OAAO,EAAE,YAAY,KAAK,SAAS,SAAS,GAAI,iBAAM;AAAA,IAAQ;AAAA,IACpE,gBAAAA,MAAC,YAAQ,eAAI;AAAA,KACf;AAEJ;AAKA,IAAM,qBAAqB,CAAC,eAA+B;AACzD,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3D,QAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;AAC1C,QAAM,UAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AACA,SAAO,KAAK,mBAAmB,SAAS,OAAO;AACjD;AA0BO,SAASE,4BAA2B,QAYjC;AACR,QAAM,EAAE,aAAa,kBAAkB,KAAK,GAAG,SAAS,aAAa,IACnE;AAEF,QAAM,WAAW;AAAA,IACf,EAAE,KAAK,kBAAkB,QAAQ,EAAE,UAAU,QAAQ,KAAK,YAAY,EAAE;AAAA,IACxE,EAAE,KAAK,mBAAmB,QAAQ,EAAE,UAAU,QAAQ,KAAK,YAAY,EAAE;AAAA,IACzE,EAAE,KAAK,sBAAsB,QAAQ,EAAE,OAAO,YAAY,EAAE;AAAA,IAC5D;AAAA,MACE,KAAK;AAAA,MACL,QACE,gBAAAF,MAAC,UAAK,OAAO,EAAE,UAAU,SAAS,GAC/B,YAAE,UAAU,QAAQ,iBAAiB,YAAY,GACpD;AAAA,IAEJ;AAAA,IACA,EAAE,KAAK,UAAU,QAAQ,EAAE,UAAU,QAAQ,OAAO,YAAY,EAAE;AAAA,IAClE,EAAE,KAAK,aAAa,QAAQ,EAAE,UAAU,QAAQ,SAAS,YAAY,EAAE;AAAA,IACvE,EAAE,KAAK,YAAY,QAAQ,EAAE,UAAU,QAAQ,MAAM,YAAY,EAAE;AAAA,IACnE;AAAA,MACE,KAAK;AAAA,MACL,QACE,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,SAAS,GAC/B,YAAE,UAAU,QAAQ,oBAAoB,YAAY,GACvD;AAAA,IAEJ;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,EAAE,KAAK,kBAAkB,QAAQ,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,IACxE,EAAE,KAAK,mBAAmB,QAAQ,EAAE,MAAM;AAAA,IAC1C,EAAE,KAAK,sBAAsB,QAAQ,EAAE,OAAO;AAAA,EAChD;AAEA,QAAM,UAAU,UAAU,YAAY;AAEtC,QAAM,SAAS,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM;AACjE,UAAM,QAAqB,CAAC;AAE5B,aAAS,MAAM,GAAG,MAAM,OAAO,QAAQ,OAAO;AAC5C,YAAM,QAAQ,OAAO,GAAG;AAExB,YAAM,eACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,YAAY,MAAM,iBAAiB,SAAS;AAAA,YAC5C,OAAO,MAAM,iBAAiB,qBAAqB;AAAA,YACnD,UAAU;AAAA,UACZ;AAAA,UAEC,cAAI,KAAK,MAAM,cAAc,EAAE,mBAAmB,SAAS;AAAA,YAC1D,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,UAAU;AAAA,UACZ,CAAC,KAAK;AAAA;AAAA,MACR;AAGF,YAAM,WACJ,gBAAAC,OAAS,eAAR,EACC;AAAA,wBAAAD,MAAS,kBAAR,EACC,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,YAAY,MAAM,iBAAiB,SAAS;AAAA,cAC5C,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAACG;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,UAAU;AAAA,kBACZ;AAAA;AAAA,cACF;AAAA,cACA,gBAAAH;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,WAAW;AAAA,oBACX,cAAc;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBAEC,gBAAM;AAAA;AAAA,cACT;AAAA;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAA;AAAA,UAAS;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,WAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YAEC,gBAAM,cAAc;AAAA;AAAA,QACvB;AAAA,SACF;AAGF,YAAM,mBAAmB;AAAA,QACvB,IAAI;AAAA,UACF,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,KAAK;AAAA,QACP;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,KAAK;AAAA,QACP;AAAA,QACA,cAAc;AAAA,MAChB;AAEA,YAAM,aACJ,gBAAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,QAAQ,MAAM;AAAA,UACd,QAAQ;AAAA,UACR;AAAA;AAAA,MACF;AAGF,YAAM,uBACJ,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,2BAA2B,MAAM,iBAAiB,YAAY,CAAC;AAAA,gBACpE,KAAK,GAAG,MAAM,gBAAgB;AAAA,gBAC9B,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,WAAW;AAAA,kBACX,WAAW;AAAA,gBACb;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,OAAO;AAAA,gBACT;AAAA,gBAEC,+BACC,MAAM,iBAAiB,YAAY,CACrC,KAAK;AAAA;AAAA,YACP;AAAA;AAAA;AAAA,MACF;AAGF,YAAM,OAAO,WAAW,MAAM,IAAI;AAClC,YAAM,SAAS,MAAM,SACjB,oBAAoB,MAAM,MAAM,IAAI,OACpC;AACJ,YAAM,WAAW,MAAM,YACnB,oBAAoB,MAAM,SAAS,IAAI,OACvC;AACJ,YAAM,WAAW,MAAM,WACnB,oBAAoB,MAAM,QAAQ,IAAI,OACtC;AAEJ,YAAM,cACJ,OAAO,4BAA4B,UAC/B,MAAM,6BACN,MAAM;AAEZ,YAAM,0BACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,aAAa,EAAE,UAAU;AAAA,UACzB,aAAa,MAAM;AAAA,UACnB,SAAS;AAAA;AAAA,MACX;AAGF,UAAI,CAAC,SAAS;AAEZ,cAAM,iBAAiB;AAAA,UACrB,GAAG;AAAA,UACH,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,UACnB;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,sBAAsB;AAAA,QACxB;AAEA,cAAM,OAAkB;AAAA,UACtB,KAAK,GAAG,MAAM,eAAe,IAAI,MAAM,cAAc,IAAI,GAAG,IAC1D,MAAM,MAAM,EACd;AAAA,UACA,MAAM,CAAC,EAAE,MAAM,SAAS,MAAM,eAAe,CAAC;AAAA,UAC9C,GAAI,eAAe,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,QAC3C;AACA,cAAM,KAAK,IAAI;AAAA,MACjB,OAAO;AAGL,cAAM,WACJ,qBACE,MAAM,iBAAiB,YAAY,CACrC,KAAK;AAEP,cAAMK,eACJ,OAAO,4BAA4B,UAC/B,MAAM,6BACN,MAAM;AAEZ,cAAM,+BACJ,gBAAAL;AAAA,UAAC;AAAA;AAAA,YACC,aAAaK;AAAA,YACb,aAAa,MAAM;AAAA,YACnB,aAAa,EAAE,UAAU;AAAA,YACzB,SAAS;AAAA;AAAA,QACX;AAGF,cAAM,MACJ,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,SAAS;AAAA,cACT,KAAK;AAAA,cACL,cAAc;AAAA;AAAA,YAChB;AAAA,YAGA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,KAAK;AAAA,kBACP;AAAA,kBAEA;AAAA,oCAAAD,MAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAC1C,wBACH;AAAA,oBAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1D;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK,2BAA2B,MAAM,iBAAiB,YAAY,CAAC;AAAA,0BACpE,KAAK,GAAG,MAAM,gBAAgB;AAAA,0BAC9B,OAAO;AAAA,4BACL,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,WAAW;AAAA,4BACX,WAAW;AAAA,0BACb;AAAA;AAAA,sBACF;AAAA,sBACA,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,OAAO;AAAA,4BACP,YAAY;AAAA,0BACd;AAAA,0BAEC;AAAA;AAAA,sBACH;AAAA,uBACF;AAAA;AAAA;AAAA,cACF;AAAA,cAGA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,KAAK;AAAA,kBACP;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,OAAO;AAAA,0BACP,YAAY;AAAA,wBACd;AAAA,wBAEC,gBAAM;AAAA;AAAA,oBACT;AAAA,oBAEA,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,qBAAqB;AAAA,0BACrB,KAAK;AAAA,0BACL,YAAY;AAAA,0BACZ,UAAU;AAAA,wBACZ;AAAA,wBAEA;AAAA,0CAAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,8BAE1D;AAAA,gDAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,UAAU,GAAG,oBAAM;AAAA,gCACvC;AAAA;AAAA;AAAA,0BACH;AAAA,0BAEA,gBAAAC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,8BAE1D;AAAA,gDAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,UAAU,GAAG,oBAAM;AAAA,gCACxC,gBAAAA,MAAC,SAAI,OAAO,EAAE,YAAY,IAAI,GAAI,kBAAO;AAAA;AAAA;AAAA,0BAC3C;AAAA,0BAEA,gBAAAC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,8BAE1D;AAAA,gDAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,UAAU,GAAG,sBAAQ;AAAA,gCAC1C,gBAAAA,MAAC,SAAI,OAAO,EAAE,YAAY,IAAI,GAAI,oBAAS;AAAA;AAAA;AAAA,0BAC7C;AAAA,0BAEA,gBAAAC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,8BAE1D;AAAA,gDAAAD,MAAC,SAAI,OAAO,EAAE,OAAO,UAAU,GAAG,mBAAK;AAAA,gCACvC,gBAAAA,MAAC,SAAI,OAAO,EAAE,YAAY,IAAI,GAAI,oBAAS;AAAA;AAAA;AAAA,0BAC7C;AAAA;AAAA;AAAA,oBACF;AAAA,oBAEC,MAAM,uBAAuB,UAC5B,gBAAAC,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAC3C;AAAA,sCAAAD,MAAC,SAAI,OAAO,EAAE,cAAc,EAAE,GAAG,kCAAoB;AAAA,sBACrD,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,UAAU,GAC5B,wCACH;AAAA,uBACF;AAAA;AAAA;AAAA,cAEJ;AAAA;AAAA;AAAA,QACF;AAGF,cAAM,OAAkB;AAAA,UACtB,KAAK,GAAG,MAAM,eAAe,IAAI,MAAM,cAAc,IAAI,GAAG,IAC1D,MAAM,MAAM,EACd;AAAA,UACA,MAAM,CAAC,EAAE,MAAM,WAAW,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,UACxD,GAAI,eAAe,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,QAC3C;AACA,cAAM,KAAK,IAAI;AAAA,MACjB;AAGA,UAAI,MAAM,mBAAmB,MAAM,OAAO,SAAS,GAAG;AACpD,cAAM,KAAK;AAAA,UACT,KAAK,WAAW,IAAI,IAAI,GAAG;AAAA,UAC3B,MAAM;AAAA,YACJ;AAAA,cACE,MAAM;AAAA,cACN,IAAI;AAAA,cACJ,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,QAAQ,UAAU,mBAAmB,IAAI,IAAI,mBAAmB,IAAI;AAE1E,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB,CAAC;AAED,SAAO,EAAE,SAAS,OAAO;AAC3B;;;AIteA,eAAsB,2BAA2B,MAAc,OAAe,KAA6E;AACzJ,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACF,UAAM,gBAAgB,KAAK,QAAQ,MAAM,GAAG,EAAE,YAAY;AAC1D,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,eAAe,OAAO,IAAI,CAAC;AAAA,IAC1D,CAAC;AACD,UAAM,WAAW,MAAM,SAAS,KAAK;AAErC,QAAI,CAAC,SAAS,MAAM,CAAC,UAAU,MAAM;AACnC,cAAQ,MAAM,cAAc,UAAU,SAAS,SAAS;AACxD,aAAO;AAAA,IACT;AAEA,YAAQ,MAAM,SAAS,IAAI;AAE3B,WAAO,SAAS;AAAA,EAClB,SAAS,OAAO;AACd,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACT;AACF;;;AC5BA,OAAOM,aAAW;AA6FE,gBAAAC,aAAA;AAvEpB,SAAS,UAAU,IAAqB;AACpC,SAAO,KAAK,oCAAoC;AACpD;AAEe,SAAR,gBAEL;AAAA,EACE,QAAQ;AAAA,IACJ,EAAE,OAAO,YAAY,OAAO,UAAU;AAAA,IACtC,EAAE,OAAO,YAAY,OAAO,UAAU;AAAA,EAC1C;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA,YAAY;AAChB,GAAiC;AAC7B,QAAM,eAAe,UAAU;AAE/B,QAAM,CAAC,UAAU,WAAW,IAAIF,QAAM;AAAA,IACjC,iBACI,SAAU,MAAqC,CAAC,GAAG,UACpD;AAAA,EACR;AAEA,QAAM,UAA6B,eAAe,QAAQ;AAE1D,QAAM,WAAW,CAAC,MAAwB;AACtC,QAAI,CAAC,aAAc,aAAY,CAAC;AAChC,eAAW,CAAC;AAAA,EAChB;AAGA,QAAM,YAAY,CAAC,MAA2C;AAC1D,UAAMG,OAAO,SAAwC,CAAC;AACtD,UAAM,MAAMA,KAAI,UAAU,CAAC,MAAM,EAAE,UAAW,OAAkB;AAChE,QAAI,MAAM,EAAG;AACb,QAAI,EAAE,QAAQ,cAAc;AACxB,YAAM,OAAOA,MAAK,MAAM,KAAKA,KAAI,MAAM;AACvC,eAAS,KAAK,KAAyB;AACvC,QAAE,eAAe;AAAA,IACrB,WAAW,EAAE,QAAQ,aAAa;AAC9B,YAAM,OAAOA,MAAK,MAAM,IAAIA,KAAI,UAAUA,KAAI,MAAM;AACpD,eAAS,KAAK,KAAyB;AACvC,QAAE,eAAe;AAAA,IACrB;AAAA,EACJ;AAEA,QAAM,MAAO,SAAwC,CAAC;AAEtD,SACI,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,GAAG;AAAA,MACP;AAAA,MAEC,cAAI,IAAI,CAAC,SAAS;AACf,cAAM,SAAS,KAAK,UAAW;AAC/B,eACI,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEG,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,SAAS,KAAK,KAAyB;AAAA,YACtD,OAAO;AAAA,cACH,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YACI;AAAA,cACJ,OAAO,SAAS,YAAY;AAAA,cAC5B,YAAY,SACN,qDACA;AAAA,cACN,WAAW,UAAU,KAAK;AAAA,cAC1B,GAAGC;AAAA,YACP;AAAA,YACA,SAAS,CAAC,MAAM;AACZ,gBAAE,cAAc,MAAM,YAAY,UAAU,IAAI;AAAA,YACpD;AAAA,YACA,QAAQ,CAAC,MAAM;AACX,gBAAE,cAAc,MAAM,YAAY,UAAU,KAAK;AAAA,YACrD;AAAA,YAEC,eAAK;AAAA;AAAA,UAnCD,KAAK;AAAA,QAoCd;AAAA,MAER,CAAC;AAAA;AAAA,EACL;AAER;;;ACxIA,OAAOE,WAAoB,mBAAAC,kBAAiB,UAAAC,gBAAc;AAmKxC,gBAAAC,OAuHF,QAAAC,cAvHE;AAtHX,SAASC,cAA+B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAa;AACX,QAAM,YAAYH,SAAuB,IAAI;AAC7C,QAAM,WAAWA,SAAgC,IAAI;AAGrD,EAAAD,iBAAgB,MAAM;AACpB,QAAI,OAAO,mBAAmB,YAAa;AAE3C,UAAM,KAAK,UAAU;AACrB,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,GAAI;AAET,QAAI,cAAc,CAAC,OAAO;AACxB,SAAG,MAAM,YAAY,aAAa,KAAK;AACvC;AAAA,IACF;AAEA,UAAM,SAAS,MACb,GAAG,MAAM;AAAA,MACP;AAAA,MACA,GAAG,MAAM,sBAAsB,EAAE,MAAM;AAAA,IACzC;AAEF,WAAO;AACP,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,KAAK;AAChB,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,qBAA0C;AAAA,IAC9C,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA;AAAA,IACR,YAAY;AAAA;AAAA,IACZ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAEA,QAAM,SAAS;AAEf,QAAM,mBAAwC;AAAA,IAC5C,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,GAAI,0BAA0B,CAAC;AAAA,EACjC;AAGA,QAAM,mBAA+B,OAAO,IAAI,CAAC,MAAM;AACrD,QAAK,EAAU,MAAO,QAAO;AAC7B,UAAM,SAAS;AACf,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,OAAO,OAAO,KAAK,IAAI,CAAC,GAAG,OAAO;AAAA,QAChC,MAAM,CAAC,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;AAAA,QACjC,KAAK;AAAA,MACP,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,SAAS;AAEf;AAAA;AAAA,IAEE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,cAAc,aAAa,IAAI;AAAA,UAC/B,QAAQ,aAAa,SAAS;AAAA,UAC9B,WAAW,aAAa,SAAS;AAAA,UACjC,UAAU;AAAA;AAAA,QACZ;AAAA,QAGA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU;AAAA,cACV,yBAAyB;AAAA,cACzB,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,gBAAgB;AAAA,kBAChB,eAAe;AAAA,kBACf,OAAO;AAAA,kBACP,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA,mBAAC,cACA,gBAAAD,MAAC,WAAM,KAAK,UACV,0BAAAA,MAAC,QACE,kBAAQ,IAAI,CAAC,QACZ,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEC,OAAM;AAAA,sBACN,OAAO;AAAA,sBAEN,cAAI;AAAA;AAAA,oBAJA,OAAO,IAAI,OAAO,IAAI,MAAM;AAAA,kBAKnC,CACD,GACH,GACF;AAAA,kBAGF,gBAAAA,MAAC,WACE,2BAAiB,IAAI,CAAC,GAAG,OAAO;AAC/B,0BAAM,cACJ,gBAAAA,MAAC,QAAG,WAAU,gBACZ,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAM;AAAA,wBACN,SAAS,QAAQ;AAAA,wBACjB,OAAO;AAAA,wBAEN,YAAE;AAAA;AAAA,oBACL,KAPgC,KAAK,EAAE,EAQzC;AAGF,0BAAM,WAA8B,CAAC;AACrC,wBAAI,sBAAsB;AAE1B,sBAAE,MAAM,QAAQ,CAAC,MAAM,OAAO;AAC5B,2BAAK,KAAK,QAAQ,CAAC,GAAG,OAAO;AAC3B,4BAAI,EAAE,SAAS,WAAW;AACxB,mCAAS;AAAA,4BACP,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCAEC,eAAY;AAAA,gCAEZ,0BAAAA,MAAC,QAAG,SAAS,QAAQ,QAAQ,OAAO,EAAE,SAAS,EAAE,GAC/C,0BAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO;AAAA,sCACL,QAAQ,EAAE,aAAa;AAAA,sCACvB,QAAQ,GAAG,EAAE,WAAW,CAAC;AAAA,sCACzB,OAAO;AAAA,sCACP,YAAY,EAAE;AAAA,oCAChB;AAAA;AAAA,gCACF,GACF;AAAA;AAAA,8BAZK,OAAO,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;AAAA,4BAahD;AAAA,0BACF;AACA;AAAA,wBACF;AAEA,8BAAM,KAAK;AACX,8BAAM,eACJ,sBAAsB,IAAI,SAAS;AAErC,4BAAI,EAAE,SAAS,WAAW;AACxB,mCAAS;AAAA,4BACP,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCAEC,WAAW,KAAK;AAAA,gCAChB,OAAO,KAAK;AAAA,gCAEZ,0BAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,SACE,EAAE,YAAY,SAAS,CAAC,EAAE,UACtB,QAAQ,SACR,EAAE;AAAA,oCAER,OAAO;AAAA,sCACL,SAAS,aAAa,IAAI;AAAA,sCAC1B,WAAW;AAAA,sCACX,YAAY;AAAA,oCACd;AAAA,oCAEC,YAAE;AAAA;AAAA,gCACL;AAAA;AAAA,8BAjBK,OAAO,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;AAAA,4BAkB7C;AAAA,0BACF;AAAA,wBACF,OAAO;AACL,mCAAS;AAAA,4BACP,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCAEC,WAAW,KAAK;AAAA,gCAChB,OAAO,KAAK;AAAA,gCAEX,kBAAQ,IAAI,CAAC,QAAQ;AACpB,wCAAM,MACJ,IAAI,OAAO,OACN,EAAE,KAAa,IAAI,GAAG,IACvB;AACN,wCAAM,UAAU,IAAI,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI;AAE9C,yCACE,gBAAAA;AAAA,oCAAC;AAAA;AAAA,sCAEC,OAAO;AAAA,wCACL,QAAQ;AAAA,wCACR,SAAS;AAAA,wCACT,YAAY;AAAA,wCACZ,OAAO;AAAA,wCACP,WAAW;AAAA,wCACX,WAAW;AAAA,wCACX,eAAe;AAAA,sCACjB;AAAA,sCAEC;AAAA;AAAA,oCAXI,OAAO,IAAI,OAAO,IAAI,MAAM;AAAA,kCAYnC;AAAA,gCAEJ,CAAC;AAAA;AAAA,8BA3BI,OAAO,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;AAAA,4BA4B7C;AAAA,0BACF;AAAA,wBACF;AAEA;AAAA,sBACF,CAAC;AAAA,oBACH,CAAC;AAED,2BACE,gBAAAC,OAACJ,QAAM,UAAN,EACE;AAAA;AAAA,sBACA;AAAA,yBAFkB,EAGrB;AAAA,kBAEJ,CAAC,GACH;AAAA;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA;AAEJ;;;AClSA,eAAsB,wBACpB,OACA,KACqC;AACrC,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,eAAe;AAAA,MAClB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,CAAC;AAAA,MACrC;AAAA,IACF;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,SAAS,MAAM,CAAC,MAAM,QAAQ,MAAM,IAAI,EAAG,QAAO;AACvD,WAAO,KAAK;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,MAAM,wCAAwC,KAAK;AAC3D,WAAO;AAAA,EACT;AACF;;;ACLE,SAeY,YAAAM,WAdV,OAAAC,OADF,QAAAC,cAAA;AAdF,IAAM,aAAa,CAAC,UAA0B;AAC5C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACnE,SAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG,EAAE,mBAAmB,SAAS;AAAA,IAChE,OAAO;AAAA,IAAS,KAAK;AAAA,IAAW,MAAM;AAAA,EACxC,CAAC;AACH;AAEA,IAAM,gBAAgB,CAAC,UAA0B;AAC/C,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,SAAO,IAAI,KAAK,aAAa,SAAS,EAAE,UAAU,WAAW,uBAAuB,EAAE,CAAC,EAAE,OAAO,KAAK;AACvG;AAEA,IAAM,SAAS,CAAC,EAAE,OAAO,MAAM,MAC7B,gBAAAA,OAAC,UAAK,OAAO,EAAE,SAAS,eAAe,KAAK,GAAG,YAAY,SAAS,GAClE;AAAA,kBAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAAI,iBAAM;AAAA,EAC1C,gBAAAA,MAAC,YAAO,OAAO,EAAE,OAAO,WAAW,YAAY,IAAI,GAAI,iBAAM;AAAA,GAC/D;AAGF,IAAM,WAAW,CAAC,EAAE,OAAO,EAAE,MAAuE;AAClG,QAAM,IAAI,EAAE,UAAU;AACtB,QAAM,WAAW,MAAM,SAAS,aAC5B,EAAE,OAAO,EAAE,UAAU,OAAO,WAAW,YAAY,UAAU,IAC7D,MAAM,SAAS,cACb,EAAE,OAAO,EAAE,UAAU,OAAO,WAAW,YAAY,UAAU,IAC7D,EAAE,OAAO,EAAE,YAAY,OAAO,WAAW,YAAY,UAAU;AACrE,MAAI;AACJ,MAAI,MAAM,SAAS,YAAY;AAC7B,cAAU,gBAAAC,OAAAF,WAAA,EACR;AAAA,sBAAAC,MAAC,UAAO,OAAO,EAAE,WAAW,OAAO,cAAc,MAAM,UAAU,GAAG;AAAA,MACpE,gBAAAA,MAAC,UAAO,OAAO,EAAE,aAAa,OAAO,cAAc,MAAM,aAAa,GAAG;AAAA,MACzE,gBAAAA,MAAC,UAAO,OAAO,EAAE,eAAe,OAAO,cAAc,MAAM,cAAc,GAAG;AAAA,MAC5E,gBAAAA,MAAC,UAAO,OAAO,EAAE,iBAAiB,OAAO,cAAc,MAAM,iBAAiB,GAAG;AAAA,OACnF;AAAA,EACF,WAAW,MAAM,SAAS,aAAa;AACrC,cAAU,gBAAAC,OAAAF,WAAA,EACR;AAAA,sBAAAC,MAAC,UAAO,OAAO,EAAE,QAAQ,OAAO,WAAW,MAAM,gBAAgB,GAAG;AAAA,MACpE,gBAAAA,MAAC,UAAO,OAAO,EAAE,UAAU,OAAO,cAAc,MAAM,QAAQ,GAAG;AAAA,MACjE,gBAAAA,MAAC,UAAO,OAAO,EAAE,OAAO,OAAO,MAAM,aAAa,UAAK;AAAA,MACvD,gBAAAA,MAAC,UAAO,OAAO,EAAE,SAAS,OAAO,WAAW,MAAM,YAAY,GAAG;AAAA,MACjE,gBAAAA,MAAC,UAAO,OAAO,EAAE,OAAO,OAAO,MAAM,kBAAkB,OAAO,WAAM,GAAG,cAAc,MAAM,cAAc,CAAC,KAAK;AAAA,OACjH;AAAA,EACF,OAAO;AACL,cAAU,gBAAAA,MAAC,UAAO,OAAO,EAAE,OAAO,OAAO,MAAM,gBAC7C,MAAM,cAAc,QAAQ,MAAM,YAAY,OAAO,GAAG,MAAM,UAAU,IAAI,MAAM,QAAQ,KAAK,WAC9F;AAAA,EACL;AACA,QAAM,OAAO,MAAM,cAAc,MAAM,eAAe,MAAM,SAAS,MAAM,aAAa;AACxF,SAAO,gBAAAC,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,GACjC;AAAA,oBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,UAAU,QAAQ,KAAK,GAAG,cAAc,EAAE,GAC7F;AAAA,sBAAAD,MAAC,UAAK,OAAO,EAAE,YAAY,KAAK,OAAO,UAAU,GAAI,iBAAO,GAAG,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,QAAO;AAAA,MACvG,gBAAAA,MAAC,UAAK,OAAO;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,OAAO,SAAS;AAAA,QAChB,YAAY,SAAS;AAAA,MACvB,GAAI,mBAAS,OAAM;AAAA,OACrB;AAAA,IACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,YAAY,UAAU,GAAG,GAAI,mBAAQ;AAAA,KAC7F;AACF;AAEA,IAAM,YAAY,CAAC,SAAiB;AAClC,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACrD,SAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG,EAAE,mBAAmB,SAAS;AAAA,IAChE,SAAS;AAAA,IAAQ,MAAM;AAAA,IAAW,OAAO;AAAA,IAAQ,KAAK;AAAA,EACxD,CAAC;AACH;AAEO,SAAS,wBAAwB,QAA6B,GAAmC,SAAkB;AACxH,QAAM,UAAU,OAAO,OAA4C,CAAC,QAAQ,UAAU;AACpF,KAAC,OAAO,MAAM,UAAU,MAAM,CAAC,GAAG,KAAK,KAAK;AAC5C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACL,QAAM,UAAU;AAAA,IACd,EAAE,KAAK,QAAQ,QAAQ,EAAE,UAAU,QAAQ,KAAK,YAAY,EAAE;AAAA,EAChE;AACA,QAAM,SAAS,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO;AAAA,IAC5D,OAAO,UAAU,IAAI;AAAA,IACrB,OAAO,KAAK,IAAI,CAAC,UAAU;AACzB,UAAI,SAAS;AACX,eAAO,EAAE,KAAK,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,IAAI,MAAM,CAAC;AAAA,UAAE,MAAM;AAAA,UAAoB,SAAS;AAAA,UAAgB,SACrG,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,aAAa,cAAc,oBAAoB,GACpE,0BAAAA,MAAC,YAAS,OAAc,GAAM,GAChC;AAAA,QACF,CAAC,EAAE;AAAA,MACL;AACA,aAAO,EAAE,KAAK,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,IAAI,MAAM,CAAC,EAAE,MAAM,SAAkB,MAAM;AAAA,QAChF,MAAM,gBAAAA,MAAC,YAAS,OAAc,GAAM;AAAA,MACtC,EAAC,CAAC,EAAE;AAAA,IACN,CAAC;AAAA,EACH,EAAE;AACF,SAAO,EAAE,SAAS,OAAO;AAC3B;;;AjBkG4B,qBAAAE,WAAA,OAAAC,OAwEpB,QAAAC,cAxEoB;AAvL5B,IAAMC,sBAAqB,CAAC,SAAiB;AAC3C,MAAI,SAAS,QAAS,QAAO;AAC7B,SAAO;AACT;AAQe,SAAR,0BAA2C;AAAA,EAChD;AAAA,EACA,MAAM;AAAA,EACN,gBAAgB;AAClB,GAAuB;AACrB,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAASD,oBAAmB,IAAI,CAAC;AACzE,QAAM,CAAC,KAAK,MAAM,IAAIC,WAAS,oBAAI,KAAK,CAAC;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAIA;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAmB,CAAC,CAAC;AACvE,QAAM,CAAC,mBAAmB,oBAAoB,IAC5CA,WAA0C,kBAAkB,CAAC;AAC/D,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,KAAK;AAE9D,QAAM,CAAC,WAAW,YAAY,IAAIA,WAEhC,IAAI;AACN,QAAM,CAAC,yBAAyB,0BAA0B,IAAIA,WAE5D,OAAO;AACT,QAAM,CAAC,WAAW,YAAY,IAAIA,WAA8C,QAAQ;AACxF,QAAM,CAAC,aAAa,cAAc,IAAIA,WAA8B,CAAC,CAAC;AACtE,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAwC,OAAO;AACrF,QAAM,CAAC,aAAa,cAAc,IAAIA;AAAA,IACpC,CAAC;AAAA,EACH;AACA,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwC,OAAO;AAC3E,QAAM,eAAeC,SAAuB,IAAI;AAEhD,QAAM,CAAC,SAAS,UAAU,IAAID,WAAkB,KAAK;AAErD,EAAAE,YAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM;AACjC,aAAO,oBAAI,KAAK,CAAC;AAAA,IACnB,GAAG,GAAK;AAER,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACd,QAAI,OAAO,mBAAmB,YAAa;AAE3C,QAAI,CAAC,aAAa,SAAS;AACzB,cAAQ,MAAM,6BAA6B;AAC3C;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,eAAS,SAAS,SAAS;AACzB,YAAI,MAAM,aAAa;AACrB,qBAAW,MAAM,YAAY,QAAQ,GAAG;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AAED,aAAS,QAAQ,aAAa,OAAO;AAErC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,EAAAA,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,cACJ,qBAAa,aAAa,YAAY,CAAC,KAAK,qBAAa,IAAI;AAC/D,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,SAAS,OAAO,EAAE;AAAA,QACzC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,YAAY,YAAY;AAC5B,cAAU,SAAS;AAEnB,QAAI;AACF,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AACA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAEA,UAAI,CAAC,QAAQ;AACX,uBAAe,CAAC,CAAC;AACjB,kBAAU,OAAO;AACjB;AAAA,MACF;AAEA,mBAAa,MAAM;AAEnB,UAAI,iBAAiB;AACrB,UAAI,WAAW,UAAU;AACvB,yBAAiB,eAAe,OAAO,CAAC,UAAU;AAChD,iBACE,MAAM,oBAAoB,YAAY,MAAM,OAAO,YAAY;AAAA,QAEnE,CAAC;AAAA,MACH;AACA,UAAI,kBAAkB,SAAS,GAAG;AAChC,yBAAiB,eAAe,OAAO,CAAC,UAAU;AAChD,gBAAM,OAAO,MAAM,kBAAkB,YAAY;AACjD,iBAAO,kBAAkB,SAAS,IAAI;AAAA,QACxC,CAAC;AAAA,MACH;AAEA,YAAM,UAAUC,mBAAkB,gBAAgB,gBAAgB;AAClE,qBAAe,OAAO;AACtB,gBAAU,OAAO;AAAA,IACnB,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,qBAAe,CAAC,CAAC;AACjB,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,EAAAD,YAAU,MAAM;AACd,cAAU;AAAA,EACZ,GAAG,CAAC,mBAAmB,kBAAkB,YAAY,CAAC;AAEtD,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,UAAM,cAAc,YAAY;AAC9B,qBAAe,SAAS;AACxB,YAAM,SAAS,MAAM;AAAA,QACnB,kBAAkB;AAAA,QAClB,oBAAoB,kBAAkB,KAAK,CAAC;AAAA,MAC9C;AACA,UAAI,CAAC,QAAQ;AACX,uBAAe,CAAC,CAAC;AACjB,uBAAe,OAAO;AACtB;AAAA,MACF;AACA,qBAAe,MAAM;AACrB,qBAAe,OAAO;AAAA,IACxB;AACA,gBAAY;AAAA,EACd,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,QAAI,iBAAiB;AACrB,QAAI,WAAW,UAAU;AACvB,uBAAiB,eAAe;AAAA,QAC9B,CAAC,UACC,MAAM,mBAAmB,YAAY,MAAM,OAAO,YAAY;AAAA,MAClE;AAAA,IACF;AACA,QAAI,kBAAkB,SAAS,GAAG;AAChC,uBAAiB,eAAe;AAAA,QAAO,CAAC,UACtC,kBAAkB,SAAS,MAAM,iBAAiB,YAAY,CAAC;AAAA,MACjE;AAAA,IACF;AACA,UAAM,UAAUC,mBAAkB,gBAAgB,gBAAgB;AAClE,mBAAe,OAAO;AAAA,EACxB,GAAG,CAAC,QAAQ,iBAAiB,CAAC;AAE9B,MAAI,CAAC,aAAc,QAAO,gBAAAN,MAAAD,WAAA,EAAE;AAE5B,QAAM,IAAI,aAAa;AAEvB,QAAM,sBAAsB,YAAY,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS;AAClF,QAAM,WAAW,4BAA4B;AAC7C,QAAM,EAAE,SAAS,OAAO,IAAI,WACxB,wBAAwB,qBAAqB,GAAG,OAAO,IACvDQ,4BAA2B;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACL,QAAM,gBAAgB,WAAW,cAAc;AAC/C,QAAM,YAAY,WACd,oBAAoB,SAAS,IAC7B,eAAe,OAAO,QAAQ,WAAW,EAAE,SAAS;AAExD,QAAM,SAAS;AACf,QAAM,MAAM;AACZ,QAAM,yBAA8C;AAAA,IAClD,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,EACZ;AAEA,SACE,gBAAAP,MAAC,SAAI,OAAO,aAAa,GAAG,GAAG,KAAK,cAClC,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,EAAE,OAAO,SAAS,OAAO,QAAiB;AAAA,cAC1C,EAAE,OAAO,WAAW,OAAO,UAAmB;AAAA,cAC9C,GAAI,gBAAgB,CAAC,EAAE,OAAO,UAAU,OAAO,SAAkB,CAAC,IAAI,CAAC;AAAA,YACzE;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,SAAS,2BAA2B,IAAI;AAAA;AAAA,QACrD;AAAA,QACC,YACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,EAAE,OAAO,EAAE,UAAU,OAAO,QAAQ,OAAO,SAAkB;AAAA,cAC7D,EAAE,OAAO,EAAE,UAAU,OAAO,UAAU,OAAO,WAAoB;AAAA,cACjE,EAAE,OAAO,EAAE,UAAU,OAAO,WAAW,OAAO,YAAqB;AAAA,YACrE;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,SAAS,aAAa,IAAI;AAAA,YACrC,MAAK;AAAA,YACL,OAAO,EAAE,WAAW,EAAE;AAAA;AAAA,QACxB;AAAA,QAEF,gBAAAC,OAAC,SAAI,OAAO,cACV;AAAA,0BAAAD;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,gBAAgB;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,mBAAmB;AAAA,cACnB,kBAAkB;AAAA;AAAA,UACpB;AAAA,UAEC,kBAAkB,YACjB,gBAAAR;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,SAAS;AAAA,cACX;AAAA,cAEA,0BAAAA,MAAC,eAAY;AAAA;AAAA,UACf,IACE,YACF,gBAAAA,MAAC,SAAI,OAAO,qBACV,0BAAAA;AAAA,YAACS;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ,wBACE,UAAU,yBAAyB;AAAA;AAAA,UAEvC,GACF,IAEA,gBAAAT;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,OAAO;AAAA,cACT;AAAA,cAEC,YAAE;AAAA;AAAA,UACL;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,IAAM,eAAe,CAAC,SAAuC;AAAA,EAC3D,OAAO,MAAM,SAAS;AAAA,EACtB,QAAQ,MAAM,SAAS;AAAA,EACvB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,YAAY;AACd;AAEA,IAAM,eAAoC;AAAA,EACxC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AACP;AAEA,IAAM,sBAA2C;AAAA,EAC/C,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,cAAc;AAChB;;;AkBtWS,gBAAAU,aAAA;AADM,SAAR,oCAAqD,OAAc;AACxE,SAAO,gBAAAA,MAAC,6BAA2B,GAAG,OAAO,eAAa,MAAC;AAC7D;;;ACNA,SAAS,eAAAC,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACGzD,eAAsB,qBAAqB,WAAmB,MAAgD;AAC1G,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,gBAAgB,SAAS,UAAU;AAAA,IACvD;AAEA,UAAM,eAA+D,MAAM,SAAS,KAAK;AAEzF,QAAI,WAAW,cAAc;AACzB,YAAM,IAAI,MAAM,gBAAgB,aAAa,KAAK;AAAA,IACtD;AAEA,WAAO,aAAa;AAAA,EACxB,SAAS,OAAO;AACZ,YAAQ,MAAM,iCAAiC,KAAK;AACpD,WAAO;AAAA,EACX;AACJ;;;AC9BA,SAAa,aAAAC,aAAW,WAAAC,UAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACoBnD,gBAAAC,aAAA;AAlBC,SAAS,KAAK;AAAA,EACnB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AACF,GAAc;AACZ,QAAM,SAAS;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AAEA,SACE,gBAAAA,MAAC,SAAK,GAAG,QACP,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAM,OAAO,QAAQ;AAAA,MACrB,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,gBAAe;AAAA;AAAA,EACjB,GACF;AAEJ;;;ACpBI,SAOE,OAAAC,OAPF,QAAAC,cAAA;AAPG,SAAS,cAAc;AAAA,EAC5B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AACF,GAAc;AACZ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR;AAAA,MACA,eAAW;AAAA,MAEX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAM,OAAO,QAAQ;AAAA,YACrB,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,gBAAe;AAAA;AAAA,QACjB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,MAAM,OAAO,SAAS;AAAA,YACtB,QAAQ;AAAA,YACR,aAAa;AAAA;AAAA,QACf;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACxBI,SAOE,OAAAE,OAPF,QAAAC,cAAA;AAPG,SAAS,UAAU;AAAA,EACxB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AACF,GAAc;AACZ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR;AAAA,MACA,eAAW;AAAA,MAEX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,MAAM,OAAO,QAAQ;AAAA,YACrB,QAAQ;AAAA,YACR,aAAa;AAAA;AAAA,QACf;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAQ,OAAO,UAAU;AAAA,YACzB,aAAa;AAAA,YACb,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAEJ;;;AChCA,SAAgB,iBAAAE,gBAAe,cAAAC,mBAAkB;;;ACAjD,SAAS,cAAAC,mBAAkB;AAsBnB,gBAAAC,aAAA;AAdR,IAAMC,mBAAkBC;AAAA,EACtB,CAAC,EAAE,UAAU,MAAM,MAAM,GAAG,QAAQ;AAClC,UAAM,EAAE,MAAM,IAAI,mBAAmB;AAErC,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO,MAAM,SAAS;AAAA,UACtB,QAAQ,MAAM,SAAS;AAAA,UACvB,WAAW;AAAA,QACb;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,SAAS;AAAA,cACT,eAAe;AAAA,cACf,OAAO;AAAA,cACP,KAAK;AAAA,cACL,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY,MAAM;AAAA,cAClB,YAAY,MAAM,KAAK,UAAU;AAAA,cACjC,OAAO,MAAM,KAAK,UAAU;AAAA,cAC5B,cAAc,MAAM,KAAK,UAAU;AAAA,YACrC;AAAA,YACA;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEAC,iBAAgB,cAAc;;;AC/C9B,SAAS,cAAAE,aAAY,YAAAC,kBAAgB;AAWjC,gBAAAC,aAAA;AAJJ,IAAMC,UAASH,YAA2C,CAAC,OAAO,QAAQ;AACxE,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAS,KAAK;AAEhD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,SAAS,MAAM;AAAA,MACf,cAAc,MAAM,aAAa,IAAI;AAAA,MACrC,cAAc,MAAM,aAAa,KAAK;AAAA,MACtC,OAAO;AAAA,QACL,SAAS,YAAY,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,GAAG,MAAM;AAAA,QACT,GAAI,YAAY,MAAM,aAAa,CAAC;AAAA,MACtC;AAAA,MAEC,gBAAM;AAAA;AAAA,EACT;AAEJ,CAAC;AAEDC,QAAO,cAAc;;;AC9BrB;AAAA,EACE,cAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AA2MC,gBAAAC,OAkCA,QAAAC,cAlCA;AAjMR,SAASC,WAAU,OAAeC,QAAe;AAC/C,QAAM,KAAK,SAAS,IAAI,KAAK;AAE7B,QAAM,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,GAAG;AACL,WAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAKA,MAAK;AAAA,EACjD;AAEA,QAAM,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI;AAC7C,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKA,MAAK;AAAA,EACxC;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKA,MAAK;AAAA,EACxC;AAEA,SAAO,oBAAoBA,MAAK;AAClC;AAEA,IAAMC,mBAAkBC;AAAA,EACtB,CAAC,EAAE,WAAW,OAAO,aAAa,WAAW,SAAS,GAAG,iBAAiB;AACxE,UAAM,EAAE,MAAM,IAAI,mBAAmB;AACrC,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,eAAe,CAAC;AAEjD,UAAM,MAAO,OAAe,QAAQ,QAAQ,QAAQ;AACpD,UAAM,QAAQ,QAAQ;AAEtB,UAAM,WAAWC,SAAuB,IAAI;AAC5C,UAAM,cAAcA,SAAuB,IAAI;AAC/C,UAAM,WAAWA,SAAuB,IAAI;AAG5C,IAAAC,iBAAgB,MAAM;AACpB,UAAI,CAAC,aAAc;AACnB,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,GAAI;AAET,UAAI,OAAO,iBAAiB,WAAY,cAAa,EAAE;AAAA,UAClD,cAAa,UAAU;AAAA,IAC9B,GAAG,CAAC,YAAY,CAAC;AAEjB,UAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AACpD,UAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC;AAEzD,UAAM,cAAcF,SAAO,KAAK;AAChC,UAAM,eAAeA,SAAO,EAAE,GAAG,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC;AAE/D,UAAM,SAASG,SAAQ,MAAM;AAC3B,YAAM,OAAO;AACb,aAAO;AAAA,QACL,OAAOP,WAAU,MAAM,GAAG;AAAA,QAC1B,OAAOA,WAAU,MAAM,IAAI;AAAA,QAC3B,YAAYA,WAAU,MAAM,IAAI;AAAA,QAChC,aAAaA,WAAU,MAAM,IAAI;AAAA,MACnC;AAAA,IACF,GAAG,CAAC,SAAS,CAAC;AAEd,UAAM,SAAS,MAAM;AACnB,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,YAAM,UAAU,GAAG;AACnB,YAAM,UAAU,GAAG;AACnB,YAAM,SAAS,GAAG;AAElB,YAAM,WAAW,UAAU,UAAU;AACrC,qBAAe,QAAQ;AAEvB,UAAI,CAAC,UAAU;AACb,iBAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC;AAC/B;AAAA,MACF;AAEA,YAAM,WAAW;AACjB,YAAM,QAAQ,UAAU;AACxB,YAAM,SAAS,KAAK,IAAI,UAAU,KAAK,MAAM,SAAS,KAAK,CAAC;AAC5D,YAAM,cAAc,KAAK,IAAI,GAAG,SAAS,MAAM;AAC/C,YAAM,eAAe,KAAK,IAAI,GAAG,UAAU,OAAO;AAElD,YAAM,MAAO,GAAG,YAAY,eAAgB;AAC5C,eAAS,EAAE,KAAK,QAAQ,OAAO,CAAC;AAAA,IAClC;AAEA,IAAAK,iBAAgB,MAAM;AACpB,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,UAAI,MAAM;AACV,YAAM,WAAW,MAAM;AACrB,6BAAqB,GAAG;AACxB,cAAM,sBAAsB,MAAM;AAAA,MACpC;AAEA,eAAS;AAET,SAAG,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAEzD,YAAM,KAAK,IAAI,eAAe,QAAQ;AACtC,SAAG,QAAQ,EAAE;AACb,SAAG,QAAQ,EAAE;AAEb,aAAO,MAAM;AACX,6BAAqB,GAAG;AACxB,WAAG,oBAAoB,UAAU,QAAQ;AACzC,WAAG,WAAW;AAAA,MAChB;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAa;AAClB,UAAK,EAAE,QAAwB,SAAS,SAAS,QAAS;AAE1D,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,SAAS,EAAE,UAAU,KAAK;AAEhC,YAAM,cAAc,GAAG,eAAe,MAAM;AAC5C,YAAM,kBAAkB,KAAK;AAAA,QAC3B;AAAA,QACA,KAAK,IAAI,GAAG,SAAS,MAAM,SAAS,CAAC;AAAA,MACvC;AAEA,YAAM,eAAe,GAAG,eAAe,GAAG;AAC1C,SAAG,YAAa,kBAAkB,cAAe;AAAA,IACnD;AAEA,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAa;AAElB,kBAAY,UAAU;AACtB,MAAC,EAAE,cAA8B,kBAAkB,EAAE,SAAS;AAE9D,mBAAa,UAAU;AAAA,QACrB,GAAG,EAAE;AAAA,QACL,WAAW,YAAY,QAAS;AAAA,QAChC,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAY,QAAS;AAE1B,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,EAAE,UAAU,aAAa,QAAQ;AAE5C,YAAM,cAAc,GAAG,eAAe,MAAM;AAC5C,YAAM,eAAe,GAAG,eAAe,GAAG;AAE1C,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,QACA,KAAK,IAAI,GAAG,aAAa,QAAQ,WAAW,EAAE;AAAA,MAChD;AAEA,SAAG,YAAa,eAAe,cAAe;AAAA,IAChD;AAEA,UAAM,mBAAmB,CAAC,MAA0B;AAClD,kBAAY,UAAU;AACtB,UAAI;AACF,QAAC,EAAE,cAA8B,sBAAsB,EAAE,SAAS;AAAA,MACpE,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,WACE,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UAEX,GAAI,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAAA,UACnC,GAAI,UAAU,QAAQ,OAAO,CAAC,IAAI,EAAE,MAAM,WAAW;AAAA,UACrD,WAAW;AAAA,UAEX,GAAG;AAAA,QACL;AAAA,QACA;AAAA,QAEA;AAAA,0BAAAD,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAgCN;AAAA,UAEF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV;AAAA,cACA,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQ;AAAA,gBACR,WAAW;AAAA,cACb;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,cAAc,QAAQ,SAAY;AAAA,sBAClC,aAAa,QAAQ,qBAAqB;AAAA,oBAC5C;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,eAAe;AAAA,oBACf,OAAO;AAAA,sBACL,SAAS,cAAc,UAAU;AAAA,sBACjC,YAAY,OAAO;AAAA,sBACnB,cAAc;AAAA,sBACd,OAAO,QAAQ,SAAY;AAAA,sBAC3B,MAAM,QAAQ,IAAI;AAAA,oBACpB;AAAA,oBAEA,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,aAAU;AAAA,wBACV,WAAU;AAAA,wBACV,eAAe;AAAA,wBACf,eAAe;AAAA,wBACf,aAAa;AAAA,wBACb,iBAAiB;AAAA,wBACjB,OAAO;AAAA,0BACL,KAAK,MAAM;AAAA,0BACX,QAAQ,MAAM;AAAA,0BACd,YAAY,OAAO;AAAA,wBACrB;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEAI,iBAAgB,cAAc;;;AHnQxB,gBAAAM,aAAA;AA3BN,IAAM,yBAAyBC,eAE7B,MAAS;AACJ,IAAM,qBAAqB,MAAM;AACtC,QAAM,UAAUC,YAAW,sBAAsB;AACjD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAMC,mBAAkB;AAAA,EACtB,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,QAAAC;AACF;AAOA,IAAM,kBAAkB,OAAO;AAAA,EAC7B,CAAC,EAAE,MAAM,SAAS,MAA4B;AAC5C,WACE,gBAAAN,MAAC,uBAAuB,UAAvB,EAAgC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAC3D,UACH;AAAA,EAEJ;AAAA,EACAG;AACF;AAEA,IAAO,0BAAQ;;;AIvBX,qBAAAI,WAGM,OAAAC,OADF,QAAAC,cAFJ;AAlBJ,IAAM,sBACJ;AAOK,IAAM,cAAyB,CAAC,EAAE,SAAS,SAAS,MAAM;AAC/D,QAAM,EAAE,MAAM,IAAI,mBAAmB;AAErC,QAAM,iBAAiB,MAAM;AAAA,EAE7B;AAEA,QAAM,QAAQ,QAAQ,KAAK,QAAQ,aAAa,EAAE;AAElD,SACE,gBAAAA,OAAAF,WAAA,EACE;AAAA,oBAAAE,OAAC,SAAI,WAAU,kBAAiB,SAAS,UACvC;AAAA,sBAAAA,OAAC,SAAI,WAAU,gBACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,cAAc,iBAAM;AAAA,QAElC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,kBAAkB,QAAQ,SAAS;AAAA;AAAA,QACrC;AAAA,QAEA,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,+BAAoB;AAAA,SACvD;AAAA,MACA,gBAAAA,MAAC,gBAAa,SAAS,QAAQ,SAAS;AAAA,MACxC,gBAAAA;AAAA,QAAC,wBAAgB;AAAA,QAAhB;AAAA,UACC,OAAO,EAAE,GAAG,MAAM,KAAK,gBAAgB,OAAO,cAAc;AAAA,UAC5D,YAAY,MAAM,KAAK,eAAe;AAAA,UACtC,SAAS;AAAA,UACV;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAUU,MAAM,KAAK,KAAK,eAAe;AAAA,2BAC5B,MAAM,KAAK,KAAK,YAAY;AAAA,0BAC7B,MAAM,KAAK,KAAK,WAAW;AAAA;AAAA,0BAE3B,MAAM,KAAK,KAAK,WAAW;AAAA,mBAClC,MAAM,KAAK,KAAK,KAAK;AAAA;AAAA;AAAA,wBAGhB,MAAM,KAAK,KAAK,MAAM,eAAe;AAAA;AAAA,0BAEnC,MAAM,KAAK,KAAK,MAAM,WAAW;AAAA,mBACxC,MAAM,KAAK,KAAK,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAiBtC;AAAA,KACJ;AAEJ;AAEA,IAAM,iBAAoE,CAAC;AAAA,EACzE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,mBAAmB;AACrC,SACE,gBAAAC,OAAC,SAAI,WAAU,6BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD,MAAC,iBAAc,MAAM,OAAO,MAAM,IAAI;AAAA,MACtC,gBAAAA,MAAC,UAAM,mBAAS,WAAW,WAAU;AAAA,OACvC;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD,MAAC,aAAU,MAAM,OAAO,MAAM,IAAI;AAAA,MAClC,gBAAAC,OAAC,UAAM;AAAA;AAAA,QAAiB;AAAA,SAAS;AAAA,OACnC;AAAA,IAEA,gBAAAD,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAYN;AAAA,KACJ;AAEJ;AAEA,IAAM,eAAwC,CAAC,EAAE,QAAQ,MAAM;AAC7D,QAAM,QAAQ;AACd,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,wBAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,UAAU,YAAY,YAAY,OAAO,GAC5D,sBAAY,IACT,aACA,YAAY,IACZ,iBACA,YACN;AAAA,QACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,SAAS,GAClD;AAAA,0BAAAD,MAAC,QAAK,MAAM,WAAW,GAAG,OAAc,MAAM,IAAI;AAAA,UAClD,gBAAAA,MAAC,QAAK,MAAM,WAAW,GAAG,OAAc,MAAM,IAAI;AAAA,UAClD,gBAAAA,MAAC,QAAK,MAAM,WAAW,GAAG,OAAc,MAAM,IAAI;AAAA,WACpD;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACjJA,eAAsB,wBAAwB,UAA0C;AACpF,QAAM,MAAM,GAAG,eAAe;AAE9B,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAC9B,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,YAAY,UAAU,CAAC;AAAA,EAC5D,CAAC;AAED,QAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAEnD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,4BAA4B,SAAS,MAAM,EAAE;AAE/E,SAAQ,MAAM,YAAY;AAC9B;;;AT8GU,qBAAAE,YACE,OAAAC,OADF,QAAAC,cAAA;AA3GV,IAAM,iBAAiB;AAEhB,IAAM,eAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,mBAAmB;AAErC,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAwB,IAAI;AAE5D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,KAAK;AAE9C,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,CAAC;AAC9C,QAAM,SAASC,SAAO,CAAC;AAEvB,QAAM,WAAWC;AAAA,IACf,MACE,GAAG,QAAQ,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,IAAI,UAAU;AAAA,IACtE,CAAC,UAAU,mBAAmB,cAAc,UAAU;AAAA,EACxD;AAEA,EAAAC,YAAU,MAAM;AACd,QAAI,QAAQ;AACZ,UAAM,MAAM,EAAE,OAAO;AAErB,kBAAc,KAAK;AACnB,gBAAY,KAAK;AAGjB,QAAI,CAAC,mBAAmB;AACtB,uBAAiB,KAAK;AACtB,kBAAY,cAAc;AAC1B,aAAO,MAAM;AACX,gBAAQ;AAAA,MACV;AAAA,IACF;AAGA,qBAAiB,IAAI;AACrB,gBAAY,IAAI;AAEhB,KAAC,YAAY;AACX,UAAI;AACF,cAAM,YAAY,MAAM,wBAAwB,QAAQ;AACxD,YAAI,CAAC,SAAS,QAAQ,OAAO,QAAS;AAEtC,oBAAY,aAAa,cAAc;AAAA,MACzC,SAAS,GAAG;AACV,gBAAQ,MAAM,qCAAqC,CAAC;AACpD,YAAI,CAAC,SAAS,QAAQ,OAAO,QAAS;AAGtC,oBAAY,cAAc;AAAA,MAC5B,UAAE;AACA,YAAI,CAAC,SAAS,QAAQ,OAAO,QAAS;AACtC,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF,GAAG;AAEH,WAAO,MAAM;AACX,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,UAAU,UAAU,iBAAiB,CAAC;AAE1C,EAAAA,YAAU,MAAM;AACd,kBAAc,KAAK;AACnB,gBAAY,KAAK;AAAA,EACnB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,cAAc,sBAAsB,iBAAiB,CAAC;AAC5D,QAAM,kBAAkB,YAAY;AAEpC,QAAM,YAAY,WAAW,iBAAiB,YAAY;AAE1D,QAAM,mBAAmB;AAAA,IACvB,MAAM,KAAK,UAAU;AAAA,IACrB;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,MAAM,KAAK,UAAU;AAAA,IACrB;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB,MAAM,KAAK,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAAJ,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAClE;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEC;AAAA,yBACC,gBAAAA,OAAAF,YAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA;AAAA,kBAGP,YAAY;AAAA;AAAA,oBAER,eAAe;AAAA,oBACf,gBAAgB;AAAA,oBAChB,gBAAgB;AAAA,oBAChB,gBAAgB;AAAA,oBAChB,eAAe;AAAA;AAAA;AAAA,kBAInB,gBAAgB;AAAA,kBAChB,oBAAoB;AAAA;AAAA,kBAGpB,WACE;AAAA;AAAA,kBAGF,QAAQ;AAAA,kBACR,SAAS;AAAA,gBACX;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,YACE;AAAA,kBACF,eAAe;AAAA,gBACjB;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UAGD,mBACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,QAAQ,MAAM,cAAc,IAAI;AAAA,cAChC,SAAS,MAAM;AAEb,oBAAI,YAAY,aAAa,kBAAkB,eAAe,GAAG;AAC/D,gCAAc,CAAC;AACf;AAAA,gBACF;AACA,4BAAY,IAAI;AAChB,8BAAc,IAAI;AAAA,cACpB;AAAA,cACA,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,gBAAgB;AAAA,gBAChB,SAAS,aAAa,IAAI;AAAA,gBAC1B,YAAY;AAAA,cACd;AAAA;AAAA,YAtBK;AAAA,UAuBP;AAAA;AAAA;AAAA,IAEJ;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB,UAAU,mBAAmB;AAAA,UAClD,KAAK,GAAG,eAAe;AAAA,UACvB,cAAc;AAAA,QAChB;AAAA,QAEC,mBAAS,IAAI,CAAC,YACb,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,UAAU,MAAM,iBAAiB,OAAO;AAAA;AAAA,UAFnC,QAAQ;AAAA,QAGf,CACD;AAAA;AAAA,IACH;AAAA,IAEA,gBAAAA,MAAC,WACE;AAAA;AAAA;AAAA;AAAA;AAAA,WAMH;AAAA,KACF;AAEJ;;;AU7NA,SAAa,aAAAM,aAAW,YAAAC,kBAAgB;;;ACAxC,eAAsB,mBAAmB,SAAiB,QAAwC;AAC9F,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,CAAC;AAAA,IAC5C,CAAC;AACD,UAAM,eAAuD,MAAM,SAAS,KAAK;AAEjF,QAAI,CAAC,SAAS,MAAO,WAAW,cAAe;AAC3C,UAAI,WAAW,cAAc;AACzB,cAAM,IAAI,MAAM,gBAAgB,aAAa,KAAK;AAAA,MACtD;AACA,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAEA,WAAO,aAAa;AAAA,EACxB,SAAS,OAAO;AACZ,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACX;AACJ;;;ADtBA,SAAS,aAAa;;;AEHtB,SAAa,aAAAC,aAAoB,UAAAC,UAAQ,YAAAC,kBAAgB;AACzD,SAAS,UAAU,YAAY;AAkHrB,gBAAAC,OAWA,QAAAC,cAXA;AA/GV,IAAM,QAAQ,CAAC,GAAW,KAAa,QACrC,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;AAEzB,IAAM,WAKR,CAAC,EAAE,QAAQ,UAAU,aAAa,QAAQ,MAAM;AACnD,QAAM,EAAE,MAAM,IAAI,mBAAmB;AAErC,QAAM,eAAeC,SAA8B,IAAI;AACvD,QAAM,aAAaA,SAAkC,CAAC,CAAC;AAGvD,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAiB,CAAC;AAC1C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAkB,IAAI;AAItD,QAAM,kBAAkB;AAExB,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AAEf,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AAET,UAAM,UAAU,MAAM;AAEpB,YAAM,YAAY;AAClB,YAAM,YAAY,KAAK,IAAI,KAAK,GAAG,cAAc,SAAS;AAC1D,YAAM,WAAW,MAAM,YAAY,iBAAiB,KAAK,GAAG;AAC5D,cAAQ,QAAQ;AAAA,IAClB;AAEA,YAAQ;AAER,UAAM,KAAK,IAAI,eAAe,MAAM,QAAQ,CAAC;AAC7C,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,QAAQ,CAAC;AAGb,EAAAA,YAAU,MAAM;AACd,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,UAAU,KAAK,MAAM,OAAO,GAAG;AAGrC,EAAAA,YAAU,MAAM;AACd,eAAW,UAAU,MAAM;AAAA,MACzB,EAAE,QAAQ,SAAS;AAAA,MACnB,CAAC,GAAG,MAAM,WAAW,QAAQ,CAAC,KAAK;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,EAAAA,YAAU,MAAM;AACd,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAGhC,YAAM,OAAO,EAAE,WAAW,EAAE;AAC5B,UAAI,CAAC,KAAM;AAEX,UAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,KAAK;AAClC,UAAE,eAAe;AACjB,oBAAY,KAAK;AACjB,gBAAQ,CAAC,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,MACvC,WAAW,EAAE,QAAQ,KAAK;AACxB,UAAE,eAAe;AACjB,oBAAY,KAAK;AACjB,gBAAQ,CAAC,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,MACvC,WAAW,EAAE,IAAI,YAAY,MAAM,KAAK;AACtC,UAAE,eAAe;AACjB,oBAAY,KAAK;AACjB,gBAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,OAAO,CAAC;AAGZ,EAAAA,YAAU,MAAM;AACd,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,WAAW,CAAC,IAAI;AAE3D,UAAM,OAAO,sBAAsB,MAAM;AACvC,YAAM,OAAO,sBAAsB,MAAM;AACvC,cAAM,KAAK,WAAW,QAAQ,GAAG;AACjC,YAAI,GAAI,IAAG,eAAe,EAAE,OAAO,QAAQ,CAAC;AAAA,iBACnC,aAAa,QAAS,cAAa,QAAQ,YAAY;AAAA,MAClE,CAAC;AACD,aAAO,MAAM,qBAAqB,IAAI;AAAA,IACxC,CAAC;AAED,WAAO,MAAM,qBAAqB,IAAI;AAAA,EACxC,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAW;AAAA,MACX,aAAa;AAAA,MAEb;AAAA,wBAAAA,OAAC,SAAI,WAAU,aAAY,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAC/D;AAAA,0BAAAA,OAAC,SAAI,WAAU,oBACb;AAAA,4BAAAD;AAAA,cAAC,wBAAgB;AAAA,cAAhB;AAAA,gBACC,OAAO;AAAA,kBACL,GAAG,MAAM,QAAQ,SAAS;AAAA,kBAC1B,OAAO;AAAA,gBACT;AAAA,gBACA,YAAY,MAAM,QAAQ,SAAS,YAAY;AAAA,gBAC/C,SAAS;AAAA,gBACV;AAAA;AAAA,YAED;AAAA,YAEA,gBAAAC,OAAC,SAAI,WAAU,mBAAkB;AAAA;AAAA,cACnB;AAAA,cAAY;AAAA,cAAI;AAAA,eAC9B;AAAA,YAGA,gBAAAA,OAAC,SAAI,WAAU,YACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM;AACb,gCAAY,KAAK;AACjB,4BAAQ,CAAC,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,kBACvC;AAAA,kBACA,cAAW;AAAA,kBACX,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,cAEA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM;AACb,gCAAY,KAAK;AACjB,4BAAQ,CAAC;AAAA,kBACX;AAAA,kBACA,OAAM;AAAA,kBAEL;AAAA;AAAA,oBAAQ;AAAA;AAAA;AAAA,cACX;AAAA,cAEA,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM;AACb,gCAAY,KAAK;AACjB,4BAAQ,CAAC,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,kBACvC;AAAA,kBACA,cAAW;AAAA,kBACX,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,gBAAgB,WAAW,UAAU,EAAE;AAAA,kBAClD,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,kBACpC,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,eACF;AAAA,aACF;AAAA,UAEA,gBAAAA,MAAC,SAAI,WAAU,kBAAiB,KAAK,cACnC,0BAAAA,MAAC,YAAS,MAAM,QACb,gBAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,CAAC,GAAG,MAAM;AAC1C,kBAAM,aAAa,IAAI;AACvB,mBACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,KAAK,CAAC,SAAS;AACb,6BAAW,QAAQ,aAAa,CAAC,IAAI;AAAA,gBACvC;AAAA,gBAEA,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,OAAO;AAAA,oBACP,iBAAiB;AAAA,oBACjB,uBAAuB;AAAA;AAAA,gBACzB;AAAA;AAAA,cAXK;AAAA,YAYP;AAAA,UAEJ,CAAC,GACH,GACF;AAAA,WACF;AAAA,QAEA,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BA8BY,MAAM,QAAQ,SAAS,QAAQ,eAAe;AAAA,qBACnD,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAO/B,MAAM,QAAQ,SAAS,YAAY,eAAe;AAAA,qBACvD,MAAM,QAAQ,SAAS,YAAY,KAAK;AAAA,sBACvC,MAAM,QAAQ,SAAS,YAAY,WAAW,UAAU,MAAM,QAAQ,SAAS,YAAY,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKlG,MAAM,QAAQ,SAAS,YAAY,MAAM,eAAe;AAAA,qBAC7D,MAAM,QAAQ,SAAS,YAAY,MAAM,KAAK;AAAA,sBAC7C,MAAM,QAAQ,SAAS,YAAY,MAAM,WAAW,UAAU,MAAM,QAAQ,SAAS,YAAY,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SA+ChI;AAAA;AAAA;AAAA,EACJ;AAEJ;;;AChTA,SAAS,YAAAK,WAAU,iBAAiB;AAyBnB,gBAAAC,OAiBH,QAAAC,cAjBG;AAhBV,IAAM,gBAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAA,OAAC,SAAI,WAAU,aACb;AAAA,oBAAAD;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,eAAe,CAAC,EAAE,UAAAG,UAAS,MAAM;AAC/B,kBAAQ,IAAI,sBAAsBA,SAAQ;AAC1C,sBAAYA,SAAQ;AAAA,QACtB;AAAA,QACA,aAAa,CAAC,QAAQ,QAAQ,MAAM,mBAAmB,GAAG;AAAA,QAC1D,eAAe,CAAC,QAAQ,QAAQ,MAAM,qBAAqB,GAAG;AAAA,QAC9D,SAAS,gBAAAF,MAAC,SAAI,WAAU,eAAc,+BAAY;AAAA,QAClD,OACE,gBAAAA,MAAC,SAAI,WAAU,aAAY,iDAAmC;AAAA,QAG/D,gBAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,CAAC,GAAG,MAAM;AAC1C,gBAAM,aAAa,IAAI;AACvB,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,aAAa,UAAU;AAAA,cACtC,cAAY,iBAAiB,UAAU;AAAA,cAGvC;AAAA,gCAAAD,MAAC,aAAU,YAAwB,OAAO,KAAK;AAAA,gBAC/C,gBAAAC,OAAC,SAAI,WAAU,kBAAiB;AAAA;AAAA,kBAAM;AAAA,mBAAW;AAAA;AAAA;AAAA,YAR5C;AAAA,UASP;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,IACA,gBAAAD,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SA2BN;AAAA,KACJ;AAEJ;;;AHgBI,qBAAAG,YAGM,OAAAC,OADF,QAAAC,cAFJ;AAnFJ,MAAM,oBAAoB,YAAY,gCAAgC,MAAM,OAAO;AAQ5E,IAAM,cAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,mBAAmB;AACrC,QAAM,CAAC,oBAAoB,qBAAqB,IAAIC,WAAiB,CAAC;AACtE,QAAM,gBAAgB,QAAQ,SAAS,kBAAkB;AACzD,QAAM,eAAe,QAAQ,KAAK,QAAQ,aAAa,EAAE;AAEzD,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwB,IAAI;AACxD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAiB,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAiB,CAAC;AAE1D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAkB,KAAK;AAEnE,EAAAC,YAAU,MAAM;AAEd,UAAM,MAAM;AACZ,QAAI,SAAS,cAAc,eAAe,GAAG,IAAI,EAAG;AAEpD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AAEd,UAAM,cAAc,YAAY;AAC9B,UAAI;AACF,cAAM,MAAM,MAAM,mBAAmB,cAAc,cAAc,IAAI;AACrE,kBAAU,GAAG;AAAA,MACf,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,kBAAU,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,gBAAY;AAEZ,eAAW,KAAK;AAChB,oBAAgB,CAAC;AACjB,gBAAY,CAAC;AAAA,EACf,GAAG,CAAC,eAAe,YAAY,CAAC;AAEhC,QAAM,WAAW,iBAAiB;AAElC,EAAAA,YAAU,MAAM;AAEd,QAAI,CAAC,UAAU;AACb,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,eAAgB;AACrB,UAAM,OAAO,SAAS,KAAK,MAAM;AACjC,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,eAAgB;AACrB,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,SAAU,mBAAkB,KAAK;AAAA,IACjD;AACA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,cAAc,CAAC;AAEnB,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAE,OAAC,SAAI,WAAU,0BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,kBACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,iBAAiB,wBAAa;AAAA,QAC5C,gBAAAA,MAAC,OAAE,WAAU,uBAAuB,wBAAc,aAAY;AAAA,SAChE;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,gBAEZ;AAAA,SAAC,YACA,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU,QAAQ;AAAA,YAClB,aAAa;AAAA,YACb,eAAe;AAAA,YACf,cAAc;AAAA;AAAA,QAChB;AAAA,QAGF,gBAAAC,OAAC,SAAI,WAAU,mBAEZ;AAAA,sBACC,gBAAAD,MAAC,SAAI,WAAU,mBACb,0BAAAA;AAAA,YAAC,wBAAgB;AAAA,YAAhB;AAAA,cACC,SAAS,MAAM,kBAAkB,IAAI;AAAA,cACrC,OAAO,MAAM,QAAQ;AAAA,cACrB,YAAY,MAAM,QAAQ,iBAAiB;AAAA,cAC5C;AAAA;AAAA,UAED,GACF;AAAA,UAGF,gBAAAA;AAAA,YAAC,wBAAgB;AAAA,YAAhB;AAAA,cACC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;AAAA,cAC/B,WAAW,MAAM,KAAK,UAAU,SAAS;AAAA,cAEzC,0BAAAC,OAAC,SAAI,WAAU,gBACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,EAAE,UAAU,SAAS,MAAM,QAAQ,SAAS,SAAS;AAAA,oBAE5D,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEC,oBAAkB,cAAc;AAAA;AAAA,sBAD3B,cAAc;AAAA,oBAErB;AAAA;AAAA,gBACF;AAAA,gBAEC,UACC,gBAAAC,OAAC,SAAI,WAAU,eACb;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA,cAAc,CAAC,eAAe;AAC5B,wCAAgB,UAAU;AAC1B,mCAAW,IAAI;AAAA,sBACjB;AAAA,sBACA;AAAA,sBACA;AAAA;AAAA,kBACF;AAAA,kBAEC,WAAW,WAAW,KACrB,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA,aAAa;AAAA,sBACb,SAAS,MAAM,WAAW,KAAK;AAAA;AAAA,kBACjC;AAAA,mBAEJ;AAAA,iBAEJ;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAGC,YAAY,kBACX,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAW;AAAA,YACX,cAAW;AAAA,YACX,aAAa,CAAC,MAAM;AAElB,kBAAI,EAAE,WAAW,EAAE,cAAe,mBAAkB,KAAK;AAAA,YAC3D;AAAA,YAEA;AAAA,8BAAAD,MAAC,SAAI,WAAU,gBAAe;AAAA,cAC9B,gBAAAA,MAAC,SAAI,WAAU,cACb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,UAAU,QAAQ;AAAA,kBAClB,aAAa;AAAA,kBACb,eAAe,CAAC,MAAM;AACpB,0CAAsB,CAAC;AACvB,sCAAkB,KAAK;AAAA,kBACzB;AAAA,kBACA,cAAc;AAAA,kBACd,oBAAoB,MAAM,kBAAkB,KAAK;AAAA;AAAA,cACnD,GACF;AAAA;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAQU,MAAM,QAAQ,UAAU,eAAe;AAAA,mBAC5C,MAAM,QAAQ,UAAU,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASxB,MAAM,QAAQ,OAAO,eAAe;AAAA,mBACzC,MAAM,QAAQ,OAAO,KAAK;AAAA;AAAA,2BAElB,MAAM,QAAQ,OAAO,YAAY;AAAA,0BAClC,MAAM,QAAQ,OAAO,WAAW;AAAA;AAAA,0BAEhC,MAAM,QAAQ,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAgD/B,MAAM,QAAQ,kBAAkB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAQ/C,MAAM,QAAQ,kBAAkB,eAAe;AAAA,mBACpD,MAAM,QAAQ,kBAAkB,KAAK;AAAA,0BAC9B,MAAM,QAAQ,kBAAkB,WAAW;AAAA;AAAA,0BAE3C,MAAM,QAAQ,kBAAkB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,wBAK7C,MAAM,QAAQ,kBAAkB,MAAM,eAAe;AAAA,mBAC1D,MAAM,QAAQ,kBAAkB,MAAM,KAAK;AAAA;AAAA,0BAEpC,MAAM,QAAQ,kBAAkB,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA,wBAInD,MAAM,QAAQ,kBAAkB,OAAO,eAAe;AAAA,mBAC3D,MAAM,QAAQ,kBAAkB,OAAO,KAAK;AAAA,0BACrC,MAAM,QAAQ,kBAAkB,OAAO,WAAW;AAAA;AAAA,0BAElD,MAAM,QAAQ,kBAAkB,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBA2F5D,MAAM,QAAQ,UAAU,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAgB/C;AAAA,KACJ;AAEJ;AAEA,IAAM,gBAOD,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,mBAAmB;AAErC,SACE,gBAAAC,OAAC,SAAI,WAAW,cAAc,eAAe,mBAAmB,EAAE,IAChE;AAAA,oBAAAA,OAAC,SAAI,WAAU,cACb;AAAA,sBAAAD;AAAA,QAAC,wBAAgB;AAAA,QAAhB;AAAA,UACC,SAAS;AAAA,UACT,OAAO;AAAA,YACL,GAAG,MAAM,QAAQ;AAAA,YACjB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,aAAa;AAAA,UACf;AAAA,UACA,YAAY,MAAM,QAAQ,iBAAiB;AAAA,UAC5C;AAAA;AAAA,MAED;AAAA,MAEC,gBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAW;AAAA,UACZ;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IAEA,gBAAAA;AAAA,MAAC,wBAAgB;AAAA,MAAhB;AAAA,QACC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;AAAA,QAC/B,WAAW,MAAM,KAAK,UAAU,SAAS;AAAA,QAEzC,0BAAAA,MAAC,QAAG,WAAU,gBAAe,MAAK,cAAa,cAAW,YACvD,mBAAS,IAAI,CAAC,SAAS,UAAU;AAChC,gBAAM,SAAS,UAAU;AAEzB,iBACE,gBAAAA,MAAC,QAAqB,WAAU,gBAC9B,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,eAAe,SAAS,cAAc,EAAE;AAAA,cACnD,SAAS,MAAM,cAAc,KAAK;AAAA,cAClC,gBAAc;AAAA,cACd,MAAK;AAAA,cAEL;AAAA,gCAAAD,MAAC,UAAK,WAAU,eAAc,eAAY,QAAO;AAAA,gBACjD,gBAAAA,MAAC,UAAK,WAAU,gBAAgB,kBAAQ,MAAK;AAAA;AAAA;AAAA,UAC/C,KAVO,QAAQ,GAWjB;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AZ1YQ,SAMG,YAAAI,YANH,OAAAC,aAAA;AAhFR,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AA2BnB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,EAAE,MAAM,IAAI,mBAAmB;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,IAAI;AAE3C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAkC,IAAI;AACtE,QAAM,CAAC,eAAe,gBAAgB,IAAIA;AAAA,IACxC;AAAA,EACF;AAEA,EAAAC,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,MAAM,WAAW,EAAE;AAAA,QAC1C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,EAAAA,YAAU,MAAM;AACd,UAAM,YAAY,YAAY;AAC5B,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,cAAc,MAAM,qBAAqB,WAAW,QAAQ;AAClE,oBAAY,WAAW;AAAA,MACzB,SAAS,GAAG;AACV,gBAAQ,MAAM,gCAAgC,CAAC;AAC/C,oBAAY,IAAI;AAAA,MAClB,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,cAAU;AAAA,EACZ,GAAG,CAAC,UAAU,SAAS,CAAC;AAExB,MAAI,SAAS;AACX,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO;AAAA;AAAA,QACT;AAAA,QAEA,0BAAAA,MAAC,eAAY;AAAA;AAAA,IACf;AAAA,EAEJ;AAEA,MAAI,CAAC,UAAU;AACb,WAAO,gBAAAA,MAAAD,YAAA,EAAE,mCAAqB;AAAA,EAChC;AAEA,QAAM,sBAAsB,KAAK;AAAA,KAC9B,iBAAiB,sBAAsB,iBAAiB;AAAA,EAC3D;AAEA,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,WAAW,OAAO,GAC5C,0BACC,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,SAAS,MAAM,iBAAiB,IAAI;AAAA,MACpC;AAAA;AAAA,EACF,IAEA,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA,mBAAmB,MAAM;AAAA;AAAA,EAC3B,GAEJ;AAEJ;AAEe,SAAR,gBAAiC;AAAA,EACtC;AAAA,EACA,MAAM;AACR,GAAyB;AACvB,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,WAAS,CAAC;AACtD,QAAM,cAAcE,SAA8B,IAAI;AAEtD,QAAM,eAAeC,aAAY,CAAC,SAAgC;AAChE,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ,WAAW;AAC/B,kBAAY,UAAU;AAAA,IACxB;AAEA,QAAI,MAAM;AACR,kBAAY,UAAU,IAAI,eAAe,CAAC,YAAY;AACpD,cAAM,QAAQ,QAAQ,CAAC,GAAG,YAAY;AACtC,YAAI,UAAU,QAAW;AACvB,4BAAkB,KAAK;AAAA,QACzB;AAAA,MACF,CAAC;AAED,kBAAY,QAAQ,QAAQ,IAAI;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAJ,MAAC,2BAAgB,MACf,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO,EAAE,QAAQ,QAAQ,OAAO,QAAQ,WAAW,OAAO;AAAA,MAE1D,0BAAAA,MAAC,wBAAgB,iBAAhB,EAAgC,KAC/B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,UACf,UAAU,KAAK;AAAA;AAAA,MACjB,GACF;AAAA;AAAA,EACF,GACF;AAEJ;;;AgBrKA,SAAS,aAAAK,aAAW,YAAAC,YAAU,UAAAC,gBAAc;AAC5C,SAAS,eAAe;;;ACIxB,eAAsB,iBACpB,YACA,QACiC;AACjC,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,eAAe,wBAAwB;AAAA,MACrE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,YAAY,OAAO,CAAC;AAAA,IAC7C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,cAAQ,MAAM,gCAAgC,MAAM,KAAK;AACzD,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACT;AACF;;;AC5BO,IAAM,iBAAiB;AAEvB,IAAM,kBAAkE;AAAA,EAC3E,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACV;;;ACXO,IAAM,qBAAqB,CAAC,SAAyB;AACxD,QAAM,aAAa,KAAK,KAAK,EAAE,QAAQ,MAAM,GAAG,EAAE,YAAY;AAC9D,QAAM,gBAAgB,WAAW,QAAQ,MAAM,EAAE;AACjD,QAAM,WAAW,WAAW,MAAM,GAAG,EAAE,CAAC;AAExC,MAAI,eAAe,WAAW,kBAAkB,OAAQ,QAAO;AAC/D,MAAI,aAAa,QAAQ,kBAAkB,OAAQ,QAAO;AAC1D,MAAI,aAAa,QAAQ,kBAAkB,KAAM,QAAO;AACxD,MAAI,aAAa,QAAQ,kBAAkB,KAAM,QAAO;AACxD,MAAI,aAAa,QAAQ,kBAAkB,KAAM,QAAO;AACxD,MAAI,aAAa,QAAQ,kBAAkB,KAAM,QAAO;AACxD,MAAI,aAAa,QAAQ,kBAAkB,KAAM,QAAO;AACxD,MAAI,aAAa,QAAQ,kBAAkB,KAAM,QAAO;AAExD,SAAO;AACX;;;ACWM,gBAAAC,aAAA;AAbC,IAAM,kBAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,MAAI,QAAQ,KAAK;AACf,WACE,gBAAAA;AAAA,MAAC,gBAAQ;AAAA,MAAR;AAAA,QACC,OAAO,QAAQ,cAAc,EAAE;AAAA,QAC/B,OAAO,OAAO,KAAK,eAAe,EAAE,IAAI,CAAC,YAAY;AAAA,UACnD,SAAS,QAAQ,MAA6B,EAAE;AAAA;AAAA,UAEhD,OAAO;AAAA,QACT,EAAE;AAAA,QACF,UAAU,CAAC,WACT,oBAAoB,MAA6B;AAAA,QAEnD,UAAU,QAAQ,cAAc,EAAE;AAAA;AAAA,IACpC;AAAA,EAEJ,WAAW,QAAQ,KAAK;AACtB,WACE,gBAAAA;AAAA,MAAC,gBAAQ;AAAA,MAAR;AAAA,QACC,OAAO,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC,YAAY;AAAA,UAC3C,OAAO,QAAQ,MAA6B,EAAE;AAAA,UAC9C,SAAS,MAAM,oBAAoB,MAA6B;AAAA,QAClE,EAAE;AAAA,QACF,UAAU,QAAQ,cAAc,EAAE;AAAA;AAAA,IACpC;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC,gBAAQ;AAAA,IAAR;AAAA,MACC,OAAO,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC,YAAY;AAAA,QAC3C,OAAO,QAAQ,MAA6B,EAAE;AAAA,QAC9C,SAAS,MAAM,oBAAoB,MAA6B;AAAA,MAClE,EAAE;AAAA,MACF,UAAU,QAAQ,cAAc,EAAE;AAAA;AAAA,EACpC;AAEJ;;;ACpDQ,gBAAAC,aAAA;AALD,IAAM,SAAsE,CAAC,EAAE,UAAU,UAAU,MAAM,MAAM;AAClH,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,MAAI,CAAC,QAAS,QAAO;AAErB,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB,OAAO,OAAO;AAAA,QAC/B,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAEhB,WAAW;AAAA,QACX;AAAA;AAAA,QACA,kBAAkB;AAAA;AAAA,QAClB,GAAG;AAAA,MACP;AAAA;AAAA,EACJ;AAER;;;ACvBA,SAAgB,UAAAC,UAAQ,aAAAC,aAAW,YAAAC,kBAAgB;AA2DnC,gBAAAC,aAAA;AAzDhB,IAAM,UAID,CAAC;AAAA,EACF;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACE,QAAM,eAAeH,SAAuB,IAAI;AAChD,QAAM,YAAYA,SAAuB,IAAI;AAC7C,QAAM,CAAC,OAAO,QAAQ,IAAIE,WAAS,CAAC;AAEpC,EAAAD,YAAU,MAAM;AACZ,UAAM,YAAY,aAAa;AAC/B,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,aAAa,CAAC,OAAQ;AAE3B,UAAM,aAAa,MAAM;AACrB,YAAM,cAAc,OAAO;AAC3B,YAAM,eAAe,OAAO;AAG5B,YAAM,YAAY,UAAU;AAC5B,YAAM,aAAa,UAAU;AAE7B,YAAM,aAAa,cAAc;AACjC,YAAM,cAAc,eAAe;AAEnC,YAAM,WAAW,KAAK,IAAI,YAAY,WAAW;AAGjD,eAAS,QAAQ;AAAA,IACrB;AAEA,UAAM,WAAW,IAAI,eAAe,UAAU;AAC9C,aAAS,QAAQ,MAAM;AAEvB,eAAW;AAEX,WAAO,MAAM;AACT,eAAS,WAAW;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,SACI,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,OAAO;AAAA,QACH,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,MACZ;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,OAAO;AAAA,YACH,WAAW,SAAS,KAAK;AAAA,YACzB;AAAA,YACA,YAAY;AAAA,YACZ;AAAA,YACA,WAAW;AAAA,UACf;AAAA,UAEC;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;AAEJ,IAAO,kBAAQ;;;ACzCP,SAYE,OAAAC,OAZF,QAAAC,cAAA;AAvBD,IAAM,cAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKM;AACJ,MAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AACpB,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA;AAAA,QACd;AAAA,QAEA,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,OAAO;AAAA,cACP,QAAQ;AAAA;AAAA,YAEV;AAAA,YAEA;AAAA,8BAAAD,MAAC,UAAO;AAAA,cAAE;AAAA;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAEJ,MAAI,QAAS,QAAO,gBAAAA,MAAC,QAAG,OAAO,EAAE,WAAW,SAAS,GAAG;AACxD,MAAI,UAAU,KAAM,QAAO,gBAAAA,MAAC,QAAG,OAAO,EAAE,WAAW,SAAS,GAAG;AAE/D,QAAM,YACJ,QAAQ,OACJ,YACA,QAAQ,IACN,YACA,QAAQ,MACN,YACA;AAEV,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM,QAAQ,CAAC,IAAI;AAAA,UACzB,iBAAgB;AAAA,UAChB,SAAQ;AAAA;AAAA,MACV;AAAA;AAAA,EACF;AAEJ;;;APoCI,qBAAAE,YAgBM,OAAAC,OAdF,QAAAC,cAFJ;AAtFG,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA;AAAA,IAClD,WAAW,MAAM,GAAG,CAAC;AAAA,EACvB;AACA,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAkB,KAAK;AACzE,QAAM,CAAC,gBAAgB,iBAAiB,IACtCA,WAA8B,KAAK;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAGhC,IAAI;AACd,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAE3C,EAAAC,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACd,UAAM,YAAY,YAAY;AAC5B,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,mBAAmB,MAAM;AAAA,UAC7B;AAAA,UACA,gBAAgB,cAAc;AAAA,QAChC;AACA,YAAI,CAAC,kBAAkB;AACrB,gBAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AACA,yBAAiB,gBAAgB;AAAA,MACnC,SAAS,GAAG;AACV,gBAAQ,MAAM,CAAC;AAAA,MACjB,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,cAAU;AAAA,EACZ,GAAG,CAAC,oBAAoB,cAAc,CAAC;AAEvC,EAAAA,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,CAAC,UAAkB,eAAwB;AAChE,QAAI,YAAY;AACd,4BAAsB,mBAAmB,OAAO,CAAC,MAAM,MAAM,QAAQ,CAAC;AAAA,IACxE,OAAO;AACL,UAAI,mBAAmB,UAAU,gBAAgB;AAC/C,6BAAqB,IAAI;AACzB;AAAA,MACF;AACA,4BAAsB,CAAC,GAAG,oBAAoB,QAAQ,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,aAAa;AAEvB,UAAQ,IAAI,UAAU,aAAa;AAEnC,SACE,gBAAAF,OAAAF,YAAA,EACG;AAAA,yBACC,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,cAAc;AAAA,QAChB;AAAA,QAEA;AAAA,0BAAAD,MAAC,OAAG,YAAE,mBAAkB;AAAA,UACxB,gBAAAA,MAAC,YAAO,SAAS,MAAM,qBAAqB,KAAK,GAC/C,0BAAAA,MAAC,WAAQ,GACX;AAAA;AAAA;AAAA,IACF;AAAA,IAEF,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,KAAK;AAAA,UACL,gBAAgB;AAAA,QAClB;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAAC,gBAAQ;AAAA,YAAR;AAAA,cACC,OAAO,EAAE;AAAA,cACT;AAAA,cACA,UAAU,CAAC,aACT,eAAe,UAAU,mBAAmB,SAAS,QAAQ,CAAC;AAAA,cAEhE,UAAU;AAAA,cACV,UAAQ;AAAA;AAAA,UACV;AAAA,UACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAC1B,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP;AAAA,cACA,qBAAqB;AAAA,cACrB,SAAS,EAAE;AAAA;AAAA,UACb,GACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,QAAQ,OAAO,gBAAgB,OAAO;AAAA,UACtC,cAAc,OAAO,iBAAiB,OAAO;AAAA,UAC7C,WAAW,OAAO,gBAAgB,OAAO;AAAA,UACzC,UAAU;AAAA,QACZ;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,aAAa;AAAA,YACf;AAAA,YAEA,0BAAAC,OAAC,WACC;AAAA,8BAAAA,OAAC,QAAG,OAAO,EAAE,QAAQ,SAAS,GAC5B;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,UACE,iBAAiB,OAEX,KACA,IACE;AAAA,yBAEI,OAAO,wBACP,OAAO,gBACP,QAAQ,MAAM,EAAE;AAAA,sBACpB,GACF,SAAS,IAAI,OACf;AAAA,sBACN,OACE,iBAAiB,OAEX,KACA,IACE;AAAA,yBAEI,OAAO,wBACP,OAAO,gBACP,QAAQ,MAAM,EAAE;AAAA,sBACpB,GACF,SAAS,IAAI,OACf;AAAA,sBACN,YACE,OAAO,yBAAyB,OAAO;AAAA,sBACzC,OAAO,OAAO,yBAAyB,OAAO;AAAA,oBAChD;AAAA,oBAEA,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,KAAK;AAAA,0BACL,UAAU;AAAA,wBACZ;AAAA,wBAEC,qBAAW,gBAAAA,MAAC,eAAY;AAAA;AAAA,oBAC3B;AAAA;AAAA,gBACF;AAAA,gBACC,mBAAmB,IAAI,CAAC,aACvB,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO;AAAA,sBACL,YACE,OAAO,yBAAyB,OAAO;AAAA,sBACzC,OACE,OAAO,yBAAyB,OAAO;AAAA,sBACzC,UACE,OAAO,wBAAwB,OAAO;AAAA,sBACxC,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,WAAW;AAAA,oBACb;AAAA,oBAEA,0BAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,KAAK;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO;AAAA,wBACT;AAAA,wBAEA;AAAA,0CAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,KAAK,sBAAsB,QAAQ;AAAA,8BACnC,KAAK;AAAA,8BACL,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,OACE,OAAO,yBACH;AAAA,gCACE,cAAc;AAAA,gCACd,UAAU;AAAA,8BACZ,IACA;AAAA;AAAA,0BAER;AAAA,0BACC,iBAAiB,OAAO;AAAA;AAAA;AAAA,oBAC3B;AAAA;AAAA,kBAtCK;AAAA,gBAuCP,CACD;AAAA,iBACH;AAAA,cACC,mBAAmB,IAAI,CAAC,cACvB,gBAAAC,OAAC,QACC;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,WAAW;AAAA,sBACX,YACE,OAAO,yBAAyB,OAAO;AAAA,sBACzC,OACE,OAAO,yBAAyB,OAAO;AAAA,sBACzC,UACE,OAAO,wBAAwB,OAAO;AAAA,oBAC1C;AAAA,oBAEA,0BAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,KAAK;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO;AAAA,wBACT;AAAA,wBAEA;AAAA,0CAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,KAAK,sBAAsB,SAAS;AAAA,8BACpC,KAAK;AAAA,8BACL,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,OACE,OAAO,yBACH;AAAA,gCACE,cAAc;AAAA,gCACd,UAAU;AAAA,8BACZ,IACA;AAAA;AAAA,0BAER;AAAA,0BACC,iBAAiB,OAAO;AAAA;AAAA;AAAA,oBAC3B;AAAA;AAAA,gBACF;AAAA,gBACC,mBAAmB,IAAI,CAAC,cAAc;AACrC,wBAAM,OAAO,CAAC,WAAW,SAAS;AAClC,wBAAM,MAAM,KAAK,KAAK,GAAG;AACzB,wBAAM,QAAQ,gBAAgB,cAAc,GAAG,IAAI;AACnD,yBACE,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEC;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,gBACE,OAAO,2BAA2B,OAAO;AAAA;AAAA,oBALtC;AAAA,kBAOP;AAAA,gBAEJ,CAAC;AAAA,mBA1DM,SA2DT,CACD;AAAA,eACH;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEO,SAAS,QAAQ,EAAE,QAAQ,YAAY,OAAO,SAAS,GAAiB;AAC7E,QAAM,eAAeI,SAAuB,IAAI;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIF,WAAS,CAAC;AAEtD,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,SAAS;AACzB,cAAQ,MAAM,6BAA6B;AAC3C;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,eAAS,SAAS,SAAS;AACzB,YAAI,MAAM,aAAa;AACrB,4BAAkB,MAAM,YAAY,KAAK;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,CAAC;AAED,aAAS,QAAQ,aAAa,OAAO;AAErC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,SACE,gBAAAH,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,KAAK,cAClD,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,WAAU,MAC5C,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF,GACF;AAEJ;;;AQ3XA,SAAa,aAAAK,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AAChD,SAAS,0BAA0B;AAEnC,SAAS,oBAAoB;;;ACF7B,eAAsB,gBACrB,MACA,IACA,OAIS;AACT,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACH,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MACjC,QAAQ;AAAA,MACR,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,IAAI,MAAM,CAAC;AAAA,IACzC,CAAC;AACD,UAAM,WAAW,MAAM,SAAS,KAAK;AAErC,QAAI,CAAC,SAAS,MAAM,CAAC,UAAU,SAAS,CAAC,UAAU,OAAO;AACzD,cAAQ,MAAM,cAAc,UAAU,SAAS,SAAS;AACxD,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,MACN,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IAClB;AAAA,EACD,SAAS,OAAO;AACf,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACR;AACD;;;ADkDW,qBAAAC,YAAA,OAAAC,OAyBD,QAAAC,cAzBC;AA5DJ,IAAM,uBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AAExE,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,WAAW,CAAC,CAAC;AACtD,QAAM,CAAC,IAAI,KAAK,IAAIA,WAAiB,WAAW,CAAC,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAiB,CAAC;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAGpB,IAAI;AACd,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwC,OAAO;AAE3E,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY,EAAE,QAAQ,SAAS,EAAE;AAClE,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,EAAAA,YAAU,MAAM;AACd,UAAM,YAAY,YAAY;AAC5B,gBAAU,SAAS;AACnB,YAAM,UAAU,MAAM,gBAAgB,MAAM,IAAI,OAAO;AACvD,UAAI,CAAC,SAAS;AACZ,kBAAU,OAAO;AACjB;AAAA,MACF;AACA,iBAAW,OAAO;AAClB,gBAAU,OAAO;AAAA,IACnB;AAEA,cAAU;AAAA,EACZ,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC;AAEtB,QAAM,eAAe,MAAM;AACzB,YAAQ,EAAE;AACV,UAAM,IAAI;AAAA,EACZ;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO,gBAAAH,MAAAD,YAAA,EAAE;AAAA,EACX;AAEA,QAAM,IAAI,aAAa;AAEvB,SACE,gBAAAE,OAAAF,YAAA,EACE;AAAA,oBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,eAAe,WAAW,WAAW;AAAA,gBACrC,YAAY,WAAW,WAAW;AAAA,gBAClC,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,eAAe,WAAW,QAAQ;AAAA,sBAClC,KAAK;AAAA,sBACL,YAAY,WAAW,WAAW;AAAA,sBAClC,gBAAgB,WAAW,kBAAkB;AAAA,oBAC/C;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,sBACvB,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,OAAO,EAAE;AAAA,0BACT;AAAA,0BACA,UAAU;AAAA,0BACV,UAAU;AAAA;AAAA,sBACZ;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,OAAO,WAAW,SAAS;AAAA,sBAC3B,QAAQ;AAAA,oBACV;AAAA,oBAEA,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,gBAAgB;AAAA,0BAChB,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,WAAW,WAAW,kBAAkB;AAAA,0BACxC,OAAO,OAAO,qBAAqB,OAAO;AAAA,0BAC1C,YAAY,OAAO,qBAAqB,OAAO;AAAA,0BAC/C,QAAQ,OAAO,iBAAiB,OAAO;AAAA,0BACvC,QAAQ;AAAA,wBACV;AAAA,wBACA,SAAS;AAAA,wBAET,0BAAAA,MAAC,sBAAmB;AAAA;AAAA,oBACtB;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,eAAe,WAAW,QAAQ;AAAA,sBAClC,KAAK;AAAA,sBACL,YAAY,WAAW,WAAW;AAAA,sBAClC,gBAAgB,WAAW,kBAAkB;AAAA,oBAC/C;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,IAAG;AAAA,sBACrB,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,OAAO,EAAE;AAAA,0BACT;AAAA,0BACA,UAAU;AAAA,0BACV,UAAU;AAAA;AAAA,sBACZ;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,gBAAgB;AAAA,gBAChB,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,QAAO;AAAA,gBACzB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,WAAW,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,gBACxD;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA,MAAC,gBAAQ,kBAAR,EACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,gBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,gBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,cACjD;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,sBAAsB,IAAI;AAAA,oBAC/B,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OACE,OAAO,yBACH;AAAA,sBACE,cAAc;AAAA,sBACd,UAAU;AAAA,oBACZ,IACA;AAAA;AAAA,gBAER;AAAA,gBACA,gBAAAA,MAAC,gBAAa;AAAA,gBACd,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,sBAAsB,EAAE;AAAA,oBAC7B,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OACE,OAAO,yBACH;AAAA,sBACE,cAAc;AAAA,sBACd,UAAU;AAAA,oBACZ,IACA;AAAA;AAAA,gBAER;AAAA;AAAA;AAAA,UACF;AAAA,UACC,WAAW,YACV,gBAAAA,MAAC,eAAY,IAEb,gBAAAC,OAAAF,YAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,gBAC/C;AAAA,gBAEC,mBAAS;AAAA;AAAA,YACZ;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,eAAK,IAAI,MAAM,SAAS,QAAQ,EAAE;AAAA;AAAA,YACrC;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAwC;AACtC,QAAM,eAAeI,SAAuB,IAAI;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIF,WAAkB,KAAK;AAEvD,EAAAC,YAAU,MAAM;AACd,UAAM,eAAe,CAAC,YAAmC;AACvD,UAAI,QAAQ,CAAC,EAAE,YAAY,QAAQ,KAAK;AACtC,oBAAY,IAAI;AAAA,MAClB,OAAO;AACL,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,eAAe,YAAY;AAEhD,QAAI,aAAa,SAAS;AACxB,eAAS,QAAQ,aAAa,OAAO;AAAA,IACvC;AAGA,WAAO,MAAM;AACX,UAAI,aAAa,SAAS;AACxB,iBAAS,UAAU,aAAa,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,SACE,gBAAAH,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,KAAK,cAClD,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,qBAAoB,MACtD,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF,GACF;AAEJ;;;AElUA,SAAa,aAAAK,aAAW,YAAAC,kBAAgB;AAqFpC,qBAAAC,YASI,OAAAC,OAsBA,QAAAC,cA/BJ;AAtEJ,IAAM,kBAAkB,CAAC,GAAG,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK,KAAK;AAClE,IAAM,gBAAgB,CAAC,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAE7D,IAAM,eAAsC,CAAC,EAAE,OAAO,MAAM;AACjE,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAkC,SAAS;AACrE,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAiB,CAAC;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,CAAC;AAC1C,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,WAE1D,CAAC,CAAC;AACJ,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,WAEtD,CAAC,CAAC;AACJ,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,EAAAA,YAAU,MAAM;AACd,eAAW,IAAI;AACf,qBAAiB;AAAA,EACnB,GAAG,CAAC,OAAO,OAAO,IAAI,CAAC;AAEvB,WAAS,mBAAmB;AAC1B,UAAM,4BAA4B,gBAAgB,IAAI,CAAC,SAAS;AAAA,MAC9D,CAAC,GAAG,GAAG,GAAG,GACR,UAAU,YACN,SAAS,QAAQ,SAAS,MAAM,OAChC,QAAQ,QAAQ,SAAS,MAAM;AAAA,IACvC,EAAE;AACF,UAAM,0BAA0B,cAAc,IAAI,CAAC,SAAS;AAAA,MAC1D,CAAC,GAAG,GAAG,GAAG,GACR,UAAU,YACN,SAAS,QAAQ,SAAS,MAAM,OAChC,QAAQ,QAAQ,SAAS,MAAM;AAAA,IACvC,EAAE;AACF,8BAA0B,yBAAyB;AACnD,4BAAwB,uBAAuB;AAAA,EACjD;AAEA,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAyB,aAAa;AAE5C,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,WAAW;AAAA;AAAA,QACb;AAAA,QAEA,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,cACL,EAAE,OAAO,EAAE,SAAS,SAAS,MAAM,SAAS,SAAS,EAAE;AAAA,cACvD;AAAA,gBACE,OAAO,EAAE;AAAA,gBACT,SAAS,MAAM,SAAS,WAAW;AAAA,cACrC;AAAA,YACF;AAAA,YACA,UAAU,EAAE,KAAK;AAAA;AAAA,QACnB;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,UACV,KAAK;AAAA,UACL,gBAAgB;AAAA,QAClB;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,KAAK;AAAA,oBACL,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,SAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,gBAClD;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,KAAI;AAAA,gBACtB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,KAAK;AAAA,oBACL,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,gBACjD;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,UACP,KAAK;AAAA,UACL,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,UACV,cAAc;AAAA;AAAA,QAChB;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,UAAU;AAAA,cACZ;AAAA,cAEA,0BAAAC,OAAC,gBAAQ,OAAR,EACC;AAAA,gCAAAA,OAAC,gBAAQ,MAAM,MAAd,EACC;AAAA,kCAAAD,MAAC,gBAAQ,MAAM,UAAd,EAAwB,YAAE,cAAa;AAAA,kBACxC,gBAAAA,MAAC,gBAAQ,MAAM,UAAd,EAAwB,YAAE,QAAO;AAAA,mBACpC;AAAA,gBACA,gBAAAA,MAAC,gBAAQ,MAAM,MAAd,EACE,iCAAuB,IAAI,CAAC,MAAM,UACjC,gBAAAC,OAAC,gBAAQ,MAAM,KAAd,EACC;AAAA,kCAAAD,MAAC,gBAAQ,MAAM,MAAd,EACE,iBAAO,KAAK,IAAI,EAAE,CAAC,GACtB;AAAA,kBACA,gBAAAA,MAAC,gBAAQ,MAAM,MAAd,EACE,iBAAO,OAAO,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,GACnC;AAAA,qBANsB,KAOxB,CACD,GACH;AAAA,iBACF;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,UAAU;AAAA,cACZ;AAAA,cAEA,0BAAAC,OAAC,gBAAQ,OAAR,EACC;AAAA,gCAAAA,OAAC,gBAAQ,MAAM,MAAd,EACC;AAAA,kCAAAD,MAAC,gBAAQ,MAAM,UAAd,EAAwB,YAAE,YAAW;AAAA,kBACtC,gBAAAA,MAAC,gBAAQ,MAAM,UAAd,EAAwB,YAAE,QAAO;AAAA,mBACpC;AAAA,gBACA,gBAAAA,MAAC,gBAAQ,MAAM,MAAd,EACE,+BAAqB,IAAI,CAAC,MAAM,UAC/B,gBAAAC,OAAC,gBAAQ,MAAM,KAAd,EACC;AAAA,kCAAAD,MAAC,gBAAQ,MAAM,MAAd,EACE,iBAAO,KAAK,IAAI,EAAE,CAAC,GACtB;AAAA,kBACA,gBAAAA,MAAC,gBAAQ,MAAM,MAAd,EACE,iBAAO,OAAO,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,GACnC;AAAA,qBANsB,KAOxB,CACD,GACH;AAAA,iBACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEO,SAAS,UAAU,EAAE,QAAQ,OAAO,SAAS,GAAmB;AACrE,SACE,gBAAAA,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAC1C,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,aAAY,MAC9C,0BAAAA,MAAC,gBAAa,QAAgB,GAChC,GACF,GACF;AAEJ;;;ACrOA,SAAS,aAAAI,aAAW,YAAAC,kBAAgB;;;ACQpC,eAAsB,gBACpB,MACA,MACA,aACA,SACA,UACoC;AACpC,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,eAAe,iCAAiC;AAAA,MAC9E,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,MAAM,aAAa,SAAS,SAAS,CAAC;AAAA,IACrE,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,cAAQ,MAAM,2CAA2C,KAAK;AAC9D,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,WAAO,KAAK;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACT;AACF;;;ADkFI,qBAAAC,YA4BQ,OAAAC,OARF,QAAAC,cApBN;AAjGJ,IAAM,kBAAkB;AAAA,EACtB;AAAA,EAAG;AAAA,EAAG;AAAA,EAAG;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACtE;AACF;AAqBO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,CAAC,cAAc,eAAe,IAAIC,WAE9B,IAAI;AACd,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,WAAW,CAAC,CAAC;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAmB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;AACzE,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAsB,aAAa,CAAC,CAAC;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAiB,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAmB,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAIpB,IAAI;AACd,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAClB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,QAAM,YAAY,YAAY;AAC5B,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AACA,iBAAW,WAAW;AAAA,IACxB,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,EAAAA,YAAU,MAAM;AACd,cAAU;AAAA,EACZ,GAAG,CAAC,MAAM,MAAM,aAAa,SAAS,QAAQ,CAAC;AAC/C,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,aAAa;AACvB,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,SAAS;AAAA,QACX;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,iBAAgB;AAAA,sBAClC,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,OAAO,EAAE;AAAA,0BACT;AAAA,0BACA,UAAU;AAAA,0BACV,UAAU;AAAA;AAAA,sBACZ;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,cAAa;AAAA,sBAC/B,gBAAAA,MAAC,gBAAQ,cAAR,EAAqB,YAAwB,UAAU,SAAS;AAAA;AAAA;AAAA,gBACnE;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,aAAY;AAAA,sBAC9B,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,OAAO,YAAY;AAAA,0BACnB,OAAO,aAAa,IAAI,CAAC,UAAU;AAAA,4BACjC,SAAS,KAAK;AAAA;AAAA,4BAEd,OAAO,KAAK;AAAA,0BACd,EAAE;AAAA,0BACF,UAAU,CAAC,UACT;AAAA,4BACE,aAAa,KAAK,CAAC,SAAS,KAAK,UAAU,KAAK;AAAA,0BAClD;AAAA,0BAEF,UAAU,YAAY;AAAA;AAAA,sBACxB;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,SAAQ;AAAA,sBAC1B,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,WAAW,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,sBACxD;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,UAAS;AAAA,sBAC3B,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,OAAO,SAAS,SAAS;AAAA,0BACzB,OAAO,gBAAgB,IAAI,CAAC,SAAS;AAAA,4BACnC,SAAS;AAAA;AAAA,4BAET,OAAO;AAAA,0BACT,EAAE;AAAA,0BACF,UAAU,CAAC,UAAU,YAAY,KAAiB;AAAA,0BAClD,UAAU;AAAA;AAAA,sBACZ;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,UACC,gBAAAA,MAAC,eAAY,IAEb,gBAAAC,OAAC,gBAAQ,kBAAR,EACC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,aAAG,EAAE,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA;AAAA,YAChC;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,mBAAS,MAAM,QAAQ,CAAC;AAAA;AAAA,YAC3B;AAAA;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,aACE,OAAO,2BAA2B,OAAO;AAAA,YAC3C,OAAO;AAAA,UACT;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,aAAG,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,YAClC;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,mBAAS,YAAY,QAAQ,CAAC;AAAA;AAAA,YACjC;AAAA;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,aACE,OAAO,2BAA2B,OAAO;AAAA,YAC3C,OAAO;AAAA,UACT;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,aAAG,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,YAClC;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,mBAAS,iBAAiB,QAAQ,CAAC;AAAA;AAAA,YACtC;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAA0B;AACxB,SACE,gBAAAA,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAC1C,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,oBAAmB,MACrD,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF,GACF;AAEJ;;;AE3XA,SAAS,aAAAI,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AA4NxC,qBAAAC,YAYM,OAAAC,OAVF,QAAAC,cAFJ;AAnNJ,SAAS,aAAa,GAAW,GAAW,GAAW,GAAW;AAChE,QAAM,SAAiC;AAAA,IACrC,SAAS;AAAA,MACP,IAAI,WAAY;AACd,gBAAQ,IAAI,IAAI,KAAK;AAAA,MACvB;AAAA,MACA,IAAI,WAAY;AACd,eAAO,IAAI,OAAO,QAAQ,GAAG,IAAI;AAAA,MACnC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,IAAI,OAAO,QAAQ,GAAG,IAAI;AAAA,MACnC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,QAAQ,GAAG,IAAI,IAAI;AAAA,MACnC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,QAAQ,GAAG,IAAI,IAAI;AAAA,MACnC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,IAAI,KAAK,OAAO,QAAQ,GAAG,IAAI;AAAA,MACxC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,IAAI,KAAK,IAAI,OAAO,QAAQ,GAAG;AAAA,MACxC;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,IAAI,WAAY;AACd,gBAAQ,IAAI,IAAI,IAAI,KAAK;AAAA,MAC3B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,IAAI,OAAO,OAAO,GAAG,IAAI;AAAA,MAClC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,MAClC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,IAAI,OAAO,OAAO,GAAG,IAAI;AAAA,MAClC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,KAAK,IAAI,MAAM,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,WAAY;AACb,YAAI,IAAI,GAAG;AACT,iBAAO,IAAI,IAAI,IAAI;AAAA,QACrB,WAAW,IAAI,GAAG;AAChB,iBAAO,IAAI,IAAI,IAAI;AAAA,QACrB,OAAO;AACL,iBAAO,IAAI,IAAI,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,OAAO,EAAE,IAAI,IAAI;AAAA,MACjC;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,OAAO,EAAE,IAAI;AAAA,MAC7B;AAAA,MACA,IAAI,WAAY;AACd,eAAO,OAAO,OAAO,EAAE,IAAI,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CACjB,UACA,OACA,SACG;AACH,QAAM,MAAM;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,OAAO,MAAM;AACnB,SAAO,SAAS,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK;AACvC;AAYO,SAAS,UAAU,EAAE,QAAQ,QAAQ,GAAkB;AAC5D,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,WAAW,YAAY,IAAIA,WAEhC,SAAS;AAEX,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,CAAC;AAC1C,QAAM,CAAC,KAAK,MAAM,IAAIA,WAAiB,CAAC;AACxC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,CAAC;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAiB,CAAC;AAG5C,QAAM,CAAC,YAAY,aAAa,IAAIA,WAElC,IAAI;AAEN,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAClB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,EAAAA,YAAU,MAAM;AACd,QAAI,cAAc;AAChB,YAAMC,KAAI,aAAa;AACvB,sBAAgBA,EAAC;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,cAAc,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AAEpD,WAAS,gBAAgBA,IAAqB;AAC5C,QAAI;AAEF,YAAM,WAAW,aAAa,MAAM,KAAK,MAAM,KAAK;AACpD,YAAM,gBAA6C;AAAA,QACjD;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,QACA;AAAA,UACE,CAACA,GAAE,OAAO,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK;AAAA,QACpE;AAAA,MACF;AACA,oBAAc,aAAa;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,aAAa;AACvB,SACE,gBAAAH,OAAAF,YAAA,EACG;AAAA,cACC,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,WAAW;AAAA;AAAA,QACb;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAAC,gBAAQ;AAAA,YAAR;AAAA,cACC,OAAO;AAAA,gBACL;AAAA,kBACE,OAAO,EAAE;AAAA,kBACT,SAAS,MAAM,aAAa,SAAS;AAAA,gBACvC;AAAA,gBACA;AAAA,kBACE,OAAO,EAAE;AAAA,kBACT,SAAS,MAAM,aAAa,QAAQ;AAAA,gBACtC;AAAA,cACF;AAAA,cACA,UAAU,EAAE,SAAS;AAAA;AAAA,UACvB;AAAA,UACA,gBAAAA;AAAA,YAAC,gBAAQ;AAAA,YAAR;AAAA,cACC,OAAO;AAAA,gBACL;AAAA,kBACE,OAAO,EAAE;AAAA,kBACT,SAAS,MAAM,aAAa,WAAW;AAAA,gBACzC;AAAA,gBACA;AAAA,kBACE,OAAO,EAAE;AAAA,kBACT,SAAS,MAAM,aAAa,QAAQ;AAAA,gBACtC;AAAA,cACF;AAAA,cACA,UAAU,EAAE,SAAS;AAAA;AAAA,UACvB;AAAA;AAAA;AAAA,IACF,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,WAAW;AAAA;AAAA,QACb;AAAA,QAEA,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,cACL;AAAA,gBACE,OAAO,EAAE;AAAA,gBACT,SAAS,MAAM,aAAa,SAAS;AAAA,cACvC;AAAA,cACA;AAAA,gBACE,OAAO,EAAE;AAAA,gBACT,SAAS,MAAM,aAAa,QAAQ;AAAA,cACtC;AAAA,cACA;AAAA,gBACE,OAAO,EAAE;AAAA,gBACT,SAAS,MAAM,aAAa,WAAW;AAAA,cACzC;AAAA,cACA;AAAA,gBACE,OAAO,EAAE;AAAA,gBACT,SAAS,MAAM,aAAa,QAAQ;AAAA,cACtC;AAAA,YACF;AAAA,YACA,UAAU,EAAE,SAAS;AAAA;AAAA,QACvB;AAAA;AAAA,IACF;AAAA,IAGF,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,sBACvB,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,sBACjD;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,KAAI;AAAA,sBACtB,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,sBAChD;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,sBACvB,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,sBACjD;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,KAAK;AAAA,oBACP;AAAA,oBAEA;AAAA,sCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,OAAM;AAAA,sBACxB,gBAAAA;AAAA,wBAAC,gBAAQ;AAAA,wBAAR;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,SAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,sBAClD;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAEC,cACC,gBAAAA,MAAC,gBAAQ,OAAR,EACC,0BAAAA,MAAC,gBAAQ,MAAM,MAAd,EACE,qBAAW,IAAI,CAAC,MAAM,UACrB,gBAAAC,OAAC,gBAAQ,MAAM,KAAd,EACC;AAAA,4BAAAD,MAAC,gBAAQ,MAAM,MAAd,EAAmB,UAAQ,MACzB,iBAAO,KAAK,IAAI,EAAE,CAAC,GACtB;AAAA,YACA,gBAAAA,MAAC,gBAAQ,MAAM,MAAd,EACE,iBAAO,OAAO,IAAI,EAAE,CAAC,GACxB;AAAA,eANsB,KAOxB,CACD,GACH,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;AAEO,SAAS,OAAO,EAAE,QAAQ,OAAO,SAAS,GAAe;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAIE,WAAkB,KAAK;AACrD,QAAM,eAAeG,SAAuB,IAAI;AAEhD,EAAAF,YAAU,MAAM;AACd,UAAM,eAAe,CAAC,YAAmC;AACvD,UAAI,CAAC,QAAQ,OAAQ;AACrB,UAAI,QAAQ,CAAC,EAAE,YAAY,QAAQ,KAAK;AACtC,mBAAW,IAAI;AAAA,MACjB,OAAO;AACL,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,eAAe,YAAY;AAEhD,QAAI,aAAa,SAAS;AACxB,eAAS,QAAQ,aAAa,OAAO;AAAA,IACvC,OAAO;AACL,cAAQ,KAAK,sDAAsD;AAAA,IACrE;AAEA,WAAO,MAAM;AACX,UAAI,aAAa,SAAS;AACxB,iBAAS,UAAU,aAAa,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,SACE,gBAAAH,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,KAAK,cAClD,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,UAAS,MAC3C,0BAAAA,MAAC,aAAU,QAAgB,SAAkB,GAC/C,GACF,GACF;AAEJ;;;ACvbA,SAAS,aAAAM,aAAW,YAAAC,kBAAgB;AAuFhC,qBAAAC,YASI,OAAAC,OAkBA,QAAAC,cA3BJ;AAnEG,SAAS,sBAAsB,EAAE,OAAO,GAA+B;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAIC,WAE9B,IAAI;AACd,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAyB,KAAK;AAE5D,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAiB,CAAC;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAiB,CAAC;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,CAAC;AAC1C,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,CAAC;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAiB,CAAC;AAE5C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwB,IAAI;AAExD,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAClB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,WAAS,kBAAkB;AACzB,UAAM,iBAAiB,OAAO;AAC9B,UAAM,kBAAkB,QAAQ;AAChC,UAAM,sBAAsB,YAAY;AAExC,UAAM,WACH,YAAY,QACT,iBAAiB,sBACjB,sBAAsB,kBAC1B,SACA;AACF,UAAM,aACH,YAAY,QACT,kBAAkB,sBAClB,sBAAsB,mBAC1B,SACA;AAEF,cAAU,EAAE,SAAS,UAAU,CAAC;AAAA,EAClC;AAEA,EAAAA,YAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,SAAS,MAAM,OAAO,WAAW,QAAQ,IAAI,CAAC;AAElD,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,aAAa;AACvB,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,WAAW;AAAA;AAAA,QACb;AAAA,QAEA,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,cACL,EAAE,OAAO,EAAE,KAAK,SAAS,MAAM,WAAW,KAAK,EAAE;AAAA,cACjD,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW,MAAM,EAAE;AAAA,YACrD;AAAA,YACA,UAAU,YAAY,QAAQ,EAAE,MAAM,EAAE;AAAA;AAAA,QAC1C;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,aAAa,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACxD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,OAAM;AAAA,gBACxB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,UAAU,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACrD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,QAAQ,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACnD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,QAAQ,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACnD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,OAAM;AAAA,gBACxB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,SAAS,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACpD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,UACC,gBAAAC,OAAC,gBAAQ,kBAAR,EACC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,YACT,KAAK;AAAA;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,iBAAO,QAAQ,QAAQ,CAAC;AAAA;AAAA,YAC3B;AAAA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,aACE,OAAO,2BAA2B,OAAO;AAAA,YAC3C,OAAO;AAAA,UACT;AAAA;AAAA,MACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,YACT,KAAK;AAAA;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,iBAAO,UAAU,QAAQ,CAAC;AAAA;AAAA,YAC7B;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,OAAO;AACT,GAA4B;AAC1B,SACE,gBAAAA,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAC1C,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,sBAAqB,MACvD,0BAAAA,MAAC,yBAAsB,QAAgB,GACzC,GACF,GACF;AAEJ;;;ACvRA,SAAS,aAAAI,aAAW,YAAAC,kBAAgB;AAsFhC,qBAAAC,YASI,OAAAC,OAkBA,QAAAC,cA3BJ;AAhEG,SAAS,4BAA4B;AAAA,EAC1C;AACF,GAAqC;AACnC,QAAM,CAAC,cAAc,eAAe,IAAIC,WAE9B,IAAI;AACd,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAyB,KAAK;AAC5D,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAiB,CAAC;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAiB,CAAC;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAiB,CAAC;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAiB,CAAC;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAiB,CAAC;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwB,IAAI;AAExD,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAClB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,EAAAA,YAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,SAAS,QAAQ,QAAQ,WAAW,QAAQ,IAAI,CAAC;AAErD,WAAS,kBAAkB;AACzB,UAAM,sBAAsB,YAAY;AAExC,UAAM,aAAa,UAAU,SAAS;AACtC,UAAM,cACH,YAAY,QACT,sBAAsB,aACtB,sBAAsB,cAAc;AAC1C,UAAM,eAAe,UAAU,SAAS;AACxC,UAAM,gBACH,YAAY,QACT,sBAAsB,eACtB,sBAAsB,gBAAgB;AAC5C,UAAM,eAAe,KAAK,MAAM,aAAa,aAAa,CAAC;AAC3D,UAAM,iBAAiB,KAAK,MAAM,eAAe,eAAe,CAAC;AAEjE,cAAU,EAAE,YAAY,cAAc,cAAc,eAAe,CAAC;AAAA,EACtE;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,aAAa;AACvB,SACE,gBAAAF,OAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,WAAW;AAAA;AAAA,QACb;AAAA,QAEA,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,OAAO;AAAA,cACL,EAAE,OAAO,EAAE,KAAK,SAAS,MAAM,WAAW,KAAK,EAAE;AAAA,cACjD,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW,MAAM,EAAE;AAAA,YACrD;AAAA,YACA,UAAU,YAAY,QAAQ,EAAE,MAAM,EAAE;AAAA;AAAA,QAC1C;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,aAAa,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACxD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,OAAM;AAAA,gBACxB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,UAAU,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACrD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,QAAQ,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACnD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,UAAU,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACrD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAD,MAAC,gBAAQ,OAAR,EAAe,YAAE,MAAK;AAAA,gBACvB,gBAAAA;AAAA,kBAAC,gBAAQ;AAAA,kBAAR;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,UAAU,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,oBACrD,KAAK;AAAA;AAAA,gBACP;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IACC,UACC,gBAAAC,OAAC,gBAAQ,kBAAR,EACC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,YACT,KAAK;AAAA;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,iBAAO,WAAW,QAAQ,CAAC;AAAA;AAAA,YAC9B;AAAA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,aACE,OAAO,2BAA2B,OAAO;AAAA,YAC3C,OAAO;AAAA,UACT;AAAA;AAAA,MACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,YACT,KAAK;AAAA;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,iBAAO,aAAa,QAAQ,CAAC;AAAA;AAAA,YAChC;AAAA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,aACE,OAAO,2BAA2B,OAAO;AAAA,YAC3C,OAAO;AAAA,UACT;AAAA;AAAA,MACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,YACT,KAAK;AAAA;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,iBAAO,aAAa,QAAQ,CAAC;AAAA;AAAA,YAChC;AAAA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,aACE,OAAO,2BAA2B,OAAO;AAAA,YAC3C,OAAO;AAAA,UACT;AAAA;AAAA,MACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS;AAAA;AAAA,YACT,KAAK;AAAA;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UACE,OAAO,+BAA+B,OAAO;AAAA,kBAC/C,YACE,OAAO,+BAA+B,OAAO;AAAA,gBACjD;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO,OAAO,sBAAsB,OAAO;AAAA,kBAC3C,UAAU,OAAO,qBAAqB,OAAO;AAAA,kBAC7C,YAAY,OAAO,qBAAqB,OAAO;AAAA,gBACjD;AAAA,gBAEC,iBAAO,eAAe,QAAQ,CAAC;AAAA;AAAA,YAClC;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,OAAO;AACT,GAAkC;AAChC,SACE,gBAAAA,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAC1C,0BAAAA;AAAA,IAAC,gBAAQ;AAAA,IAAR;AAAA,MACC,YAAW;AAAA,MACX;AAAA,MAEA,0BAAAA,MAAC,+BAA4B,QAAgB;AAAA;AAAA,EAC/C,GACF,GACF;AAEJ;;;ACjWA,SAAS,aAAAI,aAAW,WAAAC,UAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACCrD,eAAsB,yBAAyB,MAAoD;AAC/F,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,IACjC,CAAC;AACD,UAAM,cAAwD,MAAM,SAAS,KAAK;AAElF,QAAI,CAAC,SAAS,MAAO,WAAW,aAAc;AAC1C,UAAI,WAAW,aAAa;AACxB,cAAM,IAAI,MAAM,gBAAgB,YAAY,KAAK;AAAA,MACrD;AACA,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAEA,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACX;AACJ;;;ACtBO,SAAS,oBAAoB,MAAc,cAAqC;AACnF,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,kBAAkB,gBAAgB,KAAK,YAAY,KAAK,iBAAiB,KAAK,YAAY;AAGhG,MAAI,SAAwB;AAE5B,MAAI,iBAAiB;AACjB,aAAS,mBAAmB,YAAY;AAAA,EAC5C,OAAO;AACH,QAAI;AAGA,eAAS,IAAK,KAAa,OAAO,YAAY,EAAE,SAAS,EAAE,UAAU;AAAA,IACzE,QAAQ;AACJ,eAAS;AAAA,IACb;AAAA,EACJ;AAEA,MAAI,CAAC,OAAQ,QAAO;AAOpB,MAAI;AACJ,UAAQ,QAAQ;AAAA,IACZ,KAAK;AACD,cAAQ;AACR;AAAA,IACJ,KAAK;AACD,cAAQ;AACR;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AACD,cAAQ;AACR;AAAA,IACJ;AAEI,cAAQ,IAAI,OAAO,cAAc,MAAM,KAAK,GAAG;AAAA,EACvD;AAEA,aAAW,MAAM,MAAM;AACnB,QAAI,MAAM,KAAK,EAAE,EAAG,QAAO;AAAA,EAC/B;AACA,SAAO;AACX;AAEA,SAAS,mBAAmB,OAA8B;AAEtD,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,EAAG,QAAO;AAGf,MAAI,gBAAgB,KAAK,CAAC,GAAG;AACzB,WAAO,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,EAChE;AAIA,SAAO,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY;AAChE;;;AFyHW,qBAAAC,YAAA,OAAAC,OAiGK,QAAAC,cAjGL;AAtKX,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,YAAY,EAAE,QAAQ,eAAe,GAA0B;AAC7E,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAwC,OAAO;AAE3E,QAAM,CAAC,aAAa,cAAc,IAAIA;AAAA,IACpC;AAAA,EACF;AACA,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAiB,EAAE;AAC3D,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAiB,CAAC;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAiB,EAAE;AAE3D,EAAAC,YAAU,MAAM;AACd,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,cAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,cAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AACrE,wBAAgB,WAAW;AAAA,MAC7B,SAAS,OAAO;AACd,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK;AAAA,UACX,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,WAAW,CAAC;AAEpC,QAAM,QAAQ,CAAC,EAAE,gBAAgB;AAEjC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,MAAO;AAEZ,UAAM,QAAQ,MAAM;AAClB,UAAI,gBAAgB;AACpB,eAAS,OAAO,GAAG,QAAQ,GAAG,QAAQ;AACpC,wBAAgB;AAChB,cAAM,mBACJ,uBAAuB,KAAK,KAAK,QAAQ,SAAS,IAAI,IAAI;AAC5D,YAAI,kBAAkB,kBAAkB;AACtC;AAAA,QACF;AAAA,MACF;AACA,oBAAc,aAAa;AAAA,IAC7B;AAEA,UAAM;AAAA,EACR,GAAG,CAAC,OAAO,cAAc,CAAC;AAE1B,EAAAA,YAAU,MAAM;AACd,UAAM,YAAY,YAAY;AAC5B,gBAAU,SAAS;AACnB,YAAM,SAAS,MAAM,yBAAyB,OAAO,IAAI;AACzD,UAAI,CAAC,QAAQ;AACX,kBAAU,OAAO;AACjB;AAAA,MACF;AACA,qBAAe,MAAM;AACrB,gBAAU,OAAO;AAAA,IACnB;AAEA,cAAU;AAAA,EACZ,GAAG,CAAC,OAAO,IAAI,CAAC;AAGhB,QAAM,WAAWC;AAAA,IACf,MACE,IAAI,KAAK,SAAS,cAAc,YAAY,CAAC,EAAE,OAAO,MAAM;AAAA,MAC1D,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACH,CAAC,WAAW;AAAA,EACd;AACA,QAAM,YAAYA;AAAA,IAChB,MACE,IAAI,KAAK,UAAU,cAAc,YAAY,CAAC,EAAE,OAAO,MAAM;AAAA,MAC3D,aAAa;AAAA,IACf,CAAC;AAAA,IACH,CAAC,WAAW;AAAA,EACd;AACA,QAAM,WAAWA;AAAA,IACf,MAAO,cAAc,gBAAgB,IAAI,YAAY,CAAC,EAAE,IAAI,IAAI;AAAA,IAChE,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,cAAc,CAAC,MAAsB;AACzC,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,KAAK,UAAU,QAAQ,EAAE,UAAU,KAAK,CAAC,EAAE,OAAO,QAAQ,EAAE;AAClE,UAAM,QAAQ,GAAG,KAAK,EAAE,OAAO,WAAW;AAC1C,WAAO,MAAM,kBAAkB,OAAO,KAAK,YAAY,CAAC;AAAA,EAC1D;AAGA,QAAM,YAAY,CAAC,MACjB,GACI,UAAU,MAAM,EACjB,QAAQ,mBAAmB,EAAE,EAC7B,kBAAkB,OAAO,KAAK,YAAY,CAAC,KAAK;AAGrD,QAAM,UAAUA,SAAQ,MAAM;AAC5B,UAAM,MAAM,oBAAI,IAAY;AAC5B,QAAI,CAAC,YAAa,QAAO,CAAC;AAC1B,QAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AACtC,QAAI,UAAU;AACZ,iBAAW,cAAc,aAAa;AACpC,cAAM,KAAK,oBAAoB,WAAW,OAAO,YAAY,CAAC,EAAE,IAAI;AACpE,YAAI,GAAI,KAAI,IAAI,EAAE;AAAA,MACpB;AAAA,IACF,OAAO;AACL,iBAAW,cAAc;AACvB,YAAI,IAAI,YAAY,WAAW,KAAK,CAAC;AAAA,IACzC;AACA,WAAO,MAAM,KAAK,GAAG,EAAE,KAAK,SAAS,OAAO;AAAA,EAC9C,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,EAAAD,YAAU,MAAM;AACd,QAAI,CAAC,eAAe,QAAQ,WAAW,EAAG;AAG1C,QAAI,CAAC,gBAAgB,CAAC,QAAQ,SAAS,YAAY,GAAG;AACpD,sBAAgB,QAAQ,CAAC,CAAC;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,aAAa,OAAO,CAAC;AAGzB,QAAM,UAAUC,SAAQ,MAAM;AAC5B,QAAI,CAAC,YAAa,QAAO,CAAC;AAE1B,UAAM,IAAI,aAAa,KAAK;AAC5B,UAAM,OAAO,eACT,YAAY;AAAA,MAAO,CAAC,MAClB,WACI,oBAAoB,EAAE,OAAO,YAAY,CAAC,EAAE,IAAI,MAAM,eACtD,YAAY,EAAE,KAAK,MAAM;AAAA,IAC/B,IACA;AAEJ,QAAI,CAAC,EAAG,QAAO;AAEf,UAAM,KAAK,UAAU,CAAC;AACtB,WAAO,KAAK,OAAO,CAAC,MAAM,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAAA,EAC3D,GAAG,CAAC,aAAa,cAAc,YAAY,CAAC;AAE5C,MAAI,CAAC,OAAO;AACV,WAAO,gBAAAJ,MAAAD,YAAA,EAAE;AAAA,EACX;AAEA,QAAM,qBAAqB,CAAC,MAA2C;AACrE,UAAM,MAAM,EAAE,OAAO;AACrB,QAAI,IAAI,WAAW,GAAG;AACpB,sBAAgB,IAAI,kBAAkB,OAAO,KAAK,YAAY,CAAC,CAAC;AAAA,IAClE;AACA,oBAAgB,GAAG;AAAA,EACrB;AAEA,QAAM,IAAI,aAAa;AAEvB,QAAM,gBAAqC;AAAA,IACzC,OAAO,OAAO,yBAAyB,OAAO;AAAA,IAC9C,YAAY;AAAA,EACd;AACA,QAAM,eAAoC;AAAA,IACxC,OACE,OAAO,uBACP,oBAAoB,OAAO,iBAAiB,EAAE;AAAA,IAChD,YAAY;AAAA,EACd;AACA,QAAM,4BAAiD;AAAA,IACrD,OAAO;AAAA,EACT;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,KAAK;AAAA,MACP;AAAA,MACA,KACE,YAAY,CAAC,GAAG,SAAS,QAAQ,YAAY,CAAC,GAAG,SAAS,OACtD,QACA;AAAA,MAIN;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,eAAe;AAAA,cACf,KAAK;AAAA,cACL,OAAO;AAAA,YACT;AAAA,YAEC,gBAAM,KAAK,EAAE,QAAQ,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,aAAa;AACvD,oBAAM,QAAQ,KAAK,MAAO,QAAQ,SAAS,aAAc,QAAQ;AACjE,oBAAM,MAAM,KAAK;AAAA,gBACd,QAAQ,SAAS,cAAe,WAAW;AAAA,cAC9C;AACA,oBAAM,aAAa,QAAQ,MAAM,OAAO,GAAG;AAC3C,qBACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO,WAAW,IAAI,CAAC,OAAO;AAAA,oBAC5B,OAAO;AAAA,oBACP,SAAS,MAAM,gBAAgB,CAAC;AAAA,kBAClC,EAAE;AAAA,kBACF,UAAU,gBAAgB;AAAA;AAAA,gBALrB;AAAA,cAMP;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA,QAGA,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,iBAAiB,MAAM,SAAS,OAAO,GAC1D,0BAAAA;AAAA,UAAC,gBAAQ;AAAA,UAAR;AAAA,YACC,UAAU;AAAA,YACV,OAAO;AAAA,YACP,aAAa,EAAE;AAAA;AAAA,QACjB,GACF;AAAA,QAGA,gBAAAA,MAAC,SAAI,OAAO,2BACT,qBAAW,YACV,gBAAAA,MAAC,eAAY,IACX,WAAW,UACb,gBAAAA,MAAC,SAAK,wCAA6B,IACjC,WAAW,QAAQ,WAAW,IAChC,gBAAAA,MAAC,SAAK,YAAE,WAAU,IAElB,WACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,eAAe;AAAA,cACf,KAAK;AAAA,YACP;AAAA,YAEC,kBAAQ,IAAI,CAAC,MAAM,MAClB,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,eAAe;AAAA,gBACjB;AAAA,gBAEA;AAAA,kCAAAD,MAAC,UAAK,OAAO,eAAgB,eAAK,OAAM;AAAA,kBACxC,gBAAAA,MAAC,UAAK,OAAO,cAAe,eAAK,YAAW;AAAA;AAAA;AAAA,cAPvC;AAAA,YAQP,CACD;AAAA;AAAA,QACH,GAGN;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,SAAS,EAAE,QAAQ,OAAO,SAAS,GAAuB;AACxE,QAAM,eAAeK,SAAuB,IAAI;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIH,WAAS,CAAC;AAEtD,EAAAC,YAAU,MAAM;AACd,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AAET,UAAM,KAAK,IAAI,eAAe,CAAC,YAAY;AACzC,YAAM,IAAI,QAAQ,CAAC,EAAE,YAAY;AACjC,wBAAkB,CAAC;AAAA,IACrB,CAAC;AAED,OAAG,QAAQ,EAAE;AACb,sBAAkB,GAAG,sBAAsB,EAAE,KAAK;AAGlD,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,SACE,gBAAAH,MAAC,mBAAQ,OAAO,QACd,0BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,KAAK,cAClD,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,YAAW,MAC7C,0BAAAA,MAAC,eAAY,QAAgB,gBAAgC,GAC/D,GACF,GACF;AAEJ;;;AGhVA,SAAS,eAAAM,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACGzD,IAAM,eAAe,GAAG,eAAe;AAEvC,eAAsB,kBAAkB,MAAc,OAAe,MAAc,UAAyB,SAAiD;AACzJ,QAAM,MAAM;AAEZ,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,OAAO,MAAM,UAAU,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC,EAAG,CAAC;AAAA,IACjG,CAAC;AACD,UAAM,WAA8C,MAAM,SAAS,KAAK;AAExE,QAAI,CAAC,SAAS,MAAO,WAAW,UAAW;AACvC,UAAI,WAAW,UAAU;AACrB,cAAM,IAAI,MAAM,gBAAgB,SAAS,KAAK;AAAA,MAClD;AACA,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAEA,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,gBAAgB,KAAK;AACnC,WAAO;AAAA,EACX;AACJ;;;ACeM,gBAAAC,OAmBI,QAAAC,cAnBJ;AAzCN,IAAM,cAAc;AAIpB,IAAM,aAAa,CAAC,MAAmB,GAAG,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,EAAE,IAAI;AAE5E,SAAS,YAAY,SAAsB,KAAmC;AAC5E,QAAM,OAAO,oBAAI,IAAI,CAAC,WAAW,OAAO,CAAC,CAAC;AAC1C,QAAM,SAAS,IAAI,OAAO,CAAC,MAAM;AAC/B,UAAM,MAAM,WAAW,CAAC;AACxB,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AAED,QAAM,eAAe,OAAO,OAAO,CAAC,MAAM,EAAE,iBAAiB,QAAQ,YAAY;AACjF,QAAM,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,iBAAiB,QAAQ,YAAY;AACzE,SAAO,CAAC,GAAG,cAAc,GAAG,IAAI,EAAE,MAAM,GAAG,WAAW;AACxD;AAEO,IAAM,kBAKR,CAAC,EAAE,SAAS,aAAa,gBAAgB,SAAS,MAAM;AAC3D,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,QAAM,UAAU,YAAY,SAAS,WAAW;AAChD,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,WAAW,iBAAiB;AAElC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW,aAAa,oBAAoB,MAAM,iBAAiB,EAAE,CAAC;AAAA,MACxE;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,UAAU,iBAAiB,MAAM,WAAW;AAAA,cAC5C,YAAY;AAAA,cACZ,OAAO,MAAM;AAAA,YACf;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,qBAAqB,WAAW,QAAQ;AAAA,cACxC,KAAK;AAAA,YACP;AAAA,YAEC,kBAAQ,IAAI,CAAC,SAAS,MACrB,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM,SAAS,OAAO;AAAA,gBAE/B;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,iBAAiB;AAAA,sBACnB;AAAA,sBAEA,0BAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK,QAAQ;AAAA,0BACb,KAAK,QAAQ;AAAA,0BACb,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA;AAAA,sBAC7D;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,WAAW;AAAA,wBACX,YAAY;AAAA,wBACZ,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO,MAAM;AAAA,sBACf;AAAA,sBAEC,kBAAQ;AAAA;AAAA,kBACX;AAAA,kBAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,WAAW;AAAA,wBACX,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO,oBAAoB,MAAM,iBAAiB,EAAE;AAAA,wBACpD,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,iBAAiB;AAAA,wBACjB,UAAU;AAAA,sBACZ;AAAA,sBAEC,kBAAQ;AAAA;AAAA,kBACX;AAAA;AAAA;AAAA,cA9CK,GAAG,QAAQ,QAAQ,IAAI,CAAC;AAAA,YA+C/B,CACD;AAAA;AAAA,QACH;AAAA,QAEA,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAYN;AAAA;AAAA;AAAA,EACJ;AAEJ;;;ACtCI,qBAAAE,YAIQ,OAAAC,OADF,QAAAC,cAHN;AAxFG,IAAM,UAOR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,sBAA2C;AAAA,IAC/C,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,OAAO,MAAM,mBAAmB;AAAA,IAChC,YAAY;AAAA,EACd;AAEA,QAAM,qBAA0C;AAAA,IAC9C,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,EACP;AAEA,QAAM,gBAAqC;AAAA,IACzC,QAAQ;AAAA,IACR,OAAO,MAAM;AAAA,IACb,YAAY;AAAA,IACZ,UACE,iBAAiB,MACb,WACA,iBAAiB,MACf,SACA,iBAAiB,OACf,WACA;AAAA,EACZ;AAEA,QAAM,mBAAwC;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO,MAAM,uBAAuB,MAAM;AAAA,IAC1C,UACE,iBAAiB,MACb,aACA,iBAAiB,MACf,SACA,iBAAiB,OACf,aACA;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAEA,QAAM,oBAAyC;AAAA,IAC7C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,IACd,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AAEA,QAAMC,gBAAoC;AAAA,IACxC,UACE,iBAAiB,MACb,SACA,iBAAiB,MACf,aACA,iBAAiB,OACf,YACA;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA;AAAA,EACZ;AAEA,SACE,gBAAAD,OAAAF,YAAA,EACE;AAAA,oBAAAE,OAAC,SAAI,OAAO,qBACV;AAAA,sBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,gBAAgB,GAC7D;AAAA,wBAAAA,OAAC,SAAI,OAAO,oBACV;AAAA,0BAAAD,MAAC,QAAG,OAAO,eAAgB,kBAAQ,UAAS;AAAA,UAC5C,gBAAAA,MAAC,QAAG,OAAO,kBAAmB,kBAAQ,aAAY;AAAA,WACpD;AAAA,QACA,gBAAAA,MAAC,SACC,0BAAAA,MAAC,YAAO,WAAU,gBAAe,SAAS,cAAc,oBAExD,GACF;AAAA,SACF;AAAA,MAEA,gBAAAC,OAAC,SAAI,OAAOC,eACV;AAAA,wBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ;AAAA,YACb,KAAK,QAAQ;AAAA,YACb,OAAO;AAAA;AAAA,QACT;AAAA,SACE,MAAM;AACN,gBAAM,OAAO,QAAQ,aAAa,KAAK,KAAK,QAAQ;AACpD,gBAAM,aAAa,KAChB,MAAM,SAAS,EACf,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,iBAAO,WAAW,IAAI,CAAC,GAAG,MACxB,gBAAAA,MAAC,OAAU,OAAO,EAAE,QAAQ,MAAM,IAAI,IAAI,WAAW,GAClD,eADK,CAER,CACD;AAAA,QACH,GAAG;AAAA,SACL;AAAA,MAEC,eAAe,mBACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,UAAU;AAAA;AAAA,MACZ;AAAA,OAEJ;AAAA,IACA,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAUe,oBAAoB,MAAM,mBAAmB,QAAQ,EAAE,CAAC;AAAA;AAAA,eAEvE;AAAA,KACV;AAEJ;;;ACvJA,SAAS,WAAAG,iBAAe;;;ACExB,SAAS,aAAAC,aAAW,YAAAC,kBAAgB;AAiD5B,qBAAAC,YACE,OAAAC,OADF,QAAAC,cAAA;AA/CD,IAAM,gBAAyE,CAAC,EAAE,MAAM,UAAU,MAAM;AAC7G,QAAM,CAAC,SAAS,UAAU,IAAIH,WAAS,QAAQ,IAAI,CAAC;AAEpD,EAAAD,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,iBAAW,KAAK;AAChB;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,iBAAW,IAAI;AACf;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,KAAK,SAAS,EAAE,QAAQ,IAAI,KAAK,IAAI;AAC7D,QAAI,eAAe,GAAG;AACpB,iBAAW,KAAK;AAChB;AAAA,IACF;AAEA,eAAW,IAAI;AACf,UAAM,UAAU,OAAO,WAAW,MAAM,WAAW,KAAK,GAAG,WAAW;AACtE,WAAO,MAAM,OAAO,aAAa,OAAO;AAAA,EAC1C,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,MAEC;AAAA,gBACC,gBAAAA,OAAAF,YAAA,EACE;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,WAAW;AAAA,cACb;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA,MAAC,WAAO,0IAA+H;AAAA,WACzI;AAAA,QACA;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AD1DI,gBAAAE,OA8FE,QAAAC,cA9FF;AAFJ,IAAM,WAAqD,CAAC,EAAE,KAAK,MAAM,MAAM;AAC7E,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,WAAW;AAAA,QACX,OAAO,oBAAoB,OAAO,EAAE;AAAA,QACpC,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,MACA,OAAO;AAAA,MAEN;AAAA;AAAA,EACH;AAEJ;AAEA,IAAM,YAID,CAAC,EAAE,UAAU,OAAO,SAAS,aAAa,MAAM;AACnD,QAAM,cAAc,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACvD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MAEC,oCAA0B,aAAa,MAAM;AAAA;AAAA,EAChD;AAEJ;AAEO,IAAM,iBASR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,QAAM,YAAYE,UAAQ,MAAM;AAC9B,UAAM,QAAQ;AACd,UAAM,yBAAyB,MAAM,aAAa,QAAQ,OAAO,EAAE;AACnE,WAAO,CAAC,CAAC,OAAO,sBAAsB;AAAA,EACxC,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,SACE,gBAAAD,OAAC,SAAI,WAAU,6BAA4B,SACzC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,cAAc,sBAAsB,YAAY,QAAQ;AAAA,UACxD,iBAAiB;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,QAClB;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ;AAAA,YACb,KAAK,QAAQ;AAAA,YACb,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,YACb;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,OAAO,MAAM;AAAA,gBACb,cAAc;AAAA,gBACd,YAAY,iBAAiB,MAAM,MAAM;AAAA,gBACzC,UACE,iBAAiB,MACb,SACA,iBAAiB,MACf,YACA,iBAAiB,OACf,WACA;AAAA,cACZ;AAAA,cACA,OAAO,QAAQ;AAAA,cAEd,kBAAQ;AAAA;AAAA,UACX;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS,kBAAkB,UAAU;AAAA,gBACrC,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,OAAO,MAAM;AAAA,gBACb,YAAY,iBAAiB,MAAM,MAAM;AAAA,gBACzC,UACE,iBAAiB,MACb,YACA,iBAAiB,MACf,aACA,iBAAiB,OACf,SACA;AAAA,cACZ;AAAA,cACA,OAAO,QAAQ;AAAA,cAEd,kBAAQ;AAAA;AAAA,UACX;AAAA,UAEC,QAAQ,cAAc,QAAQ,UAC7B,gBAAAA,MAAC,iBAAc,MAAI,MAAC,WAAW,QAAQ,mBAAmB;AAAA,UAE3D,aAAa,gBAAAA,MAAC,YAAS,KAAK,QAAQ,KAAK,OAAO,UAAU;AAAA,UAE1D,YACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,QAAQ;AAAA,cAClB,OAAO,oBAAoB,MAAM,iBAAiB,EAAE;AAAA;AAAA,UACtD;AAAA;AAAA;AAAA,IAEJ;AAAA,IAEA,gBAAAA,MAAC,WACE;AAAA;AAAA;AAAA;AAAA;AAAA,gCAKuB,YAAY,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,mCAItB;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA;AAAA;AAAA,YAIV;AAAA,KACF;AAEJ;;;AEzLA;AAAA,EAGE,eAAAG;AAAA,EACA,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AA8PD,SAIM,OAAAC,OAJN,QAAAC,cAAA;AA3ON,SAASC,OAAM,GAAW,GAAW,GAAW;AAC9C,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACnC;AAEA,SAAS,gCAAgC,KAAe,OAAe;AACrE,MAAI,KAAK;AACT,MAAI,KAAK,IAAI,SAAS;AACtB,MAAI,MAAM,IAAI;AAEd,SAAO,MAAM,IAAI;AACf,UAAM,MAAO,KAAK,MAAO;AACzB,QAAI,IAAI,GAAG,KAAK,OAAO;AACrB,YAAM;AACN,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,YAAYC,SAA8B,IAAI;AACpD,QAAM,cAAcA,SAA8B,IAAI;AAEtD,QAAM,aAAaA,SAAiB,CAAC,CAAC;AACtC,QAAM,aAAaA,SAAiB,CAAC,CAAC;AACtC,QAAM,iBAAiBA,SAAe,CAAC;AAEvC,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAS,CAAC;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,CAAC;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE,OAAO,GAAG,KAAK,EAAE,CAAC;AAEvD,QAAM,gBAAgBC;AAAA,IACpB,CAAC,cAAsB;AACrB,YAAM,IAAI,MAAM;AAChB,UAAI,MAAM,GAAG;AACX,mBAAW,UAAU,CAAC;AACtB,uBAAe,UAAU;AACzB;AAAA,MACF;AAEA,YAAM,UAAU,WAAW;AAC3B,YAAM,UAAU,WAAW;AAE3B,UAAI,QAAQ,SAAS,EAAG,SAAQ,SAAS;AACzC,UAAI,QAAQ,SAAS,EAAG,SAAQ,SAAS;AAEzC,YAAM,QAAQH,OAAM,WAAW,GAAG,IAAI,CAAC;AAEvC,UAAI,UAAU,GAAG;AACf,gBAAQ,CAAC,IAAI;AAAA,MACf,WAAW,QAAQ,KAAK,KAAK,MAAM;AACjC,YAAI,IAAI,QAAQ;AAChB,eAAO,KAAK,KAAK,QAAQ,CAAC,KAAK,KAAM;AACrC,YAAI,IAAI,EAAG,SAAQ,CAAC,IAAI;AAAA,YACnB,SAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK;AAAA,MACpD;AAEA,eAAS,IAAI,QAAQ,GAAG,IAAI,GAAG,KAAK;AAClC,gBAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK;AAAA,MACnD;AAEA,qBAAe,WACZ,QAAQ,IAAI,CAAC,KAAK,MAAM,QAAQ,IAAI,CAAC,KAAK;AAAA,IAC/C;AAAA,IACA,CAAC,MAAM,QAAQ,mBAAmB;AAAA,EACpC;AAEA,QAAM,eAAeG,aAAY,MAAM;AACrC,UAAM,IAAI,MAAM;AAChB,QAAI,MAAM,GAAG;AACX,eAAS,EAAE,OAAO,GAAG,KAAK,EAAE,CAAC;AAC7B;AAAA,IACF;AAEA,UAAM,UAAU,WAAW;AAC3B,QAAI,QAAQ,WAAW,EAAG,eAAc,CAAC;AAEzC,UAAM,MAAM;AACZ,UAAM,SAAS,YAAY;AAE3B,UAAM,QAAQH;AAAA,MACZ,gCAAgC,SAAS,GAAG,IAAI;AAAA,MAChD;AAAA,MACA,IAAI;AAAA,IACN;AAEA,UAAM,eAAe,gCAAgC,SAAS,MAAM;AACpE,UAAM,OAAOA,OAAM,eAAe,GAAG,GAAG,IAAI,CAAC;AAE7C,UAAM,QAAQA,OAAM,QAAQ,UAAU,GAAG,IAAI,CAAC;AAC9C,UAAM,MAAMA,OAAM,OAAO,UAAU,GAAG,IAAI,CAAC;AAE3C,aAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EACzB,GAAG,CAAC,MAAM,QAAQ,WAAW,WAAW,UAAU,aAAa,CAAC;AAGhE,EAAAI,iBAAgB,MAAM;AACpB,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AAET,UAAM,SAAS,MAAM,aAAa,GAAG,YAAY;AACjD,WAAO;AAEP,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAGL,EAAAC,YAAU,MAAM;AACd,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AAET,QAAI,MAAM;AACV,UAAM,WAAW,MAAM;AACrB,UAAI,IAAK;AACT,YAAM,sBAAsB,MAAM;AAChC,cAAM;AACN,qBAAa,GAAG,SAAS;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,OAAG,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AACzD,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,QAAQ;AACzC,UAAI,IAAK,sBAAqB,GAAG;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,EAAAA,YAAU,MAAM;AACd,QAAI,MAAM,WAAW,GAAG;AACtB,iBAAW,UAAU,CAAC;AACtB,iBAAW,UAAU,CAAC;AACtB,qBAAe,UAAU;AACzB,eAAS,EAAE,OAAO,GAAG,KAAK,EAAE,CAAC;AAC7B;AAAA,IACF;AACA,kBAAc,CAAC;AACf,iBAAa;AAAA,EACf,GAAG,CAAC,MAAM,QAAQ,eAAe,YAAY,CAAC;AAG9C,EAAAA,YAAU,MAAM;AACd,iBAAa;AAAA,EACf,GAAG,CAAC,WAAW,WAAW,YAAY,CAAC;AAGvC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,aAAc;AAEnB,UAAM,OAAO,UAAU;AACvB,UAAM,SAAS,YAAY;AAC3B,QAAI,CAAC,QAAQ,CAAC,OAAQ;AAEtB,QAAI,kBAAkB;AAEtB,UAAM,KAAK,IAAI;AAAA,MACb,CAAC,YAAY;AACX,cAAM,IAAI,QAAQ,CAAC;AACnB,cAAM,kBAAkB,CAAC,CAAC,GAAG;AAG7B,YAAI,mBAAmB,CAAC,gBAAiB,cAAa;AAEtD,0BAAkB;AAAA,MACpB;AAAA,MACA;AAAA,QACE;AAAA;AAAA,QAEA,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AAEA,OAAG,QAAQ,MAAM;AACjB,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,cAAc,MAAM,MAAM,CAAC;AAE/B,QAAM,aAAaF;AAAA,IACjB,CAAC,OAAe,WAAmB;AACjC,YAAM,OAAO,WAAW,QAAQ,KAAK;AACrC,UAAI,SAAS,OAAQ;AAErB,iBAAW,QAAQ,KAAK,IAAI;AAC5B,oBAAc,KAAK;AACnB,mBAAa;AAAA,IACf;AAAA,IACA,CAAC,eAAe,YAAY;AAAA,EAC9B;AAEA,QAAM,eAAeG,UAAQ,MAAM;AACjC,UAAM,IAAI,MAAM;AAChB,QAAI,MAAM,EAAG,QAAO,CAAC;AAErB,UAAM,UAAU,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC;AACzC,UAAM,YAAY,KAAK,IAAI,MAAM,OAAO,OAAO;AAE/C,UAAM,MAAyC,CAAC;AAChD,aAAS,IAAI,WAAW,KAAK,SAAS,KAAK;AACzC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,QAAQ,KAAM;AAClB,UAAI,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,IAC7B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,MAAM,OAAO,MAAM,GAAG,CAAC;AAElC,QAAM,SAAS,eAAe;AAE9B,SACE,gBAAAP;AAAA,IAAC,gBAAQ;AAAA,IAAR;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA;AAAA,QACN,WAAW;AAAA;AAAA,QACX,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,QACP,GAAG;AAAA,MACL;AAAA,MAEA;AAAA,wBAAAA,OAAC,SAAI,OAAO,EAAE,QAAQ,QAAQ,UAAU,YAAY,OAAO,OAAO,GAC/D;AAAA,uBAAa,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM;AACrC,kBAAM,MAAM,WAAW,QAAQ,KAAK,KAAK,QAAQ;AACjD,mBACE,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA;AAAA,gBACA;AAAA,gBAEC,qBAAW,MAAM,KAAK;AAAA;AAAA,cALlB,OAAO,MAAM,KAAK;AAAA,YAMzB;AAAA,UAEJ,CAAC;AAAA,UAGD,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ;AAAA,cACV;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAEC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,MAAMG,SAA8B,IAAI;AAE9C,EAAAG,iBAAgB,MAAM;AACpB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AAET,UAAM,SAAS,MAAM;AACnB,YAAM,IAAI,GAAG,sBAAsB,EAAE;AACrC,UAAI,IAAI,EAAG,YAAW,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,IAC3C;AAEA,WAAO;AAEP,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,OAAO,UAAU,CAAC;AAEtB,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,UAAU,YAAY,KAAK,MAAM,GAAG,OAAO,GAAG,OAAO,OAAO;AAAA,MAEpE;AAAA;AAAA,EACH;AAEJ;;;AC9QQ,gBAAAS,OAaA,QAAAC,cAbA;AApDD,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,QAAM,EAAE,MAAM,IAAI,iBAAiB;AAEnC,QAAM,WAAgC;AAAA,IACpC,iBAAiB,MAAM,mBAAmB;AAAA,IAC1C,QAAQ,aAAa,oBAAoB,MAAM,mBAAmB,QAAQ,EAAE,CAAC;AAAA,IAC7E,OAAO,MAAM,mBAAmB;AAAA,IAChC,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAEA,QAAM,mBAAwC;AAAA,IAC5C,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAEA,QAAM,YAAiC;AAAA,IACrC,OAAO,MAAM,mBAAmB;AAAA,IAChC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,OAAO;AAAA,MACT;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,SAAS,IAAI,mBAAmB;AAAA,gBACvC,UAAU,SAAS;AAAA,gBACnB,SAAS,MAAM;AACb,sBAAI,OAAO,GAAG;AACZ,uCAAmB,IAAI;AACvB,4BAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,kBACtB;AAAA,gBACF;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YAEA,gBAAAC,OAAC,SAAI,OAAO,WAAW;AAAA;AAAA,cAAM,OAAO;AAAA,eAAE;AAAA,YAEtC,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,aAAa,mBAAmB;AAAA,gBACvC,UAAU;AAAA,gBACV,SAAS,MAAM;AACb,sBAAI,CAAC,YAAY;AACf,uCAAmB,IAAI;AACvB,4BAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,kBACtB;AAAA,gBACF;AAAA,gBACD;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AP4JM,SA+FI,YAAAE,YA/FJ,OAAAC,OAgGM,QAAAC,cAhGN;AA1MN,IAAM,QAAQ;AACd,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAEvB,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAA8B;AAC5B,QAAM,CAAC,cAAc,eAAe,IAAIC,WAA4B,IAAI;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,CAAC,CAAC;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA;AAAA,IAC5C;AAAA,EACF;AAGA,QAAM,YAAYC,SAAO,CAAC;AAG1B,QAAM,CAAC,SAAS,UAAU,IAAID,WAAS,IAAI;AAC3C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,KAAK;AAC1D,QAAM,aAAaC,SAAO,IAAI;AAC9B,QAAM,oBAAoBA,SAAO,KAAK;AAGtC,QAAM,cAAcA,SAAuB,IAAI;AAC/C,QAAM,CAAC,MAAM,OAAO,IAAID,WAAS,CAAC;AAClC,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,CAAC;AAE1C,QAAM,eAAeC,SAAO,CAAC;AAC7B,QAAM,cAAcA,SAA+B,CAAC,CAAC;AACrD,QAAM,cAAcA,SAAO,KAAK;AAGhC,EAAAC,YAAU,MAAM;AACd,UAAM,eAAe,KAAK,YAAY;AACtC,UAAM,cACJ,qBAAa,mBAAmB,YAAY,CAAC,KAAK,qBAAa,IAAI;AAErE,oBAAgB,WAAW;AAE3B,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,gBAAQ,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,UAAU,EAAE,EAAE,CAAC;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,UAAU,CAAC;AAG3B,EAAAA,YAAU,MAAM;AACd,aAAS,CAAC,CAAC,iBAAiB,MAAM,SAAS,KAAK,WAAW,QAAQ;AAAA,EACrE,GAAG,CAAC,cAAc,MAAM,QAAQ,QAAQ,QAAQ,CAAC;AAEjD,QAAM,gBAAgBC,aAAY,CAAC,GAA4B,MAAc;AAE3E,UAAM,OAAO;AACb,UAAM,KAAK,MAAM,MAAM,MAAM,WAAW,MAAM;AAC9C,QAAI,MAAM,KAAM,QAAO,OAAO,EAAE;AAChC,WAAO,GAAG,MAAM,YAAY,MAAM,IAAI,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,WAAWA;AAAA,IACf,OAAO,QAAiB;AACtB,YAAM,QAAQ,OAAO,UAAU;AAG/B,UAAI,YAAY,QAAS;AACzB,UAAI,kBAAkB,WAAW,CAAC,WAAW,QAAS;AAGtD,YAAM,YAAY,QAAQ,aAAa;AACvC,UAAI,aAAa,GAAG;AAClB,mBAAW,UAAU;AACrB,mBAAW,KAAK;AAChB;AAAA,MACF;AAEA,YAAM,YACJ,eAAe,YACX,KAAK,IAAI,oBAAoB,SAAS,IACtC;AAEN,kBAAY,UAAU;AACtB,wBAAkB,UAAU;AAC5B,wBAAkB,IAAI;AAEtB,YAAM,QAAQ,aAAa;AAC3B,YAAM,SAAS,MAAM,kBAAkB,MAAM,OAAO,WAAW,KAAK;AAGpE,UAAI,UAAU,UAAU,SAAS;AAC/B,oBAAY,UAAU;AACtB,0BAAkB,UAAU;AAC5B,0BAAkB,KAAK;AACvB;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ;AACX,kBAAU,OAAO;AACjB,oBAAY,UAAU;AACtB,0BAAkB,UAAU;AAC5B,0BAAkB,KAAK;AACvB;AAAA,MACF;AAEA,iBAAW,KAAK,QAAQ;AACtB,cAAM,MAAM,GAAG;AACf,YAAI,CAAC,IAAK;AACV,YAAI,CAAC,YAAY,QAAQ,GAAG;AAC1B,sBAAY,QAAQ,GAAG,IAAI,oBAAoB;AAAA,MACnD;AAGA,mBAAa,UAAU,QAAQ,OAAO;AAGtC,eAAS,CAAC,SAAS;AACjB,cAAM,SAAS,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,KAAK;AAElD,cAAM,eAAe,OAAO,UAAU;AACtC,cAAM,uBAAuB,OAAO,SAAS;AAC7C,cAAM,cAAc,EAAE,gBAAgB;AAEtC,mBAAW,UAAU;AACrB,mBAAW,WAAW;AAEtB,eAAO;AAAA,MACT,CAAC;AAED,gBAAU,OAAO;AACjB,kBAAY,UAAU;AACtB,wBAAkB,UAAU;AAC5B,wBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,MAAM,UAAU;AAAA,EACnB;AAGA,EAAAD,YAAU,MAAM;AACd,QAAI,eAAe,aAAc;AAEjC,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,GAAI;AAET,UAAM,UAAU,MAAM;AACpB,YAAM,IAAI,GAAG,sBAAsB,EAAE;AAGrC,YAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,qBAAqB,CAAC;AAEtE,kBAAY,CAAC,SAAU,SAAS,eAAe,OAAO,YAAa;AAGnE,cAAQ,CAAC,aAAa;AACpB,cAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,SAAS,YAAY,CAAC;AACrE,eAAO,KAAK,IAAI,UAAU,aAAa,CAAC;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,IAAI,eAAe,MAAM,QAAQ,CAAC;AAC7C,OAAG,QAAQ,EAAE;AACb,YAAQ;AAER,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,YAAY,MAAM,MAAM,CAAC;AAG7B,EAAAA,YAAU,MAAM;AACd,cAAU,WAAW;AACrB,UAAM,MAAM,UAAU;AAEtB,aAAS,CAAC,CAAC;AACX,uBAAmB,IAAI;AACvB,YAAQ,CAAC;AAET,iBAAa,UAAU;AACvB,gBAAY,UAAU,CAAC;AAGvB,eAAW,UAAU;AACrB,sBAAkB,UAAU;AAC5B,gBAAY,UAAU;AAEtB,eAAW,IAAI;AACf,sBAAkB,KAAK;AACvB,cAAU,SAAS;AAEnB,aAAS,GAAG;AAAA,EAGd,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,MAAI,WAAW,SAAS;AACtB,WACE,gBAAAE,MAAC,SAAI,OAAO,EAAE,OAAO,MAAM,iBAAiB,OAAO,GAAG,0CAEtD;AAAA,EAEJ;AAEA,QAAM,aAAa,CAAC,CAAC;AAErB,QAAM,YAAY,OAAO;AACzB,QAAM,UAAU,YAAY;AAC5B,QAAM,YAAY,MAAM,MAAM,WAAW,OAAO;AAGhD,QAAM,aAAa,CAAC,WAAW,MAAM,UAAU;AAE/C,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,WAAW;AAAA;AAAA,MACb;AAAA,MAGA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS,kBAAkB,UAAU;AAAA,cACrC,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,YACX;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ;AAAA,gBACA,cAAc,MAAM,mBAAmB,IAAI;AAAA,gBAC3C,aAAa;AAAA,gBACb,iBAAiB,CAAC,MAAM;AACtB,qCAAmB,EAAE,GAAG,EAAE,CAAC;AAC3B,sBAAI,OAAO,WAAW,YAAa,QAAO,SAAS,EAAE,KAAK,EAAE,CAAC;AAAA,gBAC/D;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAGA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS,aAAa,SAAS;AAAA,cAC/B,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA;AAAA,cACX,eAAe;AAAA,YACjB;AAAA,YAEC,qBAAW,aAAa,MAAM,WAAW,IACxC,gBAAAA,MAAC,eAAY,IACX,eAAe,YACjB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,CAAC,GAAG,MAAM,cAAc,GAAG,CAAC;AAAA,gBACpC,qBAAqB;AAAA,gBACrB,UAAU;AAAA,gBACV,cAAc,MAAM;AAClB,sBAAI,WAAW,MAAM,SAAS,MAAO,UAAS;AAAA,gBAChD;AAAA,gBACA,QACE,iBACE,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,SAAS,GAC9B,0BAAAA,MAAC,eAAY,GACf,IACE;AAAA,gBAEN,YAAY,CAAC,YAAY;AACvB,sBAAI,CAAC,QAAS,QAAO;AACrB,yBACE,gBAAAA,MAAC,SAAI,OAAO,EAAE,eAAe,OAAO,GAClC,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA,UAAU,YAAY,QAAQ,QAAQ,OAAO,EAAE,KAAK;AAAA,sBACpD,iBAAiB,CAAC,CAAC;AAAA,sBACnB,WAAW,CAAC;AAAA,sBACZ;AAAA,sBACA,SAAS,MAAM,mBAAmB,EAAE,GAAG,QAAQ,CAAC;AAAA,sBAChD;AAAA;AAAA,kBACF,GACF;AAAA,gBAEJ;AAAA;AAAA,YACF,IAEA,gBAAAC,OAAAC,YAAA,EACE;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,QAAQ;AAAA,oBACR,WAAW;AAAA,oBACX,UAAU;AAAA;AAAA,kBACZ;AAAA,kBAEC;AAAA,8BAAU,IAAI,CAAC,SAAS,UACvB,gBAAAD;AAAA,sBAAC;AAAA;AAAA,wBAEC,OAAO,EAAE,eAAe,OAAO;AAAA,wBAE/B,0BAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC;AAAA,4BACA,UAAU,YAAY,QAAQ,QAAQ,OAAO,EAAE,KAAK;AAAA,4BACpD,iBAAiB,CAAC,CAAC;AAAA,4BACnB,WAAW,CAAC;AAAA,4BACZ;AAAA,4BACA,SAAS,MAAM,mBAAmB,EAAE,GAAG,QAAQ,CAAC;AAAA,4BAChD;AAAA;AAAA,wBACF;AAAA;AAAA,sBAXK,cAAc,SAAS,YAAY,KAAK;AAAA,oBAY/C,CACD;AAAA,oBAEA,iBACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,SAAS,GAC9B,0BAAAA,MAAC,eAAY,GACf,IACE;AAAA;AAAA;AAAA,cACN;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,cACF;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,KAAK,EAAE,QAAQ,OAAO,SAAS,GAAuB;AACpE,QAAM,CAAC,OAAO,QAAQ,IAAIJ,WAAkB,KAAK;AACjD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAiB,CAAC;AAC9D,QAAM,eAAeC,SAAuB,IAAI;AAGhD,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,MAAO;AACZ,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AAET,UAAM,QAAQ,CAAC,MAAc,kBAAkB,CAAC;AAEhD,UAAM,KAAK,IAAI,eAAe,CAAC,YAAY;AACzC,YAAM,IAAI,QAAQ,CAAC,EAAE,YAAY;AACjC,YAAM,CAAC;AAAA,IACT,CAAC;AAED,OAAG,QAAQ,EAAE;AACb,UAAM,GAAG,sBAAsB,EAAE,KAAK;AAEtC,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,gBAAAE,MAAC,mBAAQ,OAAO,QACd,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA;AAAA,MACb;AAAA,MAEA,0BAAAA,MAAC,gBAAQ,iBAAR,EAAwB,YAAW,QAAO,MACzC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,YAAY,OAAO;AAAA,YACnB,eAAe,OAAO;AAAA,UACxB;AAAA,UACA,MAAM,OAAO;AAAA,UACb;AAAA,UACA;AAAA,UACA,YAAY,OAAO,oBAAoB;AAAA;AAAA,MACzC,GACF;AAAA;AAAA,EACF,GACF;AAEJ;;;AQvbA,SAAS,aAAAG,mBAAiB;;;ACFnB,SAAS,eAAe,QAA4B,UAA6B,CAAC,GAAS;AAChG,MAAI,OAAO,WAAW,eAAe,CAAC,OAAQ;AAC9C,QAAM,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE;AAC5D,MAAI,CAAC,KAAM;AACX,SAAO,eAAe,EAAE,KAAK,CAAC,YAAY;AACxC,YAAQ,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,SAAS,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;AAAA,EACjG,CAAC;AACH;;;ACLA,SAAS,aAAAC,aAAW,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACC9C,IAAM,eAAe,CAAC,YAAY,MAAM;AAGxC,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWO,IAAM,kBAAmD;AAAA,EAC9D,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AACT;AAEO,IAAM,0BAA2D;AAAA,EACtE,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AACT;AAKO,IAAM,wBAAgE;AAAA,EAC3E,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AACT;AAGO,IAAM,oBAAoB;;;ACzDjC,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AAEjB,SAASC,UAAS,KAAyB;AAChD,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAM,QAAQ,IAAI,KAAK,EAAE,YAAY;AACrC,QAAM,QAAQ,uDAAuD,KAAK,KAAK;AAC/E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,MAAM,CAAC;AACpB,QAAM,WACJ,KAAK,WAAW,KAAK,KAAK,WAAW,IACjC,KACG,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE,IACV;AACN,QAAM,IAAI,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE;AAC3C,QAAM,IAAI,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE;AAC3C,QAAM,IAAI,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE;AAC3C,SAAO,EAAE,GAAG,GAAG,EAAE;AACnB;AAEA,SAAS,gBAAgB,SAAyB;AAChD,QAAM,IAAI,UAAU;AACpB,SAAO,KAAK,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AACrE;AAEO,SAAS,kBAAkB,KAAqB;AACrD,QAAM,MAAMA,UAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,gBAAgB,IAAI,CAAC;AAC/B,QAAM,IAAI,gBAAgB,IAAI,CAAC;AAC/B,QAAM,IAAI,gBAAgB,IAAI,CAAC;AAC/B,SAAO,SAAS,IAAI,SAAS,IAAI,SAAS;AAC5C;AAEO,SAAS,aACd,YACA,WAAmB,cACnB,YAAoB,eACZ;AACR,SAAO,kBAAkB,UAAU,IAAI,kBAAkB,WAAW;AACtE;AAEA,SAAS,aAAa,SAAyB;AAC7C,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO;AACT;AAEO,SAAS,MAAM,KAAa,SAAyB;AAC1D,QAAM,IAAI,aAAa,OAAO;AAC9B,QAAM,MAAMA,UAAS,GAAG;AACxB,MAAI,CAAC,IAAK,QAAO,iBAAiB,CAAC;AACnC,SAAO,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;AAChD;AAEO,SAAS,QAAQ,KAAsB;AAC5C,SAAO,kBAAkB,GAAG,IAAI;AAClC;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AAC5D,SAAO,QAAQ,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC7C;AAEO,SAAS,IAAI,KAAa,SAAiB,QAAwB;AACxE,QAAM,OAAOA,UAAS,GAAG;AACzB,QAAM,QAAQA,UAAS,OAAO;AAC9B,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO;AAC5B,QAAM,IAAI,OAAO,MAAM,MAAM,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;AACpE,QAAM,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI;AACvC,QAAM,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI;AACvC,QAAM,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI;AACvC,SAAO,IAAI,eAAe,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,YAAY;AACrF;AAEO,SAAS,kBAAkB,OAAkC,QAAgB,IAAY;AAC9F,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,QAAQ,sCAAsC,KAAK,GAAG;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,MAAM,WAAW,MAAM,CAAC,CAAC;AAC/B,MAAI,OAAO,MAAM,GAAG,EAAG,QAAO;AAC9B,QAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,YAAY;AAC5C,MAAI,SAAS,IAAK,QAAO,GAAG,KAAK;AACjC,QAAM,KAAK,SAAS,SAAS,SAAS,OAAO,MAAM,KAAK;AACxD,MAAI,KAAK,MAAO,QAAO,GAAG,KAAK;AAC/B,SAAO;AACT;;;ACDU,gBAAAC,aAAA;AAzEV,IAAM,aACJ;AAEF,IAAM,WAAW;AAEjB,IAAM,cAAc,MAAM;AACxB,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,QAAQ,EAAG;AACvC,QAAM,KAAK,SAAS,cAAc,OAAO;AACzC,KAAG,KAAK;AACR,KAAG,cACD;AAGF,WAAS,KAAK,YAAY,EAAE;AAC9B;AAEA,IAAM,WAAW,CAAC,aAChB,aAAa,QAAQ,QAAQ,gBAAgB,QAAQ;AAEhD,IAAM,eAAe,CAAC,EAAE,QAAQ,UAAU,YAAY,MAAa;AACxE,cAAY;AAEZ,QAAM,aAAa,YAAY,cAAc;AAC7C,QAAM,YAAY,YAAY;AAE9B,QAAM,iBAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,KAAK;AAAA,IACL,WAAW;AAAA,IACX,cAAc,aAAa,MAAM,WAAW,GAAG,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,cAA4C;AAAA,IAC5D,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc,WAAW,2BAA2B;AAAA,IACpD,cAAc;AAAA,IACd,SAAS;AAAA,IACT;AAAA,IACA,UAAU;AAAA,IACV,YAAY,WAAW,MAAM;AAAA,IAC7B,eAAe;AAAA,IACf,eAAe;AAAA,IACf,OAAO;AAAA,IACP,SAAS,WAAW,IAAI;AAAA,IACxB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAEA,QAAM,cAAc,CAClB,GACA,UACA,aACG;AACH,QAAI,SAAU;AACd,MAAE,cAAc,MAAM,UAAU,WAAW,SAAS;AAAA,EACtD;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAW;AAAA,MACX,OAAO;AAAA,MAEN,0BAAgB,IAAI,CAAC,aAAa;AACjC,cAAM,WAAW,aAAa;AAC9B,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,UAAU,WAAW,IAAI;AAAA,YACzB,WAAU;AAAA,YACV,OAAO,SAAS,QAAQ;AAAA,YACxB,SAAS,MAAM,SAAS,QAAQ;AAAA,YAChC,cAAc,CAAC,MAAM,YAAY,GAAG,UAAU,IAAI;AAAA,YAClD,cAAc,CAAC,MAAM,YAAY,GAAG,UAAU,KAAK;AAAA,YAElD,mBAAS,QAAQ;AAAA;AAAA,UAXb;AAAA,QAYP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;;;ACxGA,SAAS,gCAAgC;AA2F/B,gBAAAC,OAqCJ,QAAAC,cArCI;AArEV,IAAMC,cACJ;AAEK,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,QAAM,OAAO,YAAY,gBAAgB,YAAY,cAAcA;AACnE,QAAM,OAAO,YAAY;AAEzB,QAAM,iBAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,KAAK;AAAA,IACL,SAAS;AAAA,IACT,cAAc,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,IAC3C,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,QAAM,kBAAuC;AAAA,IAC3C,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,YAAY,MAAM,MAAM,IAAI;AAAA,IAC5B,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,IACrC,cAAc;AAAA,IACd,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAEA,QAAMC,cAAkC;AAAA,IACtC,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAEA,QAAM,YAAY;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,cAAc,YAAY;AAAA,IAC1B,oBAAoB,YAAY;AAAA,IAChC,YAAY;AAAA,EACd;AAEA,SACE,gBAAAF,OAAC,SAAI,OAAO,gBACV;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEC,oBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,OAAO;AAAA,cACP,SAAS;AAAA,YACX;AAAA;AAAA,QACF,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA,IAEJ;AAAA,IAEC,kBACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,MAAM,YAAY,UAAU,GAAG,SAAS,OAAO,GAC3D,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU;AAAA,QACV,aAAa;AAAA;AAAA,IACf,GACF;AAAA,IAGF,gBAAAC,OAAC,WAAM,OAAO,iBACZ;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,EAAE,SAAS,KAAK,YAAY,EAAE;AAAA;AAAA,MACvC;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,aAAY;AAAA,UACZ,cAAW;AAAA,UACX,OAAOG;AAAA;AAAA,MACT;AAAA,OACF;AAAA,KACF;AAEJ;;;ACpJA,SAAS,OAAO,YAAAC,kBAAgB;AAChC,SAAS,sBAAsB;;;ACH/B,IAAM,mBAAmB;AAElB,IAAM,sBAAsB,CAAC,SAA4C;AAC9E,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,SAAS,gBAAgB,CAAC;AAC/D;AAEO,IAAM,oBAAoB,CAC/B,SACA,WAAW,yBACA;AACX,SAAO,SAAS,QAAQ,aAAa,OAAO,OAAO,CAAC;AACtD;;;AChBO,SAAS,mBACd,UACa;AACb,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAEtD,QAAM,UAAU,SAAS,KAAK;AAC9B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAEzC,SAAO;AACT;AAEO,SAAS,eACd,UACA,SAAiB,SACT;AACR,QAAM,OAAO,mBAAmB,QAAQ;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,YAAY,OAAO,KAAK,EAAE,QAAQ,MAAM,GAAG,EAAE,YAAY;AAC/D,QAAM,gBAAwC;AAAA,IAC5C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,EACR;AACA,QAAM,mBACJ,cAAc,SAAS,MACtB,aAAa,KAAK,SAAS,IAAI,UAAU;AAE5C,MAAI;AACF,WAAO,IAAI,KAAK,eAAe,kBAAkB;AAAA,MAC/C,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR,CAAC,EAAE,OAAO,IAAI;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AFmBI,gBAAAC,OAwEI,QAAAC,cAxEJ;AAtCJ,IAAMC,cACJ;AACF,IAAM,WAAW;AAEjB,IAAM,cAAc,CAAC,SACnB,aAAa,MAAM,MAAM,IAAI,CAAC,eAAe,MAAM,MAAM,IAAI,CAAC;AAChE,IAAM,eAAe,CAAC,SAAiB,aAAa,MAAM,MAAM,GAAG,CAAC;AAEpE,SAAS,gBAAgB,UAA6C;AACpE,QAAM,OAAO,mBAAmB,QAAQ;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,IAAI,KAAK,eAAe,SAAS,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC,EACvE,OAAO,IAAI,EACX,YAAY;AAAA,EACjB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,IAAY,SAAyB;AACjE,QAAM,QAAQ,KAAK,IAAI,kBAAkB,EAAE,IAAI,kBAAkB,OAAO,CAAC;AACzE,SAAO,QAAQ,OAAO,aAAa,EAAE,IAAI;AAC3C;AAEA,IAAM,YAID,CAAC,EAAE,KAAK,KAAK,QAAQ,MACxB,gBAAAF;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAAA,IAEA,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAQ;AAAA,QACR,UAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW,UAAU,gBAAgB;AAAA,UACrC,YAAY,mBAAmB,QAAQ;AAAA,QACzC;AAAA;AAAA,IACF;AAAA;AACF;AAGF,IAAM,eAGD,CAAC,EAAE,OAAO,MAAM,MACnB,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY,MAAM,OAAO,IAAI;AAAA,MAC7B;AAAA,MACA,QAAQ,aAAa,MAAM,OAAO,IAAI,CAAC;AAAA,MACvC,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAYE;AAAA,MACZ,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,IAEC;AAAA;AACH;AAGF,IAAM,WAMD,CAAC,EAAE,SAAS,UAAU,iBAAiB,WAAW,UAAU,MAAM;AACrE,QAAM,aAAa,WAAW,gBAAgB,QAAQ,QAAQ,IAAI;AAClE,QAAM,cAAc,kBAChB,GAAG,oBAAoB,QAAQ,eAAe,QAAQ,WAAW,EAAE,CAAC,cACpE;AACJ,QAAM,QAAQ,CAAC,YAAY,WAAW,EAAE,OAAO,OAAO;AACtD,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAYE;AAAA,QACZ,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MAEC,gBAAM,SAAS,KACd,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAD,MAAC,kBAAe,MAAM,IAAI,eAAY,QAAO;AAAA,YAC7C,gBAAAA,MAAC,UAAM,gBAAM,KAAK,QAAK,GAAE;AAAA;AAAA;AAAA,MAC3B;AAAA;AAAA,EAEJ;AAEJ;AAEO,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,IAAIG,WAAS,KAAK;AAC5C,QAAM,aAAa,MAAM;AACzB,QAAM,eAAe,aAAa,YAAY,cAAc;AAC5D,QAAM,gBAAgB;AAAA,IACpB,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAEA,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,mBAAiB;AAAA,MACjB,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MACpC,OAAO;AAAA,QACL,YAAY,YAAY;AAAA,QACxB,QAAQ,aAAa,MAAM,cAAc,GAAG,CAAC;AAAA,QAC7C,cAAc,YAAY;AAAA,QAC1B,WAAW,UACP,aAAa,YAAY,IACzB,YAAY,YAAY;AAAA,QAC5B,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY,oBAAoB,QAAQ;AAAA,QACxC,YAAY,YAAY,cAAcC;AAAA,QACtC,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,MAEA;AAAA,wBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ;AAAA,YACb,KAAK,QAAQ;AAAA,YACb;AAAA;AAAA,QACF;AAAA,QACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,OAAO,GAC3B;AAAA,kBAAQ,cAAc,QAAQ,UAC7B,gBAAAD,MAAC,iBAAc,MAAI,MAAC,WAAW,QAAQ,mBAAmB;AAAA,UAE5D,gBAAAA,MAAC,gBAAa,OAAO,eAAe,OAAO,eAAe;AAAA,UAC1D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,gBACV,gBAAgB,UAAU,cAAc;AAAA,gBACxC,qBAAqB;AAAA,gBACrB,yBAAyB;AAAA,cAC3B;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO,YAAY;AAAA,gBACnB,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,YAAYE;AAAA,gBACZ,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,cACZ;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW,YAAY;AAAA;AAAA,UACzB;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AG9PA,SAAS,aAAAI,aAAW,YAAAC,kBAAgB;AACpC,SAAS,gBAAAC,qBAAoB;;;ACD7B,SAAS,aAAAC,aAAW,WAAAC,WAAS,YAAAC,kBAAgB;;;ACA7C,SAAS,mBAAmB;AAC5B,SAAS,QAAQ,QAAQ,gBAAgB,QAAQ,cAAc;AAC/D,SAAS,aAAAC,aAAW,SAAAC,QAAO,mBAAAC,kBAAiB,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AAqIjE,SACE,OAAAC,OADF,QAAAC,cAAA;AAlIZ,IAAM,MAAM,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,EAAE;AACtD,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,SAAS;AACf,IAAMC,UAAS,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AASlG,SAAS,eAAe,OAAwC;AAC9D,QAAM,OAAO,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK;AAC5D,QAAM,WAAW,QAAQ,IAAI,IAAI,QAAQ,MAAM,IAAI,QAAQ,OAAO,IAAI;AACtE,SAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ;AAClC;AAEO,IAAM,YAA6B,CAAC,EAAE,SAAS,OAAO,SAAS,KAAK,cAAc,MAAM;AAC7F,QAAM,eAAeJ,SAAuB,IAAI;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAS,CAAC;AACpC,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAwB,IAAI;AAChE,QAAM,aAAaJ,OAAM;AAEzB,EAAAC,iBAAgB,MAAM;AACpB,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,IAAI,eAAe,CAAC,YAAY,SAAS,QAAQ,CAAC,EAAE,YAAY,KAAK,CAAC;AACjF,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,EAAAF,YAAU,MAAM,cAAc,IAAI,GAAG,CAAC,OAAO,CAAC;AAE9C,QAAM,OAAOG,UAAQ,MAAM;AACzB,QAAI,CAAC,SAAS,QAAQ,SAAS,EAAG,QAAO;AAEzC,UAAM,IAAI,QAAQ;AAClB,UAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AACzC,UAAM,KAAK,KAAK,IAAI,GAAG,MAAM;AAC7B,UAAM,KAAK,KAAK,IAAI,GAAG,MAAM;AAC7B,UAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAEtC,UAAM,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,MAAM,QAAQ,IAAI,KAAK,CAAC;AAC9E,UAAM,IAAI,YAAY,EAAE,OAAO,CAAC,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,IAAI,QAAQ,IAAI,GAAG,CAAC;AAE3F,UAAM,WAAW,OAAe,EAAE,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,cAAc,EAAE,OAAO,KAAK;AAC3G,UAAM,WAAW,OAAe,EAAE,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,IAAI,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,cAAc,EAAE,OAAO,KAAK;AAEpI,UAAM,QAAQ,QAAQ,IAAI,CAAC,EAAE,SAAS,QAAQ,CAAC,EAAE,QAAQ,MAAM,KAAK,MAAM;AAE1E,UAAM,QAAQ,EAAE,MAAM,WAAW;AACjC,UAAMM,OAAM,eAAe,KAAK;AAChC,UAAM,aAAa,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAOA,KAAI,CAAC,EAAE,EAAE;AAEhE,UAAM,SAAS,QAAQ,IAAI,CAAC,EAAE,YAAY,QAAQ,CAAC,EAAE;AAIrD,UAAM,OACJ,SAAS,MAAM,SACX,SACA,SAAS,KAAK,SACZ,UACA,SAAS,IAAI,SACX,QACA;AACV,UAAM,WAAW,SAAS,QAAQ,KAAK;AAEvC,UAAM,WAAW,CAAC,OAAuB;AACvC,YAAM,IAAI,IAAI,KAAK,EAAE;AACrB,UAAI,SAAS,OAAQ,QAAO,EAAE,eAAe;AAC7C,UAAI,SAAS,QAAS,QAAO,EAAE,eAAe,IAAI,KAAK,EAAE,YAAY;AACrE,UAAI,SAAS,MAAO,QAAO,KAAK,MAAM,KAAK,MAAM;AACjD,aAAO,KAAK,MAAM,KAAK,IAAS;AAAA,IAClC;AACA,UAAM,UAAU,CAAC,OAAuB;AACtC,YAAM,IAAI,IAAI,KAAK,EAAE;AACrB,UAAI,SAAS,OAAQ,QAAO,OAAO,EAAE,eAAe,CAAC;AACrD,UAAI,SAAS,QAAS,QAAOD,QAAO,EAAE,YAAY,CAAC;AACnD,UAAI,SAAS,MAAO,QAAO,GAAGA,QAAO,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC;AACvE,aAAO,GAAG,OAAO,EAAE,YAAY,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IACpD;AAEA,UAAM,WAA2C,CAAC;AAClD,QAAI,aAAa;AACjB,YAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,YAAM,IAAI,SAAS,EAAE,SAAS;AAC9B,UAAI,MAAM,YAAY;AACpB,iBAAS,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,QAAQ,EAAE,SAAS,EAAE,CAAC;AACtD,qBAAa;AAAA,MACf;AAAA,IACF,CAAC;AAED,UAAM,YAA4C,CAAC;AACnD,QAAI,aAAa;AACjB,eAAW,KAAK,UAAU;AACxB,UAAI,EAAE,IAAI,cAAc,UAAU;AAChC,kBAAU,KAAK,CAAC;AAChB,qBAAa,EAAE;AAAA,MACjB;AAAA,IACF;AAEA,WAAO,EAAE,GAAG,GAAG,UAAU,UAAU,OAAO,YAAY,WAAW,EAAE;AAAA,EACrE,GAAG,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC;AAElC,QAAM,QAAQ,QAAQ,cAAc,OAAO,QAAQ,UAAU,IAAI;AAEjE,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,YAAY,MAAM,WAAW;AAAA,MACnF,eAAe,CAAC,MAAM;AACpB,YAAI,CAAC,KAAM;AACX,cAAM,OAAO,aAAa,SAAS,sBAAsB;AACzD,YAAI,CAAC,KAAM;AACX,cAAM,MAAM,KAAK,MAAM,KAAK,EAAE,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;AAC3D,cAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,CAAC;AACjD,sBAAc,GAAG;AACjB,wBAAgB,QAAQ,GAAG,CAAC;AAAA,MAC9B;AAAA,MACA,gBAAgB,MAAM;AACpB,sBAAc,IAAI;AAClB,wBAAgB,IAAI;AAAA,MACtB;AAAA,MAEC,kBACC,gBAAAC,OAAC,SAAI,OAAc,QAAgB,OAAO,EAAE,SAAS,QAAQ,GAC3D;AAAA,wBAAAD,MAAC,UACC,0BAAAC,OAAC,oBAAe,IAAI,YAAY,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KACtD;AAAA,0BAAAD,MAAC,UAAK,QAAO,MAAK,WAAW,KAAK,OAAO,aAAa,MAAM;AAAA,UAC5D,gBAAAA,MAAC,UAAK,QAAO,QAAO,WAAW,KAAK,OAAO,aAAa,GAAG;AAAA,WAC7D,GACF;AAAA,QAEA,gBAAAA,MAAC,UAAK,GAAG,KAAK,UAAU,MAAM,QAAQ,UAAU,KAAK;AAAA,QACrD,gBAAAA,MAAC,UAAK,GAAG,KAAK,UAAU,MAAK,QAAO,QAAQ,KAAK,OAAO,aAAa,GAAG,gBAAe,SAAQ,eAAc,SAAQ;AAAA,QAEpH,KAAK,WAAW,IAAI,CAAC,GAAG,MACvB,gBAAAA,MAAC,UAAmB,GAAG,QAAQ,GAAG,GAAG,EAAE,IAAI,GAAG,MAAM,MAAM,MAAM,UAAU,IAAI,YAAW,OACtF,YAAE,SADM,IAAI,CAAC,EAEhB,CACD;AAAA,QAEA,KAAK,UAAU,IAAI,CAAC,GAAG,MACtB,gBAAAA,MAAC,UAAmB,GAAG,EAAE,GAAG,GAAG,SAAS,GAAG,MAAM,MAAM,MAAM,UAAU,IAAI,YAAY,EAAE,IAAI,KAAK,UAAU,UACzG,YAAE,SADM,IAAI,CAAC,EAEhB,CACD;AAAA,QAEA,SACC,gBAAAC,OAAC,OACC;AAAA,0BAAAD,MAAC,UAAK,IAAI,KAAK,EAAE,UAAW,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,UAAW,GAAG,IAAI,SAAS,IAAI,QAAQ,QAAQ,MAAM,MAAM,aAAa,GAAG;AAAA,UAClI,gBAAAA,MAAC,YAAO,IAAI,KAAK,EAAE,UAAW,GAAG,IAAI,KAAK,EAAE,MAAM,KAAK,GAAG,GAAG,KAAK,MAAM,KAAK,OAAO,QAAQ,MAAM,YAAY,aAAa,GAAG;AAAA,WAChI;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ;;;ACrKA,eAAsB,aACpB,QACA,WACA,OAA2B,CAAC,GACT;AACnB,MAAI;AACF,UAAM,SAAS,IAAI,gBAAgB,EAAE,QAAQ,UAAU,CAAC;AACxD,QAAI,KAAK,SAAS,KAAM,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AAC9D,UAAM,MAAM,MAAM,MAAM,GAAG,eAAe,wBAAwB,OAAO,SAAS,CAAC,EAAE;AACrF,QAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW,CAAC;AAAA,EAC1B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;ACbA,eAAsB,WAAW,QAAwC;AACvE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,eAAe,6BAA6B,mBAAmB,MAAM,CAAC,EAAE;AACnG,QAAI,CAAC,IAAI,GAAI,QAAO,EAAE,SAAS,CAAC,GAAG,gBAAgB,KAAK;AACxD,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,EAAE,SAAS,KAAK,WAAW,CAAC,GAAG,gBAAgB,KAAK,kBAAkB,KAAK;AAAA,EACpF,QAAQ;AACN,WAAO,EAAE,SAAS,CAAC,GAAG,gBAAgB,KAAK;AAAA,EAC7C;AACF;;;ACDO,IAAM,mBAAmB,CAAC,OAAO,MAAM,IAAI;;;ACXlD,IAAM,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAEjG,SAAS,YAAY,OAAuB;AACjD,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,SAAO,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI;AACxC;AAEO,SAAS,iBAAiB,WAAmB,WAAmC;AACrF,QAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,QAAM,MAAM,EAAE,WAAW;AACzB,QAAM,MAAM,aAAa,EAAE,YAAY,CAAC;AACxC,MAAI,cAAc,KAAM,QAAO,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,eAAe,CAAC;AAClE,QAAM,KAAK,OAAO,EAAE,YAAY,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,KAAK,OAAO,EAAE,cAAc,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,SAAO,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE;AACnC;;;ACXE,SACE,OAAAI,OADF,QAAAC,cAAA;AADK,IAAM,cAA+B,CAAC,EAAE,OAAO,MAAM,MAC1D,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,WAAW,GAAG,GAC1E;AAAA,kBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,eAAe;AAAA,MACjB;AAAA,MAEE,iBAAM,YAAY,MAAM,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA,EAC9C;AAAA,EACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,OAAO,GAAI,gBAAM,MAAK;AAAA,GAClF;;;ACVM,gBAAAE,aAAA;AALD,IAAM,YAA6B,CAAC,EAAE,QAAQ,QAAQ,UAAU,MAAM,MAC3E,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACnC,iBAAO,IAAI,CAAC,MAAM;AACjB,QAAM,KAAK,EAAE,WAAW;AACxB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,SAAS,MAAM,SAAS,EAAE,MAAM;AAAA,MAChC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,KAAK,YAAY;AAAA,QAC7B,OAAO,KAAK,SAAS,MAAM;AAAA,QAC3B,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MAEC,YAAE,YAAY,EAAE;AAAA;AAAA,IAbZ,EAAE;AAAA,EAcT;AAEJ,CAAC,GACH;;;ACVM,SAUE,YAAAC,YAVF,OAAAC,OAEE,QAAAC,cAFF;AATD,IAAM,aAA8B,CAAC,EAAE,OAAO,UAAU,QAAQ,WAAW,OAAO,OAAO,MAAM,MAAM;AAC1G,QAAM,IAAI,YAAY,KAAK;AAC3B,QAAMC,QAAO,SAAS;AACtB,QAAM,QAAQA,QAAO,MAAM,OAAO,MAAM;AACxC,QAAM,OAAOA,QAAO,KAAK;AAEzB,SACE,gBAAAD,OAAC,SAAI,OAAO,EAAE,WAAW,GAAG,GAC1B;AAAA,oBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,cAAc,KAAK,EAAE,GAC9D;AAAA,sBAAAD,MAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,QAAQ,YAAY,EAAE,GAAI,gBAAM,QAAQ,CAAC,GAAE;AAAA,MACrG,QAAQ,OACP,gBAAAC,OAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,KAAK,GACxE;AAAA,wBAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,WAAW,UAAU,IAAI,YAAY,IAAI,GAAG,eAAC;AAAA,QACnE,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,MAAM,MAAM,UAAU,GAAG,GAAI,oBAAS;AAAA,SAC9D;AAAA,OAEJ;AAAA,IACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,GAAG,UAAU,IAAI,YAAY,KAAK,OAAO,QAAQ,MAAM,OAAO,MAAM,GAC1F;AAAA,cAAQ,OACP,gBAAAA,OAAAF,YAAA,EACG;AAAA;AAAA,QACA,OAAO,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAE;AAAA,QACpB,UAAU,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAE;AAAA,SAC1B;AAAA,MAEF,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,MAAM,MAAM,YAAY,IAAI,GAAI,iBAAM;AAAA,OAC9D;AAAA,KACF;AAEJ;;;ACxCO,IAAM,iBAA+B;AAAA,EAC1C,EAAE,QAAQ,WAAW,MAAM,mBAAmB,UAAU,OAAO,UAAU,MAAM;AAAA,EAC/E,EAAE,QAAQ,WAAW,MAAM,QAAQ,UAAU,QAAQ,UAAU,MAAM;AAAA,EACrE,EAAE,QAAQ,WAAW,MAAM,UAAU,UAAU,UAAU,UAAU,MAAM;AAC3E;AAEO,IAAM,kBAA4B,MAAM;AAC7C,QAAM,MAAgB,CAAC;AACvB,QAAM,WAAW,KAAK;AACtB,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK;AACrC,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC5B,UAAM,OAAO;AACb,UAAM,QAAQ,EAAE,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC;AAChF,UAAM,OAAO,EAAE,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC7E,UAAM,MAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC5E,QAAI,KAAK,EAAE,WAAW,QAAQ,IAAI,UAAU,MAAM,MAAM,KAAK,MAAM,CAAC;AACpE,YAAQ;AAAA,EACV;AACA,SAAO;AACT,GAAG;;;ACpBH,SAASG,WAAU,OAAeC,QAA8B;AAC9D,QAAM,IAAI,MAAM,KAAK,EAAE,MAAM,mBAAmB;AAChD,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE;AAC3B,SAAO,QAAS,KAAK,KAAM,GAAG,KAAM,KAAK,IAAK,GAAG,KAAK,IAAI,GAAG,KAAKA,MAAK;AACzE;AAEO,SAAS,kBAAkB,QAAiC;AACjE,QAAM,aAAa,OAAO,mBAAmB;AAC7C,QAAM,SAAS,OAAO,mBAAmB;AACzC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,MAAMD,WAAU,QAAQ,IAAI,KAAK;AAAA,IACjC,MAAMA,WAAU,QAAQ,GAAG,KAAK;AAAA,IAChC,QAAQ,OAAO,0BAA0B;AAAA,EAC3C;AACF;;;ACjBO,SAAS,qBACd,MACA,SACe;AACf,QAAM,WAAW,qBAAa,mBAAmB,QAAQ,IAAI,CAAC,KAAK,qBAAa;AAChF,SAAQ,SAAS,OAAO,KAAK,qBAAa,GAAG,OAAO;AACtD;;;ACgBU,gBAAAE,aAAA;AAlBH,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,UAAU,QAAQ,cAAc,GAAG;AAAA,MAEpE,qBAAW,IAAI,CAAC,OAAO;AACtB,cAAM,SAAS,OAAO;AACtB,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,SAAS,EAAE;AAAA,YAC1B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,YAAY,SAAS,YAAY;AAAA,cACjC,OAAO,SAAS,SAAS,MAAM;AAAA,cAC/B,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YAEC;AAAA;AAAA,UAbI;AAAA,QAcP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;;;AZiHI,SAYE,OAAAC,OAZF,QAAAC,cAAA;AA5IJ,IAAMC,cAAa;AAEnB,IAAM,YAAY;AAElB,IAAM,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAIxG,IAAM,iBAGF;AAAA,EACF,OAAO,EAAE,YAAY,KAAK,WAAW,OAAO,EAAE;AAAA,EAC9C,MAAM,EAAE,YAAY,KAAK,WAAW,OAAO,EAAE;AAAA,EAC7C,MAAM,EAAE,YAAY,KAAK,KAAK,WAAW,OAAO,GAAG;AACrD;AAEA,SAAS,uBACP,SACA,WACU;AACV,MAAI,QAAQ,SAAS,EAAG,QAAO;AAE/B,QAAM,UAAU,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACrE,QAAM,kBAAkB,QAAQ,QAAQ,SAAS,CAAC,EAAE;AACpD,QAAM,SAAS,kBAAkB,eAAe,SAAS,EAAE;AAC3D,SAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,aAAa,MAAM;AAC9D;AAWO,IAAM,cAA+B,CAAC;AAAA,EAC3C;AAAA,EACA,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ;AACF,MAAM;AACJ,QAAM,QAAQC,UAAQ,MAAM,kBAAkB,MAAM,GAAG,CAAC,MAAM,CAAC;AAC/D,QAAM,eAAeA;AAAA,IACnB,MAAM,qBAAqB,OAAO,MAAM,aAAa;AAAA,IACrD,CAAC,OAAO,IAAI;AAAA,EACd;AACA,QAAM,aACJ,OAAO,uBAAuB,OAAO,eAAeD;AAEtD,EAAAE,YAAU,MAAM;AACd;AAAA,MACE,OAAO,uBAAuB,OAAO,eAAe;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,OAAO,qBAAqB,OAAO,WAAW,CAAC;AAEnD,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,OAAO,CAAC,GAAG,UAAU,EAAE;AAC5D,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAyB,IAAI;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAmB,MAAM,iBAAiB,CAAC,CAAC;AAC1E,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAwB,IAAI;AAGxE,QAAM,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,KAAK,OAAO,CAAC;AACvE,QAAM,cAAc,aAAa;AAEjC,EAAAD,YAAU,MAAM;AACd,aAAS,IAAI;AACb,QAAI,KAAK;AACP,iBAAW,uBAAuB,gBAAgB,SAAS,CAAC;AAC5D;AAAA,IACF;AACA,QAAI,YAAY;AAChB,QAAI,aAAa;AAEf,iBAAW,WAAW,EAAE,KAAK,CAAC,QAAQ;AACpC,YAAI,UAAW;AACf,mBAAW,IAAI,OAAO;AACtB,0BAAkB,IAAI,cAAc;AAAA,MACtC,CAAC;AACD,aAAO,MAAM;AACX,oBAAY;AAAA,MACd;AAAA,IACF;AACA,sBAAkB,IAAI;AACtB,iBAAa,QAAQ,OAAO;AAAA,MAC1B,OAAO,eAAe,SAAS,EAAE;AAAA,IACnC,CAAC,EAAE,KAAK,CAAC,SAAS;AAChB,UAAI,CAAC,UAAW,YAAW,uBAAuB,MAAM,SAAS,CAAC;AAAA,IACpE,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,KAAK,WAAW,CAAC;AAExC,QAAM,QAAQ;AACd,QAAM,iBAAiBD,UAAQ,MAAM;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,MACJ,MAAM,WAAW,YACb,aACA,MAAM,WAAW,YACf,SACA,MAAM,WAAW,YACf,WACA;AACV,WAAO,MAAM,EAAE,GAAG,OAAO,MAAM,aAAa,OAAO,GAAG,EAAE,IAAI;AAAA,EAC9D,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,EAAE,OAAO,QAAQ,UAAU,IAAIA,UAAQ,MAAM;AACjD,UAAM,QAAQ,QAAQ,CAAC,GAAG,SAAS;AACnC,UAAM,QAAQ,SAAS,QAAQ,QAAQ,SAAS,CAAC;AACjD,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,OAAO,QAAQ;AACrB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,QAAS,OAAO,QAAS,MAAM;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,OAAO,CAAC,QAAsC;AAClD,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG;AACzC,WAAO,SAAS,aAAa,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAAA,EAClD;AAIA,QAAM,QAAQ,cACT,KAAK,QAAQ,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY,IAAI,cAAc,KAAK,KAC3E,QACE,iBAAiB,MAAM,WAAW,SAAS,IAC3C,aAAa,QAAQ,SAAS;AAEpC,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU,YAAY,SAAS;AAAA,QAC/B,WAAW,YAAY,YAAY;AAAA,QACnC,SAAS;AAAA,QACT,YAAY,MAAM;AAAA,QAClB,cAAc;AAAA,QACd,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,QAAQ;AAAA,YACR,UAAU,CAAC,MAAM;AACf,wBAAU,CAAC;AACX,8BAAgB,CAAC;AAAA,YACnB;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA,MAAC,eAAY,OAAO,gBAAgB,OAAc;AAAA,QAClD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU,gBAAgB,YAAY;AAAA,YACtC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,QAAQ,WAAW;AAAA;AAAA,QAC5B;AAAA,QACC,cAAc,OACb,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,OAAO,aAAa,EAAoB;AAAA,YACnD;AAAA;AAAA,QACF;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA;AAAA,QACjB;AAAA;AAAA;AAAA,EACF;AAEJ;;;AalIS,gBAAAM,aAAA;AAzDT,IAAM,kBAA4D;AAAA,EAChE,OAAO;AAAA,IACL,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,WAAW,UAAU,MAAM;AAAA,IAC7E,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,WAAW,UAAU,MAAM;AAAA,IAC7E,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,WAAW,UAAU,MAAM;AAAA,EAC/E;AAAA,EACA,OAAO;AAAA,IACL,EAAE,QAAQ,QAAQ,MAAM,cAAc,UAAU,QAAQ,UAAU,MAAM;AAAA,IACxE,EAAE,QAAQ,QAAQ,MAAM,UAAU,UAAU,QAAQ,UAAU,MAAM;AAAA,IACpE,EAAE,QAAQ,QAAQ,MAAM,SAAS,UAAU,QAAQ,UAAU,MAAM;AAAA,EACrE;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,QAAQ,WAAW,MAAM,WAAW,UAAU,OAAO,UAAU,MAAM;AAAA,IACvE,EAAE,QAAQ,WAAW,MAAM,YAAY,UAAU,OAAO,UAAU,MAAM;AAAA,IACxE,EAAE,QAAQ,WAAW,MAAM,OAAO,UAAU,OAAO,UAAU,MAAM;AAAA,EACrE;AAAA,EACA,KAAK;AAAA,IACH,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,OAAO,UAAU,MAAM;AAAA,IACzE,EAAE,QAAQ,WAAW,MAAM,QAAQ,UAAU,QAAQ,UAAU,MAAM;AAAA,IACrE,EAAE,QAAQ,WAAW,MAAM,UAAU,UAAU,UAAU,UAAU,MAAM;AAAA,EAC3E;AAAA,EACA,SAAS;AAAA,IACP,EAAE,QAAQ,aAAa,MAAM,cAAc,UAAU,MAAM;AAAA,IAC3D,EAAE,QAAQ,OAAO,MAAM,aAAa,UAAU,MAAM;AAAA,EACtD;AAAA,EACA,OAAO;AAAA,IACL,EAAE,QAAQ,OAAO,MAAM,OAAO,UAAU,MAAM;AAAA,IAC9C,EAAE,QAAQ,SAAS,MAAM,UAAU,UAAU,MAAM;AAAA,IACnD,EAAE,QAAQ,aAAa,MAAM,cAAc,UAAU,SAAS;AAAA,EAChE;AAAA,EACA,OAAO;AAAA,IACL,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,WAAW,UAAU,MAAM;AAAA,IAC7E,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,WAAW,UAAU,MAAM;AAAA,IAC7E,EAAE,QAAQ,WAAW,MAAM,aAAa,UAAU,WAAW,UAAU,MAAM;AAAA,EAC/E;AACF;AAIO,IAAM,mBAAmB,CAAC,cAAsB,cACpD,UAAU,UAAU,gBAAgB,YAAY,GAAG,UAAU,KAAK;AAE9D,IAAM,wBAAwB,CAAC,cAAsB,cACzD,UAAU,SAAS,WAAW,gBAAgB,YAAY,MAAM,CAAC;AAE7D,IAAM,eAAgC,CAAC,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,YAAY,YAAY,eAAe,KAAK,WAAW,KAAK,MAAM;AACpK,QAAM,SAAS,UAAU,SAAS,WAAW,gBAAgB,YAAY;AACzE,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;AAE3C,QAAM,SAAS;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB,eAAe,SAAS,YAAY;AAAA,IACrD,aAAa;AAAA,IACb,wBAAwB;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,gBAAAA,MAAC,eAAY,QAAgB,QAAgB,KAAU,QAAgB,WAAsB;AACtG;;;AC3EA,SAAS,aAAAC,aAAW,UAAAC,gBAAc;AA+D5B,SAUE,OAAAC,OAVF,QAAAC,cAAA;AA7DC,IAAM,0BAMR,CAAC,EAAE,QAAQ,QAAQ,eAAe,aAAa,QAAQ,UAAU,MAAM;AAC1E,QAAM,eAAeF,SAAuB,IAAI;AAGhD,QAAM,UAAU,iBAAiB,gBAAgB,SAAS,gBAAgB;AAC1E,QAAM,QAAQ,YAAY,SAAS,IAAI,SAAS;AAEhD,EAAAD,YAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEhB,cAAU,cAAc;AAExB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AACpB,cAAU,YAAY,OAAO;AAE7B,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,MACL;AACF,WAAO,QAAQ;AACf,UAAM,SAAS,KAAK,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAe;AAAA,MACf,QAAQ;AAAA,MACR;AAAA,MACA,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,WAAO,YAAY,SAAS,eAAe,MAAM,CAAC;AAClD,cAAU,YAAY,MAAM;AAE5B,WAAO,MAAM;AACX,UAAI,aAAa,SAAS;AACxB,eAAO,aAAa,QAAQ,YAAY;AACtC,uBAAa,QAAQ,YAAY,aAAa,QAAQ,UAAU;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,UAAU,CAAC;AAEhC,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ,GAAG,MAAM;AAAA,QACjB,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO,UAAU,IAAI,SAAS,GAAG,MAAM,KAAK;AAAA,YAC5C,QAAQ,GAAG,OAAO;AAAA,YAClB,WAAW,UAAU,IAAI,SAAY,SAAS,KAAK;AAAA,YACnD,iBAAiB;AAAA,UACnB;AAAA,UAEA;AAAA,4BAAAD,MAAC,WAAO;AAAA;AAAA;AAAA,WAGN;AAAA,YACF,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU,SAAS;AAAA;AAAA,YAC7D;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,eAAe;AAAA,kBACf,QAAQ;AAAA,gBACV;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,YAAY,aAAa;AAAA,kBACzB,eAAe;AAAA,kBACf,QAAQ;AAAA,gBACV;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AflDE,SA0KM,YAAAE,YA1KN,OAAAC,OAyCI,QAAAC,cAzCJ;AAvBF,IAAM,OACJ;AACF,IAAM,YACJ;AACF,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWnB,IAAM,kBAA2B,EAAE,OAAO,KAAK,IAAI,IAAI;AACvD,IAAM,iBAA0B,EAAE,OAAO,KAAK,IAAI,IAAI;AACtD,IAAM,iBAA0B,EAAE,OAAO,KAAK,IAAI,IAAI;AAEtD,IAAM,cAA0D,CAAC;AAAA,EAC/D;AAAA,EACA;AACF,MACE,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf;AAAA,MACA,YAAY;AAAA,IACd;AAAA,IAEC;AAAA;AACH;AAGF,IAAM,eAKD,CAAC,EAAE,SAAS,UAAU,iBAAiB,KAAK,MAAM;AACrD,QAAM,UAAU;AAAA,IACd,QAAQ,eAAe,QAAQ,WAAW;AAAA,EAC5C;AACA,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAU,OAAM,KAAK,eAAe,QAAQ,QAAQ,EAAE,YAAY,CAAC;AACvE,MAAI,gBAAiB,OAAM,KAAK,kBAAkB,OAAO,EAAE,YAAY,CAAC;AACxE,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,OAAO,MAAM,MAAM,GAAG;AAAA,QACtB,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,OAAM;AAAA,YACN,QAAO;AAAA,YACP,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA,YAEf;AAAA,8BAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,cAC9B,gBAAAA,MAAC,cAAS,QAAO,oBAAmB;AAAA;AAAA;AAAA,QACtC;AAAA,QACC,MAAM,IAAI,CAAC,GAAG,MACb,gBAAAC,OAAC,UACE;AAAA,cAAI,KACH,gBAAAD,MAAC,UAAK,eAAY,QAAO,OAAO,EAAE,QAAQ,SAAS,SAAS,IAAI,GAAG,kBAEnE;AAAA,UAED;AAAA,aANQ,CAOX,CACD;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,IAAM,iBAAsD,CAAC;AAAA,EAC3D;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAIE,WAAS,KAAK;AACxC,QAAM,KAAK,aAAa,eAAe,WAAW,SAAS;AAC3D,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,MAAM,SAAS,IAAI;AAAA,MACjC,cAAc,MAAM,SAAS,KAAK;AAAA,MAClC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,QAAQ,qBAAqB;AAAA,QACrC,YAAY;AAAA,MACd;AAAA,MACD;AAAA;AAAA,QAEC,gBAAAD,MAACG,eAAA,EAAa,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,EAC7C;AAEJ;AAEA,IAAM,uBAAuB,MAAe;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAID,WAAkB,eAAe;AAE/D,EAAAE,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,SAAS,OAAO,WAAW,oBAAoB;AACrD,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACnB,UAAI,OAAO,QAAS,YAAW,cAAc;AAAA,eACpC,OAAO,QAAS,YAAW,cAAc;AAAA,UAC7C,YAAW,eAAe;AAAA,IACjC;AAEA,WAAO;AACP,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,MAAM;AAC3C,aAAO,oBAAoB,UAAU,MAAM;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;AAEA,IAAM,YAUD,CAAC,EAAE,QAAQ,cAAc,QAAQ,gBAAgB,aAAa,YAAY,YAAY,eAAe,IAAI,MAAM;AAClH,QAAM,OAAO,aAAa,cAAc;AACxC,QAAM,UAAU,qBAAqB;AAErC,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,QACrC,cAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ;AAAA,YAChB,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QACC,UACC,gBAAAC,OAAAF,YAAA,EACE;AAAA,0BAAAC,MAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,GAAG;AAAA,UAC5B,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,QAAQ,QAAQ;AAAA,cAChB,YAAY;AAAA,cACZ,WAAW;AAAA;AAAA,UACb;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEO,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,aAAa,iBAAiB,QAAQ,cAAc,QAAQ,MAAM;AACpF,QAAM,WACH,sBAAwD,QAAQ,YAAY,KAAK;AACpF,QAAM,eAAe,YAAY,cAAc;AAC/C,QAAM,OAAO,aAAa,YAAY,cAAc;AACpD,QAAM,gBAAgB,YAAY,iBAAiB;AAEnD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,WAAU;AAAA,MACV,OAAO,EAAE,YAAY,YAAY,WAAW;AAAA,MAE5C;AAAA,wBAAAD,MAAC,WAAO,sBAAW;AAAA,QACnB,gBAAAC,OAAC,SAAI,WAAW,cAAc,YAAY,KAAK,sBAAsB,IACnE;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM,QAAQ,OAAO;AAAA,cAC9B,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,gBACrC,cAAc,YAAY;AAAA,gBAC1B,WAAW;AAAA,cACb;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAK,QAAQ;AAAA,oBACb,KAAK,QAAQ;AAAA,oBACb,SAAQ;AAAA,oBACR,UAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,SAAS;AAAA,sBACT,eAAe;AAAA,oBACjB;AAAA,oBAEA;AAAA,sCAAAD,MAAC,eAAY,OAAO,eAAe,OAAO,eAAe;AAAA,sBACzD,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,OAAO;AAAA,4BACL,YAAY;AAAA,4BACZ,UAAU;AAAA,4BACV,OAAO;AAAA,4BACP,YAAY;AAAA,4BACZ,YAAY;AAAA,4BACZ,eAAe;AAAA,4BACf,QAAQ;AAAA,4BACR,WAAW;AAAA,0BACb;AAAA,0BAEC,kBAAQ;AAAA;AAAA,sBACX;AAAA,sBACC,QAAQ,eACP,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,YAAY;AAAA,4BACZ,OAAO,MAAM,MAAM,GAAG;AAAA,4BACtB,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,YAAY;AAAA,4BACZ,QAAQ;AAAA,4BACR,WAAW;AAAA,4BACX,SAAS;AAAA,4BACT,iBAAiB;AAAA,4BACjB,iBAAiB;AAAA,4BACjB,UAAU;AAAA,0BACZ;AAAA,0BAEC,kBAAQ;AAAA;AAAA,sBACX;AAAA,sBAEF,gBAAAC;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,KAAK;AAAA,4BACL,WAAW;AAAA,0BACb;AAAA,0BAEA;AAAA,4CAAAD;AAAA,8BAAC;AAAA;AAAA,gCACC;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA;AAAA,4BACF;AAAA,4BACA,gBAAAA,MAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAChC,0BAAAA,MAAC,kBAAe,eAA8B,GAChD;AAAA;AAAA;AAAA,sBACF;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UACC,aACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ;AAAA,cACR,cAAc,QAAQ;AAAA,cACtB,QAAQ,QAAQ;AAAA,cAChB,gBAAgB,YAAY;AAAA,cAC5B,aAAa,YAAY;AAAA,cACzB,YAAY,YAAY,cAAc;AAAA,cACtC,YAAY,YAAY;AAAA,cACxB,eAAe,YAAY;AAAA,cAC3B;AAAA;AAAA,UACF;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AgB/WA,SAAgB,aAAAK,aAAW,UAAAC,gBAAc;;;ACEzC,SAAS,aAAAC,aAAW,YAAAC,kBAAgB;AA6C3B,gBAAAC,aAAA;AAvCT,IAAM,kBAAkB,MAAc;AACpC,QAAM,KAAK,SAAS;AACpB,QAAM,aAAa,GAAG,eAAe,GAAG;AACxC,MAAI,cAAc,EAAG,QAAO;AAC5B,QAAM,QAAS,GAAG,YAAY,aAAc;AAC5C,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AACzC;AAEO,IAAM,qBAAwD,CAAC,EAAE,MAAM,MAAM;AAClF,QAAM,CAAC,UAAU,WAAW,IAAID,WAAS,CAAC;AAE1C,EAAAD,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,QAAQ;AACZ,UAAM,WAAW,MAAM;AACrB,2BAAqB,KAAK;AAC1B,cAAQ,sBAAsB,MAAM,YAAY,gBAAgB,CAAC,CAAC;AAAA,IACpE;AAEA,aAAS;AACT,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,MAAM;AACX,2BAAqB,KAAK;AAC1B,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,WAAgC;AAAA,IACpC,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO,GAAG,QAAQ;AAAA,IAClB,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,SAAO,gBAAAE,MAAC,SAAI,OAAO,UAAU;AAC/B;;;AC9CA,SAAS,aAAAC,aAAW,YAAAC,kBAAgB;AACpC,SAAS,0BAA0B;;;ACDnC,SAAS,YAAY,YAAY,oBAAoB;AAqCjD,SASI,OAAAC,OATJ,QAAAC,cAAA;AA9BJ,IAAM,WAAW;AAEjB,IAAM,cAAc,CAAC,QAAqC;AAAA,EACxD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAEO,IAAM,eAAe,CAAC,EAAE,UAAU,IAAI,MAAa;AACxD,QAAM,OAAO,CAAC,SAAiB,CAAC,MAAwB;AACtD,MAAE,gBAAgB;AAClB,UAAM,SAAS,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAC9E,UAAM,cAAc,mBAAmB,QAAQ;AAC/C,UAAM,aAAa,mBAAmB,MAAM;AAC5C,UAAM,QAAQ,KACX,QAAQ,UAAU,WAAW,EAC7B,QAAQ,SAAS,UAAU,EAC3B,QAAQ,cAAc,mBAAmB,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;AACpE,WAAO,KAAK,OAAO,UAAU,qBAAqB;AAAA,EACpD;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,QAAQ,KAAK,UAAU,YAAY,SAAS;AAAA,MAC9D,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAElC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,YAAY,MAAM;AAAA,YACzB,SAAS,KAAK,wDAAwD;AAAA,YACtE,cAAW;AAAA,YAEX,0BAAAA,MAAC,cAAW,MAAM,IAAI;AAAA;AAAA,QACxB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,YAAY,SAAS;AAAA,YAC5B,SAAS,KAAK,gCAAgC;AAAA,YAC9C,cAAW;AAAA,YAEX,0BAAAA,MAAC,cAAW,MAAM,IAAI;AAAA;AAAA,QACxB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,YAAY,SAAS;AAAA,YAC5B,SAAS,KAAK,2DAA2D;AAAA,YACzE,cAAW;AAAA,YAEX,0BAAAA,MAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,QAC1B;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADkCM,SACE,OAAAE,OADF,QAAAC,cAAA;AAlFN,IAAM,kBAAkB,CAAC,cAA+B;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,KAAK;AAE5C,EAAAC,YAAU,MAAM;AACd,QAAI,QAAQ;AACZ,UAAM,WAAW,MAAM;AACrB,UAAI,MAAO;AACX,cAAQ,OAAO,sBAAsB,MAAM;AACzC,mBAAW,OAAO,UAAU,SAAS;AACrC,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,aAAS;AACT,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,UAAI,MAAO,QAAO,qBAAqB,KAAK;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,SAAO;AACT;AAEO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAgC;AAC9B,QAAM,UAAU,gBAAgB,eAAe,GAAG;AAElD,QAAM,WAAgC;AAAA,IACpC,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,cAAc,aAAa,MAAM,WAAW,GAAG,CAAC;AAAA,IAChD,SAAS;AAAA,IACT,SAAS,UAAU,SAAS;AAAA,IAC5B,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,SAAS,UAAU,IAAI;AAAA,IACvB,WAAW,UAAU,kBAAkB;AAAA,IACvC,eAAe,UAAU,SAAS;AAAA,EACpC;AAEA,QAAM,kBAAuC;AAAA,IAC3C,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,QAAM,gBAAqC;AAAA,IACzC,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAEA,SACE,gBAAAF,OAAC,SAAI,OAAO,UACV;AAAA,oBAAAA,OAAC,YAAO,MAAK,UAAS,OAAO,iBAAiB,SAAS,SACrD;AAAA,sBAAAD,MAAC,sBAAmB,MAAM,IAAI;AAAA,MAC9B,gBAAAA,MAAC,UAAM,qBAAU;AAAA,OACnB;AAAA,IACA,gBAAAA,MAAC,OAAE,OAAO,eAAgB,oBAAS;AAAA,IAClC,aAAa,gBAAAA,MAAC,gBAAa,UAAoB;AAAA,KAClD;AAEJ;;;AErGA,SAAS,sBAAAI,qBAAoB,kBAAAC,uBAAsB;;;ACL5C,IAAM,QAAQ;AAEd,IAAM,gBAAgB,CAAC,YAAmC;AAC/D,QAAM,OAAO,QAAQ,aAAa,KAAK,IAAI,QAAQ,cAAc,QAAQ;AACzE,SAAO,KACJ,MAAM,SAAS,EACf,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AAEO,IAAM,iBAAiB,CAAC,SAAmC;AAChE,MAAI,CAAC,KAAM,QAAO,CAAC,IAAI,EAAE;AACzB,SAAO,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;AACzC;;;ADuBE,SAuBE,OAAAC,OAvBF,QAAAC,cAAA;AA5BF,IAAM,WACJ;AAkBF,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAKE,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY,YAAY,MAAM,WAAW,IAAI,IAAI;AAAA,MACjD,QAAQ,aAAa,YAAY,MAAM,WAAW,IAAI,IAAI,uBAAuB;AAAA,MACjF,cAAc;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,OAAO,aAAa;AAAA,MACpB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IAEA;AAAA,sBAAAD,MAACE,qBAAA,EAAmB,MAAM,IAAI;AAAA,MAC9B,gBAAAF,MAAC,UAAM,mBAAS,QAAO;AAAA;AAAA;AACzB;AAGF,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,MAAqC;AACnC,QAAM,UAAU,oBAAoB,QAAQ,eAAe,QAAQ,OAAO;AAC1E,QAAM,YAAiC;AAAA,IACrC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,eAAe;AAAA,IACf,eAAe;AAAA,IACf,UAAU;AAAA,IACV;AAAA,EACF;AAEA,SACE,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,IAAI,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,UAAU,OAAO,GAC3F;AAAA,gBAAY,gBAAAD,MAAC,UAAK,OAAO,WAAY,yBAAe,QAAQ,UAAU,IAAI,GAAE;AAAA,IAC5E,mBACC,gBAAAC,OAAC,UAAK,OAAO,WACX;AAAA,sBAAAD,MAACG,iBAAA,EAAe,MAAM,IAAI;AAAA,MACzB,kBAAkB,SAAS,mBAAmB;AAAA,OACjD;AAAA,IAED,aAAa,gBAAAH,MAAC,gBAAa,UAAU,QAAQ,UAAU;AAAA,KAC1D;AAEJ;AAEA,IAAM,cAAc,CAAC,UAA6B;AAChD,QAAM,EAAE,SAAS,WAAW,UAAU,UAAU,IAAI;AACpD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,OAAO;AAAA,YACT;AAAA,YAEC,kBAAQ;AAAA;AAAA,QACX;AAAA,QACC,QAAQ,eACP,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB,UAAU;AAAA,YACZ;AAAA,YAEC,kBAAQ;AAAA;AAAA,QACX;AAAA,QAEF,gBAAAA,MAAC,WAAS,GAAG,OAAO,OAAO,WAAW;AAAA;AAAA;AAAA,EACxC;AAEJ;AAEO,IAAM,cAAc,CAAC,UAAqB;AAC/C,QAAM,EAAE,SAAS,SAAS,eAAe,IAAI;AAE7C,MAAI,CAAC,QAAQ,UAAU;AACrB,UAAM,WAAW,aAAa,cAAc;AAC5C,WACE,gBAAAC,OAAC,YAAO,OAAO,EAAE,UAAU,YAAY,YAAY,eAAe,GAChE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,WAAW;AAAA,UACX,UAAU,MAAM,UAAU,IAAI;AAAA,UAC9B,WAAW,MAAM,UAAU,IAAI;AAAA;AAAA,MACjC;AAAA,MACA,gBAAAA,MAAC,sBAAmB,SAAkB,WAAW,UAAU,OAAO,MAAM,WAAW;AAAA,OACrF;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ;AAAA,YACb,KAAK,QAAQ;AAAA,YACb,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA;AAAA,QAC7F;AAAA,QACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,YAAY,SAAS,GAAG;AAAA,QACtE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACE,GAAG;AAAA,YACJ,WAAU;AAAA,YACV,UAAS;AAAA,YACT,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA,MAAC,sBAAmB,SAAkB,OAAO,MAAM,WAAW;AAAA;AAAA;AAAA,EAChE;AAEJ;;;AEtKuB,gBAAAI,OAInB,QAAAC,cAJmB;AATvB,IAAM,YAAY,CAAC,EAAE,MAAM,SAAS,UAAU,WAAW,SAAS,MAAsB;AACtF,QAAM,QAA6B;AAAA,IACjC,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAS,QAAO,gBAAAD,MAAC,OAAE,OAAe,gBAAK;AAE5C,QAAM,CAAC,OAAO,IAAI,IAAI,eAAe,IAAI;AACzC,SACE,gBAAAC,OAAC,OAAE,OACD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAME,gBAAAA,MAAC,YAAO,OAAO,EAAE,QAAQ,SAAS,GAChC,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY,QAAQ,cAAc,IAAI,UAAU;AAAA,IAChD,YAAY;AAAA,IACZ,WAAS;AAAA;AACX,GACF;AAWK,IAAM,cAAc,CAAC,EAAE,YAAY,cAAc,QAAQ,gBAAgB,SAAS,MAAwB;AAC/G,QAAM,YAAY,aAAa,cAAc;AAC7C,QAAM,aAAa,WAAW,UAAU,IAAI,IAAI,WAAW,SAAS;AAEpE,SACE,gBAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,KAAK,QAAQ,UAAU,SAAS,iBAAiB,GACtE,qBAAW,IAAI,CAAC,MAAM,MACrB,gBAAAC,OAAC,SACC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,IACZ;AAAA,IACC,MAAM,cACL,gBAAAA,MAAC,eAAY,cAA4B,QAAgB,gBAAgC,UAAoB;AAAA,OATvG,CAWV,CACD,GACH;AAEJ;;;ACpGA,SAAgB,aAAAE,aAAW,YAAAC,YAAU,WAAAC,iBAAe;AAwG9C,SA2HU,YAAAC,YAnHR,OAAAC,OARF,QAAAC,cAAA;AA/EC,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAAM;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,WAAwB,CAAC,CAAC;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAG5C,QAAM,eAAeC,UAAQ,MAAM;AACjC,WAAO,SAAS;AAAA,MACd,CAAC,MACC,EAAE,aAAa,eAAe,YAC9B,EAAE,aAAa,eAAe,aAC7B,EAAE,iBAAiB,eAAe,gBAAgB,EAAE,QAAQ,eAAe;AAAA,IAChF;AAAA,EACF,GAAG,CAAC,UAAU,cAAc,CAAC;AAG7B,EAAAC,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,uBAAmB,CAAC,CAAC;AACrB,QAAI,aAAa,SAAS,KAAK,eAAe,cAAc;AAC1D,iBAAW,IAAI;AACf,wBAAkB,MAAM,GAAG,IAAI,eAAe,YAAY,EAAE,KAAK,CAAC,QAAQ;AACxE,YAAI,CAAC,UAAW;AAChB,YAAI,OAAO,IAAI,SAAS,GAAG;AACzB,6BAAmB,GAAG;AAAA,QACxB;AACA,mBAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,iBAAW,KAAK;AAAA,IAClB;AACA,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,eAAe,cAAc,eAAe,UAAU,IAAI,CAAC;AAGpF,QAAM,cAAcD,UAAQ,MAAM;AAChC,UAAM,WAAW,CAAC,GAAG,YAAY;AACjC,eAAW,MAAM,iBAAiB;AAChC,UACE,GAAG,aAAa,eAAe,YAC/B,GAAG,aAAa,eAAe,YAC/B,CAAC,SAAS,KAAK,CAAC,SAAS,KAAK,aAAa,GAAG,QAAQ,GACtD;AACA,iBAAS,KAAK,EAAE;AAAA,MAClB;AAAA,IACF;AACA,WAAO,SAAS,MAAM,GAAG,CAAC;AAAA,EAC5B,GAAG,CAAC,cAAc,iBAAiB,cAAc,CAAC;AAElD,MAAI,CAAC,WAAW,YAAY,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,YACJ,YAAY,iBACZ,aAAa,YAAY,kBAAkB,SAAS;AACtD,QAAM,eAAe,YAAY,gBAAgB,MAAM,WAAW,GAAG;AACrE,QAAM,YAAY,YAAY,aAAa,MAAM,WAAW,GAAG;AAC/D,QAAM,aAAa,YAAY,cAAc;AAE7C,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW,aAAa,MAAM,WAAW,IAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,cAAc;AAAA,YAChB;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,iBAAiB;AAAA,oBACjB,cAAc;AAAA,oBACd,SAAS;AAAA,kBACX;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,eAAe;AAAA,kBACjB;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC,OAAC,SAAI,WAAU,oBACb;AAAA,0BAAAD,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAYN;AAAA,UAED,YAAY,IAAI,CAAC,MAAM,QACtB,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,MAAM;AACb,oBAAI,UAAU;AACZ,2BAAS,IAAI;AAAA,gBACf;AACA,oBAAI,OAAO,WAAW,aAAa;AACjC,yBAAO,SAAS,EAAE,KAAK,GAAG,UAAU,SAAS,CAAC;AAC9C,2BAAS,gBAAgB,YAAY;AACrC,2BAAS,KAAK,YAAY;AAAA,gBAC5B;AAAA,cACF;AAAA,cACA,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,iBAAiB,MAAM,WAAW,IAAI;AAAA,gBACtC,QAAQ,aAAa,MAAM,WAAW,IAAI,CAAC;AAAA,gBAC3C,QAAQ;AAAA,gBACR,YAAY;AAAA,cACd;AAAA,cACA,cAAc,CAAC,MAAM;AACnB,kBAAE,cAAc,MAAM,kBAAkB,MAAM,WAAW,IAAI;AAC7D,kBAAE,cAAc,MAAM,YAAY;AAAA,cACpC;AAAA,cACA,cAAc,CAAC,MAAM;AACnB,kBAAE,cAAc,MAAM,kBAAkB,MAAM,WAAW,IAAI;AAC7D,kBAAE,cAAc,MAAM,YAAY;AAAA,cACpC;AAAA,cAEC;AAAA,qBAAK,YACJ,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,UAAU;AAAA,sBACV,cAAc;AAAA,sBACd,iBAAiB,MAAM,WAAW,IAAI;AAAA,oBACxC;AAAA,oBAEA,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK,KAAK;AAAA,wBACV,KAAK,KAAK;AAAA,wBACV,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,WAAW;AAAA,wBACb;AAAA,wBACA,SAAS,CAAC,MAAM;AACd,0BAAC,EAAE,cAA8B,MAAM,UAAU;AAAA,wBACnD;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA,gBAGF,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,cAAc;AAAA,oBAChB;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,eAAe;AAAA,4BACf,OAAO;AAAA,4BACP,eAAe;AAAA,0BACjB;AAAA,0BAEC,2BAAiB,KAAK,gBAAgB,KAAK;AAAA;AAAA,sBAC9C;AAAA,sBACC,KAAK,YACJ,gBAAAC,OAAAF,YAAA,EACE;AAAA,wCAAAC,MAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG,oBAAC;AAAA,wBAClD,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAC3C,yBAAe,KAAK,UAAU,IAAI,GACrC;AAAA,yBACF;AAAA;AAAA;AAAA,gBAEJ;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,SAAS;AAAA,sBACT,iBAAiB;AAAA,sBACjB,iBAAiB;AAAA,sBACjB,UAAU;AAAA,oBACZ;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA,gBAEC,KAAK,eACJ,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,SAAS;AAAA,sBACT,iBAAiB;AAAA,sBACjB,iBAAiB;AAAA,sBACjB,UAAU;AAAA,oBACZ;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,YAnHG,GAAG,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,GAAG;AAAA,UAqH/C,CACD;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;APjNI,SACE,OAAAK,OADF,QAAAC,cAAA;AA/BG,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAeC,SAAuB,IAAI;AAChD,QAAM,EAAE,gBAAgB,WAAW,IAAI;AACvC,QAAM,aAAa,cAAc,OAAO;AAExC,EAAAC,YAAU,MAAM;AACd,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,IAC5E;AACA,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,SAAS,EAAE,KAAK,GAAG,UAAU,SAAS,CAAC;AAC9C,eAAS,gBAAgB,YAAY;AACrC,eAAS,KAAK,YAAY;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,SAAS,UAAU,SAAS,QAAQ,CAAC;AAEzC,SACE,gBAAAF,OAAC,SAAI,KAAK,cAAc,OAAO,EAAE,YAAY,eAAe,GAC1D;AAAA,oBAAAD,MAAC,sBAAmB,OAAO,eAAe;AAAA,IAC1C,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA,YAAY;AAAA,QACZ,WAAW,aAAa,cAAc;AAAA,QACtC;AAAA,QACA,WAAW,cAAc;AAAA;AAAA,IAC3B;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,cAAc;AAAA,QACzB,qBAAqB,cAAc;AAAA;AAAA,IACrC;AAAA,IACC,eACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,UAAU,cAAc;AAAA;AAAA,IAC1B;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,cAAc;AAAA;AAAA,IACvB;AAAA,KACF;AAEJ;;;AQvCI,gBAAAI,aAAA;AApDG,SAAS,eAAe,GAAgB;AAC7C,SAAO;AAAA,IACL,gBAAgB,EAAE;AAAA,IAClB,YAAY,EAAE;AAAA,IACd,YAAY,EAAE;AAAA,IACd,aAAa,EAAE;AAAA,IACf,eAAe,EAAE;AAAA,IACjB,kBAAkB,EAAE;AAAA,IACpB,cAAc,EAAE;AAAA,IAChB,WAAW,EAAE;AAAA,IACb,YAAY,EAAE;AAAA,EAChB;AACF;AAEO,SAAS,eAAe,GAAgB;AAC7C,SAAO;AAAA,IACL,gBAAgB,EAAE;AAAA,IAClB,YAAY,EAAE;AAAA,IACd,YAAY,EAAE;AAAA,IACd,aAAa,EAAE;AAAA,IACf,eAAe,EAAE;AAAA,IACjB,cAAc,EAAE;AAAA,IAChB,WAAW,EAAE;AAAA,IACb,YAAY,EAAE;AAAA,IACd,YAAY,EAAE;AAAA,EAChB;AACF;AAEO,SAAS,iBAAiB,GAAgB;AAC/C,SAAO;AAAA,IACL,eAAe,EAAE;AAAA,IACjB,WAAW,EAAE;AAAA,IACb,gBAAgB,EAAE;AAAA,IAClB,cAAc,EAAE;AAAA,IAChB,oBAAoB,EAAE;AAAA,IACtB,YAAY,EAAE;AAAA,IACd,cAAc,EAAE;AAAA,EAClB;AACF;AAEO,SAAS,iBAAiB,GAAgB;AAC/C,SAAO;AAAA,IACL,gBAAgB,EAAE;AAAA,IAClB,eAAe,EAAE;AAAA,IACjB,cAAc,EAAE;AAAA,IAChB,WAAW,EAAE;AAAA,IACb,YAAY,EAAE;AAAA,EAChB;AACF;AAEO,SAAS,WAAW,EAAE,OAAO,KAAK,GAAoC;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,MACD;AAAA;AAAA,EAED;AAEJ;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,WAAW,GAAG,GACrE,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ,YAAY;AAAA,QACpB,YAAY,YAAY;AAAA,QACxB,OAAO,YAAY;AAAA,QACnB,YAAY,YAAY;AAAA,QACxB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,UAAU,YAAY;AAAA,QAC9B,SAAS,UAAU,MAAM;AAAA,MAC3B;AAAA,MAEC,oBAAU,eAAe;AAAA;AAAA,EAC5B,GACF;AAEJ;;;AhCwBU,gBAAAC,OA8BN,QAAAC,cA9BM;AA1GV,IAAM,0BAA0B;AAEzB,SAAS,SAAS,OAAc;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAuB,KAAK;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAwB,CAAC,CAAC;AAC1D,QAAM,CAACC,SAAQ,SAAS,IAAID,WAAS,CAAC;AACtC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,KAAK;AACpD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAA6B,IAAI;AACjE,QAAM,YAAYE,SAAO,CAAC;AAE1B,EAAAC,YAAU,MAAM;AACd,cAAU,WAAW;AACrB,UAAM,QAAQ,UAAU;AAExB,eAAW,IAAI;AACf,gBAAY,CAAC,CAAC;AACd,cAAU,CAAC;AACX,eAAW,IAAI;AAEf,KAAC,YAAY;AACX,YAAM,SAAS,MAAM,kBAAkB,MAAM,GAAG,mBAAmB,QAAQ;AAC3E,UAAI,UAAU,UAAU,QAAS;AAEjC,YAAM,QAAQ,UAAU,CAAC;AACzB,kBAAY,KAAK;AACjB,iBAAW,MAAM,UAAU,iBAAiB;AAC5C,gBAAU,iBAAiB;AAC3B,iBAAW,KAAK;AAAA,IAClB,GAAG;AAAA,EACL,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,WAAW,YAAY;AAC3B,QAAI,eAAe,CAAC,QAAS;AAC7B,mBAAe,IAAI;AACnB,UAAM,SAAS,MAAM,kBAAkB,MAAMF,SAAQ,mBAAmB,QAAQ;AAChF,UAAM,QAAQ,UAAU,CAAC;AACzB,gBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AACzC,cAAU,CAAC,SAAS,OAAO,iBAAiB;AAC5C,eAAW,MAAM,UAAU,iBAAiB;AAC5C,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,cAAc,YAAY,KAAK,EAAE,SAAS;AAEhD,QAAM,WAAWG,UAAQ,MAAM;AAC7B,UAAM,IAAI,YAAY,KAAK,EAAE,YAAY;AACzC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EACpE,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,WAAWA,UAAQ,MAAM;AAC7B,QAAI,eAAe,cAAc,eAAe,CAAC,SAAS,OAAQ,QAAO;AACzE,WAAO,SAAS,CAAC;AAAA,EACnB,GAAG,CAAC,UAAU,YAAY,WAAW,CAAC;AAEtC,QAAM,eAAe,WACjB,SAAS,OAAO,CAAC,MAAM,MAAM,QAAQ,IACrC;AAEJ,QAAM,WAAW,CAAC,QACf,eAA0C,GAAG,KAAK;AAErD,QAAM,WAAW,CAAC,YACf,gBAA2C,QAAQ,YAAY,KAChE,QAAQ;AAEV,QAAM,iBAAsC;AAAA,IAC1C,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,YAAY,YAAY;AAAA,EAC1B;AAEA,MAAI,WAAW,SAAS,WAAW,GAAG;AACpC,WACE,gBAAAN,MAAC,SAAI,OAAO,gBACV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,eAAe;AAAA,QACjB;AAAA,QAEA,0BAAAA,MAAC,eAAY;AAAA;AAAA,IACf,GACF;AAAA,EAEJ;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAA,MAAC,SAAI,OAAO,gBACV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,SAAS,MAAM,YAAY,IAAI;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,SAAS,SAAS,YAAY;AAAA,QAC7C,eAAe,SAAS,QAAQ;AAAA,QAChC;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,aAAa,iBAAiB,WAAW;AAAA;AAAA,IAC3C,GACF;AAAA,EAEJ;AAEA,QAAM,eAAe,MAAM,YAAY,eAAe,GAAG;AACzD,QAAM,YAAY,eAAe,SAAS,WAAW;AAErD,SACE,gBAAAC,OAAC,SAAI,OAAO,gBACV;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA,aAAa,iBAAiB,WAAW;AAAA;AAAA,IAC3C;AAAA,IAEC,YACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,GAAG,GAC1B,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,SAAS,SAAS,YAAY;AAAA,QAC7C,eAAe,SAAS,QAAQ;AAAA,QAChC,aAAa,eAAe,WAAW;AAAA,QACvC;AAAA;AAAA,IACF,GACF;AAAA,IAGD,YAAY,aAAa,SAAS,KACjC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA;AAAA,IACF;AAAA,IAGD,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,YAAY;AAAA,QACnB,MAAM,YAAY;AAAA;AAAA,IACpB,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,WAAW,WAAW,IAAI;AAAA,QAC5B;AAAA,QAEC,uBAAa,IAAI,CAAC,SAAS,MAC1B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe,SAAS,QAAQ,YAAY;AAAA,YAC5C,eAAe,SAAS,OAAO;AAAA,YAC/B,aAAa,eAAe,WAAW;AAAA;AAAA,UARlC,GAAG,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,IAAI,CAAC;AAAA,QASnD,CACD;AAAA;AAAA,IACH;AAAA,IAGD,CAAC,eAAe,WACf,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;AF3FQ,gBAAAO,cAAA;AA/IR,IAAMC,cACJ;AACF,IAAM,sBAAsB;AAE5B,SAAS,YAAY,GAA+B,KAAuB;AACzE,SAAO,MAAM,QAAQ,MAAM,SAAY,MAAM;AAC/C;AAEA,SAAS,WAAW,GAA8B,KAAqB;AACrE,SAAO,KAAK,EAAE,SAAS,IAAI,IAAI;AACjC;AAEA,SAAS,kBAAkB,GAA0C;AACnE,SAAQ,aAAmC,SAAS,KAAK,EAAE,IACtD,IACD;AACN;AAEA,SAASC,mBACP,GACA,IACkB;AAClB,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,SAAO,QAAQ,EAAE,IAAI,UAAU;AACjC;AAEA,SAAS,WAAW,IAAY,WAA2B;AACzD,QAAM,QAAQ,KAAK;AAAA,IACjB,kBAAkB,SAAS,IAAI,kBAAkB,EAAE;AAAA,EACrD;AACA,SAAO,QAAQ,sBAAsB,aAAa,EAAE,IAAI;AAC1D;AAEO,SAAS,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAuB;AAC/D,QAAM,aAAa,kBAAkB,OAAO,mBAAmB;AAC/D,QAAM,YAAY,YAAY,OAAO,uBAAuB,IAAI;AAChE,QAAM,kBAAkB,YAAY,OAAO,2BAA2B,IAAI;AAC1E,QAAM,WAAW,YAAY,OAAO,mBAAmB,IAAI;AAC3D,QAAM,iBAAiB,YAAY,OAAO,yBAAyB,IAAI;AACvE,QAAM,oBAAoB;AAAA,IACxB,OAAO;AAAA,IACP;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,MACL,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,IACA,KAAK;AAAA,MACH,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,wBAAwB;AAAA,IAC1B;AAAA,IACA,OAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AACA,QAAM,mBAAmB;AAAA,IACvB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AACA,QAAM,iBAAiB,aAAa,cAAc;AAElD,QAAM,oBAAoB;AAAA,IACxB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AACA,QAAM,mBAAmB;AAAA,IACvB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AACA,QAAM,gBAAgB,OAAO;AAE7B,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,OAAO,eAAe;AAAA,IACxB;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,OAAO,eACL;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,MACX,WAAW,OAAO,sBAAsB,OAAO,gBAAgB,MAAM;AAAA,MACrE;AAAA,IACF;AAAA,IACA,eAAe,WAAW,gBAAgB,iBAAiB;AAAA,IAC3D,kBAAkB;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,cAAc,WAAW,gBAAgB,gBAAgB;AAAA,IACzD,WACE,iBAAiB,cAAc,SAAS,IACpC,WAAW,gBAAgB,aAAa,IACxC,MAAM,gBAAgB,IAAI;AAAA,IAChC,eAAe,WAAW,OAAO,wBAAwB,SAAS;AAAA,IAClE,qBAAqB;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,cAAc,WAAW,OAAO,wBAAwB,cAAc;AAAA,IACtE,oBAAoB;AAAA,MAClB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,OAAO,eAAeD;AAAA,IACxB;AAAA,IACA,cAAcA;AAAA,IACd,YAAYC,mBAAkB,OAAO,qBAAqB,cAAc;AAAA,EAC1E;AAEA,EAAAC,YAAU,MAAM;AACd,mBAAe,OAAO,uBAAuB,OAAO,WAAW;AAAA,EACjE,GAAG,CAAC,OAAO,qBAAqB,OAAO,WAAW,CAAC;AAEnD,SACE,gBAAAH,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,QAAO,MACzC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF;AAEJ;;;AmCnLA,SAAS,aAAAI,mBAAiB;;;ACA1B,SAAS,aAAAC,aAAW,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACArD,SAAS,4BAAAC,iCAAgC;;;ACsBvC,SAME,OAAAC,QANF,QAAAC,cAAA;AATK,IAAM,WAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL,cAAY,aAAa;AAAA,IACzB,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,WAAW,QAAQ,WAAW;AAAA,IAEjE;AAAA,sBAAAD,OAAC,WAAO,+GAAoG;AAAA,MAC3G,gBAAgB,IAAI,CAAC,MAAM;AAC1B,cAAM,WAAW,MAAM;AACvB,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,SAAS,CAAC;AAAA,YACzB,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT;AAAA,cACA,UAAU;AAAA,cACV,YAAY,WAAW,MAAM;AAAA,cAC7B,OAAO,WAAW,cAAc;AAAA,cAChC,cAAc,aAAa,WAAW,cAAc,aAAa;AAAA,cACjE,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEC,uBAAa,WAAW,CAAC,MAAM,MAAM,QAAQ,QAAQ,gBAAgB,CAAC;AAAA;AAAA,UAnBlE;AAAA,QAoBP;AAAA,MAEJ,CAAC;AAAA;AAAA;AACH;;;ADRI,gBAAAE,QAoBA,QAAAC,cApBA;AA9BC,IAAM,kBAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAO,YAAY;AACzB,QAAM,OAAO,YAAY;AAEzB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,cAAc,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,QAC3C,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA,UAIL;AAAA,QAEF,kBACC,gBAAAA,OAAC,SAAI,WAAU,gBAAe,OAAO,EAAE,MAAM,YAAY,UAAU,GAAG,SAAS,QAAQ,gBAAgB,aAAa,GAClH,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,WAAW,YAAY;AAAA,YACvB,aAAa,YAAY;AAAA,YACzB,aAAa,YAAY;AAAA,YACzB,YAAY;AAAA,YACZ;AAAA;AAAA,QACF,GACF;AAAA,QAGF,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,YAAY,MAAM,MAAM,IAAI;AAAA,cAC5B,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,cACrC,cAAc;AAAA,cACd,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY,iBAAiB,SAAY;AAAA,YAC3C;AAAA,YAEA;AAAA,8BAAAD,OAACE,2BAAA,EAAyB,MAAM,IAAI,OAAO,EAAE,SAAS,KAAK,YAAY,EAAE,GAAG;AAAA,cAC5E,gBAAAF;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,kBAC9C,aAAa,aAAa;AAAA,kBAC1B,cAAY,aAAa;AAAA,kBACzB,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,YAAY;AAAA,kBACd;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,oBACrC,OAAO,MAAM,MAAM,GAAG;AAAA,oBACtB,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACD;AAAA;AAAA,cAED;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AE1HA,SAAS,YAAAG,kBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAAC,aAAY,cAAAC,aAAY,mBAAmB;AAiDhD,SAUI,OAAAC,QAVJ,QAAAC,cAAA;AApCJ,IAAM,eAAe,CAAC,UAAkB,QAAyB;AAC/D,QAAM,IAAI,mBAAmB,GAAG;AAChC,QAAM,IAAI,mBAAmB,QAAQ;AACrC,SAAO;AAAA,IACL,EAAE,OAAO,YAAY,MAAM,gDAAgD,CAAC,IAAI,MAAM,aAAa,IAAI,UAAU;AAAA,IACjH,EAAE,OAAO,YAAY,MAAM,uBAAuB,CAAC,MAAM,CAAC,IAAI,MAAMF,aAAY,IAAI,UAAU;AAAA,IAC9F,EAAE,OAAO,KAAK,MAAM,yCAAyC,CAAC,QAAQ,CAAC,IAAI,MAAMD,aAAY,IAAI,UAAU;AAAA,EAC7G;AACF;AAEA,IAAM,SAAS,CAAC,WAAmB,aAAqB,UAAuC;AAAA,EAC7F,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ,aAAa,WAAW;AAAA,EAChC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,YAAY;AACd;AAEO,IAAM,iBAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,aAAa;AACf,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAID,WAAS,KAAK;AACtC,QAAM,OAAO,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAE5E,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,GAAG,UAAU,WAAW;AAAA,MACpF,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAElC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY;AAAA,YACZ,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,OAAO,OAAO,WAAW,aAAa,IAAI;AAAA,YAE1C,0BAAAA,OAAC,YAAS,MAAM,OAAO,MAAM;AAAA;AAAA,QAC/B;AAAA,QAEC,QACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,QAAQ,OAAO;AAAA,cACf,OAAO;AAAA,cACP,SAAS;AAAA,cACT,KAAK;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,QAAQ;AAAA,YACV;AAAA,YAEC,uBAAa,UAAU,IAAI,EAAE,IAAI,CAAC,MACjC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAM,EAAE;AAAA,gBACR,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,cAAY,EAAE;AAAA,gBACd,SAAS,MAAM,QAAQ,KAAK;AAAA,gBAC5B,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY,EAAE;AAAA,kBACd,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,gBAClB;AAAA,gBAEA,0BAAAA,OAAC,EAAE,MAAF,EAAO,MAAM,IAAI;AAAA;AAAA,cAjBb,EAAE;AAAA,YAkBT,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AClGE,gBAAAE,cAAA;AADK,IAAMC,gBAAgC,CAAC,EAAE,OAAO,MAAM,MAC3D,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY,MAAM,OAAO,IAAI;AAAA,MAC7B,QAAQ,aAAa,MAAM,OAAO,IAAI,CAAC;AAAA,MACvC,OAAO,IAAI,OAAO,WAAW,IAAI;AAAA,MACjC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IAEC;AAAA;AACH;;;ACkCI,gBAAAE,QAgEU,QAAAC,cAhEV;AAnCN,IAAM,aAAa;AAEZ,IAAM,cAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAiB,CAAC;AACxB,MAAI,SAAU,MAAK,KAAK,eAAe,QAAQ,UAAU,IAAI,CAAC;AAC9D,MAAI,iBAAiB;AACnB,UAAM,UAAU,oBAAoB,QAAQ,eAAe,QAAQ,OAAO;AAC1E,SAAK,KAAK,kBAAkB,SAAS,aAAa,WAAW,CAAC;AAAA,EAChE;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,cAAc;AAAA,QACd,QAAQ,YAAY;AAAA,QACpB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ;AAAA,YACb,KAAK,QAAQ;AAAA,YACb,SAAQ;AAAA,YACR,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,cAAc;AAAA,cACd,QAAQ;AAAA,YACV;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,YACE;AAAA,YACJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,IAAI,QAAQ,EAAE,GACtF;AAAA,kBAAQ,cAAc,QAAQ,UAC7B,gBAAAD,OAAC,iBAAc,MAAI,MAAC,WAAW,QAAQ,mBAAmB;AAAA,UAE5D,gBAAAA,OAACE,eAAA,EAAa,OAAO,eAAe,OAAO,eAAe;AAAA,UAC1D,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO;AAAA,gBACP,QAAQ;AAAA,cACV;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UACC,QAAQ,eACP,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,cACZ;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UAEF,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,WAAW,GAAG,GACzE;AAAA,iBAAK,SAAS,KACb,gBAAAD,OAAC,UAAK,OAAO,EAAE,OAAO,YAAY,UAAU,IAAI,YAAY,YAAY,aAAa,GAClF,eAAK,IAAI,CAAC,GAAG,MACZ,gBAAAC,OAAC,UACE;AAAA,kBAAI,KAAK,gBAAAD,OAAC,UAAK,OAAO,EAAE,QAAQ,SAAS,SAAS,IAAI,GAAG,kBAAC;AAAA,cAC1D;AAAA,iBAFQ,CAGX,CACD,GACH;AAAA,YAED,aACC,gBAAAA,OAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAChC,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU,QAAQ;AAAA,gBAClB,WAAU;AAAA,gBACV,aAAY;AAAA,gBACZ,YAAY,aAAa;AAAA;AAAA,YAC3B,GACF;AAAA,aAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AClEQ,gBAAAG,QAqDQ,QAAAC,cArDR;AAjDR,IAAM,QAAQ;AAAA,EACZ,MAAM,EAAE,OAAO,KAAK,UAAU,UAAU,cAAc,GAAG,KAAK,UAAU,KAAK,GAAG;AAAA,EAChF,SAAS,EAAE,OAAO,KAAK,UAAU,WAAW,cAAc,GAAG,KAAK,UAAU,KAAK,GAAG;AACtF;AAEO,IAAM,WAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,IAAI,MAAM,OAAO;AACvB,QAAM,OAAiB,CAAC;AACxB,MAAI,SAAU,MAAK,KAAK,eAAe,QAAQ,UAAU,IAAI,CAAC;AAC9D,MAAI,iBAAiB;AACnB,UAAM,UAAU,oBAAoB,QAAQ,eAAe,QAAQ,OAAO;AAC1E,SAAK,KAAK,kBAAkB,SAAS,aAAa,WAAW,CAAC;AAAA,EAChE;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,OAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK,EAAE;AAAA,QACP,SAAS,EAAE;AAAA,QACX,cAAc,UAAU,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC,KAAK;AAAA,QAChF,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,OAAO,EAAE;AAAA,cACT,UAAU,YAAY,SAAS,QAAQ;AAAA,cACvC,aAAa;AAAA,cACb,cAAc;AAAA,cACd,UAAU;AAAA,YACZ;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,QAAQ;AAAA,gBACb,KAAK,QAAQ;AAAA,gBACb,SAAQ;AAAA,gBACR,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,SAAS,SAAS,QAAQ;AAAA;AAAA,YAC/E;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,GAChC;AAAA,kBAAQ,cAAc,QAAQ,UAC7B,gBAAAD,OAAC,iBAAc,MAAI,MAAC,WAAW,QAAQ,mBAAmB;AAAA,UAE5D,gBAAAA,OAACE,eAAA,EAAa,OAAO,eAAe,OAAO,eAAe;AAAA,UAC1D,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,UAAU,EAAE;AAAA,gBACZ,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO,YAAY;AAAA,gBACnB,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,cACZ;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UACC,QAAQ,eACP,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,OAAO,YAAY;AAAA,gBACnB,UAAU,YAAY,SAAS,KAAK;AAAA,gBACpC,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,iBAAiB,EAAE;AAAA,gBACnB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,cACZ;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UAEF,gBAAAC,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,WAAW,GAAG,GACzE;AAAA,iBAAK,SAAS,KACb,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,OAAO,YAAY,WAAW,UAAU,IAAI,YAAY,YAAY,aAAa;AAAA,gBAEzF,eAAK,IAAI,CAAC,GAAG,MACZ,gBAAAC,OAAC,UACE;AAAA,sBAAI,KAAK,gBAAAD,OAAC,UAAK,OAAO,EAAE,QAAQ,SAAS,SAAS,IAAI,GAAG,kBAAC;AAAA,kBAC1D;AAAA,qBAFQ,CAGX,CACD;AAAA;AAAA,YACH;AAAA,YAED,aACC,gBAAAA,OAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAChC,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU,QAAQ;AAAA,gBAClB,WAAW,YAAY;AAAA,gBACvB,aAAa,MAAM,YAAY,eAAe,GAAG;AAAA,gBACjD,MAAM;AAAA,gBACN,YAAY,aAAa;AAAA;AAAA,YAC3B,GACF;AAAA,aAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC/GI,SAOI,OAAAG,QAPJ,QAAAC,cAAA;AAjBG,IAAM,YAA6B,CAAC;AAAA,EACzC;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,MAAM;AACJ,SACE,gBAAAA,OAAC,SAAI,OAAO,EAAE,WAAW,EAAE,GACzB;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,cAAc,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,UACjE,YAAY,YAAY;AAAA,QAC1B;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO,YAAY;AAAA,cACnB,cAAc,aAAa,YAAY,WAAW;AAAA,cAClD,cAAc;AAAA,YAChB;AAAA,YAEC,uBAAa;AAAA;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,IAEC,eAAe,SAAS,WAAW,IAClC,gBAAAA,OAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,UAAU,OAAO,YAAY,WAAW,UAAU,GAAG,GAC9F,uBAAa,iBAChB,IAEA,SAAS,IAAI,CAAC,GAAG,MACf,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,SAAS,EAAE,YAAY;AAAA,QACtC,eAAe,SAAS,CAAC;AAAA,QACzB;AAAA,QACA,SAAS,IAAI,SAAS,SAAS;AAAA,QAC/B,SAAS,MAAM,IAAI,SAAS;AAAA,QAC5B;AAAA,QACA;AAAA;AAAA,MAZK,GAAG,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IAavC,CACD;AAAA,IAGF,WACC,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,WAAW,GAAG,GACrE,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,UAC3D,YAAY;AAAA,UACZ,OAAO,YAAY;AAAA,UACnB,YAAY,YAAY;AAAA,UACxB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ,cAAc,YAAY;AAAA,UAClC,SAAS,cAAc,MAAM;AAAA,QAC/B;AAAA,QAEC,wBAAc,aAAa,UAAU,aAAa;AAAA;AAAA,IACrD,GACF;AAAA,KAEJ;AAEJ;;;AC/FI,gBAAAE,cAAA;AAJG,IAAM,gBAAiC,CAAC,EAAE,UAAU,MAAM,aAAa,KAAK,KAAK,MAAM;AAC5F,MAAI,CAAC,QAAQ,CAAC,SAAU,QAAO;AAE/B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,SAAS;AAAA,MACvB,QAAQ,SAAS;AAAA,MACjB,QAAQ;AAAA,MACR,YAAY,YAAY;AAAA,MACxB,YAAY,YAAY;AAAA,MACxB,YAAY,YAAY;AAAA,MACxB,eAAe,YAAY;AAAA,MAC3B;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AC5BA,SAAS,aAAAC,aAAW,WAAAC,WAAS,YAAAC,kBAAgB;;;ACC7C,eAAsB,YAAY,MAAoC;AACpE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,eAAe,4BAA4B,IAAI,EAAE;AAC5E,QAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,UAAU,CAAC;AAAA,EACzB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;ACVA,SAAS,YAAAC,kBAAgB;AAkBnB,gBAAAC,cAAA;AAbC,IAAM,YAA6B,CAAC,EAAE,QAAQ,MAAM,MAAM,MAAM;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAID,WAAS,KAAK;AAE1C,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAEA,MAAI,QAAQ,CAAC,QAAQ;AACnB,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,SAAS,MAAM,UAAU,IAAI;AAAA,QAC7B,OAAO,EAAE,GAAG,MAAM,WAAW,WAAW,SAAS,GAAG,WAAW,aAAa;AAAA;AAAA,IAC9E;AAAA,EAEJ;AAEA,SACE,gBAAAA,OAAC,SAAI,OAAO,EAAE,GAAG,MAAM,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,OAAO,MAAM,QAAQ,YAAY,KAAK,UAAU,GAAG,GACxI,iBAAO,MAAM,GAAG,CAAC,GACpB;AAEJ;;;ACTI,qBAAAC,YACE,OAAAC,QACA,QAAAC,cAFF;AAfJ,SAAS,YAAY,GAAmB;AACtC,SAAO,KAAK,MAAO,EAAE,eAAe,SAAS,EAAE,uBAAuB,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC1F;AAEO,IAAM,WAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAMC,QAAO,MAAM,YAAY;AAC/B,QAAM,QAAQA,QAAO,MAAM,OAAO,MAAM;AACxC,QAAM,OAAOA,QAAO,KAAK;AAEzB,QAAM,UACJ,gBAAAD,OAAAF,YAAA,EACE;AAAA,oBAAAC,OAAC,aAAU,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAc;AAAA,IACjE,gBAAAC,OAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC;AAAA,sBAAAD,OAAC,SAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,YAAY,KAAK,UAAU,GAAG,GAAI,gBAAM,QAAO;AAAA,MAClF,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,MAAM,MAAM,UAAU,IAAI,YAAY,UAAU,UAAU,UAAU,cAAc,WAAW,GAC/G,gBAAM,MACT;AAAA,OACF;AAAA,IACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,SAAS,YAAY,SAAS,GACrD;AAAA,sBAAAD,OAAC,SAAI,OAAO,EAAE,OAAO,MAAM,QAAQ,YAAY,KAAK,UAAU,GAAG,GAAI,sBAAY,MAAM,KAAK,GAAE;AAAA,MAC9F,gBAAAC,OAAC,SAAI,OAAO,EAAE,OAAO,UAAU,IAAI,YAAY,IAAI,GAChD;AAAA;AAAA,QACA,MAAM,UAAU,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAE;AAAA,QAC7B,MAAM,UAAU,QAAQ,CAAC;AAAA,QAAE;AAAA,SAC9B;AAAA,OACF;AAAA,KACF;AAGF,QAAM,WAAgC;AAAA,IACpC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc,OAAO,SAAS,aAAa,MAAM,OAAO;AAAA,IACxD,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAEA,MAAI,CAAC,QAAS,QAAO,gBAAAD,OAAC,SAAI,OAAO,UAAW,mBAAQ;AAEpD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MAAM,QAAQ,KAAK;AAAA,MAC5B,cAAY,oBAAoB,MAAM,IAAI;AAAA,MAC1C,OAAO,EAAE,GAAG,UAAU,QAAQ,UAAU;AAAA,MAEvC;AAAA;AAAA,EACH;AAEJ;;;AC9DO,IAAM,eAAe,CAAC,UAAU,WAAW,QAAQ;;;ACchD,gBAAAG,cAAA;AAZH,IAAM,aAA8B,CAAC,EAAE,OAAO,UAAU,OAAO,aAAa,MAAM;AACvF,QAAM,WAAW;AACjB,QAAM,YAAY,aAAa,QAAQ;AACvC,QAAM,kBAAkB,YACnB,aAAa,MAAM,MAAM,IAAI,YAAY,MAAM,SAChD;AAEJ,SACE,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,GACnC,uBAAa,IAAI,CAAC,MAAM;AACvB,UAAM,KAAK,MAAM;AACjB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,SAAS,MAAM,SAAS,CAAC;AAAA,QACzB,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,YAAY,KAAK,WAAW;AAAA,UAC5B,OAAO,KAAK,kBAAkB,MAAM;AAAA,UACpC,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEC,uBAAa,CAAC;AAAA;AAAA,MAbV;AAAA,IAcP;AAAA,EAEJ,CAAC,GACH;AAEJ;;;ACzCA,IAAM,OAAO;AAEN,IAAM,gBAA6C;AAAA,EACxD,QAAQ;AAAA,IACN,EAAE,QAAQ,QAAQ,MAAM,sBAAsB,OAAO,QAAQ,WAAW,OAAO,WAAW,OAAO,MAAM,GAAG,IAAI,iBAAiB;AAAA,IAC/H,EAAE,QAAQ,QAAQ,MAAM,qBAAqB,OAAO,OAAO,WAAW,MAAM,WAAW,MAAM,MAAM,GAAG,IAAI,gBAAgB;AAAA,IAC1H,EAAE,QAAQ,QAAQ,MAAM,cAAc,OAAO,QAAQ,WAAW,OAAO,WAAW,MAAM,MAAM,GAAG,IAAI,gBAAgB;AAAA,IACrH,EAAE,QAAQ,QAAQ,MAAM,eAAe,OAAO,QAAQ,WAAW,OAAO,WAAW,OAAO,MAAM,GAAG,IAAI,gBAAgB;AAAA,IACvH,EAAE,QAAQ,QAAQ,MAAM,oBAAoB,OAAO,OAAO,WAAW,MAAM,WAAW,OAAO,MAAM,GAAG,IAAI,iBAAiB;AAAA,IAC3H,EAAE,QAAQ,QAAQ,MAAM,iBAAiB,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,MAAM,GAAG,IAAI,kBAAkB;AAAA,EAC5H;AAAA,EACA,SAAS;AAAA,IACP,EAAE,QAAQ,QAAQ,MAAM,iBAAiB,OAAO,MAAM,WAAW,KAAK,WAAW,OAAO,MAAM,GAAG,IAAI,kBAAkB;AAAA,IACvH,EAAE,QAAQ,QAAQ,MAAM,2BAA2B,OAAO,OAAO,WAAW,MAAM,WAAW,MAAM,MAAM,GAAG,IAAI,oBAAoB;AAAA,IACpI,EAAE,QAAQ,QAAQ,MAAM,iBAAiB,OAAO,OAAO,WAAW,OAAO,WAAW,KAAK,MAAM,GAAG,IAAI,eAAe;AAAA,IACrH,EAAE,QAAQ,QAAQ,MAAM,2BAA2B,OAAO,QAAQ,WAAW,OAAO,WAAW,MAAM,MAAM,GAAG,IAAI,4BAA4B;AAAA,IAC9I,EAAE,QAAQ,QAAQ,MAAM,4BAA4B,OAAO,QAAQ,WAAW,OAAO,WAAW,KAAK,MAAM,GAAG,IAAI,uBAAuB;AAAA,IACzI,EAAE,QAAQ,QAAQ,MAAM,0BAA0B,OAAO,QAAQ,WAAW,OAAO,WAAW,MAAM,MAAM,GAAG,IAAI,eAAe;AAAA,EAClI;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,QAAQ,QAAQ,MAAM,eAAe,OAAO,OAAO,WAAW,OAAO,WAAW,QAAQ,MAAM,GAAG,IAAI,kBAAkB;AAAA,IACzH,EAAE,QAAQ,OAAO,MAAM,wBAAwB,OAAO,QAAQ,WAAW,QAAQ,WAAW,OAAO,MAAM,GAAG,IAAI,mBAAmB;AAAA,IACnI,EAAE,QAAQ,QAAQ,MAAM,gBAAgB,OAAO,OAAO,WAAW,IAAM,WAAW,OAAO,MAAM,GAAG,IAAI,iBAAiB;AAAA,IACvH,EAAE,QAAQ,MAAM,MAAM,0BAA0B,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,MAAM,GAAG,IAAI,uBAAuB;AAAA,IACtI,EAAE,QAAQ,OAAO,MAAM,oBAAoB,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,MAAM,GAAG,IAAI,qBAAqB;AAAA,IAC/H,EAAE,QAAQ,OAAO,MAAM,iBAAiB,OAAO,QAAQ,WAAW,OAAO,WAAW,OAAO,MAAM,GAAG,IAAI,oBAAoB;AAAA,EAC9H;AACF;;;AC1BA,SAASC,WAAU,OAAeC,QAA8B;AAC9D,QAAM,IAAI,MAAM,KAAK,EAAE,MAAM,mBAAmB;AAChD,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE;AAC3B,SAAO,QAAS,KAAK,KAAM,GAAG,KAAM,KAAK,IAAK,GAAG,KAAK,IAAI,GAAG,KAAKA,MAAK;AACzE;AAEO,SAAS,mBAAmB,QAAkC;AACnE,QAAM,aAAa,OAAO,mBAAmB;AAC7C,QAAM,SAAS,OAAO,mBAAmB;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAMD,WAAU,QAAQ,IAAI,KAAK;AAAA,IACjC,SAASA,WAAU,QAAQ,IAAI,KAAK;AAAA,IACpC,IAAI;AAAA,IACJ,MAAM;AAAA,EACR;AACF;;;APoDM,gBAAAE,QAgBA,QAAAC,cAhBA;AA7DN,IAAM,aAAa;AAWZ,IAAM,YAA6B,CAAC;AAAA,EACzC;AAAA,EACA,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,QAAQC,UAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AAChE,QAAM,eAAeA;AAAA,IACnB,MAAM,qBAAqB,OAAO,MAAM,WAAW;AAAA,IACnD,CAAC,OAAO,IAAI;AAAA,EACd;AACA,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAqB,QAAQ;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA;AAAA,IAC1B,MAAM,cAAc,SAAS,CAAC;AAAA,EAChC;AACA,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,EAAAC,YAAU,MAAM;AACd,QAAI,KAAK;AACP,gBAAU,cAAc,IAAI,CAAC;AAC7B;AAAA,IACF;AACA,QAAI,YAAY;AAChB,eAAW,IAAI;AACf,gBAAY,IAAI,EAAE,KAAK,CAAC,SAAS;AAC/B,UAAI,CAAC,WAAW;AACd,kBAAU,IAAI;AACd,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU,YAAY,SAAS;AAAA,QAC/B,WAAW,YAAY,YAAY;AAAA,QACnC,SAAS;AAAA,QACT,YAAY,MAAM;AAAA,QAClB,cAAc,YAAY,IAAI;AAAA,QAC9B,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO,MAAM;AAAA,cACb,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,cAAc;AAAA,YAChB;AAAA,YAEC,mBAAS,aAAa;AAAA;AAAA,QACzB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,SAAS,UAAU,OAAO;AAAA,cAC1B,YAAY;AAAA,cACZ,WAAW,cAAc;AAAA,cACzB,WAAW;AAAA,cACX,gBAAgB;AAAA,cAChB,gBAAgB,GAAG,MAAM,OAAO;AAAA,YAClC;AAAA,YAEC;AAAA,qBAAO,IAAI,CAAC,GAAG,MACd,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO;AAAA,kBACP;AAAA,kBACA,MAAM,MAAM,OAAO,SAAS;AAAA,kBAC5B,SAAS;AAAA;AAAA,gBAJJ,GAAG,EAAE,MAAM,IAAI,CAAC;AAAA,cAKvB,CACD;AAAA,cACA,OAAO,WAAW,KACjB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,OAAO,MAAM;AAAA,oBACb,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,WAAW;AAAA,kBACb;AAAA,kBAEC,uBAAa;AAAA;AAAA,cAChB;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AQ3GI,SASE,OAAAK,QATF,QAAAC,cAAA;AAJJ,IAAM,SAAyB,CAAC,OAAO,SAAS,SAAS,UAAU,OAAO,WAAW,OAAO;AAErF,IAAM,gBAAiC,CAAC,EAAE,SAAS,aAAa,aAAa,MAAM;AACxF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY,YAAY;AAAA,QACxB,QAAQ,YAAY;AAAA,QACpB,cAAc,YAAY;AAAA,QAC1B,SAAS;AAAA,QACT,YAAY,YAAY;AAAA,MAC1B;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO,YAAY;AAAA,cACnB,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,cAAc;AAAA,YAChB;AAAA,YAEC,uBAAa;AAAA;AAAA,QAChB;AAAA,QACA,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,EAAE,GACrD,iBAAO,IAAI,CAAC,UACX,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,QAAQ,KAAK;AAAA,YAC5B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,cAC3D,YAAY,MAAM,YAAY,eAAe,IAAI;AAAA,cACjD,OAAO,YAAY;AAAA,cACnB,UAAU;AAAA,cACV,YAAY,YAAY;AAAA,cACxB,QAAQ;AAAA,YACV;AAAA,YAEC,uBAAa,WAAW,KAAK;AAAA;AAAA,UAdzB;AAAA,QAeP,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACzDA,SAAgB,aAAAE,aAAW,UAAAC,gBAAc;AAyIrC,gBAAAC,cAAA;AA/HJ,IAAM,mBAAmB,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,MAAM;AAKzE,IAAM,YAAY,CAAC,aAAa;AAIhC,SAAS,SAAS,KAA6C;AAC7D,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,KAAK,6BAA6B;AACzD,WAAO,EAAE,MAAM,OAAO,SAAS,YAAY,GAAG,MAAM,OAAO,SAAS,YAAY,EAAE;AAAA,EACpF,QAAQ;AACN,WAAO,EAAE,MAAM,KAAK,MAAM,GAAG;AAAA,EAC/B;AACF;AAEO,SAAS,SAAS,KAA8B;AACrD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,KAAK,EAAE,YAAY;AACrC,MAAI,MAAM,SAAS,uBAAuB,KAAK,MAAM,SAAS,mBAAmB,EAAG,QAAO;AAC3F,QAAM,EAAE,MAAM,KAAK,IAAI,SAAS,KAAK;AACrC,SAAO,KAAK,SAAS,OAAO,KAAK,UAAU,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AACzE;AAEO,SAAS,WAAW,KAA8B;AACvD,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,KAAK,EAAE,YAAY;AACrC,MAAI,MAAM,WAAW,YAAY,EAAG,QAAO;AAC3C,MAAI,SAAS,KAAK,EAAG,QAAO;AAC5B,QAAM,EAAE,KAAK,IAAI,SAAS,KAAK;AAC/B,SAAO,iBAAiB,KAAK,CAAC,QAAQ,KAAK,SAAS,GAAG,CAAC;AAC1D;AAEO,IAAM,kBAAmC,CAAC,EAAE,UAAU,QAAQ,YAAY,MAAM;AACrF,QAAM,WAAWD,SAAgC,IAAI;AAErD,QAAM,gBAAgB,UAAU,KAAK,KAAK;AAC1C,QAAM,UAAU,WAAW,aAAa;AACxC,QAAM,QAAQ,SAAS,aAAa;AAEpC,EAAAD,YAAU,MAAM;AACd,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,SAAS,CAAC,WAAW,CAAC,cAAe;AAE1C,QAAI,YAAY;AAChB,QAAI,WAAuB;AAI3B,UAAM,aAAa,MAAM;AACvB,YAAM,MAAM;AACZ,YAAM,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7B;AAEA,QAAI,CAAC,OAAO;AACV,iBAAW;AACX;AAAA,IACF;AAEA,WAAO,oBAAQ,EACZ,KAAK,CAAC,EAAE,SAAS,QAAQ,MAAM;AAC9B,UAAI,UAAW;AACf,UAAI,CAAC,SAAS,YAAY,EAAG,QAAO,WAAW;AAE/C,iBAAW,IAAI,QAAQ;AAAA,QACrB,eAAe;AAAA,QACf,sBAAsB;AAAA,QACtB,cAAc;AAAA,MAChB,CAAC;AACD,eAAS,WAAW,aAAa;AACjC,eAAS,YAAY,KAAK;AAC1B,eAAS,GAAG,QAAQ,OAAO,iBAAiB,MAAM;AAChD,cAAM,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC7B,CAAC;AACD,eAAS,GAAG,QAAQ,OAAO,OAAO,CAAC,QAAQ,SAAS;AAClD,YAAI,CAAC,MAAM,MAAO;AAClB,YAAI,KAAK,SAAS,QAAQ,WAAW,cAAe,WAAU,UAAU;AAAA,iBAC/D,KAAK,SAAS,QAAQ,WAAW,YAAa,WAAU,kBAAkB;AAAA,YAC9E,WAAU,QAAQ;AAAA,MACzB,CAAC;AAAA,IACH,CAAC,EACA,MAAM,UAAU;AAEnB,WAAO,MAAM;AACX,kBAAY;AACZ,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,eAAe,SAAS,KAAK,CAAC;AAElC,MAAI,CAAC,cAAe,QAAO;AAE3B,QAAM,OAAO,QAAQ,KAAK,KAAK;AAE/B,QAAM,iBAAsC;AAAA,IAC1C,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc,YAAY,eAAe;AAAA,IACzC,QAAQ,YAAY;AAAA,IACpB,iBAAiB,YAAY;AAAA,IAC7B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,OAAO,YAAY;AAAA,EAC7B;AAEA,QAAM,YAAiC;AAAA,IACrC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AAEA,QAAM,QAAQ,UACZ,gBAAAE,OAAC,WAAM,KAAK,UAAU,UAAQ,MAAC,MAAI,MAAC,OAAK,MAAC,aAAW,MAAC,OAAO,YAAY,IAEzE,gBAAAA,OAAC,SAAI,KAAK,eAAe,KAAI,uBAAsB,SAAQ,QAAO,OAAO,YAAY;AAOvF,SACE,gBAAAA,OAAC,SAAI,OAAO,gBAAgB,WAAU,sBACpC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,QAAQ,OAAO,WAAW;AAAA,MAC1B,KAAI;AAAA,MACJ,OAAO;AAAA,MAEN;AAAA;AAAA,EACH,GACF;AAEJ;;;AC7IE,SAUE,OAAAC,QAVF,QAAAC,cAAA;AADK,IAAM,YAA6B,CAAC,EAAE,SAAS,aAAa,KAAK,MAAM,aAAa,MACzF,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA,MACf,KAAK;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,QACE;AAAA,YACE,iBAAiB,YAAY;AAAA,YAC7B,iBAAiB,YAAY;AAAA,YAC7B;AAAA,UACF;AAAA,UAEF;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA,OAAC,iBAAc,SAAkB,aAA0B,cAA4B;AAAA,MACtF,YAAY,gBACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,YAAY;AAAA,UACtB,QAAQ,YAAY;AAAA,UACpB;AAAA;AAAA,MACF;AAAA;AAAA;AAEJ;;;AnB0GQ,gBAAAE,QAiDF,QAAAC,cAjDE;AAtHV,IAAMC,2BAA0B;AAChC,IAAM,kBAAkB;AAEjB,SAAS,SAAS,OAAc;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAuB,KAAK;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAwB,CAAC,CAAC;AAC1D,QAAM,CAACC,SAAQ,SAAS,IAAID,WAAS,CAAC;AACtC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,KAAK;AACpD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,eAAe;AAChE,QAAM,CAAC,UAAU,WAAW,IAAIA,WAA6B,IAAI;AACjE,QAAM,YAAYE,SAAO,CAAC;AAC1B,QAAM,IAAIC,UAAQ,MAAM,qBAAqB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC;AAElE,EAAAC,YAAU,MAAM;AACd,cAAU,WAAW;AACrB,UAAM,QAAQ,UAAU;AACxB,eAAW,IAAI;AACf,gBAAY,CAAC,CAAC;AACd,cAAU,CAAC;AACX,eAAW,IAAI;AACf,oBAAgB,eAAe;AAE/B,KAAC,YAAY;AACX,YAAM,SAAS,MAAM,kBAAkB,MAAM,GAAG,mBAAmB,QAAQ;AAC3E,UAAI,UAAU,UAAU,QAAS;AACjC,YAAM,QAAQ,UAAU,CAAC;AACzB,kBAAY,KAAK;AACjB,iBAAW,MAAM,UAAU,iBAAiB;AAC5C,gBAAU,iBAAiB;AAC3B,iBAAW,KAAK;AAAA,IAClB,GAAG;AAAA,EACL,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,WAAW,YAAY;AAC3B,QAAI,eAAe,CAAC,QAAS;AAC7B,mBAAe,IAAI;AACnB,UAAM,SAAS,MAAM,kBAAkB,MAAMH,SAAQ,mBAAmB,QAAQ;AAChF,UAAM,QAAQ,UAAU,CAAC;AACzB,gBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AACzC,cAAU,CAAC,SAAS,OAAO,iBAAiB;AAC5C,eAAW,MAAM,UAAU,iBAAiB;AAC5C,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,cAAc,YAAY,KAAK,EAAE,SAAS;AAEhD,QAAM,WAAWE,UAAQ,MAAM;AAC7B,UAAM,IAAI,YAAY,KAAK,EAAE,YAAY;AACzC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EACpE,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,WAAWA,UAAQ,MAAM;AAC7B,QAAI,eAAe,CAAC,SAAS,OAAQ,QAAO;AAC5C,WAAO,SAAS,CAAC;AAAA,EACnB,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,eAAe,WAAW,SAAS,OAAO,CAAC,MAAM,MAAM,QAAQ,IAAI;AACzE,QAAM,gBAAgB,aAAa,MAAM,GAAG,YAAY;AACxD,QAAM,cAAc,eAAe,aAAa,UAAU;AAE1D,QAAM,iBAAiB,YAAY;AACjC,QAAI,gBAAgB,aAAa,UAAU,QAAS,OAAM,SAAS;AACnE,oBAAgB,CAAC,MAAM,IAAI,eAAe;AAAA,EAC5C;AAEA,QAAM,WAAW,CAAC,QACf,eAA0C,GAAG,KAAKJ;AAErD,QAAM,WAAW,CAAC,YACf,EAAE,WAAsC,QAAQ,YAAY,KAC5D,gBAA2C,QAAQ,YAAY,KAChE,QAAQ;AAEV,QAAM,UAAU,CAAC,QAAsB;AACrC,mBAAe,EAAE;AACjB,gBAAY,GAAG;AAAA,EACjB;AAEA,QAAM,YAAiC;AAAA,IACrC,OAAO;AAAA,IACP,YAAY,YAAY;AAAA,IACxB,OAAO,aAAa,YAAY,cAAc;AAAA,IAC9C,YAAY,YAAY;AAAA,IACxB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,MAAI,WAAW,SAAS,WAAW,GAAG;AACpC,WACE,gBAAAF,OAAC,SAAI,OAAO,WACV,0BAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,SAAS,UAAU,GAC1E,0BAAAA,OAAC,eAAY,GACf,GACF;AAAA,EAEJ;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAA,OAAC,SAAI,OAAO,WACV,0BAAAA,OAAC,SAAI,OAAO,YACV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,SAAS,MAAM,YAAY,IAAI;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,SAAS,SAAS,YAAY;AAAA,QAC7C,eAAe,SAAS,QAAQ;AAAA,QAChC;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,UAAU;AAAA,QACV,aAAa;AAAA,UACX,gBAAgB,YAAY;AAAA,UAC5B,eAAe,YAAY;AAAA,UAC3B,cAAc,YAAY;AAAA,UAC1B,WAAW,YAAY;AAAA,UACvB,YAAY,YAAY;AAAA,QAC1B;AAAA;AAAA,IACF,GACF,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,OAAO,WACV;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA;AAAA,IAChB;AAAA,IAEA,gBAAAC,OAAC,SAAI,OAAO,YACV;AAAA,sBAAAA,OAAC,SAAI,WAAU,YACb;AAAA,wBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA,aAIN;AAAA,QAEF,gBAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,EAAE,GACvB,sBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe,SAAS,SAAS,YAAY;AAAA,YAC7C,eAAe,SAAS,QAAQ;AAAA,YAChC;AAAA,YACA,cAAc;AAAA,YACd;AAAA;AAAA,QACF,GAEJ;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,iBACb;AAAA,wBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA,aAIN;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS,eAAe,CAAC;AAAA,YACzB;AAAA,YACA,YAAY;AAAA,YACZ;AAAA,YACA,cAAc;AAAA,YACd;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA,OAAC,aAAU,SAAkB,aAA0B,KAAU,MAAY,cAAc,GAAG;AAAA,SAChG;AAAA,OACF;AAAA,KACF;AAEJ;;;ADlKQ,gBAAAQ,cAAA;AAhFR,IAAMC,cACJ;AACF,IAAM,iBAAiB;AAKvB,SAASC,aAAY,GAAwC,KAAuB;AAClF,SAAO,MAAM,QAAQ,MAAM,SAAY,MAAM,QAAQ,CAAC;AACxD;AAEA,SAASC,YAAW,GAA8B,KAAqB;AACrE,SAAO,KAAK,EAAE,SAAS,IAAI,IAAI;AACjC;AAEA,SAASC,mBACP,GACA,IACkB;AAClB,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,SAAO,QAAQ,EAAE,IAAI,UAAU;AACjC;AAEO,SAAS,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAuB;AAC/D,QAAM,YAAYF,aAAY,OAAO,uBAAuB,IAAI;AAChE,QAAM,kBAAkBA,aAAY,OAAO,2BAA2B,IAAI;AAC1E,QAAM,WAAWA,aAAY,OAAO,mBAAmB,IAAI;AAC3D,QAAM,iBAAiBA,aAAY,OAAO,yBAAyB,IAAI;AACvE,QAAM,oBAAoBA,aAAY,OAAO,6BAA6B,IAAI;AAE9E,QAAM,iBAAiB;AAAA,IACrB,OAAOC,YAAW,OAAO,8BAA8B,wBAAwB,KAAK;AAAA,IACpF,OAAOA,YAAW,OAAO,8BAA8B,wBAAwB,KAAK;AAAA,IACpF,QAAQA,YAAW,OAAO,+BAA+B,wBAAwB,MAAM;AAAA,IACvF,KAAKA,YAAW,OAAO,4BAA4B,wBAAwB,GAAG;AAAA,IAC9E,SAASA,YAAW,OAAO,gCAAgC,wBAAwB,OAAO;AAAA,IAC1F,OAAOA,YAAW,OAAO,8BAA8B,wBAAwB,KAAK;AAAA,IACpF,OAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,iBAAiBA;AAAA,IACrB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AAEA,QAAM,eAAe,QAAQ,cAAc,IACvC,IAAI,gBAAgB,WAAW,IAAI,IACnC,IAAI,gBAAgB,WAAW,IAAI;AACvC,QAAM,iBAAiBA,YAAW,OAAO,yBAAyB,YAAY;AAC9E,QAAM,SAAS,aAAa,cAAc;AAC1C,QAAM,SAAS,aAAa,cAAc;AAE1C,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA,YAAYA,YAAW,OAAO,qBAAqB,aAAa,MAAM,QAAQ,GAAG,CAAC,EAAE;AAAA,IACpF,aAAa;AAAA,MACXA,YAAW,OAAO,sBAAsB,OAAO,gBAAgB,MAAM;AAAA,MACrE;AAAA,IACF;AAAA,IACA,eAAeA,YAAW,OAAO,wBAAwB,MAAM;AAAA,IAC/D,cAAcA,YAAW,OAAO,qBAAqB,cAAc;AAAA,IACnE,cAAcA,YAAW,OAAO,uBAAuB,MAAM,QAAQ,GAAG,CAAC;AAAA,IACzE,WAAWA,YAAW,OAAO,oBAAoB,MAAM,QAAQ,IAAI,CAAC;AAAA,IACpE,aAAaA,YAAW,OAAO,+BAA+B,SAAS;AAAA,IACvE,YAAYA,YAAW,OAAO,qBAAqB,OAAO,eAAeF,WAAU;AAAA,IACnF,cAAcA;AAAA,IACd,YAAYG,mBAAkB,OAAO,qBAAqB,cAAc;AAAA,IACxE,cAAcF,aAAY,OAAO,uBAAuB,KAAK;AAAA,IAC7D,eAAeC,YAAW,OAAO,yBAAyB,EAAE;AAAA,IAC5D,aAAaA,YAAW,OAAO,uBAAuB,EAAE;AAAA,EAC1D;AAEA,EAAAE,YAAU,MAAM;AACd,mBAAe,OAAO,uBAAuB,kBAAkB;AAAA,EACjE,GAAG,CAAC,OAAO,mBAAmB,CAAC;AAE/B,SACE,gBAAAL,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,QAAO,MAAY,SAAO,MAC5D,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF;AAEJ;;;AqBnHA,SAAS,aAAAM,mBAAiB;;;ACA1B,SAAS,WAAAC,WAAS,YAAAC,kBAAgB;;;ACAlC,SAAS,4BAAAC,iCAAgC;;;AC0BvC,SAME,OAAAC,QANF,QAAAC,cAAA;AATK,IAAMC,YAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL,cAAY,aAAa;AAAA,IACzB,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,WAAW,QAAQ,WAAW;AAAA,IAEjE;AAAA,sBAAAD,OAAC,WAAO,+GAAoG;AAAA,MAC3G,gBAAgB,IAAI,CAAC,MAAM;AAC1B,cAAM,WAAW,MAAM;AACvB,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,SAAS,CAAC;AAAA,YACzB,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT;AAAA,cACA,UAAU;AAAA,cACV,YAAY,WAAW,MAAM;AAAA,cAC7B,OAAO,WAAW,cAAc;AAAA,cAChC,cAAc,aAAa,WAAW,cAAc,aAAa;AAAA,cACjE,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEC,uBAAa,WAAW,CAAC,MAAM,MAAM,QAAQ,QAAQ,gBAAgB,CAAC;AAAA;AAAA,UAnBlE;AAAA,QAoBP;AAAA,MAEJ,CAAC;AAAA;AAAA;AACH;;;ADbI,gBAAAG,QA0BA,QAAAC,cA1BA;AA7BC,IAAMC,mBAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAO,YAAY;AACzB,QAAM,OAAO,YAAY;AAEzB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,WAAW;AAAA,QACX,eAAe;AAAA,QACf,cAAc;AAAA,QACd,cAAc,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,QAC3C,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA,UAIL;AAAA,QACF,kBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS;AAAA,YACX;AAAA,YAEA,0BAAAA;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA,UAAU;AAAA,gBACV,WAAW,YAAY;AAAA,gBACvB,aAAa,YAAY;AAAA,gBACzB,aAAa,YAAY;AAAA,gBACzB,YAAY;AAAA,gBACZ;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAGF,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,YAAY,MAAM,MAAM,IAAI;AAAA,cAC5B,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,cACrC,cAAc;AAAA,cACd,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAACI;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,OAAO,EAAE,SAAS,KAAK,YAAY,EAAE;AAAA;AAAA,cACvC;AAAA,cACA,gBAAAJ;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,kBAC9C,aAAa,aAAa;AAAA,kBAC1B,cAAY,aAAa;AAAA,kBACzB,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,YAAY;AAAA,kBACd;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,QAAQ,aAAa,MAAM,MAAM,GAAG,CAAC;AAAA,oBACrC,OAAO,MAAM,MAAM,GAAG;AAAA,oBACtB,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACD;AAAA;AAAA,cAED;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AEnIA,SAAS,aAAAK,aAAW,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AAQrD,IAAMC,mBAAkB;AAQjB,SAAS,aAAa,EAAE,MAAM,UAAU,YAAY,GAAW;AACpE,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAwB,CAAC,CAAC;AAC1D,QAAM,CAACC,SAAQ,SAAS,IAAID,WAAS,CAAC;AACtC,QAAM,CAAC,cAAc,eAAe,IAAIA,WAASD,gBAAe;AAChE,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAS,IAAI;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,oBAAoBE,SAAO,CAAC;AAElC,EAAAC,YAAU,MAAM;AACd,UAAM,UAAU,EAAE,kBAAkB;AACpC,iBAAa,IAAI;AACjB,gBAAY,CAAC,CAAC;AACd,cAAU,CAAC;AACX,eAAW,IAAI;AACf,oBAAgBJ,gBAAe;AAE/B,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,YAAY,kBAAkB,QAAS;AAE3C,cAAM,QAAQ,UAAU,CAAC;AACzB,oBAAY,KAAK;AACjB,kBAAU,MAAM,MAAM;AACtB,mBAAW,MAAM,UAAU,iBAAiB;AAAA,MAC9C,QAAQ;AACN,YAAI,YAAY,kBAAkB,SAAS;AACzC,sBAAY,CAAC,CAAC;AACd,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF,UAAE;AACA,YAAI,YAAY,kBAAkB,QAAS,cAAa,KAAK;AAAA,MAC/D;AAAA,IACF,GAAG;AAAA,EACL,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,cAAc,YAAY,KAAK,EAAE,SAAS;AAEhD,QAAM,mBAAmBK,UAAQ,MAAM;AACrC,UAAM,QAAQ,YAAY,KAAK,EAAE,YAAY;AAC7C,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO,SAAS;AAAA,MAAO,CAAC,YACtB,QAAQ,SAAS,YAAY,EAAE,SAAS,KAAK;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,kBAAkBA,UAAQ,MAAM;AACpC,QAAI,eAAe,SAAS,WAAW,EAAG,QAAO;AACjD,WAAO,SAAS,CAAC;AAAA,EACnB,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,eAAe,kBACjB,iBAAiB,OAAO,CAAC,YAAY,YAAY,eAAe,IAChE;AACJ,QAAM,kBAAkB,aAAa,MAAM,GAAG,YAAY;AAC1D,QAAM,cAAc,eAAe,aAAa,UAAU;AAE1D,QAAM,WAAW,YAAY;AAC3B,QAAI,iBAAiB,CAAC,QAAS;AAC/B,qBAAiB,IAAI;AAErB,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACAH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,QAAQ,UAAU,CAAC;AACzB,kBAAY,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;AAC/C,gBAAU,CAAC,YAAY,UAAU,MAAM,MAAM;AAC7C,iBAAW,MAAM,UAAU,iBAAiB;AAAA,IAC9C,QAAQ;AAAA,IAER,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,WAAW,YAAY;AAC3B,QAAI,gBAAgB,aAAa,UAAU,QAAS,OAAM,SAAS;AACnE,oBAAgB,CAAC,YAAY,UAAUF,gBAAe;AAAA,EACxD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,eAAe,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;;;ACpFM,gBAAAM,cAAA;AAnBC,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAA8B;AAC5B,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY,OAAO,eAAe;AAAA,QAClC,SAAS;AAAA,QACT,eAAe;AAAA,QACf,WAAW;AAAA,MACb;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ACeM,gBAAAC,QAwBI,QAAAC,cAxBJ;AAhCC,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,MAAI,CAAC,UAAU,OAAQ,QAAO;AAK9B,QAAM,YAAY,aAAa,mBAAmB;AAClD,QAAM,aAAa,MAAM,WAAW,IAAI;AACxC,QAAM,eAAe,OACjB,WAAW,MAAM,aAAa,GAAG,CAAC,cAAc,MAAM,aAAa,IAAI,CAAC,KACxE;AAEJ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,QACzD;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,eAAe;AAAA,cACf,OAAO;AAAA,cACP,cAAc;AAAA,YAChB;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,eAAe;AAAA,cACf,KAAK;AAAA,YACP;AAAA,YAEC,oBAAU,IAAI,CAAC,MAAM,MACpB,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,aAAa;AAAA,kBACb,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO;AAAA,gBACT;AAAA,gBAEA;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW;AAAA,sBACX,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,MAAM;AAAA,wBACN,KAAK;AAAA,wBACL,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,YAAY;AAAA,wBACZ,WAAW;AAAA,sBACb;AAAA;AAAA,kBACF;AAAA,kBACC;AAAA;AAAA;AAAA,cAvBI;AAAA,YAwBP,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACrEiB,SAMR,YAAAE,YANQ,OAAAC,QAwIH,QAAAC,cAxIG;AA1BjB,SAAS,YAAY,IAAqB;AACxC,SAAO,GACJ,MAAM,SAAS,EACf,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO,EACd,IAAI,CAAC,UAAiB;AACrB,QAAI,MAAM,WAAW,KAAK;AACxB,aAAO,EAAE,MAAM,WAAW,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE;AACxD,QAAI,SAAS,KAAK,KAAK;AACrB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,MAAM,QAAQ,WAAW,EAAE,EAAE,KAAK;AAAA,MAC1C;AACF,WAAO,EAAE,MAAM,aAAa,MAAM,MAAM;AAAA,EAC1C,CAAC;AACL;AAEA,SAAS,aAAa,MAA+B;AACnD,QAAM,QAA2B,CAAC;AAClC,QAAM,KAAK;AACX,MAAI,YAAY;AAChB,MAAI,MAAM;AACV,MAAI;AACJ,UAAQ,QAAQ,GAAG,KAAK,IAAI,OAAO,MAAM;AACvC,QAAI,MAAM,QAAQ,UAAW,OAAM,KAAK,KAAK,MAAM,WAAW,MAAM,KAAK,CAAC;AAC1E,QAAI,MAAM,CAAC,MAAM;AACf,YAAM,KAAK,gBAAAD,OAAC,YAAoB,gBAAM,CAAC,KAAf,KAAiB,CAAS;AAAA,aAC3C,MAAM,CAAC,MAAM;AACpB,YAAM,KAAK,gBAAAA,OAAC,QAAgB,gBAAM,CAAC,KAAf,KAAiB,CAAK;AAC5C,gBAAY,GAAG;AAAA,EACjB;AACA,MAAI,YAAY,KAAK,OAAQ,OAAM,KAAK,KAAK,MAAM,SAAS,CAAC;AAC7D,SAAO,gBAAAA,OAAAD,YAAA,EAAG,iBAAM;AAClB;AAIA,SAAS,aAAa,MAA6C;AACjE,QAAM,cAAc,mBAAmB,KAAK,IAAI;AAChD,QAAM,SAAS,cAAc,YAAY,CAAC,IAAI;AAC9C,QAAM,cAAc,KAAK,MAAM,OAAO,MAAM;AAC5C,MAAI,CAAC,YAAa,QAAO,EAAE,KAAK,IAAI,MAAM,KAAK;AAC/C,SAAO,EAAE,KAAK,YAAY,CAAC,GAAG,MAAM,SAAS,YAAY,MAAM,CAAC,EAAE;AACpE;AAeO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,MACJ,QAAQ,eAAe,KAAK,KAC5B,QAAQ,aAAa,KAAK,KAC1B,QAAQ;AACV,QAAM,YAAY,aAAa,cAAc;AAC7C,QAAM,SAAS,YAAY,GAAG;AAE9B,QAAM,iBAAiB,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,WAAW;AAErE,QAAM,aAAa,QAAQ,cAAc,IAAI,UAAU;AACvD,QAAM,cAAc;AAAA,IAClB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,cAAc;AAAA,IAClB,iBAAiB;AAAA,IACjB,iBAAiB,eAAe,SAAS,YAAY;AAAA,IACrD,aAAa;AAAA,EACf;AAEA,QAAM,YAAY,QAAQ,gBAAgB,CAAC;AAC3C,QAAM,WAAW,YAAY,SAAS;AAEtC,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MAEA;AAAA,wBAAAA,OAAC,SAAI,OAAO,EAAE,MAAM,aAAa,UAAU,EAAE,GAC3C;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,qBAAqB;AAAA,cACrB;AAAA,cACA,YAAY,aAAa;AAAA,cACzB,SAAS,aAAa;AAAA,cACtB,QAAQ,aAAa;AAAA,cACrB,aAAa,aAAa;AAAA,cAC1B,MAAM,aAAa;AAAA;AAAA,UACrB;AAAA,UACC,OAAO,IAAI,CAAC,OAAO,MAAM;AACxB,gBAAI,MAAM,SAAS,WAAW;AAC5B,qBACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,QAAQ;AAAA,kBACV;AAAA,kBAEC,gBAAM;AAAA;AAAA,gBAVF;AAAA,cAWP;AAAA,YAEJ;AAEA,gBAAI,MAAM,SAAS,cAAc;AAC/B,qBACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,WAAW;AAAA,oBACX,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,YAAY,aAAa,SAAS;AAAA,oBAClC,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,aAAa;AAAA,kBACf;AAAA,kBAEC,uBAAa,MAAM,IAAI;AAAA;AAAA,gBAbnB;AAAA,cAcP;AAAA,YAEJ;AAEA,kBAAM,UAAU,MAAM;AACtB,kBAAM,SAA8B;AAAA,cAClC,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,QAAQ;AAAA,YACV;AAEA,gBAAI,SAAS;AACX,oBAAM,EAAE,KAAK,KAAK,IAAI,aAAa,MAAM,IAAI;AAC7C,qBACE,gBAAAC,OAAC,OAAU,OAAO,QACf;AAAA,uBACC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,YAAY;AAAA,sBACZ,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,aAAa;AAAA,sBACb,WAAW;AAAA,oBACb;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAED,aAAa,IAAI;AAAA,mBAjBZ,CAkBR;AAAA,YAEJ;AAEA,mBACE,gBAAAA,OAAC,OAAU,OAAO,QACf,uBAAa,MAAM,IAAI,KADlB,CAER;AAAA,UAEJ,CAAC;AAAA,WACH;AAAA,QACC,YACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,KAAK;AAAA,cACL,WAAW;AAAA,YACb;AAAA,YAEA,0BAAAA,OAAC,YAAO,OAAO,EAAE,QAAQ,EAAE,GACzB,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,cAAc;AAAA,kBACd,UAAU;AAAA,gBACZ;AAAA,gBAEA,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,WAAS;AAAA;AAAA,gBACX;AAAA;AAAA,YACF,GACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACxKU,gBAAAE,cAAA;AA7CH,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA;AAAA,QAEP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,YACX,gBAAgB,YAAY;AAAA,YAC5B,eAAe,YAAY;AAAA,YAC3B,cAAc,YAAY;AAAA,YAC1B,WAAW,YAAY;AAAA,YACvB,YAAY,YAAY;AAAA,UAC1B;AAAA,UACA,aACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,gBAAgB,YAAY;AAAA,cAC5B,UAAU,YAAY,cAAc;AAAA,cACpC,cAAc;AAAA,gBACZ,YAAY,YAAY;AAAA,gBACxB,SAAS,YAAY;AAAA,gBACrB,QAAQ,YAAY;AAAA,gBACpB,aAAa,YAAY;AAAA,gBACzB,MAAM,YAAY;AAAA,cACpB;AAAA;AAAA,UACF;AAAA;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;;;AClFA,SAAS,SAAAC,QAAO,WAAAC,iBAAe;;;ACA/B;AAAA,EACE,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAAS,iBAAiB;;;ACR1B,eAAsB,iBAClB,MACAC,SACA,OACqB;AACrB,QAAM,MAAM,GAAG,eAAe;AAE9B,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,QAAAA,SAAQ,MAAM,CAAC;AAAA,IAChD,CAAC;AACD,UAAM,UAA4C,MAAM,SAAS,KAAK;AACtE,QAAI,WAAW,SAAS;AACpB,YAAM,IAAI,MAAM,QAAQ,KAAK;AAAA,IACjC;AACA,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,gCAAgC,KAAK;AACnD,UAAM;AAAA,EACV;AACJ;;;ACzBO,IAAM,0BAA0B;AAChC,IAAM,yBAAyB;AAEtC,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,cAAc,QAA4B;AACxD,SAAO,GAAG,OAAO,QAAQ,IAAI,OAAO,WAAW,IAAI,OAAO,QAAQ;AACpE;AAEA,SAAS,oBAAoB,UAAwB;AACnD,QAAM,cAAc,wBAAwB,KAAK,QAAQ;AACzD,QAAM,MAAM,cAAc,WAAW,GAAG,SAAS,QAAQ,KAAK,GAAG,CAAC;AAClE,SAAO,IAAI,KAAK,GAAG;AACrB;AAEO,SAAS,oBAAoB,UAA0B;AAC5D,QAAM,QAAQ,oBAAoB,QAAQ,EAAE,QAAQ;AACpD,SAAO,OAAO,MAAM,KAAK,IAAI,IAAI;AACnC;AAEO,SAAS,qBACd,UACA,UACQ;AACR,QAAM,OAAO,oBAAoB,QAAQ;AACzC,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAEzC,SAAO,IAAI,KAAK,eAAe,SAAS;AAAA,IACtC;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC,EAAE,OAAO,IAAI;AAChB;AAEO,SAAS,kBACd,UACA,UACQ;AACR,QAAM,OAAO,oBAAoB,QAAQ;AACzC,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAEzC,QAAM,QAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,IAC7C;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC,EAAE,cAAc,IAAI;AAErB,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,GAAG,SAAS;AAC5D,QAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG,SAAS;AAC9D,QAAM,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,GAAG,SAAS;AAC1D,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AAEO,SAAS,qBACd,UACA,UACA,QACQ;AACR,QAAM,OAAO,oBAAoB,QAAQ;AACzC,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAEzC,SAAO,IAAI,KAAK,eAAe,UAAU,QAAW;AAAA,IAClD;AAAA,IACA,SAAS;AAAA,IACT,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC,EAAE,OAAO,IAAI;AAChB;AAEO,SAAS,wBAAwB,UAA0B;AAChE,QAAM,OAAO,CAAC,GAAG,QAAQ,EAAE;AAAA,IACzB,CAAC,OAAO,cAAc,QAAQ,UAAU,WAAW,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO,gBAAgB,OAAO,gBAAgB,MAAM;AACtD;AAEO,SAAS,uBACd,SACA,UACc;AACd,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,OAAO,CAAC,WAAW;AAClD,UAAM,MAAM,cAAc,MAAM;AAChC,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;;;AChGO,SAAS,eAAe,KAA0B;AACvD,MAAI,eAAe,KAAM,QAAO;AAChC,QAAM,cAAc,wBAAwB,KAAK,GAAG;AACpD,QAAM,MAAM,cAAc,MAAM,GAAG,IAAI,QAAQ,KAAK,GAAG,CAAC;AACxD,SAAO,IAAI,KAAK,GAAG;AACrB;AAEO,SAAS,eACd,OACQ;AACR,QAAM,QAAQ,eAAe,MAAM,cAAc,EAAE,QAAQ;AAC3D,SAAO,OAAO,MAAM,KAAK,IAAI,IAAI;AACnC;AAEO,SAAS,aACd,OACQ;AACR,QAAM,OAAO,eAAe,MAAM,cAAc;AAChD,SAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAC9B,OAAO,MAAM,cAAc,IAC3B,KAAK,YAAY;AACvB;AAEO,SAAS,kBAAkB,MAA4B;AAC5D,MAAI,KAAK,SAAS,OAAQ,QAAO,oBAAoB,KAAK,KAAK,QAAQ;AACvE,SAAO,eAAe,KAAK,KAAK;AAClC;AAEO,SAAS,YAAY,MAA4B;AACtD,SAAO,KAAK,SAAS,SAAS,KAAK,KAAK,WAAW,aAAa,KAAK,KAAK;AAC5E;AAEO,SAAS,YAAY,MAA4B;AACtD,MAAI,KAAK,SAAS,OAAQ,QAAO,QAAQ,cAAc,KAAK,IAAI,CAAC;AACjE,SAAO,SAAS,KAAK,MAAM,EAAE;AAC/B;AAEA,SAASC,KAAI,GAAmB;AAC9B,SAAO,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AACrC;AAEO,SAAS,iBAAiB,MAAoB;AACnD,SAAO,GAAG,KAAK,eAAe,CAAC,IAAIA,KAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAIA;AAAA,IAChE,KAAK,WAAW;AAAA,EAClB,CAAC,IAAIA,KAAI,KAAK,YAAY,CAAC,CAAC,IAAIA,KAAI,KAAK,cAAc,CAAC,CAAC,IAAIA;AAAA,IAC3D,KAAK,cAAc;AAAA,EACrB,CAAC;AACH;;;AHwUI,gBAAAC,cAAA;AA1VJ,IAAM,YAAY;AAClB,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAsB3B,SAAS,qBAA6B;AACpC,MAAI;AACF,WAAO,KAAK,eAAe,EAAE,gBAAgB,EAAE,YAAY;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,qBAAqBC,eAA8C,IAAI;AAEtE,SAAS,iBAA0C;AACxD,QAAM,MAAMC,YAAW,kBAAkB;AACzC,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,wDAAwD;AAC1E,SAAO;AACT;AAQO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAA6B;AAC3B,QAAM,iBAAiB,YAAY;AAEnC,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAuB,CAAC,CAAC;AAC3D,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAE1B,CAAC,CAAC;AACJ,QAAM,CAAC,WAAW,YAAY,IAAIA,WAA8B,oBAAI,IAAI,CAAC;AACzE,QAAM,CAAC,WAAW,YAAY,IAAIA,WAA8B,QAAQ;AACxE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA;AAAA,IAAiB,MAC/D,OAAO,WAAW,cAAc,mBAAmB,IAAI;AAAA,EACzD;AAEA,EAAAC,YAAU,MAAM;AACd,wBAAoB,CAAC,YAAY;AAC/B,YAAM,WAAW,mBAAmB;AACpC,aAAO,YAAY,SAAS,aAAa,QAAQ,WAAW;AAAA,IAC9D,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,YAAY,aAAa,IAAID,WAAS,CAAC;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,IAAI;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAEhD,QAAM,aAAaE,SAAO,IAAI;AAC9B,QAAM,gBAAgBA,SAAO,CAAC;AAC9B,QAAM,mBAAmBA,SAAO,oBAAI,IAAY,CAAC;AACjD,QAAM,mBAAmBA,SAAO,oBAAI,IAAY,CAAC;AACjD,QAAM,aAAaA,SAAqB,CAAC,CAAC;AAC1C,QAAM,iBAAiBA,SAAsB,IAAI;AACjD,QAAM,mBAAmBA,SAAuC,IAAI;AACpE,QAAM,oBAAoBA,SAAe,KAAK,IAAI,CAAC;AAEnD,QAAM,oBAAoBC,aAAY,MAAM;AAC1C,QAAI,eAAe,YAAY,MAAM;AACnC,aAAO,aAAa,eAAe,OAAO;AAC1C,qBAAe,UAAU;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAF,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,wBAAkB;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,qBAAqBE;AAAA,IACzB,OAAO,QAAgB,SAAiB;AACtC,UAAI,CAAC,eAAgB,QAAO,CAAC;AAC7B,YAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC;AAC1C,UAAI,UAAU,SAAU,QAAO,CAAC;AAChC,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA,iBAAiB,IAAI,KAAK,MAAM,CAAC;AAAA,QACjC,iBAAiB,IAAI,KAAK,QAAQ,CAAC;AAAA,MACrC;AACA,aAAO,WAAW,CAAC;AAAA,IACrB;AAAA,IACA,CAAC,MAAM,cAAc;AAAA,EACvB;AAEA,QAAM,YAAYA,aAAY,CAAC,WAAuB;AACpD,UAAM,MAAM,QAAQ,cAAc,MAAM,CAAC;AACzC,UAAM,SAAS,iBAAiB,UAAU;AAC1C,cAAU,MAAM;AACd,mBAAa,CAAC,YAAY,uBAAuB,SAAS,CAAC,MAAM,CAAC,CAAC;AACnE,mBAAa,oBAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,IAC7B,CAAC;AACD,aAAS;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,QAAI,eAAe,YAAY,KAAM;AACrC,QAAI,WAAW,QAAQ,WAAW,EAAG;AAErC,UAAM,QACJ,qBACA,KAAK,OAAO,KAAK,qBAAqB;AAExC,mBAAe,UAAU,OAAO,WAAW,MAAM;AAC/C,qBAAe,UAAU;AACzB,UAAI,CAAC,WAAW,QAAS;AACzB,YAAM,OAAO,WAAW,QAAQ,MAAM;AACtC,UAAI,KAAM,WAAU,IAAI;AACxB,yBAAmB;AAAA,IACrB,GAAG,KAAK;AAAA,EACV,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,cAAcA,aAAY,YAAY;AAC1C,UAAM,aAAa,EAAE,cAAc;AACnC,sBAAkB;AAClB,iBAAa,IAAI;AACjB,iBAAa,KAAK;AAClB,iBAAa,CAAC,CAAC;AACf,cAAU,CAAC,CAAC;AACZ,iBAAa,oBAAI,IAAI,CAAC;AACtB,kBAAc,CAAC;AACf,eAAW,IAAI;AACf,qBAAiB,UAAU,oBAAI,IAAI;AACnC,qBAAiB,UAAU,oBAAI,IAAI;AACnC,eAAW,UAAU,CAAC;AACtB,sBAAkB,UAAU,KAAK,IAAI;AAErC,QAAI;AACF,YAAM,OAAO,MAAM,iBAAiB,MAAM,GAAG,SAAS;AACtD,UAAI,CAAC,WAAW,WAAW,eAAe,cAAc,QAAS;AAEjE,YAAM,mBAAmB,kBAAkB;AAC3C,YAAM,iBACJ,KAAK,SAAS,IACV,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,oBAAoB,EAAE,QAAQ,CAAC,CAAC,IAC5D;AAEN,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,WAAW,WAAW,eAAe,cAAc,QAAS;AAEjE,WAAK,QAAQ,CAAC,MAAM,iBAAiB,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC;AAClE,oBAAc,QAAQ,CAAC,UAAU,iBAAiB,QAAQ,IAAI,MAAM,EAAE,CAAC;AAEvE,gBAAU,MAAM;AACd,qBAAa,IAAI;AACjB,sBAAc,KAAK,MAAM;AACzB,mBAAW,KAAK,UAAU,SAAS;AACnC,kBAAU,aAAa;AAAA,MACzB,CAAC;AAED,wBAAkB,UAAU;AAAA,IAC9B,QAAQ;AACN,UAAI,WAAW,WAAW,eAAe,cAAc,SAAS;AAC9D,qBAAa,IAAI;AAAA,MACnB;AAAA,IACF,UAAE;AACA,UAAI,WAAW,WAAW,eAAe,cAAc,SAAS;AAC9D,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,mBAAmB,kBAAkB,CAAC;AAEhD,EAAAF,YAAU,MAAM;AACd,SAAK,YAAY;AAAA,EACnB,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,qBAAqBE,aAAY,YAAY;AACjD,UAAM,aAAa,cAAc;AAEjC,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,MAAM,GAAG,SAAS;AACxD,UAAI,CAAC,WAAW,WAAW,eAAe,cAAc,QAAS;AAEjE,YAAM,SAAS,OAAO;AAAA,QACpB,CAAC,MAAM,CAAC,iBAAiB,QAAQ,IAAI,cAAc,CAAC,CAAC;AAAA,MACvD;AACA,UAAI,OAAO,WAAW,EAAG;AAEzB,aAAO,QAAQ,CAAC,MAAM,iBAAiB,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC;AACpE,YAAM,SAAS,CAAC,GAAG,MAAM,EAAE;AAAA,QACzB,CAAC,GAAG,MACF,oBAAoB,EAAE,QAAQ,IAAI,oBAAoB,EAAE,QAAQ;AAAA,MACpE;AACA,iBAAW,UAAU,CAAC,GAAG,WAAW,SAAS,GAAG,MAAM;AACtD,oBAAc,CAACC,YAAWA,UAAS,OAAO,MAAM;AAChD,yBAAmB;AAAA,IACrB,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,MAAM,kBAAkB,CAAC;AAE7B,EAAAH,YAAU,MAAM;AACd,UAAM,WAAW,OAAO,YAAY,MAAM;AACxC,WAAK,mBAAmB;AAAA,IAC1B,GAAG,mBAAmB;AACtB,WAAO,MAAM,OAAO,cAAc,QAAQ;AAAA,EAC5C,GAAG,CAAC,kBAAkB,CAAC;AAEvB,QAAM,cAAcE,aAAY,YAAY;AAC1C,QAAI,iBAAiB,CAAC,QAAS;AAC/B,UAAM,aAAa,cAAc;AACjC,qBAAiB,IAAI;AAErB,QAAI;AACF,YAAM,mBAAmB,kBAAkB;AAC3C,YAAM,OAAO,MAAM,iBAAiB,MAAM,YAAY,SAAS;AAC/D,UAAI,CAAC,WAAW,WAAW,eAAe,cAAc,QAAS;AAEjE,YAAM,iBACJ,KAAK,SAAS,IACV,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,oBAAoB,EAAE,QAAQ,CAAC,CAAC,IAC5D;AAEN,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,WAAW,WAAW,eAAe,cAAc,QAAS;AAEjE,WAAK,QAAQ,CAAC,MAAM,iBAAiB,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC;AAClE,YAAM,QAAQ,cAAc;AAAA,QAC1B,CAAC,UAAU,CAAC,iBAAiB,QAAQ,IAAI,MAAM,EAAE;AAAA,MACnD;AACA,YAAM,QAAQ,CAAC,UAAU,iBAAiB,QAAQ,IAAI,MAAM,EAAE,CAAC;AAE/D,gBAAU,MAAM;AACd,qBAAa,CAAC,YAAY,uBAAuB,SAAS,IAAI,CAAC;AAC/D,sBAAc,CAACC,YAAWA,UAAS,KAAK,MAAM;AAC9C,mBAAW,KAAK,UAAU,SAAS;AACnC,YAAI,MAAM,SAAS,GAAG;AACpB,oBAAU,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;AAAA,QAC/C;AAAA,MACF,CAAC;AAED,wBAAkB,UAAU;AAAA,IAC9B,QAAQ;AAAA,IAER,UAAE;AACA,UAAI,WAAW,QAAS,kBAAiB,KAAK;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,eAAe,SAAS,kBAAkB,CAAC;AAEjE,QAAM,aAAaC,UAAQ,MAAM;AAC/B,QAAI,UAAU,WAAW,EAAG,QAAO;AACnC,WAAO,UAAU;AAAA,MAAO,CAAC,QAAQ,MAC/B,oBAAoB,EAAE,QAAQ,IAAI,oBAAoB,OAAO,QAAQ,IACjE,IACA;AAAA,IACN;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,iBAAiBA;AAAA,IACrB,MACE,CAAC,GAAG,SAAS,EACV;AAAA,MACC,CAAC,GAAG,MACF,oBAAoB,EAAE,QAAQ,IAAI,oBAAoB,EAAE,QAAQ;AAAA,IACpE,EACC,MAAM,GAAG,CAAC;AAAA,IACf,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,kBAAkBA,UAAQ,MAAM;AACpC,UAAM,QAAwB;AAAA,MAC5B,GAAG,UAAU,IAAkB,CAAC,UAAU,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,MACjE,GAAG,OAAO,IAAkB,CAAC,WAAW,EAAE,MAAM,SAAS,MAAM,EAAE;AAAA,IACnE;AACA,UAAM,KAAK,CAAC,GAAG,MAAM;AACnB,YAAM,OAAO,kBAAkB,CAAC,IAAI,kBAAkB,CAAC;AACvD,aAAO,cAAc,WAAW,OAAO,CAAC;AAAA,IAC1C,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,QAAQ,SAAS,CAAC;AAEjC,QAAM,gBAAgBA,UAAQ,MAAM;AAClC,QAAI,CAAC,WAAY,QAAO;AACxB,WAAO,YAAY,EAAE,MAAM,QAAQ,MAAM,WAAW,CAAC;AAAA,EACvD,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,wBAAwBF;AAAA,IAC5B,CAAC,YAA4C;AAC3C,uBAAiB,UAAU;AAAA,IAC7B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkBA,aAAY,MAAM;AACxC,iBAAa,CAAC,YAAa,YAAY,WAAW,WAAW,QAAS;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,QAAM,QAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;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,EACF;AAEA,SACE,gBAAAN,OAAC,mBAAmB,UAAnB,EAA4B,OAC1B,UACH;AAEJ;;;AI7XA,SAAS,aAAAS,aAAW,WAAAC,WAAS,YAAAC,kBAAgB;AAyCnC,SAOE,OAAAC,QAPF,QAAAC,cAAA;AA7BV,IAAMC,gBAAe,KAAK,oBAAoB,UAAU,KAAK;AAQtD,IAAM,aAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,WAAW,iBAAiB,kBAAkB,oBAAoB,IACxE,eAAe;AAEjB,QAAM,CAAC,KAAK,MAAM,IAAIC,WAAS,MAAM,oBAAI,KAAK,CAAC;AAE/C,EAAAC,YAAU,MAAM;AACd,UAAM,WAAW,OAAO,YAAY,MAAM,OAAO,oBAAI,KAAK,CAAC,GAAG,GAAM;AACpE,WAAO,MAAM,OAAO,cAAc,QAAQ;AAAA,EAC5C,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBC;AAAA,IACtB,MACEH,cAAa,IAAI,CAAC,UAAU;AAAA,MAC1B,OAAO;AAAA,MACP,OAAO,gBAAgB,MAAM,GAAG;AAAA,MAChC,SACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,OAAO;AAAA,UACT;AAAA,UAEA;AAAA,4BAAAD,OAAC,UAAM,0BAAgB,MAAM,GAAG,GAAE;AAAA,YAClC,gBAAAA,OAAC,UAAK,OAAO,EAAE,SAAS,IAAI,GAAI,2BAAiB,MAAM,GAAG,GAAE;AAAA;AAAA;AAAA,MAC9D;AAAA,IAEJ,EAAE;AAAA,IACJ,CAAC,GAAG;AAAA,EACN;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB;AAAA,MAEA,0BAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,GAC1B,0BAAAA;AAAA,QAAC,gBAAQ;AAAA,QAAR;AAAA,UACC,OAAO,gBAAgB,kBAAkB,GAAG;AAAA,UAC5C,OAAO;AAAA,UACP,UAAU,CAAC,UAAU,oBAAoB,KAAe;AAAA,UACxD,UAAU;AAAA,UACV,YAAU;AAAA;AAAA,MACZ,GACF;AAAA;AAAA,EACF;AAEJ;;;AC7EA,SAAS,WAAAM,iBAAe;;;ACgEhB,gBAAAC,QAiBF,QAAAC,cAjBE;AAzCD,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,QAAQ,wBAAwB,OAAO,QAAQ;AACrD,QAAM,eAAe,QAAQ,iBAAiB,OAAO,WAAW;AAChE,QAAM,WAAW,YAAY,UAAU,gBAAgB;AAEvD,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,iBAAiB,CAAC,OAAO,YAAa;AAC3C,kBAAc;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO,aAAa,OAAO;AAAA,MACjC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa,cAAc,MAAM;AAAA,MACjC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,cAAc,aAAa,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,MACtD;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,WAAW,WACP,aAAa,MAAM,UAAU,GAAG,CAAC,aAAa,MAAM,UAAU,GAAG,CAAC,KAClE;AAAA,kBACJ,YAAY;AAAA,gBACd;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,eAAe;AAAA,cACf,YAAY;AAAA,YACd;AAAA,YAEC;AAAA,0BACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,QAAQ,aAAa,MAAM,eAAe,GAAG,CAAC;AAAA,oBAC9C,cAAc;AAAA,oBACd,YAAY,MAAM,eAAe,IAAI;AAAA,oBACrC,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,YAAY;AAAA,kBACd;AAAA,kBAEC,uBAAa,YAAY;AAAA;AAAA,cAC5B;AAAA,cAGF,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU,OAAO;AAAA,kBACjB,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,OAAO,MAAM;AAAA,oBACb,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,oBAAoB;AAAA,kBACtB;AAAA,kBAEC,+BAAqB,OAAO,UAAU,gBAAgB;AAAA;AAAA,cACzD;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,UAAU,GAAG,cAAc,GAAG;AAAA,YA4BvC;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,KAAK;AAAA,kBACP;AAAA,kBAEA,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,CAAC;AAAA,sBACX,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,SAAS;AAAA,wBACT,QAAQ;AAAA,wBACR,YAAY;AAAA,wBACZ,OAAO,MAAM;AAAA,wBACb,MAAM;AAAA,wBACN,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,YAAY;AAAA,wBACZ,WAAW;AAAA,wBACX,QAAQ,eAAe,YAAY;AAAA,sBACrC;AAAA,sBAEC,iBAAO;AAAA;AAAA,kBACV;AAAA;AAAA,cACF;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,OAAO,MAAM;AAAA,oBACb,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,kBAEC,iBAAO;AAAA;AAAA,cACV;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC9HQ,gBAAAE,QAwCA,QAAAC,cAxCA;AA3CD,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,WAAW,UAAU,gBAAgB;AAC3C,QAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,QAAM,cAAc,MAAM,oBAAoB,MAAM,cAAc;AAElE,QAAM,OAAO,WAAW,MAAM,IAAI;AAClC,QAAM,SAAS,MAAM,SAAS,oBAAoB,MAAM,MAAM,IAAI,OAAO;AACzE,QAAM,WAAW,MAAM,YACnB,oBAAoB,MAAM,SAAS,IAAI,OACvC;AACJ,QAAM,WAAW,MAAM,WACnB,oBAAoB,MAAM,QAAQ,IAAI,OACtC;AAEJ,QAAM,cAAc,aAAa,KAAK;AACtC,QAAM,cAAc,qBAAqB,aAAa,gBAAgB;AAEtE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa,SAAS,MAAM,EAAE;AAAA,MAC9B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,cAAc,aAAa,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,MACtD;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,YAAY;AAAA,gBACd;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,eAAe;AAAA,cACf,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU;AAAA,gBACV,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,OAAO,MAAM;AAAA,kBACb,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,oBAAoB;AAAA,gBACtB;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,UAAU,GAAG,cAAc,GAAG;AAAA,YAEvC;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,UAAU;AAAA,kBACZ;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK,2BAA2B,MAAM,iBAAiB,YAAY,CAAC;AAAA,wBACpE,KAAK,GAAG,MAAM,gBAAgB;AAAA,wBAC9B,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,WAAW;AAAA,wBACb;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO,MAAM;AAAA,0BACb,UAAU;AAAA,0BACV,YAAY;AAAA,0BACZ,YAAY;AAAA,wBACd;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,QAAQ,MAAM;AAAA,wBACd;AAAA,wBACA,GAAG;AAAA;AAAA,oBACL;AAAA;AAAA;AAAA,cACF;AAAA,cAEC,eACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,OAAO,MAAM;AAAA,oBACb,UAAU;AAAA,oBACV,YAAY;AAAA,kBACd;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cAGF,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,WAAW;AAAA,oBACX,SAAS;AAAA,oBACT,qBAAqB;AAAA,oBACrB,KAAK;AAAA,oBACL,UAAU;AAAA,kBACZ;AAAA,kBAEA;AAAA,oCAAAD,OAAC,YAAS,OAAO,KAAK,QAAQ,OAAO,QAAQ,OAAc;AAAA,oBAC3D,gBAAAA,OAAC,YAAS,OAAO,KAAK,UAAU,OAAO,UAAU,OAAc;AAAA,oBAC/D,gBAAAA,OAAC,YAAS,OAAO,KAAK,UAAU,OAAO,UAAU,OAAc;AAAA;AAAA;AAAA,cACjE;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,aAAa,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,QAC9C,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,eAAe;AAAA,cACf,SAAS;AAAA,YACX;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,oBAAoB;AAAA,YACtB;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;AF1JM,gBAAAE,QAaE,QAAAC,cAbF;AApCC,IAAM,WAA4B,CAAC;AAAA,EACxC;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,MAAM;AACJ,QAAM,SAASC,UAAQ,MAAM;AAC3B,UAAM,MAA+D,CAAC;AACtE,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,YAAY,IAAI;AAC5B,YAAM,MAAM,kBAAkB,KAAK,gBAAgB;AACnD,YAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,UAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK;AAC7B,YAAI,KAAK;AAAA,UACP;AAAA,UACA,OAAO,qBAAqB,KAAK,kBAAkB,IAAI;AAAA,UACvD,OAAO,CAAC,IAAI;AAAA,QACd,CAAC;AAAA,MACH,OAAO;AACL,aAAK,MAAM,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,kBAAkB,IAAI,CAAC;AAElC,SACE,gBAAAD,OAAC,SAAI,KAAK,cAAc,OAAO,EAAE,UAAU,WAAW,GACpD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY,MAAM;AAAA,QACpB;AAAA;AAAA,IACF;AAAA,IAEC,OAAO,IAAI,CAAC,UACX,gBAAAC,OAAC,SAAoB,OAAO,EAAE,UAAU,WAAW,GACjD;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,YAAY,MAAM;AAAA,YAClB,OAAO,MAAM;AAAA,YACb,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,eAAe;AAAA,UACjB;AAAA,UAEC,gBAAM;AAAA;AAAA,MACT;AAAA,MAEC,MAAM,MAAM,IAAI,CAAC,SAAS;AACzB,cAAM,MAAM,YAAY,IAAI;AAC5B,YAAI,KAAK,SAAS,QAAQ;AACxB,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,QAAQ,KAAK;AAAA,cACb,UAAU,QAAQ;AAAA,cAClB,SAAS,UAAU,IAAI,GAAG;AAAA,cAC1B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,YATK;AAAA,UAUP;AAAA,QAEJ;AACA,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,KAAK;AAAA,YACZ,SAAS,UAAU,IAAI,GAAG;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UARK;AAAA,QASP;AAAA,MAEJ,CAAC;AAAA,SAlDO,MAAM,GAmDhB,CACD;AAAA,KACH;AAEJ;;;AGzGI,gBAAAG,QASE,QAAAC,cATF;AAhBG,IAAM,eAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,SACJ,UAAU,IACN,aAAa,YAAY,YACzB,aAAa,YAAY,YAC7B,QAAQ,WAAW,OAAO,KAAK,CAAC;AAElC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,eAAe;AAAA,MACjB;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL;AAAA,UACA,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,eAAe;AAAA,YACf,SAAS;AAAA,YACT,QAAQ,aAAa,aAAa;AAAA,YAClC,cAAc;AAAA,YACd,YAAY,MAAM;AAAA,YAClB,OAAO;AAAA,YACP,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,WAAW,cAAc,MAAM,UAAU,eAAe,aAAa;AAAA,YACrE,WAAW;AAAA,YACX,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,YACI;AAAA;AAAA;AAAA,MACL;AAAA;AAAA,EACF;AAEJ;;;AC7CI,gBAAAC,cAAA;AARG,IAAMC,kBAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,gBAAAD,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,SAAS,GACtD,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ,aAAa,aAAa;AAAA,MAClC,cAAc;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ,YAAY,SAAS;AAAA,MAC7B,SAAS,YAAY,OAAO;AAAA,IAC9B;AAAA,IAEC,sBACG,aAAa,YAAY,iBACzB,aAAa,YAAY;AAAA;AAC/B,GACF;;;AC/BA,gBAAAE,QAsBA,QAAAC,cAtBA;AAVF,IAAM,YAAY;AAAA,EAChB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AACb;AAEO,IAAM,eAGR,CAAC,EAAE,OAAO,aAAa,MAC1B,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,OAAO,EAAE,GAAG,WAAW,SAAS,UAAU,OAAO,MAAM,KAAK;AAAA,IAE3D,uBAAa,YAAY;AAAA;AAC5B;AAGK,IAAME,cAGR,CAAC,EAAE,OAAO,aAAa,MAC1B,gBAAAF,OAAC,SAAI,OAAO,EAAE,GAAG,WAAW,OAAO,MAAM,KAAK,GAC3C,uBAAa,YAAY,OAC5B;AAGK,IAAM,aAIR,CAAC,EAAE,OAAO,cAAc,QAAQ,MACnC,gBAAAC,OAAC,SAAI,OAAO,EAAE,GAAG,WAAW,OAAO,MAAM,KAAK,GAC5C;AAAA,kBAAAD,OAAC,SAAK,uBAAa,YAAY,WAAU;AAAA,EACzC,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,QACT,QAAQ,aAAa,MAAM,OAAO;AAAA,QAClC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MAEC,uBAAa,YAAY;AAAA;AAAA,EAC5B;AAAA,GACF;;;ACrDF,SAAS,eAAAG,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AACzD,SAAS,sBAAsB;AAG/B,SAAS,uBAAuB,IAA4C;AAC1E,MAAI,OAAO,IAAI,iBAAiB;AAChC,SAAO,MAAM;AACX,UAAM,QAAQ,OAAO,iBAAiB,IAAI;AAC1C,QACE,wBAAwB,KAAK,MAAM,SAAS,KAC5C,KAAK,eAAe,KAAK,cACzB;AACA,aAAO;AAAA,IACT;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAMO,SAAS,wBAAwB;AACtC,QAAM,EAAE,sBAAsB,IAAI,eAAe;AACjD,QAAM,eAAeC,SAA8B,IAAI;AACvD,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,CAAC;AAEhD,QAAM,CAAC,eAAe,IAAI,eAA+B;AAAA,IACvD,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,kBAAkBC;AAAA,IACtB,CAAC,OAA8B;AAC7B,mBAAa,UAAU;AACvB,sBAAgB,EAAE;AAAA,IACpB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,EAAAC,YAAU,MAAM;AACd,0BAAsB,MAAM;AAC1B,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,UAAW,QAAO,MAAM;AAAA,MAAC;AAE9B,YAAM,aAAa,uBAAuB,SAAS;AACnD,YAAM,YAAY,aACd,WAAW,YACX,OAAO,WAAW,SAAS,gBAAgB;AAE/C,UAAI,SAAkD;AACtD,YAAM,OAAO,UAAU,iBAA8B,cAAc;AACnE,iBAAW,OAAO,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,OAAO,IAAI,sBAAsB;AACvC,YAAI,KAAK,SAAS,GAAG;AACnB,mBAAS,EAAE,IAAI,KAAK,KAAK,KAAK,IAAI;AAClC;AAAA,QACF;AAAA,MACF;AAEA,aAAO,MAAM;AACX,YAAI,CAAC,UAAU,aAAa,EAAG;AAC/B,cAAM,QAAQ,OAAO,GAAG,sBAAsB,EAAE,MAAM,OAAO;AAC7D,YAAI,SAAS,EAAG;AAChB,YAAI,YAAY;AACd,qBAAW,aAAa;AAAA,QAC1B,OAAO;AACL,iBAAO,SAAS,GAAG,KAAK;AAAA,QAC1B;AACA,uBAAe,CAAC,MAAM,IAAI,CAAC;AAAA,MAC7B;AAAA,IACF,CAAC;AACD,WAAO,MAAM,sBAAsB,IAAI;AAAA,EACzC,GAAG,CAAC,qBAAqB,CAAC;AAE1B,EAAAA,YAAU,MAAM;AACd,QAAI,gBAAgB,EAAG;AACvB,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAChB,UAAM,aAAa,uBAAuB,SAAS;AACnD,UAAM,SAA+B,cAAc;AAEnD,UAAM,WAAW,MAAM;AACrB,UAAI,UAAU,sBAAsB,EAAE,OAAO,EAAG,gBAAe,CAAC;AAAA,IAClE;AAEA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,EAC5D,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAcD,aAAY,MAAM;AACpC,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAChB,UAAM,aAAa,uBAAuB,SAAS;AACnD,UAAM,OAAO,UAAU,sBAAsB;AAC7C,QAAI,YAAY;AACd,YAAM,gBAAgB,WAAW,sBAAsB,EAAE;AACzD,iBAAW,SAAS;AAAA,QAClB,KAAK,WAAW,aAAa,KAAK,MAAM,iBAAiB;AAAA,QACzD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,OAAO;AACL,aAAO,SAAS;AAAA,QACd,KAAK,OAAO,UAAU,KAAK,MAAM;AAAA,QACjC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,mBAAe,CAAC;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,iBAAiB,aAAa,YAAY;AACrD;;;AZvDI,SAYE,OAAAE,QAZF,QAAAC,cAAA;AA7BG,IAAM,qBAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,UAAUC,OAAM;AACtB,QAAM,QAAQC,UAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AAChE,QAAM,OAAOA;AAAA,IACX,MAAM,qBAAqB,OAAO,MAAM,kBAAkB;AAAA,IAC1D,CAAC,OAAO,IAAI;AAAA,EACd;AACA,QAAM,OAAO,eAAe;AAC5B,QAAM,EAAE,iBAAiB,aAAa,YAAY,IAAI,sBAAsB;AAE5E,QAAM,gBACJ,OAAO,gCAAgC;AACzC,QAAM,eACJ,OAAO,+BAA+B;AAExC,QAAM,cAAc,KAAK;AACzB,QAAM,YACJ,CAAC,KAAK,aAAa,KAAK,aAAa,KAAK,gBAAgB,WAAW;AACvE,QAAM,YACJ,CAAC,KAAK,aAAa,CAAC,KAAK,aAAa,KAAK,gBAAgB,WAAW;AACxE,QAAM,WAAW,KAAK,gBAAgB,SAAS;AAC/C,QAAM,eACJ,CAAC,KAAK,aAAa,KAAK,gBAAgB,SAAS,KAAK,KAAK;AAE7D,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,mBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO,MAAM;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD,OAAC,WAAO,sBAAW;AAAA,QAEnB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QAEC,eAAe,gBAAAA,OAAC,gBAAa,OAAc,cAA4B;AAAA,QACvE,aACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,SAAS,MAAM,KAAK,KAAK,MAAM;AAAA;AAAA,QACjC;AAAA,QAED,aAAa,gBAAAA,OAACI,aAAA,EAAW,OAAc,cAA4B;AAAA,QAEnE,YACC,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ,eAAe,KAAK;AAAA,YACpB,WAAW,KAAK;AAAA,YAChB,kBAAkB,KAAK;AAAA,YACvB,MAAM,OAAO;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc;AAAA;AAAA,QAChB;AAAA,QAGD,gBACC,gBAAAA;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,KAAK,KAAK,YAAY;AAAA,YACrC,WAAW,KAAK;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AahInB,SAAS,mBAAmB;AAgBxB,SAmBE,OAAAC,QAnBF,QAAAC,cAAA;AANG,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,cAAc;AAAA,QACd,SAAS;AAAA,QACT,QAAQ,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,QAC3D,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,YAAY;AAAA,QACnB,YAAY,YAAY;AAAA,QACxB,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,MAEA;AAAA,wBAAAD,OAAC,eAAY,eAAY,QAAO,MAAM,IAAI;AAAA,QAC1C,gBAAAA,OAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,EACf;AAEJ;;;ACpCO,SAAS,sBACd,QACA,UAA2B,QAC3B,MACa;AACb,SAAO;AAAA,IACL,iBACE,YAAY,SAAS,OAAO,iBAAiB,OAAO;AAAA,IACtD,iBAAiB,OAAO;AAAA,IACxB,aAAa,OAAO;AAAA,IACpB,qBAAqB,OAAO;AAAA,IAC5B,8BAA8B,OAAO;AAAA,IACrC,6BAA6B,OAAO;AAAA,IACpC;AAAA,EACF;AACF;;;ACOI,SAUE,OAAAE,QAVF,QAAAC,cAAA;AARG,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT;AAAA,YACA,OAAO,aAAa,YAAY;AAAA;AAAA,QAClC;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,sBAAsB,aAAa,QAAQ,IAAI;AAAA,YACvD,eAAe;AAAA,YACf;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC7CA,SAAS,oBAAoB;AA2CvB,gBAAAE,QA0CA,QAAAC,cA1CA;AA/BC,IAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,cAAc;AAChB,MAAM;AACJ,QAAM,EAAE,YAAY,iBAAiB,IAAI,eAAe;AAExD,MAAI,CAAC,WAAY,QAAO;AAExB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAY,aAAa,YAAY;AAAA,MACrC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,aAAa,aAAa;AAAA,QAClC,cAAc;AAAA,QACd,YAAY,GAAG,aAAa;AAAA,QAC5B,WAAW,kBAAkB,aAAa,gBAAgB,aAAa;AAAA,QACvE,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAwCN;AAAA,QAEF,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,KAAK;AAAA,cACL,SAAS;AAAA,cACT,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,YAAY;AAAA,oBACZ,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,WAAW,WAAW,aAAa;AAAA,kBACrC;AAAA;AAAA,cACF;AAAA,cACA,gBAAAA,OAAC,UAAM,uBAAa,YAAY,MAAK;AAAA;AAAA;AAAA,QACvC;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,OAAO,EAAE,UAAU,SAAS;AAAA,YAE5B;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,UAAU,WAAW;AAAA,kBACrB,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,cAAc;AAAA,oBACd,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,oBAAoB;AAAA,kBACtB;AAAA,kBAEC,+BAAqB,WAAW,UAAU,gBAAgB;AAAA;AAAA,cAC7D;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,WAAW;AAAA,kBAClB,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,cAAc;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBAEC,qBAAW;AAAA;AAAA,cACd;AAAA;AAAA;AAAA,UAhCK,cAAc,UAAU;AAAA,QAiC/B;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,cACL,KAAK;AAAA,cACL,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YAEA;AAAA,8BAAAD,OAAC,UAAK,WAAU,wBACb,uBAAa,YAAY,UAC5B;AAAA,cACA,gBAAAA,OAAC,gBAAa,eAAY,QAAO,MAAM,IAAI;AAAA;AAAA;AAAA,QAC7C;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC1KA,SAAS,YAAAE,kBAAgB;AAEzB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,aAAY,cAAAC,aAAY,eAAAC,oBAAmB;AAiDhD,SAUI,OAAAC,QAVJ,QAAAC,cAAA;AApCJ,IAAMC,gBAAe,CAAC,UAAkB,QAAyB;AAC/D,QAAM,IAAI,mBAAmB,GAAG;AAChC,QAAM,IAAI,mBAAmB,QAAQ;AACrC,SAAO;AAAA,IACL,EAAE,OAAO,YAAY,MAAM,gDAAgD,CAAC,IAAI,MAAMH,cAAa,IAAI,UAAU;AAAA,IACjH,EAAE,OAAO,YAAY,MAAM,uBAAuB,CAAC,MAAM,CAAC,IAAI,MAAMD,aAAY,IAAI,UAAU;AAAA,IAC9F,EAAE,OAAO,KAAK,MAAM,yCAAyC,CAAC,QAAQ,CAAC,IAAI,MAAMD,aAAY,IAAI,UAAU;AAAA,EAC7G;AACF;AAEA,IAAMM,UAAS,CAAC,WAAmB,aAAqB,UAAiC;AAAA,EACvF,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ,aAAa,WAAW;AAAA,EAChC,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,YAAY;AACd;AAEO,IAAMC,kBAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIT,WAAS,KAAK;AACtC,QAAM,OAAO,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAE5E,SACE,gBAAAM;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,GAAG,UAAU,WAAW;AAAA,MACpF,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAElC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY;AAAA,YACZ,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,OAAOG,QAAO,WAAW,aAAa,IAAI;AAAA,YAE1C,0BAAAH,OAACJ,WAAA,EAAS,MAAM,OAAO,MAAM;AAAA;AAAA,QAC/B;AAAA,QAEC,QACC,gBAAAI;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,QAAQ,OAAO;AAAA,cACf,OAAO;AAAA,cACP,SAAS;AAAA,cACT,KAAK;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,QAAQ;AAAA,YACV;AAAA,YAEC,UAAAE,cAAa,UAAU,IAAI,EAAE,IAAI,CAAC,MACjC,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAM,EAAE;AAAA,gBACR,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,cAAY,EAAE;AAAA,gBACd,SAAS,MAAM,QAAQ,KAAK;AAAA,gBAC5B,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY,EAAE;AAAA,kBACd,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,gBAClB;AAAA,gBAEA,0BAAAA,OAAC,EAAE,MAAF,EAAO,MAAM,IAAI;AAAA;AAAA,cAjBb,EAAE;AAAA,YAkBT,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACnGE,gBAAAK,cAAA;AADK,IAAMC,gBAAgC,CAAC,EAAE,OAAO,MAAM,MAC3D,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY,MAAM,OAAO,IAAI;AAAA,MAC7B,QAAQ,aAAa,MAAM,OAAO,IAAI,CAAC;AAAA,MACvC,OAAO,IAAI,OAAO,WAAW,IAAI;AAAA,MACjC,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,IAEC;AAAA;AACH;;;ACsCI,gBAAAE,QAmFU,QAAAC,cAnFV;AArCN,IAAMC,cAAa;AAEZ,IAAMC,eAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAiB,CAAC;AACxB,MAAI,SAAU,MAAK,KAAK,eAAe,QAAQ,UAAU,IAAI,CAAC;AAC9D,MAAI,iBAAiB;AACnB,UAAM,UAAU,oBAAoB,QAAQ,eAAe,QAAQ,OAAO;AAC1E,SAAK;AAAA,MACH,kBAAkB,SAAS,aAAa,WAAW;AAAA,IACrD;AAAA,EACF;AAEA,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,cAAc,YAAY;AAAA,QAC1B,QAAQ,YAAY;AAAA,QACpB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ;AAAA,YACb,KAAK,QAAQ;AAAA,YACb,SAAQ;AAAA,YACR,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,cAAc,YAAY;AAAA,cAC1B,QAAQ;AAAA,YACV;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,cAAc,YAAY;AAAA,cAC1B,QAAQ;AAAA,cACR,YACE;AAAA,YACJ;AAAA;AAAA,QACF;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,QAAQ;AAAA,YACV;AAAA,YAEA;AAAA,8BAAAD,OAACI,eAAA,EAAa,OAAO,eAAe,OAAO,eAAe;AAAA,cAC1D,gBAAAJ;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY,YAAY;AAAA,oBACxB,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,eAAe;AAAA,oBACf,OAAO;AAAA,oBACP,QAAQ;AAAA,kBACV;AAAA,kBAEC,kBAAQ;AAAA;AAAA,cACX;AAAA,cACC,QAAQ,eACP,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY,YAAY;AAAA,oBACxB,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,iBAAiB;AAAA,oBACjB,iBAAiB;AAAA,oBACjB,UAAU;AAAA,kBACZ;AAAA,kBAEC,kBAAQ;AAAA;AAAA,cACX;AAAA,cAEF,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,WAAW;AAAA,kBACb;AAAA,kBAEC;AAAA,yBAAK,SAAS,KACb,gBAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAOE;AAAA,0BACP,UAAU;AAAA,0BACV,YAAY,YAAY;AAAA,wBAC1B;AAAA,wBAEC,eAAK,IAAI,CAAC,GAAG,MACZ,gBAAAD,OAAC,UACE;AAAA,8BAAI,KACH,gBAAAD,OAAC,UAAK,OAAO,EAAE,QAAQ,SAAS,SAAS,IAAI,GAAG,kBAAC;AAAA,0BAElD;AAAA,6BAJQ,CAKX,CACD;AAAA;AAAA,oBACH;AAAA,oBAED,aACC,gBAAAA,OAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAChC,0BAAAA;AAAA,sBAACK;AAAA,sBAAA;AAAA,wBACC,UAAU,QAAQ;AAAA,wBAClB,WAAU;AAAA,wBACV,aAAY;AAAA,wBACZ,YAAY,aAAa;AAAA;AAAA,oBAC3B,GACF;AAAA;AAAA;AAAA,cAEJ;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACzEQ,gBAAAC,QAkEQ,QAAAC,cAlER;AAjER,IAAMC,SAAQ;AAAA,EACZ,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEO,IAAMC,YAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,IAAID,OAAM,OAAO;AACvB,QAAM,OAAiB,CAAC;AACxB,MAAI,SAAU,MAAK,KAAK,eAAe,QAAQ,UAAU,IAAI,CAAC;AAC9D,MAAI,iBAAiB;AACnB,UAAM,UAAU,oBAAoB,QAAQ,eAAe,QAAQ,OAAO;AAC1E,SAAK;AAAA,MACH,kBAAkB,SAAS,aAAa,WAAW;AAAA,IACrD;AAAA,EACF;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,OAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK,EAAE;AAAA,QACP,SAAS,EAAE;AAAA,QACX,cAAc,UACV,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC,KACnD;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,OAAO,EAAE;AAAA,cACT,UAAU,YAAY,SAAS,QAAQ;AAAA,cACvC,aAAa;AAAA,cACb,cAAc,YAAY;AAAA,cAC1B,UAAU;AAAA,YACZ;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,QAAQ;AAAA,gBACb,KAAK,QAAQ;AAAA,gBACb,SAAQ;AAAA,gBACR,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,WAAW;AAAA,kBACX,SAAS;AAAA,gBACX;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,GACjC;AAAA,0BAAAD,OAACI,eAAA,EAAa,OAAO,eAAe,OAAO,eAAe;AAAA,UAC1D,gBAAAJ;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,UAAU,EAAE;AAAA,gBACZ,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO,YAAY;AAAA,gBACnB,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,cACZ;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UACC,QAAQ,eACP,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,YAAY;AAAA,gBACxB,OAAO,YAAY;AAAA,gBACnB,UAAU,YAAY,SAAS,KAAK;AAAA,gBACpC,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,iBAAiB,EAAE;AAAA,gBACnB,iBAAiB;AAAA,gBACjB,UAAU;AAAA,cACZ;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UAEF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,WAAW;AAAA,cACb;AAAA,cAEC;AAAA,qBAAK,SAAS,KACb,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO,YAAY;AAAA,sBACnB,UAAU;AAAA,sBACV,YAAY,YAAY;AAAA,oBAC1B;AAAA,oBAEC,eAAK,IAAI,CAAC,GAAG,MACZ,gBAAAC,OAAC,UACE;AAAA,0BAAI,KACH,gBAAAD,OAAC,UAAK,OAAO,EAAE,QAAQ,SAAS,SAAS,IAAI,GAAG,kBAAC;AAAA,sBAElD;AAAA,yBAJQ,CAKX,CACD;AAAA;AAAA,gBACH;AAAA,gBAED,aACC,gBAAAA,OAAC,UAAK,OAAO,EAAE,YAAY,OAAO,GAChC,0BAAAA;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,UAAU,QAAQ;AAAA,oBAClB,WAAW,YAAY;AAAA,oBACvB,aAAa,MAAM,YAAY,eAAe,GAAG;AAAA,oBACjD,MAAM;AAAA,oBACN,YAAY,aAAa;AAAA;AAAA,gBAC3B,GACF;AAAA;AAAA;AAAA,UAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AChJI,SAOI,OAAAC,QAPJ,QAAAC,cAAA;AAjBG,IAAMC,aAA6B,CAAC;AAAA,EACzC;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,MAAM;AACJ,SACE,gBAAAD,OAAC,SACC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,cAAc,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,UACjE,YAAY,YAAY;AAAA,QAC1B;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO,YAAY;AAAA,cACnB,cAAc,aAAa,YAAY,WAAW;AAAA,cAClD,cAAc;AAAA,YAChB;AAAA,YAEC,uBAAa;AAAA;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,IAEC,eAAe,SAAS,WAAW,IAClC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,UACT,OAAO,YAAY;AAAA,UACnB,UAAU;AAAA,QACZ;AAAA,QAEC,uBAAa;AAAA;AAAA,IAChB,IAEA,SAAS,IAAI,CAAC,GAAG,MACf,gBAAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QAEC,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,SAAS,EAAE,YAAY;AAAA,QACtC,eAAe,SAAS,CAAC;AAAA,QACzB;AAAA,QACA,SAAS,IAAI,SAAS,SAAS;AAAA,QAC/B,SAAS,MAAM,IAAI,SAAS;AAAA,QAC5B;AAAA,QACA;AAAA;AAAA,MAZK,GAAG,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IAavC,CACD;AAAA,IAGF,WACC,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,SAAS,QAAQ,gBAAgB,UAAU,WAAW,GAAG;AAAA,QAElE,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ,aAAa,MAAM,YAAY,eAAe,IAAI,CAAC;AAAA,cAC3D,YAAY;AAAA,cACZ,OAAO,YAAY;AAAA,cACnB,YAAY,YAAY;AAAA,cACxB,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,QAAQ,cAAc,YAAY;AAAA,cAClC,SAAS,cAAc,MAAM;AAAA,YAC/B;AAAA,YAEC,wBAAc,aAAa,UAAU,aAAa;AAAA;AAAA,QACrD;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;AChFM,gBAAAI,cAAA;AAvBC,IAAMC,iBAAiC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB,SAAS,cAAc,SAAS,MAAM,GAAG;AACnF,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,sBAAsB,SAAS,cAAc,SAAS,MAAM;AAE3E,QAAM,SAAS;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB,YAAY,eAAe,SAAS,YAAY;AAAA,IACjE,aAAa,YAAY;AAAA,IACzB,wBAAwB,YAAY;AAAA,IACpC;AAAA,EACF;AAEA,SACE,gBAAAD,OAAC,SAAI,OAAO,EAAE,YAAY,yBAAyB,cAAc,YAAY,aAAa,UAAU,SAAS,GAC3G,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WAAS;AAAA;AAAA,EACX,GACF;AAEJ;;;ACjDA,SAAS,SAAAE,QAAO,WAAAC,iBAAe;AAC/B,SAAS,kBAAAC,uBAAsB;AAsDzB,gBAAAC,QAsEM,QAAAC,cAtEN;AAlCC,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAAM;AACJ,QAAM,UAAUC,OAAM;AACtB,QAAM,QAAQC,UAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AAChE,QAAM,EAAE,gBAAgB,WAAW,eAAe,iBAAiB,IACjE,eAAe;AACjB,QAAM,gBACJ,OAAO,gCAAgC;AACzC,QAAM,eACJ,OAAO,+BAA+B;AACxC,QAAM,CAAC,eAAe,IAAIC,gBAA+B;AAAA,IACvD,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,CAAC;AAED,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,mBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY,MAAM;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAyBN;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,eAAe;AAAA,YACjB;AAAA,YAEC,uBAAa,YAAY;AAAA;AAAA,QAC5B;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,WAAW;AAAA,cACX,cAAc;AAAA,cACd,SAAS;AAAA,YACX;AAAA,YAEC;AAAA,6BAAe,SAAS,KACvB,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,QAAQ;AAAA,oBACR,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP,YAAY,MAAM;AAAA,kBACpB;AAAA;AAAA,cACF;AAAA,cAGD,eAAe,IAAI,CAAC,WAAW;AAC9B,sBAAM,MAAM,cAAc,MAAM;AAChC,sBAAM,WAAW,QAAQ;AACzB,sBAAM,UAAU,UAAU,IAAI,GAAG;AACjC,sBAAM,WAAW,YAAY,UAAU,gBAAgB;AACvD,uBACE,gBAAAC,OAAC,aAAQ,WAAU,kBACjB;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAY;AAAA,sBACZ,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,QAAQ;AAAA,wBACR,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,YAAY;AAAA,wBACZ,WAAW,WACP,aAAa,MAAM,UAAU,GAAG,CAAC,aAAa,MAAM,UAAU,GAAG,CAAC,KAClE;AAAA,sBACN;AAAA;AAAA,kBACF;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,UAAU,OAAO;AAAA,sBACjB,OAAO;AAAA,wBACL,OAAO,MAAM;AAAA,wBACb,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,YAAY;AAAA,wBACZ,oBAAoB;AAAA,sBACtB;AAAA,sBAEC,+BAAqB,OAAO,UAAU,gBAAgB;AAAA;AAAA,kBACzD;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,OAAO;AAAA,sBACd,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,UAAU;AAAA,wBACV,OAAO,MAAM;AAAA,wBACb,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,YAAY;AAAA,wBACZ,cAAc;AAAA,wBACd,YAAY;AAAA,sBACd;AAAA,sBAEC,iBAAO;AAAA;AAAA,kBACV;AAAA,qBAzCuC,GA0CzC;AAAA,cAEJ,CAAC;AAAA;AAAA;AAAA,QACH;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,MAAM;AAAA,cACN,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD,OAAC,UAAM,uBAAa,YAAY,SAAQ;AAAA,cACxC,gBAAAA,OAAC,UAAK,eAAY,QAAO,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,GAAG,oBAEjE;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC/KE,SAWI,OAAAK,QAXJ,QAAAC,cAAA;AARK,IAAMC,aAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA,MACf,KAAK;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,IAEA;AAAA,sBAAAD,OAAC,SAAI,OAAO,EAAE,YAAY,yBAAyB,cAAc,YAAY,aAAa,UAAU,SAAS,GAC3G,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,EAAE,GAAG,sBAAsB,aAAa,QAAQ,IAAI,GAAG,iBAAiB,cAAc;AAAA,UAC9F;AAAA,UACA,WAAS;AAAA,UACT,cAAc,CAAC,UACb,cAAc;AAAA,YACZ,QAAQ,MAAM;AAAA,YACd,MAAM,MAAM;AAAA,YACZ,UAAU;AAAA,UACZ,CAAC;AAAA;AAAA,MAEL,GACF;AAAA,MAEA,gBAAAA,OAAC,SAAI,OAAO,EAAE,YAAY,yBAAyB,cAAc,YAAY,aAAa,UAAU,SAAS,GAC3G,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,UACb,QAAQ,EAAE,GAAG,sBAAsB,aAAa,QAAQ,IAAI,GAAG,iBAAiB,cAAc;AAAA,UAC9F;AAAA,UACA,aAAY;AAAA;AAAA,MACd,GACF;AAAA;AAAA;AACF;;;ACOI,gBAAAG,QAkBE,QAAAC,eAlBF;AAhCC,SAAS,SAAS;AAAA,EACvB;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,GAAU;AACR,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAW;AAAA,QACX,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,YACb;AAAA,YACA,eAAe,YAAY;AAAA,YAC3B,aAAa,YAAY;AAAA;AAAA,QAC3B;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,SAAS;AAAA,cACT,eAAe;AAAA,cACf,KAAK;AAAA,YACP;AAAA,YAEA;AAAA,8BAAAA,QAAC,SAAI,WAAU,uBACb;AAAA,gCAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aASN;AAAA,gBAEF,gBAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,EAAE,GACvB,6BACC,gBAAAA;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,eAAe,SAAS,gBAAgB,YAAY;AAAA,oBACpD,eAAe,SAAS,eAAe;AAAA,oBACvC;AAAA,oBACA;AAAA,oBACA;AAAA;AAAA,gBACF,GAEJ;AAAA,gBAEA,gBAAAF;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,UAAU;AAAA,oBACV,MAAM;AAAA,oBACN;AAAA,oBACA;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cAEA,gBAAAF,QAAC,SAAI,WAAU,sBACb;AAAA,gCAAAD;AAAA,kBAACI;AAAA,kBAAA;AAAA,oBACC,UAAU;AAAA,oBACV,UAAU;AAAA,oBACV;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,SAAS;AAAA,oBACT,aAAa;AAAA,oBACb;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAJ;AAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC7HI,SAUE,OAAAC,QAVF,QAAAC,eAAA;AATG,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT;AAAA,YACA,OAAO,aAAa,YAAY;AAAA;AAAA,QAClC;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,sBAAsB,aAAa,QAAQ,IAAI;AAAA,YACvD,QAAQ,CAAC,KAAK;AAAA,YACd,QAAQ;AAAA,YACR,WAAS;AAAA,YACT;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AlCkDU,gBAAAE,QAkFJ,QAAAC,eAlFI;AAjEV,IAAMC,2BAA0B;AAChC,IAAM,YAAuB,EAAE,MAAM,OAAO;AAErC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAuB,KAAK;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAoB,SAAS;AACrD,QAAM,eAAeC;AAAA,IACnB,MAAM,qBAAqB,MAAM,MAAM;AAAA,IACvC,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,OAAO,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC;AAEzD,QAAM,WAAW,CAAC,oBACf,eAA0C,eAAe,KAC1DF;AAEF,QAAM,WAAW,CAAC,YACf,aAAa,WAAsC,QAAQ,YAAY,KACvE,gBAA2C,QAAQ,YAAY,KAChE,QAAQ;AAEV,QAAM,eAAe,MAAM,QAAQ,SAAS;AAC5C,QAAM,cAAc,CAAC,YACnB,QAAQ,EAAE,MAAM,WAAW,QAAQ,CAAC;AACtC,QAAM,kBAAkB,MAAM,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,QAAM,mBAAmB,CAAC,UACxB,QAAQ,EAAE,MAAM,iBAAiB,MAAM,CAAC;AAE1C,QAAM,uBAAuB,CAAC,iBAA+B;AAC3D,gBAAY,YAAY;AACxB,iBAAa;AAAA,EACf;AAEA,QAAM,qBAAqB,CAAC,UAAkB;AAC5C,mBAAe,KAAK;AACpB,iBAAa;AAAA,EACf;AAEA,QAAM,YAA2B;AAAA,IAC/B,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,YAAY,YAAY;AAAA,IACxB,OAAO,aAAa,YAAY,cAAc;AAAA,IAC9C,YAAY,YAAY;AAAA,EAC1B;AAEA,QAAM,WAAW,MAAM;AACrB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eACE,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,KAAK;AAAA,YACd,UAAU,KAAK;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe,SAAS,KAAK,QAAQ,YAAY;AAAA,YACjD,eAAe,SAAS,KAAK,OAAO;AAAA,YACpC;AAAA,YACA,QAAQ;AAAA,YACR,UAAU;AAAA,YACV;AAAA;AAAA,QACF;AAAA,MAGJ,KAAK;AACH,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,eAAe;AAAA,YACf;AAAA;AAAA,QACF;AAAA,MAGJ,KAAK;AACH,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAGJ,KAAK;AACH,YAAI,KAAK,aAAa,KAAK,SAAS,WAAW,GAAG;AAChD,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,SAAS;AAAA,cACX;AAAA,cAEA,0BAAAA,OAAC,eAAY;AAAA;AAAA,UACf;AAAA,QAEJ;AAEA,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,iBAAiB,KAAK;AAAA,YACtB,iBAAiB,KAAK;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa,KAAK;AAAA,YAClB,eAAe,KAAK;AAAA,YACpB,aAAa,KAAK;AAAA,YAClB;AAAA,YACA;AAAA,YACA,iBAAiB;AAAA,YACjB,mBAAmB;AAAA,YACnB,eAAe;AAAA,YACf,YAAY,MAAM,KAAK,KAAK,SAAS;AAAA,YACrC;AAAA,YACA;AAAA;AAAA,QACF;AAAA,IAEN;AAAA,EACF,GAAG;AAEH,SACE,gBAAAA,OAAC,uBAAoB,MACnB,0BAAAC,QAAC,SAAI,OAAO,WACV;AAAA,oBAAAD;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IACC;AAAA,KACH,GACF;AAEJ;;;AmC1LA,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAC7B,IAAM,0BAA0B;AAChC,IAAM,yBAAyB;AAG/B,IAAM,0BAA0B;AAChC,IAAMC,cACJ;AACF,IAAMC,kBAAiB;AAEvB,SAAS,eACP,OACA,UACS;AACT,SAAO,SAAS;AAClB;AAEA,SAAS,cACP,OACA,UACQ;AACR,SAAO,OAAO,KAAK,IAAI,QAAQ;AACjC;AAEA,SAASC,mBACP,OACA,YACkB;AAClB,MAAI,UAAU,WAAW,UAAU,OAAQ,QAAO;AAClD,SAAO,QAAQ,UAAU,IAAI,UAAU;AACzC;AAEO,SAAS,mBAAmB,QAAqB;AACtD,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AACA,QAAM,eAAe,QAAQ,cAAc,IACvC,IAAI,gBAAgB,WAAW,IAAI,IACnC,IAAI,gBAAgB,WAAW,IAAI;AACvC,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP;AAAA,EACF;AACA,QAAM,SAAS,aAAa,cAAc;AAC1C,QAAM,SAAS,aAAa,cAAc;AAE1C,QAAM,cAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,aAAa,MAAM,QAAQ,GAAG,CAAC;AAAA,IACjC;AAAA,IACA,aAAa;AAAA,MACX;AAAA,QACE,OAAO;AAAA,QACP,OAAO,gBAAgB;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,IACA,eAAe,cAAc,OAAO,wBAAwB,MAAM;AAAA,IAClE,cAAc,cAAc,OAAO,qBAAqBD,eAAc;AAAA,IACtE,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM,QAAQ,GAAG;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,MACP,MAAM,QAAQ,IAAI;AAAA,IACpB;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,MACP,OAAO,mBAAmB;AAAA,IAC5B;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,OAAO,eAAeD;AAAA,IACxB;AAAA,IACA,cAAcA;AAAA,IACd,YAAYE;AAAA,MACV,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,0BAA0B;AAAA,MACxB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,yBAAyB;AAAA,MACvB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,wBAAwB;AAAA,MACtB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,qBAAqB;AAAA,MACnB,OAAO;AAAA,MACP,cAAc,OAAO,sBAAsB,OAAO,gBAAgB,MAAM;AAAA,IAC1E;AAAA,IACA,oBAAoB;AAAA,MAClB,OAAO;AAAA,MACP,cAAc,OAAO,qBAAqB,aAAa,MAAM,QAAQ,IAAI,CAAC,EAAE;AAAA,IAC9E;AAAA,IACA,yBAAyB;AAAA,MACvB,OAAO;AAAA,MACP;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB,eAAe,OAAO,4BAA4B,IAAI;AAAA,EAC1E;AAEA,SAAO;AAAA,IACL,WAAW,eAAe,OAAO,uBAAuB,IAAI;AAAA,IAC5D,iBAAiB,eAAe,OAAO,2BAA2B,IAAI;AAAA,IACtE,UAAU,eAAe,OAAO,mBAAmB,IAAI;AAAA,IACvD,gBAAgB,eAAe,OAAO,yBAAyB,IAAI;AAAA,IACnE,mBAAmB;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,QACL,OAAO;AAAA,QACP,wBAAwB;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,wBAAwB;AAAA,MAC1B;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,wBAAwB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,OAAO;AAAA,QACP,wBAAwB;AAAA,MAC1B;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,wBAAwB;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,wBAAwB;AAAA,MAC1B;AAAA,MACA,OAAO,wBAAwB;AAAA,IACjC;AAAA,IACA;AAAA,EACF;AACF;;;ApC1IQ,gBAAAC,cAAA;AAVD,SAAS,MAAM,EAAE,QAAQ,MAAM,IAAI,GAAuB;AAC/D,QAAM,SAAS,mBAAmB,MAAM;AAExC,EAAAC,YAAU,MAAM;AACd,mBAAe,OAAO,uBAAuB,kBAAkB;AAAA,EACjE,GAAG,CAAC,OAAO,mBAAmB,CAAC;AAE/B,SACE,gBAAAD,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,QAAO,MAAY,SAAO,MAC5D,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,MACjB,GAAG;AAAA,MACJ;AAAA;AAAA,EACF,GACF,GACF;AAEJ;;;AqCXU,gBAAAE,cAAA;AARH,SAAS,YAAY,EAAE,QAAQ,MAAM,cAAc,GAAU;AAClE,QAAM,eAAe,qBAAqB,OAAO,MAAM,MAAM;AAC7D,QAAM,UAAU,OAAO,wBAAwB;AAE/C,SACE,gBAAAA,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,eAAc,MAAY,SAAO,MACnE,0BAAAA,OAAC,uBAAoB,MAAM,OAAO,MAAM,SACtC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF,GACF;AAEJ;;;AC9BA,SAAS,aAAAC,mBAAiB;;;ACF1B,SAAa,eAAAC,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACE7D,IAAMC,OAAM;AAGZ,eAAsB,YACpB,OACA,MACwB;AACxB,MAAI;AACF,UAAM,WAAW,MAAM,MAAMA,MAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,IACtC,CAAC;AACD,UAAM,SAAkB,MAAM,SAAS,KAAK;AAE5C,QAAI,CAAC,SAAS,MAAM,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClE,QAAI,WAAW,OAAQ,OAAM,IAAI,MAAM,OAAO,OAAO,KAAK,CAAC;AAE3D,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,sBAAsB,KAAK;AACzC,WAAO;AAAA,EACT;AACF;;;ACzBA,SAAS,aAAAC,aAAW,YAAAC,kBAAgB;;;ACQpC,IAAM,aAAa,oBAAI,IAAwB;AAExC,SAAS,eAAe,KAAa,QAAgC;AAC1E,aAAW,IAAI,KAAK,MAAM;AAC1B,SAAO,MAAM;AACX,QAAI,WAAW,IAAI,GAAG,MAAM,OAAQ,YAAW,OAAO,GAAG;AAAA,EAC3D;AACF;AAEO,SAAS,UAAU,KAAqC;AAC7D,SAAO,WAAW,IAAI,GAAG;AAC3B;AAEO,SAAS,cAAc,OAAqC;AACjE,SAAO;AAAA,IACL,aAAa,CAAC,YAAY;AACxB,UAAI,YAAY,OAAW,OAAM,cAAc;AAC/C,aAAO,MAAM;AAAA,IACf;AAAA,IACA,UAAU,MAAM,MAAM;AAAA,IACtB,IAAI,CAAC,OAAO,YAAY,MAAM,iBAAiB,OAAO,OAAO;AAAA,IAC7D,KAAK,CAAC,OAAO,YAAY,MAAM,oBAAoB,OAAO,OAAO;AAAA,IACjE,MAAM,MAAM,MAAM,KAAK;AAAA,EACzB;AACF;;;AD7BA,IAAM,UAAU;AAIT,SAAS,oBAAoB,YAGlC;AACA,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,CAAC;AAE1C,EAAAC,YAAU,MAAM;AACd,mBAAe,CAAC;AAChB,gBAAY,CAAC;AACb,QAAI,CAAC,WAAY;AAEjB,QAAI;AACJ,UAAM,eAAe,MAAM;AACzB,UAAI,CAAC,OAAQ;AACb,qBAAe,OAAO,YAAY,CAAC;AACnC,YAAM,IAAI,OAAO,SAAS;AAC1B,UAAI,OAAO,SAAS,CAAC,EAAG,aAAY,CAAC;AAAA,IACvC;AAEA,UAAM,OAAO,OAAO,YAAY,MAAM;AACpC,eAAS,UAAU,UAAU;AAC7B,UAAI,CAAC,UAAU,OAAO,OAAO,OAAO,WAAY;AAChD,aAAO,cAAc,IAAI;AACzB,aAAO,GAAG,cAAc,YAAY;AACpC,aAAO,GAAG,kBAAkB,YAAY;AACxC,mBAAa;AAAA,IACf,GAAG,OAAO;AAEV,WAAO,MAAM;AACX,aAAO,cAAc,IAAI;AACzB,cAAQ,IAAI,cAAc,YAAY;AACtC,cAAQ,IAAI,kBAAkB,YAAY;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,SAAO,EAAE,aAAa,SAAS;AACjC;;;AElCE,SAQE,OAAAC,QARF,QAAAC,eAAA;AADK,IAAM,OAAkB,CAAC,EAAE,QAAQ,OAAO,SAAS,MACxD,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,cAAc;AAAA,MACd,SAAS;AAAA,MACT,YAAY,OAAO;AAAA,IACrB;AAAA,IAEA;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,UAAU,OAAO,OAAO;AAAA,YACxB,eAAe;AAAA,YACf,eAAe;AAAA,YACf,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,UACd;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACC;AAAA;AAAA;AACH;AAUK,IAAM,UAAwB,CAAC,EAAE,QAAQ,OAAO,OAAO,WAAW,MACvE,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,KAAK;AAAA,MACL,SAAS;AAAA,MACT,cAAc,OAAO;AAAA,MACrB,UAAU,OAAO,OAAO;AAAA,IAC1B;AAAA,IAEA;AAAA,sBAAAD,OAAC,UAAK,OAAO,EAAE,OAAO,OAAO,SAAS,GAAI,iBAAM;AAAA,MAChD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,oBAAoB;AAAA,YACpB,OAAO,cAAc,OAAO;AAAA,YAC5B,YAAY;AAAA,UACd;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA;AACF;;;ACzBE,gBAAAE,QA+BM,QAAAC,eA/BN;AAtBJ,SAAS,UAAU,OAAuB;AACxC,QAAM,OAAO,oBAAI,KAAK,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI;AAChF,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AACH;AAEA,SAAS,UAAU,OAAuB;AACxC,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,CAAC;AACH;AAEO,IAAM,eAA0B,CAAC,EAAE,QAAQ,SAAS,UAAU,OAAO,MAC1E,gBAAAA,QAAC,SACC;AAAA,kBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,OAKN;AAAA,EACF,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,YAAY,OAAO,OAAO,UAAU,UAAU,KAAK,OAAO,OAAO,UAAU,OAAO,GAAG,sGAGzG;AAAA,EACA,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,KAAK;AAAA,QACL,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAA,QAAC,SAAI,OAAO,EAAE,UAAU,YAAY,aAAa,GAAG,GAClD;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,YAAY,OAAO;AAAA,cACrB;AAAA;AAAA,UACF;AAAA,UACC,QAAQ,IAAI,CAAC,OAAO,UACnB,gBAAAC,QAAC,SAAgC,OAAO,EAAE,UAAU,YAAY,eAAe,GAAG,GAChF;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY,UAAU,IAAI,OAAO,SAAS,OAAO;AAAA,kBACjD,QAAQ,aAAa,UAAU,IAAI,OAAO,SAAS,OAAO,OAAO;AAAA,gBACnE;AAAA;AAAA,YACF;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU,OAAO,OAAO;AAAA,kBACxB,YAAY;AAAA,kBACZ,eAAe;AAAA,kBACf,eAAe;AAAA,kBACf,OAAO,OAAO;AAAA,gBAChB;AAAA,gBAEC,oBAAU,MAAM,eAAe;AAAA;AAAA,YAClC;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY,OAAO;AAAA,kBACnB,UAAU,OAAO,OAAO;AAAA,kBACxB,QAAQ;AAAA,kBACR,OAAO,OAAO;AAAA,gBAChB;AAAA,gBAEC,gBAAM;AAAA;AAAA,YACT;AAAA,YACA,gBAAAA,OAAC,UAAK,OAAO,EAAE,UAAU,KAAK,OAAO,OAAO,OAAO,OAAO,UAAU,YAAY,KAAK,GAClF,gBAAM,aACT;AAAA,eArCQ,MAAM,eAsChB,CACD;AAAA,WACH;AAAA,QAEA,gBAAAC,QAAC,WAAM,WAAU,uBAAsB,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,UAAU,UAAU,KAAK,GAAG,GACnG;AAAA,mBAAS,SAAS,KACjB,gBAAAD,OAAC,QAAK,QAAgB,OAAM,sBACzB,mBAAS,IAAI,CAAC,UACb,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,OACE,gBAAAC,QAAC,UACE;AAAA,sBAAM;AAAA,gBACP,gBAAAA,QAAC,WAAM,OAAO,EAAE,SAAS,SAAS,OAAO,OAAO,SAAS,UAAU,KAAK,OAAO,MAAM,GAClF;AAAA,wBAAM;AAAA,kBAAY;AAAA,kBAAI,UAAU,MAAM,OAAO;AAAA,kBAAE;AAAA,kBAAE,UAAU,MAAM,OAAO;AAAA,kBAAE;AAAA,mBAC7E;AAAA,iBACF;AAAA,cAEF,OAAO,MAAM,cAAc,QAAQ,MAAM,YAAY,MAAM;AAAA;AAAA,YAVtD,GAAG,MAAM,KAAK,IAAI,MAAM,OAAO;AAAA,UAWtC,CACD,GACH;AAAA,UAED,OAAO,SAAS,KACf,gBAAAD,OAAC,QAAK,QAAgB,OAAM,4BACzB,iBAAO,IAAI,CAAC,UACX,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,OACE,gBAAAC,QAAC,UACE;AAAA,sBAAM;AAAA,gBACP,gBAAAA,QAAC,WAAM,OAAO,EAAE,SAAS,SAAS,OAAO,OAAO,SAAS,UAAU,KAAK,OAAO,MAAM,GAAG;AAAA;AAAA,kBAC7E,MAAM;AAAA,kBAAG;AAAA,kBAAI,MAAM;AAAA,mBAC9B;AAAA,iBACF;AAAA,cAEF,OAAO,GAAG,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA;AAAA,YAV3B,MAAM;AAAA,UAWb,CACD,GACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAAA,GACF;;;AC1IA,SAME,OAAAC,QANF,QAAAC,eAAA;AALK,IAAM,eAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,MACE,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,OAAO;AAAA,IACvB;AAAA,IAEA;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,YAAY,OAAO;AAAA,YACnB,UAAU,KAAK,OAAO;AAAA,YACtB,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,OAAO,OAAO;AAAA,UAChB;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACA,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,OAAO,SAAS,UAAU,KAAK,OAAO,MAAM,GACvE,uBACH;AAAA;AAAA;AACF;;;ACHE,gBAAAE,QA8BE,QAAAC,eA9BF;AAxBJ,IAAM,UAA0H;AAAA,EAC9H,EAAE,KAAK,eAAe,OAAO,gBAAgB;AAAA,EAC7C,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,EACjC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC7B,EAAE,KAAK,YAAY,OAAO,WAAW;AACvC;AAEA,SAAS,WAAW,SAAyB;AAC3C,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO,GAAG,KAAK,mBAAmB,SAAS;AAAA,IACzC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,CAAC,CAAC;AACJ;AAEA,IAAM,OAAuE,CAAC;AAAA,EAC5E;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK,QAAQ,SAAS,OAAO,OAAO,OAAO;AAC/E,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU,OAAO,OAAO;AAAA,QACxB,YAAY;AAAA,QACZ;AAAA,QACA,YAAY,QAAQ,SAAS,gBAAgB,GAAG,KAAK;AAAA,QACrD,YAAY;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEO,IAAM,gBAA2B,CAAC,EAAE,QAAQ,SAAS,MAC1D,gBAAAC,QAAC,SACC;AAAA,kBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQN;AAAA,EAEF,gBAAAC,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,YAAY,KAAK,GAAG,UAAU,QAAQ,cAAc,EAAE,GAC/F;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY,OAAO;AAAA,UACnB,UAAU,KAAK,OAAO;AAAA,UACtB,YAAY;AAAA,UACZ,OAAO,OAAO;AAAA,QAChB;AAAA,QAEC;AAAA,mBAAS;AAAA,UAAY;AAAA,UAAI,SAAS;AAAA;AAAA;AAAA,IACrC;AAAA,IACA,gBAAAD,OAAC,UAAK,OAAO,EAAE,UAAU,OAAO,OAAO,OAAO,YAAY,KAAK,OAAO,OAAO,OAAO,GACjF,qBAAW,SAAS,OAAO,GAC9B;AAAA,KACF;AAAA,EACA,gBAAAC,QAAC,OAAE,OAAO,EAAE,QAAQ,YAAY,UAAU,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ,GAAG;AAAA;AAAA,IAC1E,SAAS;AAAA,IAAS;AAAA,IAAa,SAAS;AAAA,IACjD,SAAS,YAAY;AAAA,KACxB;AAAA,EAEA,gBAAAD,OAAC,SAAI,WAAU,qBACb,0BAAAC,QAAC,WAAM,WAAU,gBACf;AAAA,oBAAAD,OAAC,WACC,0BAAAA,OAAC,QACE,WAAC,yBAAoB,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,oBAAoB,EAAE,IAAI,CAAC,MAC/E,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,UACT,UAAU,OAAO,OAAO;AAAA,UACxB,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,eAAe;AAAA,UACf,OAAO,OAAO;AAAA,UACd,YAAY,OAAO;AAAA,UACnB,cAAc,OAAO;AAAA,UACrB,YAAY;AAAA,QACd;AAAA,QAEC;AAAA;AAAA,MAdI;AAAA,IAeP,CACD,GACH,GACF;AAAA,IACA,gBAAAA,OAAC,WACE,mBAAS,KAAK,IAAI,CAAC,QAClB,gBAAAC,QAAC,QACC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,UAAU,KAAK,OAAO;AAAA,YACtB,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,cAAc,OAAO;AAAA,YACrB,YAAY;AAAA,UACd;AAAA,UAEC,cAAI;AAAA;AAAA,MACP;AAAA,MACC,QAAQ,IAAI,CAAC,MACZ,gBAAAA,OAAC,QAAe,OAAO,EAAE,SAAS,aAAa,cAAc,OAAO,WAAW,GAC7E,0BAAAA,OAAC,QAAK,QAAgB,OAAO,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,KAD7D,EAAE,GAEX,CACD;AAAA,MACD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,UAAU,KAAK,OAAO;AAAA,YACtB,OAAO,OAAO;AAAA,YACd,cAAc,OAAO;AAAA,UACvB;AAAA,UAEC,cAAI;AAAA;AAAA,MACP;AAAA,SA3BO,IAAI,OA4Bb,CACD,GACH;AAAA,KACF,GACF;AAAA,EAEA,gBAAAA,OAAC,SAAI,WAAU,wBACZ,mBAAS,KAAK,IAAI,CAAC,QAClB,gBAAAC;AAAA,IAAC;AAAA;AAAA,MAEC,OAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY,OAAO;AAAA,MACrB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY,OAAO;AAAA,cACnB,UAAU,OAAO,OAAO;AAAA,cACxB,OAAO,OAAO;AAAA,YAChB;AAAA,YAEC,cAAI;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,YAAY,cAAc,GAAG,GAChF,kBAAQ,IAAI,CAAC,MACZ,gBAAAC,QAAC,SAAgB,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACtE;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU,OAAO,OAAO;AAAA,gBACxB,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf,OAAO,OAAO;AAAA,cAChB;AAAA,cAEC,YAAE;AAAA;AAAA,UACL;AAAA,UACA,gBAAAA,OAAC,QAAK,QAAgB,OAAO,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK;AAAA,aAZ5D,EAAE,GAaZ,CACD,GACH;AAAA,QACA,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK,OAAO,OAAO,OAAO,OAAO,UAAU,YAAY,KAAK,GAC1F,cAAI,OACP;AAAA;AAAA;AAAA,IAvCK,IAAI;AAAA,EAwCX,CACD,GACH;AAAA,EAEA,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,QAAQ,OAAO;AAAA,QACf,YAAY,aAAa,OAAO,MAAM;AAAA,QACtC,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY,OAAO;AAAA,MACrB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY,OAAO;AAAA,cACnB,UAAU,OAAO,OAAO;AAAA,cACxB,OAAO,OAAO;AAAA,YAChB;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA,OAAC,UAAK,OAAO,EAAE,UAAU,KAAK,OAAO,OAAO,OAAO,OAAO,UAAU,YAAY,IAAI,GACjF,mBAAS,MACZ;AAAA;AAAA;AAAA,EACF;AAAA,GACF;;;AC3MA,gBAAAE,QAqCM,QAAAC,eArCN;AADF,IAAM,iBAAoE,CAAC,EAAE,QAAQ,SAAS,MAC5F,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU,OAAO,OAAO;AAAA,MACxB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,OAAO,OAAO;AAAA,IAChB;AAAA,IAEC;AAAA;AACH;AAGF,IAAM,eAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEO,IAAM,iBAA4B,CAAC,EAAE,QAAQ,UAAU,UAAU,MAAM;AAC5E,MAAI,SAAS,WAAW,KAAK,UAAU,WAAW,GAAG;AACnD,WACE,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,OAAO,SAAS,UAAU,KAAK,OAAO,MAAM,GAAG,mDAE7E;AAAA,EAEJ;AAEA,SACE,gBAAAC,QAAC,SACC;AAAA,oBAAAD,OAAC,OAAE,OAAO,EAAE,QAAQ,YAAY,OAAO,OAAO,UAAU,UAAU,KAAK,OAAO,OAAO,UAAU,OAAO,GAAG,2IAGzG;AAAA,IAEC,UAAU,SAAS,KAClB,gBAAAC,QAAC,SAAI,OAAO,EAAE,cAAc,GAAG,GAC7B;AAAA,sBAAAD,OAAC,kBAAe,QAAgB,uDAAoC;AAAA,MACpE,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,GACpC,oBAAU,IAAI,CAAC,aACd,gBAAAA,OAAC,iBAAgE,QAAgB,YAA7D,GAAG,SAAS,WAAW,IAAI,SAAS,KAAK,EAAwC,CACtG,GACH;AAAA,OACF;AAAA,IAGD,SAAS,SAAS,KAAK,gBAAAA,OAAC,kBAAe,QAAgB,oCAAsB;AAAA,IAC9E,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,GACpC,mBAAS,IAAI,CAAC,YAAY;AACzB,YAAM,UAAU,QAAQ,WAAW;AACnC,YAAM,QAAQ,QAAQ,WAAW,YAAY,OAAO,KAAK,QAAQ,WAAW,YAAY,OAAO,OAAO,OAAO;AAC7G,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,YACL,QAAQ,OAAO;AAAA,YACf,cAAc;AAAA,YACd,SAAS;AAAA,YACT,YAAY,OAAO;AAAA,UACrB;AAAA,UAEA;AAAA,4BAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,cAAc,EAAE,GAC5E;AAAA,8BAAAD,OAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,KAAK,OAAO,OAAO,YAAY,KAAK,YAAY,OAAO,eAAe,OAAO,OAAO,IAAI,GACvH,kBAAQ,QACX;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU,OAAO,OAAO;AAAA,oBACxB,YAAY;AAAA,oBACZ,eAAe;AAAA,oBACf,eAAe;AAAA,oBACf;AAAA,oBACA,YAAY,UAAU,gBAAgB,GAAG,KAAK;AAAA,oBAC9C,cAAc;AAAA,oBACd,SAAS;AAAA,kBACX;AAAA,kBAEC,uBAAa,QAAQ,MAAM;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA,YACA,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,OAAO,OAAO,OAAO,OAAO,OAAO,UAAU,YAAY,IAAI,GAC3F,kBAAQ,MACX;AAAA;AAAA;AAAA,QA7BK,QAAQ;AAAA,MA8Bf;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;;;ACvGA,SAAa,aAAAE,aAAW,UAAAC,gBAAc;AA4ClC,gBAAAC,cAAA;AAxCJ,IAAM,YAAY;AAEX,IAAM,YAAqC,CAAC,EAAE,QAAQ,MAAM;AACjE,QAAM,MAAMC,SAAyB,IAAI;AAEzC,EAAAC,YAAU,MAAM;AACd,UAAM,QAAQ,IAAI;AAClB,QAAI,CAAC,MAAO;AAEZ,UAAM,aAAa,eAAe,SAAS,cAAc,KAAK,CAAC;AAC/D,UAAM,MAAM,GAAG,SAAS,IAAI,OAAO;AACnC,QAAI,WAAuB;AAC3B,QAAI,YAAY;AAEhB,UAAM,aAAa,MAAM;AACvB,YAAM,MAAM;AAAA,IACd;AAEA,QAAI,MAAM,YAAY,+BAA+B,GAAG;AACtD,iBAAW;AAAA,IACb,OAAO;AACL,aAAO,oBAAQ,EACZ,KAAK,CAAC,EAAE,SAAS,QAAQ,MAAM;AAC9B,YAAI,UAAW;AACf,YAAI,CAAC,QAAQ,YAAY,EAAG,QAAO,WAAW;AAC9C,mBAAW,IAAI,QAAQ,EAAE,sBAAsB,KAAK,CAAC;AACrD,iBAAS,WAAW,GAAG;AACvB,iBAAS,YAAY,KAAK;AAAA,MAC5B,CAAC,EACA,MAAM,UAAU;AAAA,IACrB;AAEA,WAAO,MAAM;AACX,kBAAY;AACZ,gBAAU,QAAQ;AAClB,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,UAAQ;AAAA,MACR,aAAW;AAAA,MACX,QAAQ,GAAG,SAAS,IAAI,OAAO;AAAA,MAC/B,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,OAAO,QAAQ,QAAQ,QAAQ,YAAY,OAAO;AAAA;AAAA,EAC7F;AAEJ;;;AClDO,SAAS,UAAU,YAA2B,SAAuB;AAC1E,QAAM,SAAS,UAAU,cAAc,EAAE;AACzC,UAAQ,YAAY,OAAO;AAG3B,OAAK,QAAQ,KAAK,GAAG,QAAQ,MAAM;AAAA,EAAC,CAAC;AACvC;AAEO,SAAS,gBAAgB,SAAyB;AACvD,QAAM,IAAI,KAAK,MAAM,UAAU,EAAE;AACjC,QAAM,IAAI,KAAK,MAAM,UAAU,EAAE;AACjC,SAAO,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC9C;;;ACsBU,gBAAAG,QAsBA,QAAAC,eAtBA;AAvBH,IAAM,cAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,UAAa,WAAW,CAAC;AAE7E,SACE,gBAAAA,QAAC,SACC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa;AAAA,UACb,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ,OAAO;AAAA,QACjB;AAAA,QAEC,uBACC,gBAAAA,OAAC,aAAU,SAAS,YAAY,IAEhC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,OAAO;AAAA,cACP,UAAU,KAAK,OAAO;AAAA,cACtB,WAAW;AAAA,cACX,SAAS;AAAA,YACX;AAAA,YACD;AAAA;AAAA,QAED;AAAA;AAAA,IAEJ;AAAA,IAEC,WAAW,KACV,gBAAAC,QAAC,SAAI,OAAO,EAAE,WAAW,GAAG,GAC1B;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,YAAY,OAAO;AAAA,UACrB;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,OAAO,GAAG,KAAK,IAAI,KAAM,cAAc,WAAY,GAAG,CAAC;AAAA,kBACvD,YAAY,OAAO;AAAA,kBACnB,cAAc;AAAA,kBACd,YAAY;AAAA,gBACd;AAAA;AAAA,YACF;AAAA,YACC,MAAM,IAAI,CAAC,YACV,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM,UAAU,YAAY,QAAQ,QAAkB;AAAA,gBAC/D,OAAO,QAAQ;AAAA,gBACf,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM,GAAK,QAAQ,WAAsB,WAAY,GAAG;AAAA,kBACxD,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,YAAY;AAAA,kBACZ,WAAW,aAAa,OAAO,MAAM;AAAA,gBACvC;AAAA;AAAA,cAfK,QAAQ;AAAA,YAgBf,CACD;AAAA,YACD,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM,GAAG,KAAK,IAAI,KAAM,cAAc,WAAY,GAAG,CAAC;AAAA,kBACtD,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,QAAQ,aAAa,OAAO,MAAM;AAAA,kBAClC,WAAW;AAAA,kBACX,eAAe;AAAA,gBACjB;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,KAAK;AAAA,YACL,WAAW;AAAA,YACX,UAAU,OAAO,OAAO;AAAA,YACxB,OAAO,OAAO;AAAA,YACd,oBAAoB;AAAA,UACtB;AAAA,UAEA;AAAA,4BAAAD,OAAC,UAAM,0BAAgB,WAAW,GAAE;AAAA,YACpC,gBAAAA,OAAC,UAAK,OAAO,EAAE,WAAW,SAAS,GAAG,gEAEtC;AAAA,YACA,gBAAAA,OAAC,UAAM,0BAAgB,QAAQ,GAAE;AAAA;AAAA;AAAA,MACnC;AAAA,OACF;AAAA,KAEJ;AAEJ;;;ACrIA,SAAa,aAAAE,aAAW,UAAAC,gBAAc;;;ACGtC,IAAM,yBAAyB;AAExB,SAAS,kBACd,UACA,aACQ;AACR,MAAI,SAAS;AACb,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,aAAa,UAAa,QAAQ,WAAW,cAAc,uBAAwB;AAC/F,aAAS,QAAQ;AAAA,EACnB;AACA,SAAO;AACT;AAIO,SAAS,WACd,UACA,UACA,UACQ;AACR,QAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,MAAS;AAC7D,QAAM,QAAQ,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AACtD,MAAI,UAAU,GAAI,QAAO;AACzB,SAAO,MAAM,QAAQ,CAAC,GAAG,YAAY;AACvC;;;ADaM,gBAAAC,QAwFU,QAAAC,eAxFV;AA1BN,IAAM,aAA0C;AAAA,EAC9C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,IAAM,cAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,kBAAkB,UAAU,WAAW;AACzD,QAAM,YAAYC,SAA0B,IAAI;AAIhD,EAAAC,YAAU,MAAM;AACd,cAAU,SAAS,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU,CAAC;AAAA,EAC5E,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,gBAAAF,QAAC,SACC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU,OAAO,OAAO;AAAA,UACxB,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,eAAe;AAAA,UACf,OAAO,OAAO;AAAA,UACd,QAAQ;AAAA,QACV;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IACC,SAAS,IAAI,CAAC,YAAY;AACzB,YAAM,SAAS,QAAQ,OAAO;AAC9B,YAAM,YAAY,QAAQ,OAAO,aAAa,QAAQ,aAAa;AACnE,YAAM,MAAM,YAAY,WAAW,UAAU,QAAQ,IAAI,QAAQ,IAAI;AACrE,YAAM,OAAO,OAAO,QAAQ,YAAY;AACxC,YAAM,WAAW,aAAa,OAAO,IACjC,KAAK,IAAI,MAAO,cAAe,QAAQ,YAAuB,OAAQ,GAAG,IACzE;AAEJ,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,KAAK,SAAS,YAAY;AAAA,UAC1B,MAAK;AAAA,UACL,SAAS,MAAM;AACb,qBAAS,QAAQ,EAAE;AACnB,gBAAI,QAAQ,aAAa,OAAW,WAAU,YAAY,QAAQ,QAAQ;AAAA,UAC5E;AAAA,UACA,OAAO,QAAQ,aAAa,SAAY,oCAAoC;AAAA,UAC5E,OAAO;AAAA,YACL,UAAU;AAAA,YACV,UAAU;AAAA,YACV,SAAS;AAAA,YACT,KAAK;AAAA,YACL,OAAO;AAAA,YACP,WAAW;AAAA,YACX,SAAS;AAAA,YACT,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,YAAY,SAAS,OAAO,iBAAiB;AAAA,YAC7C,QAAQ,aAAa,SAAS,OAAO,SAAS,aAAa;AAAA,YAC3D,WAAW,SAAS,aAAa,OAAO,UAAU,KAAK;AAAA,YACvD,YACE;AAAA,UACJ;AAAA,UAEC;AAAA,yBACC,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,OAAO,GAAG,QAAQ;AAAA,kBAClB,YAAY,OAAO;AAAA,kBACnB,YAAY;AAAA,gBACd;AAAA;AAAA,YACF;AAAA,YAEF,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,UAAU,OAAO,OAAO;AAAA,kBACxB,YAAY;AAAA,kBACZ,eAAe;AAAA,kBACf,eAAe;AAAA,kBACf,OAAO,SAAS,OAAO,SAAS,OAAO;AAAA,kBACvC,YAAY;AAAA,kBACZ,YAAY;AAAA,gBACd;AAAA,gBAEA;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW;AAAA,sBACX,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,SAAS,SAAS,IAAI;AAAA,wBACtB,OAAO,SAAS,SAAS;AAAA,wBACzB,UAAU;AAAA,wBACV,YAAY;AAAA,sBACd;AAAA,sBAEA,0BAAAC,QAAC,SAAI,OAAM,UAAS,QAAO,UAAS,SAAQ,aAC1C;AAAA,wCAAAD,OAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,gBAAe;AAAA,wBACnD,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,GAAE;AAAA,4BACF,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,aAAa;AAAA,4BACb,gBAAe;AAAA;AAAA,wBACjB;AAAA,yBACF;AAAA;AAAA,kBACF;AAAA,kBACC,QAAQ,aAAa,SAClB,gBAAgB,QAAQ,QAAQ,IAChC,WAAW,QAAQ,IAAI;AAAA;AAAA;AAAA,YAC7B;AAAA,YACA,gBAAAC,QAAC,UAAK,OAAO,EAAE,UAAU,KAAK,OAAO,OAAO,YAAY,KAAK,YAAY,MAAM,OAAO,OAAO,IAAI,GAC9F;AAAA,sBAAQ;AAAA,cACR,QAAQ,OACP,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,OAAO,OAAO;AAAA,oBACd,UAAU,KAAK,OAAO;AAAA,oBACtB,WAAW;AAAA,oBACX,YAAY;AAAA,kBACd;AAAA,kBAEC,kBAAQ;AAAA;AAAA,cACX;AAAA,eAEJ;AAAA;AAAA;AAAA,QAhGK,QAAQ;AAAA,MAiGf;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;;;AEtKA,SAAa,YAAAI,kBAAgB;;;ACGtB,IAAM,gBAAgB,CAAC,SAAS,SAAS,OAAO;;;ADqDjD,gBAAAC,QAqBA,QAAAC,eArBA;AAhDN,IAAM,YAAY;AAClB,IAAM,kBAAkB;AAExB,SAAS,QAAQ,GAAyB;AACxC,MAAI,EAAE,UAAU,SAAS;AACvB,WAAO,GAAG,eAAe,aAAa,mBAAmB,EAAE,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,EAClF;AAIA,SAAO,GAAG,eAAe,UAAU,mBAAmB,EAAE,MAAM,CAAC;AACjE;AAKA,SAAS,kBAAkB,SAAyC;AAClE,QAAM,UAAU,cAAc,IAAI,CAAC,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,CAAC;AACrF,QAAM,SAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,OAAO,SAAS,WAAW,KAAK;AAC9C,UAAM,SAAS,OAAO;AACtB,eAAW,SAAS,SAAS;AAC3B,UAAI,OAAO,UAAU,UAAW;AAChC,UAAI,MAAM,CAAC,EAAG,QAAO,KAAK,MAAM,CAAC,CAAC;AAAA,IACpC;AACA,QAAI,OAAO,WAAW,OAAQ;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAAwB;AAC3C,QAAM,QAAQ,WAAW,MAAM;AAC/B,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,IAAM,aAA+D,CAAC,EAAE,QAAQ,EAAE,MAAM;AACtF,QAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,QAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,OAAO;AAEvE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ,CAAC;AAAA,YACd,KAAI;AAAA,YACJ,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OAAO,EAAE,cAAc,IAAI,YAAY,EAAE;AAAA;AAAA,QAC3C;AAAA,QACA,gBAAAA,OAAC,UAAK,OAAO,EAAE,UAAU,KAAK,OAAO,OAAO,YAAY,KAAK,OAAO,OAAO,KAAK,YAAY,SAAS,GAClG,YAAE,QACL;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU,KAAK,OAAO;AAAA,cACtB,YAAY;AAAA,cACZ,OAAO,OAAO;AAAA,cACd,oBAAoB;AAAA,cACpB,YAAY;AAAA,YACd;AAAA,YAEC,YAAE;AAAA;AAAA,QACL;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU,OAAO,OAAO;AAAA,cACxB,YAAY;AAAA,cACZ;AAAA,cACA,oBAAoB;AAAA,cACpB,YAAY;AAAA,YACd;AAAA,YAEC;AAAA,sBAAQ,IAAI,MAAM;AAAA,cAClB,EAAE;AAAA;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,IAAM,cAAyB,CAAC,EAAE,QAAQ,QAAQ,MAAM;AAC7D,QAAM,QAAQ,kBAAkB,OAAO;AACvC,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACE,gBAAAA,QAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GACjC;AAAA,oBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUN;AAAA,IACF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,cAAc,OAAO;AAAA,UACrB,YAAY,OAAO;AAAA,UACnB,WAAW;AAAA,QACb;AAAA,QAEC,gBAAM,IAAI,CAAC,GAAG,MACb,gBAAAC,QAACC,YAAA,EACE;AAAA,cAAI,KACH,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,cACX,WAAU;AAAA,cACV,OAAO,EAAE,WAAW,WAAW,YAAY,OAAO,YAAY,YAAY,EAAE;AAAA;AAAA,UAC9E;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,SAAS;AAAA,cACX;AAAA,cAEA,0BAAAA,OAAC,cAAW,QAAgB,GAAM;AAAA;AAAA,UACpC;AAAA,aAnBa,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM,EAoBrC,CACD;AAAA;AAAA,IACH;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,OAAO;AAAA,UACP,eAAe;AAAA,UACf,YAAY,0CAA0C,OAAO,cAAc;AAAA,QAC7E;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AE7II,gBAAAG,QAwBM,QAAAC,eAxBN;AAFG,IAAM,WAAsB,CAAC,EAAE,QAAQ,MAAM,UAAU,SAAS,MACrE,gBAAAA,QAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GACjC;AAAA,kBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAON;AAAA,EACF,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,OAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW,OAAO;AAAA,QAClB,cAAc,OAAO;AAAA,QACrB,YAAY,OAAO;AAAA,QACnB,WAAW;AAAA,MACb;AAAA,MAEC,eAAK,IAAI,CAAC,QAAQ;AACjB,cAAM,SAAS,IAAI,OAAO;AAC1B,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,SAAS,IAAI,EAAE;AAAA,YAC9B,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc,aAAa,SAAS,OAAO,SAAS,aAAa;AAAA,cACjE,SAAS;AAAA,cACT,YAAY,OAAO;AAAA,cACnB,UAAU,OAAO,OAAO;AAAA,cACxB,YAAY;AAAA,cACZ,OAAO,SAAS,OAAO,SAAS,OAAO;AAAA,cACvC,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEC;AAAA,kBAAI;AAAA,cACJ,OAAO,IAAI,UAAU,YACpB,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,YAAY,OAAO;AAAA,oBACnB,cAAc;AAAA,oBACd,SAAS;AAAA,oBACT,UAAU,KAAK,OAAO;AAAA,oBACtB,OAAO,OAAO;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBAEC,cAAI;AAAA;AAAA,cACP;AAAA;AAAA;AAAA,UAnCG,IAAI;AAAA,QAqCX;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAAA,EAGA,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,QACP,eAAe;AAAA,QACf,YAAY,0CAA0C,OAAO,aAAa;AAAA,MAC5E;AAAA;AAAA,EACF;AAAA,GACF;;;AClGF,SAAa,mBAAAE,kBAAiB,UAAAC,UAAQ,YAAAC,kBAAgB;AACtD,SAAS,YAAY,iBAAiB,MAAM,MAAM,QAAQ,aAAa;AAuE/D,qBAAAC,YACE,OAAAC,QADF,QAAAC,eAAA;AAxDD,IAAM,cAAyB,CAAC,EAAE,QAAQ,OAAO,cAAc,aAAa,MAAM;AACvF,QAAM,MAAMJ,SAAuB,IAAI;AACvC,QAAM,CAAC,KAAK,MAAM,IAAIC,WAAS,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,MAAM,CAAC;AAE7D,EAAAF,iBAAgB,MAAM;AACpB,QAAI,CAAC,SAAS,CAAC,IAAI,SAAS;AAC1B,aAAO,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,MAAM,EAAE;AACxC;AAAA,IACF;AACA,UAAM,WAAW,IAAI;AACrB,WAAO,WAAW,MAAM,QAAQ,UAAU,MAAM;AAC9C,sBAAgB,MAAM,QAAQ,UAAU;AAAA,QACtC,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC;AAAA,MAChE,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,eAAe,MAAM;AACpC,eAAO,EAAE,GAAG,GAAG,SAAS,CAAC,eAAe,MAAM,gBAAgB,CAAC;AAAA,MACjE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GAAG,CAAC,KAAK,CAAC;AAEV,EAAAA,iBAAgB,MAAM;AACpB,QAAI,CAAC,MAAO;AACZ,UAAM,gBAAgB,CAAC,MAAoB;AACzC,YAAM,SAAS,EAAE;AACjB,UAAI,IAAI,SAAS,SAAS,MAAM,KAAK,MAAM,OAAO,SAAS,MAAM,EAAG;AACpE,qBAAe;AAAA,IACjB;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,WAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,EACxE,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,IAAI;AAAA,QACV,KAAK,IAAI;AAAA,QACT,YAAY,SAAS,IAAI,UAAU,YAAY;AAAA,QAC/C,eAAe,SAAS,IAAI,UAAU,SAAS;AAAA,QAC/C,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU,KAAK,OAAO;AAAA,QACtB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MAEC,mBACC,gBAAAC,QAAAF,YAAA,EACE;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,WAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU,OAAO,OAAO;AAAA,cACxB,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,eAAe;AAAA,cACf,cAAc;AAAA,YAChB;AAAA,YAEC,gBAAM,KAAK,WAAW,UAAU,wBAAwB;AAAA;AAAA,QAC3D;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY,OAAO;AAAA,cACnB,UAAU,KAAK,OAAO;AAAA,cACtB,cAAc;AAAA,YAChB;AAAA,YAEC,gBAAM,KAAK;AAAA;AAAA,QACd;AAAA,QACC,MAAM,KAAK;AAAA,SACd;AAAA;AAAA,EAEJ;AAEJ;;;ACtCM,gBAAAE,QAiBI,QAAAC,eAjBJ;AApDN,IAAM,WAA+E;AAAA,EACnF,WAAW,EAAE,OAAO,aAAa,KAAK,WAAW,MAAM,6BAA6B;AAAA,EACpF,OAAO,EAAE,OAAO,SAAS,KAAK,WAAW,MAAM,6FAA6F;AAAA,EAC5I,iBAAiB,EAAE,OAAO,iBAAiB,KAAK,WAAW,MAAM,wEAAwE;AAAA,EACzI,QAAQ,EAAE,OAAO,UAAU,KAAK,WAAW,MAAM,oCAAoC;AAAA,EACrF,MAAM,EAAE,OAAO,QAAQ,KAAK,WAAW,MAAM,0DAA0D;AAAA,EACvG,IAAI,EAAE,OAAO,cAAc,KAAK,WAAW,MAAM,2BAA2B;AAAA,EAC5E,aAAa,EAAE,OAAO,eAAe,KAAK,WAAW,MAAM,+CAA+C;AAAA,EAC1G,SAAS,EAAE,OAAO,WAAW,KAAK,WAAW,MAAM,2CAA2C;AAAA,EAC9F,YAAY,EAAE,OAAO,cAAc,KAAK,WAAW,MAAM,+BAA+B;AAC1F;AAEA,IAAM,WAAW,EAAE,OAAO,YAAY,KAAK,IAAI,MAAM,iCAAiC;AAEtF,SAAS,WAAW,MAAkB,QAAyB;AAC7D,QAAM,OAAO,KAAK,WACd,SAAS,KAAK,QAAQ,IACtB,EAAE,GAAG,UAAU,OAAO,KAAK,WAAW,UAAU,qBAAqB,SAAS,MAAM;AACxF,QAAM,MAAM,KAAK,OAAO,OAAO;AAE/B,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,KAAK,QAAQ,OAAO,cAAc,IAAI,MAAM,IAAI,KAAK,WAAW,IAAI;AAAA,EACtE;AACF;AAEA,IAAM,eAAgE,CAAC,EAAE,KAAK,MAAM,KAAK,MACvF,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC,eAAW;AAAA,IACX,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc,OAAO;AAAA,MACrB,YAAY,MAAM,KAAK,IAAI;AAAA,MAC3B,OAAO;AAAA,IACT;AAAA,IAEA,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAc;AAAA,QACd,gBAAe;AAAA,QAEf,0BAAAA,OAAC,UAAK,GAAG,MAAM;AAAA;AAAA,IACjB;AAAA;AACF;AAGF,IAAM,QAAyE,CAAC;AAAA,EAC9E;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,OAAO,KAAK,KAAK,IAAI,WAAW,MAAM,MAAM;AACpD,QAAM,OAAO,KAAK,OAAO;AACzB,SACE,gBAAAC,QAAC,SAAI,OAAO,EAAE,YAAY,IAAI,eAAe,GAAG,GAC9C;AAAA,oBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,GACrC;AAAA,sBAAAD,OAAC,gBAAa,KAAU,MAAY,MAAM,MAAM;AAAA,MAChD,gBAAAC,QAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,YACP;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY,OAAO;AAAA,oBACnB,UAAU,KAAK,OAAO;AAAA,oBACtB,YAAY;AAAA,oBACZ,eAAe;AAAA,oBACf,YAAY;AAAA,oBACZ,OAAO,OAAO;AAAA,kBAChB;AAAA,kBAEC,eAAK;AAAA;AAAA,cACR;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAU,KAAK,OAAO;AAAA,oBACtB,YAAY;AAAA,oBACZ,eAAe;AAAA,oBACf,eAAe;AAAA,oBACf,OAAO;AAAA,oBACP,YAAY;AAAA,kBACd;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QAEC,KAAK,QACJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,UAAU,KAAK,OAAO;AAAA,cACtB,OAAO,MAAM,OAAO,KAAK,GAAG;AAAA,YAC9B;AAAA,YAEC,eAAK;AAAA;AAAA,QACR;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU,KAAK,OAAO;AAAA,UACtB,YAAY;AAAA,UACZ,OAAO,OAAO;AAAA,QAChB;AAAA,QAEC,eAAK;AAAA;AAAA,IACR;AAAA,IAEC,KAAK,YACJ,gBAAAC,QAAC,SAAI,OAAO,EAAE,WAAW,IAAI,WAAW,aAAa,IAAI,IAAI,YAAY,GAAG,GAC1E;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU,OAAO,OAAO;AAAA,YACxB,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,eAAe;AAAA,YACf,OAAO,MAAM,OAAO,KAAK,IAAI;AAAA,YAC7B,cAAc;AAAA,UAChB;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,YAAY,aAAa,GAAG;AAAA,YAC5B,UAAU,KAAK,OAAO;AAAA,YACtB,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,UAChB;AAAA,UAEC,eAAK;AAAA;AAAA,MACR;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEO,IAAM,aAAwB,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC1D,QAAM,OAAO,MAAM,OAAO,KAAK,IAAI;AAEnC,SACE,gBAAAC,QAAC,SACC;AAAA,oBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKN;AAAA,IAEF,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA,UACL,UAAU;AAAA,UACV,eAAe;AAAA,QACjB;AAAA,QAEA;AAAA,0BAAAA,QAAC,SACC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,YAAY,OAAO;AAAA,kBACnB,UAAU,KAAK,OAAO;AAAA,kBACtB,YAAY;AAAA,kBACZ,eAAe;AAAA,kBACf,OAAO,OAAO;AAAA,gBAChB;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,WAAW,UAAU,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ,GAAG,8FAErF;AAAA,aACF;AAAA,UACA,gBAAAC,QAAC,SAAI,OAAO,EAAE,WAAW,SAAS,UAAU,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,GACrF;AAAA,4BAAAD,OAAC,SAAI,OAAO,EAAE,eAAe,UAAU,eAAe,YAAY,GAAG,mBAAK;AAAA,YAC1E,gBAAAA,OAAC,SAAI,OAAO,EAAE,oBAAoB,eAAe,GAAI,gBAAM,QAAO;AAAA,aACpE;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,WAAW,aAAa,IAAI;AAAA,QAC9B;AAAA,QAEC,gBAAM,IAAI,CAAC,MAAM,MAChB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO;AAAA,cACL,cAAc,aAAa,IAAI;AAAA,cAC/B,YAAY,IAAI,MAAM,IAAI,aAAa,IAAI,KAAK;AAAA,cAChD,aAAa,IAAI,MAAM,IAAI,KAAK;AAAA,cAChC,cAAc,IAAI,MAAM,IAAI,KAAK;AAAA,YACnC;AAAA,YAEA,0BAAAA,OAAC,SAAM,QAAgB,MAAY,MAAY;AAAA;AAAA,UAR1C,KAAK;AAAA,QASZ,CACD;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;;;ACxNM,gBAAAE,QAuCQ,QAAAC,eAvCR;AAjBN,SAASC,aAAY,QAAwB;AAC3C,QAAM,QAAQ,WAAW,MAAM;AAC/B,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEO,IAAM,qBAAgC,CAAC,EAAE,QAAQ,OAAO,QAAQ,MAAM;AAC3E,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY,OAAO;AAAA,MACrB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,UAAU,OAAO,OAAO;AAAA,cACxB,eAAe;AAAA,cACf,eAAe;AAAA,cACf,OAAO,OAAO;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACC,QAAQ,IAAI,CAAC,GAAG,MAAM;AACrB,gBAAM,QAAQE,aAAY,EAAE,MAAM;AAClC,gBAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,OAAO;AACvE,iBACE,gBAAAD;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc,MAAM,QAAQ,SAAS,IAAI,IAAI,OAAO;AAAA,gBACpD,UAAU,OAAO,OAAO;AAAA,cAC1B;AAAA,cAEA;AAAA,gCAAAD,OAAC,UAAK,OAAO,EAAE,OAAO,OAAO,SAAS,GAAI,YAAE,QAAO;AAAA,gBACnD,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,KAAK;AAAA,sBACL,YAAY;AAAA,sBACZ;AAAA,sBACA,oBAAoB;AAAA,sBACpB,YAAY;AAAA,oBACd;AAAA,oBAEA;AAAA,sCAAAD,OAAC,UAAM,YAAE,OAAM;AAAA,sBACf,gBAAAC,QAAC,UACE;AAAA,gCAAQ,IAAI,MAAM;AAAA,wBAClB,EAAE;AAAA,yBACL;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,YA1BK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM;AAAA,UA2B7B;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;ACxEA,IAAM,SAAS,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AAE9D,SAAS,eAAe,OAAoC;AACjE,QAAM,SAAS,MACZ,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EAC3B,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAClC,IAAI,MAAM;AACb,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,IAAI,OAAO,OAAO,OAAO,KAAK,GAAG,CAAC,QAAQ,IAAI;AACvD;AAEO,SAAS,eACd,MACA,OACA,YACa;AACb,MAAI,CAAC,MAAO,QAAO,CAAC,IAAI;AAGxB,SAAO,KACJ,MAAM,KAAK,EACX,IAAI,CAAC,MAAM,MAAO,IAAI,MAAM,IAAI,WAAW,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAK;AAC7E;;;ACkBM,gBAAAE,QA2DQ,QAAAC,eA3DR;AArBC,IAAM,kBAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC;AAEpE,QAAM,cAAc,CAAC,UAAkB,CAAC,UAAuC;AAC7E,UAAM,OAAO,QAAQ,IAAI,MAAM,YAAY,CAAC;AAC5C,QAAI,CAAC,KAAM;AACX,kBAAc,EAAE,MAAM,QAAQ,MAAM,cAAc,CAAC;AAAA,EACrD;AAEA,SACE,gBAAAA,QAAC,SACC;AAAA,oBAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKN;AAAA,IACF,gBAAAA,OAAC,OAAE,OAAO,EAAE,QAAQ,YAAY,OAAO,OAAO,UAAU,UAAU,KAAK,OAAO,OAAO,UAAU,OAAO,GAAG,4JAGzG;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAEF;AAAA,0BAAAD,OAAC,SACE,mBAAS,IAAI,CAAC,YAAY;AACzB,kBAAM,SAAS,QAAQ,OAAO;AAC9B,mBACE,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,KAAK;AAAA,kBACL,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,YAAY,SAAS,OAAO,aAAa;AAAA,kBACzC,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA,0BAAQ,aAAa,SACpB,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,UAAU,YAAY,QAAQ,QAAkB;AAAA,sBAC/D,OAAM;AAAA,sBACN,OAAO;AAAA,wBACL,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,YAAY;AAAA,wBACZ,SAAS;AAAA,wBACT,WAAW;AAAA,wBACX,QAAQ;AAAA,wBACR,MAAM;AAAA,wBACN,UAAU,KAAK,OAAO;AAAA,wBACtB,YAAY;AAAA,wBACZ,OAAO,OAAO;AAAA,wBACd,oBAAoB;AAAA,wBACpB,YAAY;AAAA,sBACd;AAAA,sBAEC,0BAAgB,QAAQ,QAAQ;AAAA;AAAA,kBACnC,IAEA,gBAAAA,OAAC,UAAK,OAAO,EAAE,MAAM,WAAW,GAAG;AAAA,kBAErC,gBAAAC,QAAC,SAAI,OAAO,EAAE,UAAU,EAAE,GACxB;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,UAAU,OAAO,OAAO;AAAA,0BACxB,YAAY;AAAA,0BACZ,eAAe;AAAA,0BACf,eAAe;AAAA,0BACf,OAAO,OAAO;AAAA,0BACd,cAAc;AAAA,wBAChB;AAAA,wBAEC,kBAAQ;AAAA;AAAA,oBACX;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,QAAQ;AAAA,0BACR,UAAU,KAAK,OAAO;AAAA,0BACtB,YAAY;AAAA,0BACZ,OAAO,OAAO;AAAA,wBAChB;AAAA,wBAEC,yBAAe,QAAQ,QAAQ,OAAO,CAAC,OAAO,QAC7C,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BAEC,cAAc,YAAY,KAAK;AAAA,4BAC/B,cAAc;AAAA,4BACd,SAAS,YAAY,KAAK;AAAA,4BAC1B,OAAO;AAAA,8BACL,cAAc,gBAAgB,OAAO,MAAM;AAAA,8BAC3C,OAAO,OAAO;AAAA,8BACd,YAAY;AAAA,8BACZ,QAAQ;AAAA,4BACV;AAAA,4BAEC;AAAA;AAAA,0BAXI;AAAA,wBAYP,CACD;AAAA;AAAA,oBACH;AAAA,qBACF;AAAA;AAAA;AAAA,cA1EK,QAAQ;AAAA,YA2Ef;AAAA,UAEJ,CAAC,GACH;AAAA,UAEE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,UAAU,UAAU,KAAK,GAAG;AAAA,cAE/D;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,OAAM;AAAA,oBACN,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO;AAAA;AAAA,gBACpD;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,OAAM;AAAA,oBACN,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO;AAAA;AAAA,gBACpD;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AClIA,IAAM,WAA+D;AAAA,EACnE,EAAE,QAAQ,SAAS,IAAI,8DAA8D;AAAA,EACrF,EAAE,QAAQ,aAAa,IAAI,4EAA4E;AAAA,EACvG,EAAE,QAAQ,QAAQ,IAAI,4DAA4D;AAAA,EAClF,EAAE,QAAQ,WAAW,IAAI,mDAAmD;AAAA,EAC5E,EAAE,QAAQ,UAAU,IAAI,kIAAkI;AAC5J;AAEA,IAAM,WAAW;AAEjB,IAAM,KAAK,CAAC,WAAmB,EAAE,OAAO,KAAK,KAAc;AAC3D,IAAM,OAAO,CAAC,WAAmB,EAAE,OAAO,KAAK,OAAgB;AAC/D,IAAM,OAAO,CAAC,WAAmB,EAAE,OAAO,KAAK,OAAgB;AAK/D,IAAM,SAA4D;AAAA,EAChE,WAAW;AAAA,IACT,aAAa,KAAK,MAAM;AAAA,IACxB,QAAQ,GAAG,IAAI;AAAA,IACf,MAAM,KAAK,MAAM;AAAA,IACjB,UAAU,KAAK,MAAM;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,aAAa,KAAK,MAAM;AAAA,IACxB,QAAQ,GAAG,IAAI;AAAA,IACf,MAAM,KAAK,MAAM;AAAA,IACjB,UAAU,GAAG,IAAI;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,aAAa,KAAK,MAAM;AAAA,IACxB,QAAQ,GAAG,IAAI;AAAA,IACf,MAAM,KAAK,MAAM;AAAA,IACjB,UAAU,KAAK,MAAM;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,aAAa,KAAK,MAAM;AAAA,IACxB,QAAQ,GAAG,IAAI;AAAA,IACf,MAAM,KAAK,MAAM;AAAA,IACjB,UAAU,KAAK,MAAM;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,aAAa,KAAK,MAAM;AAAA,IACxB,QAAQ,GAAG,IAAI;AAAA,IACf,MAAM,KAAK,MAAM;AAAA,IACjB,UAAU,GAAG,IAAI;AAAA,IACjB,OAAO;AAAA,EACT;AACF;AAEA,IAAM,OAA0D;AAAA,EAC9D,WAAW;AAAA,IACT,aAAa,GAAG,MAAM;AAAA,IACtB,QAAQ,KAAK,MAAM;AAAA,IACnB,MAAM,GAAG,IAAI;AAAA,IACb,UAAU,GAAG,IAAI;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,aAAa,GAAG,MAAM;AAAA,IACtB,QAAQ,KAAK,MAAM;AAAA,IACnB,MAAM,GAAG,IAAI;AAAA,IACb,UAAU,KAAK,MAAM;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,aAAa,GAAG,MAAM;AAAA,IACtB,QAAQ,KAAK,MAAM;AAAA,IACnB,MAAM,GAAG,IAAI;AAAA,IACb,UAAU,KAAK,MAAM;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,aAAa,GAAG,MAAM;AAAA,IACtB,QAAQ,KAAK,MAAM;AAAA,IACnB,MAAM,GAAG,IAAI;AAAA,IACb,UAAU,GAAG,IAAI;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,aAAa,GAAG,MAAM;AAAA,IACtB,QAAQ,KAAK,MAAM;AAAA,IACnB,MAAM,GAAG,IAAI;AAAA,IACb,UAAU,KAAK,MAAM;AAAA,IACrB,OAAO;AAAA,EACT;AACF;AAEA,IAAM,SAAuC;AAAA,EAC3C,aAAa,KAAK,WAAW;AAAA,EAC7B,QAAQ,KAAK,MAAM;AAAA,EACnB,MAAM,KAAK,MAAM;AAAA,EACjB,UAAU,KAAK,MAAM;AAAA,EACrB,OAAO;AACT;AAEA,IAAM,QAAqC;AAAA,EACzC,WACE;AAAA,EACF,QACE;AAAA,EACF,MACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AACJ;AAEO,SAAS,cAAc,OAAmC;AAC/D,SAAO,SAAS,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,UAAU;AAC3D;AAEA,SAAS,UAAU,QAAqB,UAAkC;AACxE,QAAM,SAAS,WAAW,KAAK,MAAM,IAAI,OAAO,MAAM;AACtD,QAAM,OAAO,WAAW,OAAO,MAAM,IAAI,KAAK,MAAM;AACpD,SAAO;AAAA,IACL,EAAE,SAAS,wBAAwB,GAAG,OAAO;AAAA,IAC7C,EAAE,SAAS,yBAAyB,GAAG,OAAO;AAAA,IAC9C,EAAE,SAAS,uBAAuB,GAAG,KAAK;AAAA,EAC5C;AACF;AAEA,IAAM,WAAW,CAAC,MAAc,CAAC,CAAC,KAAK,EAAE,KAAK,MAAM,MAAM,CAAC,OAAO,KAAK,EAAE,KAAK,CAAC;AAExE,SAAS,oBAAoB,QAAuB,QAAQ,GAAoB;AACrF,QAAM,YAA6B,CAAC;AAEpC,aAAW,SAAS,QAAQ;AAC1B,QAAI,UAAU,UAAU,MAAO;AAC/B,UAAM,SAAS,cAAc,MAAM,KAAK;AAGxC,QAAI,CAAC,UAAU,CAAC,SAAS,MAAM,SAAS,EAAG;AAC3C,UAAM,WAAW,SAAS,KAAK,MAAM,KAAK;AAC1C,cAAU,KAAK;AAAA,MACb,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,MAAM,MAAM,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACnLA,SAAS,eAAe,eAA8C;AACpE,QAAM,QAAQ,cAAc,YAAY;AACxC,MAAI,8BAA8B,KAAK,KAAK,EAAG,QAAO;AACtD,MAAI,4BAA4B,KAAK,KAAK,EAAG,QAAO;AACpD,SAAO;AACT;AAEA,IAAM,cAAqD;AAAA,EACzD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEA,SAAS,UAAU,QAAgB,SAAwC;AACzE,QAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AACrD,QAAM,QAAQ,QAAQ,WAAW,MAAM,KAAK,IAAI;AAChD,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,SAAS,UAAU,QAAgB,OAAe,QAAsB,QAAuC;AAC7G,MAAI,SAAS,OAAO,IAAI;AACtB,WAAO,GAAG,MAAM,uCAAuC,OAAO,EAAE,SAAS,YAAY,MAAM,CAAC,4BAA4B,OAAO,EAAE;AAAA,EACnI;AACA,MAAI,SAAS,OAAO,IAAI;AACtB,WAAO,GAAG,MAAM,oCAAoC,OAAO,EAAE,SAAS,YAAY,MAAM,CAAC,4BAA4B,OAAO,EAAE;AAAA,EAChI;AACA,SAAO,GAAG,MAAM,gCAAgC,OAAO,EAAE,qBAAqB,OAAO,EAAE,UAAU,YAAY,MAAM,CAAC,mBAAmB,OAAO,EAAE,yBAAyB,OAAO,EAAE,mBAAmB,OAAO,EAAE,yBAAyB,OAAO,EAAE;AAClP;AAEO,SAAS,kBACd,UACA,QACA,SACe;AACf,QAAM,WAA0B,CAAC;AAEjC,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,OAAQ;AAC7B,UAAM,SAAS,QAAQ;AACvB,UAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AAC5D,UAAM,QAAQ,UAAU,QAAQ,OAAO;AACvC,QAAI,CAAC,iBAAiB,UAAU,KAAM;AAEtC,UAAM,SAAS,eAAe,cAAc,aAAa;AACzD,aAAS,KAAK;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA,MAAM,UAAU,QAAQ,OAAO,eAAe,MAAM;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AvB6BsB,gBAAAE,QAsDhB,QAAAC,eAtDgB;AAlEtB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAKhB,IAAM,oBAA+B,CAAC,EAAE,QAAQ,WAAW,KAAK,MAAM;AAC3E,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAwB,IAAI;AACxD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAC3C,QAAM,CAAC,KAAK,MAAM,IAAIA,WAAgB,YAAY;AAClD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,EAAE;AACrD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAA8B,IAAI;AAChE,QAAM,YAAYC,SAA6C,IAAI;AACnE,QAAM,eAAeA,SAAuB,IAAI;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAID,WAA6B,MAAS;AAEhF,QAAM,aAAaE,aAAY,MAAM;AACnC,QAAI,UAAU,YAAY,MAAM;AAC9B,mBAAa,UAAU,OAAO;AAC9B,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,CAAC,UAAwB;AACvD,eAAW;AACX,eAAW,KAAK;AAAA,EAClB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,eAAeA,aAAY,MAAM;AACrC,eAAW;AACX,cAAU,UAAU,WAAW,MAAM;AACnC,gBAAU,UAAU;AACpB,iBAAW,IAAI;AAAA,IACjB,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,UAAU,CAAC;AAEf,EAAAC,YAAU,MAAM,YAAY,CAAC,UAAU,CAAC;AACxC,QAAM,EAAE,aAAa,SAAS,IAAI,oBAAoB,QAAQ,cAAc,IAAI;AAOhF,EAAAA,YAAU,MAAM;AACd,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,IAAI,eAAe,CAAC,CAAC,KAAK,MAAM;AACzC,UAAI,OAAO,aAAa,IAAK,kBAAiB,MAAM,YAAY,MAAM;AAAA,IACxE,CAAC;AACD,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,eAAW,IAAI;AACf,gBAAY,WAAW,IAAI,EAAE,KAAK,CAAC,WAAW;AAC5C,UAAI,UAAW;AACf,gBAAU,MAAM;AAChB,iBAAW,KAAK;AAAA,IAClB,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,IAAI,CAAC;AAEpB,MAAI,QAAS,QAAO,gBAAAC,OAAC,OAAE,OAAO,EAAE,SAAS,IAAI,OAAO,OAAO,QAAQ,GAAG,2BAAQ;AAC9E,MAAI,CAAC,QAAQ;AACX,WACE,gBAAAA,OAAC,OAAE,OAAO,EAAE,SAAS,IAAI,OAAO,OAAO,QAAQ,GAAG,uCAElD;AAAA,EAEJ;AAEA,QAAM,eAAe,kBAAkB,OAAO,UAAU,OAAO,QAAQ,OAAO,OAAO;AACrF,QAAM,YAAY,oBAAoB,OAAO,QAAQ;AAErD,QAAM,OAAkB;AAAA,IACtB,EAAE,IAAI,cAAc,OAAO,iBAAiB,OAAO,OAAO,SAAS,OAAO;AAAA,IAC1E,EAAE,IAAI,SAAS,OAAO,aAAa,OAAO,OAAO,MAAM,OAAO;AAAA,IAC9D,EAAE,IAAI,eAAe,OAAO,kBAAkB,OAAO,UAAU,SAAS,aAAa,OAAO;AAAA,IAC5F,EAAE,IAAI,WAAW,OAAO,iBAAiB;AAAA,EAC3C;AAKA,QAAM,gBAAgB,kBAAkB,OAAO,UAAU,WAAW,KAAK;AAEzE,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY,OAAO;AAAA,QACnB,QAAQ,OAAO;AAAA,QACf,cAAc;AAAA,QACd,UAAU;AAAA;AAAA;AAAA;AAAA,QAIV,YAAY;AAAA,QACZ,OAAO;AAAA;AAAA;AAAA,QAGP,UAAU,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR,YAAY,OAAO;AAAA,QACnB,OAAO,OAAO;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAD,OAAC,WAAO,0BAAe;AAAA,QAEvB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU,OAAO;AAAA,YACjB,aAAa,OAAO;AAAA;AAAA,QACtB;AAAA,QAEA,gBAAAA,OAAC,eAAY,QAAgB,SAAS,OAAO,SAAS;AAAA,QAEtD,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,SAAS,QAAQ,qBAAqB,wBAAwB,YAAY,QAAQ;AAAA,YAE3F;AAAA,8BAAAD,OAAC,SAAI,KAAK,cAAc,OAAO,EAAE,SAAS,kBAAkB,UAAU,EAAE,GACtE,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,YAAY,OAAO;AAAA,kBACnB,UAAU,OAAO;AAAA,kBACjB;AAAA,kBACA;AAAA;AAAA,cACF,GACF;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,YAAY,OAAO;AAAA,oBACnB,YAAY,OAAO;AAAA,oBACnB,WAAW;AAAA,oBACX,WAAW,gBAAgB,SAAS;AAAA,kBACtC;AAAA,kBAEA,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO;AAAA,wBACL,WAAW;AAAA,wBACX,SAAS;AAAA,sBACX;AAAA,sBAEA,0BAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC;AAAA,0BACA,UAAU,OAAO;AAAA,0BACjB,UAAU;AAAA,0BACV,YAAY,OAAO;AAAA,0BACnB;AAAA,0BACA;AAAA,0BACA,UAAU,CAAC,OAAO;AAChB,6CAAiB,EAAE;AACnB,mCAAO,YAAY;AAAA,0BACrB;AAAA;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,UAAU,CAAC,OAAO,OAAO,EAAW;AAAA;AAAA,QACtC;AAAA,QAEA,gBAAAC,QAAC,SAAI,WAAU,eAAc,OAAO,EAAE,SAAS,GAAG,GAC/C;AAAA,kBAAQ,gBACP,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,UAAU,OAAO;AAAA,cACjB,OAAO,OAAO;AAAA,cACd,SAAS,OAAO;AAAA,cAChB,UAAU;AAAA,cACV,YAAY,OAAO;AAAA,cACnB,eAAe;AAAA,cACf,eAAe;AAAA;AAAA,UACjB;AAAA,UAED,QAAQ,WAAW,gBAAAA,OAAC,cAAW,QAAgB,OAAO,OAAO,OAAO;AAAA,UACpE,QAAQ,iBAAiB,gBAAAA,OAAC,kBAAe,QAAgB,UAAU,cAAc,WAAsB;AAAA,UACvG,QAAQ,aACP,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,SAAS,OAAO;AAAA,cAChB,UAAU,OAAO;AAAA,cACjB,QAAQ,OAAO;AAAA;AAAA,UACjB;AAAA,WAEJ;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,cAAc;AAAA,YACd,cAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAEJ;;;AwBhOA,IAAME,QACJ;AACF,IAAM,UAAU;AAIhB,IAAM,eAAe;AAErB,IAAM,MAAM,CAAC,GAA8B,MACzC,KAAK,EAAE,SAAS,IAAI,IAAI;AAE1B,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,iBAAiB;AAEhB,SAAS,cAAc,QAAsC;AAClE,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP,OAAO,mBAAmB;AAAA,EAC5B;AACA,QAAM,QAAQ,QAAQ,cAAc;AACpC,QAAM,MAAM,IAAI,OAAO,4BAA4B,aAAa,cAAc,CAAC;AAC/E,QAAM,iBAAiB;AAAA,IACrB,OAAO;AAAA,IACP,QACI,IAAI,gBAAgB,WAAW,IAAI,IACnC,IAAI,gBAAgB,WAAW,IAAI;AAAA,EACzC;AACA,QAAM,SAAS;AAAA,IACb,OAAO;AAAA,IACP,IAAI,OAAO,uBAAuB,cAAc;AAAA,EAClD;AACA,QAAM,cAAc,OAAO;AAC3B,QAAM,WAAW,IAAI,OAAO,2BAA2B,IAAI,OAAO,aAAaA,KAAI,CAAC;AACpF,QAAM,cAAc,OAAO,gCAAgC,OAAO;AAClE,QAAM,WAAW,WAAW,IAAI,OAAO,2BAA2B,EAAE,CAAC;AAErE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,MACP,QACI,IAAI,gBAAgB,KAAK,IAAI,IAC7B,IAAI,gBAAgB,WAAW,IAAI;AAAA,IACzC;AAAA,IACA,eAAe,IAAI,OAAO,gCAAgC,cAAc;AAAA,IACxE,QAAQ,aAAa,eAAe,MAAM,KAAK,IAAI,CAAC;AAAA,IACpD,YAAY,aAAa,eAAe,MAAM,KAAK,IAAI,CAAC;AAAA,IACxD;AAAA,IACA,UAAU,IAAI,OAAO,kCAAkC,MAAM,KAAK,IAAI,CAAC;AAAA,IACvE,SAAS,IAAI,OAAO,kCAAkC,MAAM,KAAK,IAAI,CAAC;AAAA,IACtE;AAAA,IACA,YAAY,IAAI,OAAO,6BAA6B,MAAM,QAAQ,IAAI,CAAC;AAAA,IACvE,IAAI,IAAI,OAAO,0BAA0B,UAAU;AAAA,IACnD,MAAM,IAAI,OAAO,4BAA4B,YAAY;AAAA,IACzD,SAAS;AAAA,MACP,IAAI,OAAO,yBAAyB,IAAI,OAAO,cAAc,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,IACA,YAAY;AAAA,IACZ,eAAe,cAAc,GAAG,WAAW,KAAK,OAAO,KAAK;AAAA,IAC5D,UAAU,OAAO,SAAS,QAAQ,KAAK,WAAW,IAAI,WAAW;AAAA,IACjE,QACG,WAAW,IAAI,OAAO,gBAAgB,GAAG,YAAY,IAAI,CAAC,KACzD,gBAAgB;AAAA,EACtB;AACF;;;AzBrDQ,gBAAAC,cAAA;AAXD,SAAS,eAAe,EAAE,QAAQ,KAAK,GAAuB;AACnE,QAAM,SAAS,cAAc,MAAM;AAEnC,EAAAC,YAAU,MAAM;AACd,mBAAe,SAAS;AACxB,QAAI,OAAO,YAAa,gBAAe,OAAO,WAAW;AAAA,EAC3D,GAAG,CAAC,OAAO,WAAW,CAAC;AAEvB,SACE,gBAAAD,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,kBAAiB,MACnD,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,MAAM,OAAO;AAAA;AAAA,EACf,GACF,GACF;AAEJ;;;A0B/BA,SAAS,aAAAE,aAAW,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACI/C,gBAAAC,cAAA;AAHC,SAAS,WAAW,EAAE,MAAM,GAA2B;AAC5D,SACE,gBAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,QAAQ,aAAa,SAAS,GACvE,0BAAAA,OAAC,aAAU,SAAS,MAAM,YAAY,GACxC;AAEJ;;;ACCA,eAAsB,iBACpB,OACA,MACA,MAAM,OACuB;AAC7B,QAAM,QAAQ,OAAO,WAAW,eAAe,CAAC,aAAa,WAAW,EAAE,SAAS,OAAO,SAAS,QAAQ;AAC3G,QAAM,MAAM,GAAG,OAAO,QAAQ,0BAA0B,+BAA+B;AACvF,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,IACtC,CAAC;AACD,UAAM,OAAgB,MAAM,SAAS,KAAK;AAC1C,QAAI,CAAC,SAAS,MAAM,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtE,QAAI,EAAE,gBAAgB,SAAS,OAAO,KAAK,eAAe,SAAU,QAAO;AAC3E,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,UAAU;AAAA,MACV,OAAO,WAAW,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACxE,WAAW,eAAe,QAAQ,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,MACxF,aAAa,iBAAiB,QAAQ,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,IAClG;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AFCwF,gBAAAC,QAI/E,QAAAC,eAJ+E;AA1BxF,IAAM,YAAY,CAAC,MAAM,MAAM,IAAI;AASnC,IAAMC,oBAAmB;AAEzB,IAAMC,YAAW;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA;AAAA;AAAA;AAAA,EAIT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,SAAS,YAAyB;AAChC,SAAO,gBAAAH,OAAC,SAAI,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,0BAAAA,OAAC,UAAK,GAAE,6BAA4B,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAAE;AACnN;AAEA,SAAS,YAAyB;AAChC,SAAO,gBAAAC,QAAC,SAAI,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO;AAAA,oBAAAD,OAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,IAAE,gBAAAA,OAAC,YAAO,IAAG,OAAM,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,IAAE,gBAAAA,OAAC,YAAO,IAAG,QAAO,IAAG,QAAO,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,IAAE,gBAAAA,OAAC,UAAK,GAAE,iCAAgC,QAAO,gBAAe,aAAY,OAAM;AAAA,KAAE;AACzY;AAEA,SAAS,QAAqB;AAC5B,SAAO,gBAAAA,OAAC,SAAI,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBAAe,0BAAAA,OAAC,UAAK,GAAE,yHAAwH,GAAE;AAClO;AACA,SAAS,eAA4B;AACnC,SAAO,gBAAAA,OAAC,SAAI,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBAAe,0BAAAA,OAAC,UAAK,GAAE,gKAA+J,GAAE;AACzQ;AACA,SAAS,eAA4B;AACnC,SAAO,gBAAAA,OAAC,SAAI,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBAAe,0BAAAA,OAAC,UAAK,GAAE,kZAAiZ,GAAE;AAC3f;AACA,SAAS,eAA4B;AACnC,SAAO,gBAAAA,OAAC,SAAI,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBAAe,0BAAAA,OAAC,UAAK,GAAE,+NAA8N,GAAE;AACxU;AAEA,IAAM,gBAAgB;AAAA,EACpB,EAAE,MAAM,KAAK,MAAM,OAAO,OAAO,WAAW,UAAU,CAAC,KAAa,UAAkB,wCAAwC,mBAAmB,GAAG,CAAC,SAAS,mBAAmB,KAAK,CAAC,GAAG;AAAA,EAC1L,EAAE,MAAM,YAAY,MAAM,cAAc,OAAO,WAAW,UAAU,CAAC,QAAgB,gDAAgD,mBAAmB,GAAG,CAAC,GAAG;AAAA,EAC/J,EAAE,MAAM,YAAY,MAAM,cAAc,OAAO,WAAW,UAAU,CAAC,KAAa,UAAkB,uBAAuB,mBAAmB,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG;AAAA,EACnK,EAAE,MAAM,YAAY,MAAM,cAAc,OAAO,WAAW,UAAU,CAAC,QAAgB,uDAAuD,mBAAmB,GAAG,CAAC,GAAG;AACxK;AAEA,SAAS,iBAAiB,EAAE,QAAQ,IAAI,GAAuB;AAC7D,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAII,WAA6B,IAAI;AAC3D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAA6B,MAAS;AAChF,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAA6B,MAAS;AACtF,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,KAAK;AAC1D,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAC1C,QAAM,WAAWC,SAAuB,IAAI;AAC5C,QAAM,UAAUA,SAAuB,IAAI;AAC3C,QAAM,IAAI,qBAAqB,OAAO,MAAM,WAAW;AACvD,QAAM,MAAM,UAAU,SAAS,mBAAmB,OAAO,QAAQ,IAAI,CAAC;AACtE,QAAM,UAAU,OAAO,uBAAuB,OAAO,OAAO;AAC5D,QAAM,cAAc,OAAO,2BAA2BF,UAAS;AAC/D,QAAM,WAAW,OAAO,wBAAwBA,UAAS;AAEzD,EAAAG,YAAU,MAAM;AACd,mBAAe,aAAa,CAAC,KAAK,GAAG,CAAC;AACtC,mBAAe,UAAU,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/C,GAAG,CAAC,aAAa,QAAQ,CAAC;AAI1B,EAAAA,YAAU,MAAM;AACd,QAAI,SAAS,SAAU,kBAAiB,SAAS,QAAQ;AAGzD,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,QAAI,IAAI,aAAa,IAAI,MAAM,MAAM,UAAU;AAC7C,UAAI,aAAa,OAAO,MAAM;AAC9B,0BAAoB,IAAI,SAAS,CAAC;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACd,QAAI,SAAS;AACb,SAAK,iBAAiB,OAAO,YAAY,OAAO,MAAM,GAAG,EAAE,KAAK,CAAC,WAAW;AAC1E,UAAI,OAAQ,UAAS,MAAM;AAAA,IAC7B,CAAC;AACD,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,OAAO,MAAM,GAAG,CAAC;AAExC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,eAAgB;AACrB,UAAM,UAAU,CAAC,MAAwB;AACvC,UAAI,SAAS,WAAW,CAAC,SAAS,QAAQ,SAAS,EAAE,MAAc,EAAG,mBAAkB,KAAK;AAAA,IAC/F;AACA,aAAS,iBAAiB,SAAS,OAAO;AAC1C,WAAO,MAAM,SAAS,oBAAoB,SAAS,OAAO;AAAA,EAC5D,GAAG,CAAC,cAAc,CAAC;AAEnB,EAAAA,YAAU,MAAM;AACd,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,MAAM,OAAO,WAAW,eAAe,OAAO,WAAW,OAAQ;AACtE,UAAM,SAAS,MAAY;AACzB,aAAO,OAAO,YAAY,EAAE,QAAQJ,mBAAkB,QAAQ,GAAG,aAAa,GAAG,GAAG;AAAA,IACtF;AACA,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,EAAE;AACb,WAAO;AACP,WAAO,MAAM,GAAG,WAAW;AAAA,EAK7B,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,QAAM,SAASK,UAAQ,MAAM;AAC3B,UAAM,aAAa,OAAO,+BAA+BJ,UAAS;AAClE,UAAM,aAAa,OAAO,0BAA0BA,UAAS;AAC7D,UAAM,WAAW,OAAO,+BAA+B,UACnD,aACA,mBAAmB,OAAO,6BAA6B,QAAQ,KAAK,UAAU,KAAK,UAAU;AACjG,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM,OAAO,yBAAyBA,UAAS;AAAA,MAC/C,OAAO,OAAO,+BAA+BA,UAAS;AAAA,MACtD,QAAQ,OAAO,2BAA2BA,UAAS;AAAA,MACnD,SAAS,OAAO,sBAAsBA,UAAS;AAAA,MAC/C,UAAU,OAAO,wBAAwBA,UAAS;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,YAAY,MAAM;AACpB,WAAO,gBAAAH,OAAC,SAAI,KAAK,SAAU,mBAAS,gBAAAA,OAAC,cAAW,OAAc,GAAG;AAAA,EACnE;AAEA,QAAM,SAAS,OAAO,sBAAsB;AAE5C,QAAM,YAAY,OAAO,0BAA0B,CAAC,OAAO,qBAAqB,WAAW;AAC3F,QAAM,OAAO,OAAO,uBAAuB;AAC3C,QAAM,eAAe,OAAO,oBAAoB,EAAE;AAClD,QAAM,QAAQ,OAAO,2BAA2B,OAAO,aAAa,eAAe;AACnF,QAAM,cAAc,OAAO,0BAA0B,OAAO,eAAe,EAAE;AAC7E,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,WAAW,OAAO,sBAAsB,iBAAiB,WAAW,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAMjI,QAAM,QAAQ,MAAY,kBAAkB,CAAC,SAAS,CAAC,IAAI;AAE3D,QAAM,WAAW,YAA2B;AAC1C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,QAAQ;AAC5C,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IACzC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,QACL,YAAY,OAAO;AAAA,QACnB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,QAKjB,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,KAAK,MAAM,QAAQ;AAAA,UACnB,OAAO;AAAA,YACL,YAAY,OAAO,+BAA+B,UAC9C,OAAO,aACP,uDAAuD,OAAO,MAAM,yCAAyC,OAAO,UAAU;AAAA,YAClI,cAAc,OAAO;AAAA,YACrB,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,SAAS;AAAA,YACT,KAAK;AAAA,YACL,qBAAqB;AAAA,YACrB,UAAU;AAAA,YACV,SAAS;AAAA,UACX;AAAA,UAEA;AAAA,4BAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAeN;AAAA,YACF,gBAAAC,QAAC,SAAI,WAAU,sBAAqB,OAAO,EAAE,WAAW,SAAS,YAAY,UAAU,YAAY,EAAE,GAClG;AAAA,qBAAO,yBAAyB,SAAS,QACxC,gBAAAD,OAAC,SAAI,WAAU,sBAAqB,KAAK,MAAM,KAAK,OAAO,YAAY,OAAO,EAAE,SAAS,SAAS,QAAQ,IAAI,cAAc,IAAI,UAAU,KAAK,WAAW,WAAW,gBAAgB,cAAc,GAAG;AAAA,cAExM,gBAAAA,OAAC,OAAE,OAAO,EAAE,OAAO,OAAO,QAAQ,UAAU,IAAI,YAAY,KAAK,eAAe,UAAU,QAAQ,GAAG,eAAe,YAAY,GAC7H,iBAAO,sBAAsB,EAAE,SAClC;AAAA,cACA,gBAAAA,OAAC,QAAG,OAAO,EAAE,YAAY,aAAa,UAAU,YAAY,6BAA6B,0BAA0B,YAAY,KAAK,eAAe,YAAY,YAAY,MAAM,QAAQ,eAAe,UAAU,KAAK,UAAU,UAAU,GACxO,iBACH;AAAA,cACA,gBAAAA,OAAC,OAAE,OAAO,EAAE,OAAO,OAAO,OAAO,UAAU,IAAI,YAAY,MAAM,QAAQ,YAAY,UAAU,IAAI,GAChG,uBACH;AAAA,cACA,gBAAAC,QAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,YAAY,UAAU,SAAS,QAAQ,UAAU,QAAQ,KAAK,GAAG,GAC9G;AAAA,0BAAU,gBAAAA,QAAC,OAAE,MAAM,QAAQ,QAAQ,WAAW,KAAK,cAAc,WAAW,eAAe,QAAW,OAAO,EAAE,YAAY,UAAU,QAAQ,aAAa,OAAO,MAAM,IAAI,cAAc,KAAK,OAAO,OAAO,QAAQ,QAAQ,WAAW,SAAS,eAAe,UAAU,IAAI,YAAY,KAAK,KAAK,GAAG,SAAS,aAAa,gBAAgB,OAAO,GACjV;AAAA,yBAAO,wBAAwB,EAAE;AAAA,kBAAI,gBAAAD,OAAC,UAAK,OAAO,EAAE,SAAS,eAAe,WAAW,MAAM,eAAe,OAAU,GAAG,0BAAAA,OAAC,aAAU,GAAE;AAAA,mBACzI;AAAA,gBACC,OAAO,0BAA0B,SAChC,gBAAAC,QAAC,SAAI,KAAK,UAAU,OAAO,EAAE,UAAU,WAAW,GAChD;AAAA,kCAAAA,QAAC,YAAO,MAAK,UAAS,SAAS,OAAO,OAAO,EAAE,YAAY,UAAU,YAAY,eAAe,QAAQ,GAAG,OAAO,OAAO,OAAO,QAAQ,WAAW,SAAS,eAAe,MAAM,WAAW,UAAU,IAAI,KAAK,GAAG,SAAS,EAAE,GAC3N;AAAA,oCAAAD,OAAC,aAAU;AAAA,oBAAE;AAAA,oBAAE,OAAO,0BAA0B,EAAE;AAAA,qBACpD;AAAA,kBACC,kBACC,gBAAAC,QAAC,SAAI,WAAU,kBAAiB,OAAO,EAAE,YAAY,UAAU,YAAY,QAAQ,cAAc,IAAI,WAAW,gCAAgC,SAAS,QAAQ,KAAK,IAAI,MAAM,GAAG,SAAS,IAAI,QAAQ,qBAAqB,UAAU,YAAY,QAAQ,GAAG,GAC3P;AAAA,kCAAc,IAAI,CAAC,WAClB,gBAAAD,OAAC,OAAoB,MAAM,OAAO,SAAS,UAAU,KAAK,GAAG,QAAO,UAAS,KAAI,cAAa,OAAO,EAAE,QAAQ,QAAQ,UAAU,OAAO,IAAI,GAAG,WAAU,iBAAgB,OAAO,EAAE,YAAY,UAAU,YAAY,OAAO,OAAO,cAAc,OAAO,OAAO,QAAQ,SAAS,QAAQ,QAAQ,IAAI,gBAAgB,UAAU,gBAAgB,QAAQ,YAAY,wBAAwB,OAAO,GAAG,GACjY,0BAAAA,OAAC,OAAO,MAAP,EAAY,KADP,OAAO,IAEf,CACD;AAAA,oBACD,gBAAAA,OAAC,YAAO,MAAK,UAAS,SAAS,MAAM,KAAK,SAAS,GAAG,OAAO,EAAE,YAAY,eAAe,QAAQ,aAAa,OAAO,MAAM,IAAI,cAAc,KAAK,OAAO,OAAO,QAAQ,QAAQ,WAAW,UAAU,IAAI,YAAY,KAAK,SAAS,YAAY,YAAY,SAAS,GAClQ,mBAAS,EAAE,SAAS,EAAE,UACzB;AAAA,qBACF;AAAA,mBAEJ;AAAA,iBAEJ;AAAA,eACF;AAAA,YACA,gBAAAA,OAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,WAAW,UAAU,aAAa,OAAO,aAAa,UAAU,QAAQ,6BAA6B,OAAO,QAAQ,UAAU,QAAQ,QAAQ,oCAAoC,cAAc,IAAI,UAAU,UAAU,UAAU,WAAW,GACxR,kBAAQ,gBAAAA,OAAC,cAAW,OAAc,IAAK,gBAAAA,OAAC,OAAE,OAAO,EAAE,OAAO,OAAO,MAAM,GAAI,YAAE,SAAQ,GACxF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,UAAU,EAAE,QAAQ,KAAK,KAAK,GAAuB;AACnE,SAAO,gBAAAA,OAAC,mBAAQ,OAAO,QAAQ,0BAAAA,OAAC,oBAAiB,QAAgB,KAAU,MAAY,GAAE;AAC3F;;;AGjRA,SAAS,aAAAQ,aAAW,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACCrD,eAAsB,2BACpB,SACA,QAC2C;AAC3C,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,eAAe,wCAAwC,OAAO;AAAA,IACjE,EAAE,OAAO,YAAY,OAAO;AAAA,EAC9B;AAEA,MAAI,SAAS,WAAW,IAAK,QAAO;AACpC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,2CAA2C,SAAS,MAAM,GAAG;AAAA,EAC/E;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAGlC,MAAI,CAAC,KAAK,gBAAgB;AACxB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO,KAAK;AACd;;;ACrBA,SAASC,WAAU,OAAeC,QAAuB;AACvD,QAAM,IAAI,MAAM,MAAM,mBAAmB;AACzC,MAAI,GAAG;AACL,UAAM,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE;AAC3B,WAAO,QAAS,KAAK,KAAM,GAAG,IAAK,KAAK,IAAK,GAAG,IAAI,IAAI,GAAG,IAAIA,MAAK;AAAA,EACtE;AACA,SAAO;AACT;AAEO,SAAS,kCACd,QAC4B;AAC5B,QAAM,WACJ,OAAO,sCACP,OAAO,sBACP,OAAO,mBACP;AACF,QAAM,gBACJ,OAAO,gDACP,OAAO,mBACP;AACF,QAAM,gBACJ,OAAO,iDACP,OAAO,sCACP;AACF,QAAM,kBACJ,OAAO,mDACP,OAAO,sCACP;AACF,QAAM,UACJ,OAAO,0CACP,OAAO,yCACP;AACF,QAAM,iBACJ,OAAO,kDACP,OAAO,qCACP;AACF,QAAM,eACJ,OAAO,gDACP,OAAO,qCACP;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,OAAO,mCAAmC;AAAA,IACnD,KAAK;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,aAAa;AAAA,QACX,KAAK;AAAA,QACL,MACE,OAAO,kDACP;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,QACb,KAAK;AAAA,QACL,MACE,OAAO,oDACP;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,MACE,OAAO,2CAA2C;AAAA,MACtD;AAAA,MACA,cAAc;AAAA,QACZ,KAAK;AAAA,QACL,MACE,OAAO,mDACP;AAAA,MACJ;AAAA,MACA,YAAY;AAAA,QACV,KAAK;AAAA,QACL,MACE,OAAO,iDAAiD;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,OAAO,OAAO,uCAAuCD,WAAU,UAAU,IAAI;AAAA,IAC7E,QACE,OAAO,wCACP;AAAA,EACJ;AACF;;;ACpFO,IAAM,YAAmF;AAAA,EAC9F,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,MAAM;AAAA,EACN,eAAe;AAAA,EACf,aAAa;AAAA,EACb,SAAS;AACX;AAEO,IAAM,gCAAgC;AACtC,IAAM,gCAAgC;;;ACJzC,gBAAAE,cAAA;AAFG,SAAS,aAAa,EAAE,UAAU,MAAM,GAAU;AACvD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,OAAO,MAAM;AAAA,QACb,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;ACrBA,IAAM,aAAqC;AAAA,EACzC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AACN;AAEO,SAAS,aACd,OACA,UACA,MACQ;AACR,MAAI,UAAU,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACtD,QAAM,aAAa,KAAK,YAAY,EAAE,QAAQ,MAAM,GAAG;AACvD,QAAM,SAAS,WAAW,UAAU,KAAK,cAAc;AACvD,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,QAAQ;AAAA,MACnC,GAAI,WAAW,EAAE,OAAO,YAAY,SAAS,IAAI,CAAC;AAAA,MAClD,uBAAuB;AAAA,IACzB,CAAC,EAAE,OAAO,KAAK;AAAA,EACjB,QAAQ;AACN,WAAO,GAAG,MAAM,eAAe,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC,GACnE,WAAW,IAAI,QAAQ,KAAK,EAC9B;AAAA,EACF;AACF;;;AClCA,SAAS,aAAAC,aAAW,SAAAC,QAAO,YAAAC,kBAAgB;;;ACK3C,IAAM,cAAqD;AAAA,EACzD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,MAAM;AAAA,EACN,eAAe;AAAA,EACf,aAAa;AAAA,EACb,SAAS;AACX;AAEO,SAAS,2BACd,OACA,QACA,OACQ;AACR,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACvC;AAEA,MAAI,OAAO,QAAQ,GAAG;AACpB,UAAM,WACJ,OAAO,YACP,OAAO,MAAM,IACb,OAAO,OAAO,IACd,OAAO,OAAO,IACd,OAAO,aAAa;AACtB,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,OAAO,KAAK,CAAC;AAAA,EACzD;AAEA,SAAO,YAAY,KAAK;AAC1B;AAEO,SAAS,kBAAkB,OAAuB;AACvD,SAAO,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK;AACtD;;;ADwGQ,SAQE,OAAAC,QARF,QAAAC,eAAA;AArIR,SAAS,WAAW,OAAe,QAAgB;AACjD,QAAM,UAAW,QAAQ,KAAK,KAAM;AACpC,SAAO;AAAA,IACL,GAAG,MAAM,SAAS,KAAK,IAAI,OAAO;AAAA,IAClC,GAAG,MAAM,SAAS,KAAK,IAAI,OAAO;AAAA,EACpC;AACF;AAEA,SAAS,QAAQ,YAAoB,UAAkB,QAAgB;AACrE,QAAM,QAAQ,WAAW,YAAY,MAAM;AAC3C,QAAM,MAAM,WAAW,UAAU,MAAM;AACvC,SAAO,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,MAAM,IAAI,MAAM,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9E;AAEA,IAAM,iBAAiB;AAEvB,SAAS,aAAa,GAAW;AAC/B,SAAO,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAC9B;AAEA,SAAS,eAAe,aAAqB;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAS,CAAC;AAC1C,EAAAC,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,aAAa;AACjC,kBAAY,CAAC;AACb;AAAA,IACF;AACA,UAAM,gBAAgB,OAAO;AAAA,MAC3B;AAAA,IACF,EAAE;AACF,QAAI,eAAe;AACjB,kBAAY,CAAC;AACb;AAAA,IACF;AACA,QAAI,MAAM;AACV,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,OAAO,CAAC,QAAgB;AAC5B,YAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,cAAc;AACpD,kBAAY,aAAa,CAAC,CAAC;AAC3B,UAAI,IAAI,EAAG,OAAM,sBAAsB,IAAI;AAAA,IAC7C;AACA,UAAM,sBAAsB,IAAI;AAChC,WAAO,MAAM,qBAAqB,GAAG;AAAA,EACvC,GAAG,CAAC,WAAW,CAAC;AAChB,SAAO,OAAO,cAAc,OAAO;AACrC;AAEA,SAAS,kBAAkB;AACzB,QAAM,CAAC,QAAQ,SAAS,IAAID,WAAS,CAAC;AACtC,EAAAC,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,gBAAgB,OAAO;AAAA,MAC3B;AAAA,IACF,EAAE;AACF,QAAI,cAAe;AACnB,QAAI,MAAM;AACV,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,OAAO,CAAC,QAAgB;AAC5B,YAAM,KAAK,MAAM,SAAS;AAC1B,YAAM,QACJ,KAAK,IAAI,IAAI,GAAG,IAAI,MACpB,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,MAC1B,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI;AAC5B,gBAAU,KAAK;AACf,YAAM,sBAAsB,IAAI;AAAA,IAClC;AACA,UAAM,sBAAsB,IAAI;AAChC,WAAO,MAAM,qBAAqB,GAAG;AAAA,EACvC,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AASO,SAAS,MAAM,EAAE,MAAM,OAAO,cAAc,WAAW,GAAU;AACtE,QAAM,aAAa,mCAAmCC,OAAM,EAAE,QAAQ,MAAM,EAAE,CAAC;AAC/E,QAAM,QAAQ;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,QAAM,cAAc,kBAAkB,KAAK;AAC3C,QAAM,aAAa,eAAe,WAAW;AAC7C,QAAM,SAAS,gBAAgB;AAC/B,QAAM,eAAe,aAAa;AAClC,QAAM,YAAY,WAAW,cAAc,EAAE;AAC7C,QAAM,gBAAiB,eAAe,KAAK,KAAM;AACjD,QAAM,sBAAsB;AAAA,IAC1B,GAAG,KAAK,IAAI,aAAa;AAAA,IACzB,GAAG,KAAK,IAAI,aAAa;AAAA,EAC3B;AACA,QAAM,sBAAsB;AAC5B,QAAM,cACJ,KAAK,mBAAmB,YAAY,SAAS,KAAK;AAEpD,QAAM,WAAW;AAAA,IACf;AAAA,MACE,KAAK;AAAA,MACL,QAAQ,MAAM,QAAQ;AAAA,MACtB,OAAO,aAAa;AAAA,IACtB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ,MAAM,QAAQ;AAAA,MACtB,OAAO,aAAa;AAAA,IACtB;AAAA,IACA,EAAE,KAAK,QAAQ,QAAQ,MAAM,QAAQ,MAAM,OAAO,aAAa,KAAK;AAAA,IACpE;AAAA,MACE,KAAK;AAAA,MACL,QAAQ,MAAM,QAAQ;AAAA,MACtB,OAAO,aAAa;AAAA,IACtB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,QAAQ,MAAM,QAAQ;AAAA,MACtB,OAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAEA,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,aAAa,gBAAgB;AAAA,MACtC,OAAM;AAAA,MACN,MAAK;AAAA,MACL,cAAY,GAAG,aAAa,KAAK,KAAK,aAAa,UAAU,KAAK,cAAc,CAAC,CAAC;AAAA,MAClF,OAAO,EAAE,SAAS,SAAS,UAAU,UAAU;AAAA,MAE/C;AAAA,wBAAAD,OAAC,UACC,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,eAAc;AAAA,YACd,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YAEH;AAAA,8BAAAD,OAAC,UAAK,QAAO,MAAK,WAAW,MAAM,QAAQ,YAAY,KAAK;AAAA,cAC5D,gBAAAA,OAAC,UAAK,QAAO,OAAM,WAAW,MAAM,QAAQ,cAAc,KAAK;AAAA,cAC/D,gBAAAA,OAAC,UAAK,QAAO,OAAM,WAAW,MAAM,QAAQ,KAAK,KAAK;AAAA,cACtD,gBAAAA,OAAC,UAAK,QAAO,OAAM,WAAW,MAAM,QAAQ,aAAa,KAAK;AAAA,cAC9D,gBAAAA,OAAC,UAAK,QAAO,QAAO,WAAW,MAAM,QAAQ,WAAW,KAAK;AAAA;AAAA;AAAA,QAC/D,GACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ,KAAK,GAAG,GAAG;AAAA,YACtB,MAAK;AAAA,YACL,QAAQ,MAAM;AAAA,YACd,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ,KAAK,cAAc,GAAG;AAAA,YACjC,MAAK;AAAA,YACL,QAAQ,QAAQ,UAAU;AAAA,YAC1B,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA,QACC,SAAS,IAAI,CAAC,SAAS,UAAU;AAChC,gBAAM,aAAa,WAAW,MAAM,QAAQ,IAAI,GAAG;AACnD,iBACE,gBAAAA,OAAC,OACE,wBACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG,WAAW;AAAA,cACd,GAAG,WAAW;AAAA,cACd,YAAW;AAAA,cACX,kBAAiB;AAAA,cACjB,MACE,QAAQ,QAAQ,cACZ,QAAQ,OAAO,OACf,MAAM;AAAA,cAEZ,UAAS;AAAA,cACT,YAAW;AAAA,cAEV,kBAAQ;AAAA;AAAA,UACX,KAhBI,QAAQ,KAkBhB;AAAA,QAEJ,CAAC;AAAA,QACD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,GAAG,MAAM,oBAAoB,IAAI,mBAAmB,IAAI,MAAM,oBAAoB,IAAI,mBAAmB,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,MAAM,oBAAoB,IAAI,mBAAmB,IAAI,MAAM,oBAAoB,IAAI,mBAAmB;AAAA,YACzP,MAAM,MAAM;AAAA;AAAA,QACd;AAAA,QACA,gBAAAA,OAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,OAAM,MAAM,MAAM,QAAQ;AAAA;AAAA;AAAA,EACxD;AAEJ;;;AE3IQ,gBAAAK,QAkBE,QAAAC,eAlBF;AA5CD,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,cAAc,aAAa,UAAU,KAAK,cAAc,CAAC;AAC/D,QAAM,cACJ,MAAM,QACJ,KAAK,mBAAmB,YAAY,SAAS,KAAK,cACpD;AACF,QAAM,SAAS;AAAA,IACb;AAAA,MACE,OAAO,KAAK,OAAO;AAAA,MACnB,OAAO,aAAa;AAAA,MACpB,OAAO,MAAM,QAAQ,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,MACE,OAAO,KAAK,OAAO;AAAA,MACnB,OAAO,aAAa;AAAA,MACpB,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B;AAAA,IACA;AAAA,MACE,OAAO,KAAK,OAAO;AAAA,MACnB,OAAO,aAAa;AAAA,MACpB,OAAO,MAAM,QAAQ,WAAW;AAAA,IAClC;AAAA,EACF;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK,OAAO,EAAE;AAAA,QACd,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,MAEA;AAAA,wBAAAD,OAAC,SAAI,OAAO,EAAE,MAAM,YAAY,OAAO,OAAO,KAAK,EAAE,EAAE,GACrD,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY;AAAA;AAAA,QACd,GACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA;AAAA,cAEL,SAAS;AAAA,cACT,eAAe;AAAA,cACf,SAAS,OAAO,GAAG,CAAC;AAAA,cACpB,KAAK,OAAO,CAAC;AAAA,YACf;AAAA,YAEC,iBAAO,IAAI,CAAC,EAAE,OAAO,OAAO,MAAM,MACjC,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,qBAAqB;AAAA,kBACrB,KAAK,OAAO,CAAC;AAAA,gBACf;AAAA,gBAEA;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU,OAAO,IAAI,EAAE;AAAA,wBACvB,YAAY;AAAA,wBACZ;AAAA,wBACA,YAAY;AAAA,wBACZ,WAAW;AAAA,sBACb;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,EAAE,UAAU,OAAO,IAAI,CAAC,GAAG,OAAO,MAAM,cAAc;AAAA,sBAE5D;AAAA;AAAA,kBACH;AAAA;AAAA;AAAA,cAtBK;AAAA,YAuBP,CACD;AAAA;AAAA,QACH;AAAA,QAEA,gBAAAC,QAAC,SAAI,OAAO,EAAE,OAAO,eAAe,UAAU,EAAE,GAC9C;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU,OAAO,IAAI,EAAE;AAAA,gBACvB,YAAY;AAAA,gBACZ,OAAO,YAAY;AAAA,gBACnB,eAAe;AAAA,gBACf,YAAY;AAAA,cACd;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,WAAW,OAAO,CAAC;AAAA,gBACnB,UAAU,OAAO,IAAI,CAAC;AAAA,gBACtB,OAAO,MAAM;AAAA,cACf;AAAA,cAEC,uBAAa;AAAA;AAAA,UAChB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU,OAAO,IAAI,EAAE;AAAA,gBACvB,YAAY;AAAA,gBACZ,OAAO,MAAM;AAAA,cACf;AAAA,cAEC;AAAA,gBACC,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,OAAO,QAAQ;AAAA,cACjB;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AChHQ,SAUE,OAAAE,QAVF,QAAAC,eAAA;AAhBD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,cAAc,aAAa,UAAU,KAAK,cAAc,CAAC;AAC/D,QAAM,cAAc,MAAM,QAAQ,KAAK,mBAAmB,YAAY,SAAS,KAAK,cAAc;AAElG,SACE,gBAAAA,QAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,GAAG,MAAM,KAAK,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,UAAU,GACtF;AAAA,iBACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,cAAc,OAAO,CAAC;AAAA,UACtB,OAAO,MAAM;AAAA,UACb,UAAU,OAAO,IAAI,CAAC;AAAA,UACtB,YAAY,OAAO,uBAAuB;AAAA,UAC1C,WAAW;AAAA,QACb;AAAA,QAEC;AAAA,eAAK,MAAM;AAAA,UACZ,gBAAAD,OAAC,UAAK,OAAO,EAAE,mBAAmB,OAAO,CAAC,GAAG,OAAO,MAAM,eAAe,UAAU,OAAO,IAAI,CAAC,GAAG,YAAY,OAAO,oBAAoB,MAAM,GAC5I,eAAK,MAAM,QACd;AAAA;AAAA;AAAA,IACF;AAAA,IAGF,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,GAAG,MAAM,KAAK,MAAM,QAAQ,OAAO,GACxE,0BAAAA,OAAC,SAAM,MAAY,OAAc,cAA4B,YAAY,iBAAiB,GAC5F;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,WAAW,OAAO,CAAC;AAAA,UACnB,OAAO,YAAY;AAAA,UACnB,UAAU,OAAO,IAAI,EAAE;AAAA,UACvB,YAAY,OAAO,uBAAuB;AAAA,UAC1C,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,eAAe;AAAA,QACjB;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK,OAAO,CAAC;AAAA,UACb,OAAO;AAAA,UACP,UAAU,GAAG,MAAM,KAAK;AAAA,UACxB,QAAQ,GAAG,OAAO,EAAE,CAAC;AAAA,UACrB,WAAW;AAAA,QACb;AAAA,QAEC;AAAA,UACC,CAAC,KAAK,OAAO,aAAa,aAAa,MAAM,MAAM,QAAQ,YAAY,IAAI;AAAA,UAC3E,CAAC,KAAK,OAAO,MAAa,aAAa,MAAM,MAAM,QAAQ,KAAK,IAAI;AAAA,UACpE,CAAC,KAAK,OAAO,YAAa,aAAa,KAAM,MAAM,QAAQ,WAAW,IAAI;AAAA,QAC5E,EAAE,IAAI,CAAC,CAAC,OAAO,OAAO,KAAK,MACzB,gBAAAC,QAAC,SACC;AAAA,0BAAAD,OAAC,SAAI,OAAO,EAAE,OAAO,OAAO,KAAK,GAAG,UAAU,OAAO,IAAI,CAAC,GAAG,YAAY,IAAI,GAAI,iBAAM;AAAA,UACvF,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,MAAM,eAAe,UAAU,OAAO,IAAI,CAAC,EAAE,GAAI,iBAAM;AAAA,aAFpE,OAAO,KAAK,CAGtB,CACD;AAAA;AAAA,IACH;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,WAAW,OAAO,EAAE;AAAA,UACpB,YAAY,OAAO,EAAE;AAAA,UACrB,WAAW,aAAa,MAAM,KAAK;AAAA,UACnC,OAAO,MAAM;AAAA,UACb,UAAU,OAAO,IAAI,CAAC;AAAA,UACtB,WAAW;AAAA,QACb;AAAA,QAEC;AAAA,uBAAa;AAAA,UAAc;AAAA,UAAE;AAAA,UAC9B,gBAAAD,OAAC,YAAO,OAAO,EAAE,OAAO,MAAM,KAAK,GAChC,uBAAa,KAAK,iBAAiB,KAAK,UAAU,OAAO,QAAQ,IAAI,GACxE;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;ATgCU,gBAAAE,cAAA;AAjGH,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AACR,GAAmC;AACjC,QAAM,OACJ,YAAY,OAAO,gCAAgC;AACrD,QAAM,WAAWC,SAA2B,IAAI;AAChD,QAAM,eAAeC,UAAQ,MAAM;AACjC,UAAM,OAAO,OAAO,MAAM,YAAY,KAAK;AAC3C,YAAQ,qBAAa,IAAI,KAAK,qBAAa,IACxC;AAAA,EACL,GAAG,CAAC,OAAO,IAAI,CAAC;AAChB,QAAM,QAAQA;AAAA,IACZ,MAAM,kCAAkC,MAAM;AAAA,IAC9C,CAAC,MAAM;AAAA,EACT;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAoB,EAAE,QAAQ,UAAU,CAAC;AACnE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS;AAAA,IACjD,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,aAAa,cAAc,SAAS,SAAS,eAAe,MAAM;AACxE,QAAM,cACJ,cAAc,UACb,SAAS,eAAe,MAAM,YAAY,MAAM;AACnD,QAAM,QACJ,SAAS,eACL,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,UAAU,CAAC,IACxC,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY,WAAW,CAAC,CAAC;AACtE,QAAM,kBACJ,SAAS,iCACT,cAAc,SAAS;AACzB,QAAM,SAAS,CAAC,OAAe,UAAU,MACvC,GAAG,KAAK,IAAI,SAAS,QAAQ,KAAK,CAAC;AAErC,EAAAC,YAAU,MAAM;AACd,UAAM,UAAU,SAAS;AACzB,QAAI,CAAC,WAAW,OAAO,mBAAmB,YAAa;AACvD,UAAM,aAAa,CAAC,OAAe,WAAmB;AACpD,UAAI,SAAS,KAAK,UAAU,EAAG;AAC/B;AAAA,QAAiB,CAAC,YAChB,KAAK,IAAI,QAAQ,QAAQ,KAAK,IAAI,OAClC,KAAK,IAAI,QAAQ,SAAS,MAAM,IAAI,MAChC,UACA,EAAE,OAAO,OAAO;AAAA,MACtB;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,sBAAsB;AAC7C,eAAW,OAAO,OAAO,OAAO,MAAM;AACtC,UAAM,WAAW,IAAI;AAAA,MAAe,CAAC,CAAC,KAAK,MACzC,WAAW,MAAM,YAAY,OAAO,MAAM,YAAY,MAAM;AAAA,IAC9D;AACA,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,EAAAA,YAAU,MAAM;AACd,mBAAe,OAAO,eAAe,MAAS;AAAA,EAChD,GAAG,CAAC,OAAO,WAAW,CAAC;AAEvB,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,UAAU,OAAO,KAAK,WAAW,GAAG;AAC9C,eAAS,EAAE,QAAQ,QAAQ,CAAC;AAC5B;AAAA,IACF;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,aAAS,EAAE,QAAQ,UAAU,CAAC;AAC9B,+BAA2B,SAAS,WAAW,MAAM,EAClD;AAAA,MAAK,CAACC,UACL,SAASA,QAAO,EAAE,QAAQ,SAAS,MAAAA,MAAK,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAAA,IACjE,EACC,MAAM,CAAC,UAAU;AAChB,UAAK,MAAgB,SAAS,cAAc;AAC1C,gBAAQ,MAAM,2CAA2C,KAAK;AAC9D,iBAAS,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC9B;AAAA,IACF,CAAC;AACH,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,OAAO,MAAM;AAAA,IACb,YAAY,OAAO,eAAe;AAAA,IAClC,UAAU;AAAA,EACZ;AAEA,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAL,OAAC,SAAI,KAAK,UAA6C,OAAO,YAC5D,0BAAAA,OAAC,gBAAa,OACZ,0BAAAA,OAAC,eAAY,GACf,GACF;AAAA,EAEJ;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAA,OAAC,SAAI,KAAK,UAA6C,OAAO,YAC5D,0BAAAA,OAAC,gBAAa,OACX,gBAAM,WAAW,UACd,aAAa,SACb,aAAa,WACnB,GACF;AAAA,EAEJ;AAEA,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,YAAY,CAAC,MAAM,MAAM,IAAI,EAAE,SAAS,OAAO,MAAM,YAAY,CAAC,IACpE,QACA;AACJ,QAAMM,cAAkC;AAAA,IACtC,QAAQ,SAAS,eAAe,OAAO,OAAO,EAAE,CAAC,KAAK;AAAA,IACtD,OAAO,MAAM;AAAA,IACb,UAAU,OAAO,OAAO,WAAW,OAAO,kBAAkB,IAAI,KAAK,IAAI,CAAC;AAAA,IAC1E,YAAY,OAAO,uBAAuB;AAAA,IAC1C,WAAW;AAAA,EACb;AAEA,SACE,gBAAAN,OAAC,aAAQ,KAAK,UAAU,OAAO,YAAY,KAAK,WAC7C,mBAAS,eACR,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,IAEA,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GAEJ;AAEJ;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAgC;AAC9B,QAAM,sBAAsB,OAAO;AACnC,QAAM,oBACJ,cACC,wBAAwB,QAAQ,wBAAwB,SACrD,OACA,QAAQ,mBAAmB;AACjC,QAAM,eACJ,QAAQ,OAAO,gCAAgC;AACjD,QAAM,eAA4B;AAAA,IAChC,GAAG;AAAA,IACH,qBAAqB;AAAA,MACnB,GAAI,OAAO,uBAAuB,CAAC;AAAA,MACnC,wBACE,OAAO,qBAAqB,0BAA0B;AAAA,IAC1D;AAAA,EACF;AAEA,SACE,gBAAAA,OAAC,mBAAQ,OAAO,cACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,0BAAyB,MAC3D,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA,WAAW;AAAA,MACX,MAAM;AAAA;AAAA,EACR,GACF,GACF;AAEJ;;;AUxOA;AAAA,EAIE,aAAAO;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;;;ACRP,SAAgB,iBAAAC,gBAAe,cAAAC,mBAAkB;;;ACAjD,SAAS,cAAAC,mBAAkB;;;ACA3B,SAAgB,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACAnD,SAAgB,aAAAC,aAAW,YAAAC,kBAAgB;AA0BvC,gBAAAC,cAAA;AAtBG,IAAMC,QAAsC,CAAC,EAAE,QAAQ,MAAM;AAClE,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAwB,IAAI;AAE1D,EAAAC,YAAU,MAAM;AACd,QAAI,QAAQ;AACZ,KAAC,YAAY;AACX;AACA,UAAI;AACF,cAAM,MAAM,MAAM,aAAa,GAAG,SAAS,KAAK;AAChD,YAAI,MAAO,YAAW,OAAO,IAAI;AAAA,MACnC,QAAQ;AACN,YAAI,MAAO,YAAW,IAAI;AAAA,MAC5B;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,WAAW;AAAA;AAAA,QACX,UAAU;AAAA;AAAA,QACV,WAAW;AAAA;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL,KAAI;AAAA;AAAA,EACN;AAEJ;;;ADiMQ,SAsCI,OAAAI,QAtCJ,QAAAC,eAAA;AA/NR,IAAMC,UAAS,CAAC,QACd,QAAQ,aAAa,QAAQ,eACzB,SACA,QAAQ,cAAc,QAAQ,gBAC5B,UACA;AAGR,IAAMC,WAAU,CAAC,MAA0C;AACzD,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,SAAS,IAAI,EAAG,QAAO,WAAW,CAAC;AACzC,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO,WAAW,CAAC,IAAI;AAC9C,SAAO;AACT;AAGA,IAAMC,kBAAiB,CAAC,MAAY,QAAqC;AACvE,QAAM,IAAI,GAAG,GAAG;AAChB,QAAM,IAAI;AACV,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,MACL,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,yBAAyB;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,EAAE,cAAc,EAAE;AAC3B;AAGA,IAAMC,eAAc,CAAC,KAAkB,QAAQ,MAA2B;AACxE,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,EAAE,UAAU,YAAY,MAAM,OAAO,KAAK,MAAM;AAAA,IACzD,KAAK;AACH,aAAO,EAAE,UAAU,YAAY,MAAM,OAAO,QAAQ,MAAM;AAAA,IAC5D,KAAK;AACH,aAAO,EAAE,UAAU,YAAY,OAAO,OAAO,KAAK,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,UAAU,YAAY,OAAO,OAAO,QAAQ,MAAM;AAAA,IAC7D,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,KAAK;AAAA,QACL,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,IACF;AACE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,SAAS;AAAA,MACX;AAAA,EACJ;AACF;AAGA,IAAMC,kBAAiB,MAAY;AACjC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,MAAI;AACF,WAAO,OAAO,WAAW,gBAAgB,EAAE,UAAU,UAAU;AAAA,EACjE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,IAAMC,aAQR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,gBAAgB;AAClB,MAAM;AAEJ,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,aAAaC,SAAwB,IAAI;AAG/C,QAAM,CAAC,MAAM,OAAO,IAAID,WAAeF,eAAc;AAGrD,EAAAI,YAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,EAAE,gBAAgB,QAAS,SAAQ,OAAO;AAAA,eACrC,EAAE,gBAAgB,QAAS,SAAQ,OAAO;AAAA,IACrD;AACA,WAAO,iBAAiB,eAAe,eAAe,EAAE,SAAS,KAAK,CAAC;AACvE,WAAO,MAAM,OAAO,oBAAoB,eAAe,aAAa;AAAA,EACtE,GAAG,CAAC,CAAC;AAGL,EAAAA,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,eAAe,EAAE,gBAAgB,QAAS;AAChE,UAAM,KAAK,OAAO,WAAW,gBAAgB;AAC7C,UAAM,SAAS,MAAM,QAAQ,GAAG,UAAU,UAAU,OAAO;AAC3D,WAAO;AACP,OAAG,mBAAmB,UAAU,MAAM;AACtC,WAAO,MAAM,GAAG,sBAAsB,UAAU,MAAM;AAAA,EACxD,GAAG,CAAC,CAAC;AAGL,EAAAA,YAAU,MAAM;AACd,QAAI,SAAS,SAAS;AACpB,kBAAY,KAAK;AACjB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAGT,QAAM,eAAe,MAAM;AACzB,QAAI,SAAS,QAAS;AACtB,gBAAY,IAAI;AAChB,eAAW,IAAI;AAAA,EACjB;AACA,QAAM,eAAe,MAAM;AACzB,QAAI,SAAS,QAAS;AACtB,eAAW,KAAK;AAChB,gBAAY,KAAK;AAAA,EACnB;AAGA,QAAM,iBAA0C,CAAC,MAAM;AACrD,QAAI,SAAS,WAAW,CAAC,UAAU;AACjC,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,EAAAA,YAAU,MAAM;AACd,QAAI,EAAE,SAAS,WAAW,UAAW;AACrC,UAAM,gBAAgB,CAAC,MAAoB;AACzC,YAAM,SAAS,EAAE;AACjB,UACE,WAAW,WACX,UACA,CAAC,WAAW,QAAQ,SAAS,MAAM,GACnC;AACA,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,WAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,EACxE,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,oBAAiC,YAAY;AACnD,QAAM,eAAeP,SAAQ,MAAM,YAAY,KAAK;AACpD,QAAM,OAAOD,QAAO,iBAAiB;AACrC,QAAM,iBAAsCG;AAAA,IAC1C;AAAA,IACA;AAAA,EACF;AAGA,QAAM,WAAW,SAAS,SAAS,SAAS,SAAS,UAAU,QAAQ;AAGvE,QAAM,SAASF,SAAQ,MAAM,QAAQ,KAAK;AAC1C,QAAM,aAAa;AACnB,QAAM,aAAa,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,UAAU,CAAC;AAG/D;AAAA;AAAA,IAEE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,QACV;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACL,SAAS;AAAA,cACT,WAAW,cAAc,QAAQ;AAAA;AAAA,cACjC,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,QAAQ;AAAA,gBACd,QAAO;AAAA,gBACP,OAAO;AAAA,kBACL,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,aAAa,MAAM;AAAA,kBACnB,aAAa,MAAM;AAAA,kBACnB,aAAa,MAAM;AAAA,kBACnB,YAAY,MAAM;AAAA,kBAClB,OAAO,MAAM;AAAA,kBACb,WAAW,MAAM;AAAA,kBACjB,UAAU,MAAM;AAAA,kBAChB,YAAY;AAAA;AAAA,kBACZ,QAAQ;AAAA,kBACR,SAAS,WAAW,WAAW,IAAI;AAAA,kBACnC,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,KAAK;AAAA;AAAA,kBACL,eACEC,QAAO,iBAAiB,MAAM,SAAS,gBAAgB;AAAA,kBACzD,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,GAAGE,gBAAe,MAAM,YAAY;AAAA,gBACtC;AAAA,gBAEA;AAAA,kCAAAJ;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA;AAAA,wBAEhB,QAAQ;AAAA;AAAA,wBACR,YAAY;AAAA,sBACd;AAAA,sBAEA,0BAAAA,OAACW,OAAA,EAAK,SAAkB;AAAA;AAAA,kBAC1B;AAAA,kBAGA,gBAAAX;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,UAAU,WAAW,gBAAgB;AAAA,wBACrC,SAAS,WAAW,IAAI;AAAA,wBACxB,WAAW,WAAW,kBAAkB;AAAA,wBACxC,mBAAmB,WAAW,WAAW;AAAA,wBACzC,YACE;AAAA,wBAIF,UAAU;AAAA,wBACV,YAAY;AAAA,sBACd;AAAA,sBAEC,mBAAS;AAAA;AAAA,kBACZ;AAAA;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA;AAEJ;;;ADrQQ,SAsBI,OAAAY,QAtBJ,QAAAC,eAAA;AAzBR,IAAMC,mBAAkBC;AAAA,EACtB,CAAC,EAAE,UAAU,OAAO,SAAS,GAAG,QAAQ;AACtC,UAAM,EAAE,OAAO,QAAQ,IAAI,iBAAiB;AAE5C,UAAM,iBAAiC;AAAA,MACrC,YAAY,MAAM,IAAI;AAAA,MACtB,aAAa,MAAM,IAAI;AAAA,MACvB,cAAc,MAAM,IAAI;AAAA,MACxB,OAAO,MAAM,IAAI;AAAA,MACjB,UAAU,MAAM,IAAI;AAAA,MACpB,WAAW,MAAM,IAAI;AAAA,MACrB,aAAa,MAAM,IAAI;AAAA,MACvB,aAAa,MAAM,IAAI;AAAA,IACzB;AAEA,WACE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO,SAAS,SAAS,SAAS;AAAA,UAClC,QAAQ,SAAS,SAAS,SAAS;AAAA,UACnC,WAAW;AAAA,QACb;AAAA,QAEA,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,SAAS;AAAA,cACT,eAAe;AAAA,cACf,OAAO;AAAA,cACP,KAAK;AAAA,cACL,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY,MAAM,IAAI,aAAa,QAAQ,WAAW;AAAA,cACtD,eAAe,MAAM,IAAI,aAAa,WAAW,WAAW;AAAA,cAC5D,YAAY,MAAM,QAAQ;AAAA,cAC1B,YAAY,MAAM,QAAQ;AAAA,cAC1B,WAAW,MAAM,QAAQ;AAAA,cACzB,cAAc,MAAM,QAAQ;AAAA,cAC5B,QAAQ,MAAM,QAAQ;AAAA,YACxB;AAAA,YACA;AAAA,YAEC;AAAA,oBAAM,IAAI,aAAa,UACtB,gBAAAD;AAAA,gBAACI;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,OAAO;AAAA,kBACP,UAAU,MAAM,IAAI;AAAA,kBACpB,OAAO,MAAM,IAAI,SAAS;AAAA,kBAC1B,MAAM,MAAM,IAAI,QAAQ;AAAA;AAAA,cAC1B;AAAA,cAED;AAAA;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;;;AGtEA,SAAS,cAAAC,aAAY,YAAAC,kBAAgB;AAUjC,gBAAAC,cAAA;AAJJ,IAAMC,UAASH,YAA2C,CAAC,OAAO,QAAQ;AACxE,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAS,KAAK;AAEhD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,SAAS,MAAM;AAAA,MACf,cAAc,MAAM,aAAa,IAAI;AAAA,MACrC,cAAc,MAAM,aAAa,KAAK;AAAA,MACtC,OAAO;AAAA,QACL,SAAS,YAAY,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,GAAG,MAAM;AAAA,QACT,GAAI,YAAY,MAAM,aAAa,CAAC;AAAA,MACtC;AAAA,MAEC,gBAAM;AAAA;AAAA,EACT;AAEJ,CAAC;AAEDC,QAAO,cAAc;;;AC7BrB;AAAA,EACE,cAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AA2MC,gBAAAC,QAkCA,QAAAC,eAlCA;AAjMR,SAASC,WAAU,OAAeC,QAAe;AAC/C,QAAM,KAAK,SAAS,IAAI,KAAK;AAE7B,QAAM,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AACA,MAAI,GAAG;AACL,WAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAKA,MAAK;AAAA,EACjD;AAEA,QAAM,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI;AAC7C,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AACtC,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKA,MAAK;AAAA,EACxC;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,UAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAKA,MAAK;AAAA,EACxC;AAEA,SAAO,oBAAoBA,MAAK;AAClC;AAEA,IAAMC,mBAAkBC;AAAA,EACtB,CAAC,EAAE,WAAW,OAAO,aAAa,WAAW,SAAS,GAAG,iBAAiB;AACxE,UAAM,EAAE,MAAM,IAAI,iBAAiB;AACnC,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,eAAe,CAAC;AAEjD,UAAM,MAAO,OAAe,QAAQ,QAAQ,QAAQ;AACpD,UAAM,QAAQ,QAAQ;AAEtB,UAAM,WAAWC,SAAuB,IAAI;AAC5C,UAAM,cAAcA,SAAuB,IAAI;AAC/C,UAAM,WAAWA,SAAuB,IAAI;AAG5C,IAAAC,iBAAgB,MAAM;AACpB,UAAI,CAAC,aAAc;AACnB,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,GAAI;AAET,UAAI,OAAO,iBAAiB,WAAY,cAAa,EAAE;AAAA,UAClD,cAAa,UAAU;AAAA,IAC9B,GAAG,CAAC,YAAY,CAAC;AAEjB,UAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AACpD,UAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC;AAEzD,UAAM,cAAcF,SAAO,KAAK;AAChC,UAAM,eAAeA,SAAO,EAAE,GAAG,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC;AAE/D,UAAM,SAASG,UAAQ,MAAM;AAC3B,YAAM,OAAO;AACb,aAAO;AAAA,QACL,OAAOP,WAAU,MAAM,GAAG;AAAA,QAC1B,OAAOA,WAAU,MAAM,IAAI;AAAA,QAC3B,YAAYA,WAAU,MAAM,IAAI;AAAA,QAChC,aAAaA,WAAU,MAAM,IAAI;AAAA,MACnC;AAAA,IACF,GAAG,CAAC,SAAS,CAAC;AAEd,UAAM,SAAS,MAAM;AACnB,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,YAAM,UAAU,GAAG;AACnB,YAAM,UAAU,GAAG;AACnB,YAAM,SAAS,GAAG;AAElB,YAAM,WAAW,UAAU,UAAU;AACrC,qBAAe,QAAQ;AAEvB,UAAI,CAAC,UAAU;AACb,iBAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC;AAC/B;AAAA,MACF;AAEA,YAAM,WAAW;AACjB,YAAM,QAAQ,UAAU;AACxB,YAAM,SAAS,KAAK,IAAI,UAAU,KAAK,MAAM,SAAS,KAAK,CAAC;AAC5D,YAAM,cAAc,KAAK,IAAI,GAAG,SAAS,MAAM;AAC/C,YAAM,eAAe,KAAK,IAAI,GAAG,UAAU,OAAO;AAElD,YAAM,MAAO,GAAG,YAAY,eAAgB;AAC5C,eAAS,EAAE,KAAK,QAAQ,OAAO,CAAC;AAAA,IAClC;AAEA,IAAAK,iBAAgB,MAAM;AACpB,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,UAAI,MAAM;AACV,YAAM,WAAW,MAAM;AACrB,6BAAqB,GAAG;AACxB,cAAM,sBAAsB,MAAM;AAAA,MACpC;AAEA,eAAS;AAET,SAAG,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAEzD,YAAM,KAAK,IAAI,eAAe,QAAQ;AACtC,SAAG,QAAQ,EAAE;AACb,SAAG,QAAQ,EAAE;AAEb,aAAO,MAAM;AACX,6BAAqB,GAAG;AACxB,WAAG,oBAAoB,UAAU,QAAQ;AACzC,WAAG,WAAW;AAAA,MAChB;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAa;AAClB,UAAK,EAAE,QAAwB,SAAS,SAAS,QAAS;AAE1D,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,SAAS,EAAE,UAAU,KAAK;AAEhC,YAAM,cAAc,GAAG,eAAe,MAAM;AAC5C,YAAM,kBAAkB,KAAK;AAAA,QAC3B;AAAA,QACA,KAAK,IAAI,GAAG,SAAS,MAAM,SAAS,CAAC;AAAA,MACvC;AAEA,YAAM,eAAe,GAAG,eAAe,GAAG;AAC1C,SAAG,YAAa,kBAAkB,cAAe;AAAA,IACnD;AAEA,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAa;AAElB,kBAAY,UAAU;AACtB,MAAC,EAAE,cAA8B,kBAAkB,EAAE,SAAS;AAE9D,mBAAa,UAAU;AAAA,QACrB,GAAG,EAAE;AAAA,QACL,WAAW,YAAY,QAAS;AAAA,QAChC,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,MAA0B;AACpD,UAAI,CAAC,YAAY,QAAS;AAE1B,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,EAAE,UAAU,aAAa,QAAQ;AAE5C,YAAM,cAAc,GAAG,eAAe,MAAM;AAC5C,YAAM,eAAe,GAAG,eAAe,GAAG;AAE1C,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,QACA,KAAK,IAAI,GAAG,aAAa,QAAQ,WAAW,EAAE;AAAA,MAChD;AAEA,SAAG,YAAa,eAAe,cAAe;AAAA,IAChD;AAEA,UAAM,mBAAmB,CAAC,MAA0B;AAClD,kBAAY,UAAU;AACtB,UAAI;AACF,QAAC,EAAE,cAA8B,sBAAsB,EAAE,SAAS;AAAA,MACpE,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,WACE,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UAEX,GAAI,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAAA,UACnC,GAAI,UAAU,QAAQ,OAAO,CAAC,IAAI,EAAE,MAAM,WAAW;AAAA,UACrD,WAAW;AAAA,UAEX,GAAG;AAAA,QACL;AAAA,QACA;AAAA,QAEA;AAAA,0BAAAD,OAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAgCN;AAAA,UAEF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV;AAAA,cACA,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,QAAQ;AAAA,gBACR,WAAW;AAAA,cACb;AAAA,cAEA;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,cAAc,QAAQ,SAAY;AAAA,sBAClC,aAAa,QAAQ,qBAAqB;AAAA,oBAC5C;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,eAAe;AAAA,oBACf,OAAO;AAAA,sBACL,SAAS,cAAc,UAAU;AAAA,sBACjC,YAAY,OAAO;AAAA,sBACnB,cAAc;AAAA,sBACd,OAAO,QAAQ,SAAY;AAAA,sBAC3B,MAAM,QAAQ,IAAI;AAAA,oBACpB;AAAA,oBAEA,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,aAAU;AAAA,wBACV,WAAU;AAAA,wBACV,eAAe;AAAA,wBACf,eAAe;AAAA,wBACf,aAAa;AAAA,wBACb,iBAAiB;AAAA,wBACjB,OAAO;AAAA,0BACL,KAAK,MAAM;AAAA,0BACX,QAAQ,MAAM;AAAA,0BACd,YAAY,OAAO;AAAA,wBACrB;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;;;ALnQM,gBAAAU,cAAA;AA3BN,IAAM,uBAAuBC,eAE3B,MAAS;AACJ,IAAM,mBAAmB,MAAM;AACpC,QAAM,UAAUC,YAAW,oBAAoB;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAMC,mBAAkB;AAAA,EACtB,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,QAAAC;AACF;AAOA,IAAM,gBAAgB,OAAO;AAAA,EAC3B,CAAC,EAAE,MAAM,SAAS,MAA0B;AAC1C,WACE,gBAAAN;AAAA,MAAC,qBAAqB;AAAA,MAArB;AAAA,QACC,OAAO,EAAE,OAAO,KAAK,QAAQ,OAAO,SAAS,KAAK,SAAS;AAAA,QAE1D;AAAA;AAAA,IACH;AAAA,EAEJ;AAAA,EACAG;AACF;AAEA,IAAO,wBAAQ;;;AD0MS,SAiDR,YAAAI,YAjDQ,OAAAC,QA+DJ,QAAAC,eA/DI;AAnOxB,IAAM,aAAa;AAOZ,IAAM,qBAAgC,CAAC,EAAE,QAAQ,KAAK,MAAM;AACjE,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAkB,KAAK;AACjD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAiB,CAAC;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAA6B,IAAI;AAC3D,QAAM,eAAeC,SAAuB,IAAI;AAEhD,EAAAC,YAAU,MAAM;AACd,SAAK,iBAAiB,OAAO,YAAY,OAAO,SAAS,EAAE,KAAK,QAAQ;AAAA,EAC1E,GAAG,CAAC,OAAO,YAAY,OAAO,SAAS,CAAC;AAGxC,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,SAAS;AACzB;AAAA,IACF;AAEA,UAAM,eAAe,MAAM;AACzB,UAAI,CAAC,aAAa,QAAS;AAE3B,wBAAkB,aAAa,QAAQ,WAAW;AAAA,IACpD;AAEA,UAAM,KAAK,IAAI,eAAe,MAAM;AAClC,mBAAa;AAAA,IACf,CAAC;AAED,OAAG,QAAQ,aAAa,OAAO;AAG/B,iBAAa;AAEb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,wBACJ,iBAAiB,MAAM,iBAAiB,MAAO,iBAAiB,IAAK;AACvE,QAAM,qBACJ,iBAAiB,MACb,iBAAiB,MACjB,iBAAiB;AAEvB,QAAM,YAAY,OAAO,QAAQ,OAAO,WAAW,CAAC;AAEpD,QAAM,sBAAuE;AAAA,IAC3E,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AACA,QAAM,aAA0B;AAAA,IAC9B,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,YAAY,OAAO;AAAA,IACnB,SAAS;AAAA,IAET,aAAa,UAAU,cAAc;AAAA,IACrC,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,iBAAiB,UAAU,mBAAmB;AAAA,IAC9C,cAAc,UAAU,gBAAgB;AAAA,IACxC,aAAa,GAAG,UAAU,eAAe,KAAK,IAAI,UAAU,eAAe,OAAO,IAAI,UAAU,eAAe,SAAS;AAAA,IACxH,aACE,UAAU,aAAa;AAAA,IACzB,iBAAiB,UAAU,SAAS;AAAA,IACpC,gBAAgB,UAAU,YAAY;AAAA,IACtC,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,iBAAiB;AAAA,IAEjB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,6BAA6B;AAAA,IAC7B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,4BAA4B;AAAA,IAC5B,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,cAAc;AAAA,IACd,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB;AAEA,QAAM,eAAgC;AAAA,IACpC,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO,QAAQ;AAAA,IACvB,QAAQ,OAAO,QAAQ,MAAM;AAAA,IAC7B,SAAS,wBAAwB;AAAA,IACjC,SAAS;AAAA,EACX;AAEA,QAAM,YAA0B;AAAA,IAC9B,MAAM,OAAO;AAAA,IACb,OAAO;AAAA,MACL,YAAY,WAAW;AAAA,MACvB,eAAe,WAAW;AAAA,IAC5B;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,IACT,mBAAmB,OAAO,QAAQ,MAAM,KAAK;AAAA,IAC7C,YAAY,OAAO,QAAQ,MAAM,KAAK;AAAA,EACxC;AAEA,QAAM,WAAW,iBAAiB;AAElC,QAAMC,gBAAoC;AAAA,IACxC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe,WAAW,WAAW;AAAA,IACrC,UAAU;AAAA,IACV,KAAK;AAAA,EACP;AAEA,QAAM,aAAkC;AAAA,IACtC,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,cAAc,OAAO,QAAQ,OAAO,OAAO,gBAAgB;AAAA,IAC3D,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAEA,QAAM,QAAQC;AAAA,IACZ,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,WACE,gBAAAN;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,OAAO;AAAA,YACT;AAAA,YAEA,0BAAAA,OAAC,SAAI,OAAO,YACT,mBAAS,gBAAAA,OAAC,cAAW,OAAc,GACtC;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,WAAW,gBAAAA,OAAC,cAAY,GAAG,cAAc;AAAA,MAC3C;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,WACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,QAAQ,WAAW,UAAU;AAAA,YAC/B;AAAA,YAEA,0BAAAA,OAAC,WAAS,GAAG,WAAW;AAAA;AAAA,QAC1B;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,CAAC,cAAc,WAAW,YAAY,KAAK;AAAA,EAC7C;AAEA,SACE,gBAAAA,OAAC,yBAAc,MAAM,QACnB,0BAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,KAAK,cAClD,0BAAAA,OAAC,sBAAc,iBAAd,EAA8B,MAC7B,0BAAAA,OAAC,mBAAQ,OAAO,YACd,0BAAAA,OAAC,SAAI,OAAOK,eACT,qBACC,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,WACE,OAAO,QAAQ,OAAO,SAAS,mBAAmB;AAAA,MAEpD,YAAY;AAAA,QACV,UAAU;AAAA,QACV,OAAO,WAAW;AAAA,QAClB,YAAY,WAAW;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,MACX;AAAA;AAAA,EACF,IAEA,gBAAAC,QAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WACE,OAAO,QAAQ,OAAO,SAAS,SAAS;AAAA,QAE1C,YAAY;AAAA,UACV,UAAU;AAAA,UACV,OAAO,WAAW;AAAA,UAClB,YAAY,WAAW;AAAA,QACzB;AAAA,QACA,WAAW;AAAA,QACX,OAAO,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA,IACzB;AAAA,IACC,MAAM,CAAC,KACN,gBAAAC,QAAC,SAAI,OAAO,EAAE,GAAG,YAAY,OAAO,OAAO,GACzC;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO,WAAW;AAAA,YAClB,YAAY,WAAW;AAAA,UACzB;AAAA,UAEC,gBAAM,CAAC,EAAE;AAAA;AAAA,MACZ;AAAA,MACC,MAAM,CAAC,EAAE;AAAA,OACZ;AAAA,KAEJ,GAEJ,GACF,GACF,GACF,GACF;AAEJ;AAEA,IAAM,eAQD,CAAC,EAAE,WAAW,YAAAO,aAAY,WAAAC,YAAW,MAAM,MAAM;AACpD,QAAM,cAAmC;AAAA,IACvC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,GAAGD;AAAA,EACL;AAEA,SACE,gBAAAP,OAAC,sBAAc,iBAAd,EAA8B,WAAsB,OAAOQ,YACzD,gBAAM,IAAI,CAAC,MAAM,QAChB,gBAAAP,QAAC,SAAc,OAAO,EAAE,cAAc,OAAO,GAC3C;AAAA,oBAAAD,OAAC,QAAG,OAAO,aAAc,eAAK,OAAM;AAAA,IACnC,KAAK;AAAA,OAFE,GAGV,CACD,GACH;AAEJ;;;AO1WA,SAAS,aAAAS,mBAAiB;;;ACA1B,SAAS,aAAAC,aAAW,WAAAC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;;;ACG9C,IAAM,4BAAsD;AAAA,EACjE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AACvC;AAOA,IAAM,YAAyD;AAAA,EAC7D,MAAM,EAAE,WAAW,OAAO,MAAM,EAAE;AAAA,EAClC,MAAM,EAAE,WAAW,MAAM,MAAM,EAAE;AAAA,EACjC,MAAM,EAAE,WAAW,MAAM,MAAM,GAAG;AAAA,EAClC,MAAM,EAAE,WAAW,MAAM,MAAM,IAAI;AAAA,EACnC,OAAO,EAAE,WAAW,MAAM,MAAM,IAAI;AAAA,EACpC,MAAM,EAAE,WAAW,MAAM,MAAM,IAAI;AAAA,EACnC,MAAM,EAAE,WAAW,MAAM,MAAM,KAAK;AACtC;AAKA,eAAsB,kBACpB,QACA,IACmB;AACnB,QAAM,EAAE,WAAW,KAAK,IAAI,UAAU,EAAE;AACxC,MAAI;AACF,UAAM,MAAM,GAAG,eAAe,+BAA+B,mBAAmB,MAAM,CAAC,cAAc,SAAS,SAAS,IAAI;AAC3H,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,UAAU,KAAK,WAAW,CAAC;AAC/B,QAAI,OAAO,OAAO;AAChB,YAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,gBAAU,QAAQ,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,MAAM,WAAW;AAAA,IACrF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AClCA,eAAsB,cAAc,SAAgD;AAClF,QAAM,MAAM,GAAG,eAAe,yBAAyB,OAAO;AAC9D,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,GAAI,QAAO;AACzB,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,SAAO,KAAK,WAAW,CAAC,KAAK;AAC/B;AAEA,eAAsB,iBAAiB,SAA2C;AAChF,QAAM,MAAM,GAAG,eAAe,yBAAyB,OAAO;AAC9D,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,GAAI,QAAO,CAAC;AAC1B,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,SAAO,KAAK,YAAY,CAAC;AAC3B;;;ACVA,eAAsB,eAAe,SAA4C;AAC/E,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,eAAe,2BAA2B,OAAO,EAAE;AAC9E,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,QAAQ;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACPA,IAAM,aAAkC;AAAA,EACtC,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc;AAChB;AAEA,IAAM,SAAiD;AAAA,EACrD,OAAO,EAAE,GAAG,YAAY,cAAc,KAAK;AAAA,EAC3C,WAAW;AAAA,EACX,OAAO,EAAE,aAAa,OAAO,YAAY,MAAM,MAAM,UAAU,cAAc,MAAM;AAAA,EACnF,QAAQ,EAAE,aAAa,OAAO,YAAY,MAAM,MAAM,UAAU,cAAc,MAAM;AAAA,EACpF,OAAO,EAAE,aAAa,OAAO,YAAY,OAAO,MAAM,QAAQ,cAAc,MAAM;AACpF;AAGO,SAAS,mBAAmB,MAAyD;AAC1F,SAAQ,QAAQ,OAAO,IAAI,KAAM;AACnC;;;ACjCO,SAAS,gBAAgB,UAAyB;AACvD,SAAO,CAAC,UACN,MAAM,QAAQ,YAAY,YAAY,KAAK,CAAC;AAChD;AAEO,SAAS,aAAa,KAAqB;AAChD,MAAI,OAAO,KAAM,QAAO,IAAI,MAAM,MAAM,QAAQ,CAAC,CAAC;AAClD,MAAI,OAAO,IAAK,QAAO,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC;AAChD,MAAI,OAAO,IAAK,QAAO,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC;AAChD,MAAI,OAAO,IAAK,QAAO,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC;AAChD,SAAO,IAAI,QAAQ,CAAC;AACtB;AAEO,SAAS,UAAU,KAA4B;AACpD,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,OAAO,OAAO,IAAI,MAAM;AAC9B,SAAO,GAAG,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC;AACjC;AAEO,SAAS,gBAAgB,SAAmB;AACjD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,EAC9D;AACA,QAAM,UAAU,QAAQ,QAAQ,SAAS,CAAC,EAAE;AAC5C,QAAM,MAAM,CAAC,QAAiB,MAAM,KAAM,UAAU,OAAO,MAAO,MAAM;AAExE,QAAM,QAAQ,QAAQ,UAAU,IAAI,IAAI,QAAQ,QAAQ,SAAS,CAAC,EAAE,KAAK,IAAI;AAC7E,QAAM,SAAS,QAAQ,UAAU,KAAK,IAAI,QAAQ,QAAQ,SAAS,EAAE,EAAE,KAAK,IAAI;AAChF,QAAM,SAAS,QAAQ,UAAU,KAAK,IAAI,QAAQ,QAAQ,SAAS,EAAE,EAAE,KAAK,IAAI;AAEhF,QAAM,cAAc,IAAI,KAAK,QAAQ,QAAQ,SAAS,CAAC,EAAE,SAAS,EAAE,YAAY;AAChF,QAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,MAAM,WAAW;AACzF,QAAM,MAAM,YAAY,IAAI,UAAU,KAAK,IAAI;AAE/C,SAAO,EAAE,OAAO,QAAQ,QAAQ,IAAI;AACtC;;;ACtCA,SAAS,YAAAC,kBAAgB;AAUrB,gBAAAC,QA2CA,QAAAC,eA3CA;AAJJ,IAAM,OAAO;AAEb,SAAS,KAAK,EAAE,MAAM,MAAM,GAAwC;AAClE,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY,MAAM;AAAA,QAClB,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,MAEC,eAAK,MAAM,GAAG,CAAC;AAAA;AAAA,EAClB;AAEJ;AAIA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,MAAM,KAAK,KAAK,MAAM,UAAU,iBAAO,MAAM,GAAG;AACvD,QAAM,QAAuB;AAAA,IAC3B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,aAAa,MAAM,UAAU;AAAA,IACrC,WAAW;AAAA,EACb;AACA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,UAAU,YAAY,OAAO,MAAM,QAAQ,MAAM,YAAY,EAAE;AAAA,MAExE;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,UAAU;AAAA,cACV,KAAK;AAAA,cACL,MAAM;AAAA,cACN,YAAY,MAAM;AAAA,cAClB,OAAO,MAAM;AAAA,YACf;AAAA,YAEE,mBAAQ,UAAK,MAAM,GAAG,CAAC;AAAA;AAAA,QAC3B;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,YAAY,MAAM;AAAA,cAClB,OAAO,MAAM;AAAA,YACf;AAAA,YAEE,oBAAS,UAAK,MAAM,GAAG,CAAC;AAAA;AAAA,QAC5B;AAAA;AAAA;AAAA,EACF;AAEJ;AAIA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,QAAQ,SAAS,IAAID,WAAS,KAAK;AAC1C,MAAI,MAAM,WAAW,CAAC,QAAQ;AAC5B,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,QACV,SAAS,MAAM,UAAU,IAAI;AAAA,QAC7B,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY,MAAM;AAAA,UAClB,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,SAAO,gBAAAA,OAAC,QAAK,MAAM,MAAM,UAAU,UAAK,OAAc;AACxD;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO,OAAO,SAAS,SACrB,gBAAAA,OAAC,YAAS,MAAY,OAAc,IAEpC,gBAAAA,OAAC,cAAW,MAAY,OAAc;AAE1C;;;ACvFQ,gBAAAE,QACA,QAAAC,eADA;AAzBD,SAASC,aAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,SAAS,cAAc;AAC7B,QAAM,cAAc,SAAS,MAAM,OAAO,MAAM;AAEhD,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,wBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,GAC3D;AAAA,0BAAAD,OAAC,aAAU,MAAM,WAAW,OAAc,QAAgB;AAAA,UAC1D,gBAAAC,QAAC,SACC;AAAA,4BAAAD,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,QAAQ,YAAY,IAAI,GAC/E,qBAAW,UAAU,UACxB;AAAA,YACA,gBAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,KAAK,GAAI,qBAAW,QAAQ,IAAG;AAAA,aAC1E;AAAA,WACF;AAAA,QAEA,gBAAAC,QAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,0BAAAD,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,QAAQ,YAAY,EAAE,GAC7E,UAAAG,aAAY,YAAY,GAC3B;AAAA,UACA,gBAAAF,QAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,aAAa,WAAW,EAAE,GAC3E;AAAA,qBAAS,KAAK;AAAA,YACdE,aAAY,WAAW;AAAA,YAAE;AAAA,YAAQ,SAAS,KAAK;AAAA,YAC/C,eAAe,QAAQ,CAAC;AAAA,YAAE;AAAA,aAC7B;AAAA,UACC,cACC,gBAAAF,QAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,MAAM,WAAW,EAAE,GACzD;AAAA,cAAE;AAAA,YAAK;AAAA,YAAGE,aAAY,WAAW,IAAI;AAAA,YAAE;AAAA,YACvC,EAAE;AAAA,YAAM;AAAA,YAAGA,aAAY,WAAW,KAAK;AAAA,aAC1C;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACvDI,qBAAAC,YACE,OAAAC,QADF,QAAAC,eAAA;AAFG,SAAS,WAAW,EAAE,SAAS,WAAW,mBAAmB,eAAe,MAAM,GAAU;AACjG,SACE,gBAAAA,QAAAF,YAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,OAAO,kBAAkB,EAA4B;AAAA,QAChE;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,OAAC,aAAU,SAAkB,OAAc,QAAQ,KAAK,eAA8B;AAAA,KACxF;AAEJ;;;ACnBI,SACE,OAAAE,QADF,QAAAC,eAAA;AAFJ,SAAS,QAAQ,EAAE,OAAO,OAAO,MAAM,GAAwD;AAC7F,SACE,gBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GACnF;AAAA,oBAAAD,OAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,KAAK,GAAI,iBAAM;AAAA,IACzD,gBAAAA,OAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,OAAO,GAAI,iBAAM;AAAA,KAC9E;AAEJ;AAUO,SAAS,mBAAmB,EAAE,YAAY,YAAY,aAAAE,cAAa,GAAG,MAAM,GAAU;AAC3F,MAAI,CAAC,YAAY;AACf,WAAO,gBAAAF,OAAC,SAAI,OAAO,EAAE,OAAO,MAAM,MAAM,UAAU,GAAG,GAAI,YAAE,QAAO;AAAA,EACpE;AAEA,SACE,gBAAAC,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,GAC9D;AAAA,oBAAAD,OAAC,WAAQ,OAAO,EAAE,MAAM,OAAOE,aAAY,WAAW,IAAI,GAAG,OAAc;AAAA,IAC3E,gBAAAF,OAAC,WAAQ,OAAO,EAAE,OAAO,OAAOE,aAAY,WAAW,KAAK,GAAG,OAAc;AAAA,IAC7E,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE;AAAA,QACT,OAAO,GAAGE,aAAY,WAAW,GAAG,CAAC,WAAMA,aAAY,WAAW,IAAI,CAAC;AAAA,QACvE;AAAA;AAAA,IACF;AAAA,IACC,cACC,gBAAAF,OAAC,WAAQ,OAAO,EAAE,QAAQ,OAAO,aAAa,WAAW,MAAgB,GAAG,OAAc;AAAA,KAE9F;AAEJ;;;AC5BM,SACE,OAAAG,QADF,QAAAC,eAAA;AARN,IAAM,cAAc;AAEpB,SAAS,QAAQ,EAAE,OAAO,KAAK,MAAM,GAA6D;AAChG,QAAM,QAAQ,QAAQ,OAAO,MAAM,OAAO,OAAO,IAAI,MAAM,KAAK,MAAM;AACtE,QAAM,eAAe,QAAQ,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,aAAa,CAAC,IAAI,MAAM;AAErF,SACE,gBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GAC7D;AAAA,oBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAS,GACnF;AAAA,sBAAAD,OAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,KAAK,GAAI,iBAAM;AAAA,MACzD,gBAAAA,OAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,MAAM,GAAI,oBAAU,GAAG,GAAE;AAAA,OACzE;AAAA,IACA,gBAAAC,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,QAAQ,GAAG,KAAK,EAAE,GAC/C;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,MAAM;AAAA,YAClB,cAAc;AAAA,YACd,UAAU;AAAA,YACV,SAAS;AAAA,YACT,gBAAgB;AAAA,UAClB;AAAA,UAEC,kBAAQ,QAAQ,MAAM,KACrB,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,GAAG,YAAY,KAAK,QAAQ,QAAQ,YAAY,MAAM,MAAM,cAAc,cAAc,GAAG;AAAA;AAAA,MAEpH;AAAA,MACA,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,MAAM,MAAM,SAAS,IAAI,GAAG;AAAA,MAC/E,gBAAAA,OAAC,SAAI,OAAO,EAAE,MAAM,GAAG,YAAY,MAAM,MAAM,cAAc,eAAe,UAAU,SAAS,GAC5F,kBAAQ,QAAQ,OAAO,KACtB,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,GAAG,YAAY,KAAK,QAAQ,QAAQ,YAAY,MAAM,IAAI,cAAc,cAAc,GAAG,GAElH;AAAA,OACF;AAAA,KACF;AAEJ;AAUO,SAAS,iBAAiB,EAAE,aAAAE,cAAa,GAAG,MAAM,GAAU;AACjE,SACE,gBAAAD,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,GAC9D;AAAA,oBAAAD,OAAC,WAAQ,OAAO,EAAE,OAAO,KAAKE,aAAY,OAAO,OAAc;AAAA,IAC/D,gBAAAF,OAAC,WAAQ,OAAO,EAAE,QAAQ,KAAKE,aAAY,QAAQ,OAAc;AAAA,IACjE,gBAAAF,OAAC,WAAQ,OAAO,EAAE,QAAQ,KAAKE,aAAY,QAAQ,OAAc;AAAA,IACjE,gBAAAF,OAAC,WAAQ,OAAO,EAAE,KAAK,KAAKE,aAAY,KAAK,OAAc;AAAA,KAC7D;AAEJ;;;ACzDA,SAAS,YAAAC,kBAAgB;AAsDjB,gBAAAC,QAaQ,QAAAC,eAbR;AAjDR,SAASC,YAAW,SAAiB,QAAQ,OAAe;AAC1D,QAAM,OAAO,oBAAI,KAAK,GAAG,OAAO,WAAW;AAC3C,SAAO,KAAK;AAAA,IAAmB;AAAA,IAAS,QACpC,EAAE,OAAO,SAAS,MAAM,UAAU,IAClC,EAAE,OAAO,SAAS,KAAK,WAAW,MAAM,UAAU;AAAA,EACtD;AACF;AAEA,SAAS,IAAI,KAAoB,WAAW,GAAW;AACrD,SAAO,QAAQ,OAAO,OAAO,GAAG,EAAE,QAAQ,QAAQ,IAAI;AACxD;AAQO,SAAS,aAAa,EAAE,SAAS,SAAS,MAAM,GAAU;AAC/D,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAA0B,CAAC,CAAC;AAClE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAElD,QAAM,MAAM,QAAQ,kBAAkB,OAAO,OAAO,QAAQ,aAAa,IAAI;AAC7E,QAAM,UAAU,QAAQ,sBAAsB,OAAO,OAAO,QAAQ,iBAAiB,IAAI;AAEzF,QAAM,kBACJ,QAAQ,eAAe,QACvB,QAAQ,kBAAkB,QAC1B,QAAQ,mBAAmB,QAC3B,QAAQ,sBAAsB;AAChC,QAAM,eAAe,oBAAI,KAAK,GAAG,QAAQ,aAAa,WAAW;AACjE,QAAM,eAAe,aAAa,QAAQ,IAAI,KAAK,IAAI;AACvD,QAAM,qBAAqB,mBAAmB;AAE9C,QAAM,cAAc,MAAM;AACxB,mBAAe,IAAI;AACnB,QAAI,YAAY,WAAW,GAAG;AAC5B,oBAAc,IAAI;AAClB,uBAAiB,OAAO,EACrB,KAAK,cAAc,EACnB,MAAM,MAAM,eAAe,CAAC,CAAC,CAAC,EAC9B,QAAQ,MAAM,cAAc,KAAK,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,aAAa;AACf,WACE,gBAAAF,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,GAC9D;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,eAAe,KAAK;AAAA,UACnC,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,OAAO,MAAM,MAAM,UAAU,IAAI,YAAY,KAAK,SAAS,GAAG,WAAW,QAAQ,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE;AAAA,UAChM;AAAA;AAAA,MAED;AAAA,MAEC,aACC,gBAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,MAAM,SAAS,SAAS,GAAG,2BAAQ,IAE5E,gBAAAA,OAAC,SAAI,OAAO,EAAE,WAAW,QAAQ,WAAW,IAAI,GAC9C,0BAAAC,QAAC,WAAM,OAAO,EAAE,OAAO,QAAQ,gBAAgB,YAAY,aAAa,SAAS,UAAU,GAAG,GAC5F;AAAA,wBAAAD,OAAC,WAAM,OAAO,EAAE,UAAU,UAAU,KAAK,GAAG,YAAY,MAAM,WAAW,GACvE,0BAAAC,QAAC,QAAG,OAAO,EAAE,cAAc,aAAa,MAAM,IAAI,GAAG,GACnD;AAAA,0BAAAD,OAAC,QAAG,OAAO,EAAE,WAAW,QAAS,YAAY,KAAK,OAAO,MAAM,MAAM,SAAS,aAAa,OAAO,MAAM,GAAG,kBAAI;AAAA,UAC/G,gBAAAA,OAAC,QAAG,OAAO,EAAE,WAAW,SAAS,YAAY,KAAK,OAAO,MAAM,MAAM,SAAS,YAAY,GAAG,sBAAQ;AAAA,UACrG,gBAAAA,OAAC,QAAG,OAAO,EAAE,WAAW,SAAS,YAAY,KAAK,OAAO,MAAM,MAAM,SAAS,YAAY,GAAG,sBAAQ;AAAA,UACrG,gBAAAA,OAAC,QAAG,OAAO,EAAE,WAAW,SAAS,YAAY,KAAK,OAAO,MAAM,MAAM,SAAS,YAAY,GAAG,qBAAO;AAAA,WACtG,GACF;AAAA,QACA,gBAAAA,OAAC,WACE,sBAAY,IAAI,CAAC,MAAM;AACtB,gBAAM,SAAS,EAAE,eAAe,OAAO,OAAO,EAAE,UAAU,IAAI;AAC9D,gBAAM,SAAS,EAAE,kBAAkB,OAAO,OAAO,EAAE,aAAa,IAAI;AACpE,gBAAM,OAAO,WAAW,QAAQ,WAAW,OAAO,UAAU,SAAS;AACrE,gBAAM,WAAW,SAAS,OAAO,MAAM,SAAS,OAAO,MAAM,KAAK,MAAM;AAExE,iBACE,gBAAAC,QAAC,QAAc,OAAO,EAAE,cAAc,aAAa,MAAM,IAAI,GAAG,GAC9D;AAAA,4BAAAD,OAAC,QAAG,OAAO,EAAE,SAAS,SAAS,OAAO,MAAM,KAAK,GAAI,UAAAE,YAAW,EAAE,eAAe,IAAI,GAAE;AAAA,YACvF,gBAAAF,OAAC,QAAG,OAAO,EAAE,SAAS,SAAS,WAAW,SAAS,OAAO,MAAM,MAAM,oBAAoB,eAAe,GAAI,cAAI,MAAM,GAAE;AAAA,YACzH,gBAAAA,OAAC,QAAG,OAAO,EAAE,SAAS,SAAS,WAAW,SAAS,YAAY,KAAK,OAAO,UAAU,oBAAoB,eAAe,GAAI,cAAI,MAAM,GAAE;AAAA,YACxI,gBAAAA,OAAC,QAAG,OAAO,EAAE,SAAS,SAAS,WAAW,SAAS,OAAO,MAAM,MAAM,oBAAoB,eAAe,GACtG,YAAE,mBAAmB,OAAO,aAAa,OAAO,EAAE,cAAc,CAAC,IAAI,UACxE;AAAA,eANO,EAAE,EAOX;AAAA,QAEJ,CAAC,GACH;AAAA,SACF,GACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,oBAAoB;AACtB,WACE,gBAAAC,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,GAC9D;AAAA,sBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,UAAU,SAAS,SAAS,WAAW,aAAa,MAAM,IAAI,IAAI,cAAc,aAAa,MAAM,IAAI,GAAG,GACpL;AAAA,wBAAAD,OAAC,UAAK,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,KAAK,GAAG,4BAAc;AAAA,QAChE,gBAAAA,OAAC,UAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,QAAQ,oBAAoB,eAAe,GACnG,UAAAE,YAAW,QAAQ,aAAa,GACnC;AAAA,SACF;AAAA,MAEA,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAO,EAAE,WAAW,GAAG,SAAS,SAAS,YAAY,QAAQ,QAAQ,aAAa,MAAM,IAAI,IAAI,cAAc,GAAG,OAAO,MAAM,MAAM,UAAU,IAAI,YAAY,KAAK,QAAQ,WAAW,OAAO,QAAQ,WAAW,SAAS;AAAA,UAC1N;AAAA;AAAA,MAED;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,GAC9D;AAAA,oBAAAD,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,OAAO,GAC9D,UAAAE,YAAW,QAAQ,aAAa,GACnC;AAAA,IAEA,gBAAAD,QAAC,WAAM,OAAO,EAAE,OAAO,QAAQ,gBAAgB,YAAY,aAAa,QAAQ,GAC9E;AAAA,sBAAAD,OAAC,WACC,0BAAAC,QAAC,QACC;AAAA,wBAAAD,OAAC,QAAG,OAAO,EAAE,WAAW,QAAQ,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,MAAM,eAAe,GAAG,OAAO,MAAM,GAAG,kBAAM;AAAA,QAC1H,gBAAAA,OAAC,QAAG,OAAO,EAAE,WAAW,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,MAAM,eAAe,EAAE,GAAG,sBAAQ;AAAA,SACjH,GACF;AAAA,MACA,gBAAAC,QAAC,WACE;AAAA,gBAAQ,QACP,gBAAAA,QAAC,QAAG,OAAO,EAAE,WAAW,aAAa,MAAM,IAAI,GAAG,GAChD;AAAA,0BAAAD,OAAC,QAAG,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,MAAM,SAAS,QAAQ,GAAG,iBAAG;AAAA,UACrE,gBAAAA,OAAC,QAAG,OAAO,EAAE,WAAW,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,QAAQ,SAAS,SAAS,oBAAoB,eAAe,GACvI,cAAI,QAAQ,CAAC,GAChB;AAAA,WACF;AAAA,QAED,YAAY,QACX,gBAAAC,QAAC,QAAG,OAAO,EAAE,WAAW,aAAa,MAAM,IAAI,GAAG,GAChD;AAAA,0BAAAD,OAAC,QAAG,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,MAAM,SAAS,QAAQ,GAAG,qBAAO;AAAA,UACzE,gBAAAA,OAAC,QAAG,OAAO,EAAE,WAAW,SAAS,UAAU,IAAI,YAAY,KAAK,OAAO,MAAM,QAAQ,SAAS,SAAS,oBAAoB,eAAe,GACvI,uBAAa,OAAO,GACvB;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,OAAO,EAAE,WAAW,GAAG,SAAS,SAAS,YAAY,QAAQ,QAAQ,aAAa,MAAM,IAAI,IAAI,cAAc,GAAG,OAAO,MAAM,MAAM,UAAU,IAAI,YAAY,KAAK,QAAQ,WAAW,OAAO,QAAQ,WAAW,SAAS;AAAA,QAC1N;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;;;AC3JQ,gBAAAI,QAMF,QAAAC,eANE;AAJR,SAAS,QAAQ,EAAE,SAAS,MAAM,GAAgD;AAChF,SACE,gBAAAA,QAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,YAAY,aAAa,GAC9D;AAAA,YAAQ,YACP,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,QAAQ;AAAA,QACb,KAAI;AAAA,QACJ,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,WAAW,SAAS,cAAc,GAAG,YAAY,EAAE;AAAA;AAAA,IACrF;AAAA,IAEF,gBAAAC,QAAC,SAAI,OAAO,EAAE,UAAU,EAAE,GACxB;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,UAAU;AAAA,YACV,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,YAAY;AAAA,UACd;AAAA,UAEC,kBAAQ;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA,OAAC,SAAI,OAAO,EAAE,UAAU,IAAI,OAAO,MAAM,MAAM,WAAW,EAAE,GACzD,kBAAQ,UAAU,MAAM,GAAG,EAAE,GAChC;AAAA,OACF;AAAA,KACF;AAEJ;AAQO,SAAS,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAU;AAC1D,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,gBAAAA,OAAC,SAAI,OAAO,EAAE,OAAO,MAAM,MAAM,UAAU,GAAG,GAAI,YAAE,QAAO;AAAA,EACpE;AAEA,SACE,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,GAC7D,eAAK,IAAI,CAAC,SAAS,MAClB,gBAAAA,OAAC,WAAgB,SAAkB,SAArB,CAAmC,CAClD,GACH;AAEJ;;;AZ8GQ,gBAAAE,QA+BA,QAAAC,eA/BA;AArID,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,QAAQC,UAAQ,MAAM,kBAAkB,MAAM,GAAG,CAAC,MAAM,CAAC;AAC/D,QAAM,IAAIA;AAAA,IACR,MAAM,qBAAqB,OAAO,MAAM,eAAe;AAAA,IACvD,CAAC,OAAO,IAAI;AAAA,EACd;AACA,QAAM,aACJ,OAAO,eAAe;AAExB,QAAM,eAAeC,SAAuB,IAAI;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,WAAS,GAAG;AACxD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAA2B,IAAI;AACjE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAmB,CAAC,CAAC;AAC7D,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAmB,CAAC,CAAC;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAiC,IAAI;AACvE,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAwB,CAAC,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAA+B,IAAI;AAEjE,QAAM,SAASF;AAAA,IACb,MAAM,mBAAmB,qBAAqB,WAAW,SAAS;AAAA,IAClE,CAAC,mBAAmB,WAAW,SAAS;AAAA,EAC1C;AACA,QAAMG,eAAcH;AAAA,IAClB,MAAM,gBAAgB,WAAW,YAAY,IAAI;AAAA,IACjD,CAAC,WAAW,QAAQ;AAAA,EACtB;AAEA,EAAAI,YAAU,MAAM;AACd,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,MAAM,OAAO,mBAAmB,YAAa;AAClD,UAAM,SAAS,CAAC,MAAc;AAC5B,UAAI,IAAI,EAAG,mBAAkB,CAAC;AAAA,IAChC;AACA,WAAO,GAAG,sBAAsB,EAAE,KAAK;AACvC,UAAM,WAAW,IAAI;AAAA,MAAe,CAAC,CAAC,KAAK,MACzC,OAAO,MAAM,YAAY,KAAK;AAAA,IAChC;AACA,aAAS,QAAQ,EAAE;AACnB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,UAAU,OAAO,KAAK,WAAW,EAAG;AAChD,iBAAa,IAAI;AACjB,mBAAe,OAAO,EAAE,KAAK,CAAC,SAAS;AACrC,UAAI,KAAM,cAAa,IAAI;AAAA,IAC7B,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,CAAC;AAEZ,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,sBAAkB,UAAU,QAAQ,IAAI,EAAE,KAAK,eAAe;AAAA,EAChE,GAAG,CAAC,WAAW,MAAM,CAAC;AAEtB,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,QAAI,cAAc,MAAM;AACtB,sBAAgB,YAAY;AAC5B;AAAA,IACF;AACA,sBAAkB,UAAU,QAAQ,SAAS,EAAE,KAAK,eAAe;AAAA,EACrE,GAAG,CAAC,WAAW,QAAQ,WAAW,YAAY,CAAC;AAE/C,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,OAAO,aAAc;AAC1B,eAAW,IAAI;AACf,kBAAc,OAAO,EAClB,KAAK,UAAU,EACf,MAAM,MAAM,WAAW,IAAI,CAAC;AAAA,EACjC,GAAG,CAAC,SAAS,OAAO,YAAY,CAAC;AAEjC,EAAAA,YAAU,MAAM;AACd,sBAAkB,OAAO,QAAQ,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE;AAAA,MAC1D,CAAC,aAAa;AACZ,YAAI,SAAU,SAAQ,SAAS,MAAM,GAAG,CAAC,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,MAAM,OAAO,CAAC;AAEzB,QAAM,aAAa,aAAa,aAAa,SAAS,CAAC;AACvD,QAAM,eAAe,OAAO,SAAS,YAAY,SAAS;AAC1D,QAAM,cAAc,aAAa,WAAW,QAAQ,WAAW,OAAO;AACtE,QAAM,iBAAiB,YAAY,OAC9B,cAAc,WAAW,OAAQ,MAClC;AACJ,QAAMC,eAAcL;AAAA,IAClB,MAAM,gBAAgB,YAAY;AAAA,IAClC,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,SAAS,kBAAkB;AACjC,QAAM,cAAc,OAAO,eAAe,CAAC,CAAC;AAC5C,QAAM,aAAa,OAAO,cAAc,YAAY,UAAU;AAE9D,QAAM,YAA2B;AAAA,IAC/B,YAAY,MAAM;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ,aAAa,MAAM,IAAI;AAAA,IAC/B,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAEA,QAAM,eAA8B;AAAA,IAClC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA,OAAO,MAAM;AAAA,QACb,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,MAGA;AAAA,wBAAAD,OAAC,SAAI,OAAO,WACV,0BAAAA;AAAA,UAACQ;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAaH;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF,GACF;AAAA,QAGA,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,eAAe,SAAS,QAAQ;AAAA,cAChC,KAAK;AAAA,cACL,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD,OAAC,SAAI,OAAO,EAAE,GAAG,WAAW,MAAM,SAAS,UAAU,EAAE,GACrD,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT;AAAA,kBACA,mBAAmB;AAAA,kBACnB,eAAe;AAAA,kBACf;AAAA;AAAA,cACF,GACF;AAAA,cACA,gBAAAC,QAAC,SAAI,OAAO,EAAE,GAAG,WAAW,MAAM,SAAS,UAAU,EAAE,GACrD;AAAA,gCAAAD,OAAC,SAAI,OAAO,cAAe,YAAE,eAAc;AAAA,gBAC3C,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA,aAAaK;AAAA,oBACb;AAAA,oBACA;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAGA,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,eAAe,SAAS,QAAQ;AAAA,cAChC,UAAU;AAAA,cACV,KAAK;AAAA,cACL,YAAY,SAAS,eAAe;AAAA,YACtC;AAAA,YAEA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,EAAE,GAAG,WAAW,MAAM,GAAG,UAAU,KAAK,QAAQ,UAAU;AAAA,kBAEjE;AAAA,oCAAAD,OAAC,SAAI,OAAO,cAAe,YAAE,aAAY;AAAA,oBACzC,gBAAAA,OAAC,oBAAiB,aAAaO,cAAa,GAAM,OAAc;AAAA;AAAA;AAAA,cAClE;AAAA,cAEC,OAAO,gBAAgB,WACtB,gBAAAN;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,EAAE,GAAG,WAAW,MAAM,GAAG,UAAU,KAAK,QAAQ,UAAU;AAAA,kBAEjE;AAAA,oCAAAD,OAAC,SAAI,OAAO,cAAc,2BAAa;AAAA,oBACvC,gBAAAA,OAAC,gBAAa,SAAkB,SAAkB,OAAc;AAAA;AAAA;AAAA,cAClE;AAAA,cAGD,eACC,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,EAAE,GAAG,WAAW,MAAM,GAAG,UAAU,KAAK,QAAQ,UAAU;AAAA,kBAEjE;AAAA,oCAAAD,OAAC,SAAI,OAAO,cAAc,+BAAiB;AAAA,oBAC3C,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC;AAAA,wBACA;AAAA,wBACA,WAAW;AAAA,wBACX,MAAK;AAAA;AAAA,oBACP;AAAA;AAAA;AAAA,cACF;AAAA,cAGF,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,EAAE,GAAG,WAAW,MAAM,GAAG,UAAU,KAAK,QAAQ,UAAU;AAAA,kBAEjE;AAAA,oCAAAD,OAAC,SAAI,OAAO,cACT,sBAAY,UAAU,UAAU,IAAI,UAAU,EAAE,aACnD;AAAA,oBACA,gBAAAA,OAAC,oBAAiB,MAAY,GAAM,OAAc;AAAA;AAAA;AAAA,cACpD;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADpOQ,gBAAAS,cAAA;AAbR,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2D;AACzD,EAAAC,YAAU,MAAM;AACd,mBAAe,OAAO,eAAe,kBAAkB;AAAA,EACzD,GAAG,CAAC,OAAO,WAAW,CAAC;AAEvB,SACE,gBAAAD,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,iBAAgB,MAAY,SAAO,MACrE,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF,GACF;AAEJ;AAGO,SAAS,cAAc,OAA2B;AACvD,SAAO,gBAAAA,OAAC,iBAAe,GAAG,OAAO;AACnC;AAGO,SAAS,cAAc,OAA2B;AACvD,SAAO,gBAAAA,OAAC,iBAAe,GAAG,OAAO,mBAAkB,SAAQ;AAC7D;AAGO,SAAS,cAAc,OAA2B;AACvD,SAAO,gBAAAA,OAAC,iBAAe,GAAG,OAAO,mBAAkB,SAAQ;AAC7D;AAGO,SAAS,eAAe,OAA2B;AACxD,SAAO,gBAAAA,OAAC,iBAAe,GAAG,OAAO,mBAAkB,UAAS;AAC9D;;;AczDA,SAAS,aAAAE,mBAAiB;AAwBlB,gBAAAC,cAAA;AARD,SAAS,aAAa,EAAE,QAAQ,QAAQ,MAAM,IAAI,GAAuB;AAC9E,EAAAC,YAAU,MAAM;AACd,mBAAe,OAAO,WAAW;AAAA,EACnC,GAAG,CAAC,OAAO,WAAW,CAAC;AAEvB,SACE,gBAAAD,OAAC,mBAAQ,OAAO,QACd,0BAAAA,OAAC,gBAAQ,iBAAR,EAAwB,YAAW,gBAAe,MAAY,SAAO,MACpE,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAS;AAAA;AAAA,EACX,GACF,GACF;AAEJ;","names":["createContext","useContext","useEffect","useState","useEffect","useRef","useState","jsx","jsx","jsx","jsx","jsxs","useState","useRef","useEffect","useState","isLight","jsx","jsxs","useState","triggerStyle","contentStyle","DropdownMenu","useState","FaChevronDown","HiCheck","jsx","jsxs","useState","triggerStyle","contentStyle","FaChevronDown","HiCheck","DropdownMenu","useState","FaChevronDown","jsx","jsxs","useState","contentStyle","FaChevronDown","jsx","useState","jsx","baseStyle","buttonStyle","useState","jsx","useState","jsx","jsx","React","jsx","jsxs","React","React","jsx","jsxs","daysInMonth","jsx","jsxs","useEffect","useState","jsx","useState","useEffect","useEffect","useRef","useState","jsx","jsxs","useState","useEffect","useRef","forwardRef","useMemo","useRef","useState","jsx","jsxs","alpha","forwardRef","useRef","useState","useMemo","jsx","createContext","useContext","buttonStyle","useState","useEffect","useEffect","useRef","useState","jsx","jsx","eventTime","timeZone","shift","offset","str","jsx","jsxs","React","useLayoutEffect","useRef","jsx","jsxs","useRef","useLayoutEffect","React","Popover","jsx","jsxs","jsx","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useRef","useEffect","useRef","useState","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","signal","jsx","Fragment","jsx","jsxs","useState","useEffect","useRef","useEffect","useRef","useState","groupEventsByDate","eventTime","convertUtcToLocalYMD","React","useMemo","useState","getDateFilterData","DropdownMenu","useState","FaChevronDown","HiCheck","jsx","jsxs","Dropdown","useState","triggerStyle","contentStyle","FaChevronDown","HiCheck","useEffect","useState","jsx","LangDropdown","useState","useEffect","Dropdown","Popover","useEffect","useState","jsx","jsxs","daysInMonth","useEffect","useState","jsx","jsxs","DateRangePicker","useState","useEffect","Popover","useEffect","useMemo","useState","Fragment","jsx","jsxs","offset","titleStyle","Fragment","jsx","jsxs","allTimeZones","useState","React","titleStyle","EconomicCalendarFilters","countryOptions","getDateFilterData","Dropdown","DateRangePicker","LangDropdown","useMemo","Chip","Popover","HiInformationCircle","jsx","ImpactBadge","useMemo","useState","Popover","PopoverContent","PopoverPortal","PopoverTrigger","useEffect","useRef","jsx","jsxs","Fragment","jsx","jsxs","useState","useMemo","Popover","PopoverTrigger","PopoverPortal","PopoverContent","jsx","jsxs","buildEconomicCalendarTable","HiInformationCircle","ImpactBadge","instruments","React","jsx","buttonStyle","arr","React","useLayoutEffect","useRef","jsx","jsxs","ComplexTable","Fragment","jsx","jsxs","Fragment","jsx","jsxs","formatSelectedLang","useState","useRef","useEffect","groupEventsByDate","buildEconomicCalendarTable","EconomicCalendarFilters","ComplexTable","jsx","useCallback","useEffect","useRef","useState","useEffect","useMemo","useRef","useState","jsx","jsx","jsxs","jsx","jsxs","createContext","useContext","forwardRef","jsx","WidgetContainer","forwardRef","forwardRef","useState","jsx","Button","forwardRef","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","withAlpha","alpha","ScrollContainer","forwardRef","useRef","useLayoutEffect","useState","useMemo","jsx","createContext","useContext","brandedElements","WidgetContainer","ScrollContainer","Button","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","Document","jsx","jsxs","numPages","Fragment","jsx","jsxs","useState","useEffect","Fragment","jsx","useState","useEffect","useRef","useCallback","useEffect","useState","useRef","jsx","jsx","useRef","useEffect","useState","jsx","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useRef","useEffect","useRef","useState","Fragment","jsx","jsxs","useState","useEffect","useRef","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","useState","useEffect","t","useRef","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useState","useEffect","useMemo","useRef","useCallback","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","contentStyle","useMemo","useEffect","useState","Fragment","jsx","jsxs","jsx","jsxs","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","clamp","useRef","useState","useCallback","useLayoutEffect","useEffect","useMemo","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","Fragment","useEffect","useEffect","useMemo","useRef","useState","hexToRgb","jsx","jsx","jsxs","SANS_STACK","inputStyle","useState","jsx","jsxs","SANS_STACK","useState","useEffect","useState","HiArrowRight","useEffect","useMemo","useState","useEffect","useId","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","MONTHS","fmt","jsx","jsxs","jsx","Fragment","jsx","jsxs","down","withAlpha","alpha","jsx","jsx","jsxs","SANS_STACK","useMemo","useEffect","useState","jsx","useEffect","useRef","jsx","jsxs","Fragment","jsx","jsxs","useState","HiArrowRight","useEffect","useEffect","useRef","useEffect","useState","jsx","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","useEffect","HiOutlineArrowLeft","HiOutlineClock","jsx","jsxs","HiOutlineArrowLeft","HiOutlineClock","jsx","jsxs","useEffect","useState","useMemo","Fragment","jsx","jsxs","useState","useMemo","useEffect","jsx","jsxs","useRef","useEffect","jsx","jsx","jsxs","useState","offset","useRef","useEffect","useMemo","jsx","SANS_STACK","resolveChartTheme","useEffect","useEffect","useEffect","useMemo","useRef","useState","HiOutlineMagnifyingGlass","jsx","jsxs","jsx","jsxs","HiOutlineMagnifyingGlass","useState","FaXTwitter","FaWhatsapp","jsx","jsxs","jsx","CategoryPill","jsx","jsxs","CategoryPill","jsx","jsxs","CategoryPill","jsx","jsxs","jsx","useEffect","useMemo","useState","useState","jsx","Fragment","jsx","jsxs","down","jsx","withAlpha","alpha","jsx","jsxs","useMemo","useState","useEffect","jsx","jsxs","useEffect","useRef","jsx","jsx","jsxs","jsx","jsxs","FALLBACK_CATEGORY_COLOR","useState","offset","useRef","useMemo","useEffect","jsx","SANS_STACK","resolveBool","resolveStr","resolveChartTheme","useEffect","useEffect","useMemo","useState","HiOutlineMagnifyingGlass","jsx","jsxs","NewsTabs","jsx","jsxs","DashboardHeader","NewsTabs","HiOutlineMagnifyingGlass","useEffect","useMemo","useRef","useState","INITIAL_VISIBLE","useState","offset","useRef","useEffect","useMemo","jsx","jsx","jsxs","Fragment","jsx","jsxs","jsx","useId","useMemo","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","offset","pad","jsx","createContext","useContext","useState","useEffect","useRef","useCallback","offset","useMemo","useEffect","useMemo","useState","jsx","jsxs","allTimeZones","useState","useEffect","useMemo","useMemo","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","jsx","jsxs","jsx","LoadMoreButton","jsx","jsxs","EmptyState","useCallback","useEffect","useRef","useState","useRef","useState","useCallback","useEffect","jsx","jsxs","useId","useMemo","EmptyState","LoadMoreButton","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","FiShare2","FaXTwitter","FaWhatsapp","FaFacebookF","jsx","jsxs","shareTargets","circle","ArticleActions","jsx","CategoryPill","jsx","jsxs","META_COLOR","HeroFeature","CategoryPill","ArticleActions","jsx","jsxs","SIZES","StoryRow","CategoryPill","ArticleActions","jsx","jsxs","StoryList","StoryRow","jsx","FeaturedAside","useId","useMemo","useAutoAnimate","jsx","jsxs","useId","useMemo","useAutoAnimate","jsx","jsxs","NewsAside","jsx","jsxs","HeroFeature","FeaturedAside","StoryList","NewsAside","jsx","jsxs","jsx","jsxs","FALLBACK_CATEGORY_COLOR","useState","useMemo","DashboardHeader","SANS_STACK","HEADLINE_SERIF","resolveChartTheme","jsx","useEffect","jsx","useEffect","useCallback","useEffect","useRef","useState","URL","useEffect","useState","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useEffect","useRef","jsx","useRef","useEffect","jsx","jsxs","useEffect","useRef","jsx","jsxs","useRef","useEffect","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","parseChange","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","useEffect","jsx","jsxs","SANS","jsx","useEffect","useEffect","useMemo","useRef","useState","jsx","jsx","jsxs","NF_RESIZE_SOURCE","FALLBACK","useState","useRef","useEffect","useMemo","useEffect","useMemo","useRef","useState","withAlpha","alpha","jsx","useEffect","useId","useState","jsx","jsxs","useState","useEffect","useId","jsx","jsxs","jsx","jsxs","jsx","useRef","useMemo","useState","useEffect","data","titleStyle","useEffect","useMemo","useRef","useState","createContext","useContext","forwardRef","useEffect","useRef","useState","useEffect","useState","jsx","Logo","useState","useEffect","jsx","jsxs","sideOf","parsePx","roundedForSide","anchorStyle","getInitialMode","CtaButton","useState","useRef","useEffect","Logo","jsx","jsxs","WidgetContainer","forwardRef","CtaButton","forwardRef","useState","jsx","Button","forwardRef","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","withAlpha","alpha","ScrollContainer","forwardRef","useRef","useLayoutEffect","useState","useMemo","jsx","createContext","useContext","brandedElements","WidgetContainer","ScrollContainer","Button","Fragment","jsx","jsxs","useState","useRef","useEffect","wrapperStyle","useMemo","titleStyle","baseStyle","useEffect","useEffect","useMemo","useRef","useState","useState","jsx","jsxs","jsx","jsxs","AssetHeader","formatPrice","Fragment","jsx","jsxs","jsx","jsxs","formatPrice","jsx","jsxs","performance","useState","jsx","jsxs","formatDate","useState","jsx","jsxs","jsx","jsxs","useMemo","useRef","useState","formatPrice","useEffect","performance","AssetHeader","jsx","useEffect","useEffect","jsx","useEffect"]}