;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Rádio: Boneca sexual ajudou a identificar homens que 'enforcaram' Vini Jr

Torcedores penduraram um boneco com a camisa de Vini Jr. sendo enforcado em uma ponte de Madri - Reprodução/elmundo.es
Torcedores penduraram um boneco com a camisa de Vini Jr. sendo enforcado em uma ponte de Madri Imagem: Reprodução/elmundo.es

Colaboração para o UOL, em Santos (SP)

30/05/2023 10h40

Policiais da Espanha conseguiram identificar os homens que simularam enforcar Vinícius Jr. em uma ponte de Madri seguindo o rastro de uma boneca inflável.

O que aconteceu

Os investigadores recuperaram a boneca inflável e chegaram a procurar impressões digitais, mas não conseguiram identificar a quem pertenciam.

Junto com a boneca, eles encontraram uma faixa com os dizeres "Madri odeia o Real", um dos lemas usados pela Frente Atlético, os ultras do Atlético de Madri.

Eles inicialmente acreditavam que se tratava de um modelo de boneca chamado Sandra, que era vendido por 24 euros em 58 sites online. As lojas foram rastreadas, mas as investigações não avançaram.

Foi então que eles encontraram nas redes sociais uma foto postada por um membro da Frente Atlético com uma boneca inflável negra, de outro modelo, usando uma camisa do Real em frente a um muro.

O muro foi identificado, e a localização do celular do torcedor comprovou que ele ou pela ponte no mesmo momento em que o boneco de Vini Jr. foi pendurado.

As informações foram adas por investigadores da polícia em uma entrevista ao programa 'Julia en la Onda', da rádio Onda Cero, da Espanha.

Torcedores foram detidos e soltos

Os torcedores que penduraram o boneco de Vini Jr. na ponte foram detidos e, em seguido, colocados em liberdade condicional.

Eles estão proibidos de se aproximar de qualquer estádio de futebol em dias de jogos.

Os quatro detidos - três deles integrantes de grupos de torcedores radicais - foram acusados de crime contra a integridade moral e crime de ódio, como são enquadradas as ofensas racistas na Espanha.

Os quatro permaneceram calados durante a audiência, de acordo com o tribunal de Madri, que anunciou o prosseguimento das investigações.