;(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

Chuvas: corpo de jovem é reconhecido após aviso de que havia sobrevivido

Alexandre, de 24 anos, morava em Taboão da Serra, na Grande São Paulo - Arquivo Pessoal
Alexandre, de 24 anos, morava em Taboão da Serra, na Grande São Paulo Imagem: Arquivo Pessoal

Do UOL, em São Paulo

24/02/2023 04h00Atualizada em 24/02/2023 09h42

A família de Alexandre Silva Castilho, 24, foi da euforia ao desespero em questão horas: o pai do rapaz foi avisado que seu filho tinha sido encontrado com vida após os deslizamentos no fim de semana que mataram ao menos 50 pessoas no litoral norte de São Paulo. Quando chegou ao hospital para encontrar o rapaz, recebeu outra ligação, agora do IML: o corpo do filho acabara de ser reconhecido.

As informações são de Isabela, um nome fictício de uma familiar próxima do rapaz, que prefere não se identificar.

O desmoronamento da casa em que ele estava, na Barra do Sahy, em São Sebastião, resultou na morte de cinco pessoas, incluindo uma idosa e duas crianças. Alexandre ava férias com outras seis pessoas quando um forte barulho na madrugada de sábado para domingo (19) foi seguido de escuridão e silêncio.

"Em pouco tempo os vizinhos se mobilizaram. O resgate foi muito rápido, só o Alexandre, que dormia, ficou desaparecido", diz Isabela.

Depois de muita procura, a família recebeu uma ligação de um instituto em São Sebastião que recebe feridos para atendimento emergencial antes de encaminhá-los para os hospitais da região.

Com uma foto de Alexandre em mãos, um voluntário afirmou que o rapaz estava vivo e foi levado para um hospital em São José dos Campos porque estava com uma perna quebrada.

O pai do jovem foi direto para o Hospital Regional de São José dos Campos na madrugada de terça para quarta (22). Mas ao chegar no endereço recebeu outra ligação, agora do IML: o corpo de Alexandre havia sido reconhecido.

vários deslizaentos mortais  - AMANDA PEROBELLI/REUTERS - AMANDA PEROBELLI/REUTERS
21.fev.23 - Barra do Sahy, em São Sebastião
Imagem: AMANDA PEROBELLI/REUTERS

"No IML, o pai não quis entrar. Foi alguém de confiança da família que reconheceu o corpo", afirmou Isabela, que ouviu parte dos relatos do irmão de Alexandre, Gabriel, de 14 anos, que estava na casa, sobreviveu, mas está em estado de choque.

"Ele lembra de ter ouvido um barulho muito forte e ficado tudo escuro. Ele se levantou por conta e, quando viu, os vizinhos já prestavam socorro", disse.

O enterro de Alexandre aconteceu na tarde desta quinta (23) no cemitério Parque dos Ipês, em Itapecerica da Serra.

Alexandre morava em Taboão da Serra com a mãe e o irmão. Reservado, pouca gente sabia que ele tinha alugado com os amigos a casa de praia por dez dias durante o Carnaval.

Os pais do jovem "estão devastados", afirmou Isabela. "Às vezes bate desespero e todo mundo começa a chorar."