;(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; // 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(); })();
Topo
Notícias

Jovem morto em ação da PM em Santos em 2024 levou cinco tiros nas costas

Ryan da Silva Andrade Santos e Gregory Ribeiro Vasconcelos, mortos pela polícia em 2024 - Reprodução
Ryan da Silva Andrade Santos e Gregory Ribeiro Vasconcelos, mortos pela polícia em 2024 Imagem: Reprodução
do UOL

Jeniffer Mendonça

Colaboração para o UOL, em São Paulo

05/06/2025 15h16Atualizada em 05/06/2025 19h07

O adolescente Gregory Ribeiro Vasconcelos, de 17 anos, morto na mesma ação policial que tirou a vida da criança Ryan da Silva Andrade Santos, 4, em Santos, em 2024, levou cinco de sete tiros pelas costas, de acordo com laudo obtido pelo UOL.

O que aconteceu

Segundo o laudo do IML, Gregory levou sete tiros, sendo cinco pelas costas. O tiro na nuca causou lesões compatíveis com morte imediata, conforme o perito concluiu no documento.

Jovem de 15 anos, que sobreviveu aos disparos e estava com Gregory, disse à Polícia que eles não estavam armados quando foram baleados. Ele relatou que os tiros foram à queima-roupa após pararem a moto e levantarem as mãos por ordem da PM.

Familiares de Gregory afirmam que ele foi executado. Eles relataram que ele estava na casa de uma amiga antes de sair para dar uma volta de moto com outro adolescente.

Além de Gregory, uma criança de 4 anos foi atingida na barriga e uma mulher de 24 anos foi ferida no braço durante a ação. A mãe da criança afirmou ao UOL que não houve confronto e que apenas os policiais dispararam.

Adolescente chegou ao pronto-socorro já morto

A UPA (Unidade de Pronto Atendimento) Zona Noroeste informou no prontuário médico que Gregory chegou já estava sem vida havia 30 minutos. Ele deu entrada no local por volta das 21h, socorrido pelo Samu.

Sobrevivente disse em depoimento que ouviu os policiais mencionando no local da abordagem que Gregory tinha morrido. Ele não soube precisar quanto tempo o socorro demorou, mas acredita que tenha sido "muito".

Relembre o caso

Gregory foi morto em ação policial no dia 05 de novembro de 2024, no Morro do São Bento, em Santos. À época, a PM disse que fazia patrulhamento quando foi atacada por um grupo de dez suspeitos e revidou disparos. Além do adolescente de 17 anos, a criança Ryan da Silva Andrade Santos, 4, morreu atingido por uma bala. Moradores contestam a versão da PM e negam o confronto.

Os policiais envolvidos são do 6º Batalhão do Interior da PM e não usavam câmeras nas fardas. O programa de câmeras ainda não havia sido implementado nessa unidade.

Polícia Civil disse ter aberto inquérito para apurar a origem do disparo. A SSP (Secretaria da Segurança Pública) informou que fará perícia nas armas apreendidas dos policiais militares envolvidos na ocorrência e no local onde a criança foi baleada.

Notícias