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

André Rocha

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Bayern a um empate de novo fiasco do PSG na Champions

Mbappé se lamenta em PSG x Bayern, jogo da Champions League - Alex Grimm/Getty Images
Mbappé se lamenta em PSG x Bayern, jogo da Champions League Imagem: Alex Grimm/Getty Images

Colunista do UOL Esporte

14/02/2023 19h32

O primeiro tempo no Parc des Princes mostrou que o PSG não pode depender apenas de Messi e Neymar em um jogo grande de Champions.

A preparação e o foco não são os mesmos de antes da Copa do Mundo e, no caso da ida das oitavas do torneio, havia também os muitos méritos do Bayern de Munique.

Time do perfeccionista Julian Nagelsmann, que armou um trio atrás com Pavard, Upamecano e De Ligt, abriu João Cancelo e Coman nas alas, deu sustentação por dentro com Kimmich e Goretzka e soltou Musiala e Sané para buscar o jogo entrelinhas e se juntarem a Choupo-Moting, a referência na frente. O 3-4-2-1 tão apreciado pelos treinadores europeus, de Antonio Conte a Paulo Sousa.

Muito volume de jogo, mesmo como visitante, e a imposição tática que tirava do jogo as estrelas adversárias e obrigava Sergio Ramos, em noite mais inspirada que o companheiro de zaga Marquinhos, a se desdobrar em coberturas e confrontos diretos. O menino Zaire-Emery, 16 anos, tentava ajudar Hakimi contra Coman e Musiala.

Pressão que seguiu no segundo tempo, com Alfonso Davies na vaga de Cancelo e invertendo o lado de Coman, que recebeu o cruzamento da esquerda para, entrando à direita, finalizar por baixo de Donnarumma e repetir o gol da final de Lisboa em 2020.

Quatro minutos depois, Christophe Galtier apelou para o Mbappé, recuperado de lesão muscular, porém ainda não 100%. Nagelsmann não vacilou e inverteu o lado de Pavard, já com cartão amarelo, com Upamecano indo para a direita atrás do craque realmente decisivo do PSG no momento.

Mbappé até empatou, mas Nuno Mendes, principal válvula de escape à esquerda, estava impedido ao receber antes de dar a assistência. É o artilheiro da última Copa pela França a última esperança de evitar mais um fiasco do time bilionário na sua grande obsessão.

Na Allianz Arena vai precisar de um Bayern disperso, ou sendo punido com gols na queda natural que times muito intensos sempre am no segundo tempo, com o desgaste dos titulares e as substituições não mantendo o nível. E sem Pavard, expulso na segunda etapa por falta dura em Messi, que rendeu o segundo amarelo.

O problema é resistir à pressão que será ainda maior em Munique no primeiro tempo. Em Paris, foram 57% de posse e dez finalizações a um dos bávaros em 45 minutos. Na segunda etapa, posse dividida e oito finalizações para cada lado.

Mas o PSG irregular, inconstante e um tanto caótico não tem consistência para buscar a virada no confronto. Vai depender novamente dos talentos. Em especial de um Mbappé que, até a volta em três semanas, pode estar voando de novo e encarar essa missão quase impossível.

(Estatísticas: SofaScore)

** Este texto não reflete, necessariamente, a opinião do UOL