<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://starkguns.com.br/pistola-cz-p-10-f-cal-9x19-mm-com-2-carregadores-p1</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-cz-p-10-s-cal-9x19-mm-com-2-carregadores-p2</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-cz-p-10-c-cal-9x19-mm-com-2-carregadores-p3</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-cz-shadow-2-cal-9x19-mm-com-3-carregadores-p4</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/carabina-cz-scorpion-evo-3-s1-cal-9x19-mm-p5</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-cbc-ranger-22lr-madeira-p19</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-th380-380-3x18t-cgf-graph-black-p49</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-8122-22-lr-23-madeira-p50</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-gx4-sc-38tpc-2x15t-cagf-black-p57</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/esp-cbc-military-30-rt-19-p59</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-g2c-38tpc-2x12t-cafo-black-p61</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-7022-22lr-21-madeira-p79</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-7022-way-22lr-21-preto-p174</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-8122-22lr-23-cv-preto-p176</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-7022-22lr-21-preto-p181</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-8122-22lr-23-preto-p183</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-rio-bravo-22lr-18-madeira-p200</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-tactical-22lr-18-preto-p252</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-delta-22-magnum-145-preto-p297</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-delta-22lr-145-preto-p301</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-58hc-plus-380-inox-fosco-p306</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-delta-22lr-145-tan-cbc-p312</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/carabina-ct9-16-semi-auto-9mm-p318</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-pump-action-22lr-18-madeira-p324</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-7022-way-21-cv-sublimado-p326</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-rio-bravo-22lr-18-preto-p333</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-7022-22lr-21-tan-p343</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-pump-action-22lr-18-preto-p344</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-8122-22lr-23-sublimacao-p348</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/carabina-lever-action-rossi-inox-alto-brilho-cano-20-p349</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-7022-way-21-cv-tan-p353</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-magnum-semiauto-21-preto-p354</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-rio-bravo-22-magnum-20-madeira-p358</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-pump-action-22-magnum-20-preta-p361</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt357h-357mag-51-oxidado-fosco-p365</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-627-357-mag-4-inox-fosco-p366</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g3-toro-tenox-p367</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-066-calibre-357mag-p368</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/espingarda-cbc-c20-28-ox-montenegro-p370</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-86-calibre-18-6-p371</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g2c-40-calibre-40-sew-inox-fosco-p373</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-838-calibre-18-65-p374</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g2c-40-calibre-40-sew-carbono-fosco-p375</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-ts9-carbono-fosco-p377</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g3c-p380</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-088-calibre-18-a-p381</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-1911-officer-calibre-45-p383</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-th40-c-calibre-40-sew-p384</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-838-calibre-18-65-p385</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g2c-colors-p386</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-th9-calibre-9mm-p387</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-357h-17-83-carbono-fosco-p388</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/espingarda-cbc-c28-28-ox-montenegro-p389</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g3-toro-calibre-9mm-p392</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-088-calibre-18-3-p393</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-100-40sew-49-tenox-p394</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-th9-c-calibre-9mm-p395</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt856-38spl-3-p396</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-692-calibre-357-e-29-3-inox-fosco-p397</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-357h-17-51-inox-fosco-p400</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-85s-2-inox-alto-brilho-p402</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-92-afd-calibre-9mm-p403</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-th40-calibre-40-sew-p404</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-889-calibre-18-6-p405</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-605-17-2-carbono-fosco-p406</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-92-af-d-tenox-p407</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/espingarda-cbc-c36-28-ox-montenegro-p411</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-357-raging-hunter-carbono-fosco-p413</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-917-c-calibre-9mm-p414</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-817-calibre-38spl-p415</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/fuzil-taurus-t4-polimero-semi-auto-p416</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-605-17-2-inox-fosco-p417</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rt-838-calibre-18-4-p420</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-357h-17-83-inox-fosco-p421</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-1911-classica-p422</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-845-cal-45-p423</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g3-toro-tactical-p424</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/abafador-eletronico-invictus-alpha-preto-p425</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-g2c-calibre-38tpc-tan-p427</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-1911-government-p428</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-g3-tactical-black-29-p429</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-856-calibre-38-oxidado-fosco-p430</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-ts9-striker-p431</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rossi-rp63-edicao-comemorativa-135-anos-p432</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/auto-fuzil-taurus-t10-20-p433</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-065-17-4-carbono-fosco-p434</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-rm64-edicao-135-anos-rossi-p437</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-38h-raging-hunter-cal-38-p438</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt856-toro-cal-38-inox-oxidado-p442</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-gx4-grafeno-9mm-coldre-destro-p444</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-th380-graphene-elite-gray-p445</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-imperador-18-edicao-85-anos-limitada-p446</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-imperador-18-476-p447</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/carabina-bm-f-9-brigade-semi-auto-armor-black-p451</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-605-toro-cal-357-magnum-preto-p452</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-832-tracker-cal-38-spl-e-380-acp-65-p454</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-9mm-g2c-12-3-cafo-taurus-p457</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-imperador-38-547-p458</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-ts9-9x129-2x17t-executive-grade-p462</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-g3-xl-toro-9mm-taurus-p470</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/espingarda-cbc-c-32-ox-montenegro-p477</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/fuzil-t4-mlok-115-semi-auto-p484</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/fuzil-t4-mlok-145-semi-auto-p486</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/fuzil-t4-300-mlok-16-semi-auto-p488</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-cz-p-10-m-cal-9x19-mm-com-2-carregadores-p492</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-cz-p-10-s-or-cal-9x19-mm-com-2-carregadores-p493</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-cz-p-10-c-cal-380-auto-com-2-carregadores-p494</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/espingarda-cbc-c-12-ox-montenegro-p495</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-ceska-zbrojovka-cz-457-training-rifle-cal-22lr-cano-24-05-tiros-p496</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-ceska-zbrojovka-cz-457-luxo-cal-22lr-24-05-tiros-p497</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/rifle-ceska-zbrojovka-cz-457-jaguar-cal22lr-28-10-tiros-p498</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/revolver-taurus-rt-941-calibre-22-mag-4-p499</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/carabina-puma-rossi-357-mag-lever-act-20-cano-redondo-p500</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-glock-g25-cal-380-p501</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-glock-g42-cal-380-p503</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-g28-380-glock-p505</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-gx4-cal-38tpc-1x11-1x13t-p506</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-pt58-hc-plus-cal-380-inox-p507</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-pt58-hc-plus-cal-380-oxidada-fosco-p508</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-pt58-hc-plus-cal-380-cpc-sandareia-p509</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-pt58-hc-plus-cal-380-cpc-od-green-verde-oliva-p510</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-pt58-hc-plus-cal-380-cpc-fdemarrom-p512</loc>
  </url>
  <url>
    <loc>https://starkguns.com.br/pistola-taurus-pt58-hc-plus-cal-380-inox-2-carregadores-p513</loc>
  </url>
</urlset><script>
(function() {
  var cacheKey = 'wdna_csrf_token';
  var csrfReady = null;

  function getCurrentToken() {
    if (window.WDNA_CSRF_TOKEN) {
      return window.WDNA_CSRF_TOKEN;
    }

    var meta = document.querySelector('meta[name="csrf-token"]');
    if (meta && meta.getAttribute('content')) {
      return meta.getAttribute('content');
    }

    var input = document.querySelector('input[name="_csrf"]');
    if (input && input.value) {
      return input.value;
    }

    return '';
  }

  function applyCsrfToken(token) {
    if (!token) return;

    window.WDNA_CSRF_TOKEN = token;

    try {
      var meta = document.querySelector('meta[name="csrf-token"]');
      if (meta) {
        meta.setAttribute('content', token);
      }

      var inputs = document.querySelectorAll('input[name="_csrf"]');
      for (var i = 0; i < inputs.length; i++) {
        inputs[i].setAttribute('value', token);
        inputs[i].value = token;
      }
    } catch (e) {}
  }

  function patchBodyWithCsrf(body, token) {
    if (!token || !body) return body;

    try {
      if (window.FormData && body instanceof FormData) {
        if (!body.has('_csrf')) {
          body.append('_csrf', token);
        }
        return body;
      }

      if (window.URLSearchParams && body instanceof URLSearchParams) {
        if (!body.has('_csrf')) {
          body.append('_csrf', token);
        }
        return body;
      }

      if (typeof body === 'string') {
        var trimmed = body.trim();

        // Nao mexe em JSON. Algumas rotas quebram se adicionarmos campo extra.
        if (trimmed.charAt(0) === '{' || trimmed.charAt(0) === '[') {
          return body;
        }

        if (body.indexOf('_csrf=') === -1) {
          if (body.length > 0) {
            return body + '&_csrf=' + encodeURIComponent(token);
          }

          return '_csrf=' + encodeURIComponent(token);
        }
      }
    } catch (e) {}

    return body;
  }

  // [V2] Refatoracao de loadFreshCsrf:
  //   - Nao cacheia promise resolvida com string vazia.
  //   - Se cache do sessionStorage estiver vazio/expirado, refaz fetch.
  //   - Se o fetch falhar, limpa csrfReady para que proxima chamada tente de novo.
  function loadFreshCsrf(forceRefresh) {
    if (!forceRefresh && csrfReady) {
      return csrfReady;
    }

    if (!forceRefresh) {
      try {
        var cached = JSON.parse(sessionStorage.getItem(cacheKey) || 'null');
        if (cached && cached.token && cached.expires > Date.now()) {
          applyCsrfToken(cached.token);
          csrfReady = Promise.resolve(cached.token);
          return csrfReady;
        }
      } catch (e) {}
    }

    var p = fetch('/__csrf_refresh', {
      method: 'GET',
      credentials: 'same-origin',
      cache: 'no-store'
    })
      .then(function(response) {
        return response.json();
      })
      .then(function(data) {
        if (data && data.csrfToken) {
          applyCsrfToken(data.csrfToken);

          try {
            sessionStorage.setItem(cacheKey, JSON.stringify({
              token: data.csrfToken,
              expires: Date.now() + 60000
            }));
          } catch (e) {}

          return data.csrfToken;
        }

        // [V2] Token nao retornado: limpa csrfReady para permitir retry
        csrfReady = null;
        return '';
      })
      .catch(function() {
        // [V2] Erro de rede: limpa csrfReady para permitir retry
        csrfReady = null;
        return '';
      });

    csrfReady = p;
    return p;
  }

  // [V2] Forca refresh do token: invalida cache local e do sessionStorage,
  // chama /__csrf_refresh novamente.
  function forceRefreshCsrf() {
    csrfReady = null;
    try { sessionStorage.removeItem(cacheKey); } catch (e) {}
    return loadFreshCsrf(true);
  }

  function isUnsafeMethod(method) {
    return !/^(GET|HEAD|OPTIONS)$/i.test(method || 'GET');
  }

  // [V2] Helper: verifica se URL eh AJAX interno (mesma origem, path /ajax/* ou /checkout/*).
  // Apenas requests AJAX internos sao elegiveis para retry em 403.
  function isInternalAjax(input) {
    try {
      var url = (typeof input === 'string') ? input : (input && input.url) || '';
      if (!url) return false;

      // Mesma origem: comeca com / ou com a propria origin
      if (url.charAt(0) === '/') {
        return /^\/(ajax|checkout|busca|api)\//i.test(url) || url.indexOf('/ajax') === 0;
      }

      if (url.indexOf(window.location.origin) === 0) {
        var path = url.substring(window.location.origin.length);
        return /^\/(ajax|checkout|busca|api)\//i.test(path) || path.indexOf('/ajax') === 0;
      }
    } catch (e) {}
    return false;
  }

  if (window.fetch && !window.__WDNA_CSRF_FETCH_PATCHED__) {
    window.__WDNA_CSRF_FETCH_PATCHED__ = true;

    var originalFetch = window.fetch;

    window.fetch = function(input, init) {
      init = init || {};

      var method = (init.method || 'GET').toUpperCase();

      try {
        if (input && typeof input === 'object' && input.method && !init.method) {
          method = input.method.toUpperCase();
        }
      } catch (e) {}

      if (!isUnsafeMethod(method)) {
        return originalFetch.call(this, input, init);
      }

      var self = this;

      return loadFreshCsrf().then(function(token) {
        token = token || getCurrentToken();

        if (token) {
          init.headers = new Headers(init.headers || {});

          if (!init.headers.has('x-csrf-token')) init.headers.set('x-csrf-token', token);
          if (!init.headers.has('x-xsrf-token')) init.headers.set('x-xsrf-token', token);
          if (!init.headers.has('csrf-token')) init.headers.set('csrf-token', token);
          if (!init.headers.has('x-csrf')) init.headers.set('x-csrf', token);

          if (init.body) {
            init.body = patchBodyWithCsrf(init.body, token);
          }
        }

        return originalFetch.call(self, input, init).then(function(response) {
          // [V2] Retry transparente em 403 para AJAX interno
          if (response.status === 403 && isInternalAjax(input) && !init.__wdnaRetried) {
            return forceRefreshCsrf().then(function(newToken) {
              if (!newToken) return response;

              // Clona init e marca como retried para nao loopar
              var retryInit = Object.assign({}, init);
              retryInit.__wdnaRetried = true;
              retryInit.headers = new Headers(init.headers || {});
              retryInit.headers.set('x-csrf-token', newToken);
              retryInit.headers.set('x-xsrf-token', newToken);
              retryInit.headers.set('csrf-token', newToken);
              retryInit.headers.set('x-csrf', newToken);

              if (retryInit.body && retryInit.body !== init.body) {
                // body ja foi consumido em alguns casos; reusa o de init
              }
              if (init.body) {
                retryInit.body = patchBodyWithCsrf(init.body, newToken);
              }

              return originalFetch.call(self, input, retryInit);
            });
          }
          return response;
        });
      });
    };
  }

  if (window.XMLHttpRequest && !window.__WDNA_CSRF_XHR_PATCHED__) {
    window.__WDNA_CSRF_XHR_PATCHED__ = true;

    var originalOpen = XMLHttpRequest.prototype.open;
    var originalSend = XMLHttpRequest.prototype.send;
    var originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;

    // [V2] Captura headers customizados setados pelo cliente antes do send,
    // para que possamos repeti-los em caso de retry em 403.
    XMLHttpRequest.prototype.setRequestHeader = function(name, value) {
      try {
        this.__wdna_headers = this.__wdna_headers || [];
        this.__wdna_headers.push([name, value]);
      } catch (e) {}
      return originalSetRequestHeader.apply(this, arguments);
    };

    XMLHttpRequest.prototype.open = function(method, url) {
      this.__wdna_method = method || 'GET';
      this.__wdna_url = url || '';
      this.__wdna_headers = [];
      return originalOpen.apply(this, arguments);
    };

    XMLHttpRequest.prototype.send = function(body) {
      var xhr = this;
      var method = (xhr.__wdna_method || 'GET').toUpperCase();

      if (!isUnsafeMethod(method)) {
        return originalSend.apply(xhr, arguments);
      }

      var args = arguments;
      var originalBody = body;

      // [V2] Salva referencias para retry
      xhr.__wdna_original_body = originalBody;
      xhr.__wdna_retried = false;

      loadFreshCsrf().then(function(token) {
        token = token || getCurrentToken();

        if (token) {
          try {
            originalSetRequestHeader.call(xhr, 'x-csrf-token', token);
            originalSetRequestHeader.call(xhr, 'x-xsrf-token', token);
            originalSetRequestHeader.call(xhr, 'csrf-token', token);
            originalSetRequestHeader.call(xhr, 'x-csrf', token);
          } catch (e) {}

          if (args && args.length > 0 && args[0]) {
            args[0] = patchBodyWithCsrf(args[0], token);
            xhr.__wdna_patched_body = args[0];
          }
        }

        // [V2] Hook para detectar 403 e tentar refresh + retry uma vez
        try {
          var originalOnReadyStateChange = xhr.onreadystatechange;
          xhr.onreadystatechange = function() {
            if (xhr.readyState === 4 && xhr.status === 403 &&
                !xhr.__wdna_retried &&
                isInternalAjax(xhr.__wdna_url)) {

              xhr.__wdna_retried = true;

              // Cria um novo XHR para o retry (nao da pra reabrir o mesmo)
              forceRefreshCsrf().then(function(newToken) {
                if (!newToken) {
                  if (originalOnReadyStateChange) {
                    try { originalOnReadyStateChange.apply(xhr, arguments); } catch (e) {}
                  }
                  return;
                }

                var retryXhr = new XMLHttpRequest();
                retryXhr.__wdna_retried = true; // marca para nao re-retry

                retryXhr.open(xhr.__wdna_method, xhr.__wdna_url, true);

                // Reaplica headers que o usuario tinha setado
                try {
                  for (var i = 0; i < (xhr.__wdna_headers || []).length; i++) {
                    var h = xhr.__wdna_headers[i];
                    if (!/^(x-csrf-token|x-xsrf-token|csrf-token|x-csrf)$/i.test(h[0])) {
                      retryXhr.setRequestHeader(h[0], h[1]);
                    }
                  }
                  retryXhr.setRequestHeader('x-csrf-token', newToken);
                  retryXhr.setRequestHeader('x-xsrf-token', newToken);
                  retryXhr.setRequestHeader('csrf-token', newToken);
                  retryXhr.setRequestHeader('x-csrf', newToken);
                } catch (e) {}

                // Repropaga eventos para o XHR original
                retryXhr.onreadystatechange = function() {
                  if (retryXhr.readyState === 4) {
                    // Copia status e response para o xhr original via redefinicao
                    try {
                      Object.defineProperty(xhr, 'status', { value: retryXhr.status, configurable: true });
                      Object.defineProperty(xhr, 'statusText', { value: retryXhr.statusText, configurable: true });
                      Object.defineProperty(xhr, 'responseText', { value: retryXhr.responseText, configurable: true });
                      Object.defineProperty(xhr, 'response', { value: retryXhr.response, configurable: true });
                      if (retryXhr.responseType === '' || retryXhr.responseType === 'text') {
                        Object.defineProperty(xhr, 'responseXML', { value: retryXhr.responseXML, configurable: true });
                      }
                    } catch (e) {}

                    if (originalOnReadyStateChange) {
                      try { originalOnReadyStateChange.apply(xhr, arguments); } catch (e) {}
                    }
                  }
                };

                var retryBody = xhr.__wdna_original_body;
                if (retryBody) {
                  retryBody = patchBodyWithCsrf(retryBody, newToken);
                }
                retryXhr.send(retryBody);
              });

              return; // nao chama o onReadyStateChange original ainda
            }

            if (originalOnReadyStateChange) {
              try { originalOnReadyStateChange.apply(xhr, arguments); } catch (e) {}
            }
          };
        } catch (e) {}

        return originalSend.apply(xhr, args);
      }).catch(function() {
        // Se loadFreshCsrf falhar catastroficamente, ainda tenta enviar (sem token)
        // para nao quebrar a pagina inteira
        try {
          return originalSend.apply(xhr, args);
        } catch (e) {}
      });
    };
  }

  loadFreshCsrf();
})();
</script>
