{"id":12909,"date":"2026-10-07T21:15:32","date_gmt":"2026-10-07T21:15:32","guid":{"rendered":"https:\/\/cofdar.com\/?page_id=12909"},"modified":"2026-10-13T14:16:47","modified_gmt":"2026-10-13T14:16:47","slug":"cofdar-coffee-intelligence","status":"publish","type":"page","link":"https:\/\/cofdar.com\/en\/cofdar-coffee-intelligence\/","title":{"rendered":"Cofdar Coffee Intelligence"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12909\" class=\"elementor elementor-12909\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ac1426e elementor-section-boxed elementor-section-height-default elementor-section-height-default rt-parallax-bg-no\" data-id=\"ac1426e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9377090\" data-id=\"9377090\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-521fa46 elementor-widget elementor-widget-html\" data-id=\"521fa46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<div id=\"cofdar-prices-tape-en\" dir=\"ltr\">\r\n\r\n  <div class=\"cpt-head\">\r\n    <div class=\"cpt-brand\">\r\n      <span class=\"cpt-live\"><\/span>\r\n      <strong>Daily Coffee Price Indicators via Cofdar<\/strong>\r\n    <\/div>\r\n\r\n    <div class=\"cpt-date\" id=\"cptDateEn\">\r\n      ICO \u00b7 Loading latest data\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"cpt-window\">\r\n    <div class=\"cpt-track\" id=\"cptTrackEn\"><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"cpt-foot\">\r\n    <span>Source: International Coffee Organization (ICO)<\/span>\r\n    <span>Unit: US cents\/lb<\/span>\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<style>\r\n#cofdar-prices-tape-en {\r\n  --navy: #0B1F3A;\r\n  --blue: #2B406F;\r\n  --olive: #6F7752;\r\n  --brown: #B27244;\r\n  --group-gap: 28px;\r\n\r\n  width: 100% !important;\r\n  max-width: 100% !important;\r\n  min-width: 0 !important;\r\n  margin: 0 !important;\r\n\r\n  overflow: hidden;\r\n\r\n  background: linear-gradient(\r\n    105deg,\r\n    #0B1F3A 0%,\r\n    #162F55 55%,\r\n    #2B406F 100%\r\n  );\r\n\r\n  color: #FFFFFF;\r\n  border: 1px solid rgba(255,255,255,.09);\r\n  box-shadow: 0 10px 26px rgba(11,31,58,.14);\r\n  font-family: inherit !important;\r\n}\r\n\r\n#cofdar-prices-tape-en *,\r\n#cofdar-prices-tape-en *::before,\r\n#cofdar-prices-tape-en *::after {\r\n  box-sizing: border-box;\r\n  font-family: inherit !important;\r\n}\r\n\r\n\/* HEADER *\/\r\n\r\n#cofdar-prices-tape-en .cpt-head {\r\n  min-height: 48px;\r\n  padding: 0 16px;\r\n\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 14px;\r\n\r\n  border-bottom: 1px solid rgba(255,255,255,.10);\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-brand {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 9px;\r\n  min-width: 0;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-brand strong {\r\n  color: #FFFFFF;\r\n  font-size: 16px;\r\n  font-weight: 800;\r\n  line-height: 1.25;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-live {\r\n  width: 8px;\r\n  height: 8px;\r\n  flex: 0 0 8px;\r\n  border-radius: 50%;\r\n  background: var(--brown);\r\n  animation: cptPulseEn 1.8s infinite;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-date {\r\n  color: rgba(255,255,255,.68);\r\n  font-size: 10px;\r\n  font-weight: 600;\r\n  white-space: nowrap;\r\n}\r\n\r\n\/* TICKER WINDOW *\/\r\n\r\n#cofdar-prices-tape-en .cpt-window {\r\n  width: 100%;\r\n  max-width: 100%;\r\n  min-width: 0;\r\n  overflow: hidden;\r\n  direction: ltr;\r\n  position: relative;\r\n}\r\n\r\n\/* MOVING TRACK *\/\r\n\r\n#cofdar-prices-tape-en .cpt-track {\r\n  display: flex;\r\n  align-items: stretch;\r\n  gap: var(--group-gap);\r\n\r\n  width: max-content;\r\n  min-width: max-content;\r\n\r\n  --travel: 0px;\r\n  --duration: 32s;\r\n\r\n  animation: cptMoveEn var(--duration) linear infinite;\r\n  will-change: transform;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-group {\r\n  display: flex;\r\n  flex: 0 0 auto;\r\n  align-items: stretch;\r\n  width: max-content;\r\n}\r\n\r\n\/* PRICE ITEM *\/\r\n\r\n#cofdar-prices-tape-en .cpt-item {\r\n  position: relative;\r\n\r\n  min-width: 205px;\r\n  height: 68px;\r\n  flex: 0 0 auto;\r\n\r\n  display: grid;\r\n  grid-template-columns: minmax(0,1fr) auto;\r\n  grid-template-rows: auto auto;\r\n  align-content: center;\r\n\r\n  column-gap: 12px;\r\n  row-gap: 5px;\r\n  padding: 10px 17px;\r\n\r\n  direction: ltr;\r\n\r\n  border-right: 1px solid rgba(255,255,255,.10);\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-item::after {\r\n  content: \"\";\r\n  position: absolute;\r\n  bottom: 0;\r\n  left: 0;\r\n  width: 32px;\r\n  height: 3px;\r\n  background: var(--brown);\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-name {\r\n  color: #BFCADB;\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n  white-space: nowrap;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-price {\r\n  grid-column: 2;\r\n  grid-row: 1 \/ 3;\r\n  align-self: center;\r\n\r\n  color: #FFFFFF;\r\n  direction: ltr;\r\n  white-space: nowrap;\r\n\r\n  font-size: 23px;\r\n  font-weight: 900;\r\n  line-height: 1;\r\n  font-variant-numeric: tabular-nums;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-change {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 5px;\r\n  width: max-content;\r\n\r\n  direction: ltr;\r\n  white-space: nowrap;\r\n\r\n  font-size: 11px;\r\n  line-height: 1;\r\n  font-weight: 800;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-change.up {\r\n  color: #B9CC98;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-change.down {\r\n  color: #EAA06C;\r\n}\r\n\r\n#cofdar-prices-tape-en .cpt-change.flat {\r\n  color: #C3CDDA;\r\n}\r\n\r\n\/* FOOTER *\/\r\n\r\n#cofdar-prices-tape-en .cpt-foot {\r\n  min-height: 27px;\r\n  padding: 5px 16px;\r\n\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 12px;\r\n\r\n  background: rgba(5,18,35,.24);\r\n  border-top: 1px solid rgba(255,255,255,.06);\r\n\r\n  color: rgba(255,255,255,.65);\r\n  font-size: 9px;\r\n}\r\n\r\n\/* SEAMLESS MOVEMENT *\/\r\n\r\n@keyframes cptMoveEn {\r\n  from {\r\n    transform: translate3d(0,0,0);\r\n  }\r\n\r\n  to {\r\n    transform: translate3d(\r\n      calc(-1 * var(--travel)),\r\n      0,\r\n      0\r\n    );\r\n  }\r\n}\r\n\r\n@keyframes cptPulseEn {\r\n  0% {\r\n    box-shadow: 0 0 0 0 rgba(178,114,68,.50);\r\n  }\r\n\r\n  70% {\r\n    box-shadow: 0 0 0 8px rgba(178,114,68,0);\r\n  }\r\n\r\n  100% {\r\n    box-shadow: 0 0 0 0 rgba(178,114,68,0);\r\n  }\r\n}\r\n\r\n\/* MOBILE *\/\r\n\r\n@media (max-width:767px) {\r\n\r\n  #cofdar-prices-tape-en {\r\n    width: 100% !important;\r\n    max-width: 100% !important;\r\n    min-width: 0 !important;\r\n\r\n    left: auto !important;\r\n    right: auto !important;\r\n    transform: none !important;\r\n    margin: 0 !important;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-head {\r\n    min-height: auto;\r\n    display: block;\r\n    padding: 12px 13px 10px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-brand {\r\n    margin-bottom: 6px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-brand strong {\r\n    font-size: 15px;\r\n    line-height: 1.35;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-date {\r\n    padding-left: 17px;\r\n    font-size: 9px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-item {\r\n    min-width: 154px;\r\n    width: 154px;\r\n    height: 78px;\r\n\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: flex-start;\r\n    justify-content: center;\r\n\r\n    gap: 6px;\r\n    padding: 10px 13px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-name {\r\n    order: 1;\r\n    width: 100%;\r\n    font-size: 9px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-price {\r\n    order: 2;\r\n    grid-column: auto;\r\n    grid-row: auto;\r\n\r\n    width: 100%;\r\n    text-align: left;\r\n    font-size: 24px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-change {\r\n    order: 3;\r\n    font-size: 10px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-foot {\r\n    padding: 5px 12px;\r\n    font-size: 7.5px;\r\n  }\r\n}\r\n\r\n\/* VERY SMALL PHONES *\/\r\n\r\n@media (max-width:370px) {\r\n\r\n  #cofdar-prices-tape-en .cpt-item {\r\n    min-width: 144px;\r\n    width: 144px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-price {\r\n    font-size: 22px;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-foot span:first-child {\r\n    display: none;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-foot {\r\n    justify-content: center;\r\n  }\r\n}\r\n\r\n\/* REDUCED MOTION *\/\r\n\r\n@media (prefers-reduced-motion:reduce) {\r\n\r\n  #cofdar-prices-tape-en .cpt-track,\r\n  #cofdar-prices-tape-en .cpt-live {\r\n    animation: none !important;\r\n  }\r\n\r\n  #cofdar-prices-tape-en .cpt-window {\r\n    overflow-x: auto;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  const root = document.getElementById(\r\n    \"cofdar-prices-tape-en\"\r\n  );\r\n\r\n  if (!root || root.dataset.initialized === \"1\") {\r\n    return;\r\n  }\r\n\r\n  root.dataset.initialized = \"1\";\r\n\r\n  const WORKER =\r\n    \"https:\/\/cofdar-ico-prices.bandarbiz.workers.dev\/\";\r\n\r\n  const STORAGE_KEY =\r\n    \"cofdar_daily_coffee_prices\";\r\n\r\n  const track = root.querySelector(\r\n    \"#cptTrackEn\"\r\n  );\r\n\r\n  const dateEl = root.querySelector(\r\n    \"#cptDateEn\"\r\n  );\r\n\r\n  const windowEl = root.querySelector(\r\n    \".cpt-window\"\r\n  );\r\n\r\n  if (!track || !dateEl || !windowEl) {\r\n    return;\r\n  }\r\n\r\n  const LABELS = {\r\n    icip: \"ICO Composite Indicator\",\r\n    colombian_milds: \"Colombian Milds\",\r\n    other_milds: \"Other Milds\",\r\n    brazilian_naturals: \"Brazilian Naturals\",\r\n    robustas: \"Robustas\"\r\n  };\r\n\r\n  const ORDER = [\r\n    \"icip\",\r\n    \"colombian_milds\",\r\n    \"other_milds\",\r\n    \"brazilian_naturals\",\r\n    \"robustas\"\r\n  ];\r\n\r\n  \/*\r\n   * Fallback data.\r\n   * Latest prices are retrieved from Cofdar Worker.\r\n   *\/\r\n\r\n  const FALLBACK = {\r\n    ok: true,\r\n    date: \"2026-10-07\",\r\n    previous_date: \"2026-10-06\",\r\n    prices: {\r\n      icip: {\r\n        price: 261.59,\r\n        change: -2.98\r\n      },\r\n      colombian_milds: {\r\n        price: 357.55,\r\n        change: -2.86\r\n      },\r\n      other_milds: {\r\n        price: 331.68,\r\n        change: -3.09\r\n      },\r\n      brazilian_naturals: {\r\n        price: 292.50,\r\n        change: -3.40\r\n      },\r\n      robustas: {\r\n        price: 168.74,\r\n        change: -2.26\r\n      }\r\n    }\r\n  };\r\n\r\n  let currentData = FALLBACK;\r\n  let lastWindowWidth = 0;\r\n\r\n  \/*\r\n   * Use the latest successfully cached prices.\r\n   *\/\r\n\r\n  try {\r\n    const saved = localStorage.getItem(\r\n      STORAGE_KEY\r\n    );\r\n\r\n    if (saved) {\r\n      const parsed = JSON.parse(saved);\r\n\r\n      if (\r\n        parsed &&\r\n        parsed.prices &&\r\n        parsed.date\r\n      ) {\r\n        currentData = parsed;\r\n      }\r\n    }\r\n  } catch (e) {}\r\n\r\n  function formatPrice(value) {\r\n    return new Intl.NumberFormat(\r\n      \"en-US\",\r\n      {\r\n        minimumFractionDigits: 2,\r\n        maximumFractionDigits: 2\r\n      }\r\n    ).format(Number(value));\r\n  }\r\n\r\n  function formatDate(value) {\r\n    try {\r\n      return new Intl.DateTimeFormat(\r\n        \"en-GB\",\r\n        {\r\n          day: \"numeric\",\r\n          month: \"long\",\r\n          year: \"numeric\"\r\n        }\r\n      ).format(\r\n        new Date(value + \"T12:00:00\")\r\n      );\r\n    } catch (e) {\r\n      return value;\r\n    }\r\n  }\r\n\r\n  function changeState(value) {\r\n    const n = Number(value);\r\n\r\n    if (n > 0) {\r\n      return {\r\n        className: \"up\",\r\n        arrow: \"\u25b2\"\r\n      };\r\n    }\r\n\r\n    if (n < 0) {\r\n      return {\r\n        className: \"down\",\r\n        arrow: \"\u25bc\"\r\n      };\r\n    }\r\n\r\n    return {\r\n      className: \"flat\",\r\n      arrow: \"\u2022\"\r\n    };\r\n  }\r\n\r\n  function buildItem(key, data) {\r\n    const row = data.prices[key];\r\n\r\n    if (!row) {\r\n      return \"\";\r\n    }\r\n\r\n    const state = changeState(\r\n      row.change\r\n    );\r\n\r\n    return `\r\n      <div class=\"cpt-item\">\r\n\r\n        <span class=\"cpt-name\">\r\n          ${LABELS[key]}\r\n        <\/span>\r\n\r\n        <strong class=\"cpt-price\">\r\n          ${formatPrice(row.price)}\r\n        <\/strong>\r\n\r\n        <span class=\"cpt-change ${state.className}\">\r\n          <span>${state.arrow}<\/span>\r\n          <span>\r\n            ${Math.abs(Number(row.change)).toFixed(2)}%\r\n          <\/span>\r\n        <\/span>\r\n\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  \/*\r\n   * SEAMLESS LOOP\r\n   *\r\n   * Build one set of indicators.\r\n   * Measure its actual width.\r\n   * Add a small gap between sets.\r\n   * Duplicate enough sets to fill wide screens.\r\n   * Move by exactly one set plus the gap.\r\n   *\/\r\n\r\n  function render(data) {\r\n    const items = ORDER\r\n      .filter(function (key) {\r\n        return (\r\n          data.prices &&\r\n          data.prices[key] &&\r\n          Number.isFinite(\r\n            Number(data.prices[key].price)\r\n          )\r\n        );\r\n      })\r\n      .map(function (key) {\r\n        return buildItem(key, data);\r\n      })\r\n      .join(\"\");\r\n\r\n    if (!items) {\r\n      return;\r\n    }\r\n\r\n    \/* Pause animation during measurement *\/\r\n\r\n    track.style.animation = \"none\";\r\n\r\n    \/* Original indicator group *\/\r\n\r\n    track.innerHTML = `\r\n      <div class=\"cpt-group\">\r\n        ${items}\r\n      <\/div>\r\n    `;\r\n\r\n    const firstGroup = track.querySelector(\r\n      \".cpt-group\"\r\n    );\r\n\r\n    if (!firstGroup) {\r\n      return;\r\n    }\r\n\r\n    const groupWidth =\r\n      firstGroup.getBoundingClientRect().width;\r\n\r\n    const gap =\r\n      parseFloat(\r\n        getComputedStyle(track).columnGap\r\n      ) || 28;\r\n\r\n    const windowWidth =\r\n      windowEl.getBoundingClientRect().width;\r\n\r\n    if (\r\n      groupWidth <= 0 ||\r\n      windowWidth <= 0\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    \/*\r\n     * Width of a complete indicator set\r\n     * including the space after it.\r\n     *\/\r\n\r\n    const cycleWidth = groupWidth + gap;\r\n\r\n    \/*\r\n     * Enough copies to cover the visible\r\n     * area throughout the animation.\r\n     *\/\r\n\r\n    const copies = Math.max(\r\n      2,\r\n      Math.ceil(windowWidth \/ cycleWidth) + 2\r\n    );\r\n\r\n    const groupHTML = `\r\n      <div class=\"cpt-group\" aria-hidden=\"true\">\r\n        ${items}\r\n      <\/div>\r\n    `;\r\n\r\n    for (let i = 1; i < copies; i++) {\r\n      track.insertAdjacentHTML(\r\n        \"beforeend\",\r\n        groupHTML\r\n      );\r\n    }\r\n\r\n    \/* Exact travel distance *\/\r\n\r\n    track.style.setProperty(\r\n      \"--travel\",\r\n      cycleWidth + \"px\"\r\n    );\r\n\r\n    \/*\r\n     * Constant movement speed.\r\n     * Desktop: 36 pixels\/second.\r\n     * Mobile: 42 pixels\/second.\r\n     *\/\r\n\r\n    const speed =\r\n      window.matchMedia(\"(max-width:767px)\")\r\n        .matches\r\n        ? 42\r\n        : 36;\r\n\r\n    const duration =\r\n      cycleWidth \/ speed;\r\n\r\n    track.style.setProperty(\r\n      \"--duration\",\r\n      duration.toFixed(2) + \"s\"\r\n    );\r\n\r\n    dateEl.textContent =\r\n      \"ICO \u00b7 \" + formatDate(data.date);\r\n\r\n    \/* Restart only after reconstruction *\/\r\n\r\n    void track.offsetWidth;\r\n\r\n    track.style.animation = \"\";\r\n  }\r\n\r\n  \/* Initial render *\/\r\n\r\n  render(currentData);\r\n\r\n  \/*\r\n   * Fetch current prices from Cofdar Worker.\r\n   *\/\r\n\r\n  async function update() {\r\n    try {\r\n      const response = await fetch(\r\n        WORKER,\r\n        {\r\n          method: \"GET\",\r\n          cache: \"no-store\"\r\n        }\r\n      );\r\n\r\n      if (!response.ok) {\r\n        return;\r\n      }\r\n\r\n      const data = await response.json();\r\n\r\n      if (\r\n        !data ||\r\n        !data.ok ||\r\n        !data.prices ||\r\n        !data.date\r\n      ) {\r\n        return;\r\n      }\r\n\r\n      \/*\r\n       * Never replace newer data\r\n       * with an older market session.\r\n       *\/\r\n\r\n      if (\r\n        currentData &&\r\n        currentData.date &&\r\n        data.date < currentData.date\r\n      ) {\r\n        return;\r\n      }\r\n\r\n      const changed =\r\n        JSON.stringify(data.prices) !==\r\n          JSON.stringify(currentData.prices) ||\r\n        data.date !== currentData.date;\r\n\r\n      currentData = data;\r\n\r\n      try {\r\n        localStorage.setItem(\r\n          STORAGE_KEY,\r\n          JSON.stringify(data)\r\n        );\r\n      } catch (e) {}\r\n\r\n      \/*\r\n       * Avoid resetting the animation\r\n       * when the figures have not changed.\r\n       *\/\r\n\r\n      if (changed) {\r\n        render(currentData);\r\n      }\r\n\r\n    } catch (e) {\r\n      \/*\r\n       * Keep the last valid prices visible.\r\n       *\/\r\n    }\r\n  }\r\n\r\n  update();\r\n\r\n  \/* Silent refresh every 30 minutes *\/\r\n\r\n  setInterval(\r\n    update,\r\n    30 * 60 * 1000\r\n  );\r\n\r\n  \/*\r\n   * Recalculate only when the container\r\n   * width changes meaningfully.\r\n   *\/\r\n\r\n  if (typeof ResizeObserver !== \"undefined\") {\r\n    const observer = new ResizeObserver(\r\n      function (entries) {\r\n        const width =\r\n          entries[0].contentRect.width;\r\n\r\n        if (\r\n          Math.abs(width - lastWindowWidth) < 2\r\n        ) {\r\n          return;\r\n        }\r\n\r\n        lastWindowWidth = width;\r\n\r\n        if (width > 0) {\r\n          render(currentData);\r\n        }\r\n      }\r\n    );\r\n\r\n    observer.observe(windowEl);\r\n  } else {\r\n    window.addEventListener(\r\n      \"resize\",\r\n      function () {\r\n        render(currentData);\r\n      },\r\n      { passive: true }\r\n    );\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-62b3c56 elementor-section-boxed elementor-section-height-default elementor-section-height-default rt-parallax-bg-no\" data-id=\"62b3c56\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8231221\" data-id=\"8231221\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-05d86ba elementor-widget elementor-widget-html\" data-id=\"05d86ba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<div id=\"cofdar-intelligence-v2\">\n  <div class=\"cci-loading\">\n    <div class=\"cci-spinner\"><\/div>\n    <div class=\"cci-loading-text\">Loading Cofdar Coffee Intelligence...<\/div>\n  <\/div>\n<\/div>\n\n<style>\n\/* ===== Optional page-only width enhancement ===== *\/\nbody.page-id-12909 .content-area,\nbody.page-id-12909 .site-content,\nbody.page-id-12909 .container{\n  width: 100%;\n}\nbody.page-id-12909 .content-area{\n  max-width: 100%;\n}\nbody.page-id-12909 .site-content{\n  padding-top: 0 !important;\n}\n\n\/* ===== Root ===== *\/\n#cofdar-intelligence-v2{\n  --cfi-navy:#0B1F3A;\n  --cfi-blue:#2B406F;\n  --cfi-green:#6F7752;\n  --cfi-brown:#B27244;\n  \n  --cfi-bg:#F4F6F8;\n  --cfi-white:#ffffff;\n  --cfi-line:#D9E0E8;\n  --cfi-text:#142338;\n  --cfi-muted:#64748B;\n  --cfi-soft:#EEF2F6;\n  --cfi-shadow:0 12px 30px rgba(11,31,58,.08);\n\n  max-width: 1380px;\n  margin: 0 auto;\n  color: var(--cfi-text);\n  font-family: inherit;\n}\n#cofdar-intelligence-v2 *,\n#cofdar-intelligence-v2 *:before,\n#cofdar-intelligence-v2 *:after{\n  box-sizing: border-box;\n}\n#cofdar-intelligence-v2.cfi-rtl{\n  direction: rtl;\n}\n#cofdar-intelligence-v2 .cfi-app{\n  background: var(--cfi-bg);\n  border: 1px solid var(--cfi-line);\n  overflow: hidden;\n}\n\n\/* ===== Loader ===== *\/\n#cofdar-intelligence-v2 .cci-loading{\n  min-height: 420px;\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  justify-content:center;\n  gap:18px;\n  background:#fff;\n}\n#cofdar-intelligence-v2 .cci-spinner{\n  width:42px;\n  height:42px;\n  border-radius:50%;\n  border:3px solid #E8EDF3;\n  border-top-color: var(--cfi-brown);\n  animation:cfiSpin .8s linear infinite;\n}\n#cofdar-intelligence-v2 .cci-loading-text{\n  font-weight:700;\n  color:var(--cfi-navy);\n}\n@keyframes cfiSpin{to{transform:rotate(360deg)}}\n\n\/* ===== Hero ===== *\/\n#cofdar-intelligence-v2 .cfi-hero{\n  position:relative;\n  padding:54px 42px 40px;\n  background:\n    radial-gradient(circle at 100% 0%, rgba(255,255,255,.13) 0, rgba(255,255,255,.06) 20%, transparent 20.5%),\n    radial-gradient(circle at 87% 8%, rgba(255,255,255,.08) 0, rgba(255,255,255,.03) 18%, transparent 18.5%),\n    linear-gradient(135deg, var(--cfi-navy) 0%, #0E2747 48%, var(--cfi-blue) 100%);\n  color:#fff;\n  overflow:hidden;\n}\n#cofdar-intelligence-v2 .cfi-hero:before{\n  content:\"\";\n  position:absolute;\n  right:-160px;\n  top:-170px;\n  width:440px;\n  height:440px;\n  border-radius:50%;\n  border:1px solid rgba(255,255,255,.06);\n  box-shadow:\n    0 0 0 48px rgba(255,255,255,.03),\n    0 0 0 96px rgba(255,255,255,.02);\n}\n#cofdar-intelligence-v2.cfi-rtl .cfi-hero:before{\n  right:auto;\n  left:-160px;\n}\n#cofdar-intelligence-v2 .cfi-hero-top{\n  position:relative;\n  z-index:2;\n  display:flex;\n  justify-content:space-between;\n  align-items:flex-start;\n  gap:20px;\n}\n#cofdar-intelligence-v2 .cfi-eyebrow{\n  display:inline-flex;\n  align-items:center;\n  gap:10px;\n  font-size:12px;\n  font-weight:800;\n  letter-spacing:.12em;\n  text-transform:uppercase;\n  color:#B27244;\n}\n#cofdar-intelligence-v2 .cfi-eyebrow i{\n  width:7px;\n  height:7px;\n  background:#B27244;\n  display:inline-block;\n}\n#cofdar-intelligence-v2 .cfi-year-badge{\n  padding:12px 16px;\n  border:1px solid rgba(255,255,255,.14);\n  background:rgba(255,255,255,.08);\n  color:#e9eef7;\n  font-size:13px;\n  font-weight:700;\n}\n#cofdar-intelligence-v2 .cfi-hero-grid{\n  position:relative;\n  z-index:2;\n  display:grid;\n  grid-template-columns:minmax(0,1.55fr) minmax(300px,.8fr);\n  gap:40px;\n  align-items:end;\n  margin-top:28px;\n}\n#cofdar-intelligence-v2 .cfi-title{\n  margin:0;\n  max-width:760px;\n  font-size: clamp(40px, 4.8vw, 76px);\n  line-height: .96;\n  font-weight: 900;\n  letter-spacing:-.04em;\n  color:#fff;\n}\n#cofdar-intelligence-v2.cfi-rtl .cfi-title{\n  letter-spacing:0;\n}\n#cofdar-intelligence-v2 .cfi-lead{\n  margin:20px 0 0;\n  max-width:740px;\n  color:#D6DFEA;\n  font-size:18px;\n  line-height:1.8;\n}\n#cofdar-intelligence-v2 .cfi-select-panel{\n  background:rgba(255,255,255,.12);\n  border:1px solid rgba(255,255,255,.15);\n  padding:18px;\n  backdrop-filter: blur(7px);\n}\n#cofdar-intelligence-v2 .cfi-field-label{\n  display:block;\n  font-size:13px;\n  font-weight:800;\n  color:#F2F6FB;\n  margin-bottom:10px;\n}\n\n\/* ===== Custom picker ===== *\/\n#cofdar-intelligence-v2 .cfi-picker{\n  position:relative;\n}\n#cofdar-intelligence-v2 .cfi-picker-toggle{\n  width:100%;\n  min-height:54px;\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:12px;\n  padding:0 14px;\n  background:#fff;\n  border:1px solid #fff;\n  color:var(--cfi-navy);\n  cursor:pointer;\n  font-size:15px;\n  font-weight:800;\n}\n#cofdar-intelligence-v2 .cfi-picker-selected{\n  display:flex;\n  align-items:center;\n  gap:10px;\n  min-width:0;\n}\n#cofdar-intelligence-v2 .cfi-picker-selected span:last-child{\n  white-space:nowrap;\n  overflow:hidden;\n  text-overflow:ellipsis;\n}\n#cofdar-intelligence-v2 .cfi-picker-caret{\n  flex:0 0 auto;\n  font-size:13px;\n}\n#cofdar-intelligence-v2 .cfi-picker-menu{\n  position:absolute;\n  top:100%;\n  left:0;\n  right:0;\n  margin-top:8px;\n  background:#fff;\n  border:1px solid var(--cfi-line);\n  box-shadow:var(--cfi-shadow);\n  display:none;\n  z-index:50;\n}\n#cofdar-intelligence-v2 .cfi-picker.open .cfi-picker-menu{\n  display:block;\n}\n#cofdar-intelligence-v2 .cfi-picker-search{\n  padding:12px;\n  border-bottom:1px solid var(--cfi-line);\n  background:#fff;\n}\n#cofdar-intelligence-v2 .cfi-picker-search input{\n  width:100%;\n  height:42px;\n  border:1px solid var(--cfi-line);\n  background:#fff;\n  color:var(--cfi-text);\n  padding:0 12px;\n  outline:none;\n  font-size:14px;\n}\n#cofdar-intelligence-v2 .cfi-picker-list{\n  max-height:310px;\n  overflow:auto;\n}\n#cofdar-intelligence-v2 .cfi-country-option{\n  width:100%;\n  border:0;\n  border-bottom:1px solid #EEF2F6;\n  background:#fff;\n  padding:11px 12px;\n  text-align:left;\n  display:flex;\n  align-items:center;\n  gap:10px;\n  cursor:pointer;\n}\n#cofdar-intelligence-v2.cfi-rtl .cfi-country-option{\n  text-align:right;\n}\n#cofdar-intelligence-v2 .cfi-country-option:hover{\n  background:#F7FAFC;\n}\n#cofdar-intelligence-v2 .cfi-country-option.is-active{\n  background:#EDF3FA;\n}\n#cofdar-intelligence-v2 .cfi-country-option .cfi-country-name{\n  font-size:14px;\n  font-weight:700;\n  color:var(--cfi-text);\n  margin:0;\n}\n#cofdar-intelligence-v2 .cfi-country-option .cfi-country-iso{\n  font-size:11px;\n  color:var(--cfi-muted);\n  margin-top:2px;\n}\n#cofdar-intelligence-v2 .cfi-quick{\n  margin-top:12px;\n  display:flex;\n  flex-wrap:wrap;\n  gap:7px;\n}\n#cofdar-intelligence-v2 .cfi-quick button{\n  border:1px solid rgba(255,255,255,.16);\n  background:rgba(255,255,255,.08);\n  color:#ECF2F8;\n  padding:8px 10px;\n  font-size:11px;\n  font-weight:800;\n  cursor:pointer;\n}\n#cofdar-intelligence-v2 .cfi-quick button:hover{\n  border-color:#B27244;\n  color:#B27244;\n}\n\n\n\/* ===== Intelligence proof strip ===== *\/\n#cofdar-intelligence-v2 .cfi-proof{\n  margin-top:24px;\n  display:grid;\n  grid-template-columns:repeat(4,minmax(0,1fr));\n  gap:8px;\n  max-width:820px;\n}\n#cofdar-intelligence-v2 .cfi-proof-item{\n  min-height:64px;\n  padding:11px 13px;\n  border:1px solid rgba(255,255,255,.15);\n  background:rgba(255,255,255,.07);\n  backdrop-filter:blur(5px);\n}\n#cofdar-intelligence-v2 .cfi-proof-item strong{display:block;color:#fff;font-size:17px;font-weight:900;line-height:1.1}\n#cofdar-intelligence-v2 .cfi-proof-item span{display:block;margin-top:6px;color:#C9D4E2;font-size:10px;line-height:1.35}\n\n\/* ===== Country bar ===== *\/\n#cofdar-intelligence-v2 .cfi-country-bar{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:18px;\n  background:#fff;\n  border-bottom:1px solid var(--cfi-line);\n  padding:22px 34px;\n}\n#cofdar-intelligence-v2 .cfi-country-info{\n  display:flex;\n  align-items:center;\n  gap:16px;\n  min-width:0;\n}\n#cofdar-intelligence-v2 .cfi-flag-box{\n  width:54px;\n  height:40px;\n  display:grid;\n  place-items:center;\n  background:#F6F8FB;\n  border:1px solid var(--cfi-line);\n  font-size:28px;\n  flex:0 0 auto;\n}\n#cofdar-intelligence-v2 .cfi-country-heading{\n  margin:0;\n  font-size:24px;\n  font-weight:900;\n  color:var(--cfi-navy);\n  line-height:1.1;\n}\n#cofdar-intelligence-v2 .cfi-country-meta{\n  display:flex;\n  flex-wrap:wrap;\n  gap:10px 16px;\n  margin-top:7px;\n  color:var(--cfi-muted);\n  font-size:12px;\n}\n#cofdar-intelligence-v2 .cfi-country-actions{\n  display:flex;\n  gap:8px;\n}\n#cofdar-intelligence-v2 .cfi-btn{\n  min-height:40px;\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  padding:0 14px;\n  border:1px solid var(--cfi-line);\n  background:#fff;\n  color:var(--cfi-navy);\n  text-decoration:none !important;\n  font-size:12px;\n  font-weight:800;\n  cursor:pointer;\n}\n#cofdar-intelligence-v2 .cfi-btn:hover,\n#cofdar-intelligence-v2 .cfi-btn:focus,\n#cofdar-intelligence-v2 .cfi-btn:active{\n  border-color:var(--cfi-blue) !important;\n  background:var(--cfi-blue) !important;\n  color:#fff !important;\n}\n\n\/* ===== Main sections ===== *\/\n#cofdar-intelligence-v2 .cfi-main{\n  padding:32px;\n}\n#cofdar-intelligence-v2 .cfi-section{\n  margin-top:30px;\n}\n#cofdar-intelligence-v2 .cfi-section:first-child{\n  margin-top:0;\n}\n#cofdar-intelligence-v2 .cfi-section-head{\n  display:flex;\n  justify-content:space-between;\n  align-items:flex-end;\n  gap:18px;\n  margin-bottom:14px;\n}\n#cofdar-intelligence-v2 .cfi-section-title{\n  margin:0;\n  color:var(--cfi-navy);\n  font-size:19px;\n  font-weight:900;\n}\n#cofdar-intelligence-v2 .cfi-section-sub{\n  margin:5px 0 0;\n  color:var(--cfi-muted);\n  font-size:12px;\n}\n\n\/* ===== Metrics ===== *\/\n#cofdar-intelligence-v2 .cfi-metrics{\n  display:grid;\n  grid-template-columns:repeat(6,minmax(0,1fr));\n  gap:12px;\n}\n#cofdar-intelligence-v2 .cfi-card{\n  background:#fff;\n  border:1px solid var(--cfi-line);\n}\n#cofdar-intelligence-v2 .cfi-metric{\n  position:relative;\n  min-height:146px;\n  padding:18px 16px;\n  overflow:hidden;\n}\n#cofdar-intelligence-v2 .cfi-metric:before{\n  content:\"\";\n  position:absolute;\n  top:0;\n  bottom:0;\n  left:0;\n  width:4px;\n  background:var(--cfi-blue);\n}\n#cofdar-intelligence-v2 .cfi-metric:nth-child(4n+2):before{background:var(--cfi-green)}\n#cofdar-intelligence-v2 .cfi-metric:nth-child(4n+3):before{background:var(--cfi-brown)}\n#cofdar-intelligence-v2 .cfi-metric:nth-child(4n+4):before{background:var(--cfi-navy)}\n#cofdar-intelligence-v2.cfi-rtl .cfi-metric:before{\n  left:auto;\n  right:0;\n}\n#cofdar-intelligence-v2 .cfi-metric-label{\n  display:block;\n  color:var(--cfi-muted);\n  font-size:12px;\n  min-height:34px;\n  line-height:1.4;\n}\n#cofdar-intelligence-v2 .cfi-metric-value{\n  display:block;\n  margin-top:8px;\n  color:var(--cfi-navy);\n  font-size:clamp(22px,2vw,30px);\n  font-weight:900;\n  line-height:1.06;\n  letter-spacing:-.02em;\n}\n#cofdar-intelligence-v2 .cfi-metric-unit{\n  display:block;\n  margin-top:8px;\n  color:#8894a5;\n  font-size:10px;\n}\n#cofdar-intelligence-v2 .cfi-metric-note{\n  margin-top:10px;\n  color:var(--cfi-green);\n  font-size:10px;\n  font-weight:800;\n}\n\n\/* ===== Grid ===== *\/\n#cofdar-intelligence-v2 .cfi-grid-2{\n  display:grid;\n  grid-template-columns:minmax(0,1.55fr) minmax(300px,.7fr);\n  gap:14px;\n}\n#cofdar-intelligence-v2 .cfi-panel{\n  background:#fff;\n  border:1px solid var(--cfi-line);\n  padding:22px;\n}\n#cofdar-intelligence-v2 .cfi-panel-title{\n  margin:0;\n  color:var(--cfi-navy);\n  font-size:17px;\n  font-weight:900;\n}\n#cofdar-intelligence-v2 .cfi-panel-sub{\n  margin-top:5px;\n  color:var(--cfi-muted);\n  font-size:11px;\n}\n\n\/* ===== Tabs ===== *\/\n#cofdar-intelligence-v2 .cfi-tabs{\n  display:flex;\n  flex-wrap:wrap;\n  gap:6px;\n}\n#cofdar-intelligence-v2 .cfi-tab{\n  border:1px solid var(--cfi-line);\n  background:#fff;\n  color:var(--cfi-muted);\n  padding:8px 11px;\n  font-size:11px;\n  font-weight:800;\n  cursor:pointer;\n}\n#cofdar-intelligence-v2 .cfi-tab:hover,\n#cofdar-intelligence-v2 .cfi-tab:focus{\n  border-color:var(--cfi-blue) !important;\n  color:var(--cfi-blue) !important;\n  background:#fff !important;\n}\n#cofdar-intelligence-v2 .cfi-tab.is-active,\n#cofdar-intelligence-v2 .cfi-tab.is-active:hover,\n#cofdar-intelligence-v2 .cfi-tab.is-active:focus{\n  background:var(--cfi-blue) !important;\n  border-color:var(--cfi-blue) !important;\n  color:#fff !important;\n}\n\n\/* ===== Trend summary ===== *\/\n#cofdar-intelligence-v2 .cfi-trend-summary{\n  display:grid;\n  grid-template-columns:repeat(3,1fr);\n  gap:10px;\n  margin-top:16px;\n}\n#cofdar-intelligence-v2 .cfi-mini{\n  border:1px solid var(--cfi-line);\n  background:#FAFBFD;\n  padding:12px;\n}\n#cofdar-intelligence-v2 .cfi-mini-label{\n  color:var(--cfi-muted);\n  font-size:10px;\n  font-weight:800;\n  text-transform:uppercase;\n  letter-spacing:.06em;\n}\n#cofdar-intelligence-v2 .cfi-mini-value{\n  margin-top:6px;\n  color:var(--cfi-navy);\n  font-size:16px;\n  font-weight:900;\n}\n\n\/* ===== Chart ===== *\/\n#cofdar-intelligence-v2 .cfi-chart-shell{\n  margin-top:18px;\n}\n#cofdar-intelligence-v2 .cfi-chart-wrap{\n  width:100%;\n  overflow-x:auto;\n  overflow-y:hidden;\n  border:1px solid var(--cfi-line);\n  background:#fff;\n}\n#cofdar-intelligence-v2 .cfi-chart-wrap svg{\n  display:block;\n  width:100%;\n  min-width:660px;\n  height:auto;\n}\n#cofdar-intelligence-v2 .cfi-chart-empty{\n  min-height:260px;\n  display:grid;\n  place-items:center;\n  color:var(--cfi-muted);\n  font-size:13px;\n}\n\n\/* ===== Ranks ===== *\/\n#cofdar-intelligence-v2 .cfi-ranks{\n  display:grid;\n  gap:10px;\n  margin-top:18px;\n}\n#cofdar-intelligence-v2 .cfi-rank{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:14px;\n  border:1px solid var(--cfi-line);\n  background:#FAFBFD;\n  padding:14px;\n}\n#cofdar-intelligence-v2 .cfi-rank-label{\n  color:var(--cfi-muted);\n  font-size:12px;\n}\n#cofdar-intelligence-v2 .cfi-rank-value{\n  color:var(--cfi-navy);\n  font-size:24px;\n  font-weight:900;\n}\n\n\/* ===== Partners ===== *\/\n#cofdar-intelligence-v2 .cfi-partner-list{\n  margin-top:18px;\n  display:grid;\n  gap:10px;\n}\n#cofdar-intelligence-v2 .cfi-partner{\n  display:grid;\n  grid-template-columns:34px minmax(120px,1fr) minmax(110px,1.2fr) auto;\n  gap:10px;\n  align-items:center;\n  padding-bottom:10px;\n  border-bottom:1px solid #EDF2F6;\n}\n#cofdar-intelligence-v2 .cfi-partner:last-child{\n  border-bottom:0;\n  padding-bottom:0;\n}\n#cofdar-intelligence-v2 .cfi-partner-rank{\n  font-size:11px;\n  color:#8A95A6;\n}\n#cofdar-intelligence-v2 .cfi-partner-name{\n  min-width:0;\n  font-size:12px;\n  font-weight:800;\n  color:var(--cfi-text);\n  white-space:nowrap;\n  overflow:hidden;\n  text-overflow:ellipsis;\n}\n#cofdar-intelligence-v2 .cfi-partner-bar-bg{\n  height:7px;\n  background:#E9EEF3;\n}\n#cofdar-intelligence-v2 .cfi-partner-bar{\n  height:100%;\n  background:var(--cfi-blue);\n}\n#cofdar-intelligence-v2 .cfi-partner-value{\n  font-size:11px;\n  font-weight:800;\n  color:var(--cfi-navy);\n  white-space:nowrap;\n}\n\n\/* ===== Insights ===== *\/\n#cofdar-intelligence-v2 .cfi-insights{\n  display:grid;\n  grid-template-columns:repeat(3,1fr);\n  gap:12px;\n}\n#cofdar-intelligence-v2 .cfi-insight{\n  min-height:160px;\n  padding:20px;\n  background:var(--cfi-navy);\n  color:#fff;\n}\n#cofdar-intelligence-v2 .cfi-insight:nth-child(2){\n  background:var(--cfi-blue);\n}\n#cofdar-intelligence-v2 .cfi-insight:nth-child(3){background:var(--cfi-green)}\n#cofdar-intelligence-v2 .cfi-insight:nth-child(4){background:var(--cfi-brown)}\n#cofdar-intelligence-v2 .cfi-insight-no{\n  display:block;\n  color:#B27244;\n  font-size:11px;\n  font-weight:900;\n  letter-spacing:.12em;\n}\n#cofdar-intelligence-v2 .cfi-insight p{\n  margin:12px 0 0;\n  color:#E3EAF3;\n  font-size:13px;\n  line-height:1.75;\n}\n\n\/* ===== Leaders ===== *\/\n#cofdar-intelligence-v2 .cfi-leaders{\n  margin-top:16px;\n  display:grid;\n  grid-template-columns:repeat(5,1fr);\n  gap:8px;\n}\n#cofdar-intelligence-v2 .cfi-leader{\n  border:1px solid var(--cfi-line);\n  background:#FAFBFD;\n  padding:14px 12px;\n}\n#cofdar-intelligence-v2 .cfi-leader-pos{\n  color:var(--cfi-brown);\n  font-size:10px;\n  font-weight:900;\n}\n#cofdar-intelligence-v2 .cfi-leader-name{\n  margin-top:8px;\n  color:var(--cfi-navy);\n  font-size:12px;\n  font-weight:900;\n  white-space:nowrap;\n  overflow:hidden;\n  text-overflow:ellipsis;\n}\n#cofdar-intelligence-v2 .cfi-leader-num{\n  display:block;\n  margin-top:6px;\n  color:var(--cfi-muted);\n  font-size:11px;\n}\n\n\/* ===== Source ===== *\/\n#cofdar-intelligence-v2 .cfi-source{\n  background:#fff;\n  border:1px solid var(--cfi-line);\n  padding:22px;\n}\n#cofdar-intelligence-v2 .cfi-source-title{\n  color:var(--cfi-navy);\n  font-size:13px;\n  font-weight:900;\n}\n#cofdar-intelligence-v2 .cfi-source-copy{\n  margin-top:8px;\n  color:var(--cfi-muted);\n  font-size:11px;\n  line-height:1.8;\n}\n#cofdar-intelligence-v2 .cfi-source-tags{\n  margin-top:12px;\n  display:flex;\n  flex-wrap:wrap;\n  gap:7px;\n}\n#cofdar-intelligence-v2 .cfi-source-tag{\n  border:1px solid var(--cfi-line);\n  background:#FAFBFD;\n  color:var(--cfi-muted);\n  padding:6px 8px;\n  font-size:10px;\n}\n\n\/* ===== Error ===== *\/\n#cofdar-intelligence-v2 .cfi-error{\n  padding:24px;\n  background:#FFF5F5;\n  border:1px solid #F1C0C0;\n  color:#8E2E2E;\n  line-height:1.7;\n}\n\n\n\/* ===== Intelligence workspace enhancements ===== *\/\n#cofdar-intelligence-v2 .cfi-empty-soft{\n  padding:18px;\n  border:1px solid var(--cfi-line);\n  background:#F7F9FB;\n  color:var(--cfi-muted);\n  font-size:12px;\n  line-height:1.8;\n}\n#cofdar-intelligence-v2 .cfi-benchmark{display:grid;gap:12px;margin-top:18px}\n#cofdar-intelligence-v2 .cfi-benchmark-row{display:grid;grid-template-columns:minmax(110px,1fr) 2fr auto;gap:12px;align-items:center}\n#cofdar-intelligence-v2 .cfi-benchmark-label{font-size:12px;color:var(--cfi-muted)}\n#cofdar-intelligence-v2 .cfi-benchmark-track{height:9px;background:#E8EDF3;overflow:hidden}\n#cofdar-intelligence-v2 .cfi-benchmark-fill{height:100%;background:var(--cfi-blue)}\n#cofdar-intelligence-v2 .cfi-benchmark-row:nth-child(2) .cfi-benchmark-fill{background:var(--cfi-green)}\n#cofdar-intelligence-v2 .cfi-benchmark-row:nth-child(3) .cfi-benchmark-fill{background:var(--cfi-brown)}\n#cofdar-intelligence-v2 .cfi-benchmark-value{font-size:11px;font-weight:900;color:var(--cfi-navy);white-space:nowrap}\n#cofdar-intelligence-v2 .cfi-nav a:hover,#cofdar-intelligence-v2 .cfi-nav a:focus{background:var(--cfi-blue);border-color:var(--cfi-blue);color:#fff}\n#cofdar-intelligence-v2 details summary{cursor:pointer;color:var(--cfi-navy);font-weight:800;padding:10px 0}\n#cofdar-intelligence-v2 progress{appearance:none;-webkit-appearance:none;border:0;background:#E8EDF3}\n#cofdar-intelligence-v2 progress::-webkit-progress-bar{background:#E8EDF3}\n#cofdar-intelligence-v2 progress::-webkit-progress-value{background:var(--cfi-brown)}\n#cofdar-intelligence-v2 progress::-moz-progress-bar{background:var(--cfi-brown)}\n\n\/* ===== Responsive ===== *\/\n@media (max-width:1180px){\n  #cofdar-intelligence-v2 .cfi-metrics{\n    grid-template-columns:repeat(3,1fr);\n  }\n  #cofdar-intelligence-v2 .cfi-leaders{\n    grid-template-columns:repeat(3,1fr);\n  }\n}\n@media (max-width:900px){\n  #cofdar-intelligence-v2 .cfi-hero{\n    padding:38px 20px 28px;\n  }\n  #cofdar-intelligence-v2 .cfi-hero-top{\n    flex-direction:column;\n    align-items:flex-start;\n  }\n  #cofdar-intelligence-v2 .cfi-hero-grid{\n    grid-template-columns:1fr;\n    gap:24px;\n  }\n  #cofdar-intelligence-v2 .cfi-country-bar{\n    flex-direction:column;\n    align-items:flex-start;\n    padding:18px 20px;\n  }\n  #cofdar-intelligence-v2 .cfi-country-actions{\n    width:100%;\n  }\n  #cofdar-intelligence-v2 .cfi-btn{\n    flex:1;\n  }\n  #cofdar-intelligence-v2 .cfi-main{\n    padding:18px;\n  }\n  #cofdar-intelligence-v2 .cfi-grid-2{\n    grid-template-columns:1fr;\n  }\n  #cofdar-intelligence-v2 .cfi-insights{\n    grid-template-columns:1fr;\n  }\n}\n@media (max-width:640px){\n  #cofdar-intelligence-v2 .cfi-title{\n    font-size:52px;\n  }\n  #cofdar-intelligence-v2 .cfi-lead{\n    font-size:16px;\n    line-height:1.75;\n  }\n  #cofdar-intelligence-v2 .cfi-metrics{\n    grid-template-columns:repeat(2,1fr);\n  }\n  #cofdar-intelligence-v2 .cfi-trend-summary{\n    grid-template-columns:1fr;\n  }\n  #cofdar-intelligence-v2 .cfi-tabs{\n    display:grid;\n    grid-template-columns:1fr 1fr;\n  }\n  #cofdar-intelligence-v2 .cfi-tab{\n    width:100%;\n    text-align:center;\n    min-height:40px;\n  }\n  #cofdar-intelligence-v2 .cfi-chart-wrap svg{\n    min-width:760px;\n  }\n  #cofdar-intelligence-v2 .cfi-partner{\n    grid-template-columns:26px minmax(80px,1fr) 82px;\n  }\n  #cofdar-intelligence-v2 .cfi-partner-bar-bg{\n    display:none;\n  }\n  #cofdar-intelligence-v2 .cfi-leaders{\n    grid-template-columns:1fr 1fr;\n  }\n}\n@media (max-width:420px){\n  #cofdar-intelligence-v2 .cfi-metrics,\n  #cofdar-intelligence-v2 .cfi-leaders{\n    grid-template-columns:1fr;\n  }\n  #cofdar-intelligence-v2 .cfi-title{\n    font-size:44px;\n  }\n}\n\/* Cofdar mobile-first workspace *\/\n#cofdar-intelligence-v2{max-width:1440px;isolation:isolate;font-family:system-ui,-apple-system,\"Tajawal\",sans-serif;line-height:1.6}\n#cofdar-intelligence-v2 button,#cofdar-intelligence-v2 input,#cofdar-intelligence-v2 select{font:inherit;border-radius:0;min-height:44px;touch-action:manipulation}\n#cofdar-intelligence-v2 button:focus-visible,#cofdar-intelligence-v2 input:focus-visible,#cofdar-intelligence-v2 select:focus-visible{outline:3px solid #B27244;outline-offset:2px}\n#cofdar-intelligence-v2 .cfi-hero{overflow:visible;padding:36px 28px}\n#cofdar-intelligence-v2 .cfi-hero:before{display:none}\n#cofdar-intelligence-v2 .cfi-title{font-size:clamp(32px,4.6vw,64px);line-height:1.17;letter-spacing:-.03em}\n#cofdar-intelligence-v2 .cfi-lead{font-size:15px;line-height:1.8}\n#cofdar-intelligence-v2 .cfi-picker-menu{z-index:200;max-height:65vh}\n#cofdar-intelligence-v2 .cfi-picker-list{max-height:45vh;overscroll-behavior:contain}\n#cofdar-intelligence-v2 .cfi-country-option{justify-content:flex-start;color:#142338}\n#cofdar-intelligence-v2 .cfi-country-option small{margin-inline-start:auto}\n#cofdar-intelligence-v2 .cfi-metrics{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}\n#cofdar-intelligence-v2 .cfi-metric{min-height:130px}\n#cofdar-intelligence-v2 .cfi-chart-wrap svg{min-width:0;width:100%;aspect-ratio:860\/330}\n#cofdar-intelligence-v2 .cfi-partner-name,#cofdar-intelligence-v2 .cfi-leader-name{border:0;background:transparent;text-align:start;padding:0;cursor:pointer;white-space:normal}\n#cofdar-intelligence-v2 .cfi-leaders{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}\n#cofdar-intelligence-v2 .cfi-nav{display:flex;gap:6px;overflow:auto;padding:10px 16px;position:sticky;top:0;z-index:80;background:#0b1f3a;scrollbar-width:none}\n#cofdar-intelligence-v2 .cfi-nav a{padding:9px 14px;color:#fff;text-decoration:none;white-space:nowrap;font-size:13px;border:1px solid #ffffff25;min-height:44px}\n#cofdar-intelligence-v2 .cfi-section{scroll-margin-top:76px}\n#cofdar-intelligence-v2 .cfi-toolrow{display:flex;gap:10px;flex-wrap:wrap;margin:16px 0;align-items:center}\n#cofdar-intelligence-v2 .cfi-toolrow input,#cofdar-intelligence-v2 .cfi-toolrow select{padding:10px;border:1px solid #d9e0e8;max-width:100%;background:white;color:#142338}\n#cofdar-intelligence-v2 .cfi-toolrow input{flex:1;min-width:150px}\n#cofdar-intelligence-v2 .cfi-tablewrap{overflow:auto;max-height:560px;overscroll-behavior:contain;border:1px solid #d9e0e8}\n#cofdar-intelligence-v2 table{border-collapse:collapse;width:100%;font-size:13px;white-space:nowrap;color:#142338;background:#fff;margin:0}\n#cofdar-intelligence-v2 th{position:sticky;top:0;background:#eef2f6;font-size:12px;z-index:1}\n#cofdar-intelligence-v2 th,#cofdar-intelligence-v2 td{padding:12px;text-align:start;border-bottom:1px solid #e8edf3}\n#cofdar-intelligence-v2 td button{border:0;background:none;color:#0b1f3a;cursor:pointer;padding:0;text-align:start}\n#cofdar-intelligence-v2 .cfi-notice{color:#64748b;font-size:12px;line-height:1.8;margin:12px 0}\n#cofdar-intelligence-v2 .cfi-mix{display:grid;gap:12px;margin-top:16px}\n#cofdar-intelligence-v2 .cfi-mixrow{display:grid;grid-template-columns:1fr auto;gap:5px;font-size:13px}\n#cofdar-intelligence-v2 .cfi-mixrow progress{width:100%;grid-column:1\/-1;height:8px;accent-color:#b27244}\n#cofdar-intelligence-v2 .cfi-route{display:grid;grid-template-columns:minmax(0,1fr) 32px minmax(0,1fr) auto;gap:8px;align-items:center;border-bottom:1px solid #e8edf3;padding:12px 0;font-size:13px}\n#cofdar-intelligence-v2 .cfi-route button{border:0;background:transparent;color:#0b1f3a;cursor:pointer;text-align:start;padding:0}\n#cofdar-intelligence-v2 .cfi-route strong{font-size:12px}\n@media(max-width:640px){\n#cofdar-intelligence-v2 .cfi-main{padding:14px}\n#cofdar-intelligence-v2 .cfi-hero{padding:24px 16px}\n#cofdar-intelligence-v2 .cfi-hero-grid{margin-top:16px;gap:18px}\n#cofdar-intelligence-v2 .cfi-title{font-size:34px;line-height:1.25}\n#cofdar-intelligence-v2 .cfi-metrics{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n#cofdar-intelligence-v2 .cfi-metric{padding:14px 12px;min-height:135px}\n#cofdar-intelligence-v2 .cfi-metric-value{font-size:25px;overflow-wrap:anywhere}\n#cofdar-intelligence-v2 .cfi-panel{padding:16px;min-width:0}\n#cofdar-intelligence-v2 .cfi-leaders{grid-template-columns:repeat(2,minmax(0,1fr))}\n#cofdar-intelligence-v2 .cfi-trend-summary{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}\n#cofdar-intelligence-v2 .cfi-mini{padding:8px}\n#cofdar-intelligence-v2 .cfi-mini-value{font-size:14px}\n#cofdar-intelligence-v2 .cfi-section-head{align-items:stretch;flex-direction:column;gap:12px}\n#cofdar-intelligence-v2 .cfi-quick{flex-wrap:nowrap;overflow:auto;padding-bottom:6px}\n#cofdar-intelligence-v2 .cfi-quick button{white-space:nowrap}\n#cofdar-intelligence-v2 .cfi-picker.open .cfi-picker-menu{position:fixed;inset:12vh 12px auto;max-height:70vh;box-shadow:0 0 0 100vmax #0b1f3a99}\n#cofdar-intelligence-v2 .cfi-picker-list{max-height:52vh}\n#cofdar-intelligence-v2 .cfi-chart-wrap svg{aspect-ratio:auto;min-height:185px}\n#cofdar-intelligence-v2 .cfi-route{grid-template-columns:1fr 24px 1fr}.cfi-route strong{grid-column:1\/-1}\n#cofdar-intelligence-v2 .cfi-proof{grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin-top:18px}\n#cofdar-intelligence-v2 .cfi-proof-item{min-height:58px;padding:10px}\n#cofdar-intelligence-v2 .cfi-proof-item strong{font-size:15px}\n#cofdar-intelligence-v2 .cfi-nav{top:0;padding:8px 10px;gap:5px}\n#cofdar-intelligence-v2 .cfi-nav a{font-size:11px;padding:8px 11px}\n#cofdar-intelligence-v2 .cfi-benchmark-row{grid-template-columns:100px 1fr auto;gap:8px}\n#cofdar-intelligence-v2 .cfi-insight{min-height:0;padding:16px}\n#cofdar-intelligence-v2 .cfi-tablewrap{max-height:430px}\n}\n@media(prefers-reduced-motion:reduce){#cofdar-intelligence-v2 *{animation:none!important;scroll-behavior:auto!important}}\n@media print{#cofdar-intelligence-v2 .cfi-nav,#cofdar-intelligence-v2 .cfi-toolrow,#cofdar-intelligence-v2 .cfi-select-panel{display:none}#cofdar-intelligence-v2 .cfi-tablewrap{max-height:none;overflow:visible}}\n\n\/* ===== Final Cofdar polish: country picker + Market Read ===== *\/\n#cofdar-intelligence-v2 .cfi-country-option{\n  align-items:center;\n  gap:10px;\n}\n#cofdar-intelligence-v2 .cfi-country-flag{\n  flex:0 0 auto;\n  width:24px;\n  text-align:center;\n  font-size:16px;\n  line-height:1;\n}\n#cofdar-intelligence-v2 .cfi-country-option .cfi-country-name{\n  display:block;\n  min-width:0;\n  overflow:hidden;\n  text-overflow:ellipsis;\n  white-space:nowrap;\n}\n#cofdar-intelligence-v2 .cfi-insights{\n  grid-template-columns:repeat(4,minmax(0,1fr));\n}\n#cofdar-intelligence-v2 .cfi-insight{\n  min-height:160px;\n  display:flex;\n  align-items:center;\n  padding:22px 20px;\n}\n#cofdar-intelligence-v2 .cfi-insight p{\n  margin:0;\n  color:#fff;\n}\n@media (max-width:980px){\n  #cofdar-intelligence-v2 .cfi-insights{\n    grid-template-columns:repeat(2,minmax(0,1fr));\n  }\n}\n@media (max-width:640px){\n  #cofdar-intelligence-v2 .cfi-insights{\n    grid-template-columns:1fr;\n  }\n  #cofdar-intelligence-v2 .cfi-insight{\n    min-height:auto;\n    padding:18px 16px;\n  }\n}\n\n\n\/* ===== FINAL V3: desktop layering + true mobile rebuild ===== *\/\n#cofdar-intelligence-v2{\n  width:100% !important;\n  max-width:1380px !important;\n  min-width:0 !important;\n}\n#cofdar-intelligence-v2 .cfi-app{\n  width:100%;\n  max-width:100%;\n  min-width:0;\n  overflow:visible;\n}\n#cofdar-intelligence-v2 .cfi-hero{\n  position:relative;\n  z-index:100;\n}\n#cofdar-intelligence-v2 .cfi-country-bar{\n  position:relative;\n  z-index:40;\n}\n#cofdar-intelligence-v2 .cfi-nav{\n  z-index:30;\n}\n#cofdar-intelligence-v2 .cfi-picker-menu{\n  z-index:1000;\n  max-height:360px;\n}\n#cofdar-intelligence-v2 .cfi-picker-list{\n  max-height:270px;\n}\n#cofdar-intelligence-v2 .cfi-metrics{\n  grid-template-columns:repeat(auto-fit,minmax(220px,1fr));\n}\n#cofdar-intelligence-v2 details > summary{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:12px;\n  list-style:none;\n  border-top:1px solid var(--cfi-line);\n  padding:14px 0;\n}\n#cofdar-intelligence-v2 details > summary::-webkit-details-marker{display:none}\n#cofdar-intelligence-v2 details > summary:after{\n  content:'+';\n  flex:0 0 auto;\n  width:28px;\n  height:28px;\n  display:grid;\n  place-items:center;\n  border:1px solid var(--cfi-line);\n  color:var(--cfi-blue);\n  font-size:18px;\n  line-height:1;\n}\n#cofdar-intelligence-v2 details[open] > summary:after{content:'\u2212'}\n\n@media (max-width:767px){\n  html,body{max-width:100%;}\n  body.page-id-12909{overflow-x:hidden !important;}\n  body.page-id-12909 .content-area,\n  body.page-id-12909 .site-content,\n  body.page-id-12909 .container,\n  body.page-id-12909 .elementor,\n  body.page-id-12909 .elementor-section,\n  body.page-id-12909 .elementor-container,\n  body.page-id-12909 .e-con,\n  body.page-id-12909 .e-con-inner,\n  body.page-id-12909 .elementor-widget-html,\n  body.page-id-12909 .elementor-widget-html .elementor-widget-container{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n  }\n  body.page-id-12909 .elementor-widget-html .elementor-widget-container{\n    overflow:visible !important;\n  }\n\n  #cofdar-intelligence-v2{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n    margin:0 !important;\n    overflow-x:hidden !important;\n  }\n  #cofdar-intelligence-v2 .cfi-app{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n    border-inline:0;\n    overflow-x:hidden !important;\n  }\n\n  \/* Hero *\/\n  #cofdar-intelligence-v2 .cfi-hero{\n    padding:22px 16px 20px !important;\n    overflow:visible !important;\n  }\n  #cofdar-intelligence-v2 .cfi-hero-top{\n    display:flex;\n    flex-direction:column;\n    align-items:flex-start;\n    gap:10px;\n  }\n  #cofdar-intelligence-v2 .cfi-year-badge{\n    font-size:11px;\n    padding:8px 10px;\n  }\n  #cofdar-intelligence-v2 .cfi-hero-grid{\n    grid-template-columns:minmax(0,1fr) !important;\n    gap:18px !important;\n    margin-top:18px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-title{\n    max-width:100% !important;\n    margin:0 !important;\n    font-size:30px !important;\n    line-height:1.08 !important;\n    letter-spacing:-.02em !important;\n    overflow-wrap:anywhere;\n  }\n  #cofdar-intelligence-v2 .cfi-lead{\n    max-width:100% !important;\n    margin-top:14px !important;\n    font-size:14px !important;\n    line-height:1.65 !important;\n  }\n  #cofdar-intelligence-v2 .cfi-proof{\n    grid-template-columns:repeat(2,minmax(0,1fr)) !important;\n    gap:8px !important;\n    margin-top:16px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-proof-item{\n    min-width:0;\n    min-height:62px;\n    padding:10px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-proof-item strong{font-size:15px !important}\n  #cofdar-intelligence-v2 .cfi-proof-item span{font-size:9px !important}\n  #cofdar-intelligence-v2 .cfi-select-panel{\n    width:100%;\n    min-width:0;\n    padding:14px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-picker-toggle{min-width:0}\n  #cofdar-intelligence-v2 .cfi-picker.open .cfi-picker-menu{\n    position:fixed !important;\n    left:12px !important;\n    right:12px !important;\n    top:88px !important;\n    bottom:auto !important;\n    width:auto !important;\n    max-width:none !important;\n    max-height:calc(100dvh - 112px) !important;\n    z-index:10000 !important;\n    box-shadow:0 0 0 100vmax rgba(11,31,58,.72),0 18px 50px rgba(11,31,58,.24) !important;\n  }\n  #cofdar-intelligence-v2 .cfi-picker-list{\n    max-height:calc(100dvh - 205px) !important;\n  }\n  #cofdar-intelligence-v2 .cfi-quick{\n    display:flex;\n    flex-wrap:nowrap !important;\n    overflow-x:auto !important;\n    overflow-y:hidden !important;\n    gap:8px;\n    padding-bottom:4px;\n    scrollbar-width:none;\n    overscroll-behavior-inline:contain;\n  }\n  #cofdar-intelligence-v2 .cfi-quick::-webkit-scrollbar{display:none}\n  #cofdar-intelligence-v2 .cfi-quick button{\n    flex:0 0 auto;\n    white-space:nowrap;\n  }\n\n  \/* Country header *\/\n  #cofdar-intelligence-v2 .cfi-country-bar{\n    padding:16px !important;\n    gap:14px !important;\n    align-items:stretch !important;\n  }\n  #cofdar-intelligence-v2 .cfi-country-info{\n    width:100%;\n    min-width:0;\n    align-items:flex-start;\n  }\n  #cofdar-intelligence-v2 .cfi-flag-box{\n    width:44px;\n    height:34px;\n    font-size:22px;\n  }\n  #cofdar-intelligence-v2 .cfi-country-heading{\n    font-size:24px;\n    line-height:1.15;\n  }\n  #cofdar-intelligence-v2 .cfi-country-meta{\n    gap:5px 12px;\n    font-size:11px;\n  }\n  #cofdar-intelligence-v2 .cfi-country-actions,\n  #cofdar-intelligence-v2 .cfi-country-actions .cfi-btn{\n    width:100% !important;\n  }\n\n  \/* Navigation: swipe, not sticky *\/\n  #cofdar-intelligence-v2 .cfi-nav{\n    position:relative !important;\n    top:auto !important;\n    width:100% !important;\n    max-width:100% !important;\n    display:flex !important;\n    flex-wrap:nowrap !important;\n    overflow-x:auto !important;\n    overflow-y:hidden !important;\n    gap:6px !important;\n    padding:8px 10px !important;\n    scrollbar-width:none;\n    overscroll-behavior-inline:contain;\n    -webkit-overflow-scrolling:touch;\n  }\n  #cofdar-intelligence-v2 .cfi-nav::-webkit-scrollbar{display:none}\n  #cofdar-intelligence-v2 .cfi-nav a{\n    flex:0 0 auto;\n    min-height:42px !important;\n    padding:8px 12px !important;\n    font-size:11px !important;\n  }\n\n  \/* Main *\/\n  #cofdar-intelligence-v2 .cfi-main{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n    padding:16px 12px 24px !important;\n    overflow-x:hidden !important;\n  }\n  #cofdar-intelligence-v2 .cfi-section{\n    width:100%;\n    max-width:100%;\n    min-width:0;\n    margin-top:24px;\n  }\n  #cofdar-intelligence-v2 .cfi-section-head{\n    margin-bottom:12px;\n  }\n  #cofdar-intelligence-v2 .cfi-section-title{\n    font-size:21px;\n    line-height:1.25;\n  }\n  #cofdar-intelligence-v2 .cfi-section-sub{\n    font-size:12px;\n    line-height:1.55;\n  }\n\n  \/* KPI cards *\/\n  #cofdar-intelligence-v2 .cfi-metrics{\n    width:100%;\n    grid-template-columns:repeat(2,minmax(0,1fr)) !important;\n    gap:10px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-metric{\n    min-width:0 !important;\n    min-height:122px !important;\n    padding:14px 12px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-metric-label{\n    font-size:11px !important;\n    line-height:1.35;\n    overflow-wrap:anywhere;\n  }\n  #cofdar-intelligence-v2 .cfi-metric-value{\n    font-size:clamp(24px,8vw,32px) !important;\n    line-height:1.03 !important;\n    overflow-wrap:anywhere !important;\n    word-break:normal;\n  }\n  #cofdar-intelligence-v2 .cfi-metric-unit,\n  #cofdar-intelligence-v2 .cfi-metric-note{\n    font-size:10px !important;\n    line-height:1.4;\n  }\n\n  \/* Derived indicators and trend summaries *\/\n  #cofdar-intelligence-v2 .cfi-trend-summary{\n    grid-template-columns:1fr !important;\n    gap:8px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-mini{\n    min-width:0;\n    display:grid !important;\n    grid-template-columns:minmax(0,1fr) auto;\n    align-items:center;\n    gap:10px;\n    padding:11px 12px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-mini-label{\n    font-size:10px !important;\n    line-height:1.35;\n  }\n  #cofdar-intelligence-v2 .cfi-mini-value{\n    font-size:17px !important;\n    line-height:1.1;\n    text-align:end;\n  }\n  #cofdar-intelligence-v2 .cfi-mini .cfi-notice{\n    grid-column:1\/-1;\n    margin:0 !important;\n    font-size:10px !important;\n  }\n\n  \/* Panels, charts, ranking *\/\n  #cofdar-intelligence-v2 .cfi-grid-2{\n    grid-template-columns:minmax(0,1fr) !important;\n    gap:14px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-panel{\n    width:100%;\n    max-width:100%;\n    min-width:0 !important;\n    padding:14px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-chart-shell,\n  #cofdar-intelligence-v2 .cfi-chart-wrap{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n    overflow:hidden !important;\n  }\n  #cofdar-intelligence-v2 .cfi-chart-wrap svg{\n    display:block;\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n    height:auto !important;\n    min-height:0 !important;\n    aspect-ratio:860\/330;\n  }\n  #cofdar-intelligence-v2 .cfi-rank{\n    padding:14px 12px;\n  }\n  #cofdar-intelligence-v2 .cfi-benchmark-row{\n    grid-template-columns:minmax(82px,1fr) minmax(70px,1.1fr) auto !important;\n    gap:7px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-benchmark-label{font-size:10px !important}\n  #cofdar-intelligence-v2 .cfi-benchmark-value{font-size:10px !important}\n\n  \/* Partner list *\/\n  #cofdar-intelligence-v2 .cfi-tabs{\n    display:flex !important;\n    flex-wrap:nowrap !important;\n    overflow-x:auto !important;\n    gap:6px;\n    scrollbar-width:none;\n  }\n  #cofdar-intelligence-v2 .cfi-tabs::-webkit-scrollbar{display:none}\n  #cofdar-intelligence-v2 .cfi-tab{\n    flex:0 0 auto;\n    width:auto !important;\n    min-height:42px !important;\n    padding:8px 12px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-partner{\n    grid-template-columns:24px minmax(0,1fr) auto !important;\n    gap:8px !important;\n    padding:12px 0 !important;\n  }\n  #cofdar-intelligence-v2 .cfi-partner-bar-bg{display:none !important}\n  #cofdar-intelligence-v2 .cfi-partner-name{\n    white-space:normal !important;\n    overflow-wrap:anywhere;\n  }\n  #cofdar-intelligence-v2 .cfi-partner-value{\n    white-space:nowrap;\n    font-size:11px;\n  }\n\n  \/* Cofdar Market Read *\/\n  #cofdar-intelligence-v2 .cfi-insights{\n    grid-template-columns:minmax(0,1fr) !important;\n    gap:10px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-insight{\n    width:100%;\n    min-width:0;\n    min-height:0 !important;\n    padding:16px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-insight p{\n    font-size:13px !important;\n    line-height:1.6 !important;\n  }\n\n  \/* Global leaders becomes a swipe carousel *\/\n  #cofdar-intelligence-v2 .cfi-leaders{\n    display:flex !important;\n    grid-template-columns:none !important;\n    gap:10px !important;\n    overflow-x:auto !important;\n    overflow-y:hidden !important;\n    scroll-snap-type:x proximity;\n    scrollbar-width:none;\n    padding-bottom:5px;\n  }\n  #cofdar-intelligence-v2 .cfi-leaders::-webkit-scrollbar{display:none}\n  #cofdar-intelligence-v2 .cfi-leader{\n    flex:0 0 min(76vw,260px);\n    min-width:0;\n    scroll-snap-align:start;\n  }\n\n  \/* Controls *\/\n  #cofdar-intelligence-v2 .cfi-toolrow{\n    width:100%;\n    display:grid !important;\n    grid-template-columns:1fr !important;\n    gap:8px !important;\n    align-items:stretch !important;\n  }\n  #cofdar-intelligence-v2 .cfi-toolrow > *{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n  }\n\n  \/* Corridors *\/\n  #cofdar-intelligence-v2 .cfi-route{\n    grid-template-columns:minmax(0,1fr) 20px minmax(0,1fr) !important;\n    gap:6px !important;\n    padding:12px 0 !important;\n  }\n  #cofdar-intelligence-v2 .cfi-route strong{\n    grid-column:1\/-1 !important;\n    justify-self:start;\n    font-size:11px !important;\n    white-space:normal;\n  }\n  #cofdar-intelligence-v2 .cfi-route button{\n    min-width:0;\n    white-space:normal;\n    overflow-wrap:anywhere;\n    font-size:12px;\n  }\n\n  \/* Tables scroll inside their own frame, never the page *\/\n  #cofdar-intelligence-v2 .cfi-tablewrap{\n    width:100% !important;\n    max-width:100% !important;\n    min-width:0 !important;\n    overflow-x:auto !important;\n    overflow-y:auto !important;\n    -webkit-overflow-scrolling:touch;\n    max-height:430px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-tablewrap table{\n    width:max-content !important;\n    min-width:640px !important;\n    max-width:none !important;\n  }\n\n  \/* Source *\/\n  #cofdar-intelligence-v2 .cfi-source{\n    padding:14px !important;\n  }\n  #cofdar-intelligence-v2 .cfi-source-copy{\n    font-size:11px !important;\n    line-height:1.65 !important;\n  }\n  #cofdar-intelligence-v2 .cfi-source-tags{\n    display:flex;\n    flex-wrap:wrap;\n    gap:6px;\n  }\n  #cofdar-intelligence-v2 details > summary{\n    padding:12px 0 !important;\n    font-size:13px;\n  }\n}\n\n@media (max-width:360px){\n  #cofdar-intelligence-v2 .cfi-metrics{\n    grid-template-columns:1fr !important;\n  }\n  #cofdar-intelligence-v2 .cfi-proof{\n    grid-template-columns:1fr 1fr !important;\n  }\n}\n\n<\/style>\n\n<script>\n(function(){\n  const ROOT = document.getElementById('cofdar-intelligence-v2');\n  if(!ROOT) return;\n\n  const DATA_URL = 'https:\/\/cofdar.com\/cofdar-market-source\/ico-coffee-trade-2025.json';\n  let IS_AR = (document.documentElement.lang || 'ar').toLowerCase().startsWith('ar');\n  const LOCALE = IS_AR ? 'ar-SA' : 'en-US';\n\n  if(IS_AR) ROOT.classList.add('cfi-rtl');\n\n  const T = {\n    en:{\n      loading:'Loading Cofdar Coffee Intelligence...',\n      eyebrow:'COFDAR MARKET INTELLIGENCE',\n      yearBadge:'Official ICO data snapshot',\n      title:'Coffee Intelligence, Country by Country.',\n      lead:'Explore official coffee trade, production and consumption data through a clear market intelligence layer built for coffee professionals.',\n      selectCountry:'Select a country',\n      searchCountry:'Search country...',\n      snapshot:'Market Snapshot',\n      snapshotSub:'Key indicators available for the selected market',\n      history:'Historical Trend',\n      historySub:'Long-term coffee market development',\n      rankings:'Global Position',\n      rankingsSub:'Selected country ranking in the ICO dataset',\n      partners:'Trade Partners',\n      partnersSub:'Leading origins and destinations by reported volume',\n      insights:'Cofdar Market Read',\n      insightsSub:'A concise commercial reading derived from the selected market data',\n      leaders:'Global Leaders',\n      leadersSub:'Leading coffee markets in the current dataset',\n      source:'Data Source & Methodology',\n      sourceCopy:'Data sourced from the International Coffee Organization (ICO), Coffee Trade Globe. Cofdar provides the presentation, navigation and derived market observations.',\n      methodology:'Volumes are shown in green bean equivalent 60 kg bags. Trade values are customs values in USD.',\n      producer:'Coffee producer',\n      nonProducer:'Non-producing market',\n      icoCode:'ICO code',\n      year:'Data year',\n      generated:'ICO generated',\n      retrieved:'Retrieved',\n      countries:'countries & markets',\n      copyLink:'Copy country link',\n      copied:'Link copied',\n      noData:'No data available for this view.',\n      imports:'Imports',\n      importValue:'Import Value',\n      exports:'Exports',\n      exportValue:'Export Value',\n      production:'Production',\n      consumption:'Consumption',\n      reexports:'Re-exports',\n      reexportsValue:'Re-export Value',\n      perCap:'Consumption Per Capita',\n      arabica:'Arabica Share',\n      importRank:'Import Rank',\n      prodRank:'Production Rank',\n      consRank:'Consumption Rank',\n      bags:'60 kg bags',\n      usd:'USD',\n      kgPerPerson:'kg per person',\n      global:'Global',\n      topOrigins:'Top Origins',\n      topDestinations:'Export Destinations',\n      topReexportDestinations:'Re-export Destinations',\n      latestValue:'Latest value',\n      startSeries:'Series starts',\n      annualChange:'Latest annual change',\n      notRanked:'Not ranked'\n    },\n    ar:{\n      loading:'\u062c\u0627\u0631\u064a \u062a\u062d\u0645\u064a\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0643\u0648\u0641\u062f\u0627\u0631...',\n      eyebrow:'\u0643\u0648\u0641\u062f\u0627\u0631 \u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u062a\u062d\u0644\u064a\u0644\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629',\n      yearBadge:'\u0644\u0642\u0637\u0629 \u0628\u064a\u0627\u0646\u0627\u062a \u0631\u0633\u0645\u064a\u0629 \u0645\u0646 ICO',\n      title:'\u0630\u0643\u0627\u0621 \u0633\u0648\u0642 \u0627\u0644\u0642\u0647\u0648\u0629\u060c \u062f\u0648\u0644\u0629 \u0628\u062f\u0648\u0644\u0629.',\n      lead:'\u0627\u0633\u062a\u0643\u0634\u0641 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629 \u0627\u0644\u0631\u0633\u0645\u064a\u0629 \u0641\u064a \u0627\u0644\u062a\u062c\u0627\u0631\u0629 \u0648\u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0648\u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0648\u0627\u062c\u0647\u0629 \u0648\u0627\u0636\u062d\u0629 \u062a\u0633\u0627\u0639\u062f \u0627\u0644\u0645\u0647\u0646\u064a\u064a\u0646 \u0641\u064a \u0642\u0637\u0627\u0639 \u0627\u0644\u0642\u0647\u0648\u0629 \u0639\u0644\u0649 \u0641\u0647\u0645 \u0627\u0644\u0623\u0633\u0648\u0627\u0642 \u0628\u0633\u0631\u0639\u0629.',\n      selectCountry:'\u0627\u062e\u062a\u0631 \u0627\u0644\u062f\u0648\u0644\u0629',\n      searchCountry:'\u0627\u0628\u062d\u062b \u0639\u0646 \u062f\u0648\u0644\u0629...',\n      snapshot:'\u0645\u0644\u062e\u0635 \u0627\u0644\u0633\u0648\u0642',\n      snapshotSub:'\u0623\u0647\u0645 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062a \u0627\u0644\u0645\u062a\u0627\u062d\u0629 \u0644\u0644\u0633\u0648\u0642 \u0627\u0644\u0645\u062e\u062a\u0627\u0631',\n      history:'\u0627\u0644\u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u062a\u0627\u0631\u064a\u062e\u064a',\n      historySub:'\u062a\u0637\u0648\u0631 \u0633\u0648\u0642 \u0627\u0644\u0642\u0647\u0648\u0629 \u0639\u0628\u0631 \u0627\u0644\u0633\u0646\u0648\u0627\u062a',\n      rankings:'\u0627\u0644\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0639\u0627\u0644\u0645\u064a',\n      rankingsSub:'\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u062f\u0648\u0644\u0629 \u0636\u0645\u0646 \u0628\u064a\u0627\u0646\u0627\u062a \u0645\u0646\u0638\u0645\u0629 \u0627\u0644\u0642\u0647\u0648\u0629 \u0627\u0644\u062f\u0648\u0644\u064a\u0629',\n      partners:'\u0627\u0644\u0634\u0631\u0643\u0627\u0621 \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0648\u0646',\n      partnersSub:'\u0623\u0647\u0645 \u062f\u0648\u0644 \u0627\u0644\u0645\u0646\u0634\u0623 \u0648\u0627\u0644\u0648\u062c\u0647\u0627\u062a \u062d\u0633\u0628 \u0627\u0644\u062d\u062c\u0645 \u0627\u0644\u0645\u0628\u0644\u063a \u0639\u0646\u0647',\n      insights:'\u0642\u0631\u0627\u0621\u0629 \u0643\u0648\u0641\u062f\u0627\u0631 \u0644\u0644\u0633\u0648\u0642',\n      insightsSub:'\u0642\u0631\u0627\u0621\u0629 \u062a\u062c\u0627\u0631\u064a\u0629 \u0645\u062e\u062a\u0635\u0631\u0629 \u0645\u0633\u062a\u062e\u0631\u062c\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0645\u0646 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0633\u0648\u0642 \u0627\u0644\u0645\u062e\u062a\u0627\u0631\u0629',\n      leaders:'\u0627\u0644\u0623\u0633\u0648\u0627\u0642 \u0627\u0644\u0631\u0627\u0626\u062f\u0629 \u0639\u0627\u0644\u0645\u064a\u0627',\n      leadersSub:'\u0623\u0643\u0628\u0631 \u0623\u0633\u0648\u0627\u0642 \u0627\u0644\u0642\u0647\u0648\u0629 \u0636\u0645\u0646 \u0645\u062c\u0645\u0648\u0639\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062d\u0627\u0644\u064a\u0629',\n      source:'\u0627\u0644\u0645\u0635\u062f\u0631 \u0648\u0627\u0644\u0645\u0646\u0647\u062c\u064a\u0629',\n      sourceCopy:'\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0645\u0646 \u0645\u0646\u0638\u0645\u0629 \u0627\u0644\u0642\u0647\u0648\u0629 \u0627\u0644\u062f\u0648\u0644\u064a\u0629 ICO \u0639\u0628\u0631 Coffee Trade Globe. \u062a\u0642\u062f\u0645 \u0643\u0648\u0641\u062f\u0627\u0631 \u0623\u0633\u0644\u0648\u0628 \u0627\u0644\u0639\u0631\u0636 \u0648\u0627\u0644\u062a\u0646\u0642\u0644 \u0648\u0627\u0644\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0627\u0644\u062a\u062d\u0644\u064a\u0644\u064a\u0629 \u0627\u0644\u0645\u0634\u062a\u0642\u0629 \u0645\u0646 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a.',\n      methodology:'\u062a\u0639\u0631\u0636 \u0627\u0644\u0623\u062d\u062c\u0627\u0645 \u0628\u0645\u0643\u0627\u0641\u0626 \u0627\u0644\u0628\u0646 \u0627\u0644\u0623\u062e\u0636\u0631 \u0641\u064a \u0623\u0643\u064a\u0627\u0633 60 \u0643\u062c\u0645\u060c \u0648\u0627\u0644\u0642\u064a\u0645 \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0629 \u0628\u0627\u0644\u062f\u0648\u0644\u0627\u0631 \u0627\u0644\u0623\u0645\u0631\u064a\u0643\u064a.',\n      producer:'\u062f\u0648\u0644\u0629 \u0645\u0646\u062a\u062c\u0629 \u0644\u0644\u0642\u0647\u0648\u0629',\n      nonProducer:'\u0633\u0648\u0642 \u063a\u064a\u0631 \u0645\u0646\u062a\u062c',\n      icoCode:'\u0631\u0645\u0632 ICO',\n      year:'\u0633\u0646\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a',\n      generated:'\u062a\u0648\u0644\u064a\u062f \u0628\u064a\u0627\u0646\u0627\u062a ICO',\n      retrieved:'\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0633\u062a\u0631\u062c\u0627\u0639',\n      countries:'\u062f\u0648\u0644\u0629 \u0648\u0633\u0648\u0642',\n      copyLink:'\u0646\u0633\u062e \u0631\u0627\u0628\u0637 \u0627\u0644\u062f\u0648\u0644\u0629',\n      copied:'\u062a\u0645 \u0646\u0633\u062e \u0627\u0644\u0631\u0627\u0628\u0637',\n      noData:'\u0644\u0627 \u062a\u0648\u062c\u062f \u0628\u064a\u0627\u0646\u0627\u062a \u0645\u062a\u0627\u062d\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0639\u0631\u0636.',\n      imports:'\u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a',\n      importValue:'\u0642\u064a\u0645\u0629 \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a',\n      exports:'\u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a',\n      exportValue:'\u0642\u064a\u0645\u0629 \u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a',\n      production:'\u0627\u0644\u0625\u0646\u062a\u0627\u062c',\n      consumption:'\u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643',\n      reexports:'\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0635\u062f\u064a\u0631',\n      reexportsValue:'\u0642\u064a\u0645\u0629 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0635\u062f\u064a\u0631',\n      perCap:'\u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u0627\u0644\u0641\u0631\u062f',\n      arabica:'\u062d\u0635\u0629 \u0623\u0631\u0627\u0628\u064a\u0643\u0627',\n      importRank:'\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a',\n      prodRank:'\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0625\u0646\u062a\u0627\u062c',\n      consRank:'\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643',\n      bags:'\u0643\u064a\u0633 60 \u0643\u062c\u0645',\n      usd:'\u062f\u0648\u0644\u0627\u0631 \u0623\u0645\u0631\u064a\u0643\u064a',\n      kgPerPerson:'\u0643\u062c\u0645 \u0644\u0644\u0641\u0631\u062f',\n      global:'\u0639\u0627\u0644\u0645\u064a',\n      topOrigins:'\u0623\u0643\u0628\u0631 \u062f\u0648\u0644 \u0627\u0644\u0645\u0646\u0634\u0623',\n      topDestinations:'\u0648\u062c\u0647\u0627\u062a \u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a',\n      topReexportDestinations:'\u0648\u062c\u0647\u0627\u062a \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0635\u062f\u064a\u0631',\n      latestValue:'\u0622\u062e\u0631 \u0642\u064a\u0645\u0629',\n      startSeries:'\u0628\u062f\u0627\u064a\u0629 \u0627\u0644\u0633\u0644\u0633\u0644\u0629',\n      annualChange:'\u0622\u062e\u0631 \u062a\u063a\u064a\u0631 \u0633\u0646\u0648\u064a',\n      notRanked:'\u063a\u064a\u0631 \u0645\u0635\u0646\u0641'\n    }\n  }[IS_AR ? 'ar' : 'en'];\n\n  \/* Data is loaded from the existing Cofdar JSON source at runtime. *\/\n  let DATA = null;\n  let COUNTRIES = {};\n  let CURRENT_ISO = 'SA';\n  let COUNTRY_QUERY = '';\n  let SERIES_KEY = null;\n  let PARTNER_KEY = null;\n  let LEADER_KEY = 'imports';\n\n  const regionNames = (() => {\n    try{\n      return new Intl.DisplayNames([IS_AR ? 'ar' : 'en'], { type:'region' });\n    }catch(e){\n      return null;\n    }\n  })();\n\n  function esc(v){\n    return String(v ?? '')\n      .replace(\/&\/g,'&amp;')\n      .replace(\/<\/g,'&lt;')\n      .replace(\/>\/g,'&gt;')\n      .replace(\/\"\/g,'&quot;')\n      .replace(\/'\/g,'&#039;');\n  }\n\n  function valid(v){\n    return v !== null && v !== undefined && v !== '' && typeof v !== 'boolean' && Number.isFinite(Number(v));\n  }\n\n  function num(v){\n    if(!valid(v)) return '\u2014';\n    return new Intl.NumberFormat(LOCALE).format(Number(v));\n  }\n\n  function compact(v){\n    if(!valid(v)) return '\u2014';\n    return new Intl.NumberFormat(LOCALE,{\n      notation:'compact',\n      maximumFractionDigits:1\n    }).format(Number(v));\n  }\n\n  function usd(v){\n    if(!valid(v)) return '\u2014';\n    return new Intl.NumberFormat(LOCALE,{\n      style:'currency',\n      currency:'USD',\n      notation: Math.abs(Number(v)) >= 1000000 ? 'compact' : 'standard',\n      maximumFractionDigits:1\n    }).format(Number(v));\n  }\n\n  function pct(v){\n    if(!valid(v)) return '\u2014';\n    return new Intl.NumberFormat(LOCALE,{\n      style:'percent',\n      maximumFractionDigits:1\n    }).format(Number(v));\n  }\n\n  function rank(v){\n    if(!valid(v)) return T.notRanked;\n    return '#' + num(v);\n  }\n\n  function getCountryName(iso){\n    try{\n      if(regionNames && \/^[A-Z]{2}$\/.test(iso)){\n        return regionNames.of(iso) || iso;\n      }\n    }catch(e){}\n    return iso;\n  }\n\n  function getFlag(iso){\n    if(!\/^[A-Z]{2}$\/.test(iso)) return '\ud83c\udf10';\n    return iso.split('').map(c => String.fromCodePoint(127397 + c.charCodeAt())).join('');\n  }\n\n  function formatDate(v){\n    if(!v) return '\u2014';\n    try{\n      return new Intl.DateTimeFormat(LOCALE,{\n        year:'numeric', month:'short', day:'numeric'\n      }).format(new Date(v));\n    }catch(e){\n      return v;\n    }\n  }\n\n  function getHashCountry(){\n    const m = (window.location.hash || '').match(\/country=([A-Z]{2})\/i);\n    if(m && COUNTRIES[m[1].toUpperCase()]) return m[1].toUpperCase();\n    return COUNTRIES.SA ? 'SA' : Object.keys(COUNTRIES)[0];\n  }\n\n  function setHashCountry(iso){\n    const base = window.location.pathname + window.location.search;\n    try { history.replaceState(null, '', base + '#country=' + iso); } catch(e) {}\n  }\n\n  function countryArray(){\n    return Object.keys(COUNTRIES)\n      .map(iso => ({ iso, name:getCountryName(iso) }))\n      .sort((a,b) => a.name.localeCompare(b.name, IS_AR ? 'ar' : 'en'));\n  }\n\n  function filteredCountries(){\n    const q = COUNTRY_QUERY.trim().toLowerCase();\n    return countryArray().filter(item => {\n      if(!q) return true;\n      return item.name.toLowerCase().includes(q) || item.iso.toLowerCase().includes(q);\n    });\n  }\n\n  function availableSeries(c){\n    const all = [\n      { key:'consumptionSeries', label:T.consumption, color:'#B27244' },\n      { key:'productionSeries', label:T.production, color:'#6F7752' },\n      { key:'exportSeries', label:T.exports, color:'#2B406F' }\n    ];\n    return all.filter(x => Array.isArray(c[x.key]) && c[x.key].length > 1);\n  }\n\n  function availablePartners(c){\n    const tabs = [];\n    if(Array.isArray(c.topOrig) && c.topOrig.length) tabs.push({ key:'topOrig', label:T.topOrigins });\n    if(Array.isArray(c.topDest) && c.topDest.length) tabs.push({ key:'topDest', label:T.topDestinations });\n    if(Array.isArray(c.topReexDest) && c.topReexDest.length) tabs.push({ key:'topReexDest', label:T.topReexportDestinations });\n    return tabs;\n  }\n\n  function latestChange(series){\n    if(!Array.isArray(series) || series.length < 2) return null;\n    const last = series[series.length - 1];\n    const prev = series[series.length - 2];\n    if(!last || !valid(last[1]) || Number(last[0])-Number(prev?.[0]) !== 1) return null;\n    if(!prev || !valid(prev[1]) || Number(prev[1]) === 0) return null;\n    return {\n      latest:last[1],\n      year:last[0],\n      startYear:series[0][0],\n      change:(Number(last[1]) - Number(prev[1])) \/ Number(prev[1])\n    };\n  }\n\n  function metricList(c){\n    const m = [];\n    const add = (label, value, unit, note='') => {\n      if(value === null || value === undefined) return;\n      m.push({ label, value, unit, note });\n    };\n\n    if(c.producer){\n      if(valid(c.production)) add(T.production, compact(c.production), T.bags, valid(c.prodRank) ? T.prodRank + ' ' + rank(c.prodRank) : '');\n      if(valid(c.exports)) add(T.exports, compact(c.exports), T.bags);\n      if(valid(c.exportsValue)) add(T.exportValue, usd(c.exportsValue), T.usd);\n      if(valid(c.consumption)) add(T.consumption, compact(c.consumption), T.bags, valid(c.consRank) ? T.consRank + ' ' + rank(c.consRank) : '');\n      if(valid(c.arabicaShare)) add(T.arabica, pct(c.arabicaShare), '');\n      if(valid(c.perCap)) add(T.perCap, num(c.perCap), T.kgPerPerson);\n      if(m.length < 6 && valid(c.imports)) add(T.imports, compact(c.imports), T.bags);\n    }else{\n      if(valid(c.imports)) add(T.imports, compact(c.imports), T.bags, valid(c.impRank) ? T.importRank + ' ' + rank(c.impRank) : '');\n      if(valid(c.importsValue)) add(T.importValue, usd(c.importsValue), T.usd);\n      if(valid(c.consumption)) add(T.consumption, compact(c.consumption), T.bags, valid(c.consRank) ? T.consRank + ' ' + rank(c.consRank) : '');\n      if(valid(c.reexports)) add(T.reexports, compact(c.reexports), T.bags);\n      if(valid(c.perCap)) add(T.perCap, num(c.perCap), T.kgPerPerson);\n      if(valid(c.impRank)) add(T.importRank, rank(c.impRank), T.global);\n    }\n\n    if(m.length < 6 && valid(c.reexportsValue)) add(T.reexportsValue, usd(c.reexportsValue), T.usd);\n    const fallbackLabels={imports:T.imports,importsValue:T.importValue,exports:T.exports,exportsValue:T.exportValue,reexports:T.reexports,reexportsValue:T.reexportsValue,production:T.production,consumption:T.consumption,perCap:T.perCap,arabicaShare:T.arabica};\n    ['imports','importsValue','exports','exportsValue','reexports','reexportsValue','production','consumption','perCap','arabicaShare'].forEach(k=>{\n      const lab=fallbackLabels[k];\n      if(valid(c[k]) && lab && !m.some(x=>x.label===lab)){\n        add(lab,k.endsWith('Value')?usd(c[k]):k==='arabicaShare'?pct(c[k]):k==='perCap'?num(c[k]):compact(c[k]),k.endsWith('Value')?T.usd:k==='perCap'?T.kgPerPerson:k==='arabicaShare'?'':T.bags);\n      }\n    }); return m;\n  }\n\n  function renderMetrics(c){\n    return metricList(c).map(item => `\n      <div class=\"cfi-card cfi-metric\">\n        <span class=\"cfi-metric-label\">${esc(item.label)}<\/span>\n        <strong class=\"cfi-metric-value\">${esc(item.value)}<\/strong>\n        ${item.unit ? `<span class=\"cfi-metric-unit\">${esc(item.unit)}<\/span>` : ''}\n        ${item.note ? `<div class=\"cfi-metric-note\">${esc(item.note)}<\/div>` : ''}\n      <\/div>\n    `).join('');\n  }\n\n  function buildChart(series, color){\n    if(!Array.isArray(series) || series.length < 2){\n      return `<div class=\"cfi-chart-empty\">${esc(T.noData)}<\/div>`;\n    }\n\n    const data = series.filter(x => Array.isArray(x) && valid(x[0]) && valid(x[1]));\n    if(data.length < 2){\n      return `<div class=\"cfi-chart-empty\">${esc(T.noData)}<\/div>`;\n    }\n\n    const shown = data.sort((a,b)=>Number(a[0])-Number(b[0]));\n    const W = 860, H = 330;\n    const pad = { l:64, r:22, t:28, b:50 };\n\n    const vals = shown.map(x => Number(x[1]));\n    let min = Math.min(...vals);\n    let max = Math.max(...vals);\n    if(max === min){\n      max += 1;\n      min -= 1;\n    }\n    const range = max - min;\n    min = Math.max(0, min - range * .12);\n    max = max + range * .12;\n\n    const xScale = i => pad.l + i * ((W - pad.l - pad.r) \/ (shown.length - 1));\n    const yScale = v => pad.t + (max - v) * ((H - pad.t - pad.b) \/ (max - min));\n\n    const pts = shown.map((d,i) => ({\n      year:d[0], value:Number(d[1]), x:xScale(i), y:yScale(Number(d[1]))\n    }));\n\n    const line = pts.map((p,i) => `${i ? 'L':'M'} ${p.x.toFixed(1)} ${p.y.toFixed(1)}`).join(' ');\n    const area = `${line} L ${pts[pts.length - 1].x.toFixed(1)} ${H - pad.b} L ${pts[0].x.toFixed(1)} ${H - pad.b} Z`;\n\n    let grid = '';\n    for(let i=0;i<5;i++){\n      const gy = pad.t + (H - pad.t - pad.b) * (i \/ 4);\n      const gv = max - (max - min) * (i \/ 4);\n      grid += `\n        <line x1=\"${pad.l}\" y1=\"${gy}\" x2=\"${W - pad.r}\" y2=\"${gy}\" stroke=\"#E8EDF3\" stroke-width=\"1\"><\/line>\n        <text x=\"${pad.l - 10}\" y=\"${gy + 4}\" text-anchor=\"end\" font-size=\"10\" fill=\"#8B97A6\">${esc(compact(gv))}<\/text>\n      `;\n    }\n\n    const labelsEvery = Math.max(1,Math.ceil(shown.length \/ 5));\n    const labels = pts.map((p,i) => {\n      if(i % labelsEvery !== 0 && i !== pts.length - 1) return '';\n      return `<text x=\"${p.x}\" y=\"${H - 18}\" text-anchor=\"middle\" font-size=\"10\" fill=\"#8B97A6\">${esc(p.year)}<\/text>`;\n    }).join('');\n\n    const dots = pts.map(p => `\n      <circle cx=\"${p.x}\" cy=\"${p.y}\" r=\"3\" tabindex=\"0\" fill=\"#fff\" stroke=\"${color}\" stroke-width=\"2\">\n        <title>${esc(p.year)}: ${esc(num(p.value))}<\/title>\n      <\/circle>\n    `).join('');\n\n    return `\n      <svg viewBox=\"0 0 ${W} ${H}\" role=\"img\" aria-label=\"Historical trend chart\">\n        <defs>\n          <linearGradient id=\"cfiArea2\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n            <stop offset=\"0%\" stop-color=\"${color}\" stop-opacity=\".26\"><\/stop>\n            <stop offset=\"100%\" stop-color=\"${color}\" stop-opacity=\".03\"><\/stop>\n          <\/linearGradient>\n        <\/defs>\n        ${grid}\n        <path d=\"${area}\" fill=\"url(#cfiArea2)\"><\/path>\n        <path d=\"${line}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"3\" stroke-linejoin=\"round\" stroke-linecap=\"round\"><\/path>\n        ${dots}\n        ${labels}\n      <\/svg>\n    `;\n  }\n\n  function renderRanks(c){\n    const items = [\n      [T.importRank, c.impRank],\n      [T.prodRank, c.prodRank],\n      [T.consRank, c.consRank]\n    ].filter(x => valid(x[1]));\n\n    if(!items.length){\n      return `<div class=\"cfi-chart-empty\">${esc(T.noData)}<\/div>`;\n    }\n\n    const benchmark = items.map(row => {\n      const r = Number(row[1]);\n      const width = Math.max(8, Math.min(100, ((202 - Math.min(r,202)) \/ 201) * 100));\n      return `<div class=\"cfi-benchmark-row\"><span class=\"cfi-benchmark-label\">${esc(row[0])}<\/span><div class=\"cfi-benchmark-track\"><div class=\"cfi-benchmark-fill\" style=\"width:${width.toFixed(1)}%\"><\/div><\/div><strong class=\"cfi-benchmark-value\">${esc(rank(r))}<\/strong><\/div>`;\n    }).join('');\n    return `\n      <div class=\"cfi-ranks\">\n        ${items.map(row => `\n          <div class=\"cfi-rank\">\n            <span class=\"cfi-rank-label\">${esc(row[0])}<\/span>\n            <strong class=\"cfi-rank-value\">${esc(rank(row[1]))}<\/strong>\n          <\/div>\n        `).join('')}\n      <\/div>\n      <div class=\"cfi-benchmark\">${benchmark}<\/div>\n    `;\n  }\n\n  function renderPartners(c){\n    const tabs = availablePartners(c);\n    if(!tabs.length) return `<div class=\"cfi-chart-empty\">${esc(T.noData)}<\/div>`;\n\n    if(!PARTNER_KEY || !tabs.some(t => t.key === PARTNER_KEY)){\n      PARTNER_KEY = tabs[0].key;\n    }\n\n    const list = (c[PARTNER_KEY] || []).slice(0,25);\n    const max = Math.max(...list.map(x => Number(x[2]) || 0), 1);\n\n    return `\n      <div class=\"cfi-tabs\">\n        ${tabs.map(tab => `\n          <button type=\"button\" class=\"cfi-tab ${tab.key === PARTNER_KEY ? 'is-active' : ''}\" data-partner-tab=\"${esc(tab.key)}\">\n            ${esc(tab.label)}\n          <\/button>\n        `).join('')}\n      <\/div>\n      <div class=\"cfi-partner-list\">\n        ${list.map((item,i) => {\n          const iso = item[0];\n          const name = getCountryName(iso) || item[1] || iso;\n          const value = Number(item[2]) || 0;\n          const width = Math.max(0, Math.min(100,(value \/ max) * 100));\n\n          return `\n            <div class=\"cfi-partner\">\n              <div class=\"cfi-partner-rank\">${i+1}<\/div>\n              <button type=\"button\" class=\"cfi-partner-name\" data-quick-country=\"${esc(iso)}\" title=\"${esc(name)}\">${getFlag(iso)} ${esc(name)}<\/button>\n              <div class=\"cfi-partner-bar-bg\"><div class=\"cfi-partner-bar\" style=\"width:${width.toFixed(1)}%\"><\/div><\/div>\n              <div class=\"cfi-partner-value\">${esc(num(value))}<\/div>\n            <\/div>\n          `;\n        }).join('')}\n      <\/div>\n    `;\n  }\n\n  function insightTexts(c, iso){\n    const name = getCountryName(iso);\n    const arr = [];\n\n    if(valid(c.impRank) && c.impRank <= 25){\n      arr.push(\n        IS_AR\n          ? `${name} \u0636\u0645\u0646 \u0623\u0643\u0628\u0631 25 \u0633\u0648\u0642\u0627 \u0639\u0627\u0644\u0645\u064a\u0627 \u0645\u0646 \u062d\u064a\u062b \u0648\u0627\u0631\u062f\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629 \u0641\u064a \u0633\u0646\u0629 ${DATA.data.year}\u060c \u0648\u064a\u062d\u062a\u0644 \u0627\u0644\u0645\u0631\u062a\u0628\u0629 ${rank(c.impRank)}.`\n          : `${name} ranks among the top 25 coffee importing markets globally in ${DATA.data.year}, at ${rank(c.impRank)}.`\n      );\n    }\n\n    if(valid(c.prodRank) && c.prodRank <= 20){\n      arr.push(\n        IS_AR\n          ? `${name} \u064a\u0639\u062f \u0645\u0646 \u0623\u0628\u0631\u0632 \u0627\u0644\u0645\u0646\u062a\u062c\u064a\u0646 \u0639\u0627\u0644\u0645\u064a\u0627\u060c \u0648\u064a\u0638\u0647\u0631 \u0641\u064a \u0627\u0644\u0645\u0631\u062a\u0628\u0629 ${rank(c.prodRank)} \u0636\u0645\u0646 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0627\u0644\u062d\u0627\u0644\u064a\u0629.`\n          : `${name} is one of the major producing origins, ranking ${rank(c.prodRank)} in the current production dataset.`\n      );\n    }\n\n    const change = latestChange(c.consumptionSeries);\n    if(change){\n      const sign = change.change >= 0 ? '+' : '';\n      arr.push(\n        IS_AR\n          ? `\u0633\u062c\u0644 \u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u062a\u063a\u064a\u0631\u0627 \u0633\u0646\u0648\u064a\u0627 \u0623\u062e\u064a\u0631\u0627 \u0628\u0645\u0642\u062f\u0627\u0631 ${sign}${(change.change*100).toFixed(1)}% \u0641\u064a ${change.year}.`\n          : `The latest annual change in coffee consumption was ${sign}${(change.change*100).toFixed(1)}% in ${change.year}.`\n      );\n    }\n\n    if(Array.isArray(c.topOrig) && c.topOrig.length && valid(c.imports) && Number(c.imports) > 0){\n      const top = c.topOrig[0];\n      const share = Number(top[2]) \/ Number(c.imports);\n      if(share > 1 || share < 0) return arr;\n      const topName = getCountryName(top[0]) || top[1] || top[0];\n      arr.push(\n        IS_AR\n          ? `${topName} \u0647\u0648 \u0623\u0643\u0628\u0631 \u0645\u0646\u0634\u0623 \u0645\u0633\u062c\u0644 \u0644\u0647\u0630\u0627 \u0627\u0644\u0633\u0648\u0642 \u0628\u062d\u0635\u0629 \u062a\u0642\u0627\u0631\u0628 ${(share*100).toFixed(1)}% \u0645\u0646 \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a \u0627\u0644\u0645\u0628\u0644\u063a \u0639\u0646\u0647\u0627.`\n          : `${topName} is the leading recorded origin, representing about ${(share*100).toFixed(1)}% of reported imports.`\n      );\n    }\n\n    if(valid(c.reexports) && valid(c.imports) && Number(c.imports) > 0){\n      const rr = Number(c.reexports) \/ Number(c.imports);\n      if(rr >= .05){\n        arr.push(IS_AR\n          ? `\u062a\u0645\u062b\u0644 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0635\u062f\u064a\u0631 \u0646\u062d\u0648 ${(rr*100).toFixed(1)}% \u0645\u0646 \u062d\u062c\u0645 \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a \u0627\u0644\u0645\u0633\u062c\u0644\u060c \u0645\u0627 \u064a\u0636\u064a\u0641 \u0628\u0639\u062f\u0627 \u0644\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u0632\u064a\u0639 \u0641\u064a \u062d\u0631\u0643\u0629 \u0627\u0644\u0633\u0648\u0642.`\n          : `Re-exports equal about ${(rr*100).toFixed(1)}% of reported import volume, adding a redistribution dimension to this market.`);\n      }\n    }\n\n    if(valid(c.exports) && valid(c.production) && Number(c.production) > 0 && arr.length < 4){\n      const er = Number(c.exports) \/ Number(c.production);\n      if(er >= .5){\n        arr.push(IS_AR\n          ? `\u064a\u0639\u0627\u062f\u0644 \u062d\u062c\u0645 \u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a \u0646\u062d\u0648 ${(er*100).toFixed(1)}% \u0645\u0646 \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0627\u0644\u0645\u0633\u062c\u0644\u060c \u0645\u0627 \u064a\u0628\u0631\u0632 \u0642\u0648\u0629 \u0627\u0644\u062a\u0648\u062c\u0647 \u0627\u0644\u062a\u0635\u062f\u064a\u0631\u064a \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0623.`\n          : `Reported exports equal about ${(er*100).toFixed(1)}% of production, highlighting the market's strong export orientation.`);\n      }\n    }\n\n    if(arr.length < 4 && valid(c.perCap)){\n      arr.push(\n        IS_AR\n          ? `\u064a\u0628\u0644\u063a \u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u0627\u0644\u0641\u0631\u062f \u0627\u0644\u062a\u0642\u062f\u064a\u0631\u064a ${num(c.perCap)} \u0643\u062c\u0645 \u0633\u0646\u0648\u064a\u0627 \u0648\u0641\u0642\u0627 \u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0645\u0635\u062f\u0631.`\n          : `Estimated per-capita coffee consumption is ${num(c.perCap)} kg per person per year in the current dataset.`\n      );\n    }\n\n    if(arr.length < 4 && valid(c.consumption)){\n      arr.push(\n        IS_AR\n          ? `\u064a\u0628\u0644\u063a \u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u0627\u0644\u0648\u0637\u0646\u064a \u0627\u0644\u0645\u0633\u062c\u0644 ${num(c.consumption)} \u0643\u064a\u0633\u0627 \u0645\u0643\u0627\u0641\u0626\u0627 \u0628\u0648\u0632\u0646 60 \u0643\u062c\u0645.`\n          : `Recorded national consumption stands at ${num(c.consumption)} 60 kg bag equivalents.`\n      );\n    }\n\n    return arr.slice(0,4);\n  }\n\n  function leaderTabs(){\n    return [\n      { key:'imports', label:T.imports },\n      { key:'exports', label:T.exports },\n      { key:'production', label:T.production },\n      { key:'consumption', label:T.consumption }\n    ];\n  }\n\n  function leaderData(key){\n    return Object.entries(COUNTRIES)\n      .filter(([iso,c]) => valid(c[key]) && Number(c[key]) > 0)\n      .sort((a,b) => Number(b[1][key]) - Number(a[1][key]))\n      .slice(0,20);\n  }\n\n  function renderLeaders(){\n    return `\n      <div class=\"cfi-tabs\">\n        ${leaderTabs().map(tab => `\n          <button type=\"button\" class=\"cfi-tab ${LEADER_KEY === tab.key ? 'is-active' : ''}\" data-leader-tab=\"${esc(tab.key)}\">\n            ${esc(tab.label)}\n          <\/button>\n        `).join('')}\n      <\/div>\n      <div class=\"cfi-leaders\">\n        ${leaderData(LEADER_KEY).map(([iso,c],i) => `\n          <div class=\"cfi-leader\">\n            <div class=\"cfi-leader-pos\">#${i+1}<\/div>\n            <button type=\"button\" data-quick-country=\"${iso}\" class=\"cfi-leader-name\">${getFlag(iso)} ${esc(getCountryName(iso))}<\/button>\n            <strong class=\"cfi-leader-num\">${esc(compact(c[LEADER_KEY]))} ${esc(T.bags)}<\/strong>\n          <\/div>\n        `).join('')}\n      <\/div>\n    `;\n  }\n\n  function renderApp(){\n    const c = COUNTRIES[CURRENT_ISO];\n    if(!c){\n      ROOT.innerHTML = `<div class=\"cfi-error\">${esc(T.noData)}<\/div>`;\n      return;\n    }\n\n    const seriesList = availableSeries(c);\n    if(!SERIES_KEY || !seriesList.some(s => s.key === SERIES_KEY)){\n      SERIES_KEY = seriesList.length ? seriesList[0].key : null;\n    }\n    const seriesMeta = seriesList.find(s => s.key === SERIES_KEY);\n    const series = seriesMeta ? c[SERIES_KEY] : null;\n    const seriesChange = latestChange(series);\n    const partnersHTML = renderPartners(c);\n    const insights = insightTexts(c, CURRENT_ISO);\n\n    ROOT.innerHTML = `\n      <div class=\"cfi-app\">\n\n        <section class=\"cfi-hero\">\n          <div class=\"cfi-hero-top\">\n            <div class=\"cfi-eyebrow\"><i><\/i>${esc(T.eyebrow)}<\/div>\n            <div class=\"cfi-year-badge\">${esc(T.yearBadge)} \u00b7 ${esc(DATA.data.year)}<\/div>\n          <\/div>\n\n          <div class=\"cfi-hero-grid\">\n            <div>\n              <h1 class=\"cfi-title\">${esc(T.title)}<\/h1>\n              <p class=\"cfi-lead\">${esc(T.lead)}<\/p>\n              <div class=\"cfi-proof\">\n                <div class=\"cfi-proof-item\"><strong>${esc(DATA.data.country_count || Object.keys(COUNTRIES).length)}<\/strong><span>${IS_AR?'\u0633\u0648\u0642\u0627 \u0648\u062f\u0648\u0644\u0629 \u0636\u0645\u0646 \u0645\u062c\u0645\u0648\u0639\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a':'markets & countries in the dataset'}<\/span><\/div>\n                <div class=\"cfi-proof-item\"><strong>${esc(DATA.meta?.source?.production?.years?.[0] || 1964)}\u2013${esc(DATA.data.year)}<\/strong><span>${IS_AR?'\u0646\u0637\u0627\u0642 \u062a\u0627\u0631\u064a\u062e\u064a \u0644\u0644\u0625\u0646\u062a\u0627\u062c \u0648\u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643':'historical production & consumption coverage'}<\/span><\/div>\n                <div class=\"cfi-proof-item\"><strong>${IS_AR?'3 \u0623\u0646\u0648\u0627\u0639':'3 flows'}<\/strong><span>${IS_AR?'\u0648\u0627\u0631\u062f\u0627\u062a \u0648\u0635\u0627\u062f\u0631\u0627\u062a \u0648\u0625\u0639\u0627\u062f\u0629 \u062a\u0635\u062f\u064a\u0631':'imports, exports & re-exports'}<\/span><\/div>\n                <div class=\"cfi-proof-item\"><strong>ICO<\/strong><span>${IS_AR?'\u0627\u0644\u0645\u0635\u062f\u0631 \u0627\u0644\u0631\u0633\u0645\u064a \u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629 \u0627\u0644\u062f\u0648\u0644\u064a\u0629':'official international coffee data source'}<\/span><\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"cfi-select-panel\">\n              <label class=\"cfi-field-label\">${esc(T.selectCountry)}<\/label>\n\n              <div class=\"cfi-picker\" id=\"cfi-country-picker\">\n                <button type=\"button\" class=\"cfi-picker-toggle\" id=\"cfi-picker-toggle\" aria-expanded=\"false\" aria-label=\"Select country\" aria-expanded=\"false\">\n                  <div class=\"cfi-picker-selected\">\n                    <span>${getFlag(CURRENT_ISO)}<\/span>\n                    <span>${esc(getCountryName(CURRENT_ISO))}<\/span>\n                  <\/div>\n                  <span class=\"cfi-picker-caret\">\u25be<\/span>\n                <\/button>\n\n                <div class=\"cfi-picker-menu\" id=\"cfi-picker-menu\">\n                  <div class=\"cfi-picker-search\">\n                    <input type=\"text\" id=\"cfi-country-search\" placeholder=\"${esc(T.searchCountry)}\" value=\"${esc(COUNTRY_QUERY)}\">\n                  <\/div>\n                  <div class=\"cfi-picker-list\" id=\"cfi-country-list\">\n                    ${filteredCountries().map(item => `\n                      <button type=\"button\" class=\"cfi-country-option ${item.iso === CURRENT_ISO ? 'is-active' : ''}\" data-country=\"${esc(item.iso)}\">\n                        <span class=\"cfi-country-flag\">${getFlag(item.iso)}<\/span>\n                        <strong class=\"cfi-country-name\">${esc(item.name)}<\/strong>\n                      <\/button>\n                    `).join('')}\n                  <\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"cfi-quick\">\n                ${['SA','ET','BR','CO','VN','US'].filter(iso => COUNTRIES[iso]).map(iso => `\n                  <button type=\"button\" data-quick-country=\"${iso}\">${getFlag(iso)} ${esc(getCountryName(iso))}<\/button>\n                `).join('')}\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/section>\n\n        <section class=\"cfi-country-bar\">\n          <div class=\"cfi-country-info\">\n            <div class=\"cfi-flag-box\">${getFlag(CURRENT_ISO)}<\/div>\n            <div>\n              <h2 class=\"cfi-country-heading\">${esc(getCountryName(CURRENT_ISO))}<\/h2>\n              <div class=\"cfi-country-meta\">\n                <span>${esc(c.producer ? T.producer : T.nonProducer)}<\/span>\n                ${c.icoCode ? `<span>${esc(T.icoCode)}: ${esc(c.icoCode)}<\/span>` : ''}\n                <span>${esc(T.year)}: ${esc(DATA.data.year)}<\/span>\n              <\/div>\n            <\/div>\n          <\/div>\n          <div class=\"cfi-country-actions\">\n            <button type=\"button\" class=\"cfi-btn\" id=\"cfi-copy-link\">${esc(T.copyLink)}<\/button>\n          <\/div>\n        <\/section>\n\n        <main class=\"cfi-main\">\n\n          <section class=\"cfi-section\">\n            <div class=\"cfi-section-head\">\n              <div>\n                <h3 class=\"cfi-section-title\">${esc(T.snapshot)}<\/h3>\n                <p class=\"cfi-section-sub\">${esc(T.snapshotSub)}<\/p>\n              <\/div>\n            <\/div>\n            <div class=\"cfi-metrics\">\n              ${renderMetrics(c)}\n            <\/div>\n          <\/section>\n\n          <section class=\"cfi-section\">\n            <div class=\"cfi-grid-2\">\n              <div class=\"cfi-panel\">\n                <div class=\"cfi-section-head\">\n                  <div>\n                    <h3 class=\"cfi-panel-title\">${esc(seriesList.length===1 ? (seriesList[0].label + (IS_AR ? ' \u0639\u0628\u0631 \u0627\u0644\u0633\u0646\u0648\u0627\u062a' : ' Trend')) : T.history)}<\/h3>\n                    <div class=\"cfi-panel-sub\">${esc(T.historySub)}<\/div>\n                  <\/div>\n                  ${seriesList.length > 1 ? `<div class=\"cfi-tabs\">\n                    ${seriesList.map(tab => `\n                      <button type=\"button\" class=\"cfi-tab ${SERIES_KEY === tab.key ? 'is-active' : ''}\" data-series-tab=\"${esc(tab.key)}\">\n                        ${esc(tab.label)}\n                      <\/button>\n                    `).join('')}\n                  <\/div>` : ''}\n                <\/div>\n\n                <div class=\"cfi-trend-summary\">\n                  <div class=\"cfi-mini\">\n                    <div class=\"cfi-mini-label\">${esc(T.latestValue)}<\/div>\n                    <div class=\"cfi-mini-value\">${seriesChange ? esc(compact(seriesChange.latest)) : '\u2014'}<\/div>\n                  <\/div>\n                  <div class=\"cfi-mini\">\n                    <div class=\"cfi-mini-label\">${esc(T.startSeries)}<\/div>\n                    <div class=\"cfi-mini-value\">${seriesChange ? esc(seriesChange.startYear) : '\u2014'}<\/div>\n                  <\/div>\n                  <div class=\"cfi-mini\">\n                    <div class=\"cfi-mini-label\">${esc(T.annualChange)}<\/div>\n                    <div class=\"cfi-mini-value\">${seriesChange ? esc((seriesChange.change >= 0 ? '+' : '') + (seriesChange.change * 100).toFixed(1) + '%') : '\u2014'}<\/div>\n                  <\/div>\n                <\/div>\n\n                <div class=\"cfi-chart-shell\">\n                  <div class=\"cfi-chart-wrap\">\n                    ${seriesMeta ? buildChart(series, seriesMeta.color) : `<div class=\"cfi-chart-empty\">${esc(T.noData)}<\/div>`}\n                  <\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"cfi-panel\">\n                <h3 class=\"cfi-panel-title\">${esc(T.rankings)}<\/h3>\n                <div class=\"cfi-panel-sub\">${esc(T.rankingsSub)}<\/div>\n                ${renderRanks(c)}\n              <\/div>\n            <\/div>\n          <\/section>\n\n          <section class=\"cfi-section\">\n            <div class=\"cfi-section-head\">\n              <div>\n                <h3 class=\"cfi-section-title\">${esc(T.partners)}<\/h3>\n                <p class=\"cfi-section-sub\">${esc(T.partnersSub)}<\/p>\n              <\/div>\n            <\/div>\n            <div class=\"cfi-panel\" id=\"cfi-partners-area\">\n              ${partnersHTML}\n            <\/div>\n          <\/section>\n\n          <section class=\"cfi-section\">\n            <div class=\"cfi-section-head\">\n              <div>\n                <h3 class=\"cfi-section-title\">${esc(T.insights)}<\/h3>\n                <p class=\"cfi-section-sub\">${esc(T.insightsSub)}<\/p>\n              <\/div>\n            <\/div>\n            <div class=\"cfi-insights\">\n              ${insights.map((txt) => `\n                <article class=\"cfi-insight\">\n                  <p>${esc(txt)}<\/p>\n                <\/article>\n              `).join('')}\n            <\/div>\n          <\/section>\n\n          <section class=\"cfi-section\">\n            <div class=\"cfi-section-head\">\n              <div>\n                <h3 class=\"cfi-section-title\">${esc(T.leaders)}<\/h3>\n                <p class=\"cfi-section-sub\">${esc(T.leadersSub)}<\/p>\n              <\/div>\n            <\/div>\n            <div class=\"cfi-panel\" id=\"cfi-leaders-area\">\n              ${renderLeaders()}\n            <\/div>\n          <\/section>\n\n          <section class=\"cfi-section\">\n            <div class=\"cfi-source\">\n              <div class=\"cfi-source-title\">${esc(T.source)}<\/div>\n              <div class=\"cfi-source-copy\">\n                ${esc(T.sourceCopy)}<br>${esc(T.methodology)}\n              <\/div>\n              <div class=\"cfi-source-tags\">\n                <span class=\"cfi-source-tag\">${esc(T.year)}: ${esc(DATA.data.year)}<\/span>\n                <span class=\"cfi-source-tag\">${esc(DATA.data.country_count || Object.keys(COUNTRIES).length)} ${esc(T.countries)}<\/span>\n              <\/div>\n            <\/div>\n          <\/section>\n\n        <\/main>\n      <\/div>\n    `;\n\n    enhance();\n    bindEvents();\n  }\n\n  function bindEvents(){\n    const picker = ROOT.querySelector('#cfi-country-picker');\n    const toggle = ROOT.querySelector('#cfi-picker-toggle');\n    const search = ROOT.querySelector('#cfi-country-search');\n\n    if(toggle){\n      toggle.addEventListener('click', function(e){\n        e.stopPropagation();\n        picker.classList.toggle('open'); toggle.setAttribute('aria-expanded',picker.classList.contains('open')); \n        if(picker.classList.contains('open') && search){\n          setTimeout(() => search.focus(), 60);\n        }\n      });\n    }\n\n    if(search) search.addEventListener('input', function(){\n      COUNTRY_QUERY = this.value || '';\n      const list=ROOT.querySelector('.cfi-picker-list');\n      list.innerHTML=filteredCountries().map(x=>`<button type=\"button\" class=\"cfi-country-option\" data-country=\"${x.iso}\"><span class=\"cfi-country-flag\">${getFlag(x.iso)}<\/span><strong class=\"cfi-country-name\">${esc(x.name)}<\/strong><\/button>`).join('') || esc(T.noData);\n      list.querySelectorAll('[data-country]').forEach(b=>b.onclick=()=>{CURRENT_ISO=b.dataset.country;COUNTRY_QUERY='';SERIES_KEY=null;PARTNER_KEY=null;setHashCountry(CURRENT_ISO);renderApp();});\n    });\n    ROOT.querySelectorAll('[data-country]').forEach(btn => {\n      btn.addEventListener('click', function(){\n        CURRENT_ISO = this.dataset.country;\n        COUNTRY_QUERY = '';\n        SERIES_KEY = null;\n        PARTNER_KEY = null;\n        setHashCountry(CURRENT_ISO);\n        renderApp();\n      });\n    });\n\n    ROOT.querySelectorAll('[data-quick-country]').forEach(btn => {\n      btn.addEventListener('click', function(){\n        if(!COUNTRIES[this.dataset.quickCountry]) return; CURRENT_ISO = this.dataset.quickCountry;\n        COUNTRY_QUERY = '';\n        SERIES_KEY = null;\n        PARTNER_KEY = null;\n        setHashCountry(CURRENT_ISO);\n        renderApp();\n      });\n    });\n\n    ROOT.querySelectorAll('[data-series-tab]').forEach(btn => {\n      btn.addEventListener('click', function(){\n        SERIES_KEY = this.dataset.seriesTab;\n        renderApp();\n      });\n    });\n\n    ROOT.querySelectorAll('[data-partner-tab]').forEach(btn => {\n      btn.addEventListener('click', function(){\n        PARTNER_KEY = this.dataset.partnerTab;\n        renderApp();\n      });\n    });\n\n    ROOT.querySelectorAll('[data-leader-tab]').forEach(btn => {\n      btn.addEventListener('click', function(){\n        LEADER_KEY = this.dataset.leaderTab;\n        renderApp();\n      });\n    });\n\n    const copy = ROOT.querySelector('#cfi-copy-link');\n    if(copy){\n      copy.addEventListener('click', async function(){\n        const url = window.location.origin + window.location.pathname + '#country=' + CURRENT_ISO;\n        try{\n          await navigator.clipboard.writeText(url);\n          const old = this.textContent;\n          this.textContent = T.copied;\n          setTimeout(() => { this.textContent = old; }, 1600);\n        }catch(e){\n          window.prompt(T.copyLink, url);\n        }\n      });\n    }\n  }\n\n  const tr=(ar,en)=>IS_AR?ar:en;\n  let compareISO='BR', marketKey='imports', marketQuery='', routeFlow='importFlows',routeUnit='volume';\n  const metricKeys=['imports','exports','reexports','production','consumption','importsValue','exportsValue','reexportsValue','perCap','arabicaShare'];\n  function label(k){return ({importsValue:T.importValue,exportsValue:T.exportValue,reexportsValue:T.reexportsValue,arabicaShare:T.arabica,perCap:T.perCap})[k]||T[k]||k;}\n  function exact(k,v){return !valid(v)?'\u2014':k==='arabicaShare'?pct(v):num(v);}\n  function exportCSV(rows,name){const csv='\\uFEFF'+rows.map(r=>r.map(v=>'\"'+String(v??'').replace(\/\"\/g,'\"\"')+'\"').join(',')).join('\\r\\n');const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([csv],{type:'text\/csv;charset=utf-8'}));a.download=name+'.csv';a.click();setTimeout(()=>URL.revokeObjectURL(a.href),1000);}\n  function section(id,title,sub,body){return `<section id=\"${id}\" class=\"cfi-section\"><div class=\"cfi-section-head\"><div><h3 class=\"cfi-section-title\">${title}<\/h3><p class=\"cfi-section-sub\">${sub}<\/p><\/div><\/div><div class=\"cfi-panel\">${body}<\/div><\/section>`;}\n  function options(selected,world=false){return (world?`<option value=\"\">${tr('\u0643\u0644 \u0627\u0644\u0623\u0633\u0648\u0627\u0642','All markets')}<\/option>`:'')+countryArray().map(x=>`<option value=\"${x.iso}\" ${x.iso===selected?'selected':''}>${esc(x.name)} (${x.iso})<\/option>`).join('');}\n  function enhance(){\n    const sections=ROOT.querySelectorAll('.cfi-main > .cfi-section');\n    ['cfi-overview','cfi-history','cfi-partners','cfi-insights','cfi-leaders','cfi-source'].forEach((id,i)=>{if(sections[i])sections[i].id=id;});\n    const nav=document.createElement('nav');nav.className='cfi-nav';nav.setAttribute('aria-label',tr('\u0623\u0642\u0633\u0627\u0645 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629','Coffee data sections'));nav.innerHTML=[['overview',tr('\u0627\u0644\u0633\u0648\u0642','Market')],['history',tr('\u0627\u0644\u062a\u0627\u0631\u064a\u062e','History')],['partners',tr('\u0627\u0644\u0634\u0631\u0643\u0627\u0621','Partners')],['routes',tr('\u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062a','Routes')],['insights',tr('\u0642\u0631\u0627\u0621\u0629 \u0643\u0648\u0641\u062f\u0627\u0631','Market Read')],['compare',tr('\u0627\u0644\u0645\u0642\u0627\u0631\u0646\u0629','Compare')],['explorer',tr('\u0643\u0644 \u0627\u0644\u0623\u0633\u0648\u0627\u0642','All markets')],['mix',tr('\u062a\u0631\u0643\u064a\u0628\u0629 \u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a','Export mix')],['regions',tr('\u0627\u0644\u0623\u0642\u0627\u0644\u064a\u0645','Regions')],['groups',tr('\u0645\u062c\u0645\u0648\u0639\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629','Coffee groups')]].map(([k,v])=>`<a href=\"#cfi-${k}\">${v}<\/a>`).join('');ROOT.querySelector('.cfi-country-bar').after(nav);\n    nav.onclick=e=>{const a=e.target.closest('a');if(a){e.preventDefault();ROOT.querySelector(a.getAttribute('href'))?.scrollIntoView({behavior:'smooth',block:'start'});}};\n    const c=COUNTRIES[CURRENT_ISO], d=DATA.data;\n    const derived=[];\n    if(valid(c.importsValue)&&Number(c.imports)>0)derived.push([tr('\u0642\u064a\u0645\u0629 \u0648\u062d\u062f\u0629 \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a','Import unit value'),num(c.importsValue\/c.imports),tr('\u062f\u0648\u0644\u0627\u0631 \/ \u0643\u064a\u0633 \u0645\u0643\u0627\u0641\u0626 60 \u0643\u062c\u0645','USD \/ 60 kg equivalent bag')]);\n    if(valid(c.exportsValue)&&Number(c.exports)>0)derived.push([tr('\u0642\u064a\u0645\u0629 \u0648\u062d\u062f\u0629 \u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a','Export unit value'),num(c.exportsValue\/c.exports),tr('\u062f\u0648\u0644\u0627\u0631 \/ \u0643\u064a\u0633 \u0645\u0643\u0627\u0641\u0626 60 \u0643\u062c\u0645','USD \/ 60 kg equivalent bag')]);\n    if(valid(c.imports)&&valid(c.reexports))derived.push([tr('\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0635\u062f\u064a\u0631 \/ \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a','Reexports \/ imports'),c.imports>0?pct(c.reexports\/c.imports):'\u2014',tr('\u0646\u0633\u0628\u0629 \u062d\u0633\u0627\u0628\u064a\u0629\u060c \u0644\u0627 \u062a\u062a\u0628\u0639 \u0627\u0644\u0634\u062d\u0646\u0627\u062a','Arithmetic ratio, not shipment tracking')]);\n    if(c.topOrig?.length&&c.imports>0){const share=c.topOrig.slice(0,3).reduce((s,x)=>s+Number(x[2]),0)\/c.imports;if(share<=1)derived.push([tr('\u062d\u0635\u0629 \u0623\u0643\u0628\u0631 3 \u0645\u0646\u0627\u0634\u0626','Top 3 origins share'),pct(share),tr('\u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u0648\u0627\u0631\u062f\u0627\u062a \u0627\u0644\u0645\u0633\u062c\u0644\u0629','Of reported total imports')]);}\n    ROOT.querySelector('#cfi-overview').insertAdjacentHTML('beforeend',`<div class=\"cfi-notice\">${tr('\u0627\u0644\u0623\u062d\u062c\u0627\u0645 \u0628\u0645\u0643\u0627\u0641\u0626 \u0627\u0644\u0628\u0646 \u0627\u0644\u0623\u062e\u0636\u0631. \u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0645\u0646\u062a\u062c \u0623\u0648 \u063a\u064a\u0631 \u0627\u0644\u0645\u0646\u062a\u062c \u0647\u0648 \u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0645\u0635\u062f\u0631 \u0648\u0644\u0627 \u064a\u0639\u0646\u064a \u0628\u0645\u0641\u0631\u062f\u0647 \u063a\u064a\u0627\u0628 \u0623\u064a \u0646\u0634\u0627\u0637 \u0632\u0631\u0627\u0639\u064a \u0645\u062d\u0644\u064a.','Volumes are shown in green bean equivalent. Producer\/non-producer status follows the source classification and does not by itself prove the absence of local cultivation.')}<\/div><div class=\"cfi-trend-summary\">${derived.map(x=>`<div class=\"cfi-mini\"><div class=\"cfi-mini-label\">${x[0]}<\/div><div class=\"cfi-mini-value\">${x[1]}<\/div><div class=\"cfi-notice\">${x[2]}<\/div><\/div>`).join('')}<\/div>`);\n    ROOT.querySelector('#cfi-partners').insertAdjacentHTML('beforeend',`<p class=\"cfi-notice\">${tr('\u0627\u0644\u0634\u0631\u0643\u0627\u0621 \u0627\u0644\u0645\u0639\u0631\u0648\u0636\u0648\u0646 \u062c\u0632\u0621 \u0645\u0646 \u0627\u0644\u062a\u062c\u0627\u0631\u0629 \u0627\u0644\u0645\u0633\u062c\u0644\u0629 \u0648\u0642\u062f \u0644\u0627 \u064a\u0633\u0627\u0648\u064a \u0645\u062c\u0645\u0648\u0639\u0647\u0645 \u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u0648\u0637\u0646\u064a.','Displayed partners cover part of recorded trade and may not sum to national totals.')} ${c.destinationsFrom==='importers'?tr('\u0648\u062c\u0647\u0627\u062a \u0647\u0630\u0627 \u0627\u0644\u0645\u0635\u062f\u0631 \u0645\u0633\u062a\u0645\u062f\u0629 \u0645\u0646 \u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0633\u062a\u0648\u0631\u062f\u064a\u0646.','This exporter\u2019s destinations use importer reports.'):''}<\/p>`);\n    const main=ROOT.querySelector('.cfi-main'), source=ROOT.querySelector('#cfi-source');\n    source.insertAdjacentHTML('beforebegin',section('cfi-routes',tr('\u0645\u0633\u0627\u0631\u0627\u062a \u062a\u062c\u0627\u0631\u0629 \u0627\u0644\u0642\u0647\u0648\u0629','Coffee trade corridors'),tr('\u0627\u0633\u062a\u0643\u0634\u0641 \u0627\u0644\u0645\u0646\u0634\u0623 \u0648\u0627\u0644\u0648\u062c\u0647\u0629 \u0648\u0627\u0644\u062d\u062c\u0645 \u0648\u0627\u0644\u0642\u064a\u0645\u0629','Explore origins, destinations, volumes and values'),`<div class=\"cfi-toolrow\"><select id=\"cfi-route-flow\" aria-label=\"Trade flow\"><option value=\"importFlows\">${T.imports}<\/option><option value=\"flows\">${T.exports}<\/option><option value=\"reexportFlows\">${T.reexports}<\/option><\/select><select id=\"cfi-route-country\" aria-label=\"Route country\">${options(CURRENT_ISO,true)}<\/select><select id=\"cfi-route-unit\" aria-label=\"Measure\"><option value=\"volume\">${tr('\u0627\u0644\u062d\u062c\u0645','Volume')}<\/option><option value=\"value\">${tr('\u0627\u0644\u0642\u064a\u0645\u0629','Value')}<\/option><\/select><button type=\"button\" class=\"cfi-btn\" id=\"cfi-route-csv\">CSV<\/button><\/div><div id=\"cfi-route-list\"><\/div><p class=\"cfi-notice\">${tr('\u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u0633\u0627\u0631\u0627\u062a \u0645\u062e\u062a\u0635\u0631\u0629 \u0648\u0644\u064a\u0633\u062a \u062c\u0645\u064a\u0639 \u0627\u0644\u062a\u062f\u0641\u0642\u0627\u062a. \u0627\u0644\u0642\u064a\u0645 \u0627\u0644\u062c\u0645\u0631\u0643\u064a\u0629 \u0644\u064a\u0633\u062a \u0623\u0633\u0639\u0627\u0631\u0627 \u0641\u0648\u0631\u064a\u0629. \u062a\u062e\u062a\u0644\u0641 \u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0633\u062a\u0648\u0631\u062f \u0648\u0627\u0644\u0645\u0635\u062f\u0631.','Trimmed corridor dataset, not all trade flows. Customs values are not spot prices. Importer and exporter reporting differ.')}<\/p>`));\n    source.insertAdjacentHTML('beforebegin',section('cfi-compare',tr('\u0642\u0627\u0631\u0646 \u0633\u0648\u0642\u064a\u0646 \u0642\u0628\u0644 \u0627\u0644\u0642\u0631\u0627\u0631','Compare two markets'),tr('\u062d\u062c\u0648\u0645 \u0648\u0642\u064a\u0645 \u0648\u0623\u0648\u0632\u0627\u0646 \u0646\u0633\u0628\u064a\u0629 \u0641\u064a \u0633\u0646\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0646\u0641\u0633\u0647\u0627','Volumes, values and ratios in the same snapshot year'),`<div class=\"cfi-toolrow\"><label for=\"cfi-compare-country\">${tr('\u0645\u0642\u0627\u0631\u0646\u0629 \u0645\u0639','Compare with')}<\/label><select id=\"cfi-compare-country\">${options(compareISO)}<\/select><button class=\"cfi-btn\" type=\"button\" id=\"cfi-compare-csv\">CSV<\/button><\/div><div id=\"cfi-compare-table\"><\/div>`));\n    source.insertAdjacentHTML('beforebegin',section('cfi-explorer',tr('\u0645\u0633\u062a\u0643\u0634\u0641 \u0627\u0644\u0623\u0633\u0648\u0627\u0642 \u0627\u0644\u0639\u0627\u0644\u0645\u064a\u0629','Global market explorer'),tr('\u0627\u0628\u062d\u062b \u0648\u0631\u062a\u0628 \u0648\u0627\u0641\u062a\u062d \u0645\u0644\u0641 \u0623\u064a \u0633\u0648\u0642','Search, rank and open any market'),`<div class=\"cfi-toolrow\"><input id=\"cfi-market-search\" type=\"search\" aria-label=\"Search market\" placeholder=\"${T.searchCountry}\" value=\"${esc(marketQuery)}\"><select id=\"cfi-market-key\" aria-label=\"Sort metric\">${metricKeys.map(k=>`<option value=\"${k}\" ${marketKey===k?'selected':''}>${label(k)}<\/option>`).join('')}<\/select><button class=\"cfi-btn\" type=\"button\" id=\"cfi-market-csv\">CSV<\/button><\/div><div id=\"cfi-market-table\"><\/div>`));\n    const mixLabels={G:tr('\u0628\u0646 \u0623\u062e\u0636\u0631','Green'),R:tr('\u0628\u0646 \u0645\u062d\u0645\u0635','Roasted'),S:tr('\u0628\u0646 \u0642\u0627\u0628\u0644 \u0644\u0644\u0630\u0648\u0628\u0627\u0646','Soluble'),Dry:tr('\u062c\u0627\u0641','Dry'),Wet:tr('\u0631\u0637\u0628','Wet'),'Unspecified':tr('\u063a\u064a\u0631 \u0645\u062d\u062f\u062f','Unspecified'),'Freeze Dried':tr('\u0645\u062c\u0641\u0641 \u0628\u0627\u0644\u062a\u062c\u0645\u064a\u062f','Freeze dried'),'Spray Dried':tr('\u0645\u062c\u0641\u0641 \u0628\u0627\u0644\u0631\u0634','Spray dried'),'Preparations':tr('\u0645\u0633\u062a\u062d\u0636\u0631\u0627\u062a','Preparations'),'Extract':tr('\u0645\u0633\u062a\u062e\u0644\u0635','Extract')};\n    function mix(obj,labels){return Object.entries(obj||{}).filter(([k,v])=>valid(v)&&v>0).sort((a,b)=>b[1]-a[1]).map(([k,v])=>`<div class=\"cfi-mixrow\"><span>${esc(labels[k]||k)}<\/span><strong>${pct(v)}<\/strong><progress max=\"1\" value=\"${v}\" aria-label=\"${esc(labels[k]||k)}\"><\/progress><\/div>`).join('')||T.noData;}\n    const catalog=Array.isArray(d.comboCatalog)?Object.fromEntries(d.comboCatalog.map(x=>[x.code,x.label])):{};\n    const formMix=d.grs?.[CURRENT_ISO], proc=d.procMix?.[CURRENT_ISO], combo=d.comboMix?.[CURRENT_ISO];\n    const hasForm=formMix&&Object.values(formMix).some(v=>valid(v)&&v>0);\n    const hasProc=proc&&Object.values(proc).some(v=>valid(v)&&v>0);\n    const hasCombo=combo&&Object.values(combo).some(v=>valid(v)&&v>0);\n    const mixBody=(hasForm||hasProc||hasCombo)\n      ? `<div class=\"cfi-grid-2\">${hasForm?`<div><h4>${tr('\u0634\u0643\u0644 \u0627\u0644\u0642\u0647\u0648\u0629','Coffee form')}<\/h4><div class=\"cfi-mix\">${mix(formMix,mixLabels)}<\/div><\/div>`:''}${hasProc?`<div><h4>${tr('\u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0645\u0633\u062c\u0644\u0629','Reported processing')}<\/h4><div class=\"cfi-mix\">${mix(proc,mixLabels)}<\/div><\/div>`:''}<\/div>${hasCombo?`<details><summary>${tr('\u0631\u0645\u0648\u0632 \u062a\u0631\u0643\u064a\u0628\u0629 \u0627\u0644\u0642\u0647\u0648\u0629','Coffee combination codes')}<\/summary><div class=\"cfi-mix\">${mix(combo,catalog)}<\/div><\/details>`:''}`\n      : `<div class=\"cfi-empty-soft\">${tr('\u0644\u0627 \u062a\u062a\u0648\u0641\u0631 \u0628\u064a\u0627\u0646\u0627\u062a \u062a\u0631\u0643\u064a\u0628\u0629 \u0627\u0644\u0635\u0627\u062f\u0631\u0627\u062a \u0644\u0647\u0630\u0627 \u0627\u0644\u0633\u0648\u0642 \u0636\u0645\u0646 \u0644\u0642\u0637\u0629 ICO \u0627\u0644\u062d\u0627\u0644\u064a\u0629. \u0633\u064a\u0628\u0642\u0649 \u0627\u0644\u0642\u0633\u0645 \u0638\u0627\u0647\u0631\u0627 \u0644\u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0645\u062a\u0627\u062d\u0629 \u0644\u0623\u0633\u0648\u0627\u0642 \u0645\u0635\u062f\u0631\u0629 \u0623\u062e\u0631\u0649 \u0648\u064a\u0645\u0643\u0646 \u0627\u0633\u062a\u0643\u0634\u0627\u0641\u0647\u0627 \u0628\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u062f\u0648\u0644\u0629.','Export composition is not reported for this market in the current ICO snapshot. This section remains available because composition data can be explored for other exporting markets by changing the country.')}<\/div>`;\n    source.insertAdjacentHTML('beforebegin',section('cfi-mix',tr('\u062a\u0631\u0643\u064a\u0628\u0629 \u0635\u0627\u062f\u0631\u0627\u062a \u0627\u0644\u0633\u0648\u0642','Market export composition'),tr('\u062d\u0635\u0635 \u0645\u0634\u062a\u0642\u0629 \u0645\u0646 \u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0635\u062f\u0631\u060c \u0644\u0627 \u0645\u0646 \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0627\u0644\u0645\u062d\u0644\u064a','Shares from export reporting, not domestic production'),mixBody));\n    const rr=d.regions?.rows||[];\n    source.insertAdjacentHTML('beforebegin',section('cfi-regions',tr('\u0645\u064a\u0632\u0627\u0646 \u0627\u0644\u0642\u0647\u0648\u0629 \u062d\u0633\u0628 \u0627\u0644\u0625\u0642\u0644\u064a\u0645','Regional coffee balance'),tr('\u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0648\u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u0648\u0635\u0627\u0641\u064a \u0627\u0644\u062a\u062c\u0627\u0631\u0629\u060c \u0623\u0643\u064a\u0627\u0633 \u0645\u0643\u0627\u0641\u0626\u0629 60 \u0643\u062c\u0645','Production, consumption and net trade, 60 kg equivalent bags'),`<div class=\"cfi-tablewrap\"><table><thead><tr><th>${tr('\u0627\u0644\u0625\u0642\u0644\u064a\u0645','Region')}<\/th>${['production','consumption','exports','imports','reexports'].map(k=>`<th>${label(k)}<\/th>`).join('')}<th>${tr('\u0635\u0627\u0641\u064a \u0627\u0644\u062a\u062c\u0627\u0631\u0629','Net trade')}<\/th><th>${tr('\u0627\u0644\u0645\u062a\u0628\u0642\u064a \u0627\u0644\u0625\u062d\u0635\u0627\u0626\u064a','Residual')}<\/th><\/tr><\/thead><tbody>${rr.map(r=>`<tr><td>${esc(r.key)}<\/td>${['production','consumption','exports','imports','reexports','netTrade','residual'].map(k=>`<td>${num(r[k])}<\/td>`).join('')}<\/tr>`).join('')}<\/tbody><\/table><\/div><p class=\"cfi-notice\">${tr('\u0627\u0644\u0645\u062a\u0628\u0642\u064a = \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u2212 \u0627\u0644\u0627\u0633\u062a\u0647\u0644\u0627\u0643 \u2212 \u0635\u0627\u0641\u064a \u0627\u0644\u062a\u062c\u0627\u0631\u0629. \u064a\u0634\u0645\u0644 \u0627\u062e\u062a\u0644\u0627\u0641 \u0627\u0644\u0623\u0633\u0627\u0633 \u0648\u062a\u063a\u064a\u0631 \u0627\u0644\u0645\u062e\u0632\u0648\u0646 \u0648\u0627\u0644\u0641\u0631\u0648\u0642 \u0627\u0644\u0625\u062d\u0635\u0627\u0626\u064a\u0629\u060c \u0648\u0644\u0627 \u064a\u0645\u062b\u0644 \u0641\u0627\u0626\u0636\u0627 \u0642\u0627\u0628\u0644\u0627 \u0644\u0644\u0628\u064a\u0639.','Residual = production \u2212 consumption \u2212 net trade. Includes basis differences, stock changes and statistical discrepancies, not saleable surplus.')}<\/p>`));\n    const gn={BRA_NAT:tr('\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644\u064a\u0629 \u0627\u0644\u0637\u0628\u064a\u0639\u064a\u0629','Brazilian Naturals'),COL_MILDS:tr('\u0627\u0644\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0629 \u0627\u0644\u0645\u0639\u062a\u062f\u0644\u0629','Colombian Milds'),OTH_MILDS:tr('\u0627\u0644\u0645\u0639\u062a\u062f\u0644\u0629 \u0627\u0644\u0623\u062e\u0631\u0649','Other Milds'),ROBUSTAS:tr('\u0631\u0648\u0628\u0648\u0633\u062a\u0627','Robustas')};\n    source.insertAdjacentHTML('beforebegin',section('cfi-groups',tr('\u0645\u062c\u0645\u0648\u0639\u0627\u062a \u0627\u0644\u0642\u0647\u0648\u0629 \u0627\u0644\u0639\u0627\u0644\u0645\u064a\u0629','Global coffee groups'),tr('\u0627\u0644\u062d\u062c\u0645 \u0648\u0627\u0644\u0642\u064a\u0645\u0629 \u0648\u0645\u062a\u0648\u0633\u0637 \u0627\u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u062c\u0645\u0631\u0643\u064a\u0629','Volume, value and implied customs unit value'),`<div class=\"cfi-metrics\">${Object.entries(d.groups||{}).map(([k,v])=>`<div class=\"cfi-card cfi-metric\"><span class=\"cfi-metric-label\">${gn[k]||k}<\/span><strong class=\"cfi-metric-value\">${compact(v.bags)}<\/strong><span class=\"cfi-metric-unit\">${T.bags}<\/span><div>${usd(v.usd)}<\/div><div class=\"cfi-notice\">${num(v.unit)} USD \/ 60 kg<\/div><\/div>`).join('')}<\/div><details><summary>${tr('\u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0633\u0646\u0648\u064a \u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u0648\u062d\u062f\u0629','Annual unit value history')}<\/summary><div class=\"cfi-tablewrap\"><table><thead><tr><th>${T.year}<\/th>${Object.values(gn).map(v=>`<th>${v} USD \/ 60 kg<\/th>`).join('')}<\/tr><\/thead><tbody>${(d.groupSeries||[]).slice().reverse().map(r=>`<tr><td>${r[0]}<\/td>${Object.keys(gn).map(k=>`<td>${num(r[1]?.[k]?.unit)}<\/td>`).join('')}<\/tr>`).join('')}<\/tbody><\/table><\/div><\/details>`));\n    source.querySelector('.cfi-source-copy').insertAdjacentHTML('beforeend',`<p>${tr('\u0644\u0642\u0637\u0629 \u062b\u0627\u0628\u062a\u0629 \u0644\u0633\u0646\u0629 2025\u060c \u0648\u0644\u064a\u0633\u062a \u0628\u062b\u0627 \u0645\u0628\u0627\u0634\u0631\u0627. \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0645\u0628\u0646\u064a \u0639\u0644\u0649 \u0627\u0644\u0633\u0646\u0629 \u0627\u0644\u0642\u0647\u0648\u064a\u0629\u060c \u0648\u0627\u0644\u062a\u062c\u0627\u0631\u0629 \u0642\u062f \u062a\u0633\u062a\u062e\u062f\u0645 \u0623\u0633\u0627\u0633\u0627 \u0632\u0645\u0646\u064a\u0627 \u0645\u062e\u062a\u0644\u0641\u0627. \u0627\u0644\u0641\u0631\u0627\u063a \u064a\u0639\u0646\u064a \u0639\u062f\u0645 \u062a\u0648\u0641\u0631 \u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0644\u064a\u0633 \u0635\u0641\u0631\u0627. \u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0645\u0633\u062a\u0643\u0634\u0641 \u0645\u062d\u0633\u0648\u0628 \u062f\u0627\u062e\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0629. \u0645\u062a\u0648\u0633\u0637 \u0627\u0644\u0642\u064a\u0645\u0629 \u0644\u0627 \u064a\u0639\u0643\u0633 \u0633\u0639\u0631 \u0635\u0646\u0641 \u0645\u062d\u062f\u062f \u0623\u0648 \u062a\u0643\u0644\u0641\u0629 \u0627\u0644\u0634\u062d\u0646.','Fixed 2025 snapshot, not live data. Production uses coffee years, while trade may use a different time basis. Missing is not zero. Explorer ranks are calculated within this dataset. Unit values are not product-specific quotes or freight costs.')}<\/p><p>${tr('\u062d\u062f\u0648\u062f \u0627\u0644\u0645\u0635\u062f\u0631: \u062d\u062a\u0649 25 \u0634\u0631\u064a\u0643\u0627 \u0644\u0643\u0644 \u062c\u0627\u0646\u0628 \u0648600 \u0645\u0633\u0627\u0631\u060c \u0648\u062d\u062f \u0623\u062f\u0646\u0649 \u0644\u0644\u0645\u0633\u0627\u0631 50 \u0623\u0644\u0641 \u0643\u064a\u0633.','Source caps: up to 25 partners per side, 600 corridors, minimum 50,000 bags per corridor.')}<\/p>`);\n    function compare(){compareISO=ROOT.querySelector('#cfi-compare-country').value;const b=COUNTRIES[compareISO];const rows=metricKeys.filter(k=>valid(c[k])||valid(b[k])).map(k=>[label(k),exact(k,c[k]),exact(k,b[k])]);ROOT.querySelector('#cfi-compare-table').innerHTML=`<div class=\"cfi-tablewrap\"><table><thead><tr><th>${tr('\u0627\u0644\u0645\u0624\u0634\u0631','Metric')}<\/th><th>${esc(getCountryName(CURRENT_ISO))}<\/th><th>${esc(getCountryName(compareISO))}<\/th><\/tr><\/thead><tbody>${rows.map(r=>`<tr>${r.map(v=>`<td>${esc(v)}<\/td>`).join('')}<\/tr>`).join('')}<\/tbody><\/table><\/div><p class=\"cfi-notice\">${tr('\u0627\u0644\u062d\u062c\u0648\u0645: \u0643\u064a\u0633 60 \u0643\u062c\u0645. \u0627\u0644\u0642\u064a\u0645: \u062f\u0648\u0644\u0627\u0631 \u0623\u0645\u0631\u064a\u0643\u064a. \u0627\u0644\u0641\u0631\u062f: \u0643\u062c\u0645 \u0633\u0646\u0648\u064a\u0627. \u0623\u0631\u0627\u0628\u064a\u0643\u0627: \u0646\u0633\u0628\u0629.','Volumes: 60 kg bags. Values: USD. Per capita: kg\/year. Arabica: percentage.')}<\/p>`;ROOT.querySelector('#cfi-compare-csv').onclick=()=>exportCSV([[tr('\u0627\u0644\u0645\u0624\u0634\u0631','Metric'),CURRENT_ISO,compareISO],...rows],'cofdar-comparison-2025');}\n    function markets(){marketKey=ROOT.querySelector('#cfi-market-key').value;marketQuery=ROOT.querySelector('#cfi-market-search').value;const q=marketQuery.toLowerCase();const ranked=Object.entries(COUNTRIES).filter(([i,c])=>valid(c[marketKey])).sort((a,b)=>b[1][marketKey]-a[1][marketKey]);let last=null,pos=0;const rows=ranked.map(([i,c],n)=>{if(Number(c[marketKey])!==last){pos=n+1;last=Number(c[marketKey]);}return [pos,i,c];}).filter(([n,i,c])=>!q||getCountryName(i).toLowerCase().includes(q)||i.toLowerCase().includes(q));ROOT.querySelector('#cfi-market-table').innerHTML=`<p class=\"cfi-notice\">${rows.length} ${tr('\u0633\u0648\u0642\u0627 \u0644\u062f\u064a\u0647\u0627 \u0628\u064a\u0627\u0646\u0627\u062a \u0645\u0633\u062c\u0644\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0624\u0634\u0631','markets with reported data for this metric')} \u00b7 ${label(marketKey)} \u00b7 ${marketKey.endsWith('Value')?T.usd:marketKey==='perCap'?T.kgPerPerson:marketKey==='arabicaShare'?'%':T.bags}<\/p><div class=\"cfi-tablewrap\"><table><thead><tr><th>#<\/th><th>${tr('\u0627\u0644\u0633\u0648\u0642','Market')}<\/th><th>${label(marketKey)}<\/th><\/tr><\/thead><tbody>${rows.map(([n,i,c])=>`<tr><td>${n}<\/td><td><button type=\"button\" data-open-market=\"${i}\">${getFlag(i)} ${esc(getCountryName(i))}<\/button><\/td><td>${exact(marketKey,c[marketKey])}<\/td><\/tr>`).join('')}<\/tbody><\/table><\/div>`;ROOT.querySelectorAll('[data-open-market]').forEach(b=>b.onclick=()=>{CURRENT_ISO=b.dataset.openMarket;setHashCountry(CURRENT_ISO);renderApp();ROOT.scrollIntoView({block:'start'});});ROOT.querySelector('#cfi-market-csv').onclick=()=>exportCSV([['rank','ISO','country',marketKey],...rows.map(([n,i,c])=>[n,i,getCountryName(i),c[marketKey]])],'cofdar-markets-'+marketKey+'-2025');}\n    function routes(){const flow=ROOT.querySelector('#cfi-route-flow').value,i=ROOT.querySelector('#cfi-route-country').value,u=ROOT.querySelector('#cfi-route-unit').value;const rows=(d[flow]||[]).filter(r=>!i||r[0]===i||r[1]===i).slice().sort((a,b)=>b[u==='value'?3:2]-a[u==='value'?3:2]);ROOT.querySelector('#cfi-route-list').innerHTML=`<p class=\"cfi-notice\">${rows.length} ${tr('\u0645\u0633\u0627\u0631\u0627 \u0645\u062a\u0627\u062d\u0627','available corridors')}<\/p>`+(rows.length?rows.map(r=>`<div class=\"cfi-route\"><button type=\"button\" data-route-open=\"${r[0]}\">${getFlag(r[0])} ${esc(getCountryName(r[0]))}<\/button><span dir=\"ltr\">\u2192<\/span><button type=\"button\" data-route-open=\"${r[1]}\">${getFlag(r[1])} ${esc(getCountryName(r[1]))}<\/button><strong>${u==='value'?usd(r[3]*1e6):num(r[2]*1e6)+' '+T.bags}${r[4]==='importer'?' \u00b7 '+tr('\u062a\u0642\u0631\u064a\u0631 \u0627\u0644\u0645\u0633\u062a\u0648\u0631\u062f','Importer report'):''}<\/strong><\/div>`).join(''):T.noData);ROOT.querySelectorAll('[data-route-open]').forEach(b=>b.onclick=()=>{if(COUNTRIES[b.dataset.routeOpen]){CURRENT_ISO=b.dataset.routeOpen;setHashCountry(CURRENT_ISO);renderApp();}});ROOT.querySelector('#cfi-route-csv').onclick=()=>exportCSV([['origin','destination','60kg_bags','USD','report_basis'],...rows.map(r=>[r[0],r[1],r[2]*1e6,r[3]*1e6,flow==='importFlows'||r[4]==='importer'?'importer':'exporter'])],'cofdar-corridors-'+flow+'-2025');}\n    ROOT.querySelector('#cfi-compare-country').onchange=compare;ROOT.querySelector('#cfi-market-search').oninput=markets;ROOT.querySelector('#cfi-market-key').onchange=markets;['flow','country','unit'].forEach(k=>ROOT.querySelector('#cfi-route-'+k).onchange=routes);compare();markets();routes();\n    if(SERIES_KEY){const s=(c[SERIES_KEY]||[]).filter(x=>valid(x[1])).slice().sort((a,b)=>a[0]-b[0]);ROOT.querySelector('.cfi-chart-shell').insertAdjacentHTML('beforeend',`<div class=\"cfi-toolrow\"><button type=\"button\" class=\"cfi-btn\" id=\"cfi-history-csv\">${tr('\u062a\u0646\u0632\u064a\u0644 \u0627\u0644\u0633\u0644\u0633\u0644\u0629 CSV','Download series CSV')}<\/button><\/div><details><summary>${tr('\u062c\u0645\u064a\u0639 \u0627\u0644\u0633\u0646\u0648\u0627\u062a \u0648\u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u062f\u0642\u064a\u0642\u0629','All years and exact figures')}<\/summary><div class=\"cfi-tablewrap\"><table><thead><tr><th>${T.year}<\/th><th>${T.bags}<\/th><\/tr><\/thead><tbody>${s.slice().reverse().map(r=>`<tr><td>${r[0]}<\/td><td>${num(r[1])}<\/td><\/tr>`).join('')}<\/tbody><\/table><\/div><\/details>`);ROOT.querySelector('#cfi-history-csv').onclick=()=>exportCSV([['year','60kg_bags'],...s],'cofdar-'+CURRENT_ISO+'-'+SERIES_KEY);}\n  }\n\n  function fetchData(){\n    return fetch(DATA_URL, { credentials:'omit' })\n      .then(response => {\n        if(!response.ok) throw new Error('HTTP ' + response.status);\n        return response.json();\n      })\n      .catch(fetchError => new Promise((resolve,reject) => {\n        try{\n          const xhr = new XMLHttpRequest();\n          xhr.open('GET', DATA_URL, true);\n          xhr.onreadystatechange = function(){\n            if(xhr.readyState !== 4) return;\n            if(xhr.status >= 200 && xhr.status < 300){\n              try{\n                resolve(JSON.parse(xhr.responseText));\n              }catch(parseError){\n                reject(parseError);\n              }\n            }else{\n              reject(fetchError);\n            }\n          };\n          xhr.onerror = () => reject(fetchError);\n          xhr.send();\n        }catch(xhrError){\n          reject(fetchError || xhrError);\n        }\n      }));\n  }\n\n  async function load(){\n    try{\n      const loaded = await fetchData();\n      if(!loaded || !loaded.data || !loaded.data.countries){\n        throw new Error(IS_AR ? '\u0645\u0644\u0641 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u063a\u064a\u0631 \u0635\u0627\u0644\u062d' : 'Invalid data file');\n      }\n      DATA = loaded;\n      COUNTRIES = DATA.data.countries;\n      CURRENT_ISO = getHashCountry();\n      renderApp();\n    }catch(err){\n      ROOT.innerHTML = `<div class=\"cfi-error\" role=\"alert\">${IS_AR ? '\u062a\u0639\u0630\u0631 \u0639\u0631\u0636 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a' : 'Unable to render data'}: ${esc(err.message)} <button type=\"button\" id=\"cfi-retry\">${IS_AR?'\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629':'Retry'}<\/button><\/div>`;\n      const retry = ROOT.querySelector('#cfi-retry');\n      if(retry) retry.onclick=load;\n    }\n  }\n  document.addEventListener('click',e=>{const p=ROOT.querySelector('.cfi-picker');if(p&&!p.contains(e.target))p.classList.remove('open');});\n  document.addEventListener('keydown',e=>{if(e.key==='Escape')ROOT.querySelector('.cfi-picker')?.classList.remove('open');});\n  window.addEventListener('hashchange',()=>{if(DATA){CURRENT_ISO=getHashCountry();renderApp();}});\n\n  load();\n})();\n<\/script>\n\n<noscript>\n  Cofdar Coffee Intelligence requires JavaScript to display the interactive market data.\n<\/noscript>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d3c1e99 elementor-section-boxed elementor-section-height-default elementor-section-height-default rt-parallax-bg-no\" data-id=\"d3c1e99\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2129c69\" data-id=\"2129c69\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5cf6951 elementor-widget elementor-widget-spacer\" data-id=\"5cf6951\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-72ef017 elementor-widget elementor-widget-heading\" data-id=\"72ef017\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Monthly Coffee Market Reports<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-45fa870 elementor-widget elementor-widget-rtsb-post-list\" data-id=\"45fa870\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"rtsb-post-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"rtsb-container-45fa870\" class=\"rtsb-elementor-container rtsb-pos-r rtsb-post-list rtsb-blog-post\" data-layout=\"list-layout1\" style=\"--rtsb-default-columns: 1\"><div class=\"rtsb-row rtsb-content-loader rtsb-post-list-layout1\"><div class=\"rtsb-col-grid rtsb-post-list\">\n\t<div class=\"rtsb-post-list-item \">\n\t\t<article>\n\t\t\t\t\t\t<div class=\"rtsb-post-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<h3 class=\"rtsb-post-title limit-default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"rtsb-title-link\" href=\"https:\/\/cofdar.com\/en\/coffee-market-report-september-2026\/\">Coffee Market Report \u2013 September 2026: Prices Fall as Supply and Global Exports Rise<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t<\/h3>\n\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t<\/article>\n\t<\/div>\n<\/div>\n<\/div><!-- .rtsb-row --><\/div><!-- .rtsb-container -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-019e1e1 elementor-widget elementor-widget-spacer\" data-id=\"019e1e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Daily Coffee Price Indicators via Cofdar ICO \u00b7 Loading latest data Source: International Coffee Organization (ICO) Unit: US cents\/lb Loading Cofdar Coffee Intelligence&#8230; Cofdar Coffee Intelligence requires JavaScript to display the interactive market data. Monthly Coffee Market Reports No posts were found matching your selection.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_rtcl_gb_attr":"","footnotes":""},"class_list":["post-12909","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages\/12909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/comments?post=12909"}],"version-history":[{"count":49,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages\/12909\/revisions"}],"predecessor-version":[{"id":13289,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages\/12909\/revisions\/13289"}],"wp:attachment":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/media?parent=12909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}