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

Olhar Olímpico

Olimpíada: torcida compra 114 ingressos e prevê prejuízo com adiamento

Equipe do Brasil do revezamento 4x200m comemora com o sempre presente boneco dos Chapolins - Luis ROBAYO / AFP
Equipe do Brasil do revezamento 4x200m comemora com o sempre presente boneco dos Chapolins Imagem: Luis ROBAYO / AFP

25/03/2020 04h00

Com mais de 114 ingressos garantidos, a principal torcida organizada do esporte olímpico brasileiro - talvez única - apoia a decisão do Comitê Olímpico Internacional (COI) de adiar os Jogos de Tóquio de 2020 para 2021. Os Chapolins, presentes nas grandes competições desde 2011, já sabem que muito provavelmente terão prejuízos econômicos com a mudança de planos, depois de pagarem praticamente todas as contas adiantadas, mas acham que é melhor assim.

"A posição de todos no grupo era que todos eram favoráveis. No grupo temos médicos que se a situação estiver ruim vão ser proibidos de viajar, professores que tiveram as férias adiantadas, e pessoas autônomas que estão sendo prejudicadas. Todo mundo estava sendo prejudicado por essa paralisação", conta Gustavo Cardoso, um dos 15 Chapolins que viajariam para Tóquio.

O grupo tem uma organização complexa. O médico Rubens Tofolo Jr, criador da torcida e presidente da Associação Chapolins Torcedores Brasileiros, junta milhas viajando o mundo para palestras e congressos e doou mais de um milhão de milhas para a compra de agens para 15 integrantes, incluindo ele e o companheiro, José Aviz Toutonge. Cardoso, que é agente de viagens, comprou as agens e agora espera que as companhias aéreas não cobrem multas tão altas para alterar as datas.

O maior problema tende a ser a hospedagem. O grupo alugou um apartamento pelo Airbnb e, como sequer cogitava que a Olimpíada fosse adiada, aceitou um contrato que não previa cancelamento ou alteração de datas. "Agora a gente também vai começar a conversas sobre o adiamento. A gente vai ter que contar com o bom senso dos proprietários para isso. É uma reserva que não tinha possibilidade de cancelamento. Você pagou não tem como cancelar", explica.

O restante da programação continua, com a diferença que agora o grupo terá um pouco mais de tempo para confeccionar toda a parafernalha que os acompanha nas competições, desde uniforme (de Chapolim) até mascotes (bonecos de pelúcia do Chapolim), ando por pins (de Chapolim, também). "Já vamos deixar tudo preparado e ano que vem só aguardar a data mesmo. Vamos continuar mantendo a produção de bonecos", promete.

Apesar do prejuízo, os torcedores preferem que seja assim. "Vendo o lado positivo, que a gente tem que pensar do lado positivo, seria uma edição olímpica de enterro. Não teria clima nenhum. Não seriam Jogos felizes até por falta de preparação dos atletas. Olhando do lado da torcida, muita gente vai perder férias, vai perder dinheiro. Foi a melhor opção mesmo."