<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://pontoeletronico.net.br/bobina-termica-300-metros-p1</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/fita-relogio-cartografico-md01-p2</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/suporte-cartao-ponto-10-unidades-p3</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/bobina-termica-57mm-x-300-metros-p4</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/fita-relogio-cartografico-md02-p5</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/software-de-apuracao-de-ponto-rhid-p14</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/relogio-ponto-eletronico-controlid-idclass-portaria-671-p39</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/relogio-ponto-eletronico-controlid-idclass-portaria-671-p40</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/relogio-ponto-eletronico-controlid-idclass-portaria-671-p41</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/relogio-ponto-eletronico-controlid-idclass-portaria-671-p42</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/relogio-ponto-eletronico-controlid-idclass-portaria-671-p43</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/relogio-ponto-eletronico-controlid-idclass-portaria-671-p44</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/antena-iduhf-p56</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/antena-iduhf-lite-p57</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p59</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p60</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p61</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p62</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p63</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p64</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p65</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p66</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p67</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p68</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p69</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p70</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p71</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p72</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p73</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p74</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p75</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-next-p76</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-fit-p77</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-fit-p78</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-fit-p80</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-fit-p81</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-facial-id-face-p83</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-facial-id-face-p84</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-facial-id-face-p85</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-facial-id-face-p86</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p87</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p88</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p89</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p90</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p91</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p92</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p93</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-pro-p94</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p95</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p96</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p97</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p98</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p99</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p100</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p101</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-ip65-p102</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p103</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p104</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p105</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p106</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p107</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p108</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p109</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-nano-p110</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p111</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p112</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p113</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p114</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p115</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p116</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p117</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-access-p118</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p119</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p120</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p121</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p122</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p123</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p124</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p125</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-biometrico-id-flex-p126</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-numerico-id-touch-p128</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-numerico-id-touch-p129</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/coletor-numerico-id-touch-p130</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p144</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p145</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p146</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p147</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p148</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p149</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p150</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p151</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p152</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p153</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p154</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p155</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p156</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p157</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p158</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p159</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p160</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p161</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p162</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p163</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p164</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p165</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p166</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p167</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p168</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p169</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p170</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p171</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p172</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p173</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p174</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p175</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p176</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p177</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p178</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p179</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p180</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p181</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p182</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-p183</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p185</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p186</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p187</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p188</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p189</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p190</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p191</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p192</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p193</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p194</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p195</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p196</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p197</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p198</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p199</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p200</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p201</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p202</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p203</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p204</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p205</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p206</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p207</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p208</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p209</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p210</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p211</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p212</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p213</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p214</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p215</loc>
  </url>
  <url>
    <loc>https://pontoeletronico.net.br/catraca-id-block-facial-mini-p216</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>
