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

Pan 2019

Nadadora medalhista do Pan terá que "mudar de esporte" para ir à Olimpíada

Viviane Jungblut competiu na piscina e em águas abertas no Pan de Lima - Jonne Roriz/COB
Viviane Jungblut competiu na piscina e em águas abertas no Pan de Lima Imagem: Jonne Roriz/COB

Karla Torralba

Do UOL, em Lima (Peru)

11/08/2019 04h00

Natação não é tudo igual. As prioridades de Viviane Jungblut tiveram de mudar totalmente de foco pelo sonho de representar o Brasil na Olimpíada de Tóquio. Aos 23 anos, ela tentou a vaga na maratona aquática de 10km no Mundial da modalidade, mas ficou fora. Agora, iniciou no Pan de Lima uma nova jornada para buscar a classificação no que ela define ser "outro esporte". Mesmo que seja nadando, mesmo.

Viviane ganhou dois bronzes no Pan: na maratona aquática, em águas abertas, no litoral peruano, e na "nova modalidade", que envolve as provas na piscina. Já conseguiu na capital o pódio na prova dos 800m livre, um pódio inédito para o Time Brasil, nesse início de uma nova fase.

"São dois esportes completamente diferentes um do outro. Parece que estou nadando outro esporte", ressaltou Viviane. "É bem diferente uma prova da outra. Nas provas de piscina é tudo mais controlado. A gente nada contra o relógio, não tem nenhuma adversária. Tem a raia, a linha no fundo da piscina e dá para ter ideia de como vai ser. Maratona é uma metragem maior e uma intensidade menor. O treinamento físico e dentro d'água são bem diferentes dentro para piscina", explicou.

Viviane Jungblut nadou a maratona aquática de 10km no Mundial de esportes aquático deste ano na Coreia do Sul e não conseguiu a classificação olímpica na prova. Ela precisava ficar entre as 10 primeiras colocadas para que o Brasil pudesse levar mais de uma nadadora na modalidade. Vivi acabou em 12º. A representante do país no esporte em Tóquio será Ana Marcela Cunha, 5ª colocada no mundial.

Vivi - Wander Roberto/COB - Wander Roberto/COB
Viviane com Ana Marcela Cunha após a prova da maratona aquática do Pan
Imagem: Wander Roberto/COB
"Eu tenho que ter o pé no chão. Até a seletiva [o troféu Brasil de 2020, em abril] tem muita coisa para acontecer. Quando voltar do Pan e fazer planejamento, será todo voltado para a Olimpíada. Bati na trave para representar o Brasil nas Olimpíadas na prova de maratona. Então eu sabia que agora tinha que focar novamente e ver com a comissão técnica o que eu tinha que ajustar para gente poder treinar bastante na seletiva olímpica das provas de piscina", comentou Vivi.

Nessa fase de adaptação, uma medalha como a conquistada nos 800m livre do Pan ganha algo de especial e indicam um bom caminho a ser seguido. "A medalha nas provas de piscina tem um gosto mais gostoso, porque eu sabia que seria grande desafio nadar as duas modalidades".

Na piscina há ainda uma vantagem especial apontada pela nadadora. "Ter contato com a torcida do Brasil, na maratona não tem muito. Tem algumas partes que (o público) consegue ver, mas não é igual aqui", afirmou, já dentro de um ginásio.

Além da prova de 800m livre, Viviane Jungblut também deve tentar a vaga na Olimpíada nos 1.500m livre. Pelo Pan, ela ainda nadou os 400m livre.