<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"><meta content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover" name="viewport"><meta content="noindex" name="robots"><meta content="same-origin" name="referrer"><link href="/static/favicon.ico" rel="icon" sizes="any"><link href="/static/favicon.svg" rel="icon" type="image/svg+xml"><link href="/static/apple-touch-icon.png" rel="apple-touch-icon"><link href="/static/manifest.webmanifest" rel="manifest"><title>Sanity Studio</title><script>
;(function () {
  var _caughtErrors = []

  var errorChannel = (function () {
    var subscribers = []

    function publish(msg) {
      for (var i = 0; i < subscribers.length; i += 1) {
        subscribers[i](msg)
      }
    }

    function subscribe(subscriber) {
      subscribers.push(subscriber)

      return function () {
        var idx = subscribers.indexOf(subscriber)

        if (idx > -1) {
          subscribers.splice(idx, 1)
        }
      }
    }

    return {publish, subscribe, subscribers}
  })()

  // NOTE: Store the error channel instance in the global scope so that the application can
  // access it and subscribe to errors.
  window.__sanityErrorChannel = {
    subscribe: errorChannel.subscribe,
  }

  function _nextTick(callback) {
    setTimeout(callback, 0)
  }

  function _handleError(error, params) {
    _nextTick(function () {
      // - If there are error channel subscribers, then we notify them (no console error).
      // - If there are no subscribers, then we log the error to the console and render the error overlay.
      if (errorChannel.subscribers.length) {
        errorChannel.publish({error, params})
      } else {
        console.error(error)

        _renderErrorOverlay(error, params)
      }
    })
  }

  var ERROR_BOX_STYLE = [
    'background: #fff',
    'border-radius: 6px',
    'box-sizing: border-box',
    'color: #121923',
    'flex: 1',
    "font-family: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue','Liberation Sans',Helvetica,Arial,system-ui,sans-serif",
    'font-size: 16px',
    'line-height: 21px',
    'margin: 0 auto',
    'max-width: 960px',
    'max-height: 90dvh',
    'overflow: auto',
    'padding: 20px',
    'width: 100%',
  ].join(';')

  var ERROR_CODE_STYLE = [
    'color: #972E2A',
    "font-family: -apple-system-ui-monospace, 'SF Mono', Menlo, Monaco, Consolas, monospace",
    'font-size: 13px',
    'line-height: 17px',
    'margin: 0',
  ].join(';')

  function _renderErrorOverlay(error, params) {
    var errorElement = document.querySelector('#__sanityError') || document.createElement('div')
    var colno = params.event.colno
    var lineno = params.event.lineno
    var filename = params.event.filename

    errorElement.id = '__sanityError'
    errorElement.innerHTML = [
      '<div style="' + ERROR_BOX_STYLE + '">',
      '<div style="font-weight: 700;">Uncaught error: ' + error.message + '</div>',
      '<div style="color: #515E72; font-size: 13px; line-height: 17px; margin: 10px 0;">' +
        filename +
        ':' +
        lineno +
        ':' +
        colno +
        '</div>',
      '<pre style="' + ERROR_CODE_STYLE + '">' + error.stack + '</pre>',
      '</div>',
    ].join('')

    errorElement.style.position = 'fixed'
    errorElement.style.zIndex = 1000000
    errorElement.style.top = 0
    errorElement.style.left = 0
    errorElement.style.right = 0
    errorElement.style.bottom = 0
    errorElement.style.padding = '20px'
    errorElement.style.background = 'rgba(16,17,18,0.66)'
    errorElement.style.display = 'flex'
    errorElement.style.alignItems = 'center'
    errorElement.style.justifyContent = 'center'

    document.body.appendChild(errorElement)
  }

  // NOTE:
  // Yes – we're attaching 2 error listeners below 👀
  // This is because React makes the same error throw twice (in development mode).
  // See: https://github.com/facebook/react/issues/10384

  // Error listener #1
  window.onerror = function (event, source, lineno, colno, error) {
    _nextTick(function () {
      if (_caughtErrors.indexOf(error) !== -1) return

      _caughtErrors.push(error)

      _handleError(error, {
        event,
        lineno,
        colno,
        source,
      })

      _nextTick(function () {
        var idx = _caughtErrors.indexOf(error)

        if (idx > -1) _caughtErrors.splice(idx, 1)
      })
    })

    // IMPORTANT: this callback must return `true` to prevent the error from being rendered in
    // the browser’s console.
    return true
  }

  // Error listener #2
  window.addEventListener('error', function (event) {
    if (_caughtErrors.indexOf(event.error) !== -1) return true

    _caughtErrors.push(event.error)

    _handleError(event.error, {
      event,
      lineno: event.lineno,
      colno: event.colno,
    })

    _nextTick(function () {
      _nextTick(function () {
        var idx = _caughtErrors.indexOf(event.error)

        if (idx > -1) _caughtErrors.splice(idx, 1)
      })
    })

    return true
  })
})()
</script><style>
  @font-face {
    font-family: Inter;
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-Regular.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: italic;
    font-weight: 400;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-Italic.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-Medium.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: italic;
    font-weight: 500;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-MediumItalic.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-SemiBold.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: italic;
    font-weight: 600;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-SemiBoldItalic.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-Bold.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: italic;
    font-weight: 700;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-BoldItalic.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: normal;
    font-weight: 800;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-ExtraBold.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: italic;
    font-weight: 800;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-ExtraBoldItalic.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: normal;
    font-weight: 900;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-Black.woff2") format("woff2");
  }
  @font-face {
    font-family: Inter;
    font-style: italic;
    font-weight: 900;
    font-display: swap;
    src: url("https://studio-static.sanity.io/Inter-BlackItalic.woff2") format("woff2");
  }
  html {
    @media (prefers-color-scheme: dark) {
      background-color: #13141b;
    }
    @media (prefers-color-scheme: light) {
      background-color: #ffffff;
    }
  }
  html,
  body,
  #sanity {
    height: 100%;
  }
  body {
    margin: 0;
    -webkit-font-smoothing: antialiased;
  }
</style><script type="application/json" id="__imports">{"imports":{"react-dom/client":"/vendor/react-dom/client-B2LyRlsH.mjs","react-dom":"/vendor/react-dom/index-6ENZ9LRZ.mjs","react-dom/package.json":"/vendor/react-dom/package.json-C6c3zOhY.mjs","react-dom/server":"/vendor/react-dom/server-mrSNJuPd.mjs","react-dom/server.browser":"/vendor/react-dom/server.browser-C2-YMCkQ.mjs","react-dom/static":"/vendor/react-dom/static-BXDRqv-z.mjs","react-dom/static.browser":"/vendor/react-dom/static.browser-ieVM4XwH.mjs","react/compiler-runtime":"/vendor/react/compiler-runtime-BVhb7TJd.mjs","react":"/vendor/react/index-j4TbzLnM.mjs","react/jsx-dev-runtime":"/vendor/react/jsx-dev-runtime-DE3tgJ9y.mjs","react/jsx-runtime":"/vendor/react/jsx-runtime-VMk0Qk41.mjs","react/package.json":"/vendor/react/package.json-BUqvnIw7.mjs","styled-components":"/vendor/styled-components/index-DPqiMhAO.mjs","styled-components/package.json":"/vendor/styled-components/package.json-D_Pq9WwQ.mjs","sanity":"https://sanity-cdn.com/v1/modules/sanity/default/%5E6.6.0/t1785270147","sanity/":"https://sanity-cdn.com/v1/modules/sanity/default/%5E6.6.0/t1785270147/","@sanity/vision":"https://sanity-cdn.com/v1/modules/@sanity__vision/default/%5E6.6.0/t1785270147","@sanity/vision/":"https://sanity-cdn.com/v1/modules/@sanity__vision/default/%5E6.6.0/t1785270147/"},"css":["https://sanity-cdn.com/v1/modules/sanity/default/%5E6.6.0/t1785270147/index.css","https://sanity-cdn.com/v1/modules/@sanity__vision/default/%5E6.6.0/t1785270147/index.css"]}</script><script>
  // auto-generated script to add import map with timestamp
  const importsJson = document.getElementById('__imports')?.textContent;
  const { imports = {}, css = [], ...rest } = importsJson ? JSON.parse(importsJson) : {};
  const importMapEl = document.createElement('script');
  importMapEl.type = 'importmap';
  const newTimestamp = `/t${Math.floor(Date.now() / 1000)}`;

  function isSanityCdnHost(hostname) {
    return /^sanity-cdn\.[a-zA-Z]+$/.test(hostname);
  }

  function isSanityCdnUrl(urlStr) {
    try {
      return isSanityCdnHost(new URL(urlStr).hostname);
    } catch {
      return false;
    }
  }

  function replaceTimestamp(urlStr) {
    try {
      const url = new URL(urlStr);
      if (isSanityCdnHost(url.hostname)) {
        url.pathname = url.pathname.replace(/\/t\d+/, newTimestamp);
      }
      return url.toString();
    } catch {
      return urlStr;
    }
  }

  importMapEl.textContent = JSON.stringify({
    imports: Object.fromEntries(
      Object.entries(imports).map(([specifier, path]) => [specifier, replaceTimestamp(path)])
    ),
    ...rest,
  });
  document.head.appendChild(importMapEl);

  // Creates <link rel="stylesheet"> tags with fresh timestamps.
  for (const cssUrl of css) {
    const linkEl = document.createElement('link');
    linkEl.rel = 'stylesheet';
    linkEl.href = replaceTimestamp(cssUrl);
    document.head.appendChild(linkEl);
  }

  // The CDN serves the `sanity` module via a cross-origin 302
  // (sanity-cdn.com -> modules.sanity-cdn.com). WebKit mishandles a
  // `modulepreload` that follows a cross-origin redirect: it forces the CORS
  // credentials flag true even for `crossorigin="anonymous"`, then rejects the
  // redirect because the CDN sends no `Access-Control-Allow-Credentials`,
  // which blanks the studio. (This is why these hints were reverted; see
  // PR #1400.)
  //
  // `preconnect` only warms a socket; it never follows the redirect or fetches
  // the module, so it is safe in every engine and runs unconditionally.
  const firstCdnImport = Object.values(imports).find(isSanityCdnUrl);

  if (firstCdnImport) {
    const preconnectEl = document.createElement('link');
    preconnectEl.rel = 'preconnect';
    preconnectEl.href = new URL(firstCdnImport).origin;
    // Module fetches are CORS; without crossorigin the warmed socket is not reused.
    preconnectEl.crossOrigin = 'anonymous';
    document.head.appendChild(preconnectEl);
  }

  // `modulepreload` is the hint that follows the redirect and can blank the
  // studio in WebKit, so it is gated behind a positive allowlist: it runs only
  // for engines confirmed to handle the cross-origin redirect, i.e. Chromium or
  // Gecko. Every Chromium variant (Edge, Opera, Samsung Internet, ...) carries
  // the `Chrome` token, so matching `Chrom(e|ium)|Firefox` covers them without
  // enumerating brands. The iOS device-name exclusion is the hard guard for the
  // brick-prone platform: every iOS browser is WebKit regardless of brand, and
  // iOS in-app webviews carry messy UAs, so nothing on an iOS device is ever
  // treated as safe. Anything unrecognised falls through to no preload, costing
  // a missed download rather than bricking the studio.
  const userAgent = typeof navigator === 'undefined' ? '' : navigator.userAgent || '';
  const isKnownSafeEngine =
    !/\b(iPad|iPhone|iPod)\b/.test(userAgent) && /Chrom(e|ium)|Firefox/.test(userAgent);

  // The href reuses replaceTimestamp so it matches the importmap entry exactly;
  // a stale timestamp here would double-fetch the largest chunk.
  const sanityModuleUrl = imports['sanity'];
  if (isKnownSafeEngine && typeof sanityModuleUrl === 'string' && isSanityCdnUrl(sanityModuleUrl)) {
    const preloadEl = document.createElement('link');
    preloadEl.rel = 'modulepreload';
    preloadEl.href = replaceTimestamp(sanityModuleUrl);
    // Must match the preconnect's credentials mode, otherwise the browser
    // treats them as separate connections and the warmed cross-origin socket
    // is not reused for this fetch.
    preloadEl.crossOrigin = 'anonymous';
    document.head.appendChild(preloadEl);
  }
</script><script src="https://core.sanity-cdn.com/bridge.js" async type="module" data-sanity-core></script>
</head><body><div id="sanity"></div><script src="/static/sanity-CnXMtJH4.js" type="module"></script><noscript><div class="sanity-app-no-js__root"><div class="sanity-app-no-js__content"><style type="text/css">
.sanity-app-no-js__root {
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  background: #fff;
}

.sanity-app-no-js__content {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
  font-family: helvetica, arial, sans-serif;
}
</style><h1>JavaScript disabled</h1><p>Please <a href="https://www.enable-javascript.com/">enable JavaScript</a> in your browser and reload the page to proceed.</p></div></div></noscript></body></html>