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

Fernando Haddad declara apoio a Boulos no segundo turno em São Paulo

Guilherme Boulos (PSOL) apoia Haddad (PT) no segundo turno - Ricardo Stuckert
Guilherme Boulos (PSOL) apoia Haddad (PT) no segundo turno Imagem: Ricardo Stuckert

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

15/11/2020 23h39Atualizada em 16/11/2020 00h27

O ex-prefeito de São Paulo, Fernando Haddad (PT), declarou na noite de hoje apoio a Guilherme Boulos (PSOL) no segundo turno da eleição para Prefeito de São Paulo. Guilherme Boulos ficou na segunda colocação na apuração da eleição para Prefeito de São Paulo, atrás de Bruno Covas (PSDB).

"Progressistas, ninguém arreda o pé de São Paulo até a vitória de Guilherme Boulos e a derrota dos tucanos. Vamos à luta", escreveu Haddad em seu perfil no Twitter.

Haddad foi a primeira grande liderança do PT a declarar apoio a Boulos. Durante a campanha, filiados petistas chegaram a pedir que o partido desistisse da candidatura de Jilmar Tatto para formar uma aliança de esquerda em torno do candidato do Psol, mas a direção do partido optou por levar a candidatura até o fim.

Com 99,67% das urnas apuradas, Tatto apareceu com 8,65% dos votos, atrás de Covas e Boulos e de outros candidatos como Márcio França (PSB), Celso Russomanno (Republicanos) e até Arthur do Val (Patriota), que disputou uma eleição no Executivo pela primeira vez e tinha pouco tempo de horário eleitoral na TV.

Bruno Covas e Boulos se enfrentam no próximo turno da eleição na capital. Em pronunciamento na noite de hoje, Boulos relacionou seu adversário ao governador de São Paulo, João Doria (PSDB), e se colocou como uma opção para "mudança" na capital paulista.

Apuração em São Paulo

Por volta de meia noite, com 99,67% das urnas apuradas, São Paulo tinha Covas na liderança, com 32,85% dos votos válidos (1.747.938 votos), e Guilherme Boulos (PSOL) logo atrás, com 20,24% (1.077.168).

Depois, vêm Márcio França (PSB), com 13,65%; Celso Russomanno (Republicanos), 10,50%; Arthur do Val (Patriota), 9,78%; Jilmar Tatto (PT), 8,65%; e Joice Hasselmann (PSL), 1,84%.

O percentual de votos nulos era de 10,11%, enquanto 5,87% dos eleitores votaram em branco.

Boulos cresce durante campanha e chega ao segundo turno

O resultado até aqui mostra uma grande diferença entre o candidato do PSOL e Celso Russomanno (Republicanos) e Márcio França (PSB), que figuraram empatados tecnicamente com Boulos nas últimas pesquisas realizadas.

Em levantamento divulgado ontem pelo Ibope, Boulos tinha 16% de intenção dos votos válidos, com uma margem de erro de três pontos percentuais para mais ou para menos.

No final de outubro, o Datafolha indicava que Boulos não era conhecido por quatro em cada dez eleitores paulistanos. O candidato investiu sua campanha na tentativa de atrair votos dos mais jovens, principalmente pelas redes sociais.